diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 70a83e4e38..0000000000 --- a/.editorconfig +++ /dev/null @@ -1,1219 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 2 -indent_style = space -insert_final_newline = true -max_line_length = 100 -tab_width = 2 -trim_trailing_whitespace = true -ij_continuation_indent_size = 2 -ij_formatter_off_tag = @formatter:off -ij_formatter_on_tag = @formatter:on -ij_formatter_tags_enabled = true -ij_smart_tabs = false -ij_visual_guides = none -ij_wrap_on_typing = false - -############ -############ KtLint specific settings -############ -# noinspection EditorConfigKeyCorrectness,EditorConfigHeaderUniqueness,EditorConfigPartialOverride -[{*.kt,*.kts}] -kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^ -# Back-ticked method names are allowed to exceed the line length. That's especially helpful for -# test methods with descriptive names. -ktlint_ignore_back_ticked_identifier = true - -kt-rules_project_version = 0.13.0-SNAPSHOT -kt-rules_wrapping_style = equal - -ktlint_standard_class-naming = disabled -ktlint_standard_class-signature = disabled -ktlint_standard_filename = disabled -ktlint_standard_function-expression-body = disabled -ktlint_standard_function-naming = disabled -ktlint_standard_function-signature = disabled -ktlint_standard_max-line-length = disabled -ktlint_standard_no-empty-first-line-in-method-block = disabled -ktlint_standard_property-naming = disabled - -ktlint_experimental = disabled -ktlint_code_style = intellij_idea - -# noinspection EditorConfigKeyCorrectness,EditorConfigHeaderUniqueness,EditorConfigPartialOverride -[{*.kt,*.kts}] -ij_continuation_indent_size = 2 -ij_kotlin_align_in_columns_case_branch = false -ij_kotlin_align_multiline_binary_operation = false -ij_kotlin_align_multiline_extends_list = false -ij_kotlin_align_multiline_method_parentheses = false -ij_kotlin_align_multiline_parameters = false -ij_kotlin_align_multiline_parameters_in_calls = false -ij_kotlin_allow_trailing_comma = false -ij_kotlin_allow_trailing_comma_on_call_site = false -ij_kotlin_assignment_wrap = normal -ij_kotlin_blank_lines_after_class_header = 0 -ij_kotlin_blank_lines_around_block_when_branches = 0 -ij_kotlin_blank_lines_before_declaration_with_comment_or_annotation_on_separate_line = 1 -ij_kotlin_block_comment_add_space = false -ij_kotlin_block_comment_at_first_column = true -ij_kotlin_call_parameters_new_line_after_left_paren = true -ij_kotlin_call_parameters_right_paren_on_new_line = true -ij_kotlin_call_parameters_wrap = normal -ij_kotlin_catch_on_new_line = false -ij_kotlin_class_annotation_wrap = split_into_lines -ij_kotlin_code_style_defaults = KOTLIN_OFFICIAL -ij_kotlin_continuation_indent_for_chained_calls = true -ij_kotlin_continuation_indent_for_expression_bodies = false -ij_kotlin_continuation_indent_in_argument_lists = true -ij_kotlin_continuation_indent_in_elvis = true -ij_kotlin_continuation_indent_in_if_conditions = true -ij_kotlin_continuation_indent_in_parameter_lists = false -ij_kotlin_continuation_indent_in_supertype_lists = true -ij_kotlin_else_on_new_line = false -ij_kotlin_enum_constants_wrap = split_into_lines -ij_kotlin_extends_list_wrap = on_every_item -ij_kotlin_field_annotation_wrap = normal -ij_kotlin_finally_on_new_line = false -ij_kotlin_if_rparen_on_new_line = true -ij_kotlin_import_nested_classes = true -ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^ -ij_kotlin_insert_whitespaces_in_simple_one_line_method = true -ij_kotlin_keep_blank_lines_before_right_brace = 0 -ij_kotlin_keep_blank_lines_in_code = 1 -ij_kotlin_keep_blank_lines_in_declarations = 1 -ij_kotlin_keep_first_column_comment = true -ij_kotlin_keep_indents_on_empty_lines = false -ij_kotlin_keep_line_breaks = true -ij_kotlin_lbrace_on_next_line = false -ij_kotlin_line_break_after_multiline_when_entry = true -ij_kotlin_line_comment_add_space = true -ij_kotlin_line_comment_add_space_on_reformat = false -ij_kotlin_line_comment_at_first_column = false -ij_kotlin_method_annotation_wrap = normal -ij_kotlin_method_call_chain_wrap = on_every_item -ij_kotlin_method_parameters_new_line_after_left_paren = false -ij_kotlin_method_parameters_right_paren_on_new_line = false -ij_kotlin_method_parameters_wrap = normal -ij_kotlin_name_count_to_use_star_import = 2147483647 -ij_kotlin_name_count_to_use_star_import_for_members = 2147483647 -ij_kotlin_parameter_annotation_wrap = off -ij_kotlin_space_after_comma = true -ij_kotlin_space_after_extend_colon = true -ij_kotlin_space_after_type_colon = true -ij_kotlin_space_before_catch_parentheses = true -ij_kotlin_space_before_comma = false -ij_kotlin_space_before_extend_colon = true -ij_kotlin_space_before_for_parentheses = true -ij_kotlin_space_before_if_parentheses = true -ij_kotlin_space_before_lambda_arrow = true -ij_kotlin_space_before_type_colon = false -ij_kotlin_space_before_when_parentheses = true -ij_kotlin_space_before_while_parentheses = true -ij_kotlin_spaces_around_additive_operators = true -ij_kotlin_spaces_around_assignment_operators = true -ij_kotlin_spaces_around_equality_operators = true -ij_kotlin_spaces_around_function_type_arrow = true -ij_kotlin_spaces_around_logical_operators = true -ij_kotlin_spaces_around_multiplicative_operators = true -ij_kotlin_spaces_around_range = false -ij_kotlin_spaces_around_relational_operators = true -ij_kotlin_spaces_around_unary_operator = false -ij_kotlin_spaces_around_when_arrow = true -ij_kotlin_variable_annotation_wrap = off -ij_kotlin_while_on_new_line = false -ij_kotlin_wrap_elvis_expressions = 1 -ij_kotlin_wrap_expression_body_functions = 1 -ij_kotlin_wrap_first_method_in_call_chain = false - -[{*.yaml,*.yml}] -indent_size = 2 -ij_yaml_align_values_properties = do_not_align -ij_yaml_autoinsert_sequence_marker = true -ij_yaml_block_mapping_on_new_line = false -ij_yaml_indent_sequence_value = true -ij_yaml_keep_indents_on_empty_lines = false -ij_yaml_keep_line_breaks = true -ij_yaml_sequence_on_new_line = false -ij_yaml_space_before_colon = false -ij_yaml_spaces_within_braces = true -ij_yaml_spaces_within_brackets = true - -[{*.markdown,*.md,*.mdx}] -indent_size = 4 -tab_width = 4 -ij_continuation_indent_size = 4 -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_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 - -[.editorconfig] -ij_editorconfig_align_group_field_declarations = false -ij_editorconfig_space_after_colon = false -# IntelliJ defaults this to true, but that's against the editorconfig spec and ktlint can't actually parse it. -# https://youtrack.jetbrains.com/issue/IDEA-242506 -# https://github.com/editorconfig/editorconfig/issues/148 -ij_editorconfig_space_after_comma = false -ij_editorconfig_space_before_colon = false -ij_editorconfig_space_before_comma = false -ij_editorconfig_spaces_around_assignment_operators = true - -[{*.pb,*.textproto}] -indent_size = 2 -tab_width = 2 -ij_continuation_indent_size = 4 -ij_prototext_keep_blank_lines_in_code = 1 -ij_prototext_keep_indents_on_empty_lines = false -ij_prototext_keep_line_breaks = true -ij_prototext_space_after_colon = true -ij_prototext_space_after_comma = true -ij_prototext_space_before_colon = false -ij_prototext_space_before_comma = false -ij_prototext_spaces_within_braces = true -ij_prototext_spaces_within_brackets = false - -[{*.properties,spring.handlers,spring.schemas}] -ij_properties_align_group_field_declarations = false -ij_properties_keep_blank_lines = false -ij_properties_key_value_delimiter = equals -ij_properties_spaces_around_key_value_delimiter = false - -[{*.toml,Cargo.lock,Cargo.toml.orig,Gopkg.lock,Pipfile,poetry.lock}] -ij_toml_keep_indents_on_empty_lines = false - - -[*.css] -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 -ij_css_hex_color_lower_case = false -ij_css_hex_color_short_format = false -ij_css_hex_color_upper_case = false -ij_css_keep_blank_lines_in_code = 1 -ij_css_keep_indents_on_empty_lines = false -ij_css_keep_single_line_blocks = false -ij_css_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_css_space_after_colon = true -ij_css_space_before_opening_brace = true -ij_css_use_double_quotes = true -ij_css_value_alignment = do_not_align - -[*.feature] -indent_size = 2 -ij_gherkin_keep_indents_on_empty_lines = false - -[*.gv] -ij_dot_keep_blank_lines_in_code = 1 -ij_dot_keep_indents_on_empty_lines = false -ij_dot_label_indent_absolute = false -ij_dot_label_indent_size = 0 -ij_dot_space_after_colon = true -ij_dot_space_after_for_semicolon = true -ij_dot_space_before_class_left_brace = true -ij_dot_space_before_for_semicolon = false -ij_dot_space_before_method_left_brace = true -ij_dot_spaces_around_assignment_operators = true -ij_dot_spaces_around_equality_operators = true -ij_dot_spaces_within_brackets = false -ij_dot_use_relative_indents = false - -[*.haml] -indent_size = 2 -ij_haml_keep_indents_on_empty_lines = false - -[*.java] -ij_java_align_consecutive_assignments = false -ij_java_align_consecutive_variable_declarations = false -ij_java_align_group_field_declarations = false -ij_java_align_multiline_annotation_parameters = false -ij_java_align_multiline_array_initializer_expression = false -ij_java_align_multiline_assignment = false -ij_java_align_multiline_binary_operation = false -ij_java_align_multiline_chained_methods = false -ij_java_align_multiline_extends_list = false -ij_java_align_multiline_for = false -ij_java_align_multiline_method_parentheses = false -ij_java_align_multiline_parameters = false -ij_java_align_multiline_parameters_in_calls = false -ij_java_align_multiline_parenthesized_expression = false -ij_java_align_multiline_records = true -ij_java_align_multiline_resources = true -ij_java_align_multiline_ternary_operation = false -ij_java_align_multiline_text_blocks = false -ij_java_align_multiline_throws_list = false -ij_java_align_subsequent_simple_methods = false -ij_java_align_throws_keyword = false -ij_java_align_types_in_multi_catch = true -ij_java_annotation_parameter_wrap = off -ij_java_array_initializer_new_line_after_left_brace = true -ij_java_array_initializer_right_brace_on_new_line = true -ij_java_array_initializer_wrap = normal -ij_java_assert_statement_colon_on_next_line = false -ij_java_assert_statement_wrap = normal -ij_java_assignment_wrap = normal -ij_java_binary_operation_sign_on_next_line = true -ij_java_binary_operation_wrap = on_every_item -ij_java_blank_lines_after_anonymous_class_header = 0 -ij_java_blank_lines_after_class_header = 0 -ij_java_blank_lines_after_imports = 1 -ij_java_blank_lines_after_package = 1 -ij_java_blank_lines_around_class = 1 -ij_java_blank_lines_around_field = 0 -ij_java_blank_lines_around_field_in_interface = 0 -ij_java_blank_lines_around_initializer = 1 -ij_java_blank_lines_around_method = 1 -ij_java_blank_lines_around_method_in_interface = 1 -ij_java_blank_lines_before_class_end = 0 -ij_java_blank_lines_before_imports = 1 -ij_java_blank_lines_before_method_body = 0 -ij_java_blank_lines_before_package = 0 -ij_java_block_brace_style = end_of_line -ij_java_block_comment_add_space = false -ij_java_block_comment_at_first_column = false -ij_java_builder_methods = none -ij_java_call_parameters_new_line_after_left_paren = false -ij_java_call_parameters_right_paren_on_new_line = false -ij_java_call_parameters_wrap = normal -ij_java_case_statement_on_separate_line = true -ij_java_catch_on_new_line = false -ij_java_class_annotation_wrap = normal -ij_java_class_brace_style = end_of_line -ij_java_class_count_to_use_import_on_demand = 999 -ij_java_class_names_in_javadoc = 3 -ij_java_do_not_indent_top_level_class_members = false -ij_java_do_not_wrap_after_single_annotation = false -ij_java_do_not_wrap_after_single_annotation_in_parameter = false -ij_java_do_while_brace_force = if_multiline -ij_java_doc_add_blank_line_after_description = true -ij_java_doc_add_blank_line_after_param_comments = false -ij_java_doc_add_blank_line_after_return = false -ij_java_doc_add_p_tag_on_empty_lines = false -ij_java_doc_align_exception_comments = false -ij_java_doc_align_param_comments = false -ij_java_doc_do_not_wrap_if_one_line = true -ij_java_doc_enable_formatting = true -ij_java_doc_enable_leading_asterisks = true -ij_java_doc_indent_on_continuation = false -ij_java_doc_keep_empty_lines = true -ij_java_doc_keep_empty_parameter_tag = false -ij_java_doc_keep_empty_return_tag = false -ij_java_doc_keep_empty_throws_tag = true -ij_java_doc_keep_invalid_tags = true -ij_java_doc_param_description_on_new_line = false -ij_java_doc_preserve_line_breaks = true -ij_java_doc_use_throws_not_exception_tag = true -ij_java_else_on_new_line = false -ij_java_entity_dd_suffix = EJB -ij_java_entity_eb_suffix = Bean -ij_java_entity_hi_suffix = Home -ij_java_entity_lhi_prefix = Local -ij_java_entity_lhi_suffix = Home -ij_java_entity_li_prefix = Local -ij_java_entity_pk_class = java.lang.String -ij_java_entity_vo_suffix = VO -ij_java_enum_constants_wrap = off -ij_java_extends_keyword_wrap = normal -ij_java_extends_list_wrap = normal -ij_java_field_annotation_wrap = normal -ij_java_finally_on_new_line = false -ij_java_for_brace_force = never -ij_java_for_statement_new_line_after_left_paren = false -ij_java_for_statement_right_paren_on_new_line = false -ij_java_for_statement_wrap = normal -ij_java_generate_final_locals = false -ij_java_generate_final_parameters = false -ij_java_if_brace_force = if_multiline -ij_java_imports_layout = *,|,$* -ij_java_indent_case_from_switch = true -ij_java_insert_inner_class_imports = false -ij_java_insert_override_annotation = true -ij_java_keep_blank_lines_before_right_brace = 0 -ij_java_keep_blank_lines_between_package_declaration_and_header = 1 -ij_java_keep_blank_lines_in_code = 1 -ij_java_keep_blank_lines_in_declarations = 1 -ij_java_keep_builder_methods_indents = false -ij_java_keep_control_statement_in_one_line = true -ij_java_keep_first_column_comment = false -ij_java_keep_indents_on_empty_lines = false -ij_java_keep_line_breaks = true -ij_java_keep_multiple_expressions_in_one_line = false -ij_java_keep_simple_blocks_in_one_line = false -ij_java_keep_simple_classes_in_one_line = false -ij_java_keep_simple_lambdas_in_one_line = false -ij_java_keep_simple_methods_in_one_line = false -ij_java_label_indent_absolute = false -ij_java_label_indent_size = 0 -ij_java_lambda_brace_style = end_of_line -ij_java_layout_static_imports_separately = true -ij_java_line_comment_add_space = false -ij_java_line_comment_add_space_on_reformat = false -ij_java_line_comment_at_first_column = false -ij_java_message_dd_suffix = EJB -ij_java_message_eb_suffix = Bean -ij_java_method_annotation_wrap = split_into_lines -ij_java_method_brace_style = end_of_line -ij_java_method_call_chain_wrap = on_every_item -ij_java_method_parameters_new_line_after_left_paren = false -ij_java_method_parameters_right_paren_on_new_line = false -ij_java_method_parameters_wrap = normal -ij_java_modifier_list_wrap = false -ij_java_multi_catch_types_wrap = normal -ij_java_names_count_to_use_import_on_demand = 999 -ij_java_new_line_after_lparen_in_annotation = false -ij_java_new_line_after_lparen_in_record_header = false -ij_java_packages_to_use_import_on_demand = java.awt.*,javax.swing.* -ij_java_parameter_annotation_wrap = normal -ij_java_parentheses_expression_new_line_after_left_paren = false -ij_java_parentheses_expression_right_paren_on_new_line = false -ij_java_place_assignment_sign_on_next_line = true -ij_java_prefer_longer_names = true -ij_java_prefer_parameters_wrap = false -ij_java_record_components_wrap = normal -ij_java_repeat_synchronized = true -ij_java_replace_instanceof_and_cast = false -ij_java_replace_null_check = true -ij_java_replace_sum_lambda_with_method_ref = true -ij_java_resource_list_new_line_after_left_paren = false -ij_java_resource_list_right_paren_on_new_line = false -ij_java_resource_list_wrap = normal -ij_java_rparen_on_new_line_in_record_header = false -ij_java_session_dd_suffix = EJB -ij_java_session_eb_suffix = Bean -ij_java_session_hi_suffix = Home -ij_java_session_lhi_prefix = Local -ij_java_session_lhi_suffix = Home -ij_java_session_li_prefix = Local -ij_java_session_si_suffix = Service -ij_java_space_after_closing_angle_bracket_in_type_argument = false -ij_java_space_after_colon = true -ij_java_space_after_comma = true -ij_java_space_after_comma_in_type_arguments = true -ij_java_space_after_for_semicolon = true -ij_java_space_after_quest = true -ij_java_space_after_type_cast = true -ij_java_space_before_annotation_array_initializer_left_brace = false -ij_java_space_before_annotation_parameter_list = false -ij_java_space_before_array_initializer_left_brace = true -ij_java_space_before_catch_keyword = true -ij_java_space_before_catch_left_brace = true -ij_java_space_before_catch_parentheses = true -ij_java_space_before_class_left_brace = true -ij_java_space_before_colon = true -ij_java_space_before_colon_in_foreach = true -ij_java_space_before_comma = false -ij_java_space_before_do_left_brace = true -ij_java_space_before_else_keyword = true -ij_java_space_before_else_left_brace = true -ij_java_space_before_finally_keyword = true -ij_java_space_before_finally_left_brace = true -ij_java_space_before_for_left_brace = true -ij_java_space_before_for_parentheses = true -ij_java_space_before_for_semicolon = false -ij_java_space_before_if_left_brace = true -ij_java_space_before_if_parentheses = true -ij_java_space_before_method_call_parentheses = false -ij_java_space_before_method_left_brace = true -ij_java_space_before_method_parentheses = false -ij_java_space_before_opening_angle_bracket_in_type_parameter = false -ij_java_space_before_quest = true -ij_java_space_before_switch_left_brace = true -ij_java_space_before_switch_parentheses = true -ij_java_space_before_synchronized_left_brace = true -ij_java_space_before_synchronized_parentheses = true -ij_java_space_before_try_left_brace = true -ij_java_space_before_try_parentheses = true -ij_java_space_before_type_parameter_list = false -ij_java_space_before_while_keyword = true -ij_java_space_before_while_left_brace = true -ij_java_space_before_while_parentheses = true -ij_java_space_inside_one_line_enum_braces = false -ij_java_space_within_empty_array_initializer_braces = false -ij_java_space_within_empty_method_call_parentheses = false -ij_java_space_within_empty_method_parentheses = false -ij_java_spaces_around_additive_operators = true -ij_java_spaces_around_annotation_eq = true -ij_java_spaces_around_assignment_operators = true -ij_java_spaces_around_bitwise_operators = true -ij_java_spaces_around_equality_operators = true -ij_java_spaces_around_lambda_arrow = true -ij_java_spaces_around_logical_operators = true -ij_java_spaces_around_method_ref_dbl_colon = false -ij_java_spaces_around_multiplicative_operators = true -ij_java_spaces_around_relational_operators = true -ij_java_spaces_around_shift_operators = true -ij_java_spaces_around_type_bounds_in_type_parameters = true -ij_java_spaces_around_unary_operator = false -ij_java_spaces_within_angle_brackets = false -ij_java_spaces_within_annotation_parentheses = false -ij_java_spaces_within_array_initializer_braces = true -ij_java_spaces_within_braces = false -ij_java_spaces_within_brackets = false -ij_java_spaces_within_cast_parentheses = false -ij_java_spaces_within_catch_parentheses = false -ij_java_spaces_within_for_parentheses = false -ij_java_spaces_within_if_parentheses = false -ij_java_spaces_within_method_call_parentheses = false -ij_java_spaces_within_method_parentheses = false -ij_java_spaces_within_parentheses = false -ij_java_spaces_within_record_header = false -ij_java_spaces_within_switch_parentheses = false -ij_java_spaces_within_synchronized_parentheses = false -ij_java_spaces_within_try_parentheses = false -ij_java_spaces_within_while_parentheses = false -ij_java_special_else_if_treatment = true -ij_java_subclass_name_suffix = Impl -ij_java_ternary_operation_signs_on_next_line = true -ij_java_ternary_operation_wrap = normal -ij_java_test_name_suffix = Test -ij_java_throws_keyword_wrap = normal -ij_java_throws_list_wrap = normal -ij_java_use_external_annotations = false -ij_java_use_fq_class_names = false -ij_java_use_relative_indents = false -ij_java_use_single_class_imports = true -ij_java_variable_annotation_wrap = normal -ij_java_visibility = public -ij_java_while_brace_force = if_multiline -ij_java_while_on_new_line = false -ij_java_wrap_comments = true -ij_java_wrap_first_method_in_call_chain = false -ij_java_wrap_long_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 -ij_less_hex_color_lower_case = false -ij_less_hex_color_short_format = false -ij_less_hex_color_upper_case = false -ij_less_keep_blank_lines_in_code = 1 -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 -ij_less_use_double_quotes = true -ij_less_value_alignment = 0 - -[*.proto] -indent_size = 2 -tab_width = 2 -ij_continuation_indent_size = 4 -ij_protobuf_keep_blank_lines_in_code = 1 -ij_protobuf_keep_indents_on_empty_lines = false -ij_protobuf_keep_line_breaks = true -ij_protobuf_space_after_comma = true -ij_protobuf_space_before_comma = false -ij_protobuf_spaces_around_assignment_operators = true -ij_protobuf_spaces_within_braces = false -ij_protobuf_spaces_within_brackets = false - -[*.sass] -indent_size = 2 -ij_sass_align_closing_brace_with_properties = false -ij_sass_blank_lines_around_nested_selector = 1 -ij_sass_blank_lines_between_blocks = 1 -ij_sass_brace_placement = 0 -ij_sass_enforce_quotes_on_format = false -ij_sass_hex_color_long_format = false -ij_sass_hex_color_lower_case = false -ij_sass_hex_color_short_format = false -ij_sass_hex_color_upper_case = false -ij_sass_keep_blank_lines_in_code = 1 -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 -ij_sass_use_double_quotes = true -ij_sass_value_alignment = 0 - -[*.scss] -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 -ij_scss_hex_color_lower_case = false -ij_scss_hex_color_short_format = false -ij_scss_hex_color_upper_case = false -ij_scss_keep_blank_lines_in_code = 1 -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 -ij_scss_use_double_quotes = true -ij_scss_value_alignment = 0 - -[*.styl] -indent_size = 2 -ij_stylus_align_closing_brace_with_properties = false -ij_stylus_blank_lines_around_nested_selector = 1 -ij_stylus_blank_lines_between_blocks = 1 -ij_stylus_brace_placement = 0 -ij_stylus_enforce_quotes_on_format = false -ij_stylus_hex_color_long_format = false -ij_stylus_hex_color_lower_case = false -ij_stylus_hex_color_short_format = false -ij_stylus_hex_color_upper_case = false -ij_stylus_keep_blank_lines_in_code = 1 -ij_stylus_keep_indents_on_empty_lines = false -ij_stylus_keep_single_line_blocks = false -ij_stylus_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_stylus_space_after_colon = true -ij_stylus_space_before_opening_brace = true -ij_stylus_use_double_quotes = true -ij_stylus_value_alignment = 0 - - -[{*.ant,*.fxml,*.jhm,*.jnlp,*.jrxml,*.pom,*.rng,*.tld,*.wadl,*.wsdl,*.xml,*.xsd,*.xsl,*.xslt,*.xul}] -ij_continuation_indent_size = 2 -ij_xml_align_attributes = false -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 = 1 -ij_xml_keep_indents_on_empty_lines = false -ij_xml_keep_line_breaks = true -ij_xml_keep_line_breaks_in_text = true -ij_xml_keep_whitespaces = false -ij_xml_keep_whitespaces_around_cdata = preserve -ij_xml_keep_whitespaces_inside_cdata = false -ij_xml_line_comment_at_first_column = true -ij_xml_space_after_tag_name = false -ij_xml_space_around_equals_in_attribute = false -ij_xml_space_inside_empty_tag = false -ij_xml_text_wrap = normal -ij_xml_use_custom_settings = true - -[{*.ats,*.cts,*.mts,*.ts}] -ij_continuation_indent_size = 4 -ij_typescript_align_imports = false -ij_typescript_align_multiline_array_initializer_expression = false -ij_typescript_align_multiline_binary_operation = false -ij_typescript_align_multiline_chained_methods = false -ij_typescript_align_multiline_extends_list = false -ij_typescript_align_multiline_for = true -ij_typescript_align_multiline_parameters = true -ij_typescript_align_multiline_parameters_in_calls = false -ij_typescript_align_multiline_ternary_operation = false -ij_typescript_align_object_properties = 0 -ij_typescript_align_union_types = false -ij_typescript_align_var_statements = 0 -ij_typescript_array_initializer_new_line_after_left_brace = false -ij_typescript_array_initializer_right_brace_on_new_line = false -ij_typescript_array_initializer_wrap = off -ij_typescript_assignment_wrap = off -ij_typescript_binary_operation_sign_on_next_line = false -ij_typescript_binary_operation_wrap = off -ij_typescript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** -ij_typescript_blank_lines_after_imports = 1 -ij_typescript_blank_lines_around_class = 1 -ij_typescript_blank_lines_around_field = 0 -ij_typescript_blank_lines_around_field_in_interface = 0 -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 = end_of_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 -ij_typescript_catch_on_new_line = false -ij_typescript_chained_call_dot_on_new_line = true -ij_typescript_class_brace_style = end_of_line -ij_typescript_comma_on_new_line = false -ij_typescript_do_while_brace_force = never -ij_typescript_else_on_new_line = false -ij_typescript_enforce_trailing_comma = keep -ij_typescript_enum_constants_wrap = on_every_item -ij_typescript_extends_keyword_wrap = off -ij_typescript_extends_list_wrap = off -ij_typescript_field_prefix = _ -ij_typescript_file_name_style = relaxed -ij_typescript_finally_on_new_line = false -ij_typescript_for_brace_force = never -ij_typescript_for_statement_new_line_after_left_paren = false -ij_typescript_for_statement_right_paren_on_new_line = false -ij_typescript_for_statement_wrap = off -ij_typescript_force_quote_style = false -ij_typescript_force_semicolon_style = false -ij_typescript_function_expression_brace_style = end_of_line -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 = false -ij_typescript_import_use_node_resolution = true -ij_typescript_imports_wrap = on_every_item -ij_typescript_indent_case_from_switch = true -ij_typescript_indent_chained_calls = true -ij_typescript_indent_package_children = 0 -ij_typescript_jsdoc_include_types = false -ij_typescript_jsx_attribute_value = braces -ij_typescript_keep_blank_lines_in_code = 1 -ij_typescript_keep_first_column_comment = true -ij_typescript_keep_indents_on_empty_lines = false -ij_typescript_keep_line_breaks = true -ij_typescript_keep_simple_blocks_in_one_line = false -ij_typescript_keep_simple_methods_in_one_line = false -ij_typescript_line_comment_add_space = true -ij_typescript_line_comment_at_first_column = false -ij_typescript_method_brace_style = end_of_line -ij_typescript_method_call_chain_wrap = off -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_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 = false -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_reformat_c_style_comments = false -ij_typescript_space_after_colon = true -ij_typescript_space_after_comma = true -ij_typescript_space_after_dots_in_rest_parameter = false -ij_typescript_space_after_generator_mult = true -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_catch_keyword = true -ij_typescript_space_before_catch_left_brace = true -ij_typescript_space_before_catch_parentheses = true -ij_typescript_space_before_class_lbrace = true -ij_typescript_space_before_class_left_brace = true -ij_typescript_space_before_colon = true -ij_typescript_space_before_comma = false -ij_typescript_space_before_do_left_brace = true -ij_typescript_space_before_else_keyword = true -ij_typescript_space_before_else_left_brace = true -ij_typescript_space_before_finally_keyword = true -ij_typescript_space_before_finally_left_brace = true -ij_typescript_space_before_for_left_brace = true -ij_typescript_space_before_for_parentheses = true -ij_typescript_space_before_for_semicolon = false -ij_typescript_space_before_function_left_parenth = true -ij_typescript_space_before_generator_mult = false -ij_typescript_space_before_if_left_brace = true -ij_typescript_space_before_if_parentheses = true -ij_typescript_space_before_method_call_parentheses = false -ij_typescript_space_before_method_left_brace = true -ij_typescript_space_before_method_parentheses = false -ij_typescript_space_before_property_colon = false -ij_typescript_space_before_quest = true -ij_typescript_space_before_switch_left_brace = true -ij_typescript_space_before_switch_parentheses = true -ij_typescript_space_before_try_left_brace = true -ij_typescript_space_before_type_colon = false -ij_typescript_space_before_unary_not = false -ij_typescript_space_before_while_keyword = true -ij_typescript_space_before_while_left_brace = true -ij_typescript_space_before_while_parentheses = true -ij_typescript_spaces_around_additive_operators = true -ij_typescript_spaces_around_arrow_function_operator = true -ij_typescript_spaces_around_assignment_operators = true -ij_typescript_spaces_around_bitwise_operators = true -ij_typescript_spaces_around_equality_operators = true -ij_typescript_spaces_around_logical_operators = true -ij_typescript_spaces_around_multiplicative_operators = true -ij_typescript_spaces_around_relational_operators = true -ij_typescript_spaces_around_shift_operators = true -ij_typescript_spaces_around_unary_operator = false -ij_typescript_spaces_within_array_initializer_brackets = false -ij_typescript_spaces_within_brackets = false -ij_typescript_spaces_within_catch_parentheses = false -ij_typescript_spaces_within_for_parentheses = false -ij_typescript_spaces_within_if_parentheses = false -ij_typescript_spaces_within_imports = false -ij_typescript_spaces_within_interpolation_expressions = false -ij_typescript_spaces_within_method_call_parentheses = false -ij_typescript_spaces_within_method_parentheses = false -ij_typescript_spaces_within_object_literal_braces = false -ij_typescript_spaces_within_object_type_braces = true -ij_typescript_spaces_within_parentheses = false -ij_typescript_spaces_within_switch_parentheses = false -ij_typescript_spaces_within_type_assertion = false -ij_typescript_spaces_within_union_types = true -ij_typescript_spaces_within_while_parentheses = false -ij_typescript_special_else_if_treatment = true -ij_typescript_ternary_operation_signs_on_next_line = false -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 = true -ij_typescript_use_explicit_js_extension = auto -ij_typescript_use_path_mapping = always -ij_typescript_use_public_modifier = false -ij_typescript_use_semicolon_after_statement = true -ij_typescript_var_declaration_wrap = normal -ij_typescript_while_brace_force = never -ij_typescript_while_on_new_line = false -ij_typescript_wrap_comments = false - -[{*.bash,*.sh,*.zsh}] -indent_size = 2 -tab_width = 2 -ij_shell_binary_ops_start_line = false -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 -ij_javascript_align_imports = false -ij_javascript_align_multiline_array_initializer_expression = false -ij_javascript_align_multiline_binary_operation = false -ij_javascript_align_multiline_chained_methods = false -ij_javascript_align_multiline_extends_list = false -ij_javascript_align_multiline_for = true -ij_javascript_align_multiline_parameters = true -ij_javascript_align_multiline_parameters_in_calls = false -ij_javascript_align_multiline_ternary_operation = false -ij_javascript_align_object_properties = 0 -ij_javascript_align_union_types = false -ij_javascript_align_var_statements = 0 -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 = off -ij_javascript_assignment_wrap = off -ij_javascript_binary_operation_sign_on_next_line = false -ij_javascript_binary_operation_wrap = off -ij_javascript_blacklist_imports = rxjs/Rx,node_modules/**,**/node_modules/**,@angular/material,@angular/material/typings/** -ij_javascript_blank_lines_after_imports = 1 -ij_javascript_blank_lines_around_class = 1 -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 = end_of_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 = false -ij_javascript_chained_call_dot_on_new_line = true -ij_javascript_class_brace_style = end_of_line -ij_javascript_comma_on_new_line = false -ij_javascript_do_while_brace_force = never -ij_javascript_else_on_new_line = false -ij_javascript_enforce_trailing_comma = keep -ij_javascript_extends_keyword_wrap = off -ij_javascript_extends_list_wrap = off -ij_javascript_field_prefix = _ -ij_javascript_file_name_style = relaxed -ij_javascript_finally_on_new_line = false -ij_javascript_for_brace_force = never -ij_javascript_for_statement_new_line_after_left_paren = false -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_if_brace_force = never -ij_javascript_import_merge_members = global -ij_javascript_import_prefer_absolute_path = global -ij_javascript_import_sort_members = true -ij_javascript_import_sort_module_name = false -ij_javascript_import_use_node_resolution = true -ij_javascript_imports_wrap = on_every_item -ij_javascript_indent_case_from_switch = true -ij_javascript_indent_chained_calls = true -ij_javascript_indent_package_children = 0 -ij_javascript_jsx_attribute_value = braces -ij_javascript_keep_blank_lines_in_code = 1 -ij_javascript_keep_first_column_comment = true -ij_javascript_keep_indents_on_empty_lines = false -ij_javascript_keep_line_breaks = true -ij_javascript_keep_simple_blocks_in_one_line = false -ij_javascript_keep_simple_methods_in_one_line = false -ij_javascript_line_comment_add_space = true -ij_javascript_line_comment_at_first_column = false -ij_javascript_method_brace_style = end_of_line -ij_javascript_method_call_chain_wrap = off -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_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 -ij_javascript_prefer_as_type_cast = false -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_reformat_c_style_comments = false -ij_javascript_space_after_colon = true -ij_javascript_space_after_comma = true -ij_javascript_space_after_dots_in_rest_parameter = false -ij_javascript_space_after_generator_mult = true -ij_javascript_space_after_property_colon = true -ij_javascript_space_after_quest = true -ij_javascript_space_after_type_colon = true -ij_javascript_space_after_unary_not = false -ij_javascript_space_before_async_arrow_lparen = true -ij_javascript_space_before_catch_keyword = true -ij_javascript_space_before_catch_left_brace = true -ij_javascript_space_before_catch_parentheses = true -ij_javascript_space_before_class_lbrace = true -ij_javascript_space_before_class_left_brace = true -ij_javascript_space_before_colon = true -ij_javascript_space_before_comma = false -ij_javascript_space_before_do_left_brace = true -ij_javascript_space_before_else_keyword = true -ij_javascript_space_before_else_left_brace = true -ij_javascript_space_before_finally_keyword = true -ij_javascript_space_before_finally_left_brace = true -ij_javascript_space_before_for_left_brace = true -ij_javascript_space_before_for_parentheses = true -ij_javascript_space_before_for_semicolon = false -ij_javascript_space_before_function_left_parenth = true -ij_javascript_space_before_generator_mult = false -ij_javascript_space_before_if_left_brace = true -ij_javascript_space_before_if_parentheses = true -ij_javascript_space_before_method_call_parentheses = false -ij_javascript_space_before_method_left_brace = true -ij_javascript_space_before_method_parentheses = false -ij_javascript_space_before_property_colon = false -ij_javascript_space_before_quest = true -ij_javascript_space_before_switch_left_brace = true -ij_javascript_space_before_switch_parentheses = true -ij_javascript_space_before_try_left_brace = true -ij_javascript_space_before_type_colon = false -ij_javascript_space_before_unary_not = false -ij_javascript_space_before_while_keyword = true -ij_javascript_space_before_while_left_brace = true -ij_javascript_space_before_while_parentheses = true -ij_javascript_spaces_around_additive_operators = true -ij_javascript_spaces_around_arrow_function_operator = true -ij_javascript_spaces_around_assignment_operators = true -ij_javascript_spaces_around_bitwise_operators = true -ij_javascript_spaces_around_equality_operators = true -ij_javascript_spaces_around_logical_operators = true -ij_javascript_spaces_around_multiplicative_operators = true -ij_javascript_spaces_around_relational_operators = true -ij_javascript_spaces_around_shift_operators = true -ij_javascript_spaces_around_unary_operator = false -ij_javascript_spaces_within_array_initializer_brackets = false -ij_javascript_spaces_within_brackets = false -ij_javascript_spaces_within_catch_parentheses = false -ij_javascript_spaces_within_for_parentheses = false -ij_javascript_spaces_within_if_parentheses = false -ij_javascript_spaces_within_imports = false -ij_javascript_spaces_within_interpolation_expressions = false -ij_javascript_spaces_within_method_call_parentheses = false -ij_javascript_spaces_within_method_parentheses = false -ij_javascript_spaces_within_object_literal_braces = false -ij_javascript_spaces_within_object_type_braces = true -ij_javascript_spaces_within_parentheses = false -ij_javascript_spaces_within_switch_parentheses = false -ij_javascript_spaces_within_type_assertion = false -ij_javascript_spaces_within_union_types = true -ij_javascript_spaces_within_while_parentheses = false -ij_javascript_special_else_if_treatment = true -ij_javascript_ternary_operation_signs_on_next_line = false -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 = auto -ij_javascript_use_path_mapping = always -ij_javascript_use_public_modifier = false -ij_javascript_use_semicolon_after_statement = true -ij_javascript_var_declaration_wrap = normal -ij_javascript_while_brace_force = never -ij_javascript_while_on_new_line = false -ij_javascript_wrap_comments = false - -[{*.ft,*.vm,*.vsl}] -ij_vtl_keep_indents_on_empty_lines = false - -[{*.gant,*.gradle,*.groovy,*.gy}] -ij_groovy_align_group_field_declarations = false -ij_groovy_align_multiline_array_initializer_expression = false -ij_groovy_align_multiline_assignment = false -ij_groovy_align_multiline_binary_operation = false -ij_groovy_align_multiline_chained_methods = false -ij_groovy_align_multiline_extends_list = false -ij_groovy_align_multiline_for = false -ij_groovy_align_multiline_list_or_map = false -ij_groovy_align_multiline_method_parentheses = false -ij_groovy_align_multiline_parameters = false -ij_groovy_align_multiline_parameters_in_calls = false -ij_groovy_align_multiline_resources = true -ij_groovy_align_multiline_ternary_operation = false -ij_groovy_align_multiline_throws_list = false -ij_groovy_align_named_args_in_map = false -ij_groovy_align_throws_keyword = false -ij_groovy_array_initializer_new_line_after_left_brace = false -ij_groovy_array_initializer_right_brace_on_new_line = false -ij_groovy_array_initializer_wrap = off -ij_groovy_assert_statement_wrap = normal -ij_groovy_assignment_wrap = normal -ij_groovy_binary_operation_wrap = on_every_item -ij_groovy_blank_lines_after_class_header = 0 -ij_groovy_blank_lines_after_imports = 1 -ij_groovy_blank_lines_after_package = 1 -ij_groovy_blank_lines_around_class = 1 -ij_groovy_blank_lines_around_field = 0 -ij_groovy_blank_lines_around_field_in_interface = 0 -ij_groovy_blank_lines_around_method = 1 -ij_groovy_blank_lines_around_method_in_interface = 1 -ij_groovy_blank_lines_before_imports = 1 -ij_groovy_blank_lines_before_method_body = 0 -ij_groovy_blank_lines_before_package = 0 -ij_groovy_block_brace_style = end_of_line -ij_groovy_block_comment_add_space = false -ij_groovy_block_comment_at_first_column = true -ij_groovy_call_parameters_new_line_after_left_paren = false -ij_groovy_call_parameters_right_paren_on_new_line = false -ij_groovy_call_parameters_wrap = normal -ij_groovy_catch_on_new_line = false -ij_groovy_class_annotation_wrap = normal -ij_groovy_class_brace_style = end_of_line -ij_groovy_class_count_to_use_import_on_demand = 5 -ij_groovy_do_while_brace_force = never -ij_groovy_else_on_new_line = false -ij_groovy_enable_groovydoc_formatting = true -ij_groovy_enum_constants_wrap = off -ij_groovy_extends_keyword_wrap = normal -ij_groovy_extends_list_wrap = normal -ij_groovy_field_annotation_wrap = normal -ij_groovy_finally_on_new_line = false -ij_groovy_for_brace_force = never -ij_groovy_for_statement_new_line_after_left_paren = false -ij_groovy_for_statement_right_paren_on_new_line = false -ij_groovy_for_statement_wrap = off -ij_groovy_ginq_general_clause_wrap_policy = 2 -ij_groovy_ginq_having_wrap_policy = 1 -ij_groovy_ginq_indent_having_clause = true -ij_groovy_ginq_indent_on_clause = true -ij_groovy_ginq_on_wrap_policy = 1 -ij_groovy_ginq_space_after_keyword = true -ij_groovy_if_brace_force = if_multiline -ij_groovy_import_annotation_wrap = 2 -ij_groovy_imports_layout = *,|,javax.**,java.**,|,$* -ij_groovy_indent_case_from_switch = true -ij_groovy_indent_label_blocks = true -ij_groovy_insert_inner_class_imports = false -ij_groovy_keep_blank_lines_before_right_brace = 0 -ij_groovy_keep_blank_lines_in_code = 1 -ij_groovy_keep_blank_lines_in_declarations = 1 -ij_groovy_keep_control_statement_in_one_line = true -ij_groovy_keep_first_column_comment = false -ij_groovy_keep_indents_on_empty_lines = false -ij_groovy_keep_line_breaks = true -ij_groovy_keep_multiple_expressions_in_one_line = false -ij_groovy_keep_simple_blocks_in_one_line = false -ij_groovy_keep_simple_classes_in_one_line = true -ij_groovy_keep_simple_lambdas_in_one_line = true -ij_groovy_keep_simple_methods_in_one_line = true -ij_groovy_label_indent_absolute = false -ij_groovy_label_indent_size = 0 -ij_groovy_lambda_brace_style = end_of_line -ij_groovy_layout_static_imports_separately = true -ij_groovy_line_comment_add_space = false -ij_groovy_line_comment_add_space_on_reformat = false -ij_groovy_line_comment_at_first_column = true -ij_groovy_method_annotation_wrap = normal -ij_groovy_method_brace_style = end_of_line -ij_groovy_method_call_chain_wrap = on_every_item -ij_groovy_method_parameters_new_line_after_left_paren = false -ij_groovy_method_parameters_right_paren_on_new_line = false -ij_groovy_method_parameters_wrap = normal -ij_groovy_modifier_list_wrap = false -ij_groovy_names_count_to_use_import_on_demand = 3 -ij_groovy_packages_to_use_import_on_demand = java.awt.*,javax.swing.* -ij_groovy_parameter_annotation_wrap = normal -ij_groovy_parentheses_expression_new_line_after_left_paren = false -ij_groovy_parentheses_expression_right_paren_on_new_line = false -ij_groovy_prefer_parameters_wrap = false -ij_groovy_resource_list_new_line_after_left_paren = false -ij_groovy_resource_list_right_paren_on_new_line = false -ij_groovy_resource_list_wrap = off -ij_groovy_space_after_assert_separator = true -ij_groovy_space_after_colon = true -ij_groovy_space_after_comma = true -ij_groovy_space_after_comma_in_type_arguments = true -ij_groovy_space_after_for_semicolon = true -ij_groovy_space_after_quest = true -ij_groovy_space_after_type_cast = true -ij_groovy_space_before_annotation_parameter_list = false -ij_groovy_space_before_array_initializer_left_brace = false -ij_groovy_space_before_assert_separator = false -ij_groovy_space_before_catch_keyword = true -ij_groovy_space_before_catch_left_brace = true -ij_groovy_space_before_catch_parentheses = true -ij_groovy_space_before_class_left_brace = true -ij_groovy_space_before_closure_left_brace = true -ij_groovy_space_before_colon = true -ij_groovy_space_before_comma = false -ij_groovy_space_before_do_left_brace = true -ij_groovy_space_before_else_keyword = true -ij_groovy_space_before_else_left_brace = true -ij_groovy_space_before_finally_keyword = true -ij_groovy_space_before_finally_left_brace = true -ij_groovy_space_before_for_left_brace = true -ij_groovy_space_before_for_parentheses = true -ij_groovy_space_before_for_semicolon = false -ij_groovy_space_before_if_left_brace = true -ij_groovy_space_before_if_parentheses = true -ij_groovy_space_before_method_call_parentheses = false -ij_groovy_space_before_method_left_brace = true -ij_groovy_space_before_method_parentheses = false -ij_groovy_space_before_quest = true -ij_groovy_space_before_record_parentheses = false -ij_groovy_space_before_switch_left_brace = true -ij_groovy_space_before_switch_parentheses = true -ij_groovy_space_before_synchronized_left_brace = true -ij_groovy_space_before_synchronized_parentheses = true -ij_groovy_space_before_try_left_brace = true -ij_groovy_space_before_try_parentheses = true -ij_groovy_space_before_while_keyword = true -ij_groovy_space_before_while_left_brace = true -ij_groovy_space_before_while_parentheses = true -ij_groovy_space_in_named_argument = true -ij_groovy_space_in_named_argument_before_colon = false -ij_groovy_space_within_empty_array_initializer_braces = false -ij_groovy_space_within_empty_method_call_parentheses = false -ij_groovy_spaces_around_additive_operators = true -ij_groovy_spaces_around_assignment_operators = true -ij_groovy_spaces_around_bitwise_operators = true -ij_groovy_spaces_around_equality_operators = true -ij_groovy_spaces_around_lambda_arrow = true -ij_groovy_spaces_around_logical_operators = true -ij_groovy_spaces_around_multiplicative_operators = true -ij_groovy_spaces_around_regex_operators = true -ij_groovy_spaces_around_relational_operators = true -ij_groovy_spaces_around_shift_operators = true -ij_groovy_spaces_within_annotation_parentheses = false -ij_groovy_spaces_within_array_initializer_braces = false -ij_groovy_spaces_within_braces = true -ij_groovy_spaces_within_brackets = false -ij_groovy_spaces_within_cast_parentheses = false -ij_groovy_spaces_within_catch_parentheses = false -ij_groovy_spaces_within_for_parentheses = false -ij_groovy_spaces_within_gstring_injection_braces = false -ij_groovy_spaces_within_if_parentheses = false -ij_groovy_spaces_within_list_or_map = false -ij_groovy_spaces_within_method_call_parentheses = false -ij_groovy_spaces_within_method_parentheses = false -ij_groovy_spaces_within_parentheses = false -ij_groovy_spaces_within_switch_parentheses = false -ij_groovy_spaces_within_synchronized_parentheses = false -ij_groovy_spaces_within_try_parentheses = false -ij_groovy_spaces_within_tuple_expression = false -ij_groovy_spaces_within_while_parentheses = false -ij_groovy_special_else_if_treatment = true -ij_groovy_ternary_operation_wrap = normal -ij_groovy_throws_keyword_wrap = normal -ij_groovy_throws_list_wrap = normal -ij_groovy_use_flying_geese_braces = false -ij_groovy_use_fq_class_names = false -ij_groovy_use_fq_class_names_in_javadoc = true -ij_groovy_use_relative_indents = false -ij_groovy_use_single_class_imports = true -ij_groovy_variable_annotation_wrap = normal -ij_groovy_while_brace_force = if_multiline -ij_groovy_while_on_new_line = false -ij_groovy_wrap_chain_calls_after_dot = false -ij_groovy_wrap_long_lines = false - -[{*.har,*.jsb2,*.jsb3,*.json,.babelrc,.eslintrc,.stylelintrc,bowerrc,jest.config}] -indent_size = 2 -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 = false -ij_json_space_before_comma = false -ij_json_spaces_within_braces = false -ij_json_spaces_within_brackets = false -ij_json_wrap_long_lines = false - -[{*.htm,*.html,*.ng,*.sht,*.shtm,*.shtml}] -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 -ij_html_do_not_indent_children_of_tags = html,body,thead,tbody,tfoot -ij_html_enforce_quotes = false -ij_html_inline_tags = a,abbr,acronym,b,basefont,bdo,big,br,cite,cite,code,dfn,em,font,i,img,input,kbd,label,q,s,samp,select,small,span,strike,strong,sub,sup,textarea,tt,u,var -ij_html_keep_blank_lines = 1 -ij_html_keep_indents_on_empty_lines = false -ij_html_keep_line_breaks = true -ij_html_keep_line_breaks_in_text = true -ij_html_keep_whitespaces = false -ij_html_keep_whitespaces_inside = span,pre,textarea -ij_html_line_comment_at_first_column = true -ij_html_new_line_after_last_attribute = never -ij_html_new_line_before_first_attribute = never -ij_html_quote_style = double -ij_html_remove_new_line_before_tags = br -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 - -[{*.jsf,*.jsp,*.jspf,*.tag,*.tagf,*.xjsp}] -ij_jsp_jsp_prefer_comma_separated_import_list = false -ij_jsp_keep_indents_on_empty_lines = false - -[{*.jspx,*.tagx}] -ij_jspx_keep_indents_on_empty_lines = false - -[{*.qute.htm,*.qute.html,*.qute.json,*.qute.txt,*.qute.yaml,*.qute.yml}] -ij_qute_keep_indents_on_empty_lines = false diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 5b983dee6c..0000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,9 +0,0 @@ -# This is a comment. -# Each line is a file pattern followed by one or more owners. - -# These owners will be the default owners for everything in -# the repo. Unless a later match takes precedence, -# @owner1 and @owner2 will be requested for -# review when someone opens a pull request. - -* @rbusarow diff --git a/.github/project.dic b/.github/project.dic deleted file mode 100644 index 1f5e8ed882..0000000000 --- a/.github/project.dic +++ /dev/null @@ -1,7 +0,0 @@ -Dfile -Dorg -codeql -jvmargs -signoff -stefanzweifel -styfle diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml deleted file mode 100644 index 3c3394af67..0000000000 --- a/.github/release-drafter.yml +++ /dev/null @@ -1,88 +0,0 @@ -name-template: '$RESOLVED_VERSION' -tag-template: '$RESOLVED_VERSION' - -categories: - - title: '📐 New Rules' - labels: - - 'New Rule' - - title: '🚀 Features' - labels: - - 'feature' - - 'enhancement' - - title: '💥 Breaking Changes' - labels: - - 'api-breaking change' - - title: '🐛 Bug Fixes' - labels: - - 'fix' - - 'bugfix' - - 'bug' - - title: '🧰 Maintenance' - labels: - - 'chore' - - 'dependencies' - - title: 'ℹ️ Website' - labels: - - 'documentation' - -change-template: '- $TITLE [@$AUTHOR](https://github.com/$AUTHOR) ([#$NUMBER](https://github.com/rbusarow/ModuleCheck/pull/$NUMBER))' - -change-title-escapes: '\<*_&' # You can add # and @ to disable mentions, and add ` to disable code blocks. - -version-resolver: - major: - labels: - - 'major' - minor: - labels: - - 'minor' - - 'feature' - - 'enhancement' - patch: - labels: - - 'patch' - - 'fix' - - 'bugfix' - - 'bug' - default: patch - -template: | - ## Changes - - $CHANGES - - ## Contributors - - $CONTRIBUTORS - -exclude-contributors: - - 'dependabot' - - 'dependabot[bot]' - - 'renovate' - - 'renovate[bot]' - - 'renovate-bot' - - 'kodiakhq' - - 'kodiakhq[bot]' - -autolabeler: - - label: 'documentation' - files: - - '*.md' - - label: 'dependencies' - branch: - - '/dependabot\/.+/' - - '/renovate\/.+/' - -include-labels: - - 'api-breaking change' - - 'bug' - - 'bugfix' - - 'chore' - - 'dependencies' - - 'documentation' - - 'enhancement' - - 'feature' - - 'fix' - - 'major' - - 'minor' - - 'patch' diff --git a/.github/release.yml b/.github/release.yml deleted file mode 100644 index 496411cdb7..0000000000 --- a/.github/release.yml +++ /dev/null @@ -1,41 +0,0 @@ -# .github/release.yml - -changelog: - exclude: - labels: - - ignore-for-release - authors: - - dependabot - - dependabot[bot] - - renovate - - renovate[bot] - - renovate-bot - - kodiakhq - - kodiakhq[bot] - - categories: - - title: 📐 New Rules - labels: - - New Rule - - title: 🚀 Features - labels: - - feature - - enhancement - - title: 💥 Breaking Changes - labels: - - api-breaking change - - title: 🐛 Bug Fixes - labels: - - fix - - bugfix - - bug - - title: 🧰 Maintenance - labels: - - chore - - dependencies - - title: ℹ️ Website - labels: - - documentation - - title: Other Changes - labels: - - "*" diff --git a/.github/renovate-sh.json5 b/.github/renovate-sh.json5 deleted file mode 100644 index 470eaacd03..0000000000 --- a/.github/renovate-sh.json5 +++ /dev/null @@ -1,11 +0,0 @@ -{ - onboardingBranch: 'github-renovate/configure', - $schema: 'https://docs.renovatebot.com/renovate-schema.json', - dependencyDashboardTitle: 'Dependency Dashboard', - onboarding: true, - branchPrefix: 'github-renovate/', - platform: 'github', - repositories: [ - 'rickbusarow/modulecheck' - ] -} diff --git a/.github/renovate.json5 b/.github/renovate.json5 deleted file mode 100644 index 348760e711..0000000000 --- a/.github/renovate.json5 +++ /dev/null @@ -1,88 +0,0 @@ -{ - $schema: 'https://docs.renovatebot.com/renovate-schema.json', - extends: [ - 'config:best-practices', - 'default:disableRateLimiting' - ], - rebaseWhen: 'auto', - rebaseLabel: 'rebase', - stopUpdatingLabel: 'renovate-ignore', - labels: [ - 'dependencies', - 'automerge' - ], - packageRules: [ - { - groupName: 'All GitHub Actions dependencies', - matchManagers: [ - 'github-actions' - ] - }, - { - groupName: 'Kotlin and compiler plugins', - separateMultipleMajor: false, - matchPackageNames: [ - 'org.jetbrains.kotlin:{/,}**', - 'com.google.devtools.ksp:{/,}**', - 'com.square.anvil:{/,}**', - 'dev.drewhamilton.poko:{/,}**' - ] - }, - { - groupName: 'JUnit5 libs', - matchPackageNames: [ - 'org.junit.jupiter:{/,}**', - 'org.junit.platform:{/,}**', - 'org.junit.vintage:{/,}**' - ] - }, - { - groupName: 'KtLint libs', - matchPackageNames: [ - 'com.pinterest.ktlint:{/,}**', - 'com.rickbusarow.ktlint:{/,}**', - 'com.rickbusarow.ktrules:{/,}**' - ] - }, - { - automergeStrategy: 'rebase', - matchPackageNames: [ - 'com.rickbusarow.modulecheck:{/,}**', - 'com.rickbusarow.module-check' - ], - groupName: 'ModuleCheck published version', - automerge: true, - automergeType: 'pr', - autoApprove: true, - labels: [ - 'dependencies' - ] - }, - { - matchPackageNames: [ - 'com.rickbusarow.module-check', - 'com.rickbusarow.dispatch:{/,}**', - 'com.rickbusarow.doks:{/,}**', - 'com.rickbusarow.gradle-dependency-sync:{/,}**', - 'com.rickbusarow.hermit:{/,}**', - 'com.rickbusarow.kase:{/,}**', - 'com.rickbusarow.kgx:{/,}**', - 'com.rickbusarow.ktlint:{/,}**', - 'com.rickbusarow.ktrules:{/,}**', - 'com.rickbusarow.lattice:{/,}**', - 'com.rickbusarow.modulecheck:{/,}**' - ], - automergeStrategy: 'rebase', - matchRepositories: [ - 'repo.maven.apache.org/maven2', - 'plugins.gradle.org/m2' - ], - automerge: true, - automergeType: 'pr', - autoApprove: true, - labels: [ - 'dependencies' - ] - } - ] -} diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml deleted file mode 100644 index dd8010d0f7..0000000000 --- a/.github/workflows/ci.yml +++ /dev/null @@ -1,376 +0,0 @@ -name: CI - -on: - pull_request: - workflow_dispatch: - -jobs: - - cancel-previous-runs: - runs-on: ubuntu-latest - steps: - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@85880fa0301c86cca9da44039ee3bb12d3bedbfa # 0.12.1 - env: - GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' - - validate-wrapper: - runs-on: ubuntu-latest - steps: - - name: check out - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - uses: gradle/wrapper-validation-action@f9c9c575b8b21b6485636a91ffecd10e558c62f6 # v3 - - build-all: - needs: validate-wrapper - strategy: - fail-fast: false - matrix: - runner: [ ubuntu-latest, windows-latest ] - runs-on: ${{ matrix.runner }} - steps: - - name: check out - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: main build - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: jar compileKotlin - write-cache-key: main-build-artifacts - restore-cache-key: build-logic-artifacts - - ktlint: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Create GitHub App Token - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 - id: app-token - with: - app-id: ${{ secrets.PR_BOT_APP_ID }} - private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} - - - name: ktlint - uses: rickbusarow/actions/gradle-task-with-commit@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - personal-access-token: ${{ steps.app-token.outputs.token }} - fix-task: ktlintFormat - check-task: ktlintCheck - - ci-matrices: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Create GitHub App Token - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 - id: app-token - with: - app-id: ${{ secrets.PR_BOT_APP_ID }} - private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} - - - name: ci-matrices - uses: rickbusarow/actions/gradle-task-with-commit@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - personal-access-token: ${{ steps.app-token.outputs.token }} - fix-task: versionsMatrixYamlUpdate unitTestShardMatrixYamlUpdate - check-task: versionsMatrixYamlCheck unitTestShardMatrixYamlCheck - - dependency-guard: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Create GitHub App Token - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 - id: app-token - with: - app-id: ${{ secrets.PR_BOT_APP_ID }} - private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} - - - name: dependency-guard - uses: rickbusarow/actions/gradle-task-with-commit@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - personal-access-token: ${{ steps.app-token.outputs.token }} - fix-task: dependencyGuardBaseline --no-parallel - check-task: dependencyGuard --no-parallel - -# moduleCheck: -# runs-on: ubuntu-latest -# needs: build-all -# steps: -# - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 -# - name: Create GitHub App Token -# uses: actions/create-github-app-token@136412a57a7081aa63c935a2cc2918f76c34f514 # v1 -# id: app-token -# with: -# app-id: ${{ secrets.PR_BOT_APP_ID }} -# private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} -# -# - name: moduleCheck -# uses: rickbusarow/actions/gradle-task-with-commit@bf0940965387f10bcb8b6699a79499d18167dfbe # v1 -# with: -# personal-access-token: ${{ steps.app-token.outputs.token }} -# fix-task: moduleCheckAuto -# check-task: moduleCheck - - doks: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Create GitHub App Token - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 - id: app-token - with: - app-id: ${{ secrets.PR_BOT_APP_ID }} - private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} - - - name: doks - uses: rickbusarow/actions/gradle-task-with-commit@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - personal-access-token: ${{ steps.app-token.outputs.token }} - fix-task: doks - check-task: doksCheck - - website-versioning: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Create GitHub App Token - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 - id: app-token - with: - app-id: ${{ secrets.PR_BOT_APP_ID }} - private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} - - - name: website versioning - uses: rickbusarow/actions/gradle-task-with-commit@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - personal-access-token: ${{ steps.app-token.outputs.token }} - fix-task: updateWebsiteNextDocsVersionRefs updateWebsitePackageJsonVersion updateWebsiteChangelog - check-task: checkWebsiteNextDocsVersionRefs checkWebsitePackageJsonVersion - - artifacts-check: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: Create GitHub App Token - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 - id: app-token - with: - app-id: ${{ secrets.PR_BOT_APP_ID }} - private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} - - - name: artifacts-check - uses: rickbusarow/actions/gradle-task-with-commit@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - personal-access-token: ${{ steps.app-token.outputs.token }} - fix-task: artifactsDump - check-task: artifactsCheck - - check-version-is-snapshot: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: check version is snapshot - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: checkVersionIsSnapshot - - detekt: - runs-on: ubuntu-latest - needs: build-all - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: detektAll - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: detektAll - restore-cache-key: main-build-artifacts - - - name: merge detekt SARIF reports - run: ./gradlew detektReportMerge - - - name: Upload SARIF to Github using the upload-sarif action - uses: github/codeql-action/upload-sarif@181d5eefc20863364f96762470ba6f862bdef56b # v3 - if: success() || failure() - with: - sarif_file: build/reports/detekt/merged.sarif - - build-website: - runs-on: ubuntu-latest - needs: build-all - steps: - - name: check out - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: dokkaGenerate - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: dokkaGenerate - restore-cache-key: main-build-artifacts - write-cache-key: dokka-build-artifacts - - - name: website build cache - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4 - with: - path: | - website/.docusaurus - website/build - website/node_modules - key: website-build - enableCrossOsArchive: true - - - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4 - with: - version: 8 - - # Node is required for pnpm - - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 - with: - node-version: 18 - cache: pnpm - cache-dependency-path: website/pnpm-lock.yaml - - - name: Install Pnpm - working-directory: website - run: pnpm install --no-lockfile - - - name: build website - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: buildSite - write-cache-key: website-build - - - name: knit check - run: ./gradlew knitCheck - - unit-tests: - needs: build-all - strategy: - fail-fast: false - matrix: - runner: [ ubuntu, windows ] - ### - shardNum: [ 1, 2, 3, 4 ] - ### - runs-on: ${{ matrix.runner }}-latest - steps: - - name: check out - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: unit tests - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: testShard${{ matrix.shardNum }} - restore-cache-key: main-build-artifacts - - - name: Archive test results - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - if: failure() - with: - name: test-results - path: ${{ github.workspace }}/**/build/reports/tests/ - - - name: Unit test results - uses: mikepenz/action-junit-report@3585e9575db828022551b4231f165eb59a0e74e3 # v5 - if: failure() - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - report_paths: '**/build/**/TEST-*.xml' - check_name: Unit Test Results - ${{runner.os}} - - integration-tests-ubuntu: - needs: build-all - strategy: - fail-fast: false - ### - matrix: - kotlin-version: [ 2.0.21 ] - gradle-version: [ 8.6, 8.11.1, 8.14 ] - agp-version: [ 8.4.0, 8.10.0 ] - anvil-version: [ 2.5.0, 2.5.1 ] - exclude: - - kotlin-version: 2.0.21 - anvil-version: 2.5.0 - - gradle-version: 8.6 - agp-version: 8.10.0 - ### - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: integration-tests - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: integrationTest -Pmodulecheck.gradleVersion=${{ matrix.gradle-version }} -Pmodulecheck.agpVersion=${{ matrix.agp-version }} -Pmodulecheck.kotlinVersion=${{ matrix.kotlin-version }} -Pmodulecheck.anvilVersion=${{ matrix.anvil-version }} -Pmodulecheck.exhaustive=false - restore-cache-key: main-build-artifacts - - - name: Unit test results - uses: mikepenz/action-junit-report@3585e9575db828022551b4231f165eb59a0e74e3 # v5 - if: failure() - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - report_paths: '**/build/**/TEST-*.xml' - check_name: Integration Test Results - - integration-tests-windows: - needs: build-all - strategy: - fail-fast: false - matrix: - ### - shardNum: [ 1, 2, 3, 4, 5, 6 ] - ### - runs-on: windows-latest - steps: - - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - name: integration-tests-windows - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: integrationTestShard${{ matrix.shardNum }} -Pmodulecheck.exhaustive=false - restore-cache-key: main-build-artifacts - - - name: Archive integration test results - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 - if: failure() - with: - name: integration-test-results-windows - path: ${{ github.workspace }}/**/build/reports/tests/ - - - name: Integration test results - uses: mikepenz/action-junit-report@3585e9575db828022551b4231f165eb59a0e74e3 # v5 - if: failure() - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - report_paths: '**/build/**/TEST-*.xml' - check_name: Integration Test Results - Windows - - all-checks: - if: always() - runs-on: ubuntu-latest - needs: - - artifacts-check - - build-website - - check-version-is-snapshot - - ci-matrices - - dependency-guard - - detekt - - doks - - integration-tests-ubuntu - - integration-tests-windows - - ktlint -# - moduleCheck - - unit-tests - - validate-wrapper - - website-versioning - steps: - - name: require that all other jobs have passed - uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe # v1.2.2 - with: - jobs: ${{ toJSON(needs) }} diff --git a/.github/workflows/delete-pr-branch-caches.yml b/.github/workflows/delete-pr-branch-caches.yml deleted file mode 100644 index 1ec166550b..0000000000 --- a/.github/workflows/delete-pr-branch-caches.yml +++ /dev/null @@ -1,18 +0,0 @@ -name: Delete Unused Caches - -on: - pull_request: - types: [ closed ] - -jobs: - - # This deletes the caches created by the branch while it was in PR. - # Those caches are inaccessible to it once it's merged, so they can be deleted. - delete-orphaned-caches: - runs-on: ubuntu-latest - steps: - - uses: snnaplab/delete-branch-cache-action@v1 - with: - # Specify explicitly because the ref at the time of merging - # will be a branch name such as 'main', 'develop' - ref: refs/pull/${{ github.event.number }}/merge diff --git a/.github/workflows/main-updated.yml b/.github/workflows/main-updated.yml deleted file mode 100644 index 8172caf74f..0000000000 --- a/.github/workflows/main-updated.yml +++ /dev/null @@ -1,96 +0,0 @@ -name: main-updated - -on: - workflow_dispatch: - push: - branches: [ main ] - -jobs: - - build-all: - runs-on: macos-latest - if: github.repository == 'rickbusarow/ModuleCheck' - steps: - - name: check out - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: main build - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: jar compileKotlin - restore-cache-key: build-logic-jar - write-cache-key: main-build-artifacts - - publish-snapshot: - needs: - - build-all - runs-on: macos-latest - - steps: - - name: check out - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: Publish Snapshots - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: publish - write-cache-key: local-m2 - env: - ORG_GRADLE_PROJECT_mavenCentralUsername: ${{ secrets.SONATYPE_NEXUS_USERNAME }} - ORG_GRADLE_PROJECT_mavenCentralPassword: ${{ secrets.SONATYPE_NEXUS_PASSWORD }} - - publish-website: - needs: - - build-all - runs-on: macos-latest - steps: - - name: check out - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: dokkaGenerate - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: dokkaGenerate - restore-cache-key: main-build-artifacts - write-cache-key: dokka-build-artifacts - - - name: website build cache - uses: actions/cache@5a3ec84eff668545956fd18022155c47e93e2684 # v4 - with: - path: | - website/.docusaurus - website/build - website/node_modules - key: website-build - enableCrossOsArchive: true - - - uses: pnpm/action-setup@a7487c7e89a18df4991f7f222e4898a00d66ddda # v4 - with: - version: 8 - - # Node is required for pnpm - - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 - with: - node-version: 18 - cache: pnpm - cache-dependency-path: website/pnpm-lock.yaml - - - name: Install Pnpm - working-directory: website - run: pnpm install --no-lockfile - - - name: build website - uses: rickbusarow/actions/gradle-task@c602f8da97f00279c6e77d3f25cbedcbf24ef936 # v1 - with: - task: buildSite - write-cache-key: website-build - - - name: Deploy to GitHub Pages - if: success() - uses: crazy-max/ghaction-github-pages@df5cc2bfa78282ded844b354faee141f06b41865 # v4 - with: - target_branch: gh-pages - build_dir: website/build - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml deleted file mode 100644 index 08c289d311..0000000000 --- a/.github/workflows/renovate.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Renovate - -on: - schedule: - # every 2 hours - - cron: "0 */2 * * *" - workflow_dispatch: - issues: - label: - pull_request: - types: - # run when the little "click here to rebase" box is checked. - - synchronize - push: - branches: - - main - -concurrency: - group: renovate - cancel-in-progress: false - -jobs: - renovate: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 - - - name: Set up Node - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 - - - name: Create GitHub App Token - uses: actions/create-github-app-token@df432ceedc7162793a195dd1713ff69aefc7379e # v2 - id: app-token - with: - app-id: ${{ secrets.PR_BOT_APP_ID }} - private-key: ${{ secrets.PR_BOT_PRIVATE_KEY }} - owner: rickbusarow - - - name: Renovate - uses: renovatebot/github-action@bdfd950c25796ebf1aa0c127ad55b69a14b04f69 # v43.0.3 - with: - configurationFile: .github/renovate-sh.json5 - token: ${{ steps.app-token.outputs.token }} - env: - LOG_LEVEL: debug diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 6ac397c8c6..0000000000 --- a/.gitignore +++ /dev/null @@ -1,71 +0,0 @@ -#built application files -*.apk -*.ap_ - -# files for the dex VM -*.dex - -# Java class files -*.class - -# generated files -bin/ -gen/ - -# Local configuration file (sdk path, etc) -local.properties - -# Windows thumbnail db -Thumbs.db - -# OSX files -.DS_Store - -# Eclipse project files -.classpath -.project - -## IDEA/Android Studio ignores -*.iml -*.ipr -*.iws -/.idea/* -*/.gradle/* - -# IDEA/Android Studio Ignore exceptions -!/.idea/codeStyleSettings.xml -!/.idea/codeStyles/ -!/.idea/copyright/ -!/.idea/detekt.xml -!/.idea/fileTemplates/ -!/.idea/icon.png -!/.idea/inspectionProfiles/ -!/.idea/ktlint-plugin.xml -!/.idea/scopes/ - -/gradle/profiler/gradle-user-home/ -!/gradle/profiler/bin/ - -#NDK -obj/ -/.gradle/ - -/.idea/vcs.xml -captures/ -java_pid1690.hprof - -# all build dirs at any level -**/build - -**/*.hprof - -# copy of API docs for website. Save the /styles dir before the CSS is slightly customized -/website/static/api -!/website/static/api/styles - -# auto-generated from the root .editorconfig in order to add extra disabled rules -build-logic/.editorconfig - -**/node_modules/ - -.kotlin/ diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 4fa3a98c19..0000000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/codeStyles/codeStyleConfig.xml b/.idea/codeStyles/codeStyleConfig.xml deleted file mode 100644 index 79ee123c2b..0000000000 --- a/.idea/codeStyles/codeStyleConfig.xml +++ /dev/null @@ -1,5 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/copyright/Apache.xml b/.idea/copyright/Apache.xml deleted file mode 100644 index 9c1560fa56..0000000000 --- a/.idea/copyright/Apache.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index bee28e3599..0000000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/.idea/detekt.xml b/.idea/detekt.xml deleted file mode 100644 index 1d6eca46cb..0000000000 --- a/.idea/detekt.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - detekt/detekt-config.yml - detekt/detekt-baseline.xml - - \ No newline at end of file diff --git a/.idea/icon.png b/.idea/icon.png deleted file mode 100644 index af57147fff..0000000000 Binary files a/.idea/icon.png and /dev/null differ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index 21f8fde845..0000000000 --- a/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - diff --git a/.idea/ktlint-plugin.xml b/.idea/ktlint-plugin.xml deleted file mode 100644 index e8bd90cf2d..0000000000 --- a/.idea/ktlint-plugin.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - DISTRACT_FREE - DEFAULT - - \ No newline at end of file diff --git a/.kodiak.toml b/.kodiak.toml deleted file mode 100644 index 2cfe56d337..0000000000 --- a/.kodiak.toml +++ /dev/null @@ -1,47 +0,0 @@ -# Configuration for Kodiak's auto-merge tool -# see full options: https://kodiakhq.com/docs/config-reference - -version = 1 # this is required but 1 is currently the only option - -[update] -always = false # default: false -require_automerge_label = true # default: true -automerge_label = "automerge" # default: automerge -# if using `update.always`, add dependabot to `update.ignore_usernames` to allow -# dependabot to update and close stale dependency upgrades. -# ignored_usernames = ["dependabot"] - -[merge] -# if a PR is ready, merge it, don't place it in the merge queue. -prioritize_ready_to_merge = true # default: false -# will not do anything if a matching label is applied -blocking_labels = ["DO NOT MERGE"] -method = "rebase" - -[merge.automerge_dependencies] -# auto merge all PRs opened by "dependabot" that are "minor" or "patch" version upgrades. "major" version upgrades will be ignored. -versions = ["minor", "patch"] -usernames = ["dependabot"] - -[approve] -# note: remove the "[bot]" suffix from GitHub Bot usernames. -# Instead of "dependabot[bot]" use "dependabot". -auto_approve_usernames = ["RBusarow"] - -[merge.message] -# use title of PR for merge commit. -title = "pull_request_title" # default: "github_default" - -# use body of PR for merge commit. -body = "pull_request_body" # default: "github_default" - -# add the PR number to the merge commit title, like GitHub. -include_pr_number = true # default: true - -# use the default markdown content of the PR for the merge commit. -body_type = "markdown" # default: "markdown" - -# remove html comments to auto remove PR templates. -strip_html_comments = true # default: false - -include_pull_request_url = true # default: false diff --git a/.mergify.yml b/.mergify.yml deleted file mode 100644 index 6dffaf37a5..0000000000 --- a/.mergify.yml +++ /dev/null @@ -1,121 +0,0 @@ -shared: - author-bot: &author_bot - - or: - - author=rb-org-bot[bot] - - author=dependabot[bot] - - author=renovate[bot] - author-rbusarow: &author_rbusarow - - author=RBusarow - base-main: &base_main - - base=main - label-approved: &label_approved - - label=approved - label-automerge: &label_automerge - - label=automerge - label-dnm: - - label=do-not-merge - not-label-dnm: ¬_label_dnm - - label!=do-not-merge - label-rebase: &label_rebase - - label=rebase - name-approved: &name_approved approved - name-automerge: &name_automerge automerge - name-rb-org-bot: &name_rb_org_bot rb-org-bot[bot] - name-merge-bot: &name_merge_bot rbusarow-bot - name-rebase: &name_rebase rebase - success-ci: &success_ci - - check-success=all-checks - -queue_rules: - - name: duplicated Queue PRs for rebase-merge when CI passes and approved from Re-queue - any PR with a 'requeue' label - queue_conditions: - - label=requeue - - and: *label_automerge - - and: *base_main - - and: *not_label_dnm - merge_conditions: [] - merge_method: fast-forward - update_method: rebase - autosquash: true - - name: Queue PRs for rebase-merge when CI passes and approved - queue_conditions: - - and: *label_automerge - - and: *base_main - - and: *not_label_dnm - merge_conditions: [] - merge_method: fast-forward - update_method: rebase - autosquash: true - merge_bot_account: *name_merge_bot - update_bot_account: *name_merge_bot - -pull_request_rules: - - name: Remove automerge label once merged - conditions: - - merged - - and: *label_automerge - actions: - label: - remove: - - *name_automerge - - - name: Auto-approve RBusarow PRs - conditions: - - and: *success_ci - - and: *author_rbusarow - actions: - review: - type: APPROVE - message: Automatically approving RBusarow pull request - - - name: Auto-approve bot PRs - conditions: - - and: *success_ci - - or: *author_bot - actions: - review: - type: APPROVE - message: Automatically approving bot pull request - - - name: Auto-approve any PR with an 'approved' label - conditions: - - and: *success_ci - - and: *label_approved - actions: - rebase: - autosquash: true - bot_account: *name_merge_bot - label: - remove: - - *name_approved - - - name: Rebase any PR with a 'rebase' label - conditions: - - and: *label_rebase - actions: - rebase: - autosquash: true - bot_account: *name_merge_bot - label: - remove: - - *name_rebase - - - name: Re-queue any PR with a 'requeue' label - conditions: - - label=requeue - actions: - label: - remove: - - requeue - - name: Queue PRs for rebase-merge when CI passes and approved + Re-queue any PR with - a 'requeue' label - conditions: [] - actions: - queue: -priority_rules: - - name: priority for queue `duplicated Queue PRs for rebase-merge when CI passes and - approved from Re-queue any PR with a 'requeue' label` - conditions: - - label=requeue - priority: 2250 diff --git a/website/static/.nojekyll b/.nojekyll similarity index 100% rename from website/static/.nojekyll rename to .nojekyll diff --git a/404.html b/404.html new file mode 100644 index 0000000000..baadb06a6a --- /dev/null +++ b/404.html @@ -0,0 +1,16 @@ + + + + + +Page Not Found | ModuleCheck + + + + + + + +

Page Not Found

We could not find what you were looking for.

Please contact the owner of the site that linked you to the original URL and let them know their link is broken.

+ + \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index 6adb6962a2..0000000000 --- a/CHANGELOG.md +++ /dev/null @@ -1,419 +0,0 @@ -# 0.12.5 - -This is a re-release of [0.12.4](#0124). - -### 🐛 Bug Fixes - -* don't crash if Anvil isn't in the buildScript classpath by @RBusarow - in https://github.com/RBusarow/ModuleCheck/pull/944 -* ignore suppress/noinspection names which don't fit the FindingName pattern by @RBusarow - in https://github.com/RBusarow/ModuleCheck/pull/945 - -### Other Changes - -* GitHub release notes config by @RBusarow in https://github.com/RBusarow/ModuleCheck/pull/946 - -**Full Changelog**: https://github.com/RBusarow/ModuleCheck/compare/0.12.3...0.12.5 - -# 0.12.4 - -This version was published with stale artifacts. Use 0.12.5 instead. - -# 0.12.3 - -### 🐛 Bug Fixes - -- fix suppressing findings within the AGP - DSL ([#712](https://github.com/rbusarow/ModuleCheck/pull/712)) -- parse the declarations of named companion objects and their - members ([#706](https://github.com/rbusarow/ModuleCheck/pull/706)) -- treat annotation processor dependencies the same as runtime dependencies for `McProject.uses()` - and overshot behavior ([#701](https://github.com/rbusarow/ModuleCheck/pull/701)) -- fix false positive for 'unused-dependency' when consuming `debug` source - from `testImplementation` [@tasomaniac](https://github.com/tasomaniac) ([#685](https://github.com/rbusarow/ModuleCheck/pull/685)) -- revert Kotlin to 1.6.10 to fix build issues in targets using - 1.6.10 ([#683](https://github.com/rbusarow/ModuleCheck/pull/683)) - -### 🧰 Maintenance - -- Update dependency com.vanniktech:gradle-maven-publish-plugin to - v0.20.0 ([#707](https://github.com/rbusarow/ModuleCheck/pull/707)) -- Update dependency com.autonomousapps.dependency-analysis to - v1.4.0 ([#698](https://github.com/rbusarow/ModuleCheck/pull/698)) -- Update dependency com.osacky.doctor to - v0.8.1 ([#699](https://github.com/rbusarow/ModuleCheck/pull/699)) -- Update docusaurus monorepo to - v2.0.0-beta.21 ([#691](https://github.com/rbusarow/ModuleCheck/pull/691)) -- Update kotlinx-coroutines to v1.6.2 ([#695](https://github.com/rbusarow/ModuleCheck/pull/695)) -- Update dependency com.autonomousapps.dependency-analysis to - v1.3.0 ([#696](https://github.com/rbusarow/ModuleCheck/pull/696)) -- Update dependency com.github.ben-manes.caffeine:caffeine to - v3.1.1 ([#694](https://github.com/rbusarow/ModuleCheck/pull/694)) -- remove CI's `tests-windows` need - for `publish-maven-local` [@RBusarow](https://github.com/RBusarow) ([#693](https://github.com/rbusarow/ModuleCheck/pull/693)) -- use Caffeine for caching, with `LazyDeferred` - loaders [@RBusarow](https://github.com/RBusarow) ([#692](https://github.com/rbusarow/ModuleCheck/pull/692)) -- Update dropbox-dependencyGuard to - v0.3.0 ([#690](https://github.com/rbusarow/ModuleCheck/pull/690)) -- don't sign `-SNAPSHOT` - builds [@RBusarow](https://github.com/RBusarow) ([#686](https://github.com/rbusarow/ModuleCheck/pull/686)) -- disable KtLint's broken `experimental:type-parameter-list-spacing` - rule [@RBusarow](https://github.com/RBusarow) ([#681](https://github.com/rbusarow/ModuleCheck/pull/681)) -- Update crazy-max/ghaction-github-pages action to - v3 ([#679](https://github.com/rbusarow/ModuleCheck/pull/679)) -- update changelog for `0.12.2` - release [@RBusarow](https://github.com/RBusarow) ([#680](https://github.com/rbusarow/ModuleCheck/pull/680)) -- Update dependency com.rickbusarow.module-check to - v0.12.2 ([#678](https://github.com/rbusarow/ModuleCheck/pull/678)) - -### Contributors - -[@RBusarow](https://github.com/RBusarow) and [@tasomaniac](https://github.com/tasomaniac) - -# 0.12.2 - -### 🐛 Bug Fixes - -- false positives for unused kapt processors which are defined in - additionalKaptMatchers ([8c55fd1](https://github.com/RBusarow/ModuleCheck/commit/8c55fd188f15c826ba4b6b28d293f68f49bafcb9)) - -# 0.12.1 - -### 🗑 Deprecations - -- The names of all findings have been updated/standardized. Any declarations which were suppressing - a finding with the old ID (via `@Suppress("someFinding")` or `//suppress=someFinding`) will still - work, but they should be updated to use the new names. - See [the migrations guide](https://rbusarow.github.io/ModuleCheck/migrations#standardized-finding-names) -- The method for defining `additionalKaptMatchers` in the Gradle DSL has been deprecated, replaced - with the `additionalCodeGenerators` property and `CodeGeneratorBinding`. - See [the migrations guide](https://rbusarow.github.io/ModuleCheck/migrations#code-generator-binding) - -### 💥 Breaking Changes - -- The base `:moduleCheck` task will now automatically hook into the root project's `:check` task, if - one - exists. [@RBusarow](https://github.com/RBusarow) ([#611](https://github.com/rbusarow/ModuleCheck/pull/611)) - -### 🚀 Features - -- Added support - for [Static Analysis Results Interchange Format (SARIF)](https://sarifweb.azurewebsites.net) - report - output [@RBusarow](https://github.com/RBusarow) ([#566](https://github.com/rbusarow/ModuleCheck/pull/566)) - -### 🐛 Bug Fixes - -- don't find `must-be-api` if the project is already an api dependency - also [@RBusarow](https://github.com/RBusarow) ([#666](https://github.com/rbusarow/ModuleCheck/pull/666)) -- remove AGP and KGP from the plugin's runtime - classpath ([079ab9d](https://github.com/RBusarow/ModuleCheck/commit/079ab9d709add63dbf44ecbd8a534bf279becd47)) -- fix matching to custom - kaptMatchers [@RBusarow](https://github.com/RBusarow) ([#658](https://github.com/rbusarow/ModuleCheck/pull/658)) -- properly use settings to determine which kinds of depth output to - create [@RBusarow](https://github.com/RBusarow) ([#647](https://github.com/rbusarow/ModuleCheck/pull/647)) -- fix relative paths for custom graph report - directory [@RBusarow](https://github.com/RBusarow) ([#612](https://github.com/rbusarow/ModuleCheck/pull/612)) -- use type-safe accessor "path" when adding a dependency with type-safe - syntax [@RBusarow](https://github.com/RBusarow) ([#608](https://github.com/rbusarow/ModuleCheck/pull/608)) -- evaluate suppress/noinspection annotations - eagerly [@RBusarow](https://github.com/RBusarow) ([#604](https://github.com/rbusarow/ModuleCheck/pull/604)) -- fixes false negative for unused kapt plugin when there are no - processors [@RBusarow](https://github.com/RBusarow) ([#603](https://github.com/rbusarow/ModuleCheck/pull/603)) -- fix Dagger NoSuchMethodError for `dagger.internal.Preconditions.checkNotNullFromProvides` in - SNAPSHOT [@RBusarow](https://github.com/RBusarow) ([#570](https://github.com/rbusarow/ModuleCheck/pull/570)) - -### 🧰 Maintenance - -- add a discrete job in CI for publishing to mavenLocal, then cache - it [@RBusarow](https://github.com/RBusarow) ([#668](https://github.com/rbusarow/ModuleCheck/pull/668)) -- update the build classpath baseline for the snapshot build's new - runt… [@RBusarow](https://github.com/RBusarow) ([#664](https://github.com/rbusarow/ModuleCheck/pull/664)) -- use the current SNAPSHOT for plugin - dogfooding [@RBusarow](https://github.com/RBusarow) ([#663](https://github.com/rbusarow/ModuleCheck/pull/663)) -- migrate TestKit tests away from the Specs - DSLs [@RBusarow](https://github.com/RBusarow) ([#660](https://github.com/rbusarow/ModuleCheck/pull/660)) -- hook dependencyGuard into the `check` - task [@RBusarow](https://github.com/RBusarow) ([#661](https://github.com/rbusarow/ModuleCheck/pull/661)) -- give Dokka explicit dependency upon KtLint tasks and more broadly - dis… [@RBusarow](https://github.com/RBusarow) ([#659](https://github.com/rbusarow/ModuleCheck/pull/659)) -- Update dropbox-dependencyGuard to - v0.2.0 [@renovate](https://github.com/renovate) ([#657](https://github.com/rbusarow/ModuleCheck/pull/657)) -- require comments for public APIs in Detekt, and add - baselines [@RBusarow](https://github.com/RBusarow) ([#656](https://github.com/rbusarow/ModuleCheck/pull/656)) -- add dependency-guard and - baselines [@RBusarow](https://github.com/RBusarow) ([#654](https://github.com/rbusarow/ModuleCheck/pull/654)) -- Update dependency prism-react-renderer to - v1.3.3 [@renovate](https://github.com/renovate) ([#653](https://github.com/rbusarow/ModuleCheck/pull/653)) -- Update dependency com.android.tools.build:gradle to - v7.2.0 [@renovate](https://github.com/renovate) ([#620](https://github.com/rbusarow/ModuleCheck/pull/620)) -- Update actions/setup-java action to - v3 [@renovate](https://github.com/renovate) ([#652](https://github.com/rbusarow/ModuleCheck/pull/652)) -- Update dependency com.autonomousapps.dependency-analysis to - v1.2.1 [@renovate](https://github.com/renovate) ([#651](https://github.com/rbusarow/ModuleCheck/pull/651)) -- Update actions/upload-artifact action to - v3 [@renovate](https://github.com/renovate) ([#629](https://github.com/rbusarow/ModuleCheck/pull/629)) -- Update dependency com.gradleup.auto.manifest to - v2 [@renovate](https://github.com/renovate) ([#645](https://github.com/rbusarow/ModuleCheck/pull/645)) -- Update react monorepo to v18 ( - major) [@renovate](https://github.com/renovate) ([#646](https://github.com/rbusarow/ModuleCheck/pull/646)) -- remove github actions - caching [@RBusarow](https://github.com/RBusarow) ([#649](https://github.com/rbusarow/ModuleCheck/pull/649)) -- remove - dependabot [@RBusarow](https://github.com/RBusarow) ([#648](https://github.com/rbusarow/ModuleCheck/pull/648)) -- create a shared `.gradle` cache for TestKit - tests [@RBusarow](https://github.com/RBusarow) ([#640](https://github.com/rbusarow/ModuleCheck/pull/640)) -- add the `artifacts-check` convention - plugin [@RBusarow](https://github.com/RBusarow) ([#615](https://github.com/rbusarow/ModuleCheck/pull/615)) -- fix incorrect/duplicate maven artifact - ids [@RBusarow](https://github.com/RBusarow) ([#614](https://github.com/rbusarow/ModuleCheck/pull/614)) -- revert KaptMatcher name - to `modulecheck.api.KaptMatcher` [@RBusarow](https://github.com/RBusarow) ([#613](https://github.com/rbusarow/ModuleCheck/pull/613)) -- - -delete `ConfiguredModule` [@RBusarow](https://github.com/RBusarow) ([#609](https://github.com/rbusarow/ModuleCheck/pull/609)) - -- disable the "use tab character" option in IDE - codestyle [@RBusarow](https://github.com/RBusarow) ([#607](https://github.com/rbusarow/ModuleCheck/pull/607)) -- replace `java-test-fixtures` usages with `-testing` - modules [@RBusarow](https://github.com/RBusarow) ([#605](https://github.com/rbusarow/ModuleCheck/pull/605)) -- Bump mermaid from 8.14.0 to 9.1.1 in - /website [@dependabot](https://github.com/dependabot) ([#601](https://github.com/rbusarow/ModuleCheck/pull/601)) -- Dependency block to dependencies - block [@RBusarow](https://github.com/RBusarow) ([#600](https://github.com/rbusarow/ModuleCheck/pull/600)) -- split - up `:modulecheck-parsing:gradle` [@RBusarow](https://github.com/RBusarow) ([#599](https://github.com/rbusarow/ModuleCheck/pull/599)) -- Bump dagger from 2.41 to - 2.42 [@dependabot](https://github.com/dependabot) ([#597](https://github.com/rbusarow/ModuleCheck/pull/597)) -- rename `modulecheck.reporting.logging.Logger` - to `McLogger` [@RBusarow](https://github.com/RBusarow) ([#593](https://github.com/rbusarow/ModuleCheck/pull/593)) -- pull `Finding` apis out of `:modulecheck-rules:api` and into their - ow… [@RBusarow](https://github.com/RBusarow) ([#591](https://github.com/rbusarow/ModuleCheck/pull/591)) -- Fix execution optimization for KtLint - in `:modulecheck-plugin` [@RBusarow](https://github.com/RBusarow) ([#590](https://github.com/rbusarow/ModuleCheck/pull/590)) -- use the stable version of the plugin in - CI [@RBusarow](https://github.com/RBusarow) ([#589](https://github.com/rbusarow/ModuleCheck/pull/589)) -- suppress Detekt's ComplexMethod for single `when` - statements [@RBusarow](https://github.com/RBusarow) ([#584](https://github.com/rbusarow/ModuleCheck/pull/584)) -- pull rules and configs into their own - modules [@RBusarow](https://github.com/RBusarow) ([#583](https://github.com/rbusarow/ModuleCheck/pull/583)) -- Bump kotest-assertions-core-jvm from 5.2.3 to - 5.3.0 [@dependabot](https://github.com/dependabot) ([#579](https://github.com/rbusarow/ModuleCheck/pull/579)) -- Bump turbine from 0.7.0 to - 0.8.0 [@dependabot](https://github.com/dependabot) ([#580](https://github.com/rbusarow/ModuleCheck/pull/580)) -- fix `BasePluginTest`'s unused `stacktrace` - parameter [@RBusarow](https://github.com/RBusarow) ([#578](https://github.com/rbusarow/ModuleCheck/pull/578)) -- add Detekt's SARIF reports to - CI [@RBusarow](https://github.com/RBusarow) ([#568](https://github.com/rbusarow/ModuleCheck/pull/568)) -- standardize hermit's definition - in `libs.versions.toml` [@RBusarow](https://github.com/RBusarow) ([#567](https://github.com/rbusarow/ModuleCheck/pull/567)) -- move `File.createSafely()` to production - code [@RBusarow](https://github.com/RBusarow) ([#565](https://github.com/rbusarow/ModuleCheck/pull/565)) -- Bump dokka-gradle-plugin from 1.6.20 to - 1.6.21 [@dependabot](https://github.com/dependabot) ([#563](https://github.com/rbusarow/ModuleCheck/pull/563)) -- Bump async from 2.6.3 to 2.6.4 in - /website [@dependabot](https://github.com/dependabot) ([#543](https://github.com/rbusarow/ModuleCheck/pull/543)) -- Bump kotlin-reflect from 1.6.20 to - 1.6.21 [@dependabot](https://github.com/dependabot) ([#553](https://github.com/rbusarow/ModuleCheck/pull/553)) -- Bump mermaid from 8.13.8 to 8.14.0 in - /website [@dependabot](https://github.com/dependabot) ([#545](https://github.com/rbusarow/ModuleCheck/pull/545)) -- Bump dokka-gradle-plugin from 1.6.10 to - 1.6.20 [@dependabot](https://github.com/dependabot) ([#544](https://github.com/rbusarow/ModuleCheck/pull/544)) -- Bump @mdx-js/react from 1.6.22 to 2.1.1 in - /website [@dependabot](https://github.com/dependabot) ([#546](https://github.com/rbusarow/ModuleCheck/pull/546)) -- Bump antlr4 from 4.10 to - 4.10.1 [@dependabot](https://github.com/dependabot) ([#550](https://github.com/rbusarow/ModuleCheck/pull/550)) - -### ℹ️ Website - -- remove the `google()` repository requirement from - docs [@RBusarow](https://github.com/RBusarow) ([#667](https://github.com/rbusarow/ModuleCheck/pull/667)) -- 594 hook into root project check - task [@RBusarow](https://github.com/RBusarow) ([#611](https://github.com/rbusarow/ModuleCheck/pull/611)) -- replace `KaptMatcher` - with `CodeGeneratorBinding` [@RBusarow](https://github.com/RBusarow) ([#610](https://github.com/rbusarow/ModuleCheck/pull/610)) -- update Docusaurus to - 2.0.0-beta.20 [@RBusarow](https://github.com/RBusarow) ([#592](https://github.com/rbusarow/ModuleCheck/pull/592)) -- add support for sarif - reporting [@RBusarow](https://github.com/RBusarow) ([#566](https://github.com/rbusarow/ModuleCheck/pull/566)) -- strict rule/finding name - conventions [@RBusarow](https://github.com/RBusarow) ([#564](https://github.com/rbusarow/ModuleCheck/pull/564)) -- add `google()` repository to config - docs [@RBusarow](https://github.com/RBusarow) ([#559](https://github.com/rbusarow/ModuleCheck/pull/559)) -- add missing docs for - rules [@RBusarow](https://github.com/RBusarow) ([#555](https://github.com/rbusarow/ModuleCheck/pull/555)) -- fix - publishing [@RBusarow](https://github.com/RBusarow) ([#548](https://github.com/rbusarow/ModuleCheck/pull/548)) -- release - 0.12.0 [@RBusarow](https://github.com/RBusarow) ([#547](https://github.com/rbusarow/ModuleCheck/pull/547)) - -### Contributors - -@RBusarow - -# 0.12.0 - -### 💥 Breaking Changes - -- The `autoCorrect` property in the Gradle settings DSL has been removed. Instead, to perform a - check with auto-correct, add the `Auto` suffix to the task name. - ```bash - # perform all checks and fail if errors are found - ./gradlew moduleCheck - - # perform all checks and auto-correct if possible - ./gradlew moduleCheckAuto - ``` -- Tasks are no longer generated for most individual rules. Instead, rules should be toggled via - the [Gradle DSL](https://rbusarow.github.io/ModuleCheck/docs/next/configuration) and can be - invoked - through `./gradlew modulecheck` or `./gradlew moduleCheckAuto`. - -### 📐 New Rules - -- Add the [Depths](https://rbusarow.github.io/ModuleCheck/docs/rules/project_depth) - rule [@RBusarow](https://github.com/RBusarow) ([#278](https://github.com/rbusarow/ModuleCheck/pull/278)) -- New - rule: [Unused Android Extensions](https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kotlin_android_extensions) [@tasomaniac](https://github.com/tasomaniac) ([#440](https://github.com/rbusarow/ModuleCheck/pull/440)) - -### 🚀 Features - -- Add support for depths, dotviz dependency graph, checkstyle, and plaintext result - reporting [@RBusarow](https://github.com/RBusarow) ([#243](https://github.com/rbusarow/ModuleCheck/pull/243)) - -### 🐛 Bug Fixes - -- Add a test case for false - positive [@tasomaniac](https://github.com/tasomaniac) ([#419](https://github.com/rbusarow/ModuleCheck/pull/419)) -- Don't call a dependency overshot if it's already declared in that source - set [@RBusarow](https://github.com/RBusarow) ([#521](https://github.com/rbusarow/ModuleCheck/pull/521)) -- don't try to parse `.png`s as - xml [@RBusarow](https://github.com/RBusarow) ([#522](https://github.com/rbusarow/ModuleCheck/pull/522)) -- fix parsing xml resource declarations when there's a dot in the - name [@RBusarow](https://github.com/RBusarow) ([#512](https://github.com/rbusarow/ModuleCheck/pull/512)) -- Fix false positive for `unusedDependency` when a resource from the dependency is used with R from - the dependent in a downstream - project [@RBusarow](https://github.com/RBusarow) ([#510](https://github.com/rbusarow/ModuleCheck/pull/510)) -- better modeling for generated databinding declarations and - references [@RBusarow](https://github.com/RBusarow) ([#509](https://github.com/rbusarow/ModuleCheck/pull/509)) -- count layout files and `@+id/__` declarations as part of a module's - declarations [@RBusarow](https://github.com/RBusarow) ([#499](https://github.com/rbusarow/ModuleCheck/pull/499)) -- Support the alternative usage of kapt - plugin [@tasomaniac](https://github.com/tasomaniac) ([#481](https://github.com/rbusarow/ModuleCheck/pull/481)) -- add new dependency declarations even if their transitive source can't be - found [@RBusarow](https://github.com/RBusarow) ([#469](https://github.com/rbusarow/ModuleCheck/pull/469)) -- don't generate BuildConfig if it's ignored in Android - settings [@RBusarow](https://github.com/RBusarow) ([#470](https://github.com/rbusarow/ModuleCheck/pull/470)) -- force single-threaded GroovyLangParser - access [@RBusarow](https://github.com/RBusarow) ([#463](https://github.com/rbusarow/ModuleCheck/pull/463)) -- fix false positive for `disableViewBinding` when used in debug source set of different - module [@RBusarow](https://github.com/RBusarow) ([#446](https://github.com/rbusarow/ModuleCheck/pull/446)) -- don't swallow a newline when replacing a dependency with a preceding blank - line [@RBusarow](https://github.com/RBusarow) ([#444](https://github.com/rbusarow/ModuleCheck/pull/444)) -- better handling for detecting complex precompiled configuration - names [@RBusarow](https://github.com/RBusarow) ([#442](https://github.com/rbusarow/ModuleCheck/pull/442)) -- support multiple android base - packages [@RBusarow](https://github.com/RBusarow) ([#411](https://github.com/rbusarow/ModuleCheck/pull/411)) -- support `.java` files without a package - declaration [@RBusarow](https://github.com/RBusarow) ([#400](https://github.com/rbusarow/ModuleCheck/pull/400)) -- strip illegal characters from XML before - parsing [@RBusarow](https://github.com/RBusarow) ([#376](https://github.com/rbusarow/ModuleCheck/pull/376)) -- fix auto-correct when using a non-standard config - name [@RBusarow](https://github.com/RBusarow) ([#368](https://github.com/rbusarow/ModuleCheck/pull/368)) -- fix false positive for kapt processors in non-kapt - configurations [@RBusarow](https://github.com/RBusarow) ([#350](https://github.com/rbusarow/ModuleCheck/pull/350)) -- don't allow projects to inherit - themselves [@RBusarow](https://github.com/RBusarow) ([#343](https://github.com/rbusarow/ModuleCheck/pull/343)) -- update configuration - docs [@RBusarow](https://github.com/RBusarow) ([#335](https://github.com/rbusarow/ModuleCheck/pull/335)) -- always create depth and graph reports when running their explicit - tasks [@RBusarow](https://github.com/RBusarow) ([#332](https://github.com/rbusarow/ModuleCheck/pull/332)) -- collect depth info after applying - changes [@RBusarow](https://github.com/RBusarow) ([#331](https://github.com/rbusarow/ModuleCheck/pull/331)) -- fix testFixtures handling in - OverShotDependencyFinding [@RBusarow](https://github.com/RBusarow) ([#297](https://github.com/rbusarow/ModuleCheck/pull/297)) -- treat testFixtures and the associated main sources like different - projects [@RBusarow](https://github.com/RBusarow) ([#288](https://github.com/rbusarow/ModuleCheck/pull/288)) -- correctly apply the `testFixtures(...)` wrapper for replaced/added - dependencies [@RBusarow](https://github.com/RBusarow) ([#287](https://github.com/rbusarow/ModuleCheck/pull/287)) - -### ℹ️ Website - -- Add documentation for new - rule [@tasomaniac](https://github.com/tasomaniac) ([#454](https://github.com/rbusarow/ModuleCheck/pull/454)) -- add snapshots badge to README and website - home [@RBusarow](https://github.com/RBusarow) ([#410](https://github.com/rbusarow/ModuleCheck/pull/410)) -- add `moduleCheckAuto` to main README and call out "next" docs - version [@RBusarow](https://github.com/RBusarow) ([#408](https://github.com/rbusarow/ModuleCheck/pull/408)) -- correct the tasks listed in the "next" version of the - docs [@RBusarow](https://github.com/RBusarow) ([#404](https://github.com/rbusarow/ModuleCheck/pull/404)) -- update copyright template for - 2022 [@RBusarow](https://github.com/RBusarow) ([#362](https://github.com/rbusarow/ModuleCheck/pull/362)) -- update configuration - docs [@RBusarow](https://github.com/RBusarow) ([#335](https://github.com/rbusarow/ModuleCheck/pull/335)) -- add the Depths - feature [@RBusarow](https://github.com/RBusarow) ([#278](https://github.com/rbusarow/ModuleCheck/pull/278)) -- replace `autoCorrect` with `-Auto` - suffixes [@RBusarow](https://github.com/RBusarow) ([#249](https://github.com/rbusarow/ModuleCheck/pull/249)) - -### Contributors - -@RBusarow, @diego-gomez-olvera and @tasomaniac - -# 0.11.3 - -### 🚀 Features - -- support suppressing findings ([#235](https://github.com/rbusarow/ModuleCheck/pull/235)) - -### 🐛 Bug Fixes - -- support testFixtures ([#232](https://github.com/rbusarow/ModuleCheck/pull/232)) - -### 🧰 Maintenance - -- Bump kotlinpoet from 1.10.1 to 1.10.2 ([#233](https://github.com/rbusarow/ModuleCheck/pull/233)) -- Bump gradle-plugin from 2.3.6 to 2.3.7 ([#229](https://github.com/rbusarow/ModuleCheck/pull/229)) - -### ℹ️ Website - -- use titles in docs code snippets ([#237](https://github.com/rbusarow/ModuleCheck/pull/237)) -- clarify CI workflow docs ([#221](https://github.com/rbusarow/ModuleCheck/pull/221)) -- add example CI workflow to docs ([#220](https://github.com/rbusarow/ModuleCheck/pull/220)) - -# 0.11.2 - -### 🐛 Bug Fixes - -- support overshot dependencies ([#217](https://github.com/rbusarow/ModuleCheck/pull/217)) -- sorting fixes ([#215](https://github.com/rbusarow/ModuleCheck/pull/215)) - -# 0.11.1 - -### 🐛 Bug Fixes - -- support constant or enum declarations in Java - classes ([#209](https://github.com/rbusarow/ModuleCheck/pull/209)) -- include generated data/viewbinding objects as - declarations ([#208](https://github.com/rbusarow/ModuleCheck/pull/208)) -- support closures in dependency - declarations ([#205](https://github.com/rbusarow/ModuleCheck/pull/205)) -- count resources as R references when used in - AndroidManifest.xml ([#203](https://github.com/rbusarow/ModuleCheck/pull/203)) - -# 0.11.0 - Groovy auto-correct support - -### 🐛 Bug Fixes - -- Support generated manifests ([#197](https://github.com/rbusarow/ModuleCheck/pull/197)) -- fix redundant "from: " output ([#193](https://github.com/rbusarow/ModuleCheck/pull/193)) -- support Groovy parsing ([#190](https://github.com/rbusarow/ModuleCheck/pull/190)) -- capture a finding's log string before it's - fixed ([#184](https://github.com/rbusarow/ModuleCheck/pull/184)) -- include class literal expressions when looking for type - references ([#177](https://github.com/rbusarow/ModuleCheck/pull/177)) -- check for Android kotlin sources ([#173](https://github.com/rbusarow/ModuleCheck/pull/173)) - -# 0.10.0 - -Initial release diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 261eeb9e9f..0000000000 --- a/LICENSE +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/README.md b/README.md deleted file mode 100644 index af1af70e81..0000000000 --- a/README.md +++ /dev/null @@ -1,70 +0,0 @@ -[![Maven Central](https://img.shields.io/maven-central/v/com.rickbusarow.modulecheck/modulecheck-api?style=flat-square)](https://search.maven.org/search?q=com.rickbusarow.modulecheck) -[![Gradle Plugin Portal](https://img.shields.io/gradle-plugin-portal/v/com.rickbusarow.module-check?style=flat-square)](https://plugins.gradle.org/plugin/com.rickbusarow.module-check) -[![Sonatype Nexus (Snapshots)](https://img.shields.io/nexus/s/com.rickbusarow.modulecheck/modulecheck-api?label=snapshots&server=https%3A%2F%2Foss.sonatype.org&style=flat-square)](https://oss.sonatype.org/#nexus-search;quick~com.rickbusarow.modulecheck) -[![License](https://img.shields.io/badge/license-apache2.0-blue?style=flat-square.svg)](https://opensource.org/licenses/Apache-2.0) - - -### This is a work in progress, in a very early state, and there are bugs. - -___ - -ModuleCheck identifies unused **internal** (sub-project) dependencies within a Gradle project. - -It does this **without performing a build**, which makes the parsing extremely fast. - -All inspection is done using Gradle build files, Java/Kotlin source, and `res` xml files for Kotlin. - -Documentation is at [https://rickbusarow.github.io/ModuleCheck](https://rbusarow.github.io/ModuleCheck/). - -For snapshots, use the "next" version for documentation: https://rickbusarow.github.io/ModuleCheck/docs/next/ - -![Diagram of flattening module structure](website/static/img/modulecheck_diagram.png) - -### Config -```kotlin -// settings.gradle.kts - -pluginManagement { - repositories { - gradlePluginPortal() - // Add for SNAPSHOT builds - maven("https://oss.sonatype.org/content/repositories/snapshots/") - } -} -``` - - -```kotlin -// top-level build.gradle.kts - -plugins { - id("com.rickbusarow.module-check") version "0.12.5" -} -``` - - -### Tasks - -all checks -```shell -./gradlew moduleCheck -``` -all checks with auto-correct -```shell -./gradlew moduleCheckAuto -``` - -## License - -``` text -Copyright (C) 2021-2023 Rick Busarow -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - https://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -``` diff --git a/artifacts.json b/artifacts.json deleted file mode 100644 index 1026ffc690..0000000000 --- a/artifacts.json +++ /dev/null @@ -1,458 +0,0 @@ -[ - { - "gradlePath": ":modulecheck-api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-core", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-core", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-dagger", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-dagger", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-config:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-config-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-config:fake", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-config-fake", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-config:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-config-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-finding:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-finding-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-finding:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-finding-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-finding:impl-android", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-finding-impl-android", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-finding:impl-sort", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-finding-impl-sort", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-finding:name", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-finding-name", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:android", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-core", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:groovy-antlr", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-groovy-antlr", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:java", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-java", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:psi", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-psi", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:wiring", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-wiring", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-project:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-project-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-project:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-project-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-project:testing", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-project-testing", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-project-generation:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-project-generation-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-reporting:checkstyle", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-reporting-checkstyle", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-reporting:console", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-reporting-console", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-reporting:graphviz", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-reporting-graphviz", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-reporting:sarif", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-reporting-sarif", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-rule:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-rule-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-rule:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-rule-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-rule:impl-factory", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-rule-impl-factory", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-rule:testing", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-rule-testing", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-runtime:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-runtime-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-runtime:testing", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-runtime-testing", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:cache", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-cache", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:lazy", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-lazy", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:stdlib", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-stdlib", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:trace", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-trace", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:trace-testing", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-trace-testing", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:traversal", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-traversal", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-gradle:platforms:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-gradle-platform-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-gradle:platforms:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-gradle-platform-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-gradle:platforms:internal-android", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-gradle-platform-internal-android", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-gradle:platforms:internal-jvm", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-gradle-platform-internal-jvm", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-model:dependency:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-model-dependency-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-model:dependency:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-model-dependency-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-model:sourceset:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-model-sourceset-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:kotlin-compiler:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-kotlin-compiler-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:kotlin-compiler:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-kotlin-compiler-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:source:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-source-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:source:testing", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-source-testing", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-reporting:logging:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-reporting-logging-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-reporting:logging:testing", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-reporting-logging-testing", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:coroutines:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-coroutines-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-utils:coroutines:impl", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-utils-coroutines-impl", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:gradle:dsl:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-gradle-dsl-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:gradle:dsl:internal", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-gradle-dsl-internal", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:gradle:dsl:precompiled", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-gradle-dsl-precompiled", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:gradle:dsl:testing", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-gradle-dsl-testing", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:gradle:model:api", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-gradle-model-api", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - }, - { - "gradlePath": ":modulecheck-parsing:gradle:model:impl-typesafe", - "group": "com.rickbusarow.modulecheck", - "artifactId": "modulecheck-parsing-gradle-model-impl-typesafe", - "description": "Fast dependency graph linting for Gradle projects", - "packaging": "jar", - "javaVersion": "11" - } -] \ No newline at end of file diff --git a/assets/css/styles.2fd08d7f.css b/assets/css/styles.2fd08d7f.css new file mode 100644 index 0000000000..32be5aecac --- /dev/null +++ b/assets/css/styles.2fd08d7f.css @@ -0,0 +1 @@ +.col,.container{padding:0 var(--ifm-spacing-horizontal);width:100%}.markdown>h2,.markdown>h3,.markdown>h4,.markdown>h5,.markdown>h6{margin-bottom:calc(var(--ifm-heading-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown li,body{word-wrap:break-word}body,ol ol,ol ul,ul ol,ul ul{margin:0}pre,table{overflow:auto}blockquote,pre{margin:0 0 var(--ifm-spacing-vertical)}.breadcrumbs__link,.button{transition-timing-function:var(--ifm-transition-timing-default)}.button,code{vertical-align:middle}.button--outline.button--active,.button--outline:active,.button--outline:hover,:root{--ifm-button-color:var(--ifm-font-color-base-inverse)}.menu__link:hover,a{transition:color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.navbar--dark,:root{--ifm-navbar-link-hover-color:var(--ifm-color-primary)}.menu,.navbar-sidebar{overflow-x:hidden}:root,html[data-theme=dark]{--ifm-color-emphasis-500:var(--ifm-color-gray-500)}*,.DocSearch-Container,.DocSearch-Container *{box-sizing:border-box}.toggleButton_DDky,html{-webkit-tap-highlight-color:transparent}:root{--ifm-color-scheme:light;--ifm-dark-value:10%;--ifm-darker-value:15%;--ifm-darkest-value:30%;--ifm-light-value:15%;--ifm-lighter-value:30%;--ifm-lightest-value:50%;--ifm-contrast-background-value:90%;--ifm-contrast-foreground-value:70%;--ifm-contrast-background-dark-value:70%;--ifm-contrast-foreground-dark-value:90%;--ifm-color-primary:#3578e5;--ifm-color-secondary:#ebedf0;--ifm-color-success:#00a400;--ifm-color-info:#54c7ec;--ifm-color-warning:#ffba00;--ifm-color-danger:#fa383e;--ifm-color-primary-dark:#306cce;--ifm-color-primary-darker:#2d66c3;--ifm-color-primary-darkest:#2554a0;--ifm-color-primary-light:#538ce9;--ifm-color-primary-lighter:#72a1ed;--ifm-color-primary-lightest:#9abcf2;--ifm-color-primary-contrast-background:#ebf2fc;--ifm-color-primary-contrast-foreground:#102445;--ifm-color-secondary-dark:#d4d5d8;--ifm-color-secondary-darker:#c8c9cc;--ifm-color-secondary-darkest:#a4a6a8;--ifm-color-secondary-light:#eef0f2;--ifm-color-secondary-lighter:#f1f2f5;--ifm-color-secondary-lightest:#f5f6f8;--ifm-color-secondary-contrast-background:#fdfdfe;--ifm-color-secondary-contrast-foreground:#474748;--ifm-color-success-dark:#009400;--ifm-color-success-darker:#008b00;--ifm-color-success-darkest:#007300;--ifm-color-success-light:#26b226;--ifm-color-success-lighter:#4dbf4d;--ifm-color-success-lightest:#80d280;--ifm-color-success-contrast-background:#e6f6e6;--ifm-color-success-contrast-foreground:#003100;--ifm-color-info-dark:#4cb3d4;--ifm-color-info-darker:#47a9c9;--ifm-color-info-darkest:#3b8ba5;--ifm-color-info-light:#6ecfef;--ifm-color-info-lighter:#87d8f2;--ifm-color-info-lightest:#aae3f6;--ifm-color-info-contrast-background:#eef9fd;--ifm-color-info-contrast-foreground:#193c47;--ifm-color-warning-dark:#e6a700;--ifm-color-warning-darker:#d99e00;--ifm-color-warning-darkest:#b38200;--ifm-color-warning-light:#ffc426;--ifm-color-warning-lighter:#ffcf4d;--ifm-color-warning-lightest:#ffdd80;--ifm-color-warning-contrast-background:#fff8e6;--ifm-color-warning-contrast-foreground:#4d3800;--ifm-color-danger-dark:#e13238;--ifm-color-danger-darker:#d53035;--ifm-color-danger-darkest:#af272b;--ifm-color-danger-light:#fb565b;--ifm-color-danger-lighter:#fb7478;--ifm-color-danger-lightest:#fd9c9f;--ifm-color-danger-contrast-background:#ffebec;--ifm-color-danger-contrast-foreground:#4b1113;--ifm-color-white:#fff;--ifm-color-black:#000;--ifm-color-gray-0:var(--ifm-color-white);--ifm-color-gray-100:#f5f6f7;--ifm-color-gray-200:#ebedf0;--ifm-color-gray-300:#dadde1;--ifm-color-gray-400:#ccd0d5;--ifm-color-gray-500:#bec3c9;--ifm-color-gray-600:#8d949e;--ifm-color-gray-700:#606770;--ifm-color-gray-800:#444950;--ifm-color-gray-900:#1c1e21;--ifm-color-gray-1000:var(--ifm-color-black);--ifm-color-emphasis-0:var(--ifm-color-gray-0);--ifm-color-emphasis-100:var(--ifm-color-gray-100);--ifm-color-emphasis-200:var(--ifm-color-gray-200);--ifm-color-emphasis-300:var(--ifm-color-gray-300);--ifm-color-emphasis-400:var(--ifm-color-gray-400);--ifm-color-emphasis-600:var(--ifm-color-gray-600);--ifm-color-emphasis-700:var(--ifm-color-gray-700);--ifm-color-emphasis-800:var(--ifm-color-gray-800);--ifm-color-emphasis-900:var(--ifm-color-gray-900);--ifm-color-emphasis-1000:var(--ifm-color-gray-1000);--ifm-color-content:var(--ifm-color-emphasis-900);--ifm-color-content-inverse:var(--ifm-color-emphasis-0);--ifm-color-content-secondary:#525860;--ifm-background-color:#0000;--ifm-background-surface-color:var(--ifm-color-content-inverse);--ifm-global-border-width:1px;--ifm-global-radius:0.4rem;--ifm-hover-overlay:#0000000d;--ifm-font-color-base:var(--ifm-color-content);--ifm-font-color-base-inverse:var(--ifm-color-content-inverse);--ifm-font-color-secondary:var(--ifm-color-content-secondary);--ifm-font-family-base:system-ui,-apple-system,Segoe UI,Roboto,Ubuntu,Cantarell,Noto Sans,sans-serif,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";--ifm-font-family-monospace:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--ifm-font-size-base:100%;--ifm-font-weight-light:300;--ifm-font-weight-normal:400;--ifm-font-weight-semibold:500;--ifm-font-weight-bold:700;--ifm-font-weight-base:var(--ifm-font-weight-normal);--ifm-line-height-base:1.65;--ifm-global-spacing:1rem;--ifm-spacing-vertical:var(--ifm-global-spacing);--ifm-spacing-horizontal:var(--ifm-global-spacing);--ifm-transition-fast:200ms;--ifm-transition-slow:400ms;--ifm-transition-timing-default:cubic-bezier(0.08,0.52,0.52,1);--ifm-global-shadow-lw:0 1px 2px 0 #0000001a;--ifm-global-shadow-md:0 5px 40px #0003;--ifm-global-shadow-tl:0 12px 28px 0 #0003,0 2px 4px 0 #0000001a;--ifm-z-index-dropdown:100;--ifm-z-index-fixed:200;--ifm-z-index-overlay:400;--ifm-container-width:1140px;--ifm-container-width-xl:1320px;--ifm-code-background:#f6f7f8;--ifm-code-border-radius:var(--ifm-global-radius);--ifm-code-font-size:90%;--ifm-code-padding-horizontal:0.1rem;--ifm-code-padding-vertical:0.1rem;--ifm-pre-background:var(--ifm-code-background);--ifm-pre-border-radius:var(--ifm-code-border-radius);--ifm-pre-color:inherit;--ifm-pre-line-height:1.45;--ifm-pre-padding:1rem;--ifm-heading-color:inherit;--ifm-heading-margin-top:0;--ifm-heading-margin-bottom:var(--ifm-spacing-vertical);--ifm-heading-font-family:var(--ifm-font-family-base);--ifm-heading-font-weight:var(--ifm-font-weight-bold);--ifm-heading-line-height:1.25;--ifm-h1-font-size:2rem;--ifm-h2-font-size:1.5rem;--ifm-h3-font-size:1.25rem;--ifm-h4-font-size:1rem;--ifm-h5-font-size:0.875rem;--ifm-h6-font-size:0.85rem;--ifm-image-alignment-padding:1.25rem;--ifm-leading-desktop:1.25;--ifm-leading:calc(var(--ifm-leading-desktop)*1rem);--ifm-list-left-padding:2rem;--ifm-list-margin:1rem;--ifm-list-item-margin:0.25rem;--ifm-list-paragraph-margin:1rem;--ifm-table-cell-padding:0.75rem;--ifm-table-background:#0000;--ifm-table-stripe-background:#00000008;--ifm-table-border-width:1px;--ifm-table-border-color:var(--ifm-color-emphasis-300);--ifm-table-head-background:inherit;--ifm-table-head-color:inherit;--ifm-table-head-font-weight:var(--ifm-font-weight-bold);--ifm-table-cell-color:inherit;--ifm-link-color:var(--ifm-color-primary);--ifm-link-decoration:none;--ifm-link-hover-color:var(--ifm-link-color);--ifm-link-hover-decoration:underline;--ifm-paragraph-margin-bottom:var(--ifm-leading);--ifm-blockquote-font-size:var(--ifm-font-size-base);--ifm-blockquote-border-left-width:2px;--ifm-blockquote-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-blockquote-padding-vertical:0;--ifm-blockquote-shadow:none;--ifm-blockquote-color:var(--ifm-color-emphasis-800);--ifm-blockquote-border-color:var(--ifm-color-emphasis-300);--ifm-hr-background-color:var(--ifm-color-emphasis-500);--ifm-hr-height:1px;--ifm-hr-margin-vertical:1.5rem;--ifm-scrollbar-size:7px;--ifm-scrollbar-track-background-color:#f1f1f1;--ifm-scrollbar-thumb-background-color:silver;--ifm-scrollbar-thumb-hover-background-color:#a7a7a7;--ifm-alert-background-color:inherit;--ifm-alert-border-color:inherit;--ifm-alert-border-radius:var(--ifm-global-radius);--ifm-alert-border-width:0px;--ifm-alert-border-left-width:5px;--ifm-alert-color:var(--ifm-font-color-base);--ifm-alert-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-alert-padding-vertical:var(--ifm-spacing-vertical);--ifm-alert-shadow:var(--ifm-global-shadow-lw);--ifm-avatar-intro-margin:1rem;--ifm-avatar-intro-alignment:inherit;--ifm-avatar-photo-size:3rem;--ifm-badge-background-color:inherit;--ifm-badge-border-color:inherit;--ifm-badge-border-radius:var(--ifm-global-radius);--ifm-badge-border-width:var(--ifm-global-border-width);--ifm-badge-color:var(--ifm-color-white);--ifm-badge-padding-horizontal:calc(var(--ifm-spacing-horizontal)*0.5);--ifm-badge-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-breadcrumb-border-radius:1.5rem;--ifm-breadcrumb-spacing:0.5rem;--ifm-breadcrumb-color-active:var(--ifm-color-primary);--ifm-breadcrumb-item-background-active:var(--ifm-hover-overlay);--ifm-breadcrumb-padding-horizontal:0.8rem;--ifm-breadcrumb-padding-vertical:0.4rem;--ifm-breadcrumb-size-multiplier:1;--ifm-breadcrumb-separator:url('data:image/svg+xml;utf8,');--ifm-breadcrumb-separator-filter:none;--ifm-breadcrumb-separator-size:0.5rem;--ifm-breadcrumb-separator-size-multiplier:1.25;--ifm-button-background-color:inherit;--ifm-button-border-color:var(--ifm-button-background-color);--ifm-button-border-width:var(--ifm-global-border-width);--ifm-button-font-weight:var(--ifm-font-weight-bold);--ifm-button-padding-horizontal:1.5rem;--ifm-button-padding-vertical:0.375rem;--ifm-button-size-multiplier:1;--ifm-button-transition-duration:var(--ifm-transition-fast);--ifm-button-border-radius:calc(var(--ifm-global-radius)*var(--ifm-button-size-multiplier));--ifm-button-group-spacing:2px;--ifm-card-background-color:var(--ifm-background-surface-color);--ifm-card-border-radius:calc(var(--ifm-global-radius)*2);--ifm-card-horizontal-spacing:var(--ifm-global-spacing);--ifm-card-vertical-spacing:var(--ifm-global-spacing);--ifm-toc-border-color:var(--ifm-color-emphasis-300);--ifm-toc-link-color:var(--ifm-color-content-secondary);--ifm-toc-padding-vertical:0.5rem;--ifm-toc-padding-horizontal:0.5rem;--ifm-dropdown-background-color:var(--ifm-background-surface-color);--ifm-dropdown-font-weight:var(--ifm-font-weight-semibold);--ifm-dropdown-link-color:var(--ifm-font-color-base);--ifm-dropdown-hover-background-color:var(--ifm-hover-overlay);--ifm-footer-background-color:var(--ifm-color-emphasis-100);--ifm-footer-color:inherit;--ifm-footer-link-color:var(--ifm-color-emphasis-700);--ifm-footer-link-hover-color:var(--ifm-color-primary);--ifm-footer-link-horizontal-spacing:0.5rem;--ifm-footer-padding-horizontal:calc(var(--ifm-spacing-horizontal)*2);--ifm-footer-padding-vertical:calc(var(--ifm-spacing-vertical)*2);--ifm-footer-title-color:inherit;--ifm-footer-logo-max-width:min(30rem,90vw);--ifm-hero-background-color:var(--ifm-background-surface-color);--ifm-hero-text-color:var(--ifm-color-emphasis-800);--ifm-menu-color:var(--ifm-color-emphasis-700);--ifm-menu-color-active:var(--ifm-color-primary);--ifm-menu-color-background-active:var(--ifm-hover-overlay);--ifm-menu-color-background-hover:var(--ifm-hover-overlay);--ifm-menu-link-padding-horizontal:0.75rem;--ifm-menu-link-padding-vertical:0.375rem;--ifm-menu-link-sublist-icon:url('data:image/svg+xml;utf8,');--ifm-menu-link-sublist-icon-filter:none;--ifm-navbar-background-color:var(--ifm-background-surface-color);--ifm-navbar-height:3.75rem;--ifm-navbar-item-padding-horizontal:0.75rem;--ifm-navbar-item-padding-vertical:0.25rem;--ifm-navbar-link-color:var(--ifm-font-color-base);--ifm-navbar-link-active-color:var(--ifm-link-color);--ifm-navbar-padding-horizontal:var(--ifm-spacing-horizontal);--ifm-navbar-padding-vertical:calc(var(--ifm-spacing-vertical)*0.5);--ifm-navbar-shadow:var(--ifm-global-shadow-lw);--ifm-navbar-search-input-background-color:var(--ifm-color-emphasis-200);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-800);--ifm-navbar-search-input-placeholder-color:var(--ifm-color-emphasis-500);--ifm-navbar-search-input-icon:url('data:image/svg+xml;utf8,');--ifm-navbar-sidebar-width:83vw;--ifm-pagination-border-radius:var(--ifm-global-radius);--ifm-pagination-color-active:var(--ifm-color-primary);--ifm-pagination-font-size:1rem;--ifm-pagination-item-active-background:var(--ifm-hover-overlay);--ifm-pagination-page-spacing:0.2em;--ifm-pagination-padding-horizontal:calc(var(--ifm-spacing-horizontal)*1);--ifm-pagination-padding-vertical:calc(var(--ifm-spacing-vertical)*0.25);--ifm-pagination-nav-border-radius:var(--ifm-global-radius);--ifm-pagination-nav-color-hover:var(--ifm-color-primary);--ifm-pills-color-active:var(--ifm-color-primary);--ifm-pills-color-background-active:var(--ifm-hover-overlay);--ifm-pills-spacing:0.125rem;--ifm-tabs-color:var(--ifm-font-color-secondary);--ifm-tabs-color-active:var(--ifm-color-primary);--ifm-tabs-color-active-border:var(--ifm-tabs-color-active);--ifm-tabs-padding-horizontal:1rem;--ifm-tabs-padding-vertical:1rem;--docusaurus-progress-bar-color:var(--ifm-color-primary);--ifm-color-primary:#50a;--ifm-color-primary-dark:#4c0099;--ifm-color-primary-darker:#480090;--ifm-color-primary-darkest:#3b0077;--ifm-color-primary-light:#5d00bb;--ifm-color-primary-lighter:#6200c3;--ifm-color-primary-lightest:#6e00dd;--ifm-code-font-size:95%;--docusaurus-tag-list-border:var(--ifm-color-emphasis-300);--docsearch-primary-color:#5468ff;--docsearch-text-color:#1c1e21;--docsearch-spacing:12px;--docsearch-icon-stroke-width:1.4;--docsearch-highlight-color:var(--docsearch-primary-color);--docsearch-muted-color:#969faf;--docsearch-container-background:#656c85cc;--docsearch-logo-color:#5468ff;--docsearch-modal-width:560px;--docsearch-modal-height:600px;--docsearch-modal-background:#f5f6f7;--docsearch-modal-shadow:inset 1px 1px 0 0 #ffffff80,0 3px 8px 0 #555a64;--docsearch-searchbox-height:56px;--docsearch-searchbox-background:#ebedf0;--docsearch-searchbox-focus-background:#fff;--docsearch-searchbox-shadow:inset 0 0 0 2px var(--docsearch-primary-color);--docsearch-hit-height:56px;--docsearch-hit-color:#444950;--docsearch-hit-active-color:#fff;--docsearch-hit-background:#fff;--docsearch-hit-shadow:0 1px 3px 0 #d4d9e1;--docsearch-key-gradient:linear-gradient(-225deg,#d5dbe4,#f8f8f8);--docsearch-key-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 2px 1px #1e235a66;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #cdcde6,inset 0 0 1px 1px #fff,0 1px 1px 0 #1e235a66;--docsearch-footer-height:44px;--docsearch-footer-background:#fff;--docsearch-footer-shadow:0 -1px 0 0 #e0e3e8,0 -3px 6px 0 #45629b1f;--docsearch-primary-color:var(--ifm-color-primary);--docsearch-text-color:var(--ifm-font-color-base);--docusaurus-announcement-bar-height:auto;--docusaurus-collapse-button-bg:#0000;--docusaurus-collapse-button-bg-hover:#0000001a;--doc-sidebar-width:300px;--doc-sidebar-hidden-width:30px}.badge--danger,.badge--info,.badge--primary,.badge--secondary,.badge--success,.badge--warning{--ifm-badge-border-color:var(--ifm-badge-background-color)}.button--link,.button--outline{--ifm-button-background-color:#0000}html{background-color:var(--ifm-background-color);color:var(--ifm-font-color-base);color-scheme:var(--ifm-color-scheme);font:var(--ifm-font-size-base)/var(--ifm-line-height-base) var(--ifm-font-family-base);-webkit-font-smoothing:antialiased;text-rendering:optimizelegibility;-webkit-text-size-adjust:100%;text-size-adjust:100%}iframe{border:0;color-scheme:auto}.container{margin:0 auto;max-width:var(--ifm-container-width)}.container--fluid{max-width:inherit}.row{display:flex;flex-wrap:wrap;margin:0 calc(var(--ifm-spacing-horizontal)*-1)}.margin-bottom--none,.margin-vert--none,.markdown>:last-child{margin-bottom:0!important}.margin-top--none,.margin-vert--none,.tabItem_qGQB{margin-top:0!important}.row--no-gutters{margin-left:0;margin-right:0}.margin-horiz--none,.margin-right--none{margin-right:0!important}.row--no-gutters>.col{padding-left:0;padding-right:0}.row--align-top{align-items:flex-start}.row--align-bottom{align-items:flex-end}.menuExternalLink_bkjJ,.row--align-center{align-items:center}.row--align-stretch{align-items:stretch}.row--align-baseline{align-items:baseline}.col{--ifm-col-width:100%;flex:1 0;margin-left:0;max-width:var(--ifm-col-width)}.padding-bottom--none,.padding-vert--none{padding-bottom:0!important}.padding-top--none,.padding-vert--none{padding-top:0!important}.padding-horiz--none,.padding-left--none{padding-left:0!important}.padding-horiz--none,.padding-right--none{padding-right:0!important}.col[class*=col--]{flex:0 0 var(--ifm-col-width)}.col--1{--ifm-col-width:8.33333%}.col--offset-1{margin-left:8.33333%}.col--2{--ifm-col-width:16.66667%}.col--offset-2{margin-left:16.66667%}.col--3{--ifm-col-width:25%}.col--offset-3{margin-left:25%}.col--4{--ifm-col-width:33.33333%}.col--offset-4{margin-left:33.33333%}.col--5{--ifm-col-width:41.66667%}.col--offset-5{margin-left:41.66667%}.col--6{--ifm-col-width:50%}.col--offset-6{margin-left:50%}.col--7{--ifm-col-width:58.33333%}.col--offset-7{margin-left:58.33333%}.col--8{--ifm-col-width:66.66667%}.col--offset-8{margin-left:66.66667%}.col--9{--ifm-col-width:75%}.col--offset-9{margin-left:75%}.col--10{--ifm-col-width:83.33333%}.col--offset-10{margin-left:83.33333%}.col--11{--ifm-col-width:91.66667%}.col--offset-11{margin-left:91.66667%}.col--12{--ifm-col-width:100%}.col--offset-12{margin-left:100%}.margin-horiz--none,.margin-left--none{margin-left:0!important}.margin--none{margin:0!important}.margin-bottom--xs,.margin-vert--xs{margin-bottom:.25rem!important}.margin-top--xs,.margin-vert--xs{margin-top:.25rem!important}.margin-horiz--xs,.margin-left--xs{margin-left:.25rem!important}.margin-horiz--xs,.margin-right--xs{margin-right:.25rem!important}.margin--xs{margin:.25rem!important}.margin-bottom--sm,.margin-vert--sm{margin-bottom:.5rem!important}.margin-top--sm,.margin-vert--sm{margin-top:.5rem!important}.margin-horiz--sm,.margin-left--sm{margin-left:.5rem!important}.margin-horiz--sm,.margin-right--sm{margin-right:.5rem!important}.margin--sm{margin:.5rem!important}.margin-bottom--md,.margin-vert--md{margin-bottom:1rem!important}.margin-top--md,.margin-vert--md{margin-top:1rem!important}.margin-horiz--md,.margin-left--md{margin-left:1rem!important}.margin-horiz--md,.margin-right--md{margin-right:1rem!important}.margin--md{margin:1rem!important}.margin-bottom--lg,.margin-vert--lg{margin-bottom:2rem!important}.margin-top--lg,.margin-vert--lg{margin-top:2rem!important}.margin-horiz--lg,.margin-left--lg{margin-left:2rem!important}.margin-horiz--lg,.margin-right--lg{margin-right:2rem!important}.margin--lg{margin:2rem!important}.margin-bottom--xl,.margin-vert--xl{margin-bottom:5rem!important}.margin-top--xl,.margin-vert--xl{margin-top:5rem!important}.margin-horiz--xl,.margin-left--xl{margin-left:5rem!important}.margin-horiz--xl,.margin-right--xl{margin-right:5rem!important}.margin--xl{margin:5rem!important}.padding--none{padding:0!important}.padding-bottom--xs,.padding-vert--xs{padding-bottom:.25rem!important}.padding-top--xs,.padding-vert--xs{padding-top:.25rem!important}.padding-horiz--xs,.padding-left--xs{padding-left:.25rem!important}.padding-horiz--xs,.padding-right--xs{padding-right:.25rem!important}.padding--xs{padding:.25rem!important}.padding-bottom--sm,.padding-vert--sm{padding-bottom:.5rem!important}.padding-top--sm,.padding-vert--sm{padding-top:.5rem!important}.padding-horiz--sm,.padding-left--sm{padding-left:.5rem!important}.padding-horiz--sm,.padding-right--sm{padding-right:.5rem!important}.padding--sm{padding:.5rem!important}.padding-bottom--md,.padding-vert--md{padding-bottom:1rem!important}.padding-top--md,.padding-vert--md{padding-top:1rem!important}.padding-horiz--md,.padding-left--md{padding-left:1rem!important}.padding-horiz--md,.padding-right--md{padding-right:1rem!important}.padding--md{padding:1rem!important}.padding-bottom--lg,.padding-vert--lg{padding-bottom:2rem!important}.padding-top--lg,.padding-vert--lg{padding-top:2rem!important}.padding-horiz--lg,.padding-left--lg{padding-left:2rem!important}.padding-horiz--lg,.padding-right--lg{padding-right:2rem!important}.padding--lg{padding:2rem!important}.padding-bottom--xl,.padding-vert--xl{padding-bottom:5rem!important}.padding-top--xl,.padding-vert--xl{padding-top:5rem!important}.padding-horiz--xl,.padding-left--xl{padding-left:5rem!important}.padding-horiz--xl,.padding-right--xl{padding-right:5rem!important}.padding--xl{padding:5rem!important}code{background-color:var(--ifm-code-background);border:.1rem solid #0000001a;border-radius:var(--ifm-code-border-radius);font-family:var(--ifm-font-family-monospace);font-size:var(--ifm-code-font-size);padding:var(--ifm-code-padding-vertical) var(--ifm-code-padding-horizontal)}a code{color:inherit}pre{background-color:var(--ifm-pre-background);border-radius:var(--ifm-pre-border-radius);color:var(--ifm-pre-color);font:var(--ifm-code-font-size)/var(--ifm-pre-line-height) var(--ifm-font-family-monospace);padding:var(--ifm-pre-padding)}pre code{background-color:initial;border:none;font-size:100%;line-height:inherit;padding:0}kbd{background-color:var(--ifm-color-emphasis-0);border:1px solid var(--ifm-color-emphasis-400);border-radius:.2rem;box-shadow:inset 0 -1px 0 var(--ifm-color-emphasis-400);color:var(--ifm-color-emphasis-800);font:80% var(--ifm-font-family-monospace);padding:.15rem .3rem}h1,h2,h3,h4,h5,h6{color:var(--ifm-heading-color);font-family:var(--ifm-heading-font-family);font-weight:var(--ifm-heading-font-weight);line-height:var(--ifm-heading-line-height);margin:var(--ifm-heading-margin-top) 0 var(--ifm-heading-margin-bottom) 0}h1{font-size:var(--ifm-h1-font-size)}h2{font-size:var(--ifm-h2-font-size)}h3{font-size:var(--ifm-h3-font-size)}h4{font-size:var(--ifm-h4-font-size)}h5{font-size:var(--ifm-h5-font-size)}h6{font-size:var(--ifm-h6-font-size)}.container_QZpv,.container_QZpv>svg,img{max-width:100%}img[align=right]{padding-left:var(--image-alignment-padding)}img[align=left]{padding-right:var(--image-alignment-padding)}.markdown{--ifm-h1-vertical-rhythm-top:3;--ifm-h2-vertical-rhythm-top:2;--ifm-h3-vertical-rhythm-top:1.5;--ifm-heading-vertical-rhythm-top:1.25;--ifm-h1-vertical-rhythm-bottom:1.25;--ifm-heading-vertical-rhythm-bottom:1}.markdown:after,.markdown:before{content:"";display:table}.markdown:after{clear:both}.markdown h1:first-child{--ifm-h1-font-size:3rem;margin-bottom:calc(var(--ifm-h1-vertical-rhythm-bottom)*var(--ifm-leading))}.markdown>h2{--ifm-h2-font-size:2rem;margin-top:calc(var(--ifm-h2-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h3{--ifm-h3-font-size:1.5rem;margin-top:calc(var(--ifm-h3-vertical-rhythm-top)*var(--ifm-leading))}.markdown>h4,.markdown>h5,.markdown>h6{margin-top:calc(var(--ifm-heading-vertical-rhythm-top)*var(--ifm-leading))}.markdown>p,.markdown>pre,.markdown>ul,.tabList_KWM2{margin-bottom:var(--ifm-leading)}.markdown li>p{margin-top:var(--ifm-list-paragraph-margin)}.markdown li+li{margin-top:var(--ifm-list-item-margin)}ol,ul{margin:0 0 var(--ifm-list-margin);padding-left:var(--ifm-list-left-padding)}ol ol,ul ol{list-style-type:lower-roman}ol ol ol,ol ul ol,ul ol ol,ul ul ol{list-style-type:lower-alpha}table{border-collapse:collapse;display:block;margin-bottom:var(--ifm-spacing-vertical)}table thead tr{border-bottom:2px solid var(--ifm-table-border-color)}table thead,table tr:nth-child(2n){background-color:var(--ifm-table-stripe-background)}table tr{background-color:var(--ifm-table-background);border-top:var(--ifm-table-border-width) solid var(--ifm-table-border-color)}table td,table th{border:var(--ifm-table-border-width) solid var(--ifm-table-border-color);padding:var(--ifm-table-cell-padding)}table th{background-color:var(--ifm-table-head-background);color:var(--ifm-table-head-color);font-weight:var(--ifm-table-head-font-weight)}table td{color:var(--ifm-table-cell-color)}strong{font-weight:var(--ifm-font-weight-bold)}a{color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}a:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.button:hover,.text--no-decoration,.text--no-decoration:hover,a:not([href]){-webkit-text-decoration:none;text-decoration:none}p{margin:0 0 var(--ifm-paragraph-margin-bottom)}blockquote{border-left:var(--ifm-blockquote-border-left-width) solid var(--ifm-blockquote-border-color);box-shadow:var(--ifm-blockquote-shadow);color:var(--ifm-blockquote-color);font-size:var(--ifm-blockquote-font-size);padding:var(--ifm-blockquote-padding-vertical) var(--ifm-blockquote-padding-horizontal)}blockquote>:first-child{margin-top:0}blockquote>:last-child{margin-bottom:0}hr{background-color:var(--ifm-hr-background-color);border:0;height:var(--ifm-hr-height);margin:var(--ifm-hr-margin-vertical) 0}.shadow--lw{box-shadow:var(--ifm-global-shadow-lw)!important}.shadow--md{box-shadow:var(--ifm-global-shadow-md)!important}.shadow--tl{box-shadow:var(--ifm-global-shadow-tl)!important}.text--primary,.wordWrapButtonEnabled_Aice .wordWrapButtonIcon_evTN{color:var(--ifm-color-primary)}.text--secondary{color:var(--ifm-color-secondary)}.text--success{color:var(--ifm-color-success)}.text--info{color:var(--ifm-color-info)}.text--warning{color:var(--ifm-color-warning)}.text--danger{color:var(--ifm-color-danger)}.text--center{text-align:center}.text--left{text-align:left}.text--justify{text-align:justify}.text--right{text-align:right}.text--capitalize{text-transform:capitalize}.text--lowercase{text-transform:lowercase}.admonitionHeading_hx_a,.alert__heading,.text--uppercase{text-transform:uppercase}.text--light{font-weight:var(--ifm-font-weight-light)}.text--normal{font-weight:var(--ifm-font-weight-normal)}.text--semibold{font-weight:var(--ifm-font-weight-semibold)}.text--bold{font-weight:var(--ifm-font-weight-bold)}.text--italic{font-style:italic}.text--truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.text--break{word-wrap:break-word!important;word-break:break-word!important}.clean-btn{background:none;border:none;color:inherit;cursor:pointer;font-family:inherit;padding:0}.alert,.alert .close{color:var(--ifm-alert-foreground-color)}.clean-list{list-style:none;padding-left:0}.alert--primary{--ifm-alert-background-color:var(--ifm-color-primary-contrast-background);--ifm-alert-background-color-highlight:#3578e526;--ifm-alert-foreground-color:var(--ifm-color-primary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-primary-dark)}.alert--secondary{--ifm-alert-background-color:var(--ifm-color-secondary-contrast-background);--ifm-alert-background-color-highlight:#ebedf026;--ifm-alert-foreground-color:var(--ifm-color-secondary-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-secondary-dark)}.alert--success{--ifm-alert-background-color:var(--ifm-color-success-contrast-background);--ifm-alert-background-color-highlight:#00a40026;--ifm-alert-foreground-color:var(--ifm-color-success-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-success-dark)}.alert--info{--ifm-alert-background-color:var(--ifm-color-info-contrast-background);--ifm-alert-background-color-highlight:#54c7ec26;--ifm-alert-foreground-color:var(--ifm-color-info-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-info-dark)}.alert--warning{--ifm-alert-background-color:var(--ifm-color-warning-contrast-background);--ifm-alert-background-color-highlight:#ffba0026;--ifm-alert-foreground-color:var(--ifm-color-warning-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-warning-dark)}.alert--danger{--ifm-alert-background-color:var(--ifm-color-danger-contrast-background);--ifm-alert-background-color-highlight:#fa383e26;--ifm-alert-foreground-color:var(--ifm-color-danger-contrast-foreground);--ifm-alert-border-color:var(--ifm-color-danger-dark)}.alert{--ifm-code-background:var(--ifm-alert-background-color-highlight);--ifm-link-color:var(--ifm-alert-foreground-color);--ifm-link-hover-color:var(--ifm-alert-foreground-color);--ifm-link-decoration:underline;--ifm-tabs-color:var(--ifm-alert-foreground-color);--ifm-tabs-color-active:var(--ifm-alert-foreground-color);--ifm-tabs-color-active-border:var(--ifm-alert-border-color);background-color:var(--ifm-alert-background-color);border:var(--ifm-alert-border-width) solid var(--ifm-alert-border-color);border-left-width:var(--ifm-alert-border-left-width);border-radius:var(--ifm-alert-border-radius);box-shadow:var(--ifm-alert-shadow);padding:var(--ifm-alert-padding-vertical) var(--ifm-alert-padding-horizontal)}.alert__heading{align-items:center;display:flex;font:700 var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family);margin-bottom:.5rem}.alert__icon{display:inline-flex;margin-right:.4em}.alert__icon svg{fill:var(--ifm-alert-foreground-color);stroke:var(--ifm-alert-foreground-color);stroke-width:0}.alert .close{margin:calc(var(--ifm-alert-padding-vertical)*-1) calc(var(--ifm-alert-padding-horizontal)*-1) 0 0;opacity:.75}.alert .close:focus,.alert .close:hover{opacity:1}.alert a{text-decoration-color:var(--ifm-alert-border-color)}.alert a:hover{text-decoration-thickness:2px}.avatar{column-gap:var(--ifm-avatar-intro-margin);display:flex}.avatar__photo{border-radius:50%;display:block;height:var(--ifm-avatar-photo-size);overflow:hidden;width:var(--ifm-avatar-photo-size)}.card--full-height,.navbar__logo img,body,html{height:100%}.avatar__photo--sm{--ifm-avatar-photo-size:2rem}.avatar__photo--lg{--ifm-avatar-photo-size:4rem}.avatar__photo--xl{--ifm-avatar-photo-size:6rem}.avatar__intro{display:flex;flex:1 1;flex-direction:column;justify-content:center;text-align:var(--ifm-avatar-intro-alignment)}.badge,.breadcrumbs__item,.breadcrumbs__link,.button,.dropdown>.navbar__link:after{display:inline-block}.avatar__name{font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base)}.avatar__subtitle{margin-top:.25rem}.avatar--vertical{--ifm-avatar-intro-alignment:center;--ifm-avatar-intro-margin:0.5rem;align-items:center;flex-direction:column}.badge{background-color:var(--ifm-badge-background-color);border:var(--ifm-badge-border-width) solid var(--ifm-badge-border-color);border-radius:var(--ifm-badge-border-radius);color:var(--ifm-badge-color);font-size:75%;font-weight:var(--ifm-font-weight-bold);line-height:1;padding:var(--ifm-badge-padding-vertical) var(--ifm-badge-padding-horizontal)}.badge--primary{--ifm-badge-background-color:var(--ifm-color-primary)}.badge--secondary{--ifm-badge-background-color:var(--ifm-color-secondary);color:var(--ifm-color-black)}.breadcrumbs__link,.button.button--secondary.button--outline:not(.button--active):not(:hover){color:var(--ifm-font-color-base)}.badge--success{--ifm-badge-background-color:var(--ifm-color-success)}.badge--info{--ifm-badge-background-color:var(--ifm-color-info)}.badge--warning{--ifm-badge-background-color:var(--ifm-color-warning)}.badge--danger{--ifm-badge-background-color:var(--ifm-color-danger)}.breadcrumbs{margin-bottom:0;padding-left:0}.breadcrumbs__item:not(:last-child):after{background:var(--ifm-breadcrumb-separator) center;content:" ";display:inline-block;filter:var(--ifm-breadcrumb-separator-filter);height:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier));margin:0 var(--ifm-breadcrumb-spacing);opacity:.5;width:calc(var(--ifm-breadcrumb-separator-size)*var(--ifm-breadcrumb-size-multiplier)*var(--ifm-breadcrumb-separator-size-multiplier))}.breadcrumbs__item--active .breadcrumbs__link{background:var(--ifm-breadcrumb-item-background-active);color:var(--ifm-breadcrumb-color-active)}.breadcrumbs__link{border-radius:var(--ifm-breadcrumb-border-radius);font-size:calc(1rem*var(--ifm-breadcrumb-size-multiplier));padding:calc(var(--ifm-breadcrumb-padding-vertical)*var(--ifm-breadcrumb-size-multiplier)) calc(var(--ifm-breadcrumb-padding-horizontal)*var(--ifm-breadcrumb-size-multiplier));transition-duration:var(--ifm-transition-fast);transition-property:background,color}.breadcrumbs__link:any-link:hover,.breadcrumbs__link:link:hover,.breadcrumbs__link:visited:hover,area[href].breadcrumbs__link:hover{background:var(--ifm-breadcrumb-item-background-active);-webkit-text-decoration:none;text-decoration:none}.breadcrumbs--sm{--ifm-breadcrumb-size-multiplier:0.8}.breadcrumbs--lg{--ifm-breadcrumb-size-multiplier:1.2}.button{background-color:var(--ifm-button-background-color);border:var(--ifm-button-border-width) solid var(--ifm-button-border-color);border-radius:var(--ifm-button-border-radius);cursor:pointer;font-size:calc(.875rem*var(--ifm-button-size-multiplier));font-weight:var(--ifm-button-font-weight);line-height:1.5;padding:calc(var(--ifm-button-padding-vertical)*var(--ifm-button-size-multiplier)) calc(var(--ifm-button-padding-horizontal)*var(--ifm-button-size-multiplier));text-align:center;transition-duration:var(--ifm-button-transition-duration);transition-property:color,background,border-color;-webkit-user-select:none;user-select:none;white-space:nowrap}.button,.button:hover{color:var(--ifm-button-color)}.button--outline{--ifm-button-color:var(--ifm-button-border-color)}.button--outline:hover{--ifm-button-background-color:var(--ifm-button-border-color)}.button--link{--ifm-button-border-color:#0000;color:var(--ifm-link-color);text-decoration:var(--ifm-link-decoration)}.button--link.button--active,.button--link:active,.button--link:hover{color:var(--ifm-link-hover-color);text-decoration:var(--ifm-link-hover-decoration)}.DocSearch-Container a,.dropdown__link--active,.dropdown__link:hover,.menu__link:hover,.navbar__brand:hover,.navbar__link--active,.navbar__link:hover,.pagination-nav__link:hover,.pagination__link:hover,.tag_pAIo:hover{-webkit-text-decoration:none;text-decoration:none}.button.disabled,.button:disabled,.button[disabled]{opacity:.65;pointer-events:none}.button--sm{--ifm-button-size-multiplier:0.8}.button--lg{--ifm-button-size-multiplier:1.35}.button--block{display:block;width:100%}.button.button--secondary{color:var(--ifm-color-gray-900)}:where(.button--primary){--ifm-button-background-color:var(--ifm-color-primary);--ifm-button-border-color:var(--ifm-color-primary)}:where(.button--primary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-primary-dark);--ifm-button-border-color:var(--ifm-color-primary-dark)}.button--primary.button--active,.button--primary:active{--ifm-button-background-color:var(--ifm-color-primary-darker);--ifm-button-border-color:var(--ifm-color-primary-darker)}:where(.button--secondary){--ifm-button-background-color:var(--ifm-color-secondary);--ifm-button-border-color:var(--ifm-color-secondary)}:where(.button--secondary):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-secondary-dark);--ifm-button-border-color:var(--ifm-color-secondary-dark)}.button--secondary.button--active,.button--secondary:active{--ifm-button-background-color:var(--ifm-color-secondary-darker);--ifm-button-border-color:var(--ifm-color-secondary-darker)}:where(.button--success){--ifm-button-background-color:var(--ifm-color-success);--ifm-button-border-color:var(--ifm-color-success)}:where(.button--success):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-success-dark);--ifm-button-border-color:var(--ifm-color-success-dark)}.button--success.button--active,.button--success:active{--ifm-button-background-color:var(--ifm-color-success-darker);--ifm-button-border-color:var(--ifm-color-success-darker)}:where(.button--info){--ifm-button-background-color:var(--ifm-color-info);--ifm-button-border-color:var(--ifm-color-info)}:where(.button--info):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-info-dark);--ifm-button-border-color:var(--ifm-color-info-dark)}.button--info.button--active,.button--info:active{--ifm-button-background-color:var(--ifm-color-info-darker);--ifm-button-border-color:var(--ifm-color-info-darker)}:where(.button--warning){--ifm-button-background-color:var(--ifm-color-warning);--ifm-button-border-color:var(--ifm-color-warning)}:where(.button--warning):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-warning-dark);--ifm-button-border-color:var(--ifm-color-warning-dark)}.button--warning.button--active,.button--warning:active{--ifm-button-background-color:var(--ifm-color-warning-darker);--ifm-button-border-color:var(--ifm-color-warning-darker)}:where(.button--danger){--ifm-button-background-color:var(--ifm-color-danger);--ifm-button-border-color:var(--ifm-color-danger)}:where(.button--danger):not(.button--outline):hover{--ifm-button-background-color:var(--ifm-color-danger-dark);--ifm-button-border-color:var(--ifm-color-danger-dark)}.button--danger.button--active,.button--danger:active{--ifm-button-background-color:var(--ifm-color-danger-darker);--ifm-button-border-color:var(--ifm-color-danger-darker)}.button-group{display:inline-flex;gap:var(--ifm-button-group-spacing)}.button-group>.button:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.button-group>.button:not(:last-child){border-bottom-right-radius:0;border-top-right-radius:0}.button-group--block{display:flex;justify-content:stretch}.button-group--block>.button{flex-grow:1}.card{background-color:var(--ifm-card-background-color);border-radius:var(--ifm-card-border-radius);box-shadow:var(--ifm-global-shadow-lw);display:flex;flex-direction:column;overflow:hidden}.card__image{padding-top:var(--ifm-card-vertical-spacing)}.card__image:first-child{padding-top:0}.card__body,.card__footer,.card__header{padding:var(--ifm-card-vertical-spacing) var(--ifm-card-horizontal-spacing)}.card__body:not(:last-child),.card__footer:not(:last-child),.card__header:not(:last-child){padding-bottom:0}.card__body>:last-child,.card__footer>:last-child,.card__header>:last-child{margin-bottom:0}.card__footer{margin-top:auto}.table-of-contents{font-size:.8rem;margin-bottom:0;padding:var(--ifm-toc-padding-vertical) 0}.table-of-contents,.table-of-contents ul{list-style:none;padding-left:var(--ifm-toc-padding-horizontal)}.table-of-contents li{margin:var(--ifm-toc-padding-vertical) var(--ifm-toc-padding-horizontal)}.table-of-contents__left-border{border-left:1px solid var(--ifm-toc-border-color)}.table-of-contents__link{color:var(--ifm-toc-link-color);display:block}.table-of-contents__link--active,.table-of-contents__link--active code,.table-of-contents__link:hover,.table-of-contents__link:hover code{color:var(--ifm-color-primary);-webkit-text-decoration:none;text-decoration:none}.close{color:var(--ifm-color-black);float:right;font-size:1.5rem;font-weight:var(--ifm-font-weight-bold);line-height:1;opacity:.5;padding:1rem;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.close:hover{opacity:.7}.close:focus,.theme-code-block-highlighted-line .codeLineNumber_o6ZJ:before{opacity:.8}.dropdown{display:inline-flex;font-weight:var(--ifm-dropdown-font-weight);position:relative;vertical-align:top}.dropdown--hoverable:hover .dropdown__menu,.dropdown--show .dropdown__menu{opacity:1;pointer-events:all;transform:translateY(-1px);visibility:visible}#nprogress,.dropdown__menu,.navbar__item.dropdown .navbar__link:not([href]){pointer-events:none}.dropdown--right .dropdown__menu{left:inherit;right:0}.dropdown--nocaret .navbar__link:after{content:none!important}.dropdown__menu{background-color:var(--ifm-dropdown-background-color);border-radius:var(--ifm-global-radius);box-shadow:var(--ifm-global-shadow-md);left:0;list-style:none;max-height:80vh;min-width:10rem;opacity:0;overflow-y:auto;padding:.5rem;position:absolute;top:calc(100% - var(--ifm-navbar-item-padding-vertical) + .3rem);transform:translateY(-.625rem);transition-duration:var(--ifm-transition-fast);transition-property:opacity,transform,visibility;transition-timing-function:var(--ifm-transition-timing-default);visibility:hidden;z-index:var(--ifm-z-index-dropdown)}.menu__caret,.menu__link,.menu__list-item-collapsible{border-radius:.25rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.dropdown__link{border-radius:.25rem;color:var(--ifm-dropdown-link-color);display:block;font-size:.875rem;margin-top:.2rem;padding:.25rem .5rem;white-space:nowrap}.dropdown__link--active,.dropdown__link:hover{background-color:var(--ifm-dropdown-hover-background-color);color:var(--ifm-dropdown-link-color)}.dropdown__link--active,.dropdown__link--active:hover{--ifm-dropdown-link-color:var(--ifm-link-color)}.dropdown>.navbar__link:after{border-color:currentcolor #0000;border-style:solid;border-width:.4em .4em 0;content:"";margin-left:.3em;position:relative;top:2px;transform:translateY(-50%)}.footer{background-color:var(--ifm-footer-background-color);color:var(--ifm-footer-color);padding:var(--ifm-footer-padding-vertical) var(--ifm-footer-padding-horizontal)}.footer--dark{--ifm-footer-background-color:#303846;--ifm-footer-color:var(--ifm-footer-link-color);--ifm-footer-link-color:var(--ifm-color-secondary);--ifm-footer-title-color:var(--ifm-color-white)}.footer__links{margin-bottom:1rem}.footer__link-item{color:var(--ifm-footer-link-color);line-height:2}.footer__link-item:hover{color:var(--ifm-footer-link-hover-color)}.footer__link-separator{margin:0 var(--ifm-footer-link-horizontal-spacing)}.footer__logo{margin-top:1rem;max-width:var(--ifm-footer-logo-max-width)}.footer__title{color:var(--ifm-footer-title-color);font:700 var(--ifm-h4-font-size)/var(--ifm-heading-line-height) var(--ifm-font-family-base);margin-bottom:var(--ifm-heading-margin-bottom)}.menu,.navbar__link{font-weight:var(--ifm-font-weight-semibold)}.docItemContainer_MHtG article>:first-child,.docItemContainer_MHtG header+*,.footer__item{margin-top:0}.admonitionContent_LOU5>:last-child,.collapsibleContent_uSUc p:last-child,.details_FSmu>summary>p:last-child,.footer__items,.tabItem_qogc>:last-child{margin-bottom:0}.codeBlockStandalone_Z1WV,[type=checkbox]{padding:0}.hero{align-items:center;background-color:var(--ifm-hero-background-color);color:var(--ifm-hero-text-color);display:flex;padding:4rem 2rem}.hero--primary{--ifm-hero-background-color:var(--ifm-color-primary);--ifm-hero-text-color:var(--ifm-font-color-base-inverse)}.hero--dark{--ifm-hero-background-color:#303846;--ifm-hero-text-color:var(--ifm-color-white)}.hero__title{font-size:3rem}.hero__subtitle{font-size:1.5rem}.menu__list{list-style:none;margin:0;padding-left:0}.menu__caret,.menu__link{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu__list .menu__list{flex:0 0 100%;margin-top:.25rem;padding-left:var(--ifm-menu-link-padding-horizontal)}.menu__list-item:not(:first-child){margin-top:.25rem}.menu__list-item--collapsed .menu__list{height:0;overflow:hidden}.details_FSmu[data-collapsed=false].isBrowser_iXC9>summary:before,.details_FSmu[open]:not(.isBrowser_iXC9)>summary:before,.menu__list-item--collapsed .menu__caret:before,.menu__list-item--collapsed .menu__link--sublist:after{transform:rotate(90deg)}.menu__list-item-collapsible{display:flex;flex-wrap:wrap;position:relative}.menu__caret:hover,.menu__link:hover,.menu__list-item-collapsible--active,.menu__list-item-collapsible:hover{background:var(--ifm-menu-color-background-hover)}.menu__list-item-collapsible .menu__link--active,.menu__list-item-collapsible .menu__link:hover{background:none!important}.menu__caret,.menu__link{align-items:center;display:flex}.navbar-sidebar,.navbar-sidebar__backdrop{bottom:0;opacity:0;transition-duration:var(--ifm-transition-fast);transition-timing-function:ease-in-out;top:0;visibility:hidden;left:0}.menu__link{color:var(--ifm-menu-color);flex:1;line-height:1.25}.menu__link:hover{color:var(--ifm-menu-color)}.menu__caret:before,.menu__link--sublist-caret:after{height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast) linear;width:1.25rem;content:"";filter:var(--ifm-menu-link-sublist-icon-filter)}.menu__link--sublist-caret:after{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem;margin-left:auto;min-width:1.25rem}.menu__link--active,.menu__link--active:hover{color:var(--ifm-menu-color-active)}.navbar__brand,.navbar__link{color:var(--ifm-navbar-link-color)}.menu__link--active:not(.menu__link--sublist){background-color:var(--ifm-menu-color-background-active)}.menu__caret:before{background:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem}.navbar--dark,html[data-theme=dark]{--ifm-menu-link-sublist-icon-filter:invert(100%) sepia(94%) saturate(17%) hue-rotate(223deg) brightness(104%) contrast(98%)}.navbar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-navbar-shadow);height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar,.navbar>.container,.navbar>.container-fluid{display:flex}.navbar--fixed-top{position:sticky;top:0;z-index:var(--ifm-z-index-fixed)}.navbar__inner{display:flex;flex-wrap:wrap;justify-content:space-between;width:100%}.navbar__brand{align-items:center;display:flex;margin-right:1rem;min-width:0}.navbar__brand:hover{color:var(--ifm-navbar-link-hover-color)}.announcementBarContent_aTCg,.navbar__title{flex:1 1 auto}.navbar__toggle{display:none;margin-right:.5rem}.navbar__logo{flex:0 0 auto;height:2rem;margin-right:.5rem}.navbar__items{align-items:center;display:flex;flex:1;min-width:0}.navbar__items--center{flex:0 0 auto}.navbar__items--center .navbar__brand{margin:0}.navbar__items--center+.navbar__items--right{flex:1}.navbar__items--right{flex:0 0 auto;justify-content:flex-end}.navbar__item{display:inline-block;padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.navbar__link--active,.navbar__link:hover{color:var(--ifm-navbar-link-hover-color)}.navbar--dark,.navbar--primary{--ifm-menu-color:var(--ifm-color-gray-300);--ifm-navbar-link-color:var(--ifm-color-gray-100);--ifm-navbar-search-input-background-color:#ffffff1a;--ifm-navbar-search-input-placeholder-color:#ffffff80;color:var(--ifm-color-white)}.navbar--dark{--ifm-navbar-background-color:#242526;--ifm-menu-color-background-active:#ffffff0d;--ifm-navbar-search-input-color:var(--ifm-color-white)}.navbar--primary{--ifm-navbar-background-color:var(--ifm-color-primary);--ifm-navbar-link-hover-color:var(--ifm-color-white);--ifm-menu-color-active:var(--ifm-color-white);--ifm-navbar-search-input-color:var(--ifm-color-emphasis-500)}.navbar__search-input{appearance:none;background:var(--ifm-navbar-search-input-background-color) var(--ifm-navbar-search-input-icon) no-repeat .75rem center/1rem 1rem;border:none;border-radius:2rem;color:var(--ifm-navbar-search-input-color);cursor:text;display:inline-block;font-size:1rem;height:2rem;padding:0 .5rem 0 2.25rem;width:12.5rem}.navbar__search-input::placeholder{color:var(--ifm-navbar-search-input-placeholder-color)}.navbar-sidebar{background-color:var(--ifm-navbar-background-color);box-shadow:var(--ifm-global-shadow-md);position:fixed;transform:translate3d(-100%,0,0);transition-property:opacity,visibility,transform;width:var(--ifm-navbar-sidebar-width)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar__items{transform:translateZ(0)}.navbar-sidebar--show .navbar-sidebar,.navbar-sidebar--show .navbar-sidebar__backdrop{opacity:1;visibility:visible}.navbar-sidebar__backdrop{background-color:#0009;position:fixed;right:0;transition-property:opacity,visibility}.navbar-sidebar__brand{align-items:center;box-shadow:var(--ifm-navbar-shadow);display:flex;flex:1;height:var(--ifm-navbar-height);padding:var(--ifm-navbar-padding-vertical) var(--ifm-navbar-padding-horizontal)}.navbar-sidebar__items{display:flex;height:calc(100% - var(--ifm-navbar-height));transition:transform var(--ifm-transition-fast) ease-in-out}.navbar-sidebar__items--show-secondary{transform:translate3d(calc((var(--ifm-navbar-sidebar-width))*-1),0,0)}.navbar-sidebar__item{flex-shrink:0;padding:.5rem;width:calc(var(--ifm-navbar-sidebar-width))}.navbar-sidebar__back{background:var(--ifm-menu-color-background-active);font-size:15px;font-weight:var(--ifm-button-font-weight);margin:0 0 .2rem -.5rem;padding:.6rem 1.5rem;position:relative;text-align:left;top:-.5rem;width:calc(100% + 1rem)}.navbar-sidebar__close{display:flex;margin-left:auto}.pagination{column-gap:var(--ifm-pagination-page-spacing);display:flex;font-size:var(--ifm-pagination-font-size);padding-left:0}.pagination--sm{--ifm-pagination-font-size:0.8rem;--ifm-pagination-padding-horizontal:0.8rem;--ifm-pagination-padding-vertical:0.2rem}.pagination--lg{--ifm-pagination-font-size:1.2rem;--ifm-pagination-padding-horizontal:1.2rem;--ifm-pagination-padding-vertical:0.3rem}.pagination__item{display:inline-flex}.pagination__item>span{padding:var(--ifm-pagination-padding-vertical)}.pagination__item--active .pagination__link{color:var(--ifm-pagination-color-active)}.pagination__item--active .pagination__link,.pagination__item:not(.pagination__item--active):hover .pagination__link{background:var(--ifm-pagination-item-active-background)}.pagination__item--disabled,.pagination__item[disabled]{opacity:.25;pointer-events:none}.pagination__link{border-radius:var(--ifm-pagination-border-radius);color:var(--ifm-font-color-base);display:inline-block;padding:var(--ifm-pagination-padding-vertical) var(--ifm-pagination-padding-horizontal);transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav{display:grid;grid-gap:var(--ifm-spacing-horizontal);gap:var(--ifm-spacing-horizontal);grid-template-columns:repeat(2,1fr)}.pagination-nav__link{border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-pagination-nav-border-radius);display:block;height:100%;line-height:var(--ifm-heading-line-height);padding:var(--ifm-global-spacing);transition:border-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.pagination-nav__link:hover{border-color:var(--ifm-pagination-nav-color-hover)}.pagination-nav__link--next{grid-column:2/3;text-align:right}.pagination-nav__label{font-size:var(--ifm-h4-font-size);font-weight:var(--ifm-heading-font-weight);word-break:break-word}.pagination-nav__link--prev .pagination-nav__label:before{content:"« "}.pagination-nav__link--next .pagination-nav__label:after{content:" »"}.pagination-nav__sublabel{color:var(--ifm-color-content-secondary);font-size:var(--ifm-h5-font-size);font-weight:var(--ifm-font-weight-semibold);margin-bottom:.25rem}.pills__item,.tabs{font-weight:var(--ifm-font-weight-bold)}.pills{display:flex;gap:var(--ifm-pills-spacing);padding-left:0}.pills__item{border-radius:.5rem;cursor:pointer;display:inline-block;padding:.25rem 1rem;transition:background var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs,:not(.containsTaskList_RROW>li)>.containsTaskList_RROW{padding-left:0}.pills__item--active{color:var(--ifm-pills-color-active)}.pills__item--active,.pills__item:not(.pills__item--active):hover{background:var(--ifm-pills-color-background-active)}.pills--block{justify-content:stretch}.pills--block .pills__item{flex-grow:1;text-align:center}.tabs{color:var(--ifm-tabs-color);display:flex;margin-bottom:0;overflow-x:auto}.tabs__item{border-bottom:3px solid #0000;border-radius:var(--ifm-global-radius);cursor:pointer;display:inline-flex;padding:var(--ifm-tabs-padding-vertical) var(--ifm-tabs-padding-horizontal);transition:background-color var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.tabs__item--active{border-bottom-color:var(--ifm-tabs-color-active-border);border-bottom-left-radius:0;border-bottom-right-radius:0;color:var(--ifm-tabs-color-active)}.tabs__item:hover{background-color:var(--ifm-hover-overlay)}.tabs--block{justify-content:stretch}.tabs--block .tabs__item{flex-grow:1;justify-content:center}html[data-theme=dark]{--ifm-color-scheme:dark;--ifm-color-emphasis-0:var(--ifm-color-gray-1000);--ifm-color-emphasis-100:var(--ifm-color-gray-900);--ifm-color-emphasis-200:var(--ifm-color-gray-800);--ifm-color-emphasis-300:var(--ifm-color-gray-700);--ifm-color-emphasis-400:var(--ifm-color-gray-600);--ifm-color-emphasis-600:var(--ifm-color-gray-400);--ifm-color-emphasis-700:var(--ifm-color-gray-300);--ifm-color-emphasis-800:var(--ifm-color-gray-200);--ifm-color-emphasis-900:var(--ifm-color-gray-100);--ifm-color-emphasis-1000:var(--ifm-color-gray-0);--ifm-background-color:#1b1b1d;--ifm-background-surface-color:#242526;--ifm-hover-overlay:#ffffff0d;--ifm-color-content:#e3e3e3;--ifm-color-content-secondary:#fff;--ifm-breadcrumb-separator-filter:invert(64%) sepia(11%) saturate(0%) hue-rotate(149deg) brightness(99%) contrast(95%);--ifm-code-background:#ffffff1a;--ifm-scrollbar-track-background-color:#444;--ifm-scrollbar-thumb-background-color:#686868;--ifm-scrollbar-thumb-hover-background-color:#7a7a7a;--ifm-table-stripe-background:#ffffff12;--ifm-toc-border-color:var(--ifm-color-emphasis-200);--ifm-color-primary-contrast-background:#102445;--ifm-color-primary-contrast-foreground:#ebf2fc;--ifm-color-secondary-contrast-background:#474748;--ifm-color-secondary-contrast-foreground:#fdfdfe;--ifm-color-success-contrast-background:#003100;--ifm-color-success-contrast-foreground:#e6f6e6;--ifm-color-info-contrast-background:#193c47;--ifm-color-info-contrast-foreground:#eef9fd;--ifm-color-warning-contrast-background:#4d3800;--ifm-color-warning-contrast-foreground:#fff8e6;--ifm-color-danger-contrast-background:#4b1113;--ifm-color-danger-contrast-foreground:#ffebec;--ifm-color-primary:#70c;--ifm-color-primary-dark:#6b00b8;--ifm-color-primary-darker:#6500ad;--ifm-color-primary-darkest:#53008f;--ifm-color-primary-light:#8300e0;--ifm-color-primary-lighter:#8900eb;--ifm-color-primary-lightest:#990aff;--docsearch-text-color:#f5f6f7;--docsearch-container-background:#090a11cc;--docsearch-modal-background:#15172a;--docsearch-modal-shadow:inset 1px 1px 0 0 #2c2e40,0 3px 8px 0 #000309;--docsearch-searchbox-background:#090a11;--docsearch-searchbox-focus-background:#000;--docsearch-hit-color:#bec3c9;--docsearch-hit-shadow:none;--docsearch-hit-background:#090a11;--docsearch-key-gradient:linear-gradient(-26.5deg,#565872,#31355b);--docsearch-key-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 2px 2px 0 #0304094d;--docsearch-key-pressed-shadow:inset 0 -2px 0 0 #282d55,inset 0 0 1px 1px #51577d,0 1px 1px 0 #0304094d;--docsearch-footer-background:#1e2136;--docsearch-footer-shadow:inset 0 1px 0 0 #494c6a80,0 -4px 8px 0 #0003;--docsearch-logo-color:#fff;--docsearch-muted-color:#7f8497}#nprogress .bar{background:var(--docusaurus-progress-bar-color);height:2px;left:0;position:fixed;top:0;width:100%;z-index:1031}#nprogress .peg{box-shadow:0 0 10px var(--docusaurus-progress-bar-color),0 0 5px var(--docusaurus-progress-bar-color);height:100%;opacity:1;position:absolute;right:0;transform:rotate(3deg) translateY(-4px);width:100px}.docusaurus-highlight-code-line{background-color:#484d5b;display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.menu button{margin-bottom:70px}article{margin-left:auto;margin-right:auto;max-width:1800px}.tag_pAIo{border:1px solid var(--docusaurus-tag-list-border);transition:border var(--ifm-transition-fast)}.tag_pAIo:hover{--docusaurus-tag-list-border:var(--ifm-link-color)}.tagRegular_kD8B{border-radius:var(--ifm-global-radius);font-size:90%;padding:.2rem .5rem .3rem}.tagWithCount_KrMf{align-items:center;border-left:0;display:flex;padding:0 .5rem 0 1rem;position:relative}.tagWithCount_KrMf:after,.tagWithCount_KrMf:before{border:1px solid var(--docusaurus-tag-list-border);content:"";position:absolute;top:50%;transition:inherit}.tagWithCount_KrMf:before{border-bottom:0;border-right:0;height:1.18rem;right:100%;transform:translate(50%,-50%) rotate(-45deg);width:1.18rem}.tagWithCount_KrMf:after{border-radius:50%;height:.5rem;left:0;transform:translateY(-50%);width:.5rem}.tagWithCount_KrMf span{background:var(--ifm-color-secondary);border-radius:var(--ifm-global-radius);color:var(--ifm-color-black);font-size:.7rem;line-height:1.2;margin-left:.3rem;padding:.1rem .4rem}.tags_wWOc{display:inline}.tag_SGXR{display:inline-block;margin:0 .4rem .5rem 0}.backToTopButton_N7e4{background-color:var(--ifm-color-emphasis-200);border-radius:50%;bottom:1.3rem;box-shadow:var(--ifm-global-shadow-lw);height:3rem;opacity:0;position:fixed;right:1.3rem;transform:scale(0);transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default);visibility:hidden;width:3rem;z-index:calc(var(--ifm-z-index-fixed) - 1)}.backToTopButton_N7e4:after{background-color:var(--ifm-color-emphasis-1000);content:" ";display:inline-block;height:100%;-webkit-mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;mask:var(--ifm-menu-link-sublist-icon) 50%/2rem 2rem no-repeat;width:100%}.backToTopButtonShow_xOSK{opacity:1;transform:scale(1);visibility:visible}.DocSearch-Button{align-items:center;background:var(--docsearch-searchbox-background);border:0;border-radius:40px;color:var(--docsearch-muted-color);cursor:pointer;display:flex;font-weight:500;height:36px;justify-content:space-between;padding:0 8px;-webkit-user-select:none;user-select:none}.DocSearch-Button:active,.DocSearch-Button:focus,.DocSearch-Button:hover{background:var(--docsearch-searchbox-focus-background);box-shadow:var(--docsearch-searchbox-shadow);color:var(--docsearch-text-color);outline:0}.DocSearch-Button-Container{align-items:center;display:flex}.DocSearch-Search-Icon{stroke-width:1.6}.DocSearch-Hit-Tree,.DocSearch-Hit-action,.DocSearch-Hit-icon,.DocSearch-Reset{stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Button .DocSearch-Search-Icon{color:var(--docsearch-text-color)}.DocSearch-Button-Placeholder{font-size:1rem;padding:0 12px 0 6px}.DocSearch-Button-Keys{display:flex;min-width:calc(40px + .8em)}.DocSearch-Button-Key{align-items:center;background:var(--docsearch-key-gradient);border:0;border-radius:3px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);display:flex;height:18px;justify-content:center;margin-right:.4em;padding:0 0 2px;position:relative;top:-1px;transition-duration:.1s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:20px}.DocSearch-Button-Key--pressed{box-shadow:var(--docsearch-key-pressed-shadow);transform:translate3d(0,1px,0)}.DocSearch--active{overflow:hidden!important}.DocSearch-Container{background-color:var(--docsearch-container-background);height:100vh;left:0;position:fixed;top:0;width:100vw;z-index:200}.DocSearch-Hit[aria-selected=true] mark,.DocSearch-Prefill:focus,.DocSearch-Prefill:hover,.content_pIKM a{-webkit-text-decoration:underline;text-decoration:underline}.DocSearch-Link{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;font:inherit;margin:0;padding:0}.DocSearch-Modal{background:var(--docsearch-modal-background);border-radius:6px;box-shadow:var(--docsearch-modal-shadow);flex-direction:column;margin:60px auto auto;max-width:var(--docsearch-modal-width);position:relative}.DocSearch-SearchBar{display:flex;padding:var(--docsearch-spacing) var(--docsearch-spacing) 0}.DocSearch-Form{align-items:center;background:var(--docsearch-searchbox-focus-background);border-radius:4px;box-shadow:var(--docsearch-searchbox-shadow);display:flex;height:var(--docsearch-searchbox-height);margin:0;padding:0 var(--docsearch-spacing);position:relative;width:100%}.DocSearch-Input{appearance:none;background:#0000;border:0;color:var(--docsearch-text-color);flex:1;font:inherit;font-size:1.2em;height:100%;outline:0;padding:0 0 0 8px;width:80%}.DocSearch-Input::placeholder{color:var(--docsearch-muted-color);opacity:1}.DocSearch-Input::-webkit-search-cancel-button,.DocSearch-Input::-webkit-search-decoration,.DocSearch-Input::-webkit-search-results-button,.DocSearch-Input::-webkit-search-results-decoration{display:none}.DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{margin:0;padding:0}.DocSearch-Container--Stalled .DocSearch-LoadingIndicator,.DocSearch-MagnifierLabel,.DocSearch-Reset{align-items:center;color:var(--docsearch-highlight-color);display:flex;justify-content:center}.DocSearch-Cancel,.DocSearch-Container--Stalled .DocSearch-MagnifierLabel,.DocSearch-LoadingIndicator,.DocSearch-Reset[hidden]{display:none}.DocSearch-Reset{animation:.1s ease-in forwards a;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;padding:2px;right:0}.DocSearch-Help,.DocSearch-HitsFooter,.DocSearch-Label{color:var(--docsearch-muted-color)}.DocSearch-Reset:hover{color:var(--docsearch-highlight-color)}.DocSearch-LoadingIndicator svg,.DocSearch-MagnifierLabel svg{height:24px;width:24px}.DocSearch-Dropdown{max-height:calc(var(--docsearch-modal-height) - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height));min-height:var(--docsearch-spacing);overflow-y:auto;overflow-y:overlay;padding:0 var(--docsearch-spacing);scrollbar-color:var(--docsearch-muted-color) var(--docsearch-modal-background);scrollbar-width:thin}.DocSearch-Dropdown::-webkit-scrollbar{width:12px}.DocSearch-Dropdown::-webkit-scrollbar-track{background:#0000}.DocSearch-Dropdown::-webkit-scrollbar-thumb{background-color:var(--docsearch-muted-color);border:3px solid var(--docsearch-modal-background);border-radius:20px}.DocSearch-Dropdown ul{list-style:none;margin:0;padding:0}.DocSearch-Label{font-size:.75em;line-height:1.6em}.DocSearch-Help{font-size:.9em;margin:0;-webkit-user-select:none;user-select:none}.DocSearch-Title{font-size:1.2em}.DocSearch-Logo a{display:flex}.DocSearch-Logo svg{color:var(--docsearch-logo-color);margin-left:8px}.DocSearch-Hits:last-of-type{margin-bottom:24px}.DocSearch-Hits mark{background:none;color:var(--docsearch-highlight-color)}.DocSearch-HitsFooter{display:flex;font-size:.85em;justify-content:center;margin-bottom:var(--docsearch-spacing);padding:var(--docsearch-spacing)}.DocSearch-HitsFooter a{border-bottom:1px solid;color:inherit}.DocSearch-Hit{border-radius:4px;display:flex;padding-bottom:4px;position:relative;scroll-margin-top:40px}.DocSearch-Hit--deleting{opacity:0;transition:.25s linear}.DocSearch-Hit--favoriting{transform:scale(0);transform-origin:top center;transition:.25s linear .25s}.DocSearch-Hit a{background:var(--docsearch-hit-background);border-radius:4px;box-shadow:var(--docsearch-hit-shadow);display:block;padding-left:var(--docsearch-spacing);width:100%}.DocSearch-Hit-source{background:var(--docsearch-modal-background);color:var(--docsearch-highlight-color);font-size:.85em;font-weight:600;line-height:32px;margin:0 -4px;padding:8px 4px 0;position:sticky;top:0;z-index:10}.DocSearch-Hit-Tree{color:var(--docsearch-muted-color);height:var(--docsearch-hit-height);opacity:.5;width:24px}.DocSearch-Hit[aria-selected=true] a{background-color:var(--docsearch-highlight-color)}.DocSearch-Hit-Container{align-items:center;color:var(--docsearch-hit-color);display:flex;flex-direction:row;height:var(--docsearch-hit-height);padding:0 var(--docsearch-spacing) 0 0}.DocSearch-Hit-icon{height:20px;width:20px}.DocSearch-Hit-action,.DocSearch-Hit-icon{color:var(--docsearch-muted-color)}.DocSearch-Hit-action{align-items:center;display:flex;height:22px;width:22px}.DocSearch-Hit-action svg{display:block;height:18px;width:18px}.DocSearch-Hit-action+.DocSearch-Hit-action{margin-left:6px}.DocSearch-Hit-action-button{appearance:none;background:none;border:0;border-radius:50%;color:inherit;cursor:pointer;padding:2px}#__docusaurus-base-url-issue-banner-container,.docSidebarContainer_LiYE,.navbarSearchContainer_WjZK:empty,.sidebarLogo_ag23,.themedComponent_kh6W,.toggleIcon_BNLx,html[data-announcement-bar-initially-dismissed=true] .announcementBar_ExsL,svg.DocSearch-Hit-Select-Icon{display:none}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Select-Icon,.tocCollapsibleContent_XFsF a{display:block}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:background-color .1s ease-in}.DocSearch-Hit-action-button:focus path,.DocSearch-Hit-action-button:hover path{fill:#fff}.DocSearch-Hit-content-wrapper{display:flex;flex:1 1 auto;flex-direction:column;font-weight:500;justify-content:center;line-height:1.2em;margin:0 8px;overflow-x:hidden;position:relative;text-overflow:ellipsis;white-space:nowrap;width:80%}.DocSearch-Hit-title{font-size:.9em}.DocSearch-Hit-path{color:var(--docsearch-muted-color);font-size:.75em}.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-Tree,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-action,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-icon,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-path,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-text,.DocSearch-Hit[aria-selected=true] .DocSearch-Hit-title,.DocSearch-Hit[aria-selected=true] mark{color:var(--docsearch-hit-active-color)!important}.DocSearch-ErrorScreen,.DocSearch-NoResults,.DocSearch-StartScreen{font-size:.9em;margin:0 auto;padding:36px 0;text-align:center;width:80%}.DocSearch-Screen-Icon{color:var(--docsearch-muted-color);padding-bottom:12px}.DocSearch-NoResults-Prefill-List{display:inline-block;padding-bottom:24px;text-align:left}.DocSearch-NoResults-Prefill-List ul{display:inline-block;padding:8px 0 0}.DocSearch-NoResults-Prefill-List li{list-style-position:inside;list-style-type:"» "}.DocSearch-Prefill{appearance:none;background:none;border:0;border-radius:1em;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;font-size:1em;font-weight:700;padding:0}.DocSearch-Prefill:focus,.DocSearch-Prefill:hover{outline:0}.DocSearch-Footer{align-items:center;background:var(--docsearch-footer-background);border-radius:0 0 8px 8px;box-shadow:var(--docsearch-footer-shadow);display:flex;flex-direction:row-reverse;flex-shrink:0;height:var(--docsearch-footer-height);justify-content:space-between;padding:0 var(--docsearch-spacing);position:relative;-webkit-user-select:none;user-select:none;width:100%;z-index:300}.DocSearch-Commands li,.DocSearch-Commands-Key{align-items:center;display:flex}.DocSearch-Commands{color:var(--docsearch-muted-color);display:flex;list-style:none;margin:0;padding:0}.DocSearch-Commands li:not(:last-of-type){margin-right:.8em}.DocSearch-Commands-Key{background:var(--docsearch-key-gradient);border:0;border-radius:2px;box-shadow:var(--docsearch-key-shadow);color:var(--docsearch-muted-color);height:18px;justify-content:center;margin-right:.4em;padding:0 0 1px;width:20px}.DocSearch-VisuallyHiddenForAccessibility{clip:rect(0 0 0 0);clip-path:inset(50%);height:1px;overflow:hidden;position:absolute;white-space:nowrap;width:1px}@keyframes a{0%{opacity:0}to{opacity:1}}.DocSearch-Button{margin:0;transition:all var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.DocSearch-Container,.skipToContent_X_hG{z-index:calc(var(--ifm-z-index-fixed) + 1)}.skipToContent_X_hG{background-color:var(--ifm-background-surface-color);color:var(--ifm-color-emphasis-900);left:100%;padding:calc(var(--ifm-global-spacing)/2) var(--ifm-global-spacing);position:fixed;top:1rem}.skipToContent_X_hG:focus{box-shadow:var(--ifm-global-shadow-md);left:1rem}.closeButton_D4Iw{line-height:0;padding:0}.content_pIKM{font-size:85%;padding:5px 0;text-align:center}.content_pIKM a{color:inherit}.announcementBar_ExsL{align-items:center;background-color:var(--ifm-color-white);border-bottom:1px solid var(--ifm-color-emphasis-100);color:var(--ifm-color-black);display:flex;height:var(--docusaurus-announcement-bar-height)}.announcementBarPlaceholder_vZsE{flex:0 0 10px}.announcementBarClose_kfzw{align-self:stretch;flex:0 0 30px}.toggle_bfyf{height:2rem;width:2rem}.toggleButton_DDky{align-items:center;border-radius:50%;display:flex;height:100%;justify-content:center;transition:background var(--ifm-transition-fast);width:100%}.toggleButton_DDky:hover{background:var(--ifm-color-emphasis-200)}[data-theme-choice=dark] .darkToggleIcon_lNmY,[data-theme-choice=light] .lightToggleIcon_FoKC,[data-theme-choice=system] .systemToggleIcon_Ctr3,[data-theme=dark] .themedComponent--dark_QNPN,[data-theme=light] .themedComponent--light_h03h,html:not([data-theme]) .themedComponent--light_h03h{display:initial}.toggleButtonDisabled_U1cX{cursor:not-allowed}.darkNavbarColorModeToggle_npDy:hover{background:var(--ifm-color-gray-800)}[data-theme=dark]:root{--docusaurus-collapse-button-bg:#ffffff0d;--docusaurus-collapse-button-bg-hover:#ffffff1a}.collapseSidebarButton_tTaE{display:none;margin:0}.iconExternalLink_bfN_{margin-left:.3rem}.docMainContainer_hwfy,.docRoot_Y0MQ{display:flex;width:100%}.docsWrapper_O5Uu{display:flex;flex:1 0 auto}.anchorWithStickyNavbar_debX{scroll-margin-top:calc(var(--ifm-navbar-height) + .5rem)}.anchorWithHideOnScrollNavbar_MBh0{scroll-margin-top:.5rem}.hash-link{opacity:0;padding-left:.5rem;transition:opacity var(--ifm-transition-fast);-webkit-user-select:none;user-select:none}.hash-link:before{content:"#"}.footerLogoLink_sUlE:hover,.hash-link:focus,:hover>.hash-link{opacity:1}.dropdownNavbarItemMobile_UUiP{cursor:pointer}.iconLanguage_Yxqf{margin-right:5px;vertical-align:text-bottom}.iconEdit_M1a8{margin-right:.3em;vertical-align:sub}.navbarHideable_dcaT{transition:transform var(--ifm-transition-fast) ease}.navbarHidden_LHpq{transform:translate3d(0,calc(-100% - 2px),0)}.lastUpdated_UgWq{font-size:smaller;font-style:italic;margin-top:.2rem}.tocCollapsibleButton_MtTV{align-items:center;display:flex;font-size:inherit;justify-content:space-between;padding:.4rem .8rem;width:100%}.tocCollapsibleButton_MtTV:after{background:var(--ifm-menu-link-sublist-icon) 50% 50%/2rem 2rem no-repeat;content:"";filter:var(--ifm-menu-link-sublist-icon-filter);height:1.25rem;transform:rotate(180deg);transition:transform var(--ifm-transition-fast);width:1.25rem}.tocCollapsibleButtonExpanded_VQRl:after,.tocCollapsibleExpanded_TFgA{transform:none}.tocCollapsible_Rv3I{background-color:var(--ifm-menu-color-background-active);border-radius:var(--ifm-global-radius);margin:1rem 0}.tocCollapsibleContent_XFsF>ul{border-left:none;border-top:1px solid var(--ifm-color-emphasis-300);font-size:15px;padding:.2rem 0}.tocCollapsibleContent_XFsF ul li{margin:.4rem .8rem}.navbar__items--right>:last-child{padding-right:0}.errorBoundaryError_iQOE{color:red;white-space:pre-wrap}.errorBoundaryFallback_FOml{color:red;padding:.55rem}body:not(.navigation-with-keyboard) :not(input):focus{outline:0}.footerLogoLink_sUlE{opacity:.5;transition:opacity var(--ifm-transition-fast) var(--ifm-transition-timing-default)}.mainWrapper_c5No{display:flex;flex:1 0 auto;flex-direction:column}.docusaurus-mt-lg{margin-top:3rem}#__docusaurus{display:flex;flex-direction:column;min-height:100%}.searchQueryInput_IMhk,.searchVersionInput_mtTg{background:var(--docsearch-searchbox-focus-background);border:2px solid var(--ifm-toc-border-color);border-radius:var(--ifm-global-radius);color:var(--docsearch-text-color);font:var(--ifm-font-size-base) var(--ifm-font-family-base);margin-bottom:.5rem;padding:.8rem;transition:border var(--ifm-transition-fast) ease;width:100%}.searchQueryInput_IMhk:focus,.searchVersionInput_mtTg:focus{border-color:var(--docsearch-primary-color);outline:0}.searchQueryInput_IMhk::placeholder{color:var(--docsearch-muted-color)}.searchResultsColumn_G6mq{font-size:.9rem;font-weight:700}.algoliaLogo_Cb5O{max-width:150px}.algoliaLogoPathFill_Sa0X{fill:var(--ifm-font-color-base)}.searchResultItem_kW3O{border-bottom:1px solid var(--ifm-toc-border-color);padding:1rem 0}.searchResultItemHeading_ziqy{font-weight:400;margin-bottom:0}.searchResultItemPath_fXVp{color:var(--ifm-color-content-secondary);font-size:.8rem;--ifm-breadcrumb-separator-size-multiplier:1}.searchResultItemSummary_OBXT{font-style:italic;margin:.5rem 0 0}.loadingSpinner_PO6b{animation:1s linear infinite b;border:.4em solid #eee;border-radius:50%;border-top:.4em solid var(--ifm-color-primary);height:3rem;margin:0 auto;width:3rem}@keyframes b{to{transform:rotate(1turn)}}.loader_jQCF{margin-top:2rem}.search-result-match{background:#ffd78e40;color:var(--docsearch-hit-color);padding:.09em 0}.heroBanner_UJJx{overflow:hidden;padding:4rem 0;position:relative;text-align:center}.buttons_pzbO{align-items:center;display:flex;justify-content:center}.container_czXe,.row_BFIh{display:inline-block;text-align:center;width:100%}.badges_T7Sn{padding:2rem;text-align:center}.features_keug{align-items:center;display:flex;margin:auto;padding:2rem 0;text-align:left;width:100%}.heroSlogan_kIIh{color:var(--ifm-color-white)!important;font-size:3em;line-height:normal}.gettingStartedButton_mhEX{background:#fff;color:var(--ifm-color-gray-900)!important}.buttonGroup_uSbf button,.codeBlockContainer_tyQ7{background:var(--prism-background-color);color:var(--prism-color)}.gettingStartedButton_mhEX:hover{background:#fff;color:var(--ifm-color-primary)!important}.codeBlockContainer_tyQ7{border-radius:var(--ifm-code-border-radius);box-shadow:var(--ifm-global-shadow-lw);margin-bottom:var(--ifm-leading)}.codeBlock__bzz{--ifm-pre-background:var(--prism-background-color);margin:0;padding:0}.codeBlockLines_b1Li{float:left;font:inherit;min-width:100%;padding:var(--ifm-pre-padding)}.codeBlockLinesWithNumbering_lTB5{display:table;padding:var(--ifm-pre-padding) 0}:where(:root){--docusaurus-highlighted-code-line-bg:#484d5b}:where([data-theme=dark]){--docusaurus-highlighted-code-line-bg:#646464}.theme-code-block-highlighted-line{background-color:var(--docusaurus-highlighted-code-line-bg);display:block;margin:0 calc(var(--ifm-pre-padding)*-1);padding:0 var(--ifm-pre-padding)}.codeLine_p4HS{counter-increment:a;display:table-row}.codeLineNumber_o6ZJ{background:var(--ifm-pre-background);display:table-cell;left:0;overflow-wrap:normal;padding:0 var(--ifm-pre-padding);position:sticky;text-align:right;width:1%}.codeLineNumber_o6ZJ:before{content:counter(a);opacity:.4}.codeLineContent_Z4Pr{padding-right:var(--ifm-pre-padding)}.theme-code-block:hover .copyButtonCopied_lzuF{opacity:1!important}.copyButtonIcons_Vzzk{height:1.125rem;position:relative;width:1.125rem}.copyButtonIcon_yGyI,.copyButtonSuccessIcon_Vqwn{left:0;position:absolute;top:0;fill:currentColor;height:inherit;opacity:inherit;transition:all var(--ifm-transition-fast) ease;width:inherit}.copyButtonSuccessIcon_Vqwn{color:#00d600;left:50%;opacity:0;top:50%;transform:translate(-50%,-50%) scale(.33)}.copyButtonCopied_lzuF .copyButtonIcon_yGyI{opacity:0;transform:scale(.33)}.copyButtonCopied_lzuF .copyButtonSuccessIcon_Vqwn{opacity:1;transform:translate(-50%,-50%) scale(1);transition-delay:75ms}.wordWrapButtonIcon_evTN{height:1.2rem;width:1.2rem}.buttonGroup_uSbf{column-gap:.2rem;display:flex;position:absolute;right:calc(var(--ifm-pre-padding)/2);top:calc(var(--ifm-pre-padding)/2)}.buttonGroup_uSbf button{align-items:center;border:1px solid var(--ifm-color-emphasis-300);border-radius:var(--ifm-global-radius);display:flex;line-height:0;opacity:0;padding:.4rem;transition:opacity var(--ifm-transition-fast) ease-in-out}.buttonGroup_uSbf button:focus-visible,.buttonGroup_uSbf button:hover{opacity:1!important}.theme-code-block:hover .buttonGroup_uSbf button{opacity:.4}.codeBlockContent_nOVm{border-radius:inherit;direction:ltr;position:relative}.codeBlockTitle_rVa_{border-bottom:1px solid var(--ifm-color-emphasis-300);border-top-left-radius:inherit;border-top-right-radius:inherit;font-size:var(--ifm-code-font-size);font-weight:500;padding:.75rem var(--ifm-pre-padding)}.codeBlockTitle_rVa_+.codeBlockContent_nOVm .codeBlock_F2mX{border-top-left-radius:0;border-top-right-radius:0}.details_FSmu{--docusaurus-details-summary-arrow-size:0.38rem;--docusaurus-details-transition:transform 200ms ease;--docusaurus-details-decoration-color:grey}.details_FSmu>summary{cursor:pointer;list-style:none;padding-left:1rem;position:relative}.details_FSmu>summary::-webkit-details-marker{display:none}.details_FSmu>summary:before{border-color:#0000 #0000 #0000 var(--docusaurus-details-decoration-color);border-style:solid;border-width:var(--docusaurus-details-summary-arrow-size);content:"";left:0;position:absolute;top:.45rem;transform:rotate(0);transform-origin:calc(var(--docusaurus-details-summary-arrow-size)/2) 50%;transition:var(--docusaurus-details-transition)}.collapsibleContent_uSUc{border-top:1px solid var(--docusaurus-details-decoration-color);margin-top:1rem;padding-top:1rem}.details_seRW{--docusaurus-details-decoration-color:var(--ifm-alert-border-color);--docusaurus-details-transition:transform var(--ifm-transition-fast) ease;border:1px solid var(--ifm-alert-border-color);margin:0 0 var(--ifm-spacing-vertical)}.containsTaskList_RROW{list-style:none}.img_AUsV{height:auto}.admonition_NGYd{margin-bottom:1em}.admonitionHeading_hx_a{font:var(--ifm-heading-font-weight) var(--ifm-h5-font-size)/var(--ifm-heading-line-height) var(--ifm-heading-font-family)}.admonitionHeading_hx_a:not(:last-child){margin-bottom:.3rem}.admonitionHeading_hx_a code{text-transform:none}.admonitionIcon_n04r{display:inline-block;margin-right:.4em;vertical-align:middle}.admonitionIcon_n04r svg{display:inline-block;height:1.6em;width:1.6em;fill:var(--ifm-alert-foreground-color)}.tableOfContents_baz9{max-height:calc(100vh - var(--ifm-navbar-height) - 2rem);overflow-y:auto;position:sticky;top:calc(var(--ifm-navbar-height) + 1rem)}.breadcrumbHomeIcon_YiAp{height:1.1rem;position:relative;top:1px;vertical-align:top;width:1.1rem}.breadcrumbsContainer_yRvd{--ifm-breadcrumb-size-multiplier:0.8;margin-bottom:.8rem}.mdxPageWrapper_L88T{justify-content:center}@media (min-width:997px){.collapseSidebarButton_tTaE,.expandButton_Chnj{background-color:var(--docusaurus-collapse-button-bg)}:root{--docusaurus-announcement-bar-height:30px}.announcementBarClose_kfzw,.announcementBarPlaceholder_vZsE{flex-basis:50px}.collapseSidebarButton_tTaE{border:1px solid var(--ifm-toc-border-color);border-radius:0;bottom:0;display:block!important;height:40px;position:sticky}.collapseSidebarButtonIcon_aVw4{margin-top:4px;transform:rotate(180deg)}.expandButtonIcon_ukA1,[dir=rtl] .collapseSidebarButtonIcon_aVw4{transform:rotate(0)}.collapseSidebarButton_tTaE:focus,.collapseSidebarButton_tTaE:hover,.expandButton_Chnj:focus,.expandButton_Chnj:hover{background-color:var(--docusaurus-collapse-button-bg-hover)}.menuHtmlItem_SDir{padding:var(--ifm-menu-link-padding-vertical) var(--ifm-menu-link-padding-horizontal)}.menu_Ug5w{flex-grow:1;padding:.5rem}@supports (scrollbar-gutter:stable){.menu_Ug5w{padding:.5rem 0 .5rem .5rem;scrollbar-gutter:stable}}.menuWithAnnouncementBar_U9It{margin-bottom:var(--docusaurus-announcement-bar-height)}.sidebar_kIjR{display:flex;flex-direction:column;height:100%;padding-top:var(--ifm-navbar-height);width:var(--doc-sidebar-width)}.sidebarWithHideableNavbar_BO_l{padding-top:0}.sidebarHidden_XfJk{opacity:0;visibility:hidden}.sidebarLogo_ag23{align-items:center;color:inherit!important;display:flex!important;margin:0 var(--ifm-navbar-padding-horizontal);max-height:var(--ifm-navbar-height);min-height:var(--ifm-navbar-height);-webkit-text-decoration:none!important;text-decoration:none!important}.sidebarLogo_ag23 img{height:2rem;margin-right:.5rem}.expandButton_Chnj{align-items:center;display:flex;height:100%;justify-content:center;position:absolute;right:0;top:0;transition:background-color var(--ifm-transition-fast) ease;width:100%}[dir=rtl] .expandButtonIcon_ukA1{transform:rotate(180deg)}.docSidebarContainer_LiYE{border-right:1px solid var(--ifm-toc-border-color);clip-path:inset(0);display:block;margin-top:calc(var(--ifm-navbar-height)*-1);transition:width var(--ifm-transition-fast) ease;width:var(--doc-sidebar-width);will-change:width}.docSidebarContainerHidden_FBNp{cursor:pointer;width:var(--doc-sidebar-hidden-width)}.sidebarViewport_yu1D{height:100%;max-height:100vh;position:sticky;top:0}.docMainContainer_hwfy{flex-grow:1;max-width:calc(100% - var(--doc-sidebar-width))}.docMainContainerEnhanced_Aqm8{max-width:calc(100% - var(--doc-sidebar-hidden-width))}.docItemWrapperEnhanced_MOcI{max-width:calc(var(--ifm-container-width) + var(--doc-sidebar-width))!important}.navbarSearchContainer_WjZK{padding:var(--ifm-navbar-item-padding-vertical) var(--ifm-navbar-item-padding-horizontal)}.lastUpdated_UgWq{text-align:right}.tocMobile_HJNs{display:none}.docItemCol_oWXt{max-width:75%!important}}@media (min-width:1440px){.container{max-width:var(--ifm-container-width-xl)}}@media (max-width:996px){.col{--ifm-col-width:100%;flex-basis:var(--ifm-col-width);margin-left:0}.footer{--ifm-footer-padding-horizontal:0}.colorModeToggle_Bfwy,.footer__link-separator,.navbar__item,.tableOfContents_baz9{display:none}.footer__col{margin-bottom:calc(var(--ifm-spacing-vertical)*3)}.footer__link-item{display:block;width:max-content}.hero{padding-left:0;padding-right:0}.navbar>.container,.navbar>.container-fluid{padding:0}.navbar__toggle{display:inherit}.navbar__search-input{width:9rem}.pills--block,.tabs--block{flex-direction:column}.navbarSearchContainer_WjZK{position:absolute;right:var(--ifm-navbar-padding-horizontal)}.docItemContainer_jSd8{padding:0 .3rem}}@media only screen and (max-width:996px){.searchQueryColumn_p4Tk,.searchResultsColumn_G6mq{max-width:60%!important}.searchLogoColumn_dlOk,.searchVersionColumn_rmXB{max-width:40%!important}.searchLogoColumn_dlOk{padding-left:0!important}}@media screen and (max-width:966px){.heroBanner_UJJx{padding:2rem}}@media (max-width:768px){.DocSearch-Button-Keys,.DocSearch-Button-Placeholder,.DocSearch-Commands,.DocSearch-Hit-Tree{display:none}:root{--docsearch-spacing:10px;--docsearch-footer-height:40px}.DocSearch-Dropdown{height:100%;max-height:calc(var(--docsearch-vh,1vh)*100 - var(--docsearch-searchbox-height) - var(--docsearch-spacing) - var(--docsearch-footer-height))}.DocSearch-Container{height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);position:absolute}.DocSearch-Footer{border-radius:0;bottom:0;position:absolute}.DocSearch-Hit-content-wrapper{display:flex;position:relative;width:80%}.DocSearch-Modal{border-radius:0;box-shadow:none;height:100vh;height:-webkit-fill-available;height:calc(var(--docsearch-vh,1vh)*100);margin:0;max-width:100%;width:100%}.DocSearch-Cancel{appearance:none;background:none;border:0;color:var(--docsearch-highlight-color);cursor:pointer;display:inline-block;flex:none;font:inherit;font-size:1em;font-weight:500;margin-left:var(--docsearch-spacing);outline:0;overflow:hidden;padding:0;-webkit-user-select:none;user-select:none;white-space:nowrap}}@media (max-width:576px){.markdown h1:first-child{--ifm-h1-font-size:2rem}.markdown>h2{--ifm-h2-font-size:1.5rem}.markdown>h3{--ifm-h3-font-size:1.25rem}}@media screen and (max-width:576px){.searchQueryColumn_p4Tk{max-width:100%!important}.searchVersionColumn_rmXB{max-width:100%!important;padding-left:var(--ifm-spacing-horizontal)!important}}@media (hover:hover){.backToTopButton_N7e4:hover{background-color:var(--ifm-color-emphasis-300)}}@media (pointer:fine){.thin-scrollbar{scrollbar-width:thin}.thin-scrollbar::-webkit-scrollbar{height:var(--ifm-scrollbar-size);width:var(--ifm-scrollbar-size)}.thin-scrollbar::-webkit-scrollbar-track{background:var(--ifm-scrollbar-track-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb{background:var(--ifm-scrollbar-thumb-background-color);border-radius:10px}.thin-scrollbar::-webkit-scrollbar-thumb:hover{background:var(--ifm-scrollbar-thumb-hover-background-color)}}@media (prefers-reduced-motion:reduce){:root{--ifm-transition-fast:0ms;--ifm-transition-slow:0ms}}@media (prefers-reduced-motion){.DocSearch-Button-Key{transition:none}}@media screen and (prefers-reduced-motion:reduce){.DocSearch-Reset{animation:none;appearance:none;background:none;border:0;border-radius:50%;color:var(--docsearch-icon-color);cursor:pointer;right:0;stroke-width:var(--docsearch-icon-stroke-width)}.DocSearch-Hit--deleting,.DocSearch-Hit--favoriting{transition:none}.DocSearch-Hit-action-button:focus,.DocSearch-Hit-action-button:hover{background:#0003;transition:none}}@media print{.announcementBar_ExsL,.footer,.menu,.navbar,.pagination-nav,.table-of-contents,.tocMobile_HJNs{display:none}.tabs{page-break-inside:avoid}.codeBlockLines_b1Li{white-space:pre-wrap}} \ No newline at end of file diff --git a/assets/js/011d940f.6d2a3a01.js b/assets/js/011d940f.6d2a3a01.js new file mode 100644 index 0000000000..bcfe48745a --- /dev/null +++ b/assets/js/011d940f.6d2a3a01.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1536],{7357:(e,t,n)=>{n.d(t,{A:()=>o});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var s=n(23420);function o({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},33735:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.12.3/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.12.3/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/configuration.mdx","tags":[],"version":"0.12.3","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.12.3/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.3/suppressing-findings"}}');var a=n(23420),s=n(65404),o=n(83796),u=n(7357);const l={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function f(e){const t={code:"code",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(o.A,{children:[(0,a.jsx)(u.A,{value:"Kotlin",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'plugins {\n id("com.rickbusarow.module-check") version "0.12.3"\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalCodeGenerators = listOf(\n modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n name = "My Processor",\n generatorMavenCoordinates = "my-project.codegen:processor",\n annotationNames = listOf(\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(u.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'plugins {\n id \'com.rickbusarow.module-check\' version \'0.12.3\'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = [\':test:core-jvm\', \':test:core-android\']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [\':app\']\n\n additionalCodeGenerators = [\n new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n \'My Processor\',\n \'my-project.codegen:processor\',\n [\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n it.enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n it.outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n\n}\n'})})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(f,{...e})}):f(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>u});var r=n(36672);const a={},s=r.createContext(a);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:t},e.children)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),s=n(58797),o=n(85291),u=n(52245),l=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function f(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[t,n])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,s=f(e),[o,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),g=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,u.A)(()=>{g&&l(g)},[g]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var b=n(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var y=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:o}){const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,s.a_)(),i=e=>{const t=e.currentTarget,a=u.indexOf(t),s=o[a].value;s!==n&&(l(t),r(s))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:o.map(({value:e,label:t,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{u.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,y.jsx)(v,{...t,...e}),(0,y.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,y.jsx)(j,{...e,children:d(e.children)},String(t))}}}]); \ No newline at end of file diff --git a/assets/js/021c8caa.5f295dcb.js b/assets/js/021c8caa.5f295dcb.js new file mode 100644 index 0000000000..eec14c1447 --- /dev/null +++ b/assets/js/021c8caa.5f295dcb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3924],{4356:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.10.0","label":"0.10.0","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.10.0","isLast":false,"docsSidebars":{"Basics":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.10.0/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.10.0/configuration","docId":"configuration","unlisted":false}],"Rules":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.10.0/rules/unused","docId":"rules/unused","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/0.10.0/rules/redundant","docId":"rules/redundant","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/0.10.0/rules/overshot","docId":"rules/overshot","unlisted":false},{"collapsed":false,"type":"category","label":"Kapt","items":[{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor","docId":"rules/kapt/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin","docId":"rules/kapt/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers","docId":"rules/kapt/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Sorting","items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Android","items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.10.0/rules/android/disable_resources","docId":"rules/android/disable_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.10.0/rules/android/disable_viewbinding","docId":"rules/android/disable_viewbinding","unlisted":false}],"collapsible":true}]},"docs":{"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Basics"},"mdx":{"id":"mdx","title":"Powered by MDX","description":"I can write Markdown alongside my JSX!"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","sidebar":"Basics"},"rules/android/disable_resources":{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"","sidebar":"Rules"},"rules/android/disable_viewbinding":{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"","sidebar":"Rules"},"rules/kapt/custom_kapt_matchers":{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"","sidebar":"Rules"},"rules/kapt/unused_kapt_plugin":{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"","sidebar":"Rules"},"rules/kapt/unused_kapt_processor":{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"","sidebar":"Rules"},"rules/overshot":{"id":"rules/overshot","title":"Overshot Dependency","description":"","sidebar":"Rules"},"rules/redundant":{"id":"rules/redundant","title":"Redundant Dependency","description":"","sidebar":"Rules"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Rules"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Rules"},"rules/unused":{"id":"rules/unused","title":"Unused Dependency","description":"","sidebar":"Rules"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/02359d8a.d06fea6b.js b/assets/js/02359d8a.d06fea6b.js new file mode 100644 index 0000000000..8a4f47853e --- /dev/null +++ b/assets/js/02359d8a.d06fea6b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5859],{18184:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","source":"@site/versioned_docs/version-0.12.5/rules/redundant_dependency.md","sourceDirName":"rules","slug":"/rules/redundant_dependency","permalink":"/ModuleCheck/docs/rules/redundant_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/redundant_dependency.md","tags":[],"version":"0.12.5","frontMatter":{"id":"redundant_dependency","slug":"/rules/redundant_dependency","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/rules/inherited_dependency"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/rules/overshot_dependency"}}');var i=d(23420),s=d(65404);const r={id:"redundant_dependency",slug:"/rules/redundant_dependency",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},a=void 0,l={},c=[];function o(e){const n={a:"a",admonition:"admonition",code:"code",mermaid:"mermaid",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.p,{children:"This rule creates a brittle dependency graph, because some necessary dependencies are only provided\ntransitively by other dependencies. Any manual changes to dependencies can have unexpected\nconsequences downstream."}),(0,i.jsxs)(n.p,{children:["This rule is ",(0,i.jsx)(n.strong,{children:"not recommended"})," and disabled by default, but it's still available for those who\nwant to keep their build files as small as possible."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finds project dependencies which are declared as ",(0,i.jsx)(n.code,{children:"api"})," in other dependency projects, but also\ndeclared in the current project. These dependencies can be removed without actually breaking the\nbuild, since they're still provided by an upstream dependency through the ",(0,i.jsx)(n.code,{children:"api"})," configuration."]}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n subgraph sg_redundant [A redundant graph]\n direction TB\n\n lib1_redundant(:lib-1):::depth0\n lib2_redundant(:lib-2):::depth1\n app_redundant(:app):::depth2\n\n app_redundant --\x3e |api| lib1_redundant\n app_redundant --\x3e |api| lib2_redundant\n\n lib2_redundant --\x3e |api| lib1_redundant\n end\n\n subgraph sg_minimalist [A graph with no redundancy]\n direction TB\n\n lib1_minimalist(:lib-1):::depth0\n lib2_minimalist(:lib-2):::depth1\n app_minimalist(:app):::depth2\n\n app_minimalist --\x3e |api| lib2_minimalist\n\n lib2_minimalist --\x3e |api| lib1_minimalist\n end\n\n style sg_redundant fill:#C66,stroke:#000,color:#FFF\n style sg_minimalist fill:#696,stroke:#000,color:#FFF\n\n sg_redundant --\x3e |./gradlew moduleCheck| sg_minimalist\n"}),"\n",(0,i.jsxs)(n.p,{children:["This is the opposite of the ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/rules/inherited_dependency",children:"inherited dependency"})," rule, which ensures a stable graph by explicitly\ndeclaring each dependency. ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/rules/inherited_dependency",children:"Inherited dependency"})," is enabled by default, and is the recommended\napproach. Both rules may not be enabled at the same time."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>r,x:()=>a});var t=d(36672);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/03459661.a5ccd375.js b/assets/js/03459661.a5ccd375.js new file mode 100644 index 0000000000..a6c6a2f9dd --- /dev/null +++ b/assets/js/03459661.a5ccd375.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9335],{38611:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>a,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","source":"@site/versioned_docs/version-0.12.5/rules/overshot_dependency.md","sourceDirName":"rules","slug":"/rules/overshot_dependency","permalink":"/ModuleCheck/docs/rules/overshot_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/overshot_dependency.md","tags":[],"version":"0.12.5","frontMatter":{"id":"overshot_dependency","slug":"/rules/overshot_dependency","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Docs","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/rules/redundant_dependency"},"next":{"title":"Project Depth","permalink":"/ModuleCheck/docs/rules/project_depth"}}');var o=t(23420),d=t(65404);const r={id:"overshot_dependency",slug:"/rules/overshot_dependency",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},c=void 0,i={},l=[];function u(e){const n={code:"code",em:"em",p:"p",pre:"pre",strong:"strong",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"Finds project dependencies which aren't used by the declaring configuration, but are used by a\ndependent, downstream configuration."}),"\n",(0,o.jsxs)(n.p,{children:["For instance, assume that ",(0,o.jsx)(n.code,{children:":moduleB"})," declares an ",(0,o.jsx)(n.code,{children:"implementation"})," dependency upon ",(0,o.jsx)(n.code,{children:":moduleA"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n implementation(project(":moduleA"))\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:":moduleB"})," doesn't actually use ",(0,o.jsx)(n.code,{children:":moduleA"})," in its ",(0,o.jsx)(n.code,{children:"main"})," source, but it ",(0,o.jsx)(n.em,{children:"does"})," use it in ",(0,o.jsx)(n.code,{children:"test"}),"\nsource, it's an ",(0,o.jsx)(n.strong,{children:"overshot dependency"}),". The declaration should be changed to\nuse ",(0,o.jsx)(n.code,{children:"testImplementation"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n testImplementation(project(":moduleA"))\n}\n'})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var s=t(36672);const o={},d=s.createContext(o);function r(e){const n=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/044a6187.858142cb.js b/assets/js/044a6187.858142cb.js new file mode 100644 index 0000000000..0367afe526 --- /dev/null +++ b/assets/js/044a6187.858142cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2370],{28850:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.12.4/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/0.12.4/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/ci_workflow.md","tags":[],"version":"0.12.4","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.4/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_dependency"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheckAuto):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew moduleCheckAuto --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/048b8cd8.15bd0619.js b/assets/js/048b8cd8.15bd0619.js new file mode 100644 index 0000000000..ca62c6d8db --- /dev/null +++ b/assets/js/048b8cd8.15bd0619.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6150],{26704:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>i,contentTitle:()=>r,default:()=>a,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.11.0/rules/unused.md","sourceDirName":"rules","slug":"/rules/unused","permalink":"/ModuleCheck/docs/0.11.0/rules/unused","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/unused.md","tags":[],"version":"0.11.0","frontMatter":{"id":"unused","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.0/configuration"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.0/rules/must_be_api"}}');var d=s(23420),u=s(65404);const o={id:"unused",title:"Unused Dependency",sidebar_label:"Unused Dependency"},r=void 0,i={},c=[];function l(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,d.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>r});var t=s(36672);const d={},u=t.createContext(d);function o(e){const n=t.useContext(u);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:o(e.components),t.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/051962a1.4cc7a7f7.js b/assets/js/051962a1.4cc7a7f7.js new file mode 100644 index 0000000000..b175190bad --- /dev/null +++ b/assets/js/051962a1.4cc7a7f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4094],{33107:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.12.2/rules/compiler/unused_kapt_processor.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/compiler/unused_kapt_processor.md","tags":[],"version":"0.12.2","frontMatter":{"id":"unused_kapt_processor","slug":"/rules/unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin"}}');var t=s(23420),r=s(65404);const i={id:"unused_kapt_processor",slug:"/rules/unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,c={},d=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(36672);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/05d123c0.6460c759.js b/assets/js/05d123c0.6460c759.js new file mode 100644 index 0000000000..4c7727f63f --- /dev/null +++ b/assets/js/05d123c0.6460c759.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7155],{7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const s={tabItem:"tabItem_qogc"};var a=t(23420);function i({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},21637:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>u,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/versioned_docs/version-0.11.3/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/0.11.3/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/suppressing-findings.mdx","tags":[],"version":"0.11.3","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.3/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.11.3/ci-workflow"}}');var s=t(23420),a=t(65404),i=t(83796),o=t(7357);const u={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},l=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,s.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,s.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inheritedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky mustBeApi /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unusedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{value:"Kotlin",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("mustBeApi") // don\'t switch anything to an api config\ndependencies {\n\n @Suppress("unusedDependency") // don\'t comment out or delete this dependency\n implementation(project(":unused-lib"))\n\n @Suppress("inheritedDependency") // don\'t add dependencies which are inherited from this fat jar\n implementation(project(":fat-and-leaky"))\n}\n'})})}),(0,s.jsx)(o.A,{value:"Groovy",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection mustBeApi\ndependencies {\n\n // don\'t comment out or delete this dependency\n //noinspection unusedDependency\n implementation(project(":unused-lib"))\n\n // don\'t add dependencies which are inherited from this fat jar\n //noinspection inheritedDependency\n implementation(project(":fat-and-leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},83796:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(36672),s=t(13526),a=t(58797),i=t(85291),o=t(52245),u=t(32342),l=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,l.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,u.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,a=p(e),[i,u]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[l,d]=f({queryString:t,groupId:s}),[m,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=l??m;return h({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&u(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);u(e),d(e),b(e)},[d,b,a]),tabValues:a}}var b=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:u}=(0,a.a_)(),l=e=>{const n=e.currentTarget,s=o.indexOf(n),a=i[s].value;a!==t&&(u(n),r(a))},c=e=>{let n=null;switch(e.key){case"Enter":l(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:l,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/0807349d.731308c1.js b/assets/js/0807349d.731308c1.js new file mode 100644 index 0000000000..d2148707c1 --- /dev/null +++ b/assets/js/0807349d.731308c1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4182],{62264:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>d,frontMatter:()=>s,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","source":"@site/docs/rules/compiler/use_anvil_factory_generation.md","sourceDirName":"rules/compiler","slug":"/rules/use_anvil_factory_generation","permalink":"/ModuleCheck/docs/next/rules/use_anvil_factory_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/compiler/use_anvil_factory_generation.md","tags":[],"version":"current","frontMatter":{"id":"use_anvil_factory_generation","slug":"/rules/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","sidebar_label":"Could Use Anvil Factory Generation"},"sidebar":"Docs","previous":{"title":"Project Depth","permalink":"/ModuleCheck/docs/next/rules/project_depth"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/next/rules/unused_kapt_processor"}}');var r=t(23420),i=t(65404);const s={id:"use_anvil_factory_generation",slug:"/rules/use_anvil_factory_generation",title:"Could Use Anvil Factory Generation",sidebar_label:"Could Use Anvil Factory Generation"},a=void 0,l={},c=[];function u(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or\nSubcomponents, and it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function d(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>s,x:()=>a});var o=t(36672);const r={},i=o.createContext(r);function s(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/09b50579.52f3f328.js b/assets/js/09b50579.52f3f328.js new file mode 100644 index 0000000000..bde7efea90 --- /dev/null +++ b/assets/js/09b50579.52f3f328.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[228],{38331:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>t,metadata:()=>d,toc:()=>l});const d=JSON.parse('{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.11.2/rules/android/disable_viewbinding.md","sourceDirName":"rules/android","slug":"/rules/android/disable_viewbinding","permalink":"/ModuleCheck/docs/0.11.2/rules/android/disable_viewbinding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/android/disable_viewbinding.md","tags":[],"version":"0.11.2","frontMatter":{"id":"disable_viewbinding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.2/rules/android/disable_resources"}}');var s=i(23420),o=i(65404);const t={id:"disable_viewbinding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,a={},l=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>r});var d=i(36672);const s={},o=d.createContext(s);function t(e){const n=d.useContext(o);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),d.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/0b199b14.369b6927.js b/assets/js/0b199b14.369b6927.js new file mode 100644 index 0000000000..6a44f6919d --- /dev/null +++ b/assets/js/0b199b14.369b6927.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8321],{65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var s=t(36672);const o={},d=s.createContext(o);function r(e){const n=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(d.Provider,{value:n},e.children)}},91906:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>a,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","source":"@site/versioned_docs/version-0.12.4/rules/overshot_dependency.md","sourceDirName":"rules","slug":"/rules/overshot_dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/overshot_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/overshot_dependency.md","tags":[],"version":"0.12.4","frontMatter":{"id":"overshot_dependency","slug":"/rules/overshot_dependency","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Docs","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/redundant_dependency"},"next":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.4/rules/project_depth"}}');var o=t(23420),d=t(65404);const r={id:"overshot_dependency",slug:"/rules/overshot_dependency",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},c=void 0,i={},l=[];function u(e){const n={code:"code",em:"em",p:"p",pre:"pre",strong:"strong",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"Finds project dependencies which aren't used by the declaring configuration, but are used by a\ndependent, downstream configuration."}),"\n",(0,o.jsxs)(n.p,{children:["For instance, assume that ",(0,o.jsx)(n.code,{children:":moduleB"})," declares an ",(0,o.jsx)(n.code,{children:"implementation"})," dependency upon ",(0,o.jsx)(n.code,{children:":moduleA"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n implementation(project(":moduleA"))\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:":moduleB"})," doesn't actually use ",(0,o.jsx)(n.code,{children:":moduleA"})," in its ",(0,o.jsx)(n.code,{children:"main"})," source, but it ",(0,o.jsx)(n.em,{children:"does"})," use it in ",(0,o.jsx)(n.code,{children:"test"}),"\nsource, it's an ",(0,o.jsx)(n.strong,{children:"overshot dependency"}),". The declaration should be changed to\nuse ",(0,o.jsx)(n.code,{children:"testImplementation"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n testImplementation(project(":moduleA"))\n}\n'})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/0f29fa4c.fc3b20a4.js b/assets/js/0f29fa4c.fc3b20a4.js new file mode 100644 index 0000000000..0063c65ec2 --- /dev/null +++ b/assets/js/0f29fa4c.fc3b20a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[646],{65404:(e,n,d)=>{d.d(n,{R:()=>r,x:()=>a});var t=d(36672);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}},93589:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","source":"@site/versioned_docs/version-0.12.2/rules/redundant_dependency.md","sourceDirName":"rules","slug":"/rules/redundant_dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/redundant_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/redundant_dependency.md","tags":[],"version":"0.12.2","frontMatter":{"id":"redundant_dependency","slug":"/rules/redundant_dependency","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/inherited_dependency"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/overshot_dependency"}}');var i=d(23420),s=d(65404);const r={id:"redundant_dependency",slug:"/rules/redundant_dependency",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},a=void 0,l={},c=[];function o(e){const n={a:"a",admonition:"admonition",code:"code",mermaid:"mermaid",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.p,{children:"This rule creates a brittle dependency graph, because some necessary dependencies are only provided\ntransitively by other dependencies. Any manual changes to dependencies can have unexpected\nconsequences downstream."}),(0,i.jsxs)(n.p,{children:["This rule is ",(0,i.jsx)(n.strong,{children:"not recommended"})," and disabled by default, but it's still available for those who\nwant to keep their build files as small as possible."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finds project dependencies which are declared as ",(0,i.jsx)(n.code,{children:"api"})," in other dependency projects, but also\ndeclared in the current project. These dependencies can be removed without actually breaking the\nbuild, since they're still provided by an upstream dependency through the ",(0,i.jsx)(n.code,{children:"api"})," configuration."]}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n subgraph sg_redundant [A redundant graph]\n direction TB\n\n lib1_redundant(:lib-1):::depth0\n lib2_redundant(:lib-2):::depth1\n app_redundant(:app):::depth2\n\n app_redundant --\x3e |api| lib1_redundant\n app_redundant --\x3e |api| lib2_redundant\n\n lib2_redundant --\x3e |api| lib1_redundant\n end\n\n subgraph sg_minimalist [A graph with no redundancy]\n direction TB\n\n lib1_minimalist(:lib-1):::depth0\n lib2_minimalist(:lib-2):::depth1\n app_minimalist(:app):::depth2\n\n app_minimalist --\x3e |api| lib2_minimalist\n\n lib2_minimalist --\x3e |api| lib1_minimalist\n end\n\n style sg_redundant fill:#C66,stroke:#000,color:#FFF\n style sg_minimalist fill:#696,stroke:#000,color:#FFF\n\n sg_redundant --\x3e |./gradlew moduleCheck| sg_minimalist\n"}),"\n",(0,i.jsxs)(n.p,{children:["This is the opposite of the ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.2/rules/inherited_dependency",children:"inherited dependency"})," rule, which ensures a stable graph by explicitly\ndeclaring each dependency. ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.2/rules/inherited_dependency",children:"Inherited dependency"})," is enabled by default, and is the recommended\napproach. Both rules may not be enabled at the same time."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/assets/js/0fc8e5d5.38475e52.js b/assets/js/0fc8e5d5.38475e52.js new file mode 100644 index 0000000000..39fae73e23 --- /dev/null +++ b/assets/js/0fc8e5d5.38475e52.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4931],{65404:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>c});var n=s(36672);const r={},o=n.createContext(r);function i(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:t},e.children)}},84835:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.12.5/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sort_dependencies","permalink":"/ModuleCheck/docs/rules/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/sorting/sort_dependencies.md","tags":[],"version":"0.12.5","frontMatter":{"id":"sort_dependencies","slug":"/rules/sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/rules/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/rules/sort_plugins"}}');var r=s(23420),o=s(65404);const i={id:"sort_dependencies",slug:"/rules/sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l()}}}]); \ No newline at end of file diff --git a/assets/js/1050d62e.a0a1b37a.js b/assets/js/1050d62e.a0a1b37a.js new file mode 100644 index 0000000000..1db5b377d9 --- /dev/null +++ b/assets/js/1050d62e.a0a1b37a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[998],{7357:(e,n,r)=>{r.d(n,{A:()=>l});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var s=r(23420);function l({children:e,hidden:n,className:r}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},65404:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>o});var t=r(36672);const a={},s=t.createContext(a);function l(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(s.Provider,{value:n},e.children)}},67373:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"Dependencies","source":"@site/versioned_docs/version-0.12.2/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.12.2/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/quickstart.mdx","tags":[],"version":"0.12.2","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.2/configuration"}}');var a=r(23420),s=r(65404),l=r(83796),o=r(7357);const c={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},i=void 0,u={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven("https://oss.sonatype.org/content/repositories/snapshots/")\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.12.2"\n}\n'})})]}),(0,a.jsxs)(o.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven {\n url "https://oss.sonatype.org/content/repositories/snapshots"\n }\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.12.2'\n}\n"})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,a.jsx)(n.p,{children:"all checks"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,a.jsx)(n.p,{children:"all checks with auto-correct"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"check sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,a.jsx)(n.p,{children:"apply sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"report depths of each module"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckDepths\n"})}),"\n",(0,a.jsx)(n.p,{children:"generate (module-only) dependency graphs"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckGraphs\n"})}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.2/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},83796:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(36672),a=r(13526),s=r(58797),l=r(85291),o=r(52245),c=r(32342),i=r(45223),u=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,i.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,s=h(e),[l,c]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s})),[i,d]=g({queryString:r,groupId:a}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{b&&c(b)},[b]);return{selectedValue:l,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);c(e),d(e),f(e)},[d,f,s]),tabValues:s}}var f=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:t,tabValues:l}){const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),i=e=>{const n=e.currentTarget,a=o.indexOf(n),s=l[a].value;s!==r&&(c(n),t(s))},u=e=>{let n=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:u,onClick:i,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/107eb4cc.38fc2a4d.js b/assets/js/107eb4cc.38fc2a4d.js new file mode 100644 index 0000000000..b46a26ccf8 --- /dev/null +++ b/assets/js/107eb4cc.38fc2a4d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[832],{55325:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>d,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","source":"@site/versioned_docs/version-0.12.3/rules/android/unused_kotlin_android_extensions.md","sourceDirName":"rules/android","slug":"/rules/unused_kotlin_android_extensions","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/android/unused_kotlin_android_extensions.md","tags":[],"version":"0.12.3","frontMatter":{"id":"unused_kotlin_android_extensions","slug":"/rules/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","sidebar_label":"Unused Kotlin Android Extensions"},"sidebar":"Docs","previous":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.3/rules/disable_view_binding"}}');var t=s(23420),i=s(65404);const d={id:"unused_kotlin_android_extensions",slug:"/rules/unused_kotlin_android_extensions",title:"Unused Kotlin Android Extensions",sidebar_label:"Unused Kotlin Android Extensions"},r=void 0,u={},l=[];function a(e){const n={p:"p",...(0,i.R)(),...e.components};return(0,t.jsx)(n.p,{children:"Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any\nsynthetic imports or deprecated @Parcelize annotation"})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>r});var o=s(36672);const t={},i=o.createContext(t);function d(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/109fab02.1304204c.js b/assets/js/109fab02.1304204c.js new file mode 100644 index 0000000000..af69d53d03 --- /dev/null +++ b/assets/js/109fab02.1304204c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5142],{65404:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var o=s(36672);const t={},i=o.createContext(t);function r(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(i.Provider,{value:n},e.children)}},91647:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.11.0/rules/kapt/unused_kapt_processor.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/kapt/unused_kapt_processor.md","tags":[],"version":"0.11.0","frontMatter":{"id":"unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin"}}');var t=s(23420),i=s(65404);const r={id:"unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,d={},c=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/10b686c7.ac7f610a.js b/assets/js/10b686c7.ac7f610a.js new file mode 100644 index 0000000000..b906fb2195 --- /dev/null +++ b/assets/js/10b686c7.ac7f610a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6720],{65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var s=t(36672);const d={},o=s.createContext(d);function r(e){const n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),s.createElement(o.Provider,{value:n},e.children)}},73236:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","source":"@site/versioned_docs/version-0.12.0/rules/overshot_dependency.md","sourceDirName":"rules","slug":"/rules/overshot_dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/overshot_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/overshot_dependency.md","tags":[],"version":"0.12.0","frontMatter":{"id":"overshot_dependency","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Docs","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/redundant_dependency"},"next":{"title":"Depths","permalink":"/ModuleCheck/docs/0.12.0/rules/depths"}}');var d=t(23420),o=t(65404);const r={id:"overshot_dependency",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},c=void 0,i={},l=[];function a(e){const n={code:"code",em:"em",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:"Finds project dependencies which aren't used by the declaring configuration, but are used by a\ndependent, downstream configuration."}),"\n",(0,d.jsxs)(n.p,{children:["For instance, assume that ",(0,d.jsx)(n.code,{children:":moduleB"})," declares an ",(0,d.jsx)(n.code,{children:"implementation"})," dependency upon ",(0,d.jsx)(n.code,{children:":moduleA"}),"."]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n implementation(project(":moduleA"))\n}\n'})}),"\n",(0,d.jsxs)(n.p,{children:["If ",(0,d.jsx)(n.code,{children:":moduleB"})," doesn't actually use ",(0,d.jsx)(n.code,{children:":moduleA"})," in its ",(0,d.jsx)(n.code,{children:"main"})," source, but it ",(0,d.jsx)(n.em,{children:"does"})," use it in ",(0,d.jsx)(n.code,{children:"test"}),"\nsource, it's an ",(0,d.jsx)(n.strong,{children:"overshot dependency"}),". The declaration should be changed to\nuse ",(0,d.jsx)(n.code,{children:"testImplementation"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n testImplementation(project(":moduleA"))\n}\n'})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/12b0e932.46e840ec.js b/assets/js/12b0e932.46e840ec.js new file mode 100644 index 0000000000..4f1f23c916 --- /dev/null +++ b/assets/js/12b0e932.46e840ec.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8561],{27594:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.11.2/rules/android/disable_resources.md","sourceDirName":"rules/android","slug":"/rules/android/disable_resources","permalink":"/ModuleCheck/docs/0.11.2/rules/android/disable_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/android/disable_resources.md","tags":[],"version":"0.11.2","frontMatter":{"id":"disable_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.11.2/rules/android/disable_viewbinding"}}');var o=r(23420),d=r(65404);const i={id:"disable_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,c={},a=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1483dc01.4a6793d2.js b/assets/js/1483dc01.4a6793d2.js new file mode 100644 index 0000000000..30d9223bbb --- /dev/null +++ b/assets/js/1483dc01.4a6793d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1949],{58572:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>l,frontMatter:()=>o,metadata:()=>d,toc:()=>a});const d=JSON.parse('{"id":"rules/redundant","title":"Redundant Dependency","description":"","source":"@site/versioned_docs/version-0.10.0/rules/redundant.md","sourceDirName":"rules","slug":"/rules/redundant","permalink":"/ModuleCheck/docs/0.10.0/rules/redundant","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/redundant.md","tags":[],"version":"0.10.0","frontMatter":{"id":"redundant","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Rules","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.10.0/rules/unused"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.10.0/rules/overshot"}}');var r=t(23420),s=t(65404);const o={id:"redundant",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},u=void 0,c={},a=[];function i(e){return(0,r.jsx)(r.Fragment,{})}function l(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(i,{...e})}):i()}},65404:(e,n,t)=>{t.d(n,{R:()=>o,x:()=>u});var d=t(36672);const r={},s=d.createContext(r);function o(e){const n=d.useContext(s);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function u(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:o(e.components),d.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/14e1fcc3.79e08407.js b/assets/js/14e1fcc3.79e08407.js new file mode 100644 index 0000000000..ac853bb071 --- /dev/null +++ b/assets/js/14e1fcc3.79e08407.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8305],{18164:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.10.0/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_dependencies","permalink":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/sorting/sort_dependencies.md","tags":[],"version":"0.10.0","frontMatter":{"id":"sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Rules","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins"}}');var o=n(23420),r=n(65404);const i={id:"sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l()}},65404:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(36672);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/150ef1cb.34b3cc1d.js b/assets/js/150ef1cb.34b3cc1d.js new file mode 100644 index 0000000000..96c3d3be4b --- /dev/null +++ b/assets/js/150ef1cb.34b3cc1d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9384],{65404:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var t=o(36672);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}},84007:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.12.1/rules/compiler/use_anvil_factory_generation.md","sourceDirName":"rules/compiler","slug":"/rules/use_anvil_factory_generation","permalink":"/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/compiler/use_anvil_factory_generation.md","tags":[],"version":"0.12.1","frontMatter":{"id":"use_anvil_factory_generation","slug":"/rules/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","sidebar_label":"Could Use Anvil Factory Generation"},"sidebar":"Docs","previous":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.1/rules/project_depth"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor"}}');var r=o(23420),i=o(65404);const s={id:"use_anvil_factory_generation",slug:"/rules/use_anvil_factory_generation",title:"Could Use Anvil Factory Generation",sidebar_label:"Could Use Anvil Factory Generation"},a=void 0,l={},c=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or\nSubcomponents, and it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/1556.8cf5a342.js b/assets/js/1556.8cf5a342.js new file mode 100644 index 0000000000..5eb545d332 --- /dev/null +++ b/assets/js/1556.8cf5a342.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1556],{31556:(t,e,s)=>{s.d(e,{Zk:()=>l,q7:()=>K,tM:()=>rt,u4:()=>nt});var i=s(91544),n=s(44533),r=s(80284),o=s(9420),a=s(97485),c=function(){var t=(0,a.K2)(function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s},"o"),e=[1,2],s=[1,3],i=[1,4],n=[2,4],r=[1,9],o=[1,11],c=[1,16],l=[1,17],h=[1,18],d=[1,19],u=[1,33],p=[1,20],y=[1,21],g=[1,22],m=[1,23],f=[1,24],S=[1,26],k=[1,27],b=[1,28],_=[1,29],T=[1,30],E=[1,31],D=[1,32],x=[1,35],C=[1,36],$=[1,37],v=[1,38],I=[1,34],A=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],L=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],w=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],R={trace:(0,a.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NL:5,SD:6,document:7,line:8,statement:9,classDefStatement:10,styleStatement:11,cssClassStatement:12,idStatement:13,DESCR:14,"--\x3e":15,HIDE_EMPTY:16,scale:17,WIDTH:18,COMPOSIT_STATE:19,STRUCT_START:20,STRUCT_STOP:21,STATE_DESCR:22,AS:23,ID:24,FORK:25,JOIN:26,CHOICE:27,CONCURRENT:28,note:29,notePosition:30,NOTE_TEXT:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,CLICK:38,STRING:39,HREF:40,classDef:41,CLASSDEF_ID:42,CLASSDEF_STYLEOPTS:43,DEFAULT:44,style:45,STYLE_IDS:46,STYLEDEF_STYLEOPTS:47,class:48,CLASSENTITY_IDS:49,STYLECLASS:50,direction_tb:51,direction_bt:52,direction_rl:53,direction_lr:54,eol:55,";":56,EDGE_STATE:57,STYLE_SEPARATOR:58,left_of:59,right_of:60,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"--\x3e",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:(0,a.K2)(function(t,e,s,i,n,r,o){var a=r.length-1;switch(n){case 3:return i.setRootDoc(r[a]),r[a];case 4:this.$=[];break;case 5:"nl"!=r[a]&&(r[a-1].push(r[a]),this.$=r[a-1]);break;case 6:case 7:case 12:this.$=r[a];break;case 8:this.$="nl";break;case 13:const t=r[a-1];t.description=i.trimColon(r[a]),this.$=t;break;case 14:this.$={stmt:"relation",state1:r[a-2],state2:r[a]};break;case 15:const e=i.trimColon(r[a]);this.$={stmt:"relation",state1:r[a-3],state2:r[a-1],description:e};break;case 19:this.$={stmt:"state",id:r[a-3],type:"default",description:"",doc:r[a-1]};break;case 20:var c=r[a],l=r[a-2].trim();if(r[a].match(":")){var h=r[a].split(":");c=h[0],l=[l,h[1]]}this.$={stmt:"state",id:c,type:"default",description:l};break;case 21:this.$={stmt:"state",id:r[a-3],type:"default",description:r[a-5],doc:r[a-1]};break;case 22:this.$={stmt:"state",id:r[a],type:"fork"};break;case 23:this.$={stmt:"state",id:r[a],type:"join"};break;case 24:this.$={stmt:"state",id:r[a],type:"choice"};break;case 25:this.$={stmt:"state",id:i.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:r[a-1].trim(),note:{position:r[a-2].trim(),text:r[a].trim()}};break;case 29:this.$=r[a].trim(),i.setAccTitle(this.$);break;case 30:case 31:this.$=r[a].trim(),i.setAccDescription(this.$);break;case 32:this.$={stmt:"click",id:r[a-3],url:r[a-2],tooltip:r[a-1]};break;case 33:this.$={stmt:"click",id:r[a-3],url:r[a-1],tooltip:""};break;case 34:case 35:this.$={stmt:"classDef",id:r[a-1].trim(),classes:r[a].trim()};break;case 36:this.$={stmt:"style",id:r[a-1].trim(),styleClass:r[a].trim()};break;case 37:this.$={stmt:"applyClass",id:r[a-1].trim(),styleClass:r[a].trim()};break;case 38:i.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 39:i.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 40:i.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 41:i.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 44:case 45:this.$={stmt:"state",id:r[a].trim(),type:"default",description:""};break;case 46:case 47:this.$={stmt:"state",id:r[a-2].trim(),classes:[r[a].trim()],type:"default",description:""}}},"anonymous"),table:[{3:1,4:e,5:s,6:i},{1:[3]},{3:5,4:e,5:s,6:i},{3:6,4:e,5:s,6:i},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],n,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:r,5:o,8:8,9:10,10:12,11:13,12:14,13:15,16:c,17:l,19:h,22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:k,37:b,38:_,41:T,45:E,48:D,51:x,52:C,53:$,54:v,57:I},t(A,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:c,17:l,19:h,22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:k,37:b,38:_,41:T,45:E,48:D,51:x,52:C,53:$,54:v,57:I},t(A,[2,7]),t(A,[2,8]),t(A,[2,9]),t(A,[2,10]),t(A,[2,11]),t(A,[2,12],{14:[1,40],15:[1,41]}),t(A,[2,16]),{18:[1,42]},t(A,[2,18],{20:[1,43]}),{23:[1,44]},t(A,[2,22]),t(A,[2,23]),t(A,[2,24]),t(A,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},t(A,[2,28]),{34:[1,49]},{36:[1,50]},t(A,[2,31]),{13:51,24:u,57:I},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},t(L,[2,44],{58:[1,56]}),t(L,[2,45],{58:[1,57]}),t(A,[2,38]),t(A,[2,39]),t(A,[2,40]),t(A,[2,41]),t(A,[2,6]),t(A,[2,13]),{13:58,24:u,57:I},t(A,[2,17]),t(w,n,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},t(A,[2,29]),t(A,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},t(A,[2,14],{14:[1,71]}),{4:r,5:o,8:8,9:10,10:12,11:13,12:14,13:15,16:c,17:l,19:h,21:[1,72],22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:k,37:b,38:_,41:T,45:E,48:D,51:x,52:C,53:$,54:v,57:I},t(A,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},t(A,[2,34]),t(A,[2,35]),t(A,[2,36]),t(A,[2,37]),t(L,[2,46]),t(L,[2,47]),t(A,[2,15]),t(A,[2,19]),t(w,n,{7:78}),t(A,[2,26]),t(A,[2,27]),{5:[1,79]},{5:[1,80]},{4:r,5:o,8:8,9:10,10:12,11:13,12:14,13:15,16:c,17:l,19:h,21:[1,81],22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:k,37:b,38:_,41:T,45:E,48:D,51:x,52:C,53:$,54:v,57:I},t(A,[2,32]),t(A,[2,33]),t(A,[2,21])],defaultActions:{5:[2,1],6:[2,2],47:[2,48],48:[2,49]},parseError:(0,a.K2)(function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)},"parseError"),parse:(0,a.K2)(function(t){var e=this,s=[0],i=[],n=[null],r=[],o=this.table,c="",l=0,h=0,d=0,u=r.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;r.push(m);var f=p.options&&p.options.ranges;function S(){var t;return"number"!=typeof(t=i.pop()||p.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,a.K2)(function(t){s.length=s.length-2*t,n.length=n.length-t,r.length=r.length-t},"popStack"),(0,a.K2)(S,"lex");for(var k,b,_,T,E,D,x,C,$,v={};;){if(_=s[s.length-1],this.defaultActions[_]?T=this.defaultActions[_]:(null==k&&(k=S()),T=o[_]&&o[_][k]),void 0===T||!T.length||!T[0]){var I="";for(D in $=[],o[_])this.terminals_[D]&&D>2&&$.push("'"+this.terminals_[D]+"'");I=p.showPosition?"Parse error on line "+(l+1)+":\n"+p.showPosition()+"\nExpecting "+$.join(", ")+", got '"+(this.terminals_[k]||k)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==k?"end of input":"'"+(this.terminals_[k]||k)+"'"),this.parseError(I,{text:p.match,token:this.terminals_[k]||k,line:p.yylineno,loc:m,expected:$})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+_+", token: "+k);switch(T[0]){case 1:s.push(k),n.push(p.yytext),r.push(p.yylloc),s.push(T[1]),k=null,b?(k=b,b=null):(h=p.yyleng,c=p.yytext,l=p.yylineno,m=p.yylloc,d>0&&d--);break;case 2:if(x=this.productions_[T[1]][1],v.$=n[n.length-x],v._$={first_line:r[r.length-(x||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(x||1)].first_column,last_column:r[r.length-1].last_column},f&&(v._$.range=[r[r.length-(x||1)].range[0],r[r.length-1].range[1]]),void 0!==(E=this.performAction.apply(v,[c,h,l,y.yy,T[1],n,r].concat(u))))return E;x&&(s=s.slice(0,-1*x*2),n=n.slice(0,-1*x),r=r.slice(0,-1*x)),s.push(this.productions_[T[1]][0]),n.push(v.$),r.push(v._$),C=o[s[s.length-2]][s[s.length-1]],s.push(C);break;case 3:return!0}}return!0},"parse")},N=function(){return{EOF:1,parseError:(0,a.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,a.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,a.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,a.K2)(function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,a.K2)(function(){return this._more=!0,this},"more"),reject:(0,a.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,a.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,a.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,a.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,a.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,a.K2)(function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1},"test_match"),next:(0,a.K2)(function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;re[0].length)){if(e=s,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,a.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,a.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,a.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,a.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,a.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,a.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,a.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,a.K2)(function(t,e,s,i){switch(s){case 0:return 38;case 1:return 40;case 2:return 39;case 3:return 44;case 4:case 45:return 51;case 5:case 46:return 52;case 6:case 47:return 53;case 7:case 48:return 54;case 8:case 9:case 11:case 12:case 13:case 14:case 57:case 59:case 65:break;case 10:case 80:return 5;case 15:case 35:return this.pushState("SCALE"),17;case 16:case 36:return 18;case 17:case 23:case 37:case 52:case 55:this.popState();break;case 18:return this.begin("acc_title"),33;case 19:return this.popState(),"acc_title_value";case 20:return this.begin("acc_descr"),35;case 21:return this.popState(),"acc_descr_value";case 22:this.begin("acc_descr_multiline");break;case 24:return"acc_descr_multiline_value";case 25:return this.pushState("CLASSDEF"),41;case 26:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 27:return this.popState(),this.pushState("CLASSDEFID"),42;case 28:return this.popState(),43;case 29:return this.pushState("CLASS"),48;case 30:return this.popState(),this.pushState("CLASS_STYLE"),49;case 31:return this.popState(),50;case 32:return this.pushState("STYLE"),45;case 33:return this.popState(),this.pushState("STYLEDEF_STYLES"),46;case 34:return this.popState(),47;case 38:this.pushState("STATE");break;case 39:case 42:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),25;case 40:case 43:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),26;case 41:case 44:return this.popState(),e.yytext=e.yytext.slice(0,-10).trim(),27;case 49:this.pushState("STATE_STRING");break;case 50:return this.pushState("STATE_ID"),"AS";case 51:case 67:return this.popState(),"ID";case 53:return"STATE_DESCR";case 54:return 19;case 56:return this.popState(),this.pushState("struct"),20;case 58:return this.popState(),21;case 60:return this.begin("NOTE"),29;case 61:return this.popState(),this.pushState("NOTE_ID"),59;case 62:return this.popState(),this.pushState("NOTE_ID"),60;case 63:this.popState(),this.pushState("FLOATING_NOTE");break;case 64:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 66:return"NOTE_TEXT";case 68:return this.popState(),this.pushState("NOTE_TEXT"),24;case 69:return this.popState(),e.yytext=e.yytext.substr(2).trim(),31;case 70:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),31;case 71:case 72:return 6;case 73:return 16;case 74:return 57;case 75:return 24;case 76:return e.yytext=e.yytext.trim(),14;case 77:return 15;case 78:return 28;case 79:return 58;case 81:return"INVALID"}},"anonymous"),rules:[/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*<>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{LINE:{rules:[12,13],inclusive:!1},struct:{rules:[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],inclusive:!1},FLOATING_NOTE_ID:{rules:[67],inclusive:!1},FLOATING_NOTE:{rules:[64,65,66],inclusive:!1},NOTE_TEXT:{rules:[69,70],inclusive:!1},NOTE_ID:{rules:[68],inclusive:!1},NOTE:{rules:[61,62,63],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[34],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[33],inclusive:!1},CLASS_STYLE:{rules:[31],inclusive:!1},CLASS:{rules:[30],inclusive:!1},CLASSDEFID:{rules:[28],inclusive:!1},CLASSDEF:{rules:[26,27],inclusive:!1},acc_descr_multiline:{rules:[23,24],inclusive:!1},acc_descr:{rules:[21],inclusive:!1},acc_title:{rules:[19],inclusive:!1},SCALE:{rules:[16,17,36,37],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[51],inclusive:!1},STATE_STRING:{rules:[52,53],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[12,13,39,40,41,42,43,44,49,50,54,55,56],inclusive:!1},ID:{rules:[12,13],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],inclusive:!0}}}}();function O(){this.yy={}}return R.lexer=N,(0,a.K2)(O,"Parser"),O.prototype=R,R.Parser=O,new O}();c.parser=c;var l=c,h="state",d="root",u="relation",p="default",y="divider",g="fill:none",m="fill: #333",f="text",S="normal",k="rect",b="rectWithTitle",_="divider",T="roundedWithTitle",E="statediagram",D=`${E}-state`,x="transition",C=`${x} note-edge`,$=`${E}-note`,v=`${E}-cluster`,I=`${E}-cluster-alt`,A="parent",L="note",w="----",R=`${w}${L}`,N=`${w}${A}`,O=(0,a.K2)((t,e="TB")=>{if(!t.doc)return e;let s=e;for(const i of t.doc)"dir"===i.stmt&&(s=i.value);return s},"getDir"),K={getClasses:(0,a.K2)(function(t,e){return e.db.getClasses()},"getClasses"),draw:(0,a.K2)(async function(t,e,s,c){a.Rm.info("REF0:"),a.Rm.info("Drawing state diagram (v2)",e);const{securityLevel:l,state:h,layout:d}=(0,a.D7)();c.db.extract(c.db.getRootDocV2());const u=c.db.getData(),p=(0,i.A)(e,l);u.type=c.type,u.layoutAlgorithm=d,u.nodeSpacing=h?.nodeSpacing||50,u.rankSpacing=h?.rankSpacing||50,u.markers=["barb"],u.diagramId=e,await(0,r.XX)(u,p);try{("function"==typeof c.db.getLinks?c.db.getLinks():new Map).forEach((t,e)=>{const s="string"==typeof e?e:"string"==typeof e?.id?e.id:"";if(!s)return void a.Rm.warn("\u26a0\ufe0f Invalid or missing stateId from key:",JSON.stringify(e));const i=p.node()?.querySelectorAll("g");let n;if(i?.forEach(t=>{const e=t.textContent?.trim();e===s&&(n=t)}),!n)return void a.Rm.warn("\u26a0\ufe0f Could not find node matching text:",s);const r=n.parentNode;if(!r)return void a.Rm.warn("\u26a0\ufe0f Node has no parent, cannot wrap:",s);const o=document.createElementNS("http://www.w3.org/2000/svg","a"),c=t.url.replace(/^"+|"+$/g,"");if(o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",c),o.setAttribute("target","_blank"),t.tooltip){const e=t.tooltip.replace(/^"+|"+$/g,"");o.setAttribute("title",e)}r.replaceChild(o,n),o.appendChild(n),a.Rm.info("\ud83d\udd17 Wrapped node in tag for:",s,t.url)})}catch(y){a.Rm.error("\u274c Error injecting clickable links:",y)}o._K.insertTitle(p,"statediagramTitleText",h?.titleTopMargin??25,c.db.getDiagramTitle()),(0,n.P)(p,8,E,h?.useMaxWidth??!0)},"draw"),getDir:O},B=new Map,F=0;function Y(t="",e=0,s="",i=w){return`state-${t}${null!==s&&s.length>0?`${i}${s}`:""}-${e}`}(0,a.K2)(Y,"stateDomId");var P=(0,a.K2)((t,e,s,i,n,r,o,c)=>{a.Rm.trace("items",e),e.forEach(e=>{switch(e.stmt){case h:case p:U(t,e,s,i,n,r,o,c);break;case u:{U(t,e.state1,s,i,n,r,o,c),U(t,e.state2,s,i,n,r,o,c);const l={id:"edge"+F,start:e.state1.id,end:e.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:g,labelStyle:"",label:a.Y2.sanitizeText(e.description??"",(0,a.D7)()),arrowheadStyle:m,labelpos:"c",labelType:f,thickness:S,classes:x,look:o};n.push(l),F++}}})},"setupDoc"),G=(0,a.K2)((t,e="TB")=>{let s=e;if(t.doc)for(const i of t.doc)"dir"===i.stmt&&(s=i.value);return s},"getDir");function j(t,e,s){if(!e.id||""===e.id||""===e.id)return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach(t=>{const i=s.get(t);i&&(e.cssCompiledStyles=[...e.cssCompiledStyles??[],...i.styles])}));const i=t.find(t=>t.id===e.id);i?Object.assign(i,e):t.push(e)}function z(t){return t?.classes?.join(" ")??""}function M(t){return t?.styles??[]}(0,a.K2)(j,"insertOrUpdateNode"),(0,a.K2)(z,"getClassesFromDbInfo"),(0,a.K2)(M,"getStylesFromDbInfo");var U=(0,a.K2)((t,e,s,i,n,r,o,c)=>{const l=e.id,h=s.get(l),d=z(h),u=M(h),E=(0,a.D7)();if(a.Rm.info("dataFetcher parsedItem",e,h,u),"root"!==l){let s=k;!0===e.start?s="stateStart":!1===e.start&&(s="stateEnd"),e.type!==p&&(s=e.type),B.get(l)||B.set(l,{id:l,shape:s,description:a.Y2.sanitizeText(l,E),cssClasses:`${d} ${D}`,cssStyles:u});const h=B.get(l);e.description&&(Array.isArray(h.description)?(h.shape=b,h.description.push(e.description)):h.description?.length&&h.description.length>0?(h.shape=b,h.description===l?h.description=[e.description]:h.description=[h.description,e.description]):(h.shape=k,h.description=e.description),h.description=a.Y2.sanitizeTextOrArray(h.description,E)),1===h.description?.length&&h.shape===b&&("group"===h.type?h.shape=T:h.shape=k),!h.type&&e.doc&&(a.Rm.info("Setting cluster for XCX",l,G(e)),h.type="group",h.isGroup=!0,h.dir=G(e),h.shape=e.type===y?_:T,h.cssClasses=`${h.cssClasses} ${v} ${r?I:""}`);const x={labelStyle:"",shape:h.shape,label:h.description,cssClasses:h.cssClasses,cssCompiledStyles:[],cssStyles:h.cssStyles,id:l,dir:h.dir,domId:Y(l,F),type:h.type,isGroup:"group"===h.type,padding:8,rx:10,ry:10,look:o};if(x.shape===_&&(x.label=""),t&&"root"!==t.id&&(a.Rm.trace("Setting node ",l," to be child of its parent ",t.id),x.parentId=t.id),x.centerLabel=!0,e.note){const t={labelStyle:"",shape:"note",label:e.note.text,cssClasses:$,cssStyles:[],cssCompiledStyles:[],id:l+R+"-"+F,domId:Y(l,F,L),type:h.type,isGroup:"group"===h.type,padding:E.flowchart?.padding,look:o,position:e.note.position},s=l+N,r={labelStyle:"",shape:"noteGroup",label:e.note.text,cssClasses:h.cssClasses,cssStyles:[],id:l+N,domId:Y(l,F,A),type:"group",isGroup:!0,padding:16,look:o,position:e.note.position};F++,r.id=s,t.parentId=s,j(i,r,c),j(i,t,c),j(i,x,c);let a=l,d=t.id;"left of"===e.note.position&&(a=t.id,d=l),n.push({id:a+"-"+d,start:a,end:d,arrowhead:"none",arrowTypeEnd:"",style:g,labelStyle:"",classes:C,arrowheadStyle:m,labelpos:"c",labelType:f,thickness:S,look:o})}else j(i,x,c)}e.doc&&(a.Rm.trace("Adding nodes children "),P(e,e.doc,s,i,n,!r,o,c))},"dataFetcher"),V=(0,a.K2)(()=>{B.clear(),F=0},"reset"),W="[*]",X="start",H="[*]",J="end",q="color",Z="fill",Q="bgFill",tt=",",et=(0,a.K2)(()=>new Map,"newClassesList"),st=(0,a.K2)(()=>({relations:[],states:new Map,documents:{}}),"newDoc"),it=(0,a.K2)(t=>JSON.parse(JSON.stringify(t)),"clone"),nt=class{constructor(t){this.version=t,this.nodes=[],this.edges=[],this.rootDoc=[],this.classes=et(),this.documents={root:st()},this.currentDocument=this.documents.root,this.startEndCount=0,this.dividerCnt=0,this.links=new Map,this.getAccTitle=a.iN,this.setAccTitle=a.SV,this.getAccDescription=a.m7,this.setAccDescription=a.EI,this.setDiagramTitle=a.ke,this.getDiagramTitle=a.ab,this.clear(),this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}static{(0,a.K2)(this,"StateDB")}static{this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3}}extract(t){this.clear(!0);for(const i of Array.isArray(t)?t:t.doc)switch(i.stmt){case h:this.addState(i.id.trim(),i.type,i.doc,i.description,i.note);break;case u:this.addRelation(i.state1,i.state2,i.description);break;case"classDef":this.addStyleClass(i.id.trim(),i.classes);break;case"style":this.handleStyleDef(i);break;case"applyClass":this.setCssClass(i.id.trim(),i.styleClass);break;case"click":this.addLink(i.id,i.url,i.tooltip)}const e=this.getStates(),s=(0,a.D7)();V(),U(void 0,this.getRootDocV2(),e,this.nodes,this.edges,!0,s.look,this.classes);for(const i of this.nodes)if(Array.isArray(i.label)){if(i.description=i.label.slice(1),i.isGroup&&i.description.length>0)throw new Error(`Group nodes can only have label. Remove the additional description for node [${i.id}]`);i.label=i.label[0]}}handleStyleDef(t){const e=t.id.trim().split(","),s=t.styleClass.split(",");for(const i of e){let t=this.getState(i);if(!t){const e=i.trim();this.addState(e),t=this.getState(e)}t&&(t.styles=s.map(t=>t.replace(/;/g,"")?.trim()))}}setRootDoc(t){a.Rm.info("Setting root doc",t),this.rootDoc=t,1===this.version?this.extract(t):this.extract(this.getRootDocV2())}docTranslator(t,e,s){if(e.stmt===u)return this.docTranslator(t,e.state1,!0),void this.docTranslator(t,e.state2,!1);if(e.stmt===h&&(e.id===W?(e.id=t.id+(s?"_start":"_end"),e.start=s):e.id=e.id.trim()),e.stmt!==d&&e.stmt!==h||!e.doc)return;const i=[];let n=[];for(const r of e.doc)if(r.type===y){const t=it(r);t.doc=it(n),i.push(t),n=[]}else n.push(r);if(i.length>0&&n.length>0){const t={stmt:h,id:(0,o.$C)(),type:"divider",doc:it(n)};i.push(it(t)),e.doc=i}e.doc.forEach(t=>this.docTranslator(e,t,!0))}getRootDocV2(){return this.docTranslator({id:d,stmt:d},{id:d,stmt:d,doc:this.rootDoc},!0),{id:d,doc:this.rootDoc}}addState(t,e=p,s=void 0,i=void 0,n=void 0,r=void 0,o=void 0,c=void 0){const l=t?.trim();if(this.currentDocument.states.has(l)){const t=this.currentDocument.states.get(l);if(!t)throw new Error(`State not found: ${l}`);t.doc||(t.doc=s),t.type||(t.type=e)}else a.Rm.info("Adding state ",l,i),this.currentDocument.states.set(l,{stmt:h,id:l,descriptions:[],type:e,doc:s,note:n,classes:[],styles:[],textStyles:[]});if(i){a.Rm.info("Setting state description",l,i);(Array.isArray(i)?i:[i]).forEach(t=>this.addDescription(l,t.trim()))}if(n){const t=this.currentDocument.states.get(l);if(!t)throw new Error(`State not found: ${l}`);t.note=n,t.note.text=a.Y2.sanitizeText(t.note.text,(0,a.D7)())}if(r){a.Rm.info("Setting state classes",l,r);(Array.isArray(r)?r:[r]).forEach(t=>this.setCssClass(l,t.trim()))}if(o){a.Rm.info("Setting state styles",l,o);(Array.isArray(o)?o:[o]).forEach(t=>this.setStyle(l,t.trim()))}if(c){a.Rm.info("Setting state styles",l,o);(Array.isArray(c)?c:[c]).forEach(t=>this.setTextStyle(l,t.trim()))}}clear(t){this.nodes=[],this.edges=[],this.documents={root:st()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=et(),t||(this.links=new Map,(0,a.IU)())}getState(t){return this.currentDocument.states.get(t)}getStates(){return this.currentDocument.states}logDocuments(){a.Rm.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}addLink(t,e,s){this.links.set(t,{url:e,tooltip:s}),a.Rm.warn("Adding link",t,e,s)}getLinks(){return this.links}startIdIfNeeded(t=""){return t===W?(this.startEndCount++,`${X}${this.startEndCount}`):t}startTypeIfNeeded(t="",e=p){return t===W?X:e}endIdIfNeeded(t=""){return t===H?(this.startEndCount++,`${J}${this.startEndCount}`):t}endTypeIfNeeded(t="",e=p){return t===H?J:e}addRelationObjs(t,e,s=""){const i=this.startIdIfNeeded(t.id.trim()),n=this.startTypeIfNeeded(t.id.trim(),t.type),r=this.startIdIfNeeded(e.id.trim()),o=this.startTypeIfNeeded(e.id.trim(),e.type);this.addState(i,n,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),this.addState(r,o,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.currentDocument.relations.push({id1:i,id2:r,relationTitle:a.Y2.sanitizeText(s,(0,a.D7)())})}addRelation(t,e,s){if("object"==typeof t&&"object"==typeof e)this.addRelationObjs(t,e,s);else if("string"==typeof t&&"string"==typeof e){const i=this.startIdIfNeeded(t.trim()),n=this.startTypeIfNeeded(t),r=this.endIdIfNeeded(e.trim()),o=this.endTypeIfNeeded(e);this.addState(i,n),this.addState(r,o),this.currentDocument.relations.push({id1:i,id2:r,relationTitle:s?a.Y2.sanitizeText(s,(0,a.D7)()):void 0})}}addDescription(t,e){const s=this.currentDocument.states.get(t),i=e.startsWith(":")?e.replace(":","").trim():e;s?.descriptions?.push(a.Y2.sanitizeText(i,(0,a.D7)()))}cleanupLabel(t){return t.startsWith(":")?t.slice(2).trim():t.trim()}getDividerId(){return this.dividerCnt++,`divider-id-${this.dividerCnt}`}addStyleClass(t,e=""){this.classes.has(t)||this.classes.set(t,{id:t,styles:[],textStyles:[]});const s=this.classes.get(t);e&&s&&e.split(tt).forEach(t=>{const e=t.replace(/([^;]*);/,"$1").trim();if(RegExp(q).exec(t)){const t=e.replace(Z,Q).replace(q,Z);s.textStyles.push(t)}s.styles.push(e)})}getClasses(){return this.classes}setCssClass(t,e){t.split(",").forEach(t=>{let s=this.getState(t);if(!s){const e=t.trim();this.addState(e),s=this.getState(e)}s?.classes?.push(e)})}setStyle(t,e){this.getState(t)?.styles?.push(e)}setTextStyle(t,e){this.getState(t)?.textStyles?.push(e)}getDirectionStatement(){return this.rootDoc.find(t=>"dir"===t.stmt)}getDirection(){return this.getDirectionStatement()?.value??"TB"}setDirection(t){const e=this.getDirectionStatement();e?e.value=t:this.rootDoc.unshift({stmt:"dir",value:t})}trimColon(t){return t.startsWith(":")?t.slice(1).trim():t.trim()}getData(){const t=(0,a.D7)();return{nodes:this.nodes,edges:this.edges,other:{},config:t,direction:O(this.getRootDocV2())}}getConfig(){return(0,a.D7)().state}},rt=(0,a.K2)(t=>`\ndefs #statediagram-barbEnd {\n fill: ${t.transitionColor};\n stroke: ${t.transitionColor};\n }\ng.stateGroup text {\n fill: ${t.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${t.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${t.stateLabelColor};\n}\n\ng.stateGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${t.transitionColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${t.background};\n border-bottom: 1px\n}\n\n.stateGroup .alt-composit {\n fill: #e0e0e0;\n border-bottom: 1px\n}\n\n.state-note {\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n\n text {\n fill: ${t.noteTextColor};\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${t.labelBackgroundColor};\n opacity: 0.5;\n}\n.edgeLabel {\n background-color: ${t.edgeLabelBackground};\n p {\n background-color: ${t.edgeLabelBackground};\n }\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n}\n.edgeLabel .label text {\n fill: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${t.stateLabelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node .fork-join {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node circle.state-end {\n fill: ${t.innerEndBackground};\n stroke: ${t.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${t.compositeBackground||t.background};\n // stroke: ${t.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${t.stateBkg||t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n.node polygon {\n fill: ${t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};;\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${t.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${t.compositeTitleBackground};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${t.stateLabelColor};\n // line-height: 1;\n}\n\n.statediagram-cluster rect.outer {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state .divider {\n stroke: ${t.stateBorder||t.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${t.compositeBackground||t.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.statediagram-cluster .inner {\n rx:0;\n ry:0;\n}\n\n.statediagram-state rect.basic {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-state rect.divider {\n stroke-dasharray: 10,10;\n fill: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${t.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${t.noteTextColor};\n}\n.statediagram .edgeLabel {\n color: red; // ${t.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${t.lineColor};\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.statediagramTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`,"getStyles")},44533:(t,e,s)=>{s.d(e,{P:()=>n});var i=s(97485),n=(0,i.K2)((t,e,s,n)=>{t.attr("class",s);const{width:a,height:c,x:l,y:h}=r(t,e);(0,i.a$)(t,c,a,n);const d=o(l,h,a,c,e);t.attr("viewBox",d),i.Rm.debug(`viewBox configured: ${d} with padding: ${e}`)},"setupViewPortForSVG"),r=(0,i.K2)((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}},"calculateDimensionsWithPadding"),o=(0,i.K2)((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`,"createViewBox")},91544:(t,e,s)=>{s.d(e,{A:()=>r});var i=s(97485),n=s(3170),r=(0,i.K2)((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)},"getDiagramElement")}}]); \ No newline at end of file diff --git a/assets/js/15a9c06b.fbed8bd4.js b/assets/js/15a9c06b.fbed8bd4.js new file mode 100644 index 0000000000..b84566907f --- /dev/null +++ b/assets/js/15a9c06b.fbed8bd4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2610],{65404:(e,n,d)=>{d.d(n,{R:()=>r,x:()=>a});var t=d(36672);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}},96911:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","source":"@site/versioned_docs/version-0.12.1/rules/redundant_dependency.md","sourceDirName":"rules","slug":"/rules/redundant_dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/redundant_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/redundant_dependency.md","tags":[],"version":"0.12.1","frontMatter":{"id":"redundant_dependency","slug":"/rules/redundant_dependency","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/inherited_dependency"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/overshot_dependency"}}');var i=d(23420),s=d(65404);const r={id:"redundant_dependency",slug:"/rules/redundant_dependency",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},a=void 0,l={},c=[];function o(e){const n={a:"a",admonition:"admonition",code:"code",mermaid:"mermaid",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.p,{children:"This rule creates a brittle dependency graph, because some necessary dependencies are only provided\ntransitively by other dependencies. Any manual changes to dependencies can have unexpected\nconsequences downstream."}),(0,i.jsxs)(n.p,{children:["This rule is ",(0,i.jsx)(n.strong,{children:"not recommended"})," and disabled by default, but it's still available for those who\nwant to keep their build files as small as possible."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finds project dependencies which are declared as ",(0,i.jsx)(n.code,{children:"api"})," in other dependency projects, but also\ndeclared in the current project. These dependencies can be removed without actually breaking the\nbuild, since they're still provided by an upstream dependency through the ",(0,i.jsx)(n.code,{children:"api"})," configuration."]}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n subgraph sg_redundant [A redundant graph]\n direction TB\n\n lib1_redundant(:lib-1):::depth0\n lib2_redundant(:lib-2):::depth1\n app_redundant(:app):::depth2\n\n app_redundant --\x3e |api| lib1_redundant\n app_redundant --\x3e |api| lib2_redundant\n\n lib2_redundant --\x3e |api| lib1_redundant\n end\n\n subgraph sg_minimalist [A graph with no redundancy]\n direction TB\n\n lib1_minimalist(:lib-1):::depth0\n lib2_minimalist(:lib-2):::depth1\n app_minimalist(:app):::depth2\n\n app_minimalist --\x3e |api| lib2_minimalist\n\n lib2_minimalist --\x3e |api| lib1_minimalist\n end\n\n style sg_redundant fill:#C66,stroke:#000,color:#FFF\n style sg_minimalist fill:#696,stroke:#000,color:#FFF\n\n sg_redundant --\x3e |./gradlew moduleCheck| sg_minimalist\n"}),"\n",(0,i.jsxs)(n.p,{children:["This is the opposite of the ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.1/rules/inherited_dependency",children:"inherited dependency"})," rule, which ensures a stable graph by explicitly\ndeclaring each dependency. ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.1/rules/inherited_dependency",children:"Inherited dependency"})," is enabled by default, and is the recommended\napproach. Both rules may not be enabled at the same time."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}}}]); \ No newline at end of file diff --git a/assets/js/171ac7cc.3780a727.js b/assets/js/171ac7cc.3780a727.js new file mode 100644 index 0000000000..b6e7a2d94b --- /dev/null +++ b/assets/js/171ac7cc.3780a727.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1273],{34673:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.11.2/rules/compiler/could_use_anvil_factory.md","sourceDirName":"rules/compiler","slug":"/rules/compiler/could_use_anvil_factory","permalink":"/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/compiler/could_use_anvil_factory.md","tags":[],"version":"0.11.2","frontMatter":{"id":"could_use_anvil_factory","title":"Could Use Anvil Factory","sidebar_label":"Could Use Anvil Factory"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.2/rules/inherited_dependency"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor"}}');var r=o(23420),s=o(65404);const i={id:"could_use_anvil_factory",title:"Could Use Anvil Factory",sidebar_label:"Could Use Anvil Factory"},c=void 0,l={},a=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents,\nand it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},65404:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(36672);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/171f1b26.5b2c51de.js b/assets/js/171f1b26.5b2c51de.js new file mode 100644 index 0000000000..0958f31388 --- /dev/null +++ b/assets/js/171f1b26.5b2c51de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6679],{28677:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.12.0/rules/kapt/custom_kapt_matchers.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/kapt/custom_kapt_matchers.md","tags":[],"version":"0.12.0","frontMatter":{"id":"custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies"}}');var o=s(23420),r=s(65404);const a={id:"custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},c=void 0,i={},u=[];function l(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,o.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>c});var n=s(36672);const o={},r=n.createContext(o);function a(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1772.bfd970d2.js b/assets/js/1772.bfd970d2.js new file mode 100644 index 0000000000..3d06157805 --- /dev/null +++ b/assets/js/1772.bfd970d2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1772],{1772:(e,r,t)=>{t.d(r,{diagram:()=>u});var a=t(31556),s=(t(91544),t(44533),t(80284),t(61923),t(290),t(49636),t(267),t(29951),t(63727),t(9420),t(97485)),u={parser:a.Zk,get db(){return new a.u4(2)},renderer:a.q7,styles:a.tM,init:(0,s.K2)(e=>{e.state||(e.state={}),e.state.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]); \ No newline at end of file diff --git a/assets/js/17896441.d6b2d810.js b/assets/js/17896441.d6b2d810.js new file mode 100644 index 0000000000..a714ac7880 --- /dev/null +++ b/assets/js/17896441.d6b2d810.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8401],{2e4:(e,t,s)=>{s.r(t),s.d(t,{default:()=>ce});var n=s(36672),a=s(6617),i=s(92471),o=s(23420);const l=n.createContext(null);function r({children:e,content:t}){const s=function(e){return(0,n.useMemo)(()=>({metadata:e.metadata,frontMatter:e.frontMatter,assets:e.assets,contentTitle:e.contentTitle,toc:e.toc}),[e])}(t);return(0,o.jsx)(l.Provider,{value:s,children:e})}function c(){const e=(0,n.useContext)(l);if(null===e)throw new i.dV("DocProvider");return e}function d(){const{metadata:e,frontMatter:t,assets:s}=c();return(0,o.jsx)(a.be,{title:e.title,description:e.description,keywords:t.keywords,image:s.image??t.image})}var u=s(13526),m=s(96320),h=s(53499),b=s(75150);function x(e){const{permalink:t,title:s,subLabel:n,isNext:a}=e;return(0,o.jsxs)(b.A,{className:(0,u.A)("pagination-nav__link",a?"pagination-nav__link--next":"pagination-nav__link--prev"),to:t,children:[n&&(0,o.jsx)("div",{className:"pagination-nav__sublabel",children:n}),(0,o.jsx)("div",{className:"pagination-nav__label",children:s})]})}function v(e){const{className:t,previous:s,next:n}=e;return(0,o.jsxs)("nav",{className:(0,u.A)(t,"pagination-nav"),"aria-label":(0,h.T)({id:"theme.docs.paginator.navAriaLabel",message:"Docs pages",description:"The ARIA label for the docs pagination"}),children:[s&&(0,o.jsx)(x,{...s,subLabel:(0,o.jsx)(h.A,{id:"theme.docs.paginator.previous",description:"The label used to navigate to the previous doc",children:"Previous"})}),n&&(0,o.jsx)(x,{...n,subLabel:(0,o.jsx)(h.A,{id:"theme.docs.paginator.next",description:"The label used to navigate to the next doc",children:"Next"}),isNext:!0})]})}function p(){const{metadata:e}=c();return(0,o.jsx)(v,{className:"docusaurus-mt-lg",previous:e.previous,next:e.next})}var g=s(56562),j=s(72408),f=s(84862),A=s(12380),_=s(40827);const N={unreleased:function({siteTitle:e,versionMetadata:t}){return(0,o.jsx)(h.A,{id:"theme.docs.versions.unreleasedVersionLabel",description:"The label used to tell the user that he's browsing an unreleased doc version",values:{siteTitle:e,versionLabel:(0,o.jsx)("b",{children:t.label})},children:"This is unreleased documentation for {siteTitle} {versionLabel} version."})},unmaintained:function({siteTitle:e,versionMetadata:t}){return(0,o.jsx)(h.A,{id:"theme.docs.versions.unmaintainedVersionLabel",description:"The label used to tell the user that he's browsing an unmaintained doc version",values:{siteTitle:e,versionLabel:(0,o.jsx)("b",{children:t.label})},children:"This is documentation for {siteTitle} {versionLabel}, which is no longer actively maintained."})}};function C(e){const t=N[e.versionMetadata.banner];return(0,o.jsx)(t,{...e})}function L({versionLabel:e,to:t,onClick:s}){return(0,o.jsx)(h.A,{id:"theme.docs.versions.latestVersionSuggestionLabel",description:"The label used to tell the user to check the latest version",values:{versionLabel:e,latestVersionLink:(0,o.jsx)("b",{children:(0,o.jsx)(b.A,{to:t,onClick:s,children:(0,o.jsx)(h.A,{id:"theme.docs.versions.latestVersionLinkLabel",description:"The label used for the latest version suggestion link label",children:"latest version"})})})},children:"For up-to-date documentation, see the {latestVersionLink} ({versionLabel})."})}function T({className:e,versionMetadata:t}){const{siteConfig:{title:s}}=(0,g.A)(),{pluginId:n}=(0,j.vT)({failfast:!0}),{savePreferredVersionName:a}=(0,A.g1)(n),{latestDocSuggestion:i,latestVersionSuggestion:l}=(0,j.HW)(n),r=i??(c=l).docs.find(e=>e.id===c.mainDocId);var c;return(0,o.jsxs)("div",{className:(0,u.A)(e,f.G.docs.docVersionBanner,"alert alert--warning margin-bottom--md"),role:"alert",children:[(0,o.jsx)("div",{children:(0,o.jsx)(C,{siteTitle:s,versionMetadata:t})}),(0,o.jsx)("div",{className:"margin-top--md",children:(0,o.jsx)(L,{versionLabel:l.label,to:r.path,onClick:()=>a(l.name)})})]})}function k({className:e}){const t=(0,_.r)();return t.banner?(0,o.jsx)(T,{className:e,versionMetadata:t}):null}function M({className:e}){const t=(0,_.r)();return t.badge?(0,o.jsx)("span",{className:(0,u.A)(e,f.G.docs.docVersionBadge,"badge badge--secondary"),children:(0,o.jsx)(h.A,{id:"theme.docs.versionBadge.label",values:{versionLabel:t.label},children:"Version: {versionLabel}"})}):null}const w={tag:"tag_pAIo",tagRegular:"tagRegular_kD8B",tagWithCount:"tagWithCount_KrMf"};function y({permalink:e,label:t,count:s,description:n}){return(0,o.jsxs)(b.A,{rel:"tag",href:e,title:n,className:(0,u.A)(w.tag,s?w.tagWithCount:w.tagRegular),children:[t,s&&(0,o.jsx)("span",{children:s})]})}const B={tags:"tags_wWOc",tag:"tag_SGXR"};function I({tags:e}){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)("b",{children:(0,o.jsx)(h.A,{id:"theme.tags.tagsListLabel",description:"The label alongside a tag list",children:"Tags:"})}),(0,o.jsx)("ul",{className:(0,u.A)(B.tags,"padding--none","margin-left--sm"),children:e.map(e=>(0,o.jsx)("li",{className:B.tag,children:(0,o.jsx)(y,{...e})},e.permalink))})]})}var H=s(71822);function V(){const{metadata:e}=c(),{editUrl:t,lastUpdatedAt:s,lastUpdatedBy:n,tags:a}=e,i=a.length>0,l=!!(t||s||n);return i||l?(0,o.jsxs)("footer",{className:(0,u.A)(f.G.docs.docFooter,"docusaurus-mt-lg"),children:[i&&(0,o.jsx)("div",{className:(0,u.A)("row margin-top--sm",f.G.docs.docFooterTagsRow),children:(0,o.jsx)("div",{className:"col",children:(0,o.jsx)(I,{tags:a})})}),l&&(0,o.jsx)(H.A,{className:(0,u.A)("margin-top--sm",f.G.docs.docFooterEditMetaRow),editUrl:t,lastUpdatedAt:s,lastUpdatedBy:n})]}):null}var R=s(90317),G=s(98332);const F={tocCollapsibleButton:"tocCollapsibleButton_MtTV",tocCollapsibleButtonExpanded:"tocCollapsibleButtonExpanded_VQRl"};function E({collapsed:e,...t}){return(0,o.jsx)("button",{type:"button",...t,className:(0,u.A)("clean-btn",F.tocCollapsibleButton,!e&&F.tocCollapsibleButtonExpanded,t.className),children:(0,o.jsx)(h.A,{id:"theme.TOCCollapsible.toggleButtonLabel",description:"The label used by the button on the collapsible TOC component",children:"On this page"})})}const D={tocCollapsible:"tocCollapsible_Rv3I",tocCollapsibleContent:"tocCollapsibleContent_XFsF",tocCollapsibleExpanded:"tocCollapsibleExpanded_TFgA"};function U({toc:e,className:t,minHeadingLevel:s,maxHeadingLevel:n}){const{collapsed:a,toggleCollapsed:i}=(0,R.u)({initialState:!0});return(0,o.jsxs)("div",{className:(0,u.A)(D.tocCollapsible,!a&&D.tocCollapsibleExpanded,t),children:[(0,o.jsx)(E,{collapsed:a,onClick:i}),(0,o.jsx)(R.N,{lazy:!0,className:D.tocCollapsibleContent,collapsed:a,children:(0,o.jsx)(G.A,{toc:e,minHeadingLevel:s,maxHeadingLevel:n})})]})}const O={tocMobile:"tocMobile_HJNs"};function S(){const{toc:e,frontMatter:t}=c();return(0,o.jsx)(U,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:(0,u.A)(f.G.docs.docTocMobile,O.tocMobile)})}var W=s(21187);function P(){const{toc:e,frontMatter:t}=c();return(0,o.jsx)(W.A,{toc:e,minHeadingLevel:t.toc_min_heading_level,maxHeadingLevel:t.toc_max_heading_level,className:f.G.docs.docTocDesktop})}var X=s(33555),$=s(31156);function z({children:e}){const t=function(){const{metadata:e,frontMatter:t,contentTitle:s}=c();return t.hide_title||void 0!==s?null:e.title}();return(0,o.jsxs)("div",{className:(0,u.A)(f.G.docs.docMarkdown,"markdown"),children:[t&&(0,o.jsx)("header",{children:(0,o.jsx)(X.A,{as:"h1",children:t})}),(0,o.jsx)($.A,{children:e})]})}var J=s(74366),K=s(91548),Q=s(42977);function Y(e){return(0,o.jsx)("svg",{viewBox:"0 0 24 24",...e,children:(0,o.jsx)("path",{d:"M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z",fill:"currentColor"})})}const q={breadcrumbHomeIcon:"breadcrumbHomeIcon_YiAp"};function Z(){const e=(0,Q.Ay)("/");return(0,o.jsx)("li",{className:"breadcrumbs__item",children:(0,o.jsx)(b.A,{"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.home",message:"Home page",description:"The ARIA label for the home page in the breadcrumbs"}),className:"breadcrumbs__link",href:e,children:(0,o.jsx)(Y,{className:q.breadcrumbHomeIcon})})})}var ee=s(33412);function te(e){const t=function({breadcrumbs:e}){const{siteConfig:t}=(0,g.A)();return{"@context":"https://schema.org","@type":"BreadcrumbList",itemListElement:e.filter(e=>e.href).map((e,s)=>({"@type":"ListItem",position:s+1,name:e.label,item:`${t.url}${e.href}`}))}}({breadcrumbs:e.breadcrumbs});return(0,o.jsx)(ee.A,{children:(0,o.jsx)("script",{type:"application/ld+json",children:JSON.stringify(t)})})}const se={breadcrumbsContainer:"breadcrumbsContainer_yRvd"};function ne({children:e,href:t,isLast:s}){const n="breadcrumbs__link";return s?(0,o.jsx)("span",{className:n,children:e}):t?(0,o.jsx)(b.A,{className:n,href:t,children:(0,o.jsx)("span",{children:e})}):(0,o.jsx)("span",{className:n,children:e})}function ae({children:e,active:t}){return(0,o.jsx)("li",{className:(0,u.A)("breadcrumbs__item",{"breadcrumbs__item--active":t}),children:e})}function ie(){const e=(0,J.OF)(),t=(0,K.Dt)();return e?(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(te,{breadcrumbs:e}),(0,o.jsx)("nav",{className:(0,u.A)(f.G.docs.docBreadcrumbs,se.breadcrumbsContainer),"aria-label":(0,h.T)({id:"theme.docs.breadcrumbs.navAriaLabel",message:"Breadcrumbs",description:"The ARIA label for the breadcrumbs"}),children:(0,o.jsxs)("ul",{className:"breadcrumbs",children:[t&&(0,o.jsx)(Z,{}),e.map((t,s)=>{const n=s===e.length-1,a="category"===t.type&&t.linkUnlisted?void 0:t.href;return(0,o.jsx)(ae,{active:n,children:(0,o.jsx)(ne,{href:a,isLast:n,children:t.label})},s)})]})})]}):null}var oe=s(45235);const le={docItemContainer:"docItemContainer_MHtG",docItemCol:"docItemCol_oWXt"};function re({children:e}){const t=function(){const{frontMatter:e,toc:t}=c(),s=(0,m.l)(),n=e.hide_table_of_contents,a=!n&&t.length>0;return{hidden:n,mobile:a?(0,o.jsx)(S,{}):void 0,desktop:!a||"desktop"!==s&&"ssr"!==s?void 0:(0,o.jsx)(P,{})}}(),{metadata:s}=c();return(0,o.jsxs)("div",{className:"row",children:[(0,o.jsxs)("div",{className:(0,u.A)("col",!t.hidden&&le.docItemCol),children:[(0,o.jsx)(oe.A,{metadata:s}),(0,o.jsx)(k,{}),(0,o.jsxs)("div",{className:le.docItemContainer,children:[(0,o.jsxs)("article",{children:[(0,o.jsx)(ie,{}),(0,o.jsx)(M,{}),t.mobile,(0,o.jsx)(z,{children:e}),(0,o.jsx)(V,{})]}),(0,o.jsx)(p,{})]})]}),t.desktop&&(0,o.jsx)("div",{className:"col col--3",children:t.desktop})]})}function ce(e){const t=`docs-doc-id-${e.content.metadata.id}`,s=e.content;return(0,o.jsx)(r,{content:e.content,children:(0,o.jsxs)(a.e3,{className:t,children:[(0,o.jsx)(d,{}),(0,o.jsx)(re,{children:(0,o.jsx)(s,{})})]})})}}}]); \ No newline at end of file diff --git a/assets/js/1853.4ea6156f.js b/assets/js/1853.4ea6156f.js new file mode 100644 index 0000000000..85033c2c72 --- /dev/null +++ b/assets/js/1853.4ea6156f.js @@ -0,0 +1 @@ +(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1853],{20239:function(t,e,i){var n;n=function(t){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=7)}([function(e,i){e.exports=t},function(t,e,i){"use strict";var n=i(0).FDLayoutConstants;function r(){}for(var o in n)r[o]=n[o];r.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,r.DEFAULT_RADIAL_SEPARATION=n.DEFAULT_EDGE_LENGTH,r.DEFAULT_COMPONENT_SEPERATION=60,r.TILE=!0,r.TILING_PADDING_VERTICAL=10,r.TILING_PADDING_HORIZONTAL=10,r.TREE_REDUCTION_ON_INCREMENTAL=!1,t.exports=r},function(t,e,i){"use strict";var n=i(0).FDLayoutEdge;function r(t,e,i){n.call(this,t,e,i)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},function(t,e,i){"use strict";var n=i(0).LGraph;function r(t,e,i){n.call(this,t,e,i)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},function(t,e,i){"use strict";var n=i(0).LGraphManager;function r(t){n.call(this,t)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},function(t,e,i){"use strict";var n=i(0).FDLayoutNode,r=i(0).IMath;function o(t,e,i,r){n.call(this,t,e,i,r)}for(var s in o.prototype=Object.create(n.prototype),n)o[s]=n[s];o.prototype.move=function(){var t=this.graphManager.getLayout();this.displacementX=t.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=t.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementX=t.coolingFactor*t.maxNodeDisplacement*r.sign(this.displacementX)),Math.abs(this.displacementY)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementY=t.coolingFactor*t.maxNodeDisplacement*r.sign(this.displacementY)),null==this.child||0==this.child.getNodes().length?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),t.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},o.prototype.propogateDisplacementToChildren=function(t,e){for(var i,n=this.getChild().getNodes(),r=0;r0)this.positionNodesRadially(t);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var e=new Set(this.getAllNodes()),i=this.nodesWithGravity.filter(function(t){return e.has(t)});this.graphManager.setAllNodesToApplyGravitation(i),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},_.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}if(this.totalIterations%l.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged()){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}this.coolingCycle++,0==this.layoutQuality?this.coolingAdjuster=this.coolingCycle:1==this.layoutQuality&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var t=new Set(this.getAllNodes()),e=this.nodesWithGravity.filter(function(e){return t.has(e)});this.graphManager.setAllNodesToApplyGravitation(e),this.graphManager.updateBounds(),this.updateGrid(),this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var i=!this.isTreeGrowing&&!this.isGrowthFinished,n=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(i,n),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},_.prototype.getPositionsData=function(){for(var t=this.graphManager.getAllNodes(),e={},i=0;i1)for(a=0;an&&(n=Math.floor(s.y)),o=Math.floor(s.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new u(c.WORLD_CENTER_X-s.x/2,c.WORLD_CENTER_Y-s.y/2))},_.radialLayout=function(t,e,i){var n=Math.max(this.maxDiagonalInTree(t),h.DEFAULT_RADIAL_SEPARATION);_.branchRadialLayout(e,null,0,359,0,n);var r=y.calculateBounds(t),o=new E;o.setDeviceOrgX(r.getMinX()),o.setDeviceOrgY(r.getMinY()),o.setWorldOrgX(i.x),o.setWorldOrgY(i.y);for(var s=0;s1;){var E=y[0];y.splice(0,1);var m=c.indexOf(E);m>=0&&c.splice(m,1),p--,g--}u=null!=e?(c.indexOf(y[0])+1)%p:0;for(var v=Math.abs(n-i)/g,N=u;d!=g;N=++N%p){var A=c[N].getOtherEnd(t);if(A!=e){var L=(i+d*v)%360,T=(L+v)%360;_.branchRadialLayout(A,t,L,T,r+o,o),d++}}},_.maxDiagonalInTree=function(t){for(var e=p.MIN_VALUE,i=0;ie&&(e=n)}return e},_.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},_.prototype.groupZeroDegreeMembers=function(){var t=this,e={};this.memberGroups={},this.idToDummyNode={};for(var i=[],n=this.graphManager.getAllNodes(),r=0;r1){var n="DummyCompound_"+i;t.memberGroups[n]=e[i];var r=e[i][0].getParent(),o=new s(t.graphManager);o.id=n,o.paddingLeft=r.paddingLeft||0,o.paddingRight=r.paddingRight||0,o.paddingBottom=r.paddingBottom||0,o.paddingTop=r.paddingTop||0,t.idToDummyNode[n]=o;var a=t.getGraphManager().add(t.newGraph(),o),h=r.getChild();h.add(o);for(var l=0;l=0;t--){var e=this.compoundOrder[t],i=e.id,n=e.paddingLeft,r=e.paddingTop;this.adjustLocations(this.tiledMemberPack[i],e.rect.x,e.rect.y,n,r)}},_.prototype.repopulateZeroDegreeMembers=function(){var t=this,e=this.tiledZeroDegreePack;Object.keys(e).forEach(function(i){var n=t.idToDummyNode[i],r=n.paddingLeft,o=n.paddingTop;t.adjustLocations(e[i],n.rect.x,n.rect.y,r,o)})},_.prototype.getToBeTiled=function(t){var e=t.id;if(null!=this.toBeTiled[e])return this.toBeTiled[e];var i=t.getChild();if(null==i)return this.toBeTiled[e]=!1,!1;for(var n=i.getNodes(),r=0;r0)return this.toBeTiled[e]=!1,!1;if(null!=o.getChild()){if(!this.getToBeTiled(o))return this.toBeTiled[e]=!1,!1}else this.toBeTiled[o.id]=!1}return this.toBeTiled[e]=!0,!0},_.prototype.getNodeDegree=function(t){t.id;for(var e=t.getEdges(),i=0,n=0;nh&&(h=c.rect.height)}i+=h+t.verticalPadding}},_.prototype.tileCompoundMembers=function(t,e){var i=this;this.tiledMemberPack=[],Object.keys(t).forEach(function(n){var r=e[n];i.tiledMemberPack[n]=i.tileNodes(t[n],r.paddingLeft+r.paddingRight),r.rect.width=i.tiledMemberPack[n].width,r.rect.height=i.tiledMemberPack[n].height})},_.prototype.tileNodes=function(t,e){var i={rows:[],rowWidth:[],rowHeight:[],width:0,height:e,verticalPadding:h.TILING_PADDING_VERTICAL,horizontalPadding:h.TILING_PADDING_HORIZONTAL};t.sort(function(t,e){return t.rect.width*t.rect.height>e.rect.width*e.rect.height?-1:t.rect.width*t.rect.height0&&(o+=t.horizontalPadding),t.rowWidth[i]=o,t.width0&&(s+=t.verticalPadding);var a=0;s>t.rowHeight[i]&&(a=t.rowHeight[i],t.rowHeight[i]=s,a=t.rowHeight[i]-a),t.height+=a,t.rows[i].push(e)},_.prototype.getShortestRowIndex=function(t){for(var e=-1,i=Number.MAX_VALUE,n=0;ni&&(e=n,i=t.rowWidth[n]);return e},_.prototype.canAddHorizontal=function(t,e,i){var n=this.getShortestRowIndex(t);if(n<0)return!0;var r=t.rowWidth[n];if(r+t.horizontalPadding+e<=t.width)return!0;var o,s,a=0;return t.rowHeight[n]0&&(a=i+t.verticalPadding-t.rowHeight[n]),o=t.width-r>=e+t.horizontalPadding?(t.height+a)/(r+e+t.horizontalPadding):(t.height+a)/t.width,a=i+t.verticalPadding,(s=t.widtho&&e!=i){n.splice(-1,1),t.rows[i].push(r),t.rowWidth[e]=t.rowWidth[e]-o,t.rowWidth[i]=t.rowWidth[i]+o,t.width=t.rowWidth[instance.getLongestRowIndex(t)];for(var s=Number.MIN_VALUE,a=0;as&&(s=n[a].height);e>0&&(s+=t.verticalPadding);var h=t.rowHeight[e]+t.rowHeight[i];t.rowHeight[e]=s,t.rowHeight[i]0)for(var c=r;c<=o;c++)h[0]+=this.grid[c][s-1].length+this.grid[c][s].length-1;if(o0)for(c=s;c<=a;c++)h[3]+=this.grid[r-1][c].length+this.grid[r][c].length-1;for(var g,u,d=p.MAX_VALUE,f=0;f{"use strict";i.d(e,{diagram:()=>X});var n=i(63727),r=i(9420),o=i(47765),s=i(97485),a=i(79219),h=i(51243),l=i(3170),c=i(13212),g=i(58480),u=i(81896),d=function(){var t=(0,s.K2)(function(t,e,i,n){for(i=i||{},n=t.length;n--;i[t[n]]=e);return i},"o"),e=[1,4],i=[1,13],n=[1,12],r=[1,15],o=[1,16],a=[1,20],h=[1,19],l=[6,7,8],c=[1,26],g=[1,24],u=[1,25],d=[6,7,11],p=[1,6,13,15,16,19,22],f=[1,33],y=[1,34],E=[1,6,7,11,13,15,16,19,22],_={trace:(0,s.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,MINDMAP:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,ICON:15,CLASS:16,nodeWithId:17,nodeWithoutId:18,NODE_DSTART:19,NODE_DESCR:20,NODE_DEND:21,NODE_ID:22,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"MINDMAP",11:"EOF",13:"SPACELIST",15:"ICON",16:"CLASS",19:"NODE_DSTART",20:"NODE_DESCR",21:"NODE_DEND",22:"NODE_ID"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,2],[12,2],[12,2],[12,1],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[18,3],[17,1],[17,4]],performAction:(0,s.K2)(function(t,e,i,n,r,o,s){var a=o.length-1;switch(r){case 6:case 7:return n;case 8:n.getLogger().trace("Stop NL ");break;case 9:n.getLogger().trace("Stop EOF ");break;case 11:n.getLogger().trace("Stop NL2 ");break;case 12:n.getLogger().trace("Stop EOF2 ");break;case 15:n.getLogger().info("Node: ",o[a].id),n.addNode(o[a-1].length,o[a].id,o[a].descr,o[a].type);break;case 16:n.getLogger().trace("Icon: ",o[a]),n.decorateNode({icon:o[a]});break;case 17:case 21:n.decorateNode({class:o[a]});break;case 18:n.getLogger().trace("SPACELIST");break;case 19:n.getLogger().trace("Node: ",o[a].id),n.addNode(0,o[a].id,o[a].descr,o[a].type);break;case 20:n.decorateNode({icon:o[a]});break;case 25:n.getLogger().trace("node found ..",o[a-2]),this.$={id:o[a-1],descr:o[a-1],type:n.getType(o[a-2],o[a])};break;case 26:this.$={id:o[a],descr:o[a],type:n.nodeType.DEFAULT};break;case 27:n.getLogger().trace("node found ..",o[a-3]),this.$={id:o[a-3],descr:o[a-1],type:n.getType(o[a-2],o[a])}}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:i,7:[1,10],9:9,12:11,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},t(l,[2,3]),{1:[2,2]},t(l,[2,4]),t(l,[2,5]),{1:[2,6],6:i,12:21,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},{6:i,9:22,12:11,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},{6:c,7:g,10:23,11:u},t(d,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:a,22:h}),t(d,[2,18]),t(d,[2,19]),t(d,[2,20]),t(d,[2,21]),t(d,[2,23]),t(d,[2,24]),t(d,[2,26],{19:[1,30]}),{20:[1,31]},{6:c,7:g,10:32,11:u},{1:[2,7],6:i,12:21,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},t(p,[2,14],{7:f,11:y}),t(E,[2,8]),t(E,[2,9]),t(E,[2,10]),t(d,[2,15]),t(d,[2,16]),t(d,[2,17]),{20:[1,35]},{21:[1,36]},t(p,[2,13],{7:f,11:y}),t(E,[2,11]),t(E,[2,12]),{21:[1,37]},t(d,[2,25]),t(d,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:(0,s.K2)(function(t,e){if(!e.recoverable){var i=new Error(t);throw i.hash=e,i}this.trace(t)},"parseError"),parse:(0,s.K2)(function(t){var e=this,i=[0],n=[],r=[null],o=[],a=this.table,h="",l=0,c=0,g=0,u=o.slice.call(arguments,1),d=Object.create(this.lexer),p={yy:{}};for(var f in this.yy)Object.prototype.hasOwnProperty.call(this.yy,f)&&(p.yy[f]=this.yy[f]);d.setInput(t,p.yy),p.yy.lexer=d,p.yy.parser=this,void 0===d.yylloc&&(d.yylloc={});var y=d.yylloc;o.push(y);var E=d.options&&d.options.ranges;function _(){var t;return"number"!=typeof(t=n.pop()||d.lex()||1)&&(t instanceof Array&&(t=(n=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,s.K2)(function(t){i.length=i.length-2*t,r.length=r.length-t,o.length=o.length-t},"popStack"),(0,s.K2)(_,"lex");for(var m,v,N,A,L,T,O,D,I,w={};;){if(N=i[i.length-1],this.defaultActions[N]?A=this.defaultActions[N]:(null==m&&(m=_()),A=a[N]&&a[N][m]),void 0===A||!A.length||!A[0]){var R="";for(T in I=[],a[N])this.terminals_[T]&&T>2&&I.push("'"+this.terminals_[T]+"'");R=d.showPosition?"Parse error on line "+(l+1)+":\n"+d.showPosition()+"\nExpecting "+I.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(R,{text:d.match,token:this.terminals_[m]||m,line:d.yylineno,loc:y,expected:I})}if(A[0]instanceof Array&&A.length>1)throw new Error("Parse Error: multiple actions possible at state: "+N+", token: "+m);switch(A[0]){case 1:i.push(m),r.push(d.yytext),o.push(d.yylloc),i.push(A[1]),m=null,v?(m=v,v=null):(c=d.yyleng,h=d.yytext,l=d.yylineno,y=d.yylloc,g>0&&g--);break;case 2:if(O=this.productions_[A[1]][1],w.$=r[r.length-O],w._$={first_line:o[o.length-(O||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(O||1)].first_column,last_column:o[o.length-1].last_column},E&&(w._$.range=[o[o.length-(O||1)].range[0],o[o.length-1].range[1]]),void 0!==(L=this.performAction.apply(w,[h,c,l,p.yy,A[1],r,o].concat(u))))return L;O&&(i=i.slice(0,-1*O*2),r=r.slice(0,-1*O),o=o.slice(0,-1*O)),i.push(this.productions_[A[1]][0]),r.push(w.$),o.push(w._$),D=a[i[i.length-2]][i[i.length-1]],i.push(D);break;case 3:return!0}}return!0},"parse")},m=function(){return{EOF:1,parseError:(0,s.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,s.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,s.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,s.K2)(function(t){var e=t.length,i=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var n=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),i.length-1&&(this.yylineno-=i.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:i?(i.length===n.length?this.yylloc.first_column:0)+n[n.length-i.length].length-i[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,s.K2)(function(){return this._more=!0,this},"more"),reject:(0,s.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,s.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,s.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,s.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,s.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,s.K2)(function(t,e){var i,n,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(n=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=n.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:n?n[n.length-1].length-n[n.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],i=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return i;if(this._backtrack){for(var o in r)this[o]=r[o];return!1}return!1},"test_match"),next:(0,s.K2)(function(){if(this.done)return this.EOF;var t,e,i,n;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),o=0;oe[0].length)){if(e=i,n=o,this.options.backtrack_lexer){if(!1!==(t=this.test_match(i,r[o])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[n]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,s.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,s.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,s.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,s.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,s.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,s.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,s.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,s.K2)(function(t,e,i,n){switch(i){case 0:return t.getLogger().trace("Found comment",e.yytext),6;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;case 4:case 23:case 26:this.popState();break;case 5:t.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return t.getLogger().trace("SPACELINE"),6;case 7:return 7;case 8:return 15;case 9:t.getLogger().trace("end icon"),this.popState();break;case 10:return t.getLogger().trace("Exploding node"),this.begin("NODE"),19;case 11:return t.getLogger().trace("Cloud"),this.begin("NODE"),19;case 12:return t.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;case 13:return t.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;case 14:case 15:case 16:case 17:return this.begin("NODE"),19;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 24:t.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return t.getLogger().trace("description:",e.yytext),"NODE_DESCR";case 27:return this.popState(),t.getLogger().trace("node end ))"),"NODE_DEND";case 28:return this.popState(),t.getLogger().trace("node end )"),"NODE_DEND";case 29:return this.popState(),t.getLogger().trace("node end ...",e.yytext),"NODE_DEND";case 30:case 33:case 34:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";case 31:case 32:return this.popState(),t.getLogger().trace("node end (-"),"NODE_DEND";case 35:case 36:return t.getLogger().trace("Long description:",e.yytext),20}},"anonymous"),rules:[/^(?:\s*%%.*)/i,/^(?:mindmap\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{CLASS:{rules:[3,4],inclusive:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}}}();function v(){this.yy={}}return _.lexer=m,(0,s.K2)(v,"Parser"),v.prototype=_,_.Parser=v,new v}();d.parser=d;var p=d,f=[],y=0,E={},_=(0,s.K2)(()=>{f=[],y=0,E={}},"clear"),m=(0,s.K2)(function(t){for(let e=f.length-1;e>=0;e--)if(f[e].levelf.length>0?f[0]:null,"getMindmap"),N=(0,s.K2)((t,e,i,n)=>{s.Rm.info("addNode",t,e,i,n);const r=(0,s.D7)();let o=r.mindmap?.padding??s.UI.mindmap.padding;switch(n){case A.ROUNDED_RECT:case A.RECT:case A.HEXAGON:o*=2}const a={id:y++,nodeId:(0,s.jZ)(e,r),level:t,descr:(0,s.jZ)(i,r),type:n,children:[],width:r.mindmap?.maxNodeWidth??s.UI.mindmap.maxNodeWidth,padding:o},h=m(t);if(h)h.children.push(a),f.push(a);else{if(0!==f.length)throw new Error('There can be only one root. No parent could be found for ("'+a.descr+'")');f.push(a)}},"addNode"),A={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},L={clear:_,addNode:N,getMindmap:v,nodeType:A,getType:(0,s.K2)((t,e)=>{switch(s.Rm.debug("In get type",t,e),t){case"[":return A.RECT;case"(":return")"===e?A.ROUNDED_RECT:A.CLOUD;case"((":return A.CIRCLE;case")":return A.CLOUD;case"))":return A.BANG;case"{{":return A.HEXAGON;default:return A.DEFAULT}},"getType"),setElementForId:(0,s.K2)((t,e)=>{E[t]=e},"setElementForId"),decorateNode:(0,s.K2)(t=>{if(!t)return;const e=(0,s.D7)(),i=f[f.length-1];t.icon&&(i.icon=(0,s.jZ)(t.icon,e)),t.class&&(i.class=(0,s.jZ)(t.class,e))},"decorateNode"),type2Str:(0,s.K2)(t=>{switch(t){case A.DEFAULT:return"no-border";case A.RECT:return"rect";case A.ROUNDED_RECT:return"rounded-rect";case A.CIRCLE:return"circle";case A.CLOUD:return"cloud";case A.BANG:return"bang";case A.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),getLogger:(0,s.K2)(()=>s.Rm,"getLogger"),getElementById:(0,s.K2)(t=>E[t],"getElementById")},T=(0,s.K2)(function(t,e,i,n){e.append("path").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("d",`M0 ${i.height-5} v${10-i.height} q0,-5 5,-5 h${i.width-10} q5,0 5,5 v${i.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",i.height).attr("x2",i.width).attr("y2",i.height)},"defaultBkg"),O=(0,s.K2)(function(t,e,i){e.append("rect").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("height",i.height).attr("width",i.width)},"rectBkg"),D=(0,s.K2)(function(t,e,i){const n=i.width,r=i.height,o=.15*n,s=.25*n,a=.35*n,h=.2*n;e.append("path").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("d",`M0 0 a${o},${o} 0 0,1 ${.25*n},${-1*n*.1}\n a${a},${a} 1 0,1 ${.4*n},${-1*n*.1}\n a${s},${s} 1 0,1 ${.35*n},${1*n*.2}\n\n a${o},${o} 1 0,1 ${.15*n},${1*r*.35}\n a${h},${h} 1 0,1 ${-1*n*.15},${1*r*.65}\n\n a${s},${o} 1 0,1 ${-1*n*.25},${.15*n}\n a${a},${a} 1 0,1 ${-1*n*.5},0\n a${o},${o} 1 0,1 ${-1*n*.25},${-1*n*.15}\n\n a${o},${o} 1 0,1 ${-1*n*.1},${-1*r*.35}\n a${h},${h} 1 0,1 ${.1*n},${-1*r*.65}\n\n H0 V0 Z`)},"cloudBkg"),I=(0,s.K2)(function(t,e,i){const n=i.width,r=i.height,o=.15*n;e.append("path").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("d",`M0 0 a${o},${o} 1 0,0 ${.25*n},${-1*r*.1}\n a${o},${o} 1 0,0 ${.25*n},0\n a${o},${o} 1 0,0 ${.25*n},0\n a${o},${o} 1 0,0 ${.25*n},${1*r*.1}\n\n a${o},${o} 1 0,0 ${.15*n},${1*r*.33}\n a${.8*o},${.8*o} 1 0,0 0,${1*r*.34}\n a${o},${o} 1 0,0 ${-1*n*.15},${1*r*.33}\n\n a${o},${o} 1 0,0 ${-1*n*.25},${.15*r}\n a${o},${o} 1 0,0 ${-1*n*.25},0\n a${o},${o} 1 0,0 ${-1*n*.25},0\n a${o},${o} 1 0,0 ${-1*n*.25},${-1*r*.15}\n\n a${o},${o} 1 0,0 ${-1*n*.1},${-1*r*.33}\n a${.8*o},${.8*o} 1 0,0 0,${-1*r*.34}\n a${o},${o} 1 0,0 ${.1*n},${-1*r*.33}\n\n H0 V0 Z`)},"bangBkg"),w=(0,s.K2)(function(t,e,i){e.append("circle").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("r",i.width/2)},"circleBkg");function R(t,e,i,n,r){return t.insert("polygon",":first-child").attr("points",n.map(function(t){return t.x+","+t.y}).join(" ")).attr("transform","translate("+(r.width-e)/2+", "+i+")")}(0,s.K2)(R,"insertPolygonShape");var C=(0,s.K2)(function(t,e,i){const n=i.height,r=n/4,o=i.width-i.padding+2*r;R(e,o,n,[{x:r,y:0},{x:o-r,y:0},{x:o,y:-n/2},{x:o-r,y:-n},{x:r,y:-n},{x:0,y:-n/2}],i)},"hexagonBkg"),M=(0,s.K2)(function(t,e,i){e.append("rect").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("height",i.height).attr("rx",i.padding).attr("ry",i.padding).attr("width",i.width)},"roundedRectBkg"),x=(0,s.K2)(async function(t,e,i,o,s){const a=s.htmlLabels,h=o%11,l=e.append("g");i.section=h;let c="section-"+h;h<0&&(c+=" section-root"),l.attr("class",(i.class?i.class+" ":"")+"mindmap-node "+c);const g=l.append("g"),u=l.append("g"),d=i.descr.replace(/()/g,"\n");await(0,n.GZ)(u,d,{useHtmlLabels:a,width:i.width,classes:"mindmap-node-label"},s),a||u.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle");const p=u.node().getBBox(),[f]=(0,r.I5)(s.fontSize);if(i.height=p.height+1.1*f*.5+i.padding,i.width=p.width+2*i.padding,i.icon)if(i.type===t.nodeType.CIRCLE){i.height+=50,i.width+=50;l.append("foreignObject").attr("height","50px").attr("width",i.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+h+" "+i.icon),u.attr("transform","translate("+i.width/2+", "+(i.height/2-1.5*i.padding)+")")}else{i.width+=50;const t=i.height;i.height=Math.max(t,60);const e=Math.abs(i.height-t);l.append("foreignObject").attr("width","60px").attr("height",i.height).attr("style","text-align: center;margin-top:"+e/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+h+" "+i.icon),u.attr("transform","translate("+(25+i.width/2)+", "+(e/2+i.padding/2)+")")}else if(a){const t=(i.width-p.width)/2,e=(i.height-p.height)/2;u.attr("transform","translate("+t+", "+e+")")}else{const t=i.width/2,e=i.padding/2;u.attr("transform","translate("+t+", "+e+")")}switch(i.type){case t.nodeType.DEFAULT:T(t,g,i,h);break;case t.nodeType.ROUNDED_RECT:M(t,g,i,h);break;case t.nodeType.RECT:O(t,g,i,h);break;case t.nodeType.CIRCLE:g.attr("transform","translate("+i.width/2+", "+ +i.height/2+")"),w(t,g,i,h);break;case t.nodeType.CLOUD:D(t,g,i,h);break;case t.nodeType.BANG:I(t,g,i,h);break;case t.nodeType.HEXAGON:C(t,g,i,h)}return t.setElementForId(i.id,l),i.height},"drawNode"),G=(0,s.K2)(function(t,e){const i=t.getElementById(e.id),n=e.x||0,r=e.y||0;i.attr("transform","translate("+n+","+r+")")},"positionNode");async function S(t,e,i,n,r){await x(t,e,i,n,r),i.children&&await Promise.all(i.children.map((i,o)=>S(t,e,i,n<0?o:n,r)))}function b(t,e){e.edges().map((e,i)=>{const n=e.data();if(e[0]._private.bodyBounds){const r=e[0]._private.rscratch;s.Rm.trace("Edge: ",i,n),t.insert("path").attr("d",`M ${r.startX},${r.startY} L ${r.midX},${r.midY} L${r.endX},${r.endY} `).attr("class","edge section-edge-"+n.section+" edge-depth-"+n.depth)}})}function F(t,e,i,n){e.add({group:"nodes",data:{id:t.id.toString(),labelText:t.descr,height:t.height,width:t.width,level:n,nodeId:t.id,padding:t.padding,type:t.type},position:{x:t.x,y:t.y}}),t.children&&t.children.forEach(r=>{F(r,e,i,n+1),e.add({group:"edges",data:{id:`${t.id}_${r.id}`,source:t.id,target:r.id,depth:n,section:r.section}})})}function P(t,e){return new Promise(i=>{const n=(0,l.Ltv)("body").append("div").attr("id","cy").attr("style","display:none"),r=(0,a.A)({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});n.remove(),F(t,r,e,0),r.nodes().forEach(function(t){t.layoutDimensions=()=>{const e=t.data();return{w:e.width,h:e.height}}}),r.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),r.ready(t=>{s.Rm.info("Ready",t),i(r)})})}function U(t,e){e.nodes().map((e,i)=>{const n=e.data();n.x=e.position().x,n.y=e.position().y,G(t,n);const r=t.getElementById(n.nodeId);s.Rm.info("id:",i,"Position: (",e.position().x,", ",e.position().y,")",n),r.attr("transform",`translate(${e.position().x-n.width/2}, ${e.position().y-n.height/2})`),r.attr("attr",`apa-${i})`)})}a.A.use(h),(0,s.K2)(S,"drawNodes"),(0,s.K2)(b,"drawEdges"),(0,s.K2)(F,"addNodes"),(0,s.K2)(P,"layoutMindmap"),(0,s.K2)(U,"positionNodes");var k={draw:(0,s.K2)(async(t,e,i,n)=>{s.Rm.debug("Rendering mindmap diagram\n"+t);const r=n.db,a=r.getMindmap();if(!a)return;const h=(0,s.D7)();h.htmlLabels=!1;const l=(0,o.D)(e),c=l.append("g");c.attr("class","mindmap-edges");const g=l.append("g");g.attr("class","mindmap-nodes"),await S(r,g,a,-1,h);const u=await P(a,h);b(c,u),U(r,u),(0,s.ot)(void 0,l,h.mindmap?.padding??s.UI.mindmap.padding,h.mindmap?.useMaxWidth??s.UI.mindmap.useMaxWidth)},"draw")},Y=(0,s.K2)(t=>{let e="";for(let i=0;i`\n .edge {\n stroke-width: 3;\n }\n ${Y(t)}\n .section-root rect, .section-root path, .section-root circle, .section-root polygon {\n fill: ${t.git0};\n }\n .section-root text {\n fill: ${t.gitBranchLabel0};\n }\n .icon-container {\n height:100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .edge {\n fill: none;\n }\n .mindmap-node-label {\n dy: 1em;\n alignment-baseline: middle;\n text-anchor: middle;\n dominant-baseline: middle;\n text-align: center;\n }\n`,"getStyles")}},51243:function(t,e,i){var n;n=function(t){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1)}([function(e,i){e.exports=t},function(t,e,i){"use strict";var n=i(0).layoutBase.LayoutConstants,r=i(0).layoutBase.FDLayoutConstants,o=i(0).CoSEConstants,s=i(0).CoSELayout,a=i(0).CoSENode,h=i(0).layoutBase.PointD,l=i(0).layoutBase.DimensionD,c={ready:function(){},stop:function(){},quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function g(t){this.options=function(t,e){var i={};for(var n in t)i[n]=t[n];for(var n in e)i[n]=e[n];return i}(c,t),u(this.options)}var u=function(t){null!=t.nodeRepulsion&&(o.DEFAULT_REPULSION_STRENGTH=r.DEFAULT_REPULSION_STRENGTH=t.nodeRepulsion),null!=t.idealEdgeLength&&(o.DEFAULT_EDGE_LENGTH=r.DEFAULT_EDGE_LENGTH=t.idealEdgeLength),null!=t.edgeElasticity&&(o.DEFAULT_SPRING_STRENGTH=r.DEFAULT_SPRING_STRENGTH=t.edgeElasticity),null!=t.nestingFactor&&(o.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=r.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=t.nestingFactor),null!=t.gravity&&(o.DEFAULT_GRAVITY_STRENGTH=r.DEFAULT_GRAVITY_STRENGTH=t.gravity),null!=t.numIter&&(o.MAX_ITERATIONS=r.MAX_ITERATIONS=t.numIter),null!=t.gravityRange&&(o.DEFAULT_GRAVITY_RANGE_FACTOR=r.DEFAULT_GRAVITY_RANGE_FACTOR=t.gravityRange),null!=t.gravityCompound&&(o.DEFAULT_COMPOUND_GRAVITY_STRENGTH=r.DEFAULT_COMPOUND_GRAVITY_STRENGTH=t.gravityCompound),null!=t.gravityRangeCompound&&(o.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=t.gravityRangeCompound),null!=t.initialEnergyOnIncremental&&(o.DEFAULT_COOLING_FACTOR_INCREMENTAL=r.DEFAULT_COOLING_FACTOR_INCREMENTAL=t.initialEnergyOnIncremental),"draft"==t.quality?n.QUALITY=0:"proof"==t.quality?n.QUALITY=2:n.QUALITY=1,o.NODE_DIMENSIONS_INCLUDE_LABELS=r.NODE_DIMENSIONS_INCLUDE_LABELS=n.NODE_DIMENSIONS_INCLUDE_LABELS=t.nodeDimensionsIncludeLabels,o.DEFAULT_INCREMENTAL=r.DEFAULT_INCREMENTAL=n.DEFAULT_INCREMENTAL=!t.randomize,o.ANIMATE=r.ANIMATE=n.ANIMATE=t.animate,o.TILE=t.tile,o.TILING_PADDING_VERTICAL="function"==typeof t.tilingPaddingVertical?t.tilingPaddingVertical.call():t.tilingPaddingVertical,o.TILING_PADDING_HORIZONTAL="function"==typeof t.tilingPaddingHorizontal?t.tilingPaddingHorizontal.call():t.tilingPaddingHorizontal};g.prototype.run=function(){var t,e,i=this.options,n=(this.idToLNode={},this.layout=new s),r=this;r.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var o=n.newGraphManager();this.gm=o;var a=this.options.eles.nodes(),h=this.options.eles.edges();this.root=o.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(a),n);for(var l=0;l0&&(s=i.getGraphManager().add(i.newGraph(),o),this.processChildrenList(s,g,i))}},g.prototype.stop=function(){return this.stopped=!0,this};var d=function(t){t("layout","cose-bilkent",g)};"undefined"!=typeof cytoscape&&d(cytoscape),t.exports=d}])},t.exports=n(i(20239))},81614:function(t){var e;e=function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=26)}([function(t,e,i){"use strict";function n(){}n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,i){"use strict";var n=i(2),r=i(8),o=i(9);function s(t,e,i){n.call(this,i),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=i,this.bendpoints=[],this.source=t,this.target=e}for(var a in s.prototype=Object.create(n.prototype),n)s[a]=n[a];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(t){if(this.source===t)return this.target;if(this.target===t)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(t,e){for(var i=this.getOtherEnd(t),n=e.getGraphManager().getRoot();;){if(i.getOwner()==e)return i;if(i.getOwner()==n)break;i=i.getOwner().getParent()}return null},s.prototype.updateLength=function(){var t=new Array(4);this.isOverlapingSourceAndTarget=r.getIntersection(this.target.getRect(),this.source.getRect(),t),this.isOverlapingSourceAndTarget||(this.lengthX=t[0]-t[2],this.lengthY=t[1]-t[3],Math.abs(this.lengthX)<1&&(this.lengthX=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,i){"use strict";t.exports=function(t){this.vGraphObject=t}},function(t,e,i){"use strict";var n=i(2),r=i(10),o=i(13),s=i(0),a=i(16),h=i(4);function l(t,e,i,s){null==i&&null==s&&(s=e),n.call(this,s),null!=t.graphManager&&(t=t.graphManager),this.estimatedSize=r.MIN_VALUE,this.inclusionTreeDepth=r.MAX_VALUE,this.vGraphObject=s,this.edges=[],this.graphManager=t,this.rect=null!=i&&null!=e?new o(e.x,e.y,i.width,i.height):new o}for(var c in l.prototype=Object.create(n.prototype),n)l[c]=n[c];l.prototype.getEdges=function(){return this.edges},l.prototype.getChild=function(){return this.child},l.prototype.getOwner=function(){return this.owner},l.prototype.getWidth=function(){return this.rect.width},l.prototype.setWidth=function(t){this.rect.width=t},l.prototype.getHeight=function(){return this.rect.height},l.prototype.setHeight=function(t){this.rect.height=t},l.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},l.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},l.prototype.getCenter=function(){return new h(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},l.prototype.getLocation=function(){return new h(this.rect.x,this.rect.y)},l.prototype.getRect=function(){return this.rect},l.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},l.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},l.prototype.setRect=function(t,e){this.rect.x=t.x,this.rect.y=t.y,this.rect.width=e.width,this.rect.height=e.height},l.prototype.setCenter=function(t,e){this.rect.x=t-this.rect.width/2,this.rect.y=e-this.rect.height/2},l.prototype.setLocation=function(t,e){this.rect.x=t,this.rect.y=e},l.prototype.moveBy=function(t,e){this.rect.x+=t,this.rect.y+=e},l.prototype.getEdgeListToNode=function(t){var e=[],i=this;return i.edges.forEach(function(n){if(n.target==t){if(n.source!=i)throw"Incorrect edge source!";e.push(n)}}),e},l.prototype.getEdgesBetween=function(t){var e=[],i=this;return i.edges.forEach(function(n){if(n.source!=i&&n.target!=i)throw"Incorrect edge source and/or target";n.target!=t&&n.source!=t||e.push(n)}),e},l.prototype.getNeighborsList=function(){var t=new Set,e=this;return e.edges.forEach(function(i){if(i.source==e)t.add(i.target);else{if(i.target!=e)throw"Incorrect incidency!";t.add(i.source)}}),t},l.prototype.withChildren=function(){var t=new Set;if(t.add(this),null!=this.child)for(var e=this.child.getNodes(),i=0;ie&&(this.rect.x-=(this.labelWidth-e)/2,this.setWidth(this.labelWidth)),this.labelHeight>i&&("center"==this.labelPos?this.rect.y-=(this.labelHeight-i)/2:"top"==this.labelPos&&(this.rect.y-=this.labelHeight-i),this.setHeight(this.labelHeight))}}},l.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==r.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},l.prototype.transform=function(t){var e=this.rect.x;e>s.WORLD_BOUNDARY?e=s.WORLD_BOUNDARY:e<-s.WORLD_BOUNDARY&&(e=-s.WORLD_BOUNDARY);var i=this.rect.y;i>s.WORLD_BOUNDARY?i=s.WORLD_BOUNDARY:i<-s.WORLD_BOUNDARY&&(i=-s.WORLD_BOUNDARY);var n=new h(e,i),r=t.inverseTransformPoint(n);this.setLocation(r.x,r.y)},l.prototype.getLeft=function(){return this.rect.x},l.prototype.getRight=function(){return this.rect.x+this.rect.width},l.prototype.getTop=function(){return this.rect.y},l.prototype.getBottom=function(){return this.rect.y+this.rect.height},l.prototype.getParent=function(){return null==this.owner?null:this.owner.getParent()},t.exports=l},function(t,e,i){"use strict";function n(t,e){null==t&&null==e?(this.x=0,this.y=0):(this.x=t,this.y=e)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(t){this.x=t},n.prototype.setY=function(t){this.y=t},n.prototype.getDifference=function(t){return new DimensionD(this.x-t.x,this.y-t.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(t){return this.x+=t.width,this.y+=t.height,this},t.exports=n},function(t,e,i){"use strict";var n=i(2),r=i(10),o=i(0),s=i(6),a=i(3),h=i(1),l=i(13),c=i(12),g=i(11);function u(t,e,i){n.call(this,i),this.estimatedSize=r.MIN_VALUE,this.margin=o.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=t,null!=e&&e instanceof s?this.graphManager=e:null!=e&&e instanceof Layout&&(this.graphManager=e.graphManager)}for(var d in u.prototype=Object.create(n.prototype),n)u[d]=n[d];u.prototype.getNodes=function(){return this.nodes},u.prototype.getEdges=function(){return this.edges},u.prototype.getGraphManager=function(){return this.graphManager},u.prototype.getParent=function(){return this.parent},u.prototype.getLeft=function(){return this.left},u.prototype.getRight=function(){return this.right},u.prototype.getTop=function(){return this.top},u.prototype.getBottom=function(){return this.bottom},u.prototype.isConnected=function(){return this.isConnected},u.prototype.add=function(t,e,i){if(null==e&&null==i){var n=t;if(null==this.graphManager)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(n)>-1)throw"Node already in graph!";return n.owner=this,this.getNodes().push(n),n}var r=t;if(!(this.getNodes().indexOf(e)>-1&&this.getNodes().indexOf(i)>-1))throw"Source or target not in graph!";if(e.owner!=i.owner||e.owner!=this)throw"Both owners must be this graph!";return e.owner!=i.owner?null:(r.source=e,r.target=i,r.isInterGraph=!1,this.getEdges().push(r),e.edges.push(r),i!=e&&i.edges.push(r),r)},u.prototype.remove=function(t){var e=t;if(t instanceof a){if(null==e)throw"Node is null!";if(null==e.owner||e.owner!=this)throw"Owner graph is invalid!";if(null==this.graphManager)throw"Owner graph manager is invalid!";for(var i=e.edges.slice(),n=i.length,r=0;r-1&&c>-1))throw"Source and/or target doesn't know this edge!";if(o.source.edges.splice(l,1),o.target!=o.source&&o.target.edges.splice(c,1),-1==(s=o.source.owner.getEdges().indexOf(o)))throw"Not in owner's edge list!";o.source.owner.getEdges().splice(s,1)}},u.prototype.updateLeftTop=function(){for(var t,e,i,n=r.MAX_VALUE,o=r.MAX_VALUE,s=this.getNodes(),a=s.length,h=0;h(t=l.getTop())&&(n=t),o>(e=l.getLeft())&&(o=e)}return n==r.MAX_VALUE?null:(i=null!=s[0].getParent().paddingLeft?s[0].getParent().paddingLeft:this.margin,this.left=o-i,this.top=n-i,new c(this.left,this.top))},u.prototype.updateBounds=function(t){for(var e,i,n,o,s,a=r.MAX_VALUE,h=-r.MAX_VALUE,c=r.MAX_VALUE,g=-r.MAX_VALUE,u=this.nodes,d=u.length,p=0;p(e=f.getLeft())&&(a=e),h<(i=f.getRight())&&(h=i),c>(n=f.getTop())&&(c=n),g<(o=f.getBottom())&&(g=o)}var y=new l(a,c,h-a,g-c);a==r.MAX_VALUE&&(this.left=this.parent.getLeft(),this.right=this.parent.getRight(),this.top=this.parent.getTop(),this.bottom=this.parent.getBottom()),s=null!=u[0].getParent().paddingLeft?u[0].getParent().paddingLeft:this.margin,this.left=y.x-s,this.right=y.x+y.width+s,this.top=y.y-s,this.bottom=y.y+y.height+s},u.calculateBounds=function(t){for(var e,i,n,o,s=r.MAX_VALUE,a=-r.MAX_VALUE,h=r.MAX_VALUE,c=-r.MAX_VALUE,g=t.length,u=0;u(e=d.getLeft())&&(s=e),a<(i=d.getRight())&&(a=i),h>(n=d.getTop())&&(h=n),c<(o=d.getBottom())&&(c=o)}return new l(s,h,a-s,c-h)},u.prototype.getInclusionTreeDepth=function(){return this==this.graphManager.getRoot()?1:this.parent.getInclusionTreeDepth()},u.prototype.getEstimatedSize=function(){if(this.estimatedSize==r.MIN_VALUE)throw"assert failed";return this.estimatedSize},u.prototype.calcEstimatedSize=function(){for(var t=0,e=this.nodes,i=e.length,n=0;n=this.nodes.length){var h=0;r.forEach(function(e){e.owner==t&&h++}),h==this.nodes.length&&(this.isConnected=!0)}}else this.isConnected=!0},t.exports=u},function(t,e,i){"use strict";var n,r=i(1);function o(t){n=i(5),this.layout=t,this.graphs=[],this.edges=[]}o.prototype.addRoot=function(){var t=this.layout.newGraph(),e=this.layout.newNode(null),i=this.add(t,e);return this.setRootGraph(i),this.rootGraph},o.prototype.add=function(t,e,i,n,r){if(null==i&&null==n&&null==r){if(null==t)throw"Graph is null!";if(null==e)throw"Parent node is null!";if(this.graphs.indexOf(t)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(t),null!=t.parent)throw"Already has a parent!";if(null!=e.child)throw"Already has a child!";return t.parent=e,e.child=t,t}r=i,i=t;var o=(n=e).getOwner(),s=r.getOwner();if(null==o||o.getGraphManager()!=this)throw"Source not in this graph mgr!";if(null==s||s.getGraphManager()!=this)throw"Target not in this graph mgr!";if(o==s)return i.isInterGraph=!1,o.add(i,n,r);if(i.isInterGraph=!0,i.source=n,i.target=r,this.edges.indexOf(i)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(i),null==i.source||null==i.target)throw"Edge source and/or target is null!";if(-1!=i.source.edges.indexOf(i)||-1!=i.target.edges.indexOf(i))throw"Edge already in source and/or target incidency list!";return i.source.edges.push(i),i.target.edges.push(i),i},o.prototype.remove=function(t){if(t instanceof n){var e=t;if(e.getGraphManager()!=this)throw"Graph not in this graph mgr";if(e!=this.rootGraph&&(null==e.parent||e.parent.graphManager!=this))throw"Invalid parent node!";for(var i,o=[],s=(o=o.concat(e.getEdges())).length,a=0;a=e.getRight()?i[0]+=Math.min(e.getX()-t.getX(),t.getRight()-e.getRight()):e.getX()<=t.getX()&&e.getRight()>=t.getRight()&&(i[0]+=Math.min(t.getX()-e.getX(),e.getRight()-t.getRight())),t.getY()<=e.getY()&&t.getBottom()>=e.getBottom()?i[1]+=Math.min(e.getY()-t.getY(),t.getBottom()-e.getBottom()):e.getY()<=t.getY()&&e.getBottom()>=t.getBottom()&&(i[1]+=Math.min(t.getY()-e.getY(),e.getBottom()-t.getBottom()));var o=Math.abs((e.getCenterY()-t.getCenterY())/(e.getCenterX()-t.getCenterX()));e.getCenterY()===t.getCenterY()&&e.getCenterX()===t.getCenterX()&&(o=1);var s=o*i[0],a=i[1]/o;i[0]s)return i[0]=n,i[1]=h,i[2]=o,i[3]=m,!1;if(ro)return i[0]=a,i[1]=r,i[2]=E,i[3]=s,!1;if(no?(i[0]=c,i[1]=g,L=!0):(i[0]=l,i[1]=h,L=!0):O===I&&(n>o?(i[0]=a,i[1]=h,L=!0):(i[0]=u,i[1]=g,L=!0)),-D===I?o>n?(i[2]=_,i[3]=m,T=!0):(i[2]=E,i[3]=y,T=!0):D===I&&(o>n?(i[2]=f,i[3]=y,T=!0):(i[2]=v,i[3]=m,T=!0)),L&&T)return!1;if(n>o?r>s?(w=this.getCardinalDirection(O,I,4),R=this.getCardinalDirection(D,I,2)):(w=this.getCardinalDirection(-O,I,3),R=this.getCardinalDirection(-D,I,1)):r>s?(w=this.getCardinalDirection(-O,I,1),R=this.getCardinalDirection(-D,I,3)):(w=this.getCardinalDirection(O,I,2),R=this.getCardinalDirection(D,I,4)),!L)switch(w){case 1:M=h,C=n+-p/I,i[0]=C,i[1]=M;break;case 2:C=u,M=r+d*I,i[0]=C,i[1]=M;break;case 3:M=g,C=n+p/I,i[0]=C,i[1]=M;break;case 4:C=c,M=r+-d*I,i[0]=C,i[1]=M}if(!T)switch(R){case 1:G=y,x=o+-A/I,i[2]=x,i[3]=G;break;case 2:x=v,G=s+N*I,i[2]=x,i[3]=G;break;case 3:G=m,x=o+A/I,i[2]=x,i[3]=G;break;case 4:x=_,G=s+-N*I,i[2]=x,i[3]=G}}return!1},r.getCardinalDirection=function(t,e,i){return t>e?i:1+i%4},r.getIntersection=function(t,e,i,r){if(null==r)return this.getIntersection2(t,e,i);var o,s,a,h,l,c,g,u=t.x,d=t.y,p=e.x,f=e.y,y=i.x,E=i.y,_=r.x,m=r.y;return 0===(g=(o=f-d)*(h=y-_)-(s=m-E)*(a=u-p))?null:new n((a*(c=_*E-y*m)-h*(l=p*d-u*f))/g,(s*l-o*c)/g)},r.angleOfVector=function(t,e,i,n){var r=void 0;return t!==i?(r=Math.atan((n-e)/(i-t)),i0?1:t<0?-1:0},n.floor=function(t){return t<0?Math.ceil(t):Math.floor(t)},n.ceil=function(t){return t<0?Math.floor(t):Math.ceil(t)},t.exports=n},function(t,e,i){"use strict";function n(){}n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i=0;i0&&e;){for(a.push(l[0]);a.length>0&&e;){var c=a[0];a.splice(0,1),s.add(c);var g=c.getEdges();for(o=0;o-1&&l.splice(f,1)}s=new Set,h=new Map}else t=[]}return t},u.prototype.createDummyNodesForBendpoints=function(t){for(var e=[],i=t.source,n=this.graphManager.calcLowestCommonAncestor(t.source,t.target),r=0;r0){for(var r=this.edgeToDummyNodes.get(i),o=0;o=0&&e.splice(g,1),c.getNeighborsList().forEach(function(t){if(i.indexOf(t)<0){var e=n.get(t)-1;1==e&&h.push(t),n.set(t,e)}})}i=i.concat(h),1!=e.length&&2!=e.length||(r=!0,o=e[0])}return o},u.prototype.setGraphManager=function(t){this.graphManager=t},t.exports=u},function(t,e,i){"use strict";function n(){}n.seed=1,n.x=0,n.nextDouble=function(){return n.x=1e4*Math.sin(n.seed++),n.x-Math.floor(n.x)},t.exports=n},function(t,e,i){"use strict";var n=i(4);function r(t,e){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}r.prototype.getWorldOrgX=function(){return this.lworldOrgX},r.prototype.setWorldOrgX=function(t){this.lworldOrgX=t},r.prototype.getWorldOrgY=function(){return this.lworldOrgY},r.prototype.setWorldOrgY=function(t){this.lworldOrgY=t},r.prototype.getWorldExtX=function(){return this.lworldExtX},r.prototype.setWorldExtX=function(t){this.lworldExtX=t},r.prototype.getWorldExtY=function(){return this.lworldExtY},r.prototype.setWorldExtY=function(t){this.lworldExtY=t},r.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},r.prototype.setDeviceOrgX=function(t){this.ldeviceOrgX=t},r.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},r.prototype.setDeviceOrgY=function(t){this.ldeviceOrgY=t},r.prototype.getDeviceExtX=function(){return this.ldeviceExtX},r.prototype.setDeviceExtX=function(t){this.ldeviceExtX=t},r.prototype.getDeviceExtY=function(){return this.ldeviceExtY},r.prototype.setDeviceExtY=function(t){this.ldeviceExtY=t},r.prototype.transformX=function(t){var e=0,i=this.lworldExtX;return 0!=i&&(e=this.ldeviceOrgX+(t-this.lworldOrgX)*this.ldeviceExtX/i),e},r.prototype.transformY=function(t){var e=0,i=this.lworldExtY;return 0!=i&&(e=this.ldeviceOrgY+(t-this.lworldOrgY)*this.ldeviceExtY/i),e},r.prototype.inverseTransformX=function(t){var e=0,i=this.ldeviceExtX;return 0!=i&&(e=this.lworldOrgX+(t-this.ldeviceOrgX)*this.lworldExtX/i),e},r.prototype.inverseTransformY=function(t){var e=0,i=this.ldeviceExtY;return 0!=i&&(e=this.lworldOrgY+(t-this.ldeviceOrgY)*this.lworldExtY/i),e},r.prototype.inverseTransformPoint=function(t){return new n(this.inverseTransformX(t.x),this.inverseTransformY(t.y))},t.exports=r},function(t,e,i){"use strict";var n=i(15),r=i(7),o=i(0),s=i(8),a=i(9);function h(){n.call(this),this.useSmartIdealEdgeLengthCalculation=r.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.idealEdgeLength=r.DEFAULT_EDGE_LENGTH,this.springConstant=r.DEFAULT_SPRING_STRENGTH,this.repulsionConstant=r.DEFAULT_REPULSION_STRENGTH,this.gravityConstant=r.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=r.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=r.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.displacementThresholdPerNode=3*r.DEFAULT_EDGE_LENGTH/100,this.coolingFactor=r.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.initialCoolingFactor=r.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.totalDisplacement=0,this.oldTotalDisplacement=0,this.maxIterations=r.MAX_ITERATIONS}for(var l in h.prototype=Object.create(n.prototype),n)h[l]=n[l];h.prototype.initParameters=function(){n.prototype.initParameters.call(this,arguments),this.totalIterations=0,this.notAnimatedIterations=0,this.useFRGridVariant=r.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION,this.grid=[]},h.prototype.calcIdealEdgeLengths=function(){for(var t,e,i,n,s,a,h=this.getGraphManager().getAllEdges(),l=0;lr.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*r.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(t-r.ADAPTATION_LOWER_NODE_LIMIT)/(r.ADAPTATION_UPPER_NODE_LIMIT-r.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-r.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=r.MAX_NODE_DISPLACEMENT_INCREMENTAL):(t>r.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(r.COOLING_ADAPTATION_FACTOR,1-(t-r.ADAPTATION_LOWER_NODE_LIMIT)/(r.ADAPTATION_UPPER_NODE_LIMIT-r.ADAPTATION_LOWER_NODE_LIMIT)*(1-r.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=r.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(5*this.getAllNodes().length,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var t,e=this.getAllEdges(),i=0;i0&&void 0!==arguments[0])||arguments[0],a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],h=this.getAllNodes();if(this.useFRGridVariant)for(this.totalIterations%r.GRID_CALCULATION_CHECK_PERIOD==1&&s&&this.updateGrid(),o=new Set,t=0;t(h=e.getEstimatedSize()*this.gravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*r,t.gravitationForceY=-this.gravityConstant*o):(s>(h=e.getEstimatedSize()*this.compoundGravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*r*this.compoundGravityConstant,t.gravitationForceY=-this.gravityConstant*o*this.compoundGravityConstant)},h.prototype.isConverged=function(){var t,e=!1;return this.totalIterations>this.maxIterations/3&&(e=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),t=this.totalDisplacement=a.length||l>=a[0].length))for(var c=0;ct}}]),t}();t.exports=o},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i=0;i2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:-1,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sequence1=e,this.sequence2=i,this.match_score=n,this.mismatch_penalty=r,this.gap_penalty=o,this.iMax=e.length+1,this.jMax=i.length+1,this.grid=new Array(this.iMax);for(var s=0;s=0;i--){var n=this.listeners[i];n.event===t&&n.callback===e&&this.listeners.splice(i,1)}},r.emit=function(t,e){for(var i=0;i{r.d(n,{A:()=>u});var e=r(22663);const o=function(t,n){return(0,e.A)(n,function(n){return t[n]})};var c=r(22859);const u=function(t){return null==t?[]:o(t,(0,c.A)(t))}},9532:(t,n,r)=>{r.d(n,{A:()=>o});var e=r(37617);const o=function(t,n){return!!(null==t?0:t.length)&&(0,e.A)(t,n,0)>-1}},9584:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(t,n){return t.has(n)}},13027:(t,n,r)=>{r.d(n,{A:()=>c});var e=r(80565),o=r(97427);const c=function(t){return"symbol"==typeof t||(0,o.A)(t)&&"[object Symbol]"==(0,e.A)(t)}},16687:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(){}},22663:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(t,n){for(var r=-1,e=null==t?0:t.length,o=Array(e);++r{r.d(n,{A:()=>u});var e=r(66916),o=r(84738),c=r(42849);const u=function(t){return(0,c.A)(t)?(0,e.A)(t):(0,o.A)(t)}},25601:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(t,n){for(var r=-1,e=null==t?0:t.length;++r{r.d(n,{A:()=>a});var e=r(95526),o=r(13027),c=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,u=/^\w*$/;const a=function(t,n){if((0,e.A)(t))return!1;var r=typeof t;return!("number"!=r&&"symbol"!=r&&"boolean"!=r&&null!=t&&!(0,o.A)(t))||(u.test(t)||!c.test(t)||null!=n&&t in Object(n))}},31211:(t,n,r)=>{r.d(n,{A:()=>a});var e=r(71031),o=r(89882),c=Object.prototype.propertyIsEnumerable,u=Object.getOwnPropertySymbols;const a=u?function(t){return null==t?[]:(t=Object(t),(0,e.A)(u(t),function(n){return c.call(t,n)}))}:o.A},31528:(t,n,r)=>{r.d(n,{A:()=>o});var e=r(13027);const o=function(t){if("string"==typeof t||(0,e.A)(t))return t;var n=t+"";return"0"==n&&1/t==-1/0?"-0":n}},33744:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(t,n){for(var r=-1,e=null==t?0:t.length;++r{r.d(n,{A:()=>u});var e=r(46482);const o=function(t){return t!=t};const c=function(t,n,r){for(var e=r-1,o=t.length;++e{r.d(n,{A:()=>e});const e=function(t){return function(n){return null==n?void 0:n[t]}}},44753:(t,n,r)=>{r.d(n,{A:()=>c});var e=r(94578),o=r(42849);const c=function(t,n){return function(r,e){if(null==r)return r;if(!(0,o.A)(r))return t(r,e);for(var c=r.length,u=n?c:-1,a=Object(r);(n?u--:++u{r.d(n,{A:()=>e});const e=function(t,n,r,e){for(var o=t.length,c=r+(e?1:-1);e?c--:++c{r.d(n,{A:()=>a});var e=r(45786);const o=function(t){return this.__data__.set(t,"__lodash_hash_undefined__"),this};const c=function(t){return this.__data__.has(t)};function u(t){var n=-1,r=null==t?0:t.length;for(this.__data__=new e.A;++n{r.d(n,{A:()=>u});var e=r(74724),o=r(82520),c=r(96920);const u=function(t){return(0,e.A)(t,c.A,o.A)}},49759:(t,n,r)=>{r.d(n,{A:()=>f});var e=r(71849),o=r(55842),c=r(56267),u=r(95526),a=o.A?o.A.isConcatSpreadable:void 0;const i=function(t){return(0,u.A)(t)||(0,c.A)(t)||!!(a&&t&&t[a])};const f=function t(n,r,o,c,u){var a=-1,f=n.length;for(o||(o=i),u||(u=[]);++a0&&o(A)?r>1?t(A,r-1,o,c,u):(0,e.A)(u,A):c||(u[u.length]=A)}return u}},52837:(t,n,r)=>{r.d(n,{A:()=>o});var e=r(44753);const o=function(t,n){var r=[];return(0,e.A)(t,function(t,e,o){n(t,e,o)&&r.push(t)}),r}},52916:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(t){var n=-1,r=Array(t.size);return t.forEach(function(t){r[++n]=t}),r}},53261:(t,n,r)=>{r.d(n,{A:()=>A});var e=r(55842),o=r(22663),c=r(95526),u=r(13027),a=e.A?e.A.prototype:void 0,i=a?a.toString:void 0;const f=function t(n){if("string"==typeof n)return n;if((0,c.A)(n))return(0,o.A)(n,t)+"";if((0,u.A)(n))return i?i.call(n):"";var r=n+"";return"0"==r&&1/n==-1/0?"-0":r};const A=function(t){return null==t?"":f(t)}},53924:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(t,n,r){for(var e=-1,o=null==t?0:t.length;++e{r.d(n,{A:()=>e});const e=function(t){return void 0===t}},60870:(t,n,r)=>{r.d(n,{A:()=>A});var e=r(95526),o=r(26995),c=r(4003);var u=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,a=/\\(\\)?/g;const i=function(t){var n=(0,c.A)(t,function(t){return 500===r.size&&r.clear(),t}),r=n.cache;return n}(function(t){var n=[];return 46===t.charCodeAt(0)&&n.push(""),t.replace(u,function(t,r,e,o){n.push(e?o.replace(a,"$1"):r||t)}),n});var f=r(53261);const A=function(t,n){return(0,e.A)(t)?t:(0,o.A)(t,n)?[t]:i((0,f.A)(t))}},71031:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(t,n){for(var r=-1,e=null==t?0:t.length,o=0,c=[];++r{r.d(n,{A:()=>e});const e=function(t,n){for(var r=-1,e=n.length,o=t.length;++r{r.d(n,{A:()=>c});var e=r(71849),o=r(95526);const c=function(t,n,r){var c=n(t);return(0,o.A)(t)?c:(0,e.A)(c,r(t))}},76095:(t,n,r)=>{r.d(n,{A:()=>J});var e=r(56389),o=r(46691),c=r(25601),u=r(9584);const a=function(t,n,r,e,a,i){var f=1&r,A=t.length,s=n.length;if(A!=s&&!(f&&s>A))return!1;var v=i.get(t),l=i.get(n);if(v&&l)return v==n&&l==t;var b=-1,d=!0,j=2&r?new o.A:void 0;for(i.set(t,n),i.set(n,t);++b{r.d(n,{A:()=>s});var e=r(46691),o=r(9532),c=r(53924),u=r(9584),a=r(30256),i=r(16687),f=r(52916);const A=a.A&&1/(0,f.A)(new a.A([,-0]))[1]==1/0?function(t){return new a.A(t)}:i.A;const s=function(t,n,r){var a=-1,i=o.A,s=t.length,v=!0,l=[],b=l;if(r)v=!1,i=c.A;else if(s>=200){var d=n?null:A(t);if(d)return(0,f.A)(d);v=!1,i=u.A,b=new e.A}else b=n?[]:l;t:for(;++a{r.d(n,{A:()=>c});var e=r(60870),o=r(31528);const c=function(t,n){for(var r=0,c=(n=(0,e.A)(n,t)).length;null!=t&&r{r.d(n,{A:()=>a});var e=r(71849),o=r(79728),c=r(31211),u=r(89882);const a=Object.getOwnPropertySymbols?function(t){for(var n=[];t;)(0,e.A)(n,(0,c.A)(t)),t=(0,o.A)(t);return n}:u.A},83129:(t,n,r)=>{r.d(n,{A:()=>a});var e=r(33744),o=r(44753),c=r(86413),u=r(95526);const a=function(t,n){return((0,u.A)(t)?e.A:o.A)(t,(0,c.A)(n))}},85973:(t,n,r)=>{r.d(n,{A:()=>c});const e=function(t,n){return null!=t&&n in Object(t)};var o=r(96923);const c=function(t,n){return null!=t&&(0,o.A)(t,n,e)}},86413:(t,n,r)=>{r.d(n,{A:()=>o});var e=r(56117);const o=function(t){return"function"==typeof t?t:e.A}},89882:(t,n,r)=>{r.d(n,{A:()=>e});const e=function(){return[]}},89945:(t,n,r)=>{r.d(n,{A:()=>u});var e=r(74724),o=r(31211),c=r(22859);const u=function(t){return(0,e.A)(t,c.A,o.A)}},89949:(t,n,r)=>{r.d(n,{A:()=>a});var e=r(71031),o=r(52837),c=r(76095),u=r(95526);const a=function(t,n){return((0,u.A)(t)?e.A:o.A)(t,(0,c.A)(n,3))}},94578:(t,n,r)=>{r.d(n,{A:()=>c});var e=r(88749),o=r(22859);const c=function(t,n){return t&&(0,e.A)(t,n,o.A)}},96800:(t,n,r)=>{r.d(n,{A:()=>i});const e=function(t,n,r,e){var o=-1,c=null==t?0:t.length;for(e&&c&&(r=t[++o]);++o{r.d(n,{A:()=>f});var e=r(60870),o=r(56267),c=r(95526),u=r(31408),a=r(47227),i=r(31528);const f=function(t,n,r){for(var f=-1,A=(n=(0,e.A)(n,t)).length,s=!1;++f{r.d(n,{A:()=>Q});var e=r(56389),o=r(33744),c=r(63406),u=r(88168),a=r(22859);const i=function(t,n){return t&&(0,u.A)(n,(0,a.A)(n),t)};var f=r(96920);const A=function(t,n){return t&&(0,u.A)(n,(0,f.A)(n),t)};var s=r(14779),v=r(9554),l=r(31211);const b=function(t,n){return(0,u.A)(t,(0,l.A)(t),n)};var d=r(82520);const j=function(t,n){return(0,u.A)(t,(0,d.A)(t),n)};var h=r(89945),p=r(47042),y=r(44254),g=Object.prototype.hasOwnProperty;const w=function(t){var n=t.length,r=new t.constructor(n);return n&&"string"==typeof t[0]&&g.call(t,"index")&&(r.index=t.index,r.input=t.input),r};var _=r(9634);const O=function(t,n){var r=n?(0,_.A)(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)};var m=/\w*$/;const S=function(t){var n=new t.constructor(t.source,m.exec(t));return n.lastIndex=t.lastIndex,n};var k=r(55842),E=k.A?k.A.prototype:void 0,x=E?E.valueOf:void 0;const I=function(t){return x?Object(x.call(t)):{}};var U=r(39448);const B=function(t,n,r){var e=t.constructor;switch(n){case"[object ArrayBuffer]":return(0,_.A)(t);case"[object Boolean]":case"[object Date]":return new e(+t);case"[object DataView]":return O(t,r);case"[object Float32Array]":case"[object Float64Array]":case"[object Int8Array]":case"[object Int16Array]":case"[object Int32Array]":case"[object Uint8Array]":case"[object Uint8ClampedArray]":case"[object Uint16Array]":case"[object Uint32Array]":return(0,U.A)(t,r);case"[object Map]":case"[object Set]":return new e;case"[object Number]":case"[object String]":return new e(t);case"[object RegExp]":return S(t);case"[object Symbol]":return I(t)}};var C=r(77585),D=r(95526),F=r(27163),M=r(97427);const z=function(t){return(0,M.A)(t)&&"[object Map]"==(0,y.A)(t)};var L=r(5220),P=r(10130),$=P.A&&P.A.isMap;const N=$?(0,L.A)($):z;var R=r(49084);const V=function(t){return(0,M.A)(t)&&"[object Set]"==(0,y.A)(t)};var G=P.A&&P.A.isSet;const W=G?(0,L.A)(G):V;var q="[object Arguments]",H="[object Function]",J="[object Object]",K={};K[q]=K["[object Array]"]=K["[object ArrayBuffer]"]=K["[object DataView]"]=K["[object Boolean]"]=K["[object Date]"]=K["[object Float32Array]"]=K["[object Float64Array]"]=K["[object Int8Array]"]=K["[object Int16Array]"]=K["[object Int32Array]"]=K["[object Map]"]=K["[object Number]"]=K[J]=K["[object RegExp]"]=K["[object Set]"]=K["[object String]"]=K["[object Symbol]"]=K["[object Uint8Array]"]=K["[object Uint8ClampedArray]"]=K["[object Uint16Array]"]=K["[object Uint32Array]"]=!0,K["[object Error]"]=K[H]=K["[object WeakMap]"]=!1;const Q=function t(n,r,u,l,d,g){var _,O=1&r,m=2&r,S=4&r;if(u&&(_=d?u(n,l,d,g):u(n)),void 0!==_)return _;if(!(0,R.A)(n))return n;var k=(0,D.A)(n);if(k){if(_=w(n),!O)return(0,v.A)(n,_)}else{var E=(0,y.A)(n),x=E==H||"[object GeneratorFunction]"==E;if((0,F.A)(n))return(0,s.A)(n,O);if(E==J||E==q||x&&!d){if(_=m||x?{}:(0,C.A)(n),!O)return m?j(n,A(_,n)):b(n,i(_,n))}else{if(!K[E])return d?n:{};_=B(n,E,O)}}g||(g=new e.A);var I=g.get(n);if(I)return I;g.set(n,_),W(n)?n.forEach(function(e){_.add(t(e,r,u,e,n,g))}):N(n)&&n.forEach(function(e,o){_.set(o,t(e,r,u,o,n,g))});var U=S?m?p.A:h.A:m?f.A:a.A,M=k?void 0:U(n);return(0,o.A)(M||n,function(e,o){M&&(e=n[o=e]),(0,c.A)(_,o,t(e,r,u,o,n,g))}),_}}}]); \ No newline at end of file diff --git a/assets/js/1937.58891791.js b/assets/js/1937.58891791.js new file mode 100644 index 0000000000..6f6af79435 --- /dev/null +++ b/assets/js/1937.58891791.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1937],{81937:(t,e,n)=>{n.d(e,{diagram:()=>J});var i=n(97485),s=n(3170),r=n(13212),a=n(58480),o=n(81896),c=function(){var t=(0,i.K2)(function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},"o"),e=[6,8,10,11,12,14,16,17,20,21],n=[1,9],s=[1,10],r=[1,11],a=[1,12],o=[1,13],c=[1,16],l=[1,17],h={trace:(0,i.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,timeline:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,period_statement:18,event_statement:19,period:20,event:21,$accept:0,$end:1},terminals_:{2:"error",4:"timeline",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",20:"period",21:"event"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[18,1],[19,1]],performAction:(0,i.K2)(function(t,e,n,i,s,r,a){var o=r.length-1;switch(s){case 1:return r[o-1];case 2:case 6:case 7:this.$=[];break;case 3:r[o-1].push(r[o]),this.$=r[o-1];break;case 4:case 5:this.$=r[o];break;case 8:i.getCommonDb().setDiagramTitle(r[o].substr(6)),this.$=r[o].substr(6);break;case 9:this.$=r[o].trim(),i.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=r[o].trim(),i.getCommonDb().setAccDescription(this.$);break;case 12:i.addSection(r[o].substr(8)),this.$=r[o].substr(8);break;case 15:i.addTask(r[o],0,""),this.$=r[o];break;case 16:i.addEvent(r[o].substr(2)),this.$=r[o]}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:n,12:s,14:r,16:a,17:o,18:14,19:15,20:c,21:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:n,12:s,14:r,16:a,17:o,18:14,19:15,20:c,21:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:(0,i.K2)(function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},"parseError"),parse:(0,i.K2)(function(t){var e=this,n=[0],s=[],r=[null],a=[],o=this.table,c="",l=0,h=0,d=0,u=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var f=p.yylloc;a.push(f);var m=p.options&&p.options.ranges;function x(){var t;return"number"!=typeof(t=s.pop()||p.lex()||1)&&(t instanceof Array&&(t=(s=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,i.K2)(function(t){n.length=n.length-2*t,r.length=r.length-t,a.length=a.length-t},"popStack"),(0,i.K2)(x,"lex");for(var b,k,_,w,v,K,S,$,E,T={};;){if(_=n[n.length-1],this.defaultActions[_]?w=this.defaultActions[_]:(null==b&&(b=x()),w=o[_]&&o[_][b]),void 0===w||!w.length||!w[0]){var I="";for(K in E=[],o[_])this.terminals_[K]&&K>2&&E.push("'"+this.terminals_[K]+"'");I=p.showPosition?"Parse error on line "+(l+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(I,{text:p.match,token:this.terminals_[b]||b,line:p.yylineno,loc:f,expected:E})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+_+", token: "+b);switch(w[0]){case 1:n.push(b),r.push(p.yytext),a.push(p.yylloc),n.push(w[1]),b=null,k?(b=k,k=null):(h=p.yyleng,c=p.yytext,l=p.yylineno,f=p.yylloc,d>0&&d--);break;case 2:if(S=this.productions_[w[1]][1],T.$=r[r.length-S],T._$={first_line:a[a.length-(S||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(S||1)].first_column,last_column:a[a.length-1].last_column},m&&(T._$.range=[a[a.length-(S||1)].range[0],a[a.length-1].range[1]]),void 0!==(v=this.performAction.apply(T,[c,h,l,y.yy,w[1],r,a].concat(u))))return v;S&&(n=n.slice(0,-1*S*2),r=r.slice(0,-1*S),a=a.slice(0,-1*S)),n.push(this.productions_[w[1]][0]),r.push(T.$),a.push(T._$),$=o[n[n.length-2]][n[n.length-1]],n.push($);break;case 3:return!0}}return!0},"parse")},d=function(){return{EOF:1,parseError:(0,i.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,i.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,i.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,i.K2)(function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,i.K2)(function(){return this._more=!0,this},"more"),reject:(0,i.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,i.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,i.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,i.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,i.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,i.K2)(function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1},"test_match"),next:(0,i.K2)(function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;re[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,i.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,i.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,i.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,i.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,i.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,i.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,i.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,i.K2)(function(t,e,n,i){switch(n){case 0:case 1:case 3:case 4:break;case 2:return 10;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),14;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:timeline\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^:\n]+)/i,/^(?::\s(?:[^:\n]|:(?!\s))+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}}}();function u(){this.yy={}}return h.lexer=d,(0,i.K2)(u,"Parser"),u.prototype=h,h.Parser=u,new u}();c.parser=c;var l=c,h={};(0,i.VA)(h,{addEvent:()=>w,addSection:()=>x,addTask:()=>_,addTaskOrg:()=>v,clear:()=>m,default:()=>S,getCommonDb:()=>f,getSections:()=>b,getTasks:()=>k});var d="",u=0,p=[],y=[],g=[],f=(0,i.K2)(()=>i.Wt,"getCommonDb"),m=(0,i.K2)(function(){p.length=0,y.length=0,d="",g.length=0,(0,i.IU)()},"clear"),x=(0,i.K2)(function(t){d=t,p.push(t)},"addSection"),b=(0,i.K2)(function(){return p},"getSections"),k=(0,i.K2)(function(){let t=K();let e=0;for(;!t&&e<100;)t=K(),e++;return y.push(...g),y},"getTasks"),_=(0,i.K2)(function(t,e,n){const i={id:u++,section:d,type:d,task:t,score:e||0,events:n?[n]:[]};g.push(i)},"addTask"),w=(0,i.K2)(function(t){g.find(t=>t.id===u-1).events.push(t)},"addEvent"),v=(0,i.K2)(function(t){const e={section:d,type:d,description:t,task:t,classes:[]};y.push(e)},"addTaskOrg"),K=(0,i.K2)(function(){const t=(0,i.K2)(function(t){return g[t].processed},"compileTask");let e=!0;for(const[n,i]of g.entries())t(n),e=e&&i.processed;return e},"compileTasks"),S={clear:m,getCommonDb:f,addSection:x,getSections:b,getTasks:k,addTask:_,addTaskOrg:v,addEvent:w},$=(0,i.K2)(function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n},"drawRect"),E=(0,i.K2)(function(t,e){const n=15,r=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",n).attr("stroke-width",2).attr("overflow","visible"),a=t.append("g");function o(t){const i=(0,s.JLW)().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}function c(t){const i=(0,s.JLW)().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}function l(t){t.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return a.append("circle").attr("cx",e.cx-5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),a.append("circle").attr("cx",e.cx+5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),(0,i.K2)(o,"smile"),(0,i.K2)(c,"sad"),(0,i.K2)(l,"ambivalent"),e.score>3?o(a):e.score<3?c(a):l(a),r},"drawFace"),T=(0,i.K2)(function(t,e){const n=t.append("circle");return n.attr("cx",e.cx),n.attr("cy",e.cy),n.attr("class","actor-"+e.pos),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("r",e.r),void 0!==n.class&&n.attr("class",n.class),void 0!==e.title&&n.append("title").text(e.title),n},"drawCircle"),I=(0,i.K2)(function(t,e){const n=e.text.replace(//gi," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.attr("class","legend"),i.style("text-anchor",e.anchor),void 0!==e.class&&i.attr("class",e.class);const s=i.append("tspan");return s.attr("x",e.x+2*e.textMargin),s.text(n),i},"drawText"),R=(0,i.K2)(function(t,e){function n(t,e,n,i,s){return t+","+e+" "+(t+n)+","+e+" "+(t+n)+","+(e+i-s)+" "+(t+n-1.2*s)+","+(e+i)+" "+t+","+(e+i)}(0,i.K2)(n,"genPoints");const s=t.append("polygon");s.attr("points",n(e.x,e.y,50,20,7)),s.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,I(t,e)},"drawLabel"),A=(0,i.K2)(function(t,e,n){const i=t.append("g"),s=P();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=n.width,s.height=n.height,s.class="journey-section section-type-"+e.num,s.rx=3,s.ry=3,$(i,s),H(n)(e.text,i,s.x,s.y,s.width,s.height,{class:"journey-section section-type-"+e.num},n,e.colour)},"drawSection"),L=-1,M=(0,i.K2)(function(t,e,n){const i=e.x+n.width/2,s=t.append("g");L++;s.append("line").attr("id","task"+L).attr("x1",i).attr("y1",e.y).attr("x2",i).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),E(s,{cx:i,cy:300+30*(5-e.score),score:e.score});const r=P();r.x=e.x,r.y=e.y,r.fill=e.fill,r.width=n.width,r.height=n.height,r.class="task task-type-"+e.num,r.rx=3,r.ry=3,$(s,r),H(n)(e.task,s,r.x,r.y,r.width,r.height,{class:"task"},n,e.colour)},"drawTask"),C=(0,i.K2)(function(t,e){$(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()},"drawBackgroundRect"),N=(0,i.K2)(function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}},"getTextObj"),P=(0,i.K2)(function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),H=function(){function t(t,e,n,i,r,a,o,c){s(e.append("text").attr("x",n+r/2).attr("y",i+a/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,i,r,a,o,c,l){const{taskFontSize:h,taskFontFamily:d}=c,u=t.split(//gi);for(let p=0;p)/).reverse(),r=[],a=n.attr("y"),o=parseFloat(n.attr("dy")),c=n.text(null).append("tspan").attr("x",0).attr("y",a).attr("dy",o+"em");for(let s=0;se||"
"===t)&&(r.pop(),c.text(r.join(" ").trim()),r="
"===t?[""]:[t],c=n.append("tspan").attr("x",0).attr("y",a).attr("dy","1.1em").text(t))})}(0,i.K2)(j,"wrap");var D=(0,i.K2)(function(t,e,n,i){const s=n%12-1,r=t.append("g");e.section=s,r.attr("class",(e.class?e.class+" ":"")+"timeline-node section-"+s);const a=r.append("g"),o=r.append("g"),c=o.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(j,e.width).node().getBBox(),l=i.fontSize?.replace?i.fontSize.replace("px",""):i.fontSize;return e.height=c.height+1.1*l*.5+e.padding,e.height=Math.max(e.height,e.maxHeight),e.width=e.width+2*e.padding,o.attr("transform","translate("+e.width/2+", "+e.padding/2+")"),W(a,e,s,i),e},"drawNode"),z=(0,i.K2)(function(t,e,n){const i=t.append("g"),s=i.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(j,e.width).node().getBBox(),r=n.fontSize?.replace?n.fontSize.replace("px",""):n.fontSize;return i.remove(),s.height+1.1*r*.5+e.padding},"getVirtualNodeHeight"),W=(0,i.K2)(function(t,e,n){t.append("path").attr("id","node-"+e.id).attr("class","node-bkg node-"+e.type).attr("d",`M0 ${e.height-5} v${10-e.height} q0,-5 5,-5 h${e.width-10} q5,0 5,5 v${e.height-5} H0 Z`),t.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",e.height).attr("x2",e.width).attr("y2",e.height)},"defaultBkg"),B={drawRect:$,drawCircle:T,drawSection:A,drawText:I,drawLabel:R,drawTask:M,drawBackgroundRect:C,getTextObj:N,getNoteRect:P,initGraphics:O,drawNode:D,getVirtualNodeHeight:z},F=(0,i.K2)(function(t,e,n,r){const a=(0,i.D7)(),o=a.leftMargin??50;i.Rm.debug("timeline",r.db);const c=a.securityLevel;let l;"sandbox"===c&&(l=(0,s.Ltv)("#i"+e));const h=("sandbox"===c?(0,s.Ltv)(l.nodes()[0].contentDocument.body):(0,s.Ltv)("body")).select("#"+e);h.append("g");const d=r.db.getTasks(),u=r.db.getCommonDb().getDiagramTitle();i.Rm.debug("task",d),B.initGraphics(h);const p=r.db.getSections();i.Rm.debug("sections",p);let y=0,g=0,f=0,m=0,x=50+o,b=50;m=50;let k=0,_=!0;p.forEach(function(t){const e={number:k,descr:t,section:k,width:150,padding:20,maxHeight:y},n=B.getVirtualNodeHeight(h,e,a);i.Rm.debug("sectionHeight before draw",n),y=Math.max(y,n+20)});let w=0,v=0;i.Rm.debug("tasks.length",d.length);for(const[s,S]of d.entries()){const t={number:s,descr:S,section:S.section,width:150,padding:20,maxHeight:g},e=B.getVirtualNodeHeight(h,t,a);i.Rm.debug("taskHeight before draw",e),g=Math.max(g,e+20),w=Math.max(w,S.events.length);let n=0;for(const i of S.events){const t={descr:i,section:S.section,number:S.section,width:150,padding:20,maxHeight:50};n+=B.getVirtualNodeHeight(h,t,a)}S.events.length>0&&(n+=10*(S.events.length-1)),v=Math.max(v,n)}i.Rm.debug("maxSectionHeight before draw",y),i.Rm.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach(t=>{const e=d.filter(e=>e.section===t),n={number:k,descr:t,section:k,width:200*Math.max(e.length,1)-50,padding:20,maxHeight:y};i.Rm.debug("sectionNode",n);const s=h.append("g"),r=B.drawNode(s,n,k,a);i.Rm.debug("sectionNode output",r),s.attr("transform",`translate(${x}, 50)`),b+=y+50,e.length>0&&V(h,e,k,x,b,g,a,w,v,y,!1),x+=200*Math.max(e.length,1),b=50,k++}):(_=!1,V(h,d,k,x,b,g,a,w,v,y,!0));const K=h.node().getBBox();i.Rm.debug("bounds",K),u&&h.append("text").text(u).attr("x",K.width/2-o).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),f=_?y+g+150:g+100;h.append("g").attr("class","lineWrapper").append("line").attr("x1",o).attr("y1",f).attr("x2",K.width+3*o).attr("y2",f).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),(0,i.ot)(void 0,h,a.timeline?.padding??50,a.timeline?.useMaxWidth??!1)},"draw"),V=(0,i.K2)(function(t,e,n,s,r,a,o,c,l,h,d){for(const u of e){const e={descr:u.task,section:n,number:n,width:150,padding:20,maxHeight:a};i.Rm.debug("taskNode",e);const c=t.append("g").attr("class","taskWrapper"),h=B.drawNode(c,e,n,o).height;if(i.Rm.debug("taskHeight after draw",h),c.attr("transform",`translate(${s}, ${r})`),a=Math.max(a,h),u.events){const e=t.append("g").attr("class","lineWrapper");let i=a;r+=100,i+=G(t,u.events,n,s,r,o),r-=100,e.append("line").attr("x1",s+95).attr("y1",r+a).attr("x2",s+95).attr("y2",r+a+100+l+100).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}s+=200,d&&!o.timeline?.disableMulticolor&&n++}r-=10},"drawTasks"),G=(0,i.K2)(function(t,e,n,s,r,a){let o=0;const c=r;r+=100;for(const l of e){const e={descr:l,section:n,number:n,width:150,padding:20,maxHeight:50};i.Rm.debug("eventNode",e);const c=t.append("g").attr("class","eventWrapper"),h=B.drawNode(c,e,n,a).height;o+=h,c.attr("transform",`translate(${s}, ${r})`),r=r+10+h}return r=c,o},"drawEvents"),U={setConf:(0,i.K2)(()=>{},"setConf"),draw:F},q=(0,i.K2)(t=>{let e="";for(let n=0;n`\n .edge {\n stroke-width: 3;\n }\n ${q(t)}\n .section-root rect, .section-root path, .section-root circle {\n fill: ${t.git0};\n }\n .section-root text {\n fill: ${t.gitBranchLabel0};\n }\n .icon-container {\n height:100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .edge {\n fill: none;\n }\n .eventWrapper {\n filter: brightness(120%);\n }\n`,"getStyles")}}}]); \ No newline at end of file diff --git a/assets/js/19b95078.24dbad74.js b/assets/js/19b95078.24dbad74.js new file mode 100644 index 0000000000..951be8ad17 --- /dev/null +++ b/assets/js/19b95078.24dbad74.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8104],{65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const r={},o=n.createContext(r);function i(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:s},e.children)}},74568:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.12.4/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sort_plugins","permalink":"/ModuleCheck/docs/0.12.4/rules/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/sorting/sort_plugins.md","tags":[],"version":"0.12.4","frontMatter":{"id":"sort_plugins","slug":"/rules/sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.4/rules/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.4/rules/disable_android_resources"}}');var r=t(23420),o=t(65404);const i={id:"sort_plugins",slug:"/rules/sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d()}}}]); \ No newline at end of file diff --git a/assets/js/19d61b19.e67483c8.js b/assets/js/19d61b19.e67483c8.js new file mode 100644 index 0000000000..28b597c29f --- /dev/null +++ b/assets/js/19d61b19.e67483c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7432],{19148:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.11.3/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.11.3/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/must_be_api.md","tags":[],"version":"0.11.3","frontMatter":{"id":"must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.3/rules/unused"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.3/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a3a5cbb.8ba00a30.js b/assets/js/1a3a5cbb.8ba00a30.js new file mode 100644 index 0000000000..f87f3b7119 --- /dev/null +++ b/assets/js/1a3a5cbb.8ba00a30.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3821],{33875:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.11.1/rules/android/disable_resources.md","sourceDirName":"rules/android","slug":"/rules/android/disable_resources","permalink":"/ModuleCheck/docs/0.11.1/rules/android/disable_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/android/disable_resources.md","tags":[],"version":"0.11.1","frontMatter":{"id":"disable_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.11.1/rules/android/disable_viewbinding"}}');var o=r(23420),d=r(65404);const i={id:"disable_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,c={},a=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a3bb66a.8ca073f7.js b/assets/js/1a3bb66a.8ca073f7.js new file mode 100644 index 0000000000..1af7817283 --- /dev/null +++ b/assets/js/1a3bb66a.8ca073f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8029],{6478:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.12.1/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/0.12.1/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/ci_workflow.md","tags":[],"version":"0.12.1","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.1/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_dependency"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheckAuto):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew moduleCheckAuto --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1a4e3797.e1c7b2f5.js b/assets/js/1a4e3797.e1c7b2f5.js new file mode 100644 index 0000000000..8eb63b88ac --- /dev/null +++ b/assets/js/1a4e3797.e1c7b2f5.js @@ -0,0 +1 @@ +(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2138],{5271:e=>{"use strict";function t(e){return"object"==typeof e&&null!==e?i(Array.isArray(e)?[]:{},e):e}function r(e){return"function"==typeof e||Array.isArray(e)||"[object Object]"===Object.prototype.toString.call(e)}function i(e,n){if(e===n)return e;for(var s in n)if(Object.prototype.hasOwnProperty.call(n,s)&&"__proto__"!==s&&"constructor"!==s){var a=n[s],c=e[s];void 0!==c&&void 0===a||(r(c)&&r(a)?e[s]=i(c,a):e[s]=t(a))}return e}e.exports=function(e){r(e)||(e={});for(var t=1,n=arguments.length;t{"use strict";e.exports=function(e,t){if(Array.isArray(e))for(var r=0;r{"use strict";var i=r(7524);e.exports=function(e,t){var r=(t||[]).map(function(e){return e.split(":")});return e.reduce(function(e,t){var n=t.split(":"),s=i(r,function(e){return e[0]===n[0]});return n.length>1||!s?(e[0].push(n[0]),e[1].push(n[1]),e):(e[0].push(s[0]),e[1].push(s[1]),e)},[[],[]])}},13162:e=>{"use strict";e.exports=function(e,t){return e.filter(function(r,i){return t.indexOf(r)>-1&&e.indexOf(r)===i})}},13438:e=>{"use strict";function t(e,t){this._state=e,this._rawResults={};var r=this;e.params.forEach(function(e){var i=e.$$id;r[i]=t[i],r._rawResults[i]=t[i]})}t.prototype={constructor:t},e.exports=t},13624:e=>{"use strict";e.exports=function e(t){if("number"==typeof t)return t;if("string"==typeof t)return parseFloat(t);if(Array.isArray(t))return t.map(e);throw new Error("The value should be a number, a parsable string or an array of those.")}},25270:(e,t,r)=>{"use strict";var i=r(7524),n=r(92048);e.exports=function(e,t){var r={};return t.forEach(function(t){t.forEach(function(t,i){e.includes(t.objectID)||(r[t.objectID]?r[t.objectID]={indexSum:r[t.objectID].indexSum+i,count:r[t.objectID].count+1}:r[t.objectID]={indexSum:i,count:1})})}),function(e,t){var r=[];return Object.keys(e).forEach(function(i){e[i].count<2&&(e[i].indexSum+=100),r.push({objectID:i,avgOfIndices:e[i].indexSum/t})}),r.sort(function(e,t){return e.avgOfIndices>t.avgOfIndices?1:-1})}(r,t.length).reduce(function(e,r){var s=i(n(t),function(e){return e.objectID===r.objectID});return s?e.concat(s):e},[])}},27994:e=>{"use strict";function t(e,t){if(e!==t){var r=void 0!==e,i=null===e,n=void 0!==t,s=null===t;if(!s&&e>t||i&&n||!r)return 1;if(!i&&e=i.length?s:"desc"===i[n]?-s:s}return e.index-r.index}),n.map(function(e){return e.value})}},28181:e=>{function t(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function r(e){return"function"==typeof e}function i(e){return"object"==typeof e&&null!==e}function n(e){return void 0===e}e.exports=t,t.prototype._events=void 0,t.prototype._maxListeners=void 0,t.defaultMaxListeners=10,t.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},t.prototype.emit=function(e){var t,s,a,c,o,u;if(this._events||(this._events={}),"error"===e&&(!this._events.error||i(this._events.error)&&!this._events.error.length)){if((t=arguments[1])instanceof Error)throw t;var h=new Error('Uncaught, unspecified "error" event. ('+t+")");throw h.context=t,h}if(n(s=this._events[e]))return!1;if(r(s))switch(arguments.length){case 1:s.call(this);break;case 2:s.call(this,arguments[1]);break;case 3:s.call(this,arguments[1],arguments[2]);break;default:c=Array.prototype.slice.call(arguments,1),s.apply(this,c)}else if(i(s))for(c=Array.prototype.slice.call(arguments,1),a=(u=s.slice()).length,o=0;o0&&this._events[e].length>a&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace()),this},t.prototype.on=t.prototype.addListener,t.prototype.once=function(e,t){if(!r(t))throw TypeError("listener must be a function");var i=!1;function n(){this.removeListener(e,n),i||(i=!0,t.apply(this,arguments))}return n.listener=t,this.on(e,n),this},t.prototype.removeListener=function(e,t){var n,s,a,c;if(!r(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(a=(n=this._events[e]).length,s=-1,n===t||r(n.listener)&&n.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(i(n)){for(c=a;c-- >0;)if(n[c]===t||n[c].listener&&n[c].listener===t){s=c;break}if(s<0)return this;1===n.length?(n.length=0,delete this._events[e]):n.splice(s,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},t.prototype.removeAllListeners=function(e){var t,i;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r(i=this._events[e]))this.removeListener(e,i);else if(i)for(;i.length;)this.removeListener(e,i[i.length-1]);return delete this._events[e],this},t.prototype.listeners=function(e){return this._events&&this._events[e]?r(this._events[e])?[this._events[e]]:this._events[e].slice():[]},t.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(r(t))return 1;if(t)return t.length}return 0},t.listenerCount=function(e,t){return e.listenerCount(t)}},32626:e=>{"use strict";e.exports=function(e){return e&&Object.keys(e).length>0}},36865:(e,t,r)=>{"use strict";var i=r(75119),n=r(32626),s=r(55042),a={addRefinement:function(e,t,r){if(a.isRefined(e,t,r))return e;var n=""+r,s=e[t]?e[t].concat(n):[n],c={};return c[t]=s,i(c,e)},removeRefinement:function(e,t,r){if(void 0===r)return a.clearRefinement(e,function(e,r){return t===r});var i=""+r;return a.clearRefinement(e,function(e,r){return t===r&&i===e})},toggleRefinement:function(e,t,r){if(void 0===r)throw new Error("toggleRefinement should be used with a value");return a.isRefined(e,t,r)?a.removeRefinement(e,t,r):a.addRefinement(e,t,r)},clearRefinement:function(e,t,r){if(void 0===t)return n(e)?{}:e;if("string"==typeof t)return s(e,[t]);if("function"==typeof t){var i=!1,a=Object.keys(e).reduce(function(n,s){var a=e[s]||[],c=a.filter(function(e){return!t(e,s,r)});return c.length!==a.length&&(i=!0),n[s]=c,n},{});return i?a:e}},isRefined:function(e,t,r){var i=Boolean(e[t])&&e[t].length>0;if(void 0===r||!i)return i;var n=""+r;return-1!==e[t].indexOf(n)}};e.exports=a},42251:e=>{"use strict";e.exports=function(e,t){e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}},48748:e=>{"use strict";e.exports={escapeFacetValue:function(e){return"string"!=typeof e?e:String(e).replace(/^-/,"\\-")},unescapeFacetValue:function(e){return"string"!=typeof e?e:e.replace(/^\\-/,"-")}}},54908:(e,t,r)=>{"use strict";var i=r(78634),n=r(75119),s=r(48748),a=r(7524),c=r(69726),o=r(12436),u=r(83032),h=r(27994),l=s.escapeFacetValue,f=s.unescapeFacetValue,m=r(56344);function d(e){var t={};return e.forEach(function(e,r){t[e]=r}),t}function p(e,t,r){t&&t[r]&&(e.stats=t[r])}function g(e,t,r){var s=t[0]||{};this._rawResults=t;var o=this;Object.keys(s).forEach(function(e){o[e]=s[e]});var h=n(r,{persistHierarchicalRootCount:!1});Object.keys(h).forEach(function(e){o[e]=h[e]}),this.processingTimeMS=t.reduce(function(e,t){return void 0===t.processingTimeMS?e:e+t.processingTimeMS},0),this.disjunctiveFacets=[],this.hierarchicalFacets=e.hierarchicalFacets.map(function(){return[]}),this.facets=[];var l=e.getRefinedDisjunctiveFacets(),g=d(e.facets),v=d(e.disjunctiveFacets),y=1,R=s.facets||{};Object.keys(R).forEach(function(t){var r,i,n=R[t],u=(r=e.hierarchicalFacets,i=t,a(r,function(e){return(e.attributes||[]).indexOf(i)>-1}));if(u){var h=u.attributes.indexOf(t),l=c(e.hierarchicalFacets,function(e){return e.name===u.name});o.hierarchicalFacets[l][h]={attribute:t,data:n,exhaustive:s.exhaustiveFacetsCount}}else{var f,m=-1!==e.disjunctiveFacets.indexOf(t),d=-1!==e.facets.indexOf(t);m&&(f=v[t],o.disjunctiveFacets[f]={name:t,data:n,exhaustive:s.exhaustiveFacetsCount},p(o.disjunctiveFacets[f],s.facets_stats,t)),d&&(f=g[t],o.facets[f]={name:t,data:n,exhaustive:s.exhaustiveFacetsCount},p(o.facets[f],s.facets_stats,t))}}),this.hierarchicalFacets=i(this.hierarchicalFacets),l.forEach(function(r){var i=t[y],a=i&&i.facets?i.facets:{},h=e.getHierarchicalFacetByName(r);Object.keys(a).forEach(function(t){var r,l=a[t];if(h){r=c(e.hierarchicalFacets,function(e){return e.name===h.name});var m=c(o.hierarchicalFacets[r],function(e){return e.attribute===t});if(-1===m)return;o.hierarchicalFacets[r][m].data=o.persistHierarchicalRootCount?u(o.hierarchicalFacets[r][m].data,l):n(l,o.hierarchicalFacets[r][m].data)}else{r=v[t];var d=s.facets&&s.facets[t]||{};o.disjunctiveFacets[r]={name:t,data:u(d,l),exhaustive:i.exhaustiveFacetsCount},p(o.disjunctiveFacets[r],i.facets_stats,t),e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].forEach(function(i){!o.disjunctiveFacets[r].data[i]&&e.disjunctiveFacetsRefinements[t].indexOf(f(i))>-1&&(o.disjunctiveFacets[r].data[i]=0)})}}),y++}),e.getRefinedHierarchicalFacets().forEach(function(r){var i=e.getHierarchicalFacetByName(r),s=e._getHierarchicalFacetSeparator(i),a=e.getHierarchicalRefinement(r);0===a.length||a[0].split(s).length<2||t.slice(y).forEach(function(t){var r=t&&t.facets?t.facets:{};Object.keys(r).forEach(function(t){var u=r[t],h=c(e.hierarchicalFacets,function(e){return e.name===i.name}),l=c(o.hierarchicalFacets[h],function(e){return e.attribute===t});if(-1!==l){var f={};if(a.length>0&&!o.persistHierarchicalRootCount){var m=a[0].split(s)[0];f[m]=o.hierarchicalFacets[h][l].data[m]}o.hierarchicalFacets[h][l].data=n(f,u,o.hierarchicalFacets[h][l].data)}}),y++})}),Object.keys(e.facetsExcludes).forEach(function(t){var r=e.facetsExcludes[t],i=g[t];o.facets[i]={name:t,data:R[t],exhaustive:s.exhaustiveFacetsCount},r.forEach(function(e){o.facets[i]=o.facets[i]||{name:t},o.facets[i].data=o.facets[i].data||{},o.facets[i].data[e]=0})}),this.hierarchicalFacets=this.hierarchicalFacets.map(m(e)),this.facets=i(this.facets),this.disjunctiveFacets=i(this.disjunctiveFacets),this._state=e}function v(e,t){function r(e){return e.name===t}if(e._state.isConjunctiveFacet(t)){var i=a(e.facets,r);return i?Object.keys(i.data).map(function(r){var n=l(r);return{name:r,escapedValue:n,count:i.data[r],isRefined:e._state.isFacetRefined(t,n),isExcluded:e._state.isExcludeRefined(t,r)}}):[]}if(e._state.isDisjunctiveFacet(t)){var n=a(e.disjunctiveFacets,r);return n?Object.keys(n.data).map(function(r){var i=l(r);return{name:r,escapedValue:i,count:n.data[r],isRefined:e._state.isDisjunctiveFacetRefined(t,i)}}):[]}if(e._state.isHierarchicalFacet(t)){var s=a(e.hierarchicalFacets,r);if(!s)return s;var c=e._state.getHierarchicalFacetByName(t),o=e._state._getHierarchicalFacetSeparator(c),u=f(e._state.getHierarchicalRefinement(t)[0]||"");0===u.indexOf(c.rootPath)&&(u=u.replace(c.rootPath+o,""));var h=u.split(o);return h.unshift(t),y(s,h,0),s}}function y(e,t,r){e.isRefined=e.name===(t[r]&&t[r].trim()),e.data&&e.data.forEach(function(e){y(e,t,r+1)})}function R(e,t,r,i){if(i=i||0,Array.isArray(t))return e(t,r[i]);if(!t.data||0===t.data.length)return t;var s=t.data.map(function(t){return R(e,t,r,i+1)}),a=e(s,r[i]);return n({data:a},t)}function F(e,t){var r=a(e,function(e){return e.name===t});return r&&r.stats}function _(e,t,r,i,n){var s=a(n,function(e){return e.name===r}),c=s&&s.data&&s.data[i]?s.data[i]:0,o=s&&s.exhaustive||!1;return{type:t,attributeName:r,name:i,count:c,exhaustive:o}}g.prototype.getFacetByName=function(e){function t(t){return t.name===e}return a(this.facets,t)||a(this.disjunctiveFacets,t)||a(this.hierarchicalFacets,t)},g.DEFAULT_SORT=["isRefined:desc","count:desc","name:asc"],g.prototype.getFacetValues=function(e,t){var r=v(this,e);if(r){var i,s=n(t,{sortBy:g.DEFAULT_SORT,facetOrdering:!(t&&t.sortBy)}),a=this;if(Array.isArray(r))i=[e];else i=a._state.getHierarchicalFacetByName(r.name).attributes;return R(function(e,t){if(s.facetOrdering){var r=function(e,t){return e.renderingContent&&e.renderingContent.facetOrdering&&e.renderingContent.facetOrdering.values&&e.renderingContent.facetOrdering.values[t]}(a,t);if(r)return function(e,t){var r=[],i=[],n=t.hide||[],s=(t.order||[]).reduce(function(e,t,r){return e[t]=r,e},{});e.forEach(function(e){var t=e.path||e.name,a=n.indexOf(t)>-1;a||void 0===s[t]?a||i.push(e):r[s[t]]=e}),r=r.filter(function(e){return e});var a,c=t.sortRemainingBy;return"hidden"===c?r:(a="alpha"===c?[["path","name"],["asc","asc"]]:[["count"],["desc"]],r.concat(h(i,a[0],a[1])))}(e,r)}if(Array.isArray(s.sortBy)){var i=o(s.sortBy,g.DEFAULT_SORT);return h(e,i[0],i[1])}if("function"==typeof s.sortBy)return function(e,t){return t.sort(e)}(s.sortBy,e);throw new Error("options.sortBy is optional but if defined it must be either an array of string (predicates) or a sorting function")},r,i)}},g.prototype.getFacetStats=function(e){return this._state.isConjunctiveFacet(e)?F(this.facets,e):this._state.isDisjunctiveFacet(e)?F(this.disjunctiveFacets,e):void 0},g.prototype.getRefinements=function(){var e=this._state,t=this,r=[];return Object.keys(e.facetsRefinements).forEach(function(i){e.facetsRefinements[i].forEach(function(n){r.push(_(e,"facet",i,n,t.facets))})}),Object.keys(e.facetsExcludes).forEach(function(i){e.facetsExcludes[i].forEach(function(n){r.push(_(e,"exclude",i,n,t.facets))})}),Object.keys(e.disjunctiveFacetsRefinements).forEach(function(i){e.disjunctiveFacetsRefinements[i].forEach(function(n){r.push(_(e,"disjunctive",i,n,t.disjunctiveFacets))})}),Object.keys(e.hierarchicalFacetsRefinements).forEach(function(i){e.hierarchicalFacetsRefinements[i].forEach(function(n){r.push(function(e,t,r,i){var n=e.getHierarchicalFacetByName(t),s=e._getHierarchicalFacetSeparator(n),c=r.split(s),o=a(i,function(e){return e.name===t}),u=c.reduce(function(e,t){var r=e&&a(e.data,function(e){return e.name===t});return void 0!==r?r:e},o),h=u&&u.count||0,l=u&&u.exhaustive||!1,f=u&&u.path||"";return{type:"hierarchical",attributeName:t,name:f,count:h,exhaustive:l}}(e,i,n,t.hierarchicalFacets))})}),Object.keys(e.numericRefinements).forEach(function(t){var i=e.numericRefinements[t];Object.keys(i).forEach(function(e){i[e].forEach(function(i){r.push({type:"numeric",attributeName:t,name:i,numericValue:i,operator:e})})})}),e.tagRefinements.forEach(function(e){r.push({type:"tag",attributeName:"_tags",name:e})}),r},e.exports=g},55042:e=>{"use strict";e.exports=function(e,t){if(null===e)return{};var r,i,n={},s=Object.keys(e);for(i=0;i=0||(n[r]=e[r]);return n}},55661:e=>{"use strict";e.exports="3.26.0"},56344:(e,t,r)=>{"use strict";e.exports=function(e){return function(t,r){var i=e.hierarchicalFacets[r],u=e.hierarchicalFacetsRefinements[i.name]&&e.hierarchicalFacetsRefinements[i.name][0]||"",h=e._getHierarchicalFacetSeparator(i),l=e._getHierarchicalRootPath(i),f=e._getHierarchicalShowParentLevel(i),m=s(e._getHierarchicalFacetSortBy(i)),d=t.every(function(e){return e.exhaustive}),p=function(e,t,r,i,s){return function(u,h,l){var f=u;if(l>0){var m=0;for(f=u;m{"use strict";r.r(t),r.d(t,{default:()=>W});var i=r(36672),n=r(13526),s=r(89172),a=r.n(s);function c(e){let t;const r=`algolia-client-js-${e.key}`;function i(){return void 0===t&&(t=e.localStorage||window.localStorage),t}function n(){return JSON.parse(i().getItem(r)||"{}")}function s(e){i().setItem(r,JSON.stringify(e))}return{get:(t,r,i={miss:()=>Promise.resolve()})=>Promise.resolve().then(()=>(function(){const t=e.timeToLive?1e3*e.timeToLive:null,r=n(),i=Object.fromEntries(Object.entries(r).filter(([,e])=>void 0!==e.timestamp));if(s(i),!t)return;s(Object.fromEntries(Object.entries(i).filter(([,e])=>{const r=(new Date).getTime();return!(e.timestamp+tPromise.all([e?e.value:r(),void 0!==e])).then(([e,t])=>Promise.all([e,t||i.miss(e)])).then(([e])=>e),set:(e,t)=>Promise.resolve().then(()=>{const s=n();return s[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},i().setItem(r,JSON.stringify(s)),t}),delete:e=>Promise.resolve().then(()=>{const t=n();delete t[JSON.stringify(e)],i().setItem(r,JSON.stringify(t))}),clear:()=>Promise.resolve().then(()=>{i().removeItem(r)})}}function o(e){const t=[...e.caches],r=t.shift();return void 0===r?{get:(e,t,r={miss:()=>Promise.resolve()})=>t().then(e=>Promise.all([e,r.miss(e)])).then(([e])=>e),set:(e,t)=>Promise.resolve(t),delete:e=>Promise.resolve(),clear:()=>Promise.resolve()}:{get:(e,i,n={miss:()=>Promise.resolve()})=>r.get(e,i,n).catch(()=>o({caches:t}).get(e,i,n)),set:(e,i)=>r.set(e,i).catch(()=>o({caches:t}).set(e,i)),delete:e=>r.delete(e).catch(()=>o({caches:t}).delete(e)),clear:()=>r.clear().catch(()=>o({caches:t}).clear())}}function u(e={serializable:!0}){let t={};return{get(r,i,n={miss:()=>Promise.resolve()}){const s=JSON.stringify(r);if(s in t)return Promise.resolve(e.serializable?JSON.parse(t[s]):t[s]);const a=i();return a.then(e=>n.miss(e)).then(()=>a)},set:(r,i)=>(t[JSON.stringify(r)]=e.serializable?JSON.stringify(i):i,Promise.resolve(i)),delete:e=>(delete t[JSON.stringify(e)],Promise.resolve()),clear:()=>(t={},Promise.resolve())}}function h({algoliaAgents:e,client:t,version:r}){const i=function(e){const t={value:`Algolia for JavaScript (${e})`,add(e){const r=`; ${e.segment}${void 0!==e.version?` (${e.version})`:""}`;return-1===t.value.indexOf(r)&&(t.value=`${t.value}${r}`),t}};return t}(r).add({segment:t,version:r});return e.forEach(e=>i.add(e)),i}var l=12e4;function f(e,t="up"){const r=Date.now();return{...e,status:t,lastUpdate:r,isUp:function(){return"up"===t||Date.now()-r>l},isTimedOut:function(){return"timed out"===t&&Date.now()-r<=l}}}var m=class extends Error{name="AlgoliaError";constructor(e,t){super(e),t&&(this.name=t)}},d=class extends m{stackTrace;constructor(e,t,r){super(e,r),this.stackTrace=t}},p=class extends d{constructor(e){super("Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",e,"RetryError")}},g=class extends d{status;constructor(e,t,r,i="ApiError"){super(e,r,i),this.status=t}},v=class extends m{response;constructor(e,t){super(e,"DeserializationError"),this.response=t}},y=class extends g{error;constructor(e,t,r,i){super(e,t,i,"DetailedApiError"),this.error=r}};function R(e,t,r){const i=(n=r,Object.keys(n).filter(e=>void 0!==n[e]).sort().map(e=>`${e}=${encodeURIComponent("[object Array]"===Object.prototype.toString.call(n[e])?n[e].join(","):n[e]).replace(/\+/g,"%20")}`).join("&"));var n;let s=`${e.protocol}://${e.url}${e.port?`:${e.port}`:""}/${"/"===t.charAt(0)?t.substring(1):t}`;return i.length&&(s+=`?${i}`),s}function F(e){const t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return{...e,request:{...e.request,headers:{...e.request.headers,...t}}}}function _({hosts:e,hostsCache:t,baseHeaders:r,logger:i,baseQueryParameters:n,algoliaAgent:s,timeouts:a,requester:c,requestsCache:o,responsesCache:u}){async function h(o,u,h=!0){const l=[],m=function(e,t){if("GET"===e.method||void 0===e.data&&void 0===t.data)return;const r=Array.isArray(e.data)?e.data:{...e.data,...t.data};return JSON.stringify(r)}(o,u),d=function(e,t,r){const i={Accept:"application/json",...e,...t,...r},n={};return Object.keys(i).forEach(e=>{const t=i[e];n[e.toLowerCase()]=t}),n}(r,o.headers,u.headers),_="GET"===o.method?{...o.data,...u.data}:{},b={...n,...o.queryParameters,..._};if(s.value&&(b["x-algolia-agent"]=s.value),u&&u.queryParameters)for(const e of Object.keys(u.queryParameters))u.queryParameters[e]&&"[object Object]"!==Object.prototype.toString.call(u.queryParameters[e])?b[e]=u.queryParameters[e].toString():b[e]=u.queryParameters[e];let P=0;const j=async(e,r)=>{const n=e.pop();if(void 0===n)throw new p(function(e){return e.map(e=>F(e))}(l));const s={...a,...u.timeouts},_={data:m,headers:d,method:o.method,url:R(n,o.path,b),connectTimeout:r(P,s.connect),responseTimeout:r(P,h?s.read:s.write)},x=t=>{const r={request:_,response:t,host:n,triesLeft:e.length};return l.push(r),r},E=await c.send(_);if(function({isTimedOut:e,status:t}){return e||function({isTimedOut:e,status:t}){return!e&&0===~~t}({isTimedOut:e,status:t})||2!=~~(t/100)&&4!=~~(t/100)}(E)){const s=x(E);return E.isTimedOut&&P++,i.info("Retryable failure",F(s)),await t.set(n,f(n,E.isTimedOut?"timed out":"down")),j(e,r)}if(function({status:e}){return 2==~~(e/100)}(E))return function(e){try{return JSON.parse(e.content)}catch(t){throw new v(t.message,e)}}(E);throw x(E),function({content:e,status:t},r){try{const i=JSON.parse(e);return"error"in i?new y(i.message,t,i.error,r):new g(i.message,t,r)}catch{}return new g(e,t,r)}(E,l)},x=e.filter(e=>"readWrite"===e.accept||(h?"read"===e.accept:"write"===e.accept)),E=await async function(e){const r=await Promise.all(e.map(e=>t.get(e,()=>Promise.resolve(f(e))))),i=r.filter(e=>e.isUp()),n=r.filter(e=>e.isTimedOut()),s=[...i,...n];return{hosts:s.length>0?s:e,getTimeout:(e,t)=>(0===n.length&&0===e?1:n.length+3+e)*t}}(x);return j([...E.hosts].reverse(),E.getTimeout)}return{hostsCache:t,requester:c,timeouts:a,logger:i,algoliaAgent:s,baseHeaders:r,baseQueryParameters:n,hosts:e,request:function(e,t={}){const i=e.useReadTransporter||"GET"===e.method;if(!i)return h(e,t,i);const s=()=>h(e,t);if(!0!==(t.cacheable||e.cacheable))return s();const a={request:e,requestOptions:t,transporter:{queryParameters:n,headers:r}};return u.get(a,()=>o.get(a,()=>o.set(a,s()).then(e=>Promise.all([o.delete(a),e]),e=>Promise.all([o.delete(a),Promise.reject(e)])).then(([e,t])=>t)),{miss:e=>u.set(a,e)})},requestsCache:o,responsesCache:u}}var b="5.32.0";function P(e){return[{url:`${e}-dsn.algolia.net`,accept:"read",protocol:"https"},{url:`${e}.algolia.net`,accept:"write",protocol:"https"}].concat(function(e){const t=e;for(let r=e.length-1;r>0;r--){const i=Math.floor(Math.random()*(r+1)),n=e[r];t[r]=e[i],t[i]=n}return t}([{url:`${e}-1.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${e}-2.algolianet.com`,accept:"readWrite",protocol:"https"},{url:`${e}-3.algolianet.com`,accept:"readWrite",protocol:"https"}]))}function j(e,t,r){if(!e||"string"!=typeof e)throw new Error("`appId` is missing.");if(!t||"string"!=typeof t)throw new Error("`apiKey` is missing.");return function({appId:e,apiKey:t,authMode:r,algoliaAgents:i,...n}){const s=function(e,t,r="WithinHeaders"){const i={"x-algolia-api-key":t,"x-algolia-application-id":e};return{headers:()=>"WithinHeaders"===r?i:{},queryParameters:()=>"WithinQueryParameters"===r?i:{}}}(e,t,r),a=_({hosts:P(e),...n,algoliaAgent:h({algoliaAgents:i,client:"Lite",version:b}),baseHeaders:{"content-type":"text/plain",...s.headers(),...n.baseHeaders},baseQueryParameters:{...s.queryParameters(),...n.baseQueryParameters}});return{transporter:a,appId:e,apiKey:t,clearCache:()=>Promise.all([a.requestsCache.clear(),a.responsesCache.clear()]).then(()=>{}),get _ua(){return a.algoliaAgent.value},addAlgoliaAgent(e,t){a.algoliaAgent.add({segment:e,version:t})},setClientApiKey({apiKey:e}){r&&"WithinHeaders"!==r?a.baseQueryParameters["x-algolia-api-key"]=e:a.baseHeaders["x-algolia-api-key"]=e},searchForHits(e,t){return this.search(e,t)},searchForFacets(e,t){return this.search(e,t)},customPost({path:e,parameters:t,body:r},i){if(!e)throw new Error("Parameter `path` is required when calling `customPost`.");const n={method:"POST",path:"/{path}".replace("{path}",e),queryParameters:t||{},headers:{},data:r||{}};return a.request(n,i)},getRecommendations(e,t){if(e&&Array.isArray(e)&&(e={requests:e}),!e)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!e.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");const r={method:"POST",path:"/1/indexes/*/recommendations",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return a.request(r,t)},search(e,t){if(e&&Array.isArray(e)){const t={requests:e.map(({params:e,...t})=>"facet"===t.type?{...t,...e,type:"facet"}:{...t,...e,facet:void 0,maxFacetHits:void 0,facetQuery:void 0})};e=t}if(!e)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!e.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");const r={method:"POST",path:"/1/indexes/*/queries",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return a.request(r,t)}}}({appId:e,apiKey:t,timeouts:{connect:1e3,read:2e3,write:3e4},logger:{debug:(e,t)=>Promise.resolve(),info:(e,t)=>Promise.resolve(),error:(e,t)=>Promise.resolve()},requester:{send:function(e){return new Promise(t=>{let r=new XMLHttpRequest;r.open(e.method,e.url,!0),Object.keys(e.headers).forEach(t=>r.setRequestHeader(t,e.headers[t]));let i,n=(e,i)=>setTimeout(()=>{r.abort(),t({status:0,content:i,isTimedOut:!0})},e),s=n(e.connectTimeout,"Connection timeout");r.onreadystatechange=()=>{r.readyState>r.OPENED&&void 0===i&&(clearTimeout(s),i=n(e.responseTimeout,"Socket timeout"))},r.onerror=()=>{0===r.status&&(clearTimeout(s),clearTimeout(i),t({content:r.responseText||"Network request failed",status:r.status,isTimedOut:!1}))},r.onload=()=>{clearTimeout(s),clearTimeout(i),t({content:r.responseText,status:r.status,isTimedOut:!1})},r.send(e.data)})}},algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:u(),requestsCache:u({serializable:!1}),hostsCache:o({caches:[c({key:`${b}-${e}`}),u()]}),...r})}var x=r(20601),E=r(33412),w=r(75150),O=r(72408),A=r(56562);const S=["zero","one","two","few","many","other"];function H(e){return S.filter(t=>e.includes(t))}const Q={locale:"en",pluralForms:H(["one","other"]),select:e=>1===e?"one":"other"};function T(){const{i18n:{currentLocale:e}}=(0,A.A)();return(0,i.useMemo)(()=>{try{return function(e){const t=new Intl.PluralRules(e);return{locale:e,pluralForms:H(t.resolvedOptions().pluralCategories),select:e=>t.select(e)}}(e)}catch(t){return console.error(`Failed to use Intl.PluralRules for locale "${e}".\nDocusaurus will fallback to the default (English) implementation.\nError: ${t.message}\n`),Q}},[e])}function N(){const e=T();return{selectMessage:(t,r)=>function(e,t,r){const i=e.split("|");if(1===i.length)return i[0];i.length>r.pluralForms.length&&console.error(`For locale=${r.locale}, a maximum of ${r.pluralForms.length} plural forms are expected (${r.pluralForms.join(",")}), but the message contains ${i.length}: ${e}`);const n=r.select(t),s=r.pluralForms.indexOf(n);return i[Math.min(s,i.length-1)]}(r,t,e)}}var C=r(96414),I=r(92471),k=r(6617),D=r(53499),q=r(76742),V=r(72686),L=r(64381),$=r(33555);const B={searchQueryInput:"searchQueryInput_IMhk",searchVersionInput:"searchVersionInput_mtTg",searchResultsColumn:"searchResultsColumn_G6mq",algoliaLogo:"algoliaLogo_Cb5O",algoliaLogoPathFill:"algoliaLogoPathFill_Sa0X",searchResultItem:"searchResultItem_kW3O",searchResultItemHeading:"searchResultItemHeading_ziqy",searchResultItemPath:"searchResultItemPath_fXVp",searchResultItemSummary:"searchResultItemSummary_OBXT",searchQueryColumn:"searchQueryColumn_p4Tk",searchVersionColumn:"searchVersionColumn_rmXB",searchLogoColumn:"searchLogoColumn_dlOk",loadingSpinner:"loadingSpinner_PO6b","loading-spin":"loading-spin_OM_n",loader:"loader_jQCF"};var M=r(23420);function z({docsSearchVersionsHelpers:e}){const t=Object.entries(e.allDocsData).filter(([,e])=>e.versions.length>1);return(0,M.jsx)("div",{className:(0,n.A)("col","col--3","padding-left--none",B.searchVersionColumn),children:t.map(([r,i])=>{const n=t.length>1?`${r}: `:"";return(0,M.jsx)("select",{onChange:t=>e.setSearchVersion(r,t.target.value),defaultValue:e.searchVersions[r],className:B.searchVersionInput,children:i.versions.map((e,t)=>(0,M.jsx)("option",{label:`${n}${e.label}`,value:e.name},t))},r)})})}function J(){const{i18n:{currentLocale:e}}=(0,A.A)(),{algolia:{appId:t,apiKey:r,indexName:s,contextualSearch:c}}=(0,q.c)(),o=(0,V.C)(),u=function(){const{selectMessage:e}=N();return t=>e(t,(0,D.T)({id:"theme.SearchPage.documentsFound.plurals",description:'Pluralized label for "{count} documents found". Use as much plural forms (separated by "|") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)',message:"One document found|{count} documents found"},{count:t}))}(),h=function(){const e=(0,O.Gy)(),[t,r]=(0,i.useState)(()=>Object.entries(e).reduce((e,[t,r])=>({...e,[t]:r.versions[0].name}),{})),n=Object.values(e).some(e=>e.versions.length>1);return{allDocsData:e,versioningEnabled:n,searchVersions:t,setSearchVersion:(e,t)=>r(r=>({...r,[e]:t}))}}(),[l,f]=(0,C.b)(),m=function(e){return e?(0,D.T)({id:"theme.SearchPage.existingResultsTitle",message:'Search results for "{query}"',description:"The search page title for non-empty query"},{query:e}):(0,D.T)({id:"theme.SearchPage.emptyResultsTitle",message:"Search the documentation",description:"The search page title for empty query"})}(l),d={items:[],query:null,totalResults:null,totalPages:null,lastPage:null,hasMore:null,loading:null},[p,g]=(0,i.useReducer)((e,t)=>{switch(t.type){case"reset":return d;case"loading":return{...e,loading:!0};case"update":return l!==t.value.query?e:{...t.value,items:0===t.value.lastPage?t.value.items:e.items.concat(t.value.items)};case"advance":{const t=e.totalPages>e.lastPage+1;return{...e,lastPage:t?e.lastPage+1:e.lastPage,hasMore:t}}default:return e}},d),v=c?["language","docusaurus_tag"]:[],y=j(t,r),R=a()(y,s,{hitsPerPage:15,advancedSyntax:!0,disjunctiveFacets:v});R.on("result",({results:{query:e,hits:t,page:r,nbHits:i,nbPages:n}})=>{if(""===e||!Array.isArray(t))return void g({type:"reset"});const s=e=>e.replace(/algolia-docsearch-suggestion--highlight/g,"search-result-match"),a=t.map(({url:e,_highlightResult:{hierarchy:t},_snippetResult:r={}})=>{const i=Object.keys(t).map(e=>s(t[e].value));return{title:i.pop(),url:o(e),summary:r.content?`${s(r.content.value)}...`:"",breadcrumbs:i}});g({type:"update",value:{items:a,query:e,totalResults:i,totalPages:n,lastPage:r,hasMore:n>r+1,loading:!1}})});const[F,_]=(0,i.useState)(null),b=(0,i.useRef)(0),P=(0,i.useRef)(x.A.canUseIntersectionObserver&&new IntersectionObserver(e=>{const{isIntersecting:t,boundingClientRect:{y:r}}=e[0];t&&b.current>r&&g({type:"advance"}),b.current=r},{threshold:1})),S=(0,I._q)((t=0)=>{c&&(R.addDisjunctiveFacetRefinement("docusaurus_tag","default"),R.addDisjunctiveFacetRefinement("language",e),Object.entries(h.searchVersions).forEach(([e,t])=>{R.addDisjunctiveFacetRefinement("docusaurus_tag",`docs-${e}-${t}`)})),R.setQuery(l).setPage(t).search()});return(0,i.useEffect)(()=>{if(!F)return;const e=P.current;return e?(e.observe(F),()=>e.unobserve(F)):()=>!0},[F]),(0,i.useEffect)(()=>{g({type:"reset"}),l&&(g({type:"loading"}),setTimeout(()=>{S()},300))},[l,h.searchVersions,S]),(0,i.useEffect)(()=>{p.lastPage&&0!==p.lastPage&&S(p.lastPage)},[S,p.lastPage]),(0,M.jsxs)(L.A,{children:[(0,M.jsx)(k.be,{title:m}),(0,M.jsx)(E.A,{children:(0,M.jsx)("meta",{property:"robots",content:"noindex, follow"})}),(0,M.jsxs)("div",{className:"container margin-vert--lg",children:[(0,M.jsx)($.A,{as:"h1",children:m}),(0,M.jsxs)("form",{className:"row",onSubmit:e=>e.preventDefault(),children:[(0,M.jsx)("div",{className:(0,n.A)("col",B.searchQueryColumn,{"col--9":h.versioningEnabled,"col--12":!h.versioningEnabled}),children:(0,M.jsx)("input",{type:"search",name:"q",className:B.searchQueryInput,placeholder:(0,D.T)({id:"theme.SearchPage.inputPlaceholder",message:"Type your search here",description:"The placeholder for search page input"}),"aria-label":(0,D.T)({id:"theme.SearchPage.inputLabel",message:"Search",description:"The ARIA label for search page input"}),onChange:e=>f(e.target.value),value:l,autoComplete:"off",autoFocus:!0})}),c&&h.versioningEnabled&&(0,M.jsx)(z,{docsSearchVersionsHelpers:h})]}),(0,M.jsxs)("div",{className:"row",children:[(0,M.jsx)("div",{className:(0,n.A)("col","col--8",B.searchResultsColumn),children:!!p.totalResults&&u(p.totalResults)}),(0,M.jsx)("div",{className:(0,n.A)("col","col--4","text--right",B.searchLogoColumn),children:(0,M.jsx)(w.A,{to:"https://www.algolia.com/","aria-label":(0,D.T)({id:"theme.SearchPage.algoliaLabel",message:"Search by Algolia",description:"The ARIA label for Algolia mention"}),children:(0,M.jsx)("svg",{viewBox:"0 0 168 24",className:B.algoliaLogo,children:(0,M.jsxs)("g",{fill:"none",children:[(0,M.jsx)("path",{className:B.algoliaLogoPathFill,d:"M120.925 18.804c-4.386.02-4.386-3.54-4.386-4.106l-.007-13.336 2.675-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-10.846-2.18c.821 0 1.43-.047 1.855-.129v-2.719a6.334 6.334 0 0 0-1.574-.199 5.7 5.7 0 0 0-.897.069 2.699 2.699 0 0 0-.814.24c-.24.116-.439.28-.582.491-.15.212-.219.335-.219.656 0 .628.219.991.616 1.23s.938.362 1.615.362zm-.233-9.7c.883 0 1.629.109 2.231.328.602.218 1.088.525 1.444.915.363.396.609.922.76 1.483.157.56.232 1.175.232 1.85v6.874a32.5 32.5 0 0 1-1.868.314c-.834.123-1.772.185-2.813.185-.69 0-1.327-.069-1.895-.198a4.001 4.001 0 0 1-1.471-.636 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.803 0-.656.13-1.073.384-1.525a3.24 3.24 0 0 1 1.047-1.106c.445-.287.95-.492 1.532-.615a8.8 8.8 0 0 1 1.82-.185 8.404 8.404 0 0 1 1.972.24v-.438c0-.307-.035-.6-.11-.874a1.88 1.88 0 0 0-.384-.73 1.784 1.784 0 0 0-.724-.493 3.164 3.164 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.735 7.735 0 0 0-1.26.307l-.321-2.192c.335-.117.834-.233 1.478-.349a10.98 10.98 0 0 1 2.073-.178zm52.842 9.626c.822 0 1.43-.048 1.854-.13V13.7a6.347 6.347 0 0 0-1.574-.199c-.294 0-.595.021-.896.069a2.7 2.7 0 0 0-.814.24 1.46 1.46 0 0 0-.582.491c-.15.212-.218.335-.218.656 0 .628.218.991.615 1.23.404.245.938.362 1.615.362zm-.226-9.694c.883 0 1.629.108 2.231.327.602.219 1.088.526 1.444.915.355.39.609.923.759 1.483a6.8 6.8 0 0 1 .233 1.852v6.873c-.41.088-1.034.19-1.868.314-.834.123-1.772.184-2.813.184-.69 0-1.327-.068-1.895-.198a4.001 4.001 0 0 1-1.471-.635 3.085 3.085 0 0 1-.951-1.134c-.226-.465-.343-1.12-.343-1.804 0-.656.13-1.073.384-1.524.26-.45.608-.82 1.047-1.107.445-.286.95-.491 1.532-.614a8.803 8.803 0 0 1 2.751-.13c.329.034.671.096 1.04.185v-.437a3.3 3.3 0 0 0-.109-.875 1.873 1.873 0 0 0-.384-.731 1.784 1.784 0 0 0-.724-.492 3.165 3.165 0 0 0-1.143-.205c-.616 0-1.177.075-1.69.164a7.75 7.75 0 0 0-1.26.307l-.321-2.193c.335-.116.834-.232 1.478-.348a11.633 11.633 0 0 1 2.073-.177zm-8.034-1.271a1.626 1.626 0 0 1-1.628-1.62c0-.895.725-1.62 1.628-1.62.904 0 1.63.725 1.63 1.62 0 .895-.733 1.62-1.63 1.62zm1.348 13.22h-2.689V7.27l2.69-.423v11.956zm-4.714 0c-4.386.02-4.386-3.54-4.386-4.107l-.008-13.336 2.676-.424v13.254c0 .322 0 2.358 1.718 2.364v2.248zm-8.698-5.903c0-1.156-.253-2.119-.746-2.788-.493-.677-1.183-1.01-2.067-1.01-.882 0-1.574.333-2.065 1.01-.493.676-.733 1.632-.733 2.788 0 1.168.246 1.953.74 2.63.492.683 1.183 1.018 2.066 1.018.882 0 1.574-.342 2.067-1.019.492-.683.738-1.46.738-2.63zm2.737-.007c0 .902-.13 1.584-.397 2.33a5.52 5.52 0 0 1-1.128 1.906 4.986 4.986 0 0 1-1.752 1.223c-.685.286-1.739.45-2.265.45-.528-.006-1.574-.157-2.252-.45a5.096 5.096 0 0 1-1.744-1.223c-.487-.527-.863-1.162-1.137-1.906a6.345 6.345 0 0 1-.41-2.33c0-.902.123-1.77.397-2.508a5.554 5.554 0 0 1 1.15-1.892 5.133 5.133 0 0 1 1.75-1.216c.679-.287 1.425-.423 2.232-.423.808 0 1.553.142 2.237.423a4.88 4.88 0 0 1 1.753 1.216 5.644 5.644 0 0 1 1.135 1.892c.287.738.431 1.606.431 2.508zm-20.138 0c0 1.12.246 2.363.738 2.882.493.52 1.13.78 1.91.78.424 0 .828-.062 1.204-.178.377-.116.677-.253.917-.417V9.33a10.476 10.476 0 0 0-1.766-.226c-.971-.028-1.71.37-2.23 1.004-.513.636-.773 1.75-.773 2.788zm7.438 5.274c0 1.824-.466 3.156-1.404 4.004-.936.846-2.367 1.27-4.296 1.27-.705 0-2.17-.137-3.34-.396l.431-2.118c.98.205 2.272.26 2.95.26 1.074 0 1.84-.219 2.299-.656.459-.437.684-1.086.684-1.948v-.437a8.07 8.07 0 0 1-1.047.397c-.43.13-.93.198-1.492.198-.739 0-1.41-.116-2.018-.349a4.206 4.206 0 0 1-1.567-1.025c-.431-.45-.774-1.017-1.013-1.694-.24-.677-.363-1.885-.363-2.773 0-.834.13-1.88.384-2.577.26-.696.629-1.298 1.129-1.796.493-.498 1.095-.881 1.8-1.162a6.605 6.605 0 0 1 2.428-.457c.87 0 1.67.109 2.45.24.78.129 1.444.265 1.985.415V18.17zM6.972 6.677v1.627c-.712-.446-1.52-.67-2.425-.67-.585 0-1.045.13-1.38.391a1.24 1.24 0 0 0-.502 1.03c0 .425.164.765.494 1.02.33.256.835.532 1.516.83.447.192.795.356 1.045.495.25.138.537.332.862.582.324.25.563.548.718.894.154.345.23.741.23 1.188 0 .947-.334 1.691-1.004 2.234-.67.542-1.537.814-2.601.814-1.18 0-2.16-.229-2.936-.686v-1.708c.84.628 1.814.942 2.92.942.585 0 1.048-.136 1.388-.407.34-.271.51-.646.51-1.125 0-.287-.1-.55-.302-.79-.203-.24-.42-.42-.655-.542-.234-.123-.585-.29-1.053-.503a61.27 61.27 0 0 1-.582-.271 13.67 13.67 0 0 1-.55-.287 4.275 4.275 0 0 1-.567-.351 6.92 6.92 0 0 1-.455-.4c-.18-.17-.31-.34-.39-.51-.08-.17-.155-.37-.224-.598a2.553 2.553 0 0 1-.104-.742c0-.915.333-1.638.998-2.17.664-.532 1.523-.798 2.576-.798.968 0 1.793.17 2.473.51zm7.468 5.696v-.287c-.022-.607-.187-1.088-.495-1.444-.309-.357-.75-.535-1.324-.535-.532 0-.99.194-1.373.583-.382.388-.622.949-.717 1.683h3.909zm1.005 2.792v1.404c-.596.34-1.383.51-2.362.51-1.255 0-2.255-.377-3-1.132-.744-.755-1.116-1.744-1.116-2.968 0-1.297.34-2.316 1.021-3.055.68-.74 1.548-1.11 2.6-1.11 1.033 0 1.852.323 2.458.966.606.644.91 1.572.91 2.784 0 .33-.033.676-.096 1.038h-5.314c.107.702.405 1.239.894 1.611.49.372 1.106.558 1.85.558.862 0 1.58-.202 2.155-.606zm6.605-1.77h-1.212c-.596 0-1.045.116-1.349.35-.303.234-.454.532-.454.894 0 .372.117.664.35.877.235.213.575.32 1.022.32.51 0 .912-.142 1.204-.424.293-.281.44-.651.44-1.108v-.91zm-4.068-2.554V9.325c.627-.361 1.457-.542 2.489-.542 2.116 0 3.175 1.026 3.175 3.08V17h-1.548v-.957c-.415.68-1.143 1.02-2.186 1.02-.766 0-1.38-.22-1.843-.661-.462-.442-.694-1.003-.694-1.684 0-.776.293-1.38.878-1.81.585-.431 1.404-.647 2.457-.647h1.34V11.8c0-.554-.133-.971-.399-1.253-.266-.282-.707-.423-1.324-.423a4.07 4.07 0 0 0-2.345.718zm9.333-1.93v1.42c.394-1 1.101-1.5 2.123-1.5.148 0 .313.016.494.048v1.531a1.885 1.885 0 0 0-.75-.143c-.542 0-.989.24-1.34.718-.351.479-.527 1.048-.527 1.707V17h-1.563V8.91h1.563zm5.01 4.084c.022.82.272 1.492.75 2.019.479.526 1.15.79 2.01.79.639 0 1.235-.176 1.788-.527v1.404c-.521.319-1.186.479-1.995.479-1.265 0-2.276-.4-3.031-1.197-.755-.798-1.133-1.792-1.133-2.984 0-1.16.38-2.151 1.14-2.975.761-.825 1.79-1.237 3.088-1.237.702 0 1.346.149 1.93.447v1.436a3.242 3.242 0 0 0-1.77-.495c-.84 0-1.513.266-2.019.798-.505.532-.758 1.213-.758 2.042zM40.24 5.72v4.579c.458-1 1.293-1.5 2.505-1.5.787 0 1.42.245 1.899.734.479.49.718 1.17.718 2.042V17h-1.564v-5.106c0-.553-.14-.98-.422-1.284-.282-.303-.652-.455-1.11-.455-.531 0-1.002.202-1.411.606-.41.405-.615 1.022-.615 1.851V17h-1.563V5.72h1.563zm14.966 10.02c.596 0 1.096-.253 1.5-.758.404-.506.606-1.157.606-1.955 0-.915-.202-1.62-.606-2.114-.404-.495-.92-.742-1.548-.742-.553 0-1.05.224-1.491.67-.442.447-.662 1.133-.662 2.058 0 .958.212 1.67.638 2.138.425.469.946.703 1.563.703zM53.004 5.72v4.42c.574-.894 1.388-1.341 2.44-1.341 1.022 0 1.857.383 2.506 1.149.649.766.973 1.781.973 3.047 0 1.138-.309 2.109-.925 2.912-.617.803-1.463 1.205-2.537 1.205-1.075 0-1.894-.447-2.457-1.34V17h-1.58V5.72h1.58zm9.908 11.104l-3.223-7.913h1.739l1.005 2.632 1.26 3.415c.096-.32.48-1.458 1.15-3.415l.909-2.632h1.66l-2.92 7.866c-.777 2.074-1.963 3.11-3.559 3.11a2.92 2.92 0 0 1-.734-.079v-1.34c.17.042.351.064.543.064 1.032 0 1.755-.57 2.17-1.708z"}),(0,M.jsx)("path",{fill:"#5468FF",d:"M78.988.938h16.594a2.968 2.968 0 0 1 2.966 2.966V20.5a2.967 2.967 0 0 1-2.966 2.964H78.988a2.967 2.967 0 0 1-2.966-2.964V3.897A2.961 2.961 0 0 1 78.988.938z"}),(0,M.jsx)("path",{fill:"white",d:"M89.632 5.967v-.772a.978.978 0 0 0-.978-.977h-2.28a.978.978 0 0 0-.978.977v.793c0 .088.082.15.171.13a7.127 7.127 0 0 1 1.984-.28c.65 0 1.295.088 1.917.259.082.02.164-.04.164-.13m-6.248 1.01l-.39-.389a.977.977 0 0 0-1.382 0l-.465.465a.973.973 0 0 0 0 1.38l.383.383c.062.061.15.047.205-.014.226-.307.472-.601.746-.874.281-.28.568-.526.883-.751.068-.042.075-.137.02-.2m4.16 2.453v3.341c0 .096.104.165.192.117l2.97-1.537c.068-.034.089-.117.055-.184a3.695 3.695 0 0 0-3.08-1.866c-.068 0-.136.054-.136.13m0 8.048a4.489 4.489 0 0 1-4.49-4.482 4.488 4.488 0 0 1 4.49-4.482 4.488 4.488 0 0 1 4.489 4.482 4.484 4.484 0 0 1-4.49 4.482m0-10.85a6.363 6.363 0 1 0 0 12.729 6.37 6.37 0 0 0 6.372-6.368 6.358 6.358 0 0 0-6.371-6.36"})]})})})})]}),p.items.length>0?(0,M.jsx)("main",{children:p.items.map(({title:e,url:t,summary:r,breadcrumbs:i},s)=>(0,M.jsxs)("article",{className:B.searchResultItem,children:[(0,M.jsx)($.A,{as:"h2",className:B.searchResultItemHeading,children:(0,M.jsx)(w.A,{to:t,dangerouslySetInnerHTML:{__html:e}})}),i.length>0&&(0,M.jsx)("nav",{"aria-label":"breadcrumbs",children:(0,M.jsx)("ul",{className:(0,n.A)("breadcrumbs",B.searchResultItemPath),children:i.map((e,t)=>(0,M.jsx)("li",{className:"breadcrumbs__item",dangerouslySetInnerHTML:{__html:e}},t))})}),r&&(0,M.jsx)("p",{className:B.searchResultItemSummary,dangerouslySetInnerHTML:{__html:r}})]},s))}):[l&&!p.loading&&(0,M.jsx)("p",{children:(0,M.jsx)(D.A,{id:"theme.SearchPage.noResultsText",description:"The paragraph for empty search result",children:"No results were found"})},"no-results"),!!p.loading&&(0,M.jsx)("div",{className:B.loadingSpinner},"spinner")],p.hasMore&&(0,M.jsx)("div",{className:B.loader,ref:_,children:(0,M.jsx)(D.A,{id:"theme.SearchPage.fetchingNewResults",description:"The paragraph for fetching new search results",children:"Fetching new results..."})})]})]})}function W(){return(0,M.jsx)(k.e3,{className:"search-page-wrapper",children:(0,M.jsx)(J,{})})}},69726:e=>{"use strict";e.exports=function(e,t){if(!Array.isArray(e))return-1;for(var r=0;r{"use strict";var i=r(5271);function n(e){return Object.keys(e).sort().reduce(function(t,r){return t[r]=e[r],t},{})}var s={_getQueries:function(e,t){var r=[];return r.push({indexName:e,params:s._getHitsSearchParams(t)}),t.getRefinedDisjunctiveFacets().forEach(function(i){r.push({indexName:e,params:s._getDisjunctiveFacetSearchParams(t,i)})}),t.getRefinedHierarchicalFacets().forEach(function(i){var n=t.getHierarchicalFacetByName(i),a=t.getHierarchicalRefinement(i),c=t._getHierarchicalFacetSeparator(n);if(a.length>0&&a[0].split(c).length>1){var o=a[0].split(c).slice(0,-1).reduce(function(e,t,r){return e.concat({attribute:n.attributes[r],value:0===r?t:[e[e.length-1].value,t].join(c)})},[]);o.forEach(function(i,a){var c=s._getDisjunctiveFacetSearchParams(t,i.attribute,0===a);function u(e){return n.attributes.some(function(t){return t===e.split(":")[0]})}var h=(c.facetFilters||[]).reduce(function(e,t){if(Array.isArray(t)){var r=t.filter(function(e){return!u(e)});r.length>0&&e.push(r)}return"string"!=typeof t||u(t)||e.push(t),e},[]),l=o[a-1];a>0?c.facetFilters=h.concat(l.attribute+":"+l.value):h.length>0?c.facetFilters=h:delete c.facetFilters,r.push({indexName:e,params:c})})}}),r},_getCompositionQueries:function(e){return[{compositionID:e.index,requestBody:{params:s._getCompositionHitsSearchParams(e)}}]},_getHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};return t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a),n(i({},e.getQueryParams(),o))},_getCompositionHitsSearchParams:function(e){var t=e.facets.concat(e.disjunctiveFacets.map(function(t){return e.disjunctiveFacetsRefinements&&e.disjunctiveFacetsRefinements[t]&&e.disjunctiveFacetsRefinements[t].length>0?"disjunctive("+t+")":t})).concat(s._getHitsHierarchicalFacetsAttributes(e)).sort(),r=s._getFacetFilters(e),a=s._getNumericFilters(e),c=s._getTagFilters(e),o={};t.length>0&&(o.facets=t.indexOf("*")>-1?["*"]:t),c.length>0&&(o.tagFilters=c),r.length>0&&(o.facetFilters=r),a.length>0&&(o.numericFilters=a);var u=e.getQueryParams();return delete u.highlightPreTag,delete u.highlightPostTag,delete u.index,n(i({},u,o))},_getDisjunctiveFacetSearchParams:function(e,t,r){var a=s._getFacetFilters(e,t,r),c=s._getNumericFilters(e,t),o=s._getTagFilters(e),u={hitsPerPage:0,page:0,analytics:!1,clickAnalytics:!1};o.length>0&&(u.tagFilters=o);var h=e.getHierarchicalFacetByName(t);return u.facets=h?s._getDisjunctiveHierarchicalFacetAttribute(e,h,r):t,c.length>0&&(u.numericFilters=c),a.length>0&&(u.facetFilters=a),n(i({},e.getQueryParams(),u))},_getNumericFilters:function(e,t){if(e.numericFilters)return e.numericFilters;var r=[];return Object.keys(e.numericRefinements).forEach(function(i){var n=e.numericRefinements[i]||{};Object.keys(n).forEach(function(e){var s=n[e]||[];t!==i&&s.forEach(function(t){if(Array.isArray(t)){var n=t.map(function(t){return i+e+t});r.push(n)}else r.push(i+e+t)})})}),r},_getTagFilters:function(e){return e.tagFilters?e.tagFilters:e.tagRefinements.join(",")},_getFacetFilters:function(e,t,r){var i=[],n=e.facetsRefinements||{};Object.keys(n).sort().forEach(function(e){(n[e]||[]).slice().sort().forEach(function(t){i.push(e+":"+t)})});var s=e.facetsExcludes||{};Object.keys(s).sort().forEach(function(e){(s[e]||[]).sort().forEach(function(t){i.push(e+":-"+t)})});var a=e.disjunctiveFacetsRefinements||{};Object.keys(a).sort().forEach(function(e){var r=a[e]||[];if(e!==t&&r&&0!==r.length){var n=[];r.slice().sort().forEach(function(t){n.push(e+":"+t)}),i.push(n)}});var c=e.hierarchicalFacetsRefinements||{};return Object.keys(c).sort().forEach(function(n){var s=(c[n]||[])[0];if(void 0!==s){var a,o,u=e.getHierarchicalFacetByName(n),h=e._getHierarchicalFacetSeparator(u),l=e._getHierarchicalRootPath(u);if(t===n){if(-1===s.indexOf(h)||!l&&!0===r||l&&l.split(h).length===s.split(h).length)return;l?(o=l.split(h).length-1,s=l):(o=s.split(h).length-2,s=s.slice(0,s.lastIndexOf(h))),a=u.attributes[o]}else o=s.split(h).length-1,a=u.attributes[o];a&&i.push([a+":"+s])}}),i},_getHitsHierarchicalFacetsAttributes:function(e){return e.hierarchicalFacets.reduce(function(t,r){var i=e.getHierarchicalRefinement(r.name)[0];if(!i)return t.push(r.attributes[0]),t;var n=e._getHierarchicalFacetSeparator(r),s=i.split(n).length,a=r.attributes.slice(0,s+1);return t.concat(a)},[])},_getDisjunctiveHierarchicalFacetAttribute:function(e,t,r){var i=e._getHierarchicalFacetSeparator(t);if(!0===r){var n=e._getHierarchicalRootPath(t),s=0;return n&&(s=n.split(i).length),[t.attributes[s]]}var a=(e.getHierarchicalRefinement(t.name)[0]||"").split(i).length-1;return t.attributes.slice(0,a+1)},getSearchForFacetQuery:function(e,t,r,a){var c=a.isDisjunctiveFacet(e)?a.clearRefinements(e):a,o={facetQuery:t,facetName:e};return"number"==typeof r&&(o.maxFacetHits=r),n(i({},s._getHitsSearchParams(c),o))}};e.exports=s},74368:e=>{"use strict";function t(e){e=e||{},this.params=e.params||[]}t.prototype={constructor:t,addParams:function(e){var r=this.params.slice();return r.push(e),new t({params:r})},removeParams:function(e){return new t({params:this.params.filter(function(t){return t.$$id!==e})})},addFrequentlyBoughtTogether:function(e){return this.addParams(Object.assign({},e,{model:"bought-together"}))},addRelatedProducts:function(e){return this.addParams(Object.assign({},e,{model:"related-products"}))},addTrendingItems:function(e){return this.addParams(Object.assign({},e,{model:"trending-items"}))},addTrendingFacets:function(e){return this.addParams(Object.assign({},e,{model:"trending-facets"}))},addLookingSimilar:function(e){return this.addParams(Object.assign({},e,{model:"looking-similar"}))},_buildQueries:function(e,t){return this.params.filter(function(e){return void 0===t[e.$$id]}).map(function(t){var r=Object.assign({},t,{indexName:e,threshold:t.threshold||0});return delete r.$$id,r})}},e.exports=t},75119:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight(function(e,t){return Object.keys(Object(t)).forEach(function(r){void 0!==t[r]&&(void 0!==e[r]&&delete e[r],e[r]=t[r])}),e},{})}},78634:e=>{"use strict";e.exports=function(e){return Array.isArray(e)?e.filter(Boolean):[]}},80978:(e,t,r)=>{"use strict";var i=r(28181),n=r(96019),s=r(48748).escapeFacetValue,a=r(42251),c=r(5271),o=r(32626),u=r(55042),h=r(74368),l=r(13438),f=r(70101),m=r(91770),d=r(54908),p=r(25270),g=r(55661);function v(e,t,r,i){"function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.setClient(e);var n=r||{};n.index=t,this.state=m.make(n),this.recommendState=new h({params:n.recommendState}),this.lastResults=null,this.lastRecommendResults=null,this._queryId=0,this._recommendQueryId=0,this._lastQueryIdReceived=-1,this._lastRecommendQueryIdReceived=-1,this.derivedHelpers=[],this._currentNbQueries=0,this._currentNbRecommendQueries=0,this._searchResultsOptions=i,this._recommendCache={}}function y(e){if(e<0)throw new Error("Page requested below 0.");return this._change({state:this.state.setPage(e),isPageReset:!1}),this}function R(){return this.state.page}a(v,i),v.prototype.search=function(){return this._search({onlyWithDerivedHelpers:!1}),this},v.prototype.searchOnlyWithDerivedHelpers=function(){return this._search({onlyWithDerivedHelpers:!0}),this},v.prototype.searchWithComposition=function(){return this._runComposition({onlyWithDerivedHelpers:!0}),this},v.prototype.recommend=function(){return this._recommend(),this},v.prototype.getQuery=function(){var e=this.state;return f._getHitsSearchParams(e)},v.prototype.searchOnce=function(e,t){var r=e?this.state.setQueryParameters(e):this.state,i=f._getQueries(r.index,r),n=this;if(this._currentNbQueries++,this.emit("searchOnce",{state:r}),!t)return this.client.search(i).then(function(e){return n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),{content:new d(r,e.results),state:r,_originalResponse:e}},function(e){throw n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),e});this.client.search(i).then(function(e){n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),t(null,new d(r,e.results),r)}).catch(function(e){n._currentNbQueries--,0===n._currentNbQueries&&n.emit("searchQueueEmpty"),t(e,null,r)})},v.prototype.findAnswers=function(e){console.warn("[algoliasearch-helper] answers is no longer supported");var t=this.state,r=this.derivedHelpers[0];if(!r)return Promise.resolve([]);var i=r.getModifiedState(t),n=c({attributesForPrediction:e.attributesForPrediction,nbHits:e.nbHits},{params:u(f._getHitsSearchParams(i),["attributesToSnippet","hitsPerPage","restrictSearchableAttributes","snippetEllipsisText"])}),s="search for answers was called, but this client does not have a function client.initIndex(index).findAnswers";if("function"!=typeof this.client.initIndex)throw new Error(s);var a=this.client.initIndex(i.index);if("function"!=typeof a.findAnswers)throw new Error(s);return a.findAnswers(i.query,e.queryLanguages,n)},v.prototype.searchForFacetValues=function(e,t,r,i){var n="function"==typeof this.client.searchForFacetValues&&"function"!=typeof this.client.searchForFacets,a="function"==typeof this.client.initIndex;if(!n&&!a&&"function"!=typeof this.client.search)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues or client.initIndex(index).searchForFacetValues");var c=this.state.setQueryParameters(i||{}),o=c.isDisjunctiveFacet(e),u=f.getSearchForFacetQuery(e,t,r,c);this._currentNbQueries++;var h,l=this;n?h=this.client.searchForFacetValues([{indexName:c.index,params:u}]):a?h=this.client.initIndex(c.index).searchForFacetValues(u):(delete u.facetName,h=this.client.search([{type:"facet",facet:e,indexName:c.index,params:u}]).then(function(e){return e.results[0]})),this.emit("searchForFacetValues",{state:c,facet:e,query:t});var m=this.lastResults&&this.lastResults.index===c.index&&this.lastResults.renderingContent&&this.lastResults.renderingContent.facetOrdering&&this.lastResults.renderingContent.facetOrdering.values&&this.lastResults.renderingContent.facetOrdering.values[e]&&this.lastResults.renderingContent.facetOrdering.values[e].hide||[];return h.then(function(t){return l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),(t=Array.isArray(t)?t[0]:t).facetHits.forEach(function(r,i){m.indexOf(r.value)>-1?t.facetHits.splice(i,1):(r.escapedValue=s(r.value),r.isRefined=o?c.isDisjunctiveFacetRefined(e,r.escapedValue):c.isFacetRefined(e,r.escapedValue))}),t},function(e){throw l._currentNbQueries--,0===l._currentNbQueries&&l.emit("searchQueueEmpty"),e})},v.prototype.searchForCompositionFacetValues=function(e,t,r,i){if("function"!=typeof this.client.searchForFacetValues)throw new Error("search for facet values (searchable) was called, but this client does not have a function client.searchForFacetValues");var n=this.state.setQueryParameters(i||{}),a=n.isDisjunctiveFacet(e);this._currentNbQueries++;var c,o=this;return c=this.client.searchForFacetValues({compositionID:n.index,facetName:e,searchForFacetValuesRequest:{params:{query:t,maxFacetHits:r,searchQuery:f._getCompositionHitsSearchParams(n)}}}),this.emit("searchForFacetValues",{state:n,facet:e,query:t}),c.then(function(t){return o._currentNbQueries--,0===o._currentNbQueries&&o.emit("searchQueueEmpty"),(t=t.results[0]).facetHits.forEach(function(t){t.escapedValue=s(t.value),t.isRefined=a?n.isDisjunctiveFacetRefined(e,t.escapedValue):n.isFacetRefined(e,t.escapedValue)}),t},function(e){throw o._currentNbQueries--,0===o._currentNbQueries&&o.emit("searchQueueEmpty"),e})},v.prototype.setQuery=function(e){return this._change({state:this.state.resetPage().setQuery(e),isPageReset:!0}),this},v.prototype.clearRefinements=function(e){return this._change({state:this.state.resetPage().clearRefinements(e),isPageReset:!0}),this},v.prototype.clearTags=function(){return this._change({state:this.state.resetPage().clearTags(),isPageReset:!0}),this},v.prototype.addDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addDisjunctiveRefine=function(){return this.addDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.addHierarchicalFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addHierarchicalFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().addNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.addFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().addFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.addRefine=function(){return this.addFacetRefinement.apply(this,arguments)},v.prototype.addFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().addExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.addExclude=function(){return this.addFacetExclusion.apply(this,arguments)},v.prototype.addTag=function(e){return this._change({state:this.state.resetPage().addTagRefinement(e),isPageReset:!0}),this},v.prototype.addFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.addFrequentlyBoughtTogether(e)}),this},v.prototype.addRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.addRelatedProducts(e)}),this},v.prototype.addTrendingItems=function(e){return this._recommendChange({state:this.recommendState.addTrendingItems(e)}),this},v.prototype.addTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.addTrendingFacets(e)}),this},v.prototype.addLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.addLookingSimilar(e)}),this},v.prototype.removeNumericRefinement=function(e,t,r){return this._change({state:this.state.resetPage().removeNumericRefinement(e,t,r),isPageReset:!0}),this},v.prototype.removeDisjunctiveFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeDisjunctiveFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeDisjunctiveRefine=function(){return this.removeDisjunctiveFacetRefinement.apply(this,arguments)},v.prototype.removeHierarchicalFacetRefinement=function(e){return this._change({state:this.state.resetPage().removeHierarchicalFacetRefinement(e),isPageReset:!0}),this},v.prototype.removeFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().removeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.removeRefine=function(){return this.removeFacetRefinement.apply(this,arguments)},v.prototype.removeFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().removeExcludeRefinement(e,t),isPageReset:!0}),this},v.prototype.removeExclude=function(){return this.removeFacetExclusion.apply(this,arguments)},v.prototype.removeTag=function(e){return this._change({state:this.state.resetPage().removeTagRefinement(e),isPageReset:!0}),this},v.prototype.removeFrequentlyBoughtTogether=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeRelatedProducts=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingItems=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeTrendingFacets=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.removeLookingSimilar=function(e){return this._recommendChange({state:this.recommendState.removeParams(e)}),this},v.prototype.toggleFacetExclusion=function(e,t){return this._change({state:this.state.resetPage().toggleExcludeFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleExclude=function(){return this.toggleFacetExclusion.apply(this,arguments)},v.prototype.toggleRefinement=function(e,t){return this.toggleFacetRefinement(e,t)},v.prototype.toggleFacetRefinement=function(e,t){return this._change({state:this.state.resetPage().toggleFacetRefinement(e,t),isPageReset:!0}),this},v.prototype.toggleRefine=function(){return this.toggleFacetRefinement.apply(this,arguments)},v.prototype.toggleTag=function(e){return this._change({state:this.state.resetPage().toggleTagRefinement(e),isPageReset:!0}),this},v.prototype.nextPage=function(){var e=this.state.page||0;return this.setPage(e+1)},v.prototype.previousPage=function(){var e=this.state.page||0;return this.setPage(e-1)},v.prototype.setCurrentPage=y,v.prototype.setPage=y,v.prototype.setIndex=function(e){return this._change({state:this.state.resetPage().setIndex(e),isPageReset:!0}),this},v.prototype.setQueryParameter=function(e,t){return this._change({state:this.state.resetPage().setQueryParameter(e,t),isPageReset:!0}),this},v.prototype.setState=function(e){return this._change({state:m.make(e),isPageReset:!1}),this},v.prototype.overrideStateWithoutTriggeringChangeEvent=function(e){return this.state=new m(e),this},v.prototype.hasRefinements=function(e){return!!o(this.state.getNumericRefinements(e))||(this.state.isConjunctiveFacet(e)?this.state.isFacetRefined(e):this.state.isDisjunctiveFacet(e)?this.state.isDisjunctiveFacetRefined(e):!!this.state.isHierarchicalFacet(e)&&this.state.isHierarchicalFacetRefined(e))},v.prototype.isExcluded=function(e,t){return this.state.isExcludeRefined(e,t)},v.prototype.isDisjunctiveRefined=function(e,t){return this.state.isDisjunctiveFacetRefined(e,t)},v.prototype.hasTag=function(e){return this.state.isTagRefined(e)},v.prototype.isTagRefined=function(){return this.hasTagRefinements.apply(this,arguments)},v.prototype.getIndex=function(){return this.state.index},v.prototype.getCurrentPage=R,v.prototype.getPage=R,v.prototype.getTags=function(){return this.state.tagRefinements},v.prototype.getRefinements=function(e){var t=[];if(this.state.isConjunctiveFacet(e))this.state.getConjunctiveRefinements(e).forEach(function(e){t.push({value:e,type:"conjunctive"})}),this.state.getExcludeRefinements(e).forEach(function(e){t.push({value:e,type:"exclude"})});else if(this.state.isDisjunctiveFacet(e)){this.state.getDisjunctiveRefinements(e).forEach(function(e){t.push({value:e,type:"disjunctive"})})}var r=this.state.getNumericRefinements(e);return Object.keys(r).forEach(function(e){var i=r[e];t.push({value:i,operator:e,type:"numeric"})}),t},v.prototype.getNumericRefinement=function(e,t){return this.state.getNumericRefinement(e,t)},v.prototype.getHierarchicalFacetBreadcrumb=function(e){return this.state.getHierarchicalFacetBreadcrumb(e)},v.prototype._search=function(e){var t=this.state,r=[],i=[];e.onlyWithDerivedHelpers||(i=f._getQueries(t.index,t),r.push({state:t,queriesCount:i.length,helper:this}),this.emit("search",{state:t,results:this.lastResults}));var n=this.derivedHelpers.map(function(e){var i=e.getModifiedState(t),n=i.index?f._getQueries(i.index,i):[];return r.push({state:i,queriesCount:n.length,helper:e}),e.emit("search",{state:i,results:e.lastResults}),n}),s=Array.prototype.concat.apply(i,n),a=this._queryId++;if(this._currentNbQueries++,!s.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,r,a));try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,r,a)).catch(this._dispatchAlgoliaError.bind(this,a))}catch(c){this.emit("error",{error:c})}},v.prototype._runComposition=function(){var e=this.state,t=[],r=this.derivedHelpers.map(function(r){var i=r.getModifiedState(e),n=f._getCompositionQueries(i);return t.push({state:i,queriesCount:n.length,helper:r}),r.emit("search",{state:i,results:r.lastResults}),n}),i=Array.prototype.concat.apply([],r),n=this._queryId++;if(this._currentNbQueries++,!i.length)return Promise.resolve({results:[]}).then(this._dispatchAlgoliaResponse.bind(this,t,n));if(i.length>1)throw new Error("Only one query is allowed when using a composition.");var s=i[0];try{this.client.search(s).then(this._dispatchAlgoliaResponse.bind(this,t,n)).catch(this._dispatchAlgoliaError.bind(this,n))}catch(a){this.emit("error",{error:a})}},v.prototype._recommend=function(){var e=this.state,t=this.recommendState,r=this.getIndex(),i=[{state:t,index:r,helper:this}],n=t.params.map(function(e){return e.$$id});this.emit("fetch",{recommend:{state:t,results:this.lastRecommendResults}});var s=this._recommendCache,a=this.derivedHelpers.map(function(t){var r=t.getModifiedState(e).index;if(!r)return[];var a=t.getModifiedRecommendState(new h);return i.push({state:a,index:r,helper:t}),n=Array.prototype.concat.apply(n,a.params.map(function(e){return e.$$id})),t.emit("fetch",{recommend:{state:a,results:t.lastRecommendResults}}),a._buildQueries(r,s)}),c=Array.prototype.concat.apply(this.recommendState._buildQueries(r,s),a);if(0!==c.length)if(c.length>0&&void 0===this.client.getRecommendations)console.warn("Please update algoliasearch/lite to the latest version in order to use recommend widgets.");else{var o=this._recommendQueryId++;this._currentNbRecommendQueries++;try{this.client.getRecommendations(c).then(this._dispatchRecommendResponse.bind(this,o,i,n)).catch(this._dispatchRecommendError.bind(this,o))}catch(u){this.emit("error",{error:u})}}},v.prototype._dispatchAlgoliaResponse=function(e,t,r){var i=this;if(!(t0},v.prototype._change=function(e){var t=e.state,r=e.isPageReset;t!==this.state&&(this.state=t,this.emit("change",{state:this.state,results:this.lastResults,isPageReset:r}))},v.prototype._recommendChange=function(e){var t=e.state;t!==this.recommendState&&(this.recommendState=t,this.emit("recommend:change",{search:{results:this.lastResults,state:this.state},recommend:{results:this.lastRecommendResults,state:this.recommendState}}))},v.prototype.clearCache=function(){return this.client.clearCache&&this.client.clearCache(),this},v.prototype.setClient=function(e){return this.client===e||("function"==typeof e.addAlgoliaAgent&&e.addAlgoliaAgent("JS Helper ("+g+")"),this.client=e),this},v.prototype.getClient=function(){return this.client},v.prototype.derive=function(e,t){var r=new n(this,e,t);return this.derivedHelpers.push(r),r},v.prototype.detachDerivedHelper=function(e){var t=this.derivedHelpers.indexOf(e);if(-1===t)throw new Error("Derived helper already detached");this.derivedHelpers.splice(t,1)},v.prototype.hasPendingRequests=function(){return this._currentNbQueries>0},e.exports=v},83032:e=>{"use strict";e.exports=function(){return Array.prototype.slice.call(arguments).reduceRight(function(e,t){return Object.keys(Object(t)).forEach(function(r){var i="number"==typeof e[r]?e[r]:0,n=t[r];void 0!==n&&n>=i&&(void 0!==e[r]&&delete e[r],e[r]=n)}),e},{})}},85265:e=>{"use strict";e.exports=function(e){return null!==e&&/^[a-zA-Z0-9_-]{1,64}$/.test(e)}},89172:(e,t,r)=>{"use strict";var i=r(80978),n=r(74368),s=r(13438),a=r(91770),c=r(54908);function o(e,t,r,n){return new i(e,t,r,n)}o.version=r(55661),o.AlgoliaSearchHelper=i,o.SearchParameters=a,o.RecommendParameters=n,o.SearchResults=c,o.RecommendResults=s,e.exports=o},91770:(e,t,r)=>{"use strict";var i=r(75119),n=r(7524),s=r(13162),a=r(5271),c=r(32626),o=r(55042),u=r(13624),h=r(85265),l=r(36865);function f(e,t){return Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every(function(e,r){return f(t[r],e)}):e===t}function m(e){var t=e?m._parseNumbers(e):{};void 0===t.userToken||h(t.userToken)||console.warn("[algoliasearch-helper] The `userToken` parameter is invalid. This can lead to wrong analytics.\n - Format: [a-zA-Z0-9_-]{1,64}"),this.facets=t.facets||[],this.disjunctiveFacets=t.disjunctiveFacets||[],this.hierarchicalFacets=t.hierarchicalFacets||[],this.facetsRefinements=t.facetsRefinements||{},this.facetsExcludes=t.facetsExcludes||{},this.disjunctiveFacetsRefinements=t.disjunctiveFacetsRefinements||{},this.numericRefinements=t.numericRefinements||{},this.tagRefinements=t.tagRefinements||[],this.hierarchicalFacetsRefinements=t.hierarchicalFacetsRefinements||{};var r=this;Object.keys(t).forEach(function(e){var i=-1!==m.PARAMETERS.indexOf(e),n=void 0!==t[e];!i&&n&&(r[e]=t[e])})}m.PARAMETERS=Object.keys(new m),m._parseNumbers=function(e){if(e instanceof m)return e;var t={};if(["aroundPrecision","aroundRadius","getRankingInfo","minWordSizefor2Typos","minWordSizefor1Typo","page","maxValuesPerFacet","distinct","minimumAroundRadius","hitsPerPage","minProximity"].forEach(function(r){var i=e[r];if("string"==typeof i){var n=parseFloat(i);t[r]=isNaN(n)?i:n}}),Array.isArray(e.insideBoundingBox)&&(t.insideBoundingBox=e.insideBoundingBox.map(function(e){return Array.isArray(e)?e.map(function(e){return parseFloat(e)}):e})),e.numericRefinements){var r={};Object.keys(e.numericRefinements).forEach(function(t){var i=e.numericRefinements[t]||{};r[t]={},Object.keys(i).forEach(function(e){var n=i[e].map(function(e){return Array.isArray(e)?e.map(function(e){return"string"==typeof e?parseFloat(e):e}):"string"==typeof e?parseFloat(e):e});r[t][e]=n})}),t.numericRefinements=r}return a(e,t)},m.make=function(e){var t=new m(e);return(e.hierarchicalFacets||[]).forEach(function(e){if(e.rootPath){var r=t.getHierarchicalRefinement(e.name);r.length>0&&0!==r[0].indexOf(e.rootPath)&&(t=t.clearRefinements(e.name)),0===(r=t.getHierarchicalRefinement(e.name)).length&&(t=t.toggleHierarchicalFacetRefinement(e.name,e.rootPath))}}),t},m.validate=function(e,t){var r=t||{};return e.tagFilters&&r.tagRefinements&&r.tagRefinements.length>0?new Error("[Tags] Cannot switch from the managed tag API to the advanced API. It is probably an error, if it is really what you want, you should first clear the tags with clearTags method."):e.tagRefinements.length>0&&r.tagFilters?new Error("[Tags] Cannot switch from the advanced tag API to the managed API. It is probably an error, if it is not, you should first clear the tags with clearTags method."):e.numericFilters&&r.numericRefinements&&c(r.numericRefinements)?new Error("[Numeric filters] Can't switch from the advanced to the managed API. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):c(e.numericRefinements)&&r.numericFilters?new Error("[Numeric filters] Can't switch from the managed API to the advanced. It is probably an error, if this is really what you want, you have to first clear the numeric filters."):null},m.prototype={constructor:m,clearRefinements:function(e){var t={numericRefinements:this._clearNumericRefinements(e),facetsRefinements:l.clearRefinement(this.facetsRefinements,e,"conjunctiveFacet"),facetsExcludes:l.clearRefinement(this.facetsExcludes,e,"exclude"),disjunctiveFacetsRefinements:l.clearRefinement(this.disjunctiveFacetsRefinements,e,"disjunctiveFacet"),hierarchicalFacetsRefinements:l.clearRefinement(this.hierarchicalFacetsRefinements,e,"hierarchicalFacet")};return t.numericRefinements===this.numericRefinements&&t.facetsRefinements===this.facetsRefinements&&t.facetsExcludes===this.facetsExcludes&&t.disjunctiveFacetsRefinements===this.disjunctiveFacetsRefinements&&t.hierarchicalFacetsRefinements===this.hierarchicalFacetsRefinements?this:this.setQueryParameters(t)},clearTags:function(){return void 0===this.tagFilters&&0===this.tagRefinements.length?this:this.setQueryParameters({tagFilters:void 0,tagRefinements:[]})},setIndex:function(e){return e===this.index?this:this.setQueryParameters({index:e})},setQuery:function(e){return e===this.query?this:this.setQueryParameters({query:e})},setPage:function(e){return e===this.page?this:this.setQueryParameters({page:e})},setFacets:function(e){return this.setQueryParameters({facets:e})},setDisjunctiveFacets:function(e){return this.setQueryParameters({disjunctiveFacets:e})},setHitsPerPage:function(e){return this.hitsPerPage===e?this:this.setQueryParameters({hitsPerPage:e})},setTypoTolerance:function(e){return this.typoTolerance===e?this:this.setQueryParameters({typoTolerance:e})},addNumericRefinement:function(e,t,r){var i=u(r);if(this.isNumericRefined(e,t,i))return this;var n=a({},this.numericRefinements);return n[e]=a({},n[e]),n[e][t]?(n[e][t]=n[e][t].slice(),n[e][t].push(i)):n[e][t]=[i],this.setQueryParameters({numericRefinements:n})},getConjunctiveRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsRefinements[e]||[]},getDisjunctiveRefinements:function(e){return this.isDisjunctiveFacet(e)&&this.disjunctiveFacetsRefinements[e]||[]},getHierarchicalRefinement:function(e){return this.hierarchicalFacetsRefinements[e]||[]},getExcludeRefinements:function(e){return this.isConjunctiveFacet(e)&&this.facetsExcludes[e]||[]},removeNumericRefinement:function(e,t,r){var i=r;return void 0!==i?this.isNumericRefined(e,t,i)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements(function(r,n){return n===e&&r.op===t&&f(r.val,u(i))})}):this:void 0!==t?this.isNumericRefined(e,t)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements(function(r,i){return i===e&&r.op===t})}):this:this.isNumericRefined(e)?this.setQueryParameters({numericRefinements:this._clearNumericRefinements(function(t,r){return r===e})}):this},getNumericRefinements:function(e){return this.numericRefinements[e]||{}},getNumericRefinement:function(e,t){return this.numericRefinements[e]&&this.numericRefinements[e][t]},_clearNumericRefinements:function(e){if(void 0===e)return c(this.numericRefinements)?{}:this.numericRefinements;if("string"==typeof e)return o(this.numericRefinements,[e]);if("function"==typeof e){var t=!1,r=this.numericRefinements,i=Object.keys(r).reduce(function(i,n){var s=r[n],a={};return s=s||{},Object.keys(s).forEach(function(r){var i=s[r]||[],c=[];i.forEach(function(t){e({val:t,op:r},n,"numeric")||c.push(t)}),c.length!==i.length&&(t=!0),a[r]=c}),i[n]=a,i},{});return t?i:this.numericRefinements}},addFacet:function(e){return this.isConjunctiveFacet(e)?this:this.setQueryParameters({facets:this.facets.concat([e])})},addDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this:this.setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.concat([e])})},addHierarchicalFacet:function(e){if(this.isHierarchicalFacet(e.name))throw new Error("Cannot declare two hierarchical facets with the same name: `"+e.name+"`");return this.setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.concat([e])})},addFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsRefinements,e,t)?this:this.setQueryParameters({facetsRefinements:l.addRefinement(this.facetsRefinements,e,t)})},addExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsExcludes,e,t)?this:this.setQueryParameters({facetsExcludes:l.addRefinement(this.facetsExcludes,e,t)})},addDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return l.isRefined(this.disjunctiveFacetsRefinements,e,t)?this:this.setQueryParameters({disjunctiveFacetsRefinements:l.addRefinement(this.disjunctiveFacetsRefinements,e,t)})},addTagRefinement:function(e){if(this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.concat(e)};return this.setQueryParameters(t)},removeFacet:function(e){return this.isConjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({facets:this.facets.filter(function(t){return t!==e})}):this},removeDisjunctiveFacet:function(e){return this.isDisjunctiveFacet(e)?this.clearRefinements(e).setQueryParameters({disjunctiveFacets:this.disjunctiveFacets.filter(function(t){return t!==e})}):this},removeHierarchicalFacet:function(e){return this.isHierarchicalFacet(e)?this.clearRefinements(e).setQueryParameters({hierarchicalFacets:this.hierarchicalFacets.filter(function(t){return t.name!==e})}):this},removeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsRefinements,e,t)?this.setQueryParameters({facetsRefinements:l.removeRefinement(this.facetsRefinements,e,t)}):this},removeExcludeRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return l.isRefined(this.facetsExcludes,e,t)?this.setQueryParameters({facetsExcludes:l.removeRefinement(this.facetsExcludes,e,t)}):this},removeDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return l.isRefined(this.disjunctiveFacetsRefinements,e,t)?this.setQueryParameters({disjunctiveFacetsRefinements:l.removeRefinement(this.disjunctiveFacetsRefinements,e,t)}):this},removeTagRefinement:function(e){if(!this.isTagRefined(e))return this;var t={tagRefinements:this.tagRefinements.filter(function(t){return t!==e})};return this.setQueryParameters(t)},toggleRefinement:function(e,t){return this.toggleFacetRefinement(e,t)},toggleFacetRefinement:function(e,t){if(this.isHierarchicalFacet(e))return this.toggleHierarchicalFacetRefinement(e,t);if(this.isConjunctiveFacet(e))return this.toggleConjunctiveFacetRefinement(e,t);if(this.isDisjunctiveFacet(e))return this.toggleDisjunctiveFacetRefinement(e,t);throw new Error("Cannot refine the undeclared facet "+e+"; it should be added to the helper options facets, disjunctiveFacets or hierarchicalFacets")},toggleConjunctiveFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsRefinements:l.toggleRefinement(this.facetsRefinements,e,t)})},toggleExcludeFacetRefinement:function(e,t){if(!this.isConjunctiveFacet(e))throw new Error(e+" is not defined in the facets attribute of the helper configuration");return this.setQueryParameters({facetsExcludes:l.toggleRefinement(this.facetsExcludes,e,t)})},toggleDisjunctiveFacetRefinement:function(e,t){if(!this.isDisjunctiveFacet(e))throw new Error(e+" is not defined in the disjunctiveFacets attribute of the helper configuration");return this.setQueryParameters({disjunctiveFacetsRefinements:l.toggleRefinement(this.disjunctiveFacetsRefinements,e,t)})},toggleHierarchicalFacetRefinement:function(e,t){if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration");var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e)),n={};return void 0!==this.hierarchicalFacetsRefinements[e]&&this.hierarchicalFacetsRefinements[e].length>0&&(this.hierarchicalFacetsRefinements[e][0]===t||0===this.hierarchicalFacetsRefinements[e][0].indexOf(t+r))?-1===t.indexOf(r)?n[e]=[]:n[e]=[t.slice(0,t.lastIndexOf(r))]:n[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i(n,this.hierarchicalFacetsRefinements)})},addHierarchicalFacetRefinement:function(e,t){if(this.isHierarchicalFacetRefined(e))throw new Error(e+" is already refined.");if(!this.isHierarchicalFacet(e))throw new Error(e+" is not defined in the hierarchicalFacets attribute of the helper configuration.");var r={};return r[e]=[t],this.setQueryParameters({hierarchicalFacetsRefinements:i(r,this.hierarchicalFacetsRefinements)})},removeHierarchicalFacetRefinement:function(e){if(!this.isHierarchicalFacetRefined(e))return this;var t={};return t[e]=[],this.setQueryParameters({hierarchicalFacetsRefinements:i(t,this.hierarchicalFacetsRefinements)})},toggleTagRefinement:function(e){return this.isTagRefined(e)?this.removeTagRefinement(e):this.addTagRefinement(e)},isDisjunctiveFacet:function(e){return this.disjunctiveFacets.indexOf(e)>-1},isHierarchicalFacet:function(e){return void 0!==this.getHierarchicalFacetByName(e)},isConjunctiveFacet:function(e){return this.facets.indexOf(e)>-1},isFacetRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&l.isRefined(this.facetsRefinements,e,t)},isExcludeRefined:function(e,t){return!!this.isConjunctiveFacet(e)&&l.isRefined(this.facetsExcludes,e,t)},isDisjunctiveFacetRefined:function(e,t){return!!this.isDisjunctiveFacet(e)&&l.isRefined(this.disjunctiveFacetsRefinements,e,t)},isHierarchicalFacetRefined:function(e,t){if(!this.isHierarchicalFacet(e))return!1;var r=this.getHierarchicalRefinement(e);return t?-1!==r.indexOf(t):r.length>0},isNumericRefined:function(e,t,r){if(void 0===r&&void 0===t)return Boolean(this.numericRefinements[e]);var i=this.numericRefinements[e]&&void 0!==this.numericRefinements[e][t];if(void 0===r||!i)return i;var s,a,c=u(r),o=void 0!==(s=this.numericRefinements[e][t],a=c,n(s,function(e){return f(e,a)}));return i&&o},isTagRefined:function(e){return-1!==this.tagRefinements.indexOf(e)},getRefinedDisjunctiveFacets:function(){var e=this,t=s(Object.keys(this.numericRefinements).filter(function(t){return Object.keys(e.numericRefinements[t]).length>0}),this.disjunctiveFacets);return Object.keys(this.disjunctiveFacetsRefinements).filter(function(t){return e.disjunctiveFacetsRefinements[t].length>0}).concat(t).concat(this.getRefinedHierarchicalFacets()).sort()},getRefinedHierarchicalFacets:function(){var e=this;return s(this.hierarchicalFacets.map(function(e){return e.name}),Object.keys(this.hierarchicalFacetsRefinements).filter(function(t){return e.hierarchicalFacetsRefinements[t].length>0})).sort()},getUnrefinedDisjunctiveFacets:function(){var e=this.getRefinedDisjunctiveFacets();return this.disjunctiveFacets.filter(function(t){return-1===e.indexOf(t)})},managedParameters:["index","facets","disjunctiveFacets","facetsRefinements","hierarchicalFacets","facetsExcludes","disjunctiveFacetsRefinements","numericRefinements","tagRefinements","hierarchicalFacetsRefinements"],getQueryParams:function(){var e=this.managedParameters,t={},r=this;return Object.keys(this).forEach(function(i){var n=r[i];-1===e.indexOf(i)&&void 0!==n&&(t[i]=n)}),t},setQueryParameter:function(e,t){if(this[e]===t)return this;var r={};return r[e]=t,this.setQueryParameters(r)},setQueryParameters:function(e){if(!e)return this;var t=m.validate(this,e);if(t)throw t;var r=this,i=m._parseNumbers(e),n=Object.keys(this).reduce(function(e,t){return e[t]=r[t],e},{}),s=Object.keys(i).reduce(function(e,t){var r=void 0!==e[t],n=void 0!==i[t];return r&&!n?o(e,[t]):(n&&(e[t]=i[t]),e)},n);return new this.constructor(s)},resetPage:function(){return void 0===this.page?this:this.setPage(0)},_getHierarchicalFacetSortBy:function(e){return e.sortBy||["isRefined:desc","name:asc"]},_getHierarchicalFacetSeparator:function(e){return e.separator||" > "},_getHierarchicalRootPath:function(e){return e.rootPath||null},_getHierarchicalShowParentLevel:function(e){return"boolean"!=typeof e.showParentLevel||e.showParentLevel},getHierarchicalFacetByName:function(e){return n(this.hierarchicalFacets,function(t){return t.name===e})},getHierarchicalFacetBreadcrumb:function(e){if(!this.isHierarchicalFacet(e))return[];var t=this.getHierarchicalRefinement(e)[0];if(!t)return[];var r=this._getHierarchicalFacetSeparator(this.getHierarchicalFacetByName(e));return t.split(r).map(function(e){return e.trim()})},toString:function(){return JSON.stringify(this,null,2)}},e.exports=m},92048:e=>{e.exports=function(e){return e.reduce(function(e,t){return e.concat(t)},[])}},96019:(e,t,r)=>{"use strict";var i=r(28181);function n(e,t,r){this.main=e,this.fn=t,this.recommendFn=r,this.lastResults=null,this.lastRecommendResults=null}r(42251)(n,i),n.prototype.detach=function(){this.removeAllListeners(),this.main.detachDerivedHelper(this)},n.prototype.getModifiedState=function(e){return this.fn(e)},n.prototype.getModifiedRecommendState=function(e){return this.recommendFn(e)},e.exports=n}}]); \ No newline at end of file diff --git a/assets/js/1c291fdc.c1d9c78d.js b/assets/js/1c291fdc.c1d9c78d.js new file mode 100644 index 0000000000..a6d7464009 --- /dev/null +++ b/assets/js/1c291fdc.c1d9c78d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9206],{38566:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>d,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","source":"@site/versioned_docs/version-0.12.1/rules/android/unused_kotlin_android_extensions.md","sourceDirName":"rules/android","slug":"/rules/unused_kotlin_android_extensions","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/android/unused_kotlin_android_extensions.md","tags":[],"version":"0.12.1","frontMatter":{"id":"unused_kotlin_android_extensions","slug":"/rules/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","sidebar_label":"Unused Kotlin Android Extensions"},"sidebar":"Docs","previous":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.1/rules/disable_view_binding"}}');var t=s(23420),i=s(65404);const d={id:"unused_kotlin_android_extensions",slug:"/rules/unused_kotlin_android_extensions",title:"Unused Kotlin Android Extensions",sidebar_label:"Unused Kotlin Android Extensions"},r=void 0,u={},l=[];function a(e){const n={p:"p",...(0,i.R)(),...e.components};return(0,t.jsx)(n.p,{children:"Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any\nsynthetic imports or deprecated @Parcelize annotation"})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>r});var o=s(36672);const t={},i=o.createContext(t);function d(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/1e828d0d.eae29f3f.js b/assets/js/1e828d0d.eae29f3f.js new file mode 100644 index 0000000000..1e1b448492 --- /dev/null +++ b/assets/js/1e828d0d.eae29f3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7259],{65404:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var d=s(36672);const t={},u=d.createContext(t);function o(e){const n=d.useContext(u);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),d.createElement(u.Provider,{value:n},e.children)}},87612:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>d,toc:()=>i});const d=JSON.parse('{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.12.3/rules/unused_dependency.md","sourceDirName":"rules","slug":"/rules/unused_dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/unused_dependency.md","tags":[],"version":"0.12.3","frontMatter":{"id":"unused_dependency","slug":"/rules/unused_dependency","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.3/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.3/rules/must_be_api"}}');var t=s(23420),u=s(65404);const o={id:"unused_dependency",slug:"/rules/unused_dependency",title:"Unused Dependency",sidebar_label:"Unused Dependency"},c=void 0,r={},i=[];function l(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,t.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/1ecac929.4026d79c.js b/assets/js/1ecac929.4026d79c.js new file mode 100644 index 0000000000..f8cdb119fb --- /dev/null +++ b/assets/js/1ecac929.4026d79c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7930],{65404:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var t=o(36672);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}},68255:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.12.3/rules/compiler/use_anvil_factory_generation.md","sourceDirName":"rules/compiler","slug":"/rules/use_anvil_factory_generation","permalink":"/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/compiler/use_anvil_factory_generation.md","tags":[],"version":"0.12.3","frontMatter":{"id":"use_anvil_factory_generation","slug":"/rules/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","sidebar_label":"Could Use Anvil Factory Generation"},"sidebar":"Docs","previous":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.3/rules/project_depth"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor"}}');var r=o(23420),i=o(65404);const s={id:"use_anvil_factory_generation",slug:"/rules/use_anvil_factory_generation",title:"Could Use Anvil Factory Generation",sidebar_label:"Could Use Anvil Factory Generation"},a=void 0,l={},c=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or\nSubcomponents, and it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/1f391b9e.162e3a02.js b/assets/js/1f391b9e.162e3a02.js new file mode 100644 index 0000000000..a7316af8ca --- /dev/null +++ b/assets/js/1f391b9e.162e3a02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6061],{77549:(e,a,s)=>{s.r(a),s.d(a,{default:()=>x});s(36672);var t=s(13526),d=s(6617),l=s(84862),c=s(64381),r=s(31156),i=s(21187),n=s(45235),o=s(71822);const m={mdxPageWrapper:"mdxPageWrapper_L88T"};var p=s(23420);function x(e){const{content:a}=e,{metadata:s,assets:x}=a,{title:g,editUrl:h,description:j,frontMatter:A,lastUpdatedBy:u,lastUpdatedAt:v}=s,{keywords:_,wrapperClassName:k,hide_table_of_contents:w}=A,f=x.image??A.image,N=!!(h||v||u);return(0,p.jsx)(d.e3,{className:(0,t.A)(k??l.G.wrapper.mdxPages,l.G.page.mdxPage),children:(0,p.jsxs)(c.A,{children:[(0,p.jsx)(d.be,{title:g,description:j,keywords:_,image:f}),(0,p.jsx)("main",{className:"container container--fluid margin-vert--lg",children:(0,p.jsxs)("div",{className:(0,t.A)("row",m.mdxPageWrapper),children:[(0,p.jsxs)("div",{className:(0,t.A)("col",!w&&"col--8"),children:[(0,p.jsx)(n.A,{metadata:s}),(0,p.jsx)("article",{children:(0,p.jsx)(r.A,{children:(0,p.jsx)(a,{})})}),N&&(0,p.jsx)(o.A,{className:(0,t.A)("margin-top--sm",l.G.pages.pageFooterEditMetaRow),editUrl:h,lastUpdatedAt:v,lastUpdatedBy:u})]}),!w&&a.toc.length>0&&(0,p.jsx)("div",{className:"col col--2",children:(0,p.jsx)(i.A,{toc:a.toc,minHeadingLevel:A.toc_min_heading_level,maxHeadingLevel:A.toc_max_heading_level})})]})})]})})}}}]); \ No newline at end of file diff --git a/assets/js/20c870cb.fc120f02.js b/assets/js/20c870cb.fc120f02.js new file mode 100644 index 0000000000..85f7aebffc --- /dev/null +++ b/assets/js/20c870cb.fc120f02.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[314],{65404:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>r});var d=i(36672);const s={},o=d.createContext(s);function t(e){const n=d.useContext(o);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),d.createElement(o.Provider,{value:n},e.children)}},74503:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>t,metadata:()=>d,toc:()=>l});const d=JSON.parse('{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.11.0/rules/android/disable_viewbinding.md","sourceDirName":"rules/android","slug":"/rules/android/disable_viewbinding","permalink":"/ModuleCheck/docs/0.11.0/rules/android/disable_viewbinding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/android/disable_viewbinding.md","tags":[],"version":"0.11.0","frontMatter":{"id":"disable_viewbinding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.0/rules/android/disable_resources"}}');var s=i(23420),o=i(65404);const t={id:"disable_viewbinding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,a={},l=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/2129.d07ffb6a.js b/assets/js/2129.d07ffb6a.js new file mode 100644 index 0000000000..ff68bffc21 --- /dev/null +++ b/assets/js/2129.d07ffb6a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2129],{32129:(t,e,a)=>{a.d(e,{diagram:()=>K});var i,n=a(31556),r=(a(91544),a(44533),a(80284),a(61923),a(290),a(49636),a(267),a(29951),a(63727),a(9420)),d=a(97485),s=a(3170),o=a(74326),g=a(57420),h=(0,d.K2)(t=>t.append("circle").attr("class","start-state").attr("r",(0,d.D7)().state.sizeUnit).attr("cx",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit).attr("cy",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit),"drawStartState"),p=(0,d.K2)(t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",(0,d.D7)().state.textHeight).attr("class","divider").attr("x2",2*(0,d.D7)().state.textHeight).attr("y1",0).attr("y2",0),"drawDivider"),c=(0,d.K2)((t,e)=>{const a=t.append("text").attr("x",2*(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.textHeight+2*(0,d.D7)().state.padding).attr("font-size",(0,d.D7)().state.fontSize).attr("class","state-title").text(e.id),i=a.node().getBBox();return t.insert("rect",":first-child").attr("x",(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.padding).attr("width",i.width+2*(0,d.D7)().state.padding).attr("height",i.height+2*(0,d.D7)().state.padding).attr("rx",(0,d.D7)().state.radius),a},"drawSimpleState"),l=(0,d.K2)((t,e)=>{const a=(0,d.K2)(function(t,e,a){const i=t.append("tspan").attr("x",2*(0,d.D7)().state.padding).text(e);a||i.attr("dy",(0,d.D7)().state.textHeight)},"addTspan"),i=t.append("text").attr("x",2*(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.textHeight+1.3*(0,d.D7)().state.padding).attr("font-size",(0,d.D7)().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),n=i.height,r=t.append("text").attr("x",(0,d.D7)().state.padding).attr("y",n+.4*(0,d.D7)().state.padding+(0,d.D7)().state.dividerMargin+(0,d.D7)().state.textHeight).attr("class","state-description");let s=!0,o=!0;e.descriptions.forEach(function(t){s||(a(r,t,o),o=!1),s=!1});const g=t.append("line").attr("x1",(0,d.D7)().state.padding).attr("y1",(0,d.D7)().state.padding+n+(0,d.D7)().state.dividerMargin/2).attr("y2",(0,d.D7)().state.padding+n+(0,d.D7)().state.dividerMargin/2).attr("class","descr-divider"),h=r.node().getBBox(),p=Math.max(h.width,i.width);return g.attr("x2",p+3*(0,d.D7)().state.padding),t.insert("rect",":first-child").attr("x",(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.padding).attr("width",p+2*(0,d.D7)().state.padding).attr("height",h.height+n+2*(0,d.D7)().state.padding).attr("rx",(0,d.D7)().state.radius),t},"drawDescrState"),x=(0,d.K2)((t,e,a)=>{const i=(0,d.D7)().state.padding,n=2*(0,d.D7)().state.padding,r=t.node().getBBox(),s=r.width,o=r.x,g=t.append("text").attr("x",0).attr("y",(0,d.D7)().state.titleShift).attr("font-size",(0,d.D7)().state.fontSize).attr("class","state-title").text(e.id),h=g.node().getBBox().width+n;let p,c=Math.max(h,s);c===s&&(c+=n);const l=t.node().getBBox();e.doc,p=o-i,h>s&&(p=(s-c)/2+i),Math.abs(o-l.x)s&&(p=o-(h-s)/2);const x=1-(0,d.D7)().state.textHeight;return t.insert("rect",":first-child").attr("x",p).attr("y",x).attr("class",a?"alt-composit":"composit").attr("width",c).attr("height",l.height+(0,d.D7)().state.textHeight+(0,d.D7)().state.titleShift+1).attr("rx","0"),g.attr("x",p+i),h<=s&&g.attr("x",o+(c-n)/2-h/2+i),t.insert("rect",":first-child").attr("x",p).attr("y",(0,d.D7)().state.titleShift-(0,d.D7)().state.textHeight-(0,d.D7)().state.padding).attr("width",c).attr("height",3*(0,d.D7)().state.textHeight).attr("rx",(0,d.D7)().state.radius),t.insert("rect",":first-child").attr("x",p).attr("y",(0,d.D7)().state.titleShift-(0,d.D7)().state.textHeight-(0,d.D7)().state.padding).attr("width",c).attr("height",l.height+3+2*(0,d.D7)().state.textHeight).attr("rx",(0,d.D7)().state.radius),t},"addTitleAndBox"),D=(0,d.K2)(t=>(t.append("circle").attr("class","end-state-outer").attr("r",(0,d.D7)().state.sizeUnit+(0,d.D7)().state.miniPadding).attr("cx",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+(0,d.D7)().state.miniPadding).attr("cy",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+(0,d.D7)().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",(0,d.D7)().state.sizeUnit).attr("cx",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+2).attr("cy",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+2)),"drawEndState"),u=(0,d.K2)((t,e)=>{let a=(0,d.D7)().state.forkWidth,i=(0,d.D7)().state.forkHeight;if(e.parentId){let t=a;a=i,i=t}return t.append("rect").style("stroke","black").style("fill","black").attr("width",a).attr("height",i).attr("x",(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.padding)},"drawForkJoinState"),f=(0,d.K2)((t,e,a,i)=>{let n=0;const r=i.append("text");r.style("text-anchor","start"),r.attr("class","noteText");let s=t.replace(/\r\n/g,"
");s=s.replace(/\n/g,"
");const o=s.split(d.Y2.lineBreakRegex);let g=1.25*(0,d.D7)().state.noteMargin;for(const h of o){const t=h.trim();if(t.length>0){const i=r.append("tspan");if(i.text(t),0===g){g+=i.node().getBBox().height}n+=g,i.attr("x",e+(0,d.D7)().state.noteMargin),i.attr("y",a+n+1.25*(0,d.D7)().state.noteMargin)}}return{textWidth:r.node().getBBox().width,textHeight:n}},"_drawLongText"),y=(0,d.K2)((t,e)=>{e.attr("class","state-note");const a=e.append("rect").attr("x",0).attr("y",(0,d.D7)().state.padding),i=e.append("g"),{textWidth:n,textHeight:r}=f(t,0,0,i);return a.attr("height",r+2*(0,d.D7)().state.noteMargin),a.attr("width",n+2*(0,d.D7)().state.noteMargin),a},"drawNote"),w=(0,d.K2)(function(t,e){const a=e.id,i={id:a,label:e.id,width:0,height:0},n=t.append("g").attr("id",a).attr("class","stateGroup");"start"===e.type&&h(n),"end"===e.type&&D(n),"fork"!==e.type&&"join"!==e.type||u(n,e),"note"===e.type&&y(e.note.text,n),"divider"===e.type&&p(n),"default"===e.type&&0===e.descriptions.length&&c(n,e),"default"===e.type&&e.descriptions.length>0&&l(n,e);const r=n.node().getBBox();return i.width=r.width+2*(0,d.D7)().state.padding,i.height=r.height+2*(0,d.D7)().state.padding,i},"drawState"),m=0,b=(0,d.K2)(function(t,e,a){const i=(0,d.K2)(function(t){switch(t){case n.u4.relationType.AGGREGATION:return"aggregation";case n.u4.relationType.EXTENSION:return"extension";case n.u4.relationType.COMPOSITION:return"composition";case n.u4.relationType.DEPENDENCY:return"dependency"}},"getRelationType");e.points=e.points.filter(t=>!Number.isNaN(t.y));const o=e.points,g=(0,s.n8j)().x(function(t){return t.x}).y(function(t){return t.y}).curve(s.qrM),h=t.append("path").attr("d",g(o)).attr("id","edge"+m).attr("class","transition");let p="";if((0,d.D7)().state.arrowMarkerAbsolute&&(p=(0,d.ID)(!0)),h.attr("marker-end","url("+p+"#"+i(n.u4.relationType.DEPENDENCY)+"End)"),void 0!==a.title){const i=t.append("g").attr("class","stateLabel"),{x:n,y:s}=r._K.calcLabelPosition(e.points),o=d.Y2.getRows(a.title);let g=0;const h=[];let p=0,c=0;for(let t=0;t<=o.length;t++){const e=i.append("text").attr("text-anchor","middle").text(o[t]).attr("x",n).attr("y",s+g),a=e.node().getBBox();if(p=Math.max(p,a.width),c=Math.min(c,a.x),d.Rm.info(a.x,n,s+g),0===g){const t=e.node().getBBox();g=t.height,d.Rm.info("Title height",g,s)}h.push(e)}let l=g*o.length;if(o.length>1){const t=(o.length-1)*g*.5;h.forEach((e,a)=>e.attr("y",s+a*g-t)),l=g*o.length}const x=i.node().getBBox();i.insert("rect",":first-child").attr("class","box").attr("x",n-p/2-(0,d.D7)().state.padding/2).attr("y",s-l/2-(0,d.D7)().state.padding/2-3.5).attr("width",p+(0,d.D7)().state.padding).attr("height",l+(0,d.D7)().state.padding),d.Rm.info(x)}m++},"drawEdge"),B={},k=(0,d.K2)(function(){},"setConf"),S=(0,d.K2)(function(t){t.append("defs").append("marker").attr("id","dependencyEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"insertMarkers"),N=(0,d.K2)(function(t,e,a,n){i=(0,d.D7)().state;const r=(0,d.D7)().securityLevel;let o;"sandbox"===r&&(o=(0,s.Ltv)("#i"+e));const g="sandbox"===r?(0,s.Ltv)(o.nodes()[0].contentDocument.body):(0,s.Ltv)("body"),h="sandbox"===r?o.nodes()[0].contentDocument:document;d.Rm.debug("Rendering diagram "+t);const p=g.select(`[id='${e}']`);S(p);const c=n.db.getRootDoc();M(c,p,void 0,!1,g,h,n);const l=i.padding,x=p.node().getBBox(),D=x.width+2*l,u=x.height+2*l,f=1.75*D;(0,d.a$)(p,u,f,i.useMaxWidth),p.attr("viewBox",`${x.x-i.padding} ${x.y-i.padding} `+D+" "+u)},"draw"),E=(0,d.K2)(t=>t?t.length*i.fontSizeFactor:1,"getLabelWidth"),M=(0,d.K2)((t,e,a,n,r,s,h)=>{const p=new g.T({compound:!0,multigraph:!0});let c,l=!0;for(c=0;c{const e=t.parentElement;let a=0,i=0;e&&(e.parentElement&&(a=e.parentElement.getBBox().width),i=parseInt(e.getAttribute("data-x-shift"),10),Number.isNaN(i)&&(i=0)),t.setAttribute("x1",0-i+8),t.setAttribute("x2",a-i-8)})}else d.Rm.debug("No Node "+t+": "+JSON.stringify(p.node(t)))});let k=m.getBBox();p.edges().forEach(function(t){void 0!==t&&void 0!==p.edge(t)&&(d.Rm.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(p.edge(t))),b(e,p.edge(t),p.edge(t).relation))}),k=m.getBBox();const S={id:a||"root",label:a||"root",width:0,height:0};return S.width=k.width+2*i.padding,S.height=k.height+2*i.padding,d.Rm.debug("Doc rendered",S,p),S},"renderDoc"),v={setConf:k,draw:N},K={parser:n.Zk,get db(){return new n.u4(1)},renderer:v,styles:n.tM,init:(0,d.K2)(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")}}}]); \ No newline at end of file diff --git a/assets/js/2192b561.ddda8f54.js b/assets/js/2192b561.ddda8f54.js new file mode 100644 index 0000000000..eb91ebb6b1 --- /dev/null +++ b/assets/js/2192b561.ddda8f54.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8945],{47784:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.12.2/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/0.12.2/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/ci_workflow.md","tags":[],"version":"0.12.2","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.2/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_dependency"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheckAuto):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew moduleCheckAuto --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/228d1b45.82366616.js b/assets/js/228d1b45.82366616.js new file mode 100644 index 0000000000..ca48a4fde6 --- /dev/null +++ b/assets/js/228d1b45.82366616.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[755],{58873:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.12.2/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.12.2/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/must_be_api.md","tags":[],"version":"0.12.2","frontMatter":{"id":"must_be_api","slug":"/rules/must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_dependency"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",slug:"/rules/must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/23284c9b.20730bf6.js b/assets/js/23284c9b.20730bf6.js new file mode 100644 index 0000000000..9de25cfaa1 --- /dev/null +++ b/assets/js/23284c9b.20730bf6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9254],{59643:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>a});const d=JSON.parse('{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.12.3/rules/android/disable_view_binding.md","sourceDirName":"rules/android","slug":"/rules/disable_view_binding","permalink":"/ModuleCheck/docs/0.12.3/rules/disable_view_binding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/android/disable_view_binding.md","tags":[],"version":"0.12.3","frontMatter":{"id":"disable_view_binding","slug":"/rules/disable_view_binding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.3/rules/disable_android_resources"},"next":{"title":"Unused Kotlin Android Extensions","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensions"}}');var s=i(23420),t=i(65404);const o={id:"disable_view_binding",slug:"/rules/disable_view_binding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,l={},a=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var d=i(36672);const s={},t=d.createContext(s);function o(e){const n=d.useContext(t);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),d.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/23c216bb.d1f3edb7.js b/assets/js/23c216bb.d1f3edb7.js new file mode 100644 index 0000000000..a447a4e1ad --- /dev/null +++ b/assets/js/23c216bb.d1f3edb7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4196],{28802:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.11.2/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.11.2/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/configuration.mdx","tags":[],"version":"0.11.2","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.11.2/"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.11.2/ci-workflow"}}');var s=t(23420),r=t(65404);const i={id:"configuration",sidebar_label:"Configuration"},a=void 0,c={},u=[];function d(e){const n={code:"code",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:'plugins {\n id("com.rickbusarow.module-check") version "0.11.2"\n}\n\nmoduleCheck {\n\n autoCorrect = true // default is true\n deleteUnused = true // default is false\n\n checks {\n overshotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedImplementation = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n ignoreAll.set(setOf(":app"))\n\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(36672);const s={},r=o.createContext(s);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2400.23e68242.js b/assets/js/2400.23e68242.js new file mode 100644 index 0000000000..3399623e2c --- /dev/null +++ b/assets/js/2400.23e68242.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2400],{72400:(e,c,k)=>{k.d(c,{createPieServices:()=>s.f});var s=k(21963);k(60349)}}]); \ No newline at end of file diff --git a/assets/js/248.6b522764.js b/assets/js/248.6b522764.js new file mode 100644 index 0000000000..57470f8719 --- /dev/null +++ b/assets/js/248.6b522764.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[248],{45059:(t,e,a)=>{function r(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}a.d(e,{S:()=>r}),(0,a(97485).K2)(r,"populateCommonDb")},50248:(t,e,a)=>{a.d(e,{diagram:()=>D});var r=a(45059),n=a(9420),i=a(47765),s=a(97485),o=a(99339),l={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},c={axes:[],curves:[],options:l},d=structuredClone(c),g=s.UI.radar,u=(0,s.K2)(()=>(0,n.$t)({...g,...(0,s.zj)().radar}),"getConfig"),h=(0,s.K2)(()=>d.axes,"getAxes"),p=(0,s.K2)(()=>d.curves,"getCurves"),x=(0,s.K2)(()=>d.options,"getOptions"),m=(0,s.K2)(t=>{d.axes=t.map(t=>({name:t.name,label:t.label??t.name}))},"setAxes"),$=(0,s.K2)(t=>{d.curves=t.map(t=>({name:t.name,label:t.label??t.name,entries:f(t.entries)}))},"setCurves"),f=(0,s.K2)(t=>{if(null==t[0].axis)return t.map(t=>t.value);const e=h();if(0===e.length)throw new Error("Axes must be populated before curves for reference entries");return e.map(e=>{const a=t.find(t=>t.axis?.$refText===e.name);if(void 0===a)throw new Error("Missing entry for axis "+e.label);return a.value})},"computeCurveEntries"),y={getAxes:h,getCurves:p,getOptions:x,setAxes:m,setCurves:$,setOptions:(0,s.K2)(t=>{const e=t.reduce((t,e)=>(t[e.name]=e,t),{});d.options={showLegend:e.showLegend?.value??l.showLegend,ticks:e.ticks?.value??l.ticks,max:e.max?.value??l.max,min:e.min?.value??l.min,graticule:e.graticule?.value??l.graticule}},"setOptions"),getConfig:u,clear:(0,s.K2)(()=>{(0,s.IU)(),d=structuredClone(c)},"clear"),setAccTitle:s.SV,getAccTitle:s.iN,setDiagramTitle:s.ke,getDiagramTitle:s.ab,getAccDescription:s.m7,setAccDescription:s.EI},v=(0,s.K2)(t=>{(0,r.S)(t,y);const{axes:e,curves:a,options:n}=t;y.setAxes(e),y.setCurves(a),y.setOptions(n)},"populate"),w={parse:(0,s.K2)(async t=>{const e=await(0,o.qg)("radar",t);s.Rm.debug(e),v(e)},"parse")},b=(0,s.K2)((t,e,a,r)=>{const n=r.db,s=n.getAxes(),o=n.getCurves(),l=n.getOptions(),c=n.getConfig(),d=n.getDiagramTitle(),g=(0,i.D)(e),u=C(g,c),h=l.max??Math.max(...o.map(t=>Math.max(...t.entries))),p=l.min,x=Math.min(c.width,c.height)/2;M(u,s,x,l.ticks,l.graticule),K(u,s,x,c),k(u,s,o,p,h,l.graticule,c),A(u,o,l.showLegend,c),u.append("text").attr("class","radarTitle").text(d).attr("x",0).attr("y",-c.height/2-c.marginTop)},"draw"),C=(0,s.K2)((t,e)=>{const a=e.width+e.marginLeft+e.marginRight,r=e.height+e.marginTop+e.marginBottom,n=e.marginLeft+e.width/2,i=e.marginTop+e.height/2;return t.attr("viewbox",`0 0 ${a} ${r}`).attr("width",a).attr("height",r),t.append("g").attr("transform",`translate(${n}, ${i})`)},"drawFrame"),M=(0,s.K2)((t,e,a,r,n)=>{if("circle"===n)for(let i=0;i{const a=2*e*Math.PI/n-Math.PI/2;return`${s*Math.cos(a)},${s*Math.sin(a)}`}).join(" ");t.append("polygon").attr("points",o).attr("class","radarGraticule")}}},"drawGraticule"),K=(0,s.K2)((t,e,a,r)=>{const n=e.length;for(let i=0;i{if(e.entries.length!==o)return;const c=e.entries.map((t,e)=>{const a=2*Math.PI*e/o-Math.PI/2,i=L(t,r,n,l);return{x:i*Math.cos(a),y:i*Math.sin(a)}});"circle"===i?t.append("path").attr("d",T(c,s.curveTension)).attr("class",`radarCurve-${a}`):"polygon"===i&&t.append("polygon").attr("points",c.map(t=>`${t.x},${t.y}`).join(" ")).attr("class",`radarCurve-${a}`)})}function L(t,e,a,r){return r*(Math.min(Math.max(t,e),a)-e)/(a-e)}function T(t,e){const a=t.length;let r=`M${t[0].x},${t[0].y}`;for(let n=0;n{const r=t.append("g").attr("transform",`translate(${n}, ${i+20*a})`);r.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${a}`),r.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(e.label)})}(0,s.K2)(k,"drawCurves"),(0,s.K2)(L,"relativeRadius"),(0,s.K2)(T,"closedRoundCurve"),(0,s.K2)(A,"drawLegend");var O={draw:b},S=(0,s.K2)((t,e)=>{let a="";for(let r=0;r{const e=(0,s.P$)(),a=(0,s.zj)(),r=(0,n.$t)(e,a.themeVariables);return{themeVariables:r,radarOptions:(0,n.$t)(r.radar,t)}},"buildRadarStyleOptions"),D={parser:w,db:y,renderer:O,styles:(0,s.K2)(({radar:t}={})=>{const{themeVariables:e,radarOptions:a}=I(t);return`\n\t.radarTitle {\n\t\tfont-size: ${e.fontSize};\n\t\tcolor: ${e.titleColor};\n\t\tdominant-baseline: hanging;\n\t\ttext-anchor: middle;\n\t}\n\t.radarAxisLine {\n\t\tstroke: ${a.axisColor};\n\t\tstroke-width: ${a.axisStrokeWidth};\n\t}\n\t.radarAxisLabel {\n\t\tdominant-baseline: middle;\n\t\ttext-anchor: middle;\n\t\tfont-size: ${a.axisLabelFontSize}px;\n\t\tcolor: ${a.axisColor};\n\t}\n\t.radarGraticule {\n\t\tfill: ${a.graticuleColor};\n\t\tfill-opacity: ${a.graticuleOpacity};\n\t\tstroke: ${a.graticuleColor};\n\t\tstroke-width: ${a.graticuleStrokeWidth};\n\t}\n\t.radarLegendText {\n\t\ttext-anchor: start;\n\t\tfont-size: ${a.legendFontSize}px;\n\t\tdominant-baseline: hanging;\n\t}\n\t${S(e,a)}\n\t`},"styles")}}}]); \ No newline at end of file diff --git a/assets/js/24af6869.3a0a1bc2.js b/assets/js/24af6869.3a0a1bc2.js new file mode 100644 index 0000000000..271cb16476 --- /dev/null +++ b/assets/js/24af6869.3a0a1bc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1753],{7357:(e,n,r)=>{r.d(n,{A:()=>o});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var l=r(23420);function o({children:e,hidden:n,className:r}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},50786:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","source":"@site/versioned_docs/version-0.10.0/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.10.0/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/quickstart.mdx","tags":[],"version":"0.10.0","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Basics","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.10.0/configuration"}}');var a=r(23420),l=r(65404),o=r(83796),s=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},u=void 0,c={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsxs)(n.admonition,{type:"note",children:[(0,a.jsx)(n.p,{children:"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin."}),(0,a.jsx)(n.p,{children:"However, auto-correction of errors is only done by parsing Kotlin files via PSI. Groovy auto-correction is not supported."})]}),"\n",(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(o.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsxs)(s.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:"// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.10.0"\n}\n'})})]}),(0,a.jsxs)(s.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// top-level build.gradle\n\nplugins {\n id "com.rickbusarow.module-check" version "0.10.0"\n}\n'})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/0.10.0/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(o.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsxs)(s.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nconfigure {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(s.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// top-level build.gradle\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>o,x:()=>s});var t=r(36672);const a={},l=t.createContext(a);function o(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),t.createElement(l.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>j});var t=r(36672),a=r(13526),l=r(58797),o=r(85291),s=r(52245),i=r(32342),u=r(45223),c=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const r=(0,o.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function g(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,l=h(e),[o,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l})),[u,d]=f({queryString:r,groupId:a}),[g,v]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,c.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=u??g;return p({value:e,tabValues:l})?e:null})();(0,s.A)(()=>{b&&i(b)},[b]);return{selectedValue:o,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),v(e)},[d,v,l]),tabValues:l}}var v=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var m=r(23420);function k({className:e,block:n,selectedValue:r,selectValue:t,tabValues:o}){const s=[],{blockElementScrollPositionUntilNextRender:i}=(0,l.a_)(),u=e=>{const n=e.currentTarget,a=s.indexOf(n),l=o[a].value;l!==r&&(i(n),t(l))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const r=s.indexOf(e.currentTarget)+1;n=s[r]??s[0];break}case"ArrowLeft":{const r=s.indexOf(e.currentTarget)-1;n=s[r]??s[s.length-1];break}}n?.focus()};return(0,m.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:o.map(({value:e,label:n,attributes:t})=>(0,m.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{s.push(e)},onKeyDown:c,onClick:u,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function x({lazy:e,children:n,selectedValue:r}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,m.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function y(e){const n=g(e);return(0,m.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,m.jsx)(k,{...n,...e}),(0,m.jsx)(x,{...n,...e})]})}function j(e){const n=(0,v.A)();return(0,m.jsx)(y,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/25.a5b52d71.js b/assets/js/25.a5b52d71.js new file mode 100644 index 0000000000..998a0a7b46 --- /dev/null +++ b/assets/js/25.a5b52d71.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[25],{10025:(e,r,s)=>{s.d(r,{diagram:()=>l});var a=s(78479),c=(s(11047),s(91544),s(44533),s(80284),s(61923),s(290),s(49636),s(267),s(29951),s(63727),s(9420),s(97485)),l={parser:a._$,get db(){return new a.NM},renderer:a.Lh,styles:a.tM,init:(0,c.K2)(e=>{e.class||(e.class={}),e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]); \ No newline at end of file diff --git a/assets/js/25072094.ba042603.js b/assets/js/25072094.ba042603.js new file mode 100644 index 0000000000..c88347d76c --- /dev/null +++ b/assets/js/25072094.ba042603.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4422],{58591:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","source":"@site/versioned_docs/version-0.12.1/rules/project_depth.md","sourceDirName":"rules","slug":"/rules/project_depth","permalink":"/ModuleCheck/docs/0.12.1/rules/project_depth","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/project_depth.md","tags":[],"version":"0.12.1","frontMatter":{"id":"project_depth","slug":"/rules/project_depth","title":"Project Depth","sidebar_label":"Project Depth"},"sidebar":"Docs","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/overshot_dependency"},"next":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation"}}');var r=l(23420),t=l(65404);const d={id:"project_depth",slug:"/rules/project_depth",title:"Project Depth",sidebar_label:"Project Depth"},i=void 0,c={},o=[{value:"Dependencies and Build Concurrency",id:"dependencies-and-build-concurrency",level:3},{value:"Depth",id:"depth",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",mermaid:"mermaid",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"TL;DR - Low depth values mean faster builds and better all-around scalability."}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["It's often useful to think of module dependencies as a directed tree\nor ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Directed_acyclic_graph",children:"directed acyclic graph"}),". If a module is a\nnode, then each module dependency is a child node, and the dependencies of those dependencies are\ngrand-child nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["This is especially useful when thinking about ",(0,r.jsx)(n.strong,{children:"build performance"}),", because the parent-child\nrelationship is clear: ",(0,r.jsx)(n.em,{children:"child nodes must build before parent nodes"}),"."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(:app):::depth2\n\n screen1(:screen-1):::depth1\n screen2(:screen-2):::depth1\n\n lib1(:lib-1):::depth0\n lib2(:lib-2):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n\n screen1 --\x3e lib1\n screen1 --\x3e lib2\n screen2 --\x3e lib2"}),"\n",(0,r.jsx)(n.p,{children:"In the above example,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," must be built before ",(0,r.jsx)(n.code,{children:":screen-1"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-2"})," must be build before ",(0,r.jsx)(n.code,{children:":screen-2"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":screen-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," must be built before ",(0,r.jsx)(n.code,{children:":app"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build\nbefore their parents."}),"\n",(0,r.jsx)(n.h3,{id:"dependencies-and-build-concurrency",children:"Dependencies and Build Concurrency"}),"\n",(0,r.jsx)(n.p,{children:"Individual module builds are always done single-threaded, but multiple modules may build in parallel\nso long as no module in the set depends upon another module in that set. In the above graph,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":scren-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The maximum number of parallel module builds is determined by the structure of the dependency graph\nand the number of available processor cores on the machine which is performing the build."}),"\n",(0,r.jsx)(n.h3,{id:"depth",children:"Depth"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Depth"})," refers to the maximum number of edges between a module and each of its leaf nodes in the\nproject dependency graph."]}),"\n",(0,r.jsx)(n.p,{children:"Low depth values indicate a shallow or flat project structure with loose (or no) coupling between\nmodules. In a full build, these projects scale well with hardware upgrades because they're able to\nbuild all those independent modules in parallel."}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n subgraph sg [A shallow graph]\n direction TB\n\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 2):::depth2\n\n screen1(depth: 1):::depth1\n screen2(depth: 1):::depth1\n screen3(depth: 1):::depth1\n screen4(depth: 1):::depth1\n\n lib1(depth: 0):::depth0\n lib2(depth: 0):::depth0\n lib3(depth: 0):::depth0\n lib4(depth: 0):::depth0\n lib5(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e lib1\n screen1 --\x3e lib4\n\n screen2 --\x3e lib1\n screen2 --\x3e lib3\n screen2 --\x3e lib4\n\n screen3 --\x3e lib2\n screen3 --\x3e lib3\n screen3 --\x3e lib4\n\n screen4 --\x3e lib3\n screen4 --\x3e lib5\n\n end\n\n style sg opacity:0.0\n"}),"\n",(0,r.jsxs)(n.p,{children:['On the other hand, "deep" projects do not offer many opportunities for parallelization. They have\nproject dependencies which must be built ',(0,r.jsx)(n.em,{children:"sequentially"}),". They also perform poorly in incremental\nbuilds, because a single change to even a mid-level module invalidates cached builds for half of the\nproject."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n style sg opacity:0.0\n subgraph sg [A deep graph]\n direction TB\n\n classDef depth6 fill:#800,stroke:#000,color:#FFF\n classDef depth5 fill:#A50,stroke:#000,color:#FFF\n classDef depth4 fill:#C0B,stroke:#000,color:#000\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 6):::depth6\n\n screen1(depth: 5):::depth5\n screen2(depth: 5):::depth5\n\n screen3(depth: 4):::depth4\n screen4(depth: 4):::depth4\n\n lib1(depth: 3):::depth3\n lib2(depth: 3):::depth3\n\n lib3(depth: 2):::depth2\n lib4(depth: 2):::depth2\n\n lib5(depth: 1):::depth1\n\n lib6(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e screen3\n screen1 --\x3e screen4\n\n screen2 --\x3e screen4\n\n screen3 --\x3e lib1\n screen3 --\x3e lib2\n\n screen4 --\x3e lib1\n screen4 --\x3e lib4\n\n lib1 --\x3e lib3\n lib1 --\x3e lib4\n\n lib2 --\x3e lib3\n\n lib3 --\x3e lib5\n lib4 --\x3e lib5\n\n lib5 --\x3e lib6\n\n end\n"})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},65404:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>i});var s=l(36672);const r={},t=s.createContext(r);function d(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2570.398299e2.js b/assets/js/2570.398299e2.js new file mode 100644 index 0000000000..397d6e1b90 --- /dev/null +++ b/assets/js/2570.398299e2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2570],{11047:(t,e,s)=>{s.d(e,{o:()=>i});var i=(0,s(97485).K2)(()=>"\n /* Font Awesome icon styling - consolidated */\n .label-icon {\n display: inline-block;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n \n .node .label-icon path {\n fill: currentColor;\n stroke: revert;\n stroke-width: revert;\n }\n","getIconStyles")},44533:(t,e,s)=>{s.d(e,{P:()=>n});var i=s(97485),n=(0,i.K2)((t,e,s,n)=>{t.attr("class",s);const{width:u,height:o,x:l,y:c}=r(t,e);(0,i.a$)(t,o,u,n);const h=a(l,c,u,o,e);t.attr("viewBox",h),i.Rm.debug(`viewBox configured: ${h} with padding: ${e}`)},"setupViewPortForSVG"),r=(0,i.K2)((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}},"calculateDimensionsWithPadding"),a=(0,i.K2)((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`,"createViewBox")},62570:(t,e,s)=>{s.d(e,{diagram:()=>D});var i=s(11047),n=s(89790),r=s(91544),a=s(44533),u=s(80284),o=(s(61923),s(290),s(49636)),l=(s(267),s(29951),s(63727),s(9420)),c=s(97485),h=s(3170),d=s(80124),p=s(30941),g=class{constructor(){this.vertexCounter=0,this.config=(0,c.D7)(),this.vertices=new Map,this.edges=[],this.classes=new Map,this.subGraphs=[],this.subGraphLookup=new Map,this.tooltips=new Map,this.subCount=0,this.firstGraphFlag=!0,this.secCount=-1,this.posCrossRef=[],this.funs=[],this.setAccTitle=c.SV,this.setAccDescription=c.EI,this.setDiagramTitle=c.ke,this.getAccTitle=c.iN,this.getAccDescription=c.m7,this.getDiagramTitle=c.ab,this.funs.push(this.setupToolTips.bind(this)),this.addVertex=this.addVertex.bind(this),this.firstGraph=this.firstGraph.bind(this),this.setDirection=this.setDirection.bind(this),this.addSubGraph=this.addSubGraph.bind(this),this.addLink=this.addLink.bind(this),this.setLink=this.setLink.bind(this),this.updateLink=this.updateLink.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.destructLink=this.destructLink.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setTooltip=this.setTooltip.bind(this),this.updateLinkInterpolate=this.updateLinkInterpolate.bind(this),this.setClickFun=this.setClickFun.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.lex={firstGraph:this.firstGraph.bind(this)},this.clear(),this.setGen("gen-2")}static{(0,c.K2)(this,"FlowDB")}sanitizeText(t){return c.Y2.sanitizeText(t,this.config)}lookUpDomId(t){for(const e of this.vertices.values())if(e.id===t)return e.domId;return t}addVertex(t,e,s,i,r,a,u={},l){if(!t||0===t.trim().length)return;let h;if(void 0!==l){let t;t=l.includes("\n")?l+"\n":"{\n"+l+"\n}",h=(0,n.H)(t,{schema:n.r})}const d=this.edges.find(e=>e.id===t);if(d){const t=h;return void 0!==t?.animate&&(d.animate=t.animate),void(void 0!==t?.animation&&(d.animation=t.animation))}let p,g=this.vertices.get(t);if(void 0===g&&(g={id:t,labelType:"text",domId:"flowchart-"+t+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(t,g)),this.vertexCounter++,void 0!==e?(this.config=(0,c.D7)(),p=this.sanitizeText(e.text.trim()),g.labelType=e.type,p.startsWith('"')&&p.endsWith('"')&&(p=p.substring(1,p.length-1)),g.text=p):void 0===g.text&&(g.text=t),void 0!==s&&(g.type=s),null!=i&&i.forEach(t=>{g.styles.push(t)}),null!=r&&r.forEach(t=>{g.classes.push(t)}),void 0!==a&&(g.dir=a),void 0===g.props?g.props=u:void 0!==u&&Object.assign(g.props,u),void 0!==h){if(h.shape){if(h.shape!==h.shape.toLowerCase()||h.shape.includes("_"))throw new Error(`No such shape: ${h.shape}. Shape names should be lowercase.`);if(!(0,o.aP)(h.shape))throw new Error(`No such shape: ${h.shape}.`);g.type=h?.shape}h?.label&&(g.text=h?.label),h?.icon&&(g.icon=h?.icon,h.label?.trim()||g.text!==t||(g.text="")),h?.form&&(g.form=h?.form),h?.pos&&(g.pos=h?.pos),h?.img&&(g.img=h?.img,h.label?.trim()||g.text!==t||(g.text="")),h?.constraint&&(g.constraint=h.constraint),h.w&&(g.assetWidth=Number(h.w)),h.h&&(g.assetHeight=Number(h.h))}}addSingleLink(t,e,s,i){const n={start:t,end:e,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};c.Rm.info("abc78 Got edge...",n);const r=s.text;if(void 0!==r&&(n.text=this.sanitizeText(r.text.trim()),n.text.startsWith('"')&&n.text.endsWith('"')&&(n.text=n.text.substring(1,n.text.length-1)),n.labelType=r.type),void 0!==s&&(n.type=s.type,n.stroke=s.stroke,n.length=s.length>10?10:s.length),i&&!this.edges.some(t=>t.id===i))n.id=i,n.isUserDefinedId=!0;else{const t=this.edges.filter(t=>t.start===n.start&&t.end===n.end);0===t.length?n.id=(0,l.rY)(n.start,n.end,{counter:0,prefix:"L"}):n.id=(0,l.rY)(n.start,n.end,{counter:t.length+1,prefix:"L"})}if(!(this.edges.length<(this.config.maxEdges??500)))throw new Error(`Edge limit exceeded. ${this.edges.length} edges found, but the limit is ${this.config.maxEdges}.\n\nInitialize mermaid with maxEdges set to a higher number to allow more edges.\nYou cannot set this config via configuration inside the diagram as it is a secure config.\nYou have to call mermaid.initialize.`);c.Rm.info("Pushing edge..."),this.edges.push(n)}isLinkData(t){return null!==t&&"object"==typeof t&&"id"in t&&"string"==typeof t.id}addLink(t,e,s){const i=this.isLinkData(s)?s.id.replace("@",""):void 0;c.Rm.info("addLink",t,e,i);for(const n of t)for(const r of e){const a=n===t[t.length-1],u=r===e[0];a&&u?this.addSingleLink(n,r,s,i):this.addSingleLink(n,r,s,void 0)}}updateLinkInterpolate(t,e){t.forEach(t=>{"default"===t?this.edges.defaultInterpolate=e:this.edges[t].interpolate=e})}updateLink(t,e){t.forEach(t=>{if("number"==typeof t&&t>=this.edges.length)throw new Error(`The index ${t} for linkStyle is out of bounds. Valid indices for linkStyle are between 0 and ${this.edges.length-1}. (Help: Ensure that the index is within the range of existing edges.)`);"default"===t?this.edges.defaultStyle=e:(this.edges[t].style=e,(this.edges[t]?.style?.length??0)>0&&!this.edges[t]?.style?.some(t=>t?.startsWith("fill"))&&this.edges[t]?.style?.push("fill:none"))})}addClass(t,e){const s=e.join().replace(/\\,/g,"\xa7\xa7\xa7").replace(/,/g,";").replace(/\xa7\xa7\xa7/g,",").split(";");t.split(",").forEach(t=>{let e=this.classes.get(t);void 0===e&&(e={id:t,styles:[],textStyles:[]},this.classes.set(t,e)),null!=s&&s.forEach(t=>{if(/color/.exec(t)){const s=t.replace("fill","bgFill");e.textStyles.push(s)}e.styles.push(t)})})}setDirection(t){this.direction=t,/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),"TD"===this.direction&&(this.direction="TB")}setClass(t,e){for(const s of t.split(",")){const t=this.vertices.get(s);t&&t.classes.push(e);const i=this.edges.find(t=>t.id===s);i&&i.classes.push(e);const n=this.subGraphLookup.get(s);n&&n.classes.push(e)}}setTooltip(t,e){if(void 0!==e){e=this.sanitizeText(e);for(const s of t.split(","))this.tooltips.set("gen-1"===this.version?this.lookUpDomId(s):s,e)}}setClickFun(t,e,s){const i=this.lookUpDomId(t);if("loose"!==(0,c.D7)().securityLevel)return;if(void 0===e)return;let n=[];if("string"==typeof s){n=s.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t{const t=document.querySelector(`[id="${i}"]`);null!==t&&t.addEventListener("click",()=>{l._K.runFunc(e,...n)},!1)}))}setLink(t,e,s){t.split(",").forEach(t=>{const i=this.vertices.get(t);void 0!==i&&(i.link=l._K.formatUrl(e,this.config),i.linkTarget=s)}),this.setClass(t,"clickable")}getTooltip(t){return this.tooltips.get(t)}setClickEvent(t,e,s){t.split(",").forEach(t=>{this.setClickFun(t,e,s)}),this.setClass(t,"clickable")}bindFunctions(t){this.funs.forEach(e=>{e(t)})}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(t){let e=(0,h.Ltv)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,h.Ltv)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,h.Ltv)(t).select("svg").selectAll("g.node").on("mouseover",t=>{const s=(0,h.Ltv)(t.currentTarget);if(null===s.attr("title"))return;const i=t.currentTarget?.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(s.attr("title")).style("left",window.scrollX+i.left+(i.right-i.left)/2+"px").style("top",window.scrollY+i.bottom+"px"),e.html(e.html().replace(/<br\/>/g,"
")),s.classed("hover",!0)}).on("mouseout",t=>{e.transition().duration(500).style("opacity",0);(0,h.Ltv)(t.currentTarget).classed("hover",!1)})}clear(t="gen-2"){this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=t,this.config=(0,c.D7)(),(0,c.IU)()}setGen(t){this.version=t||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(t,e,s){let i=t.text.trim(),n=s.text;t===s&&/\s/.exec(s.text)&&(i=void 0);const r=(0,c.K2)(t=>{const e={boolean:{},number:{},string:{}},s=[];let i;return{nodeList:t.filter(function(t){const n=typeof t;return t.stmt&&"dir"===t.stmt?(i=t.value,!1):""!==t.trim()&&(n in e?!e[n].hasOwnProperty(t)&&(e[n][t]=!0):!s.includes(t)&&s.push(t))}),dir:i}},"uniq")(e.flat()),a=r.nodeList;let u=r.dir;const o=(0,c.D7)().flowchart??{};if(u=u??(o.inheritDir?this.getDirection()??(0,c.D7)().direction??void 0:void 0),"gen-1"===this.version)for(let c=0;c2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=e,this.subGraphs[e].id===t)return{result:!0,count:0};let i=0,n=1;for(;i=0){const s=this.indexNodes2(t,e);if(s.result)return{result:!0,count:n+s.count};n+=s.count}i+=1}return{result:!1,count:n}}getDepthFirstPos(t){return this.posCrossRef[t]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return!!this.firstGraphFlag&&(this.firstGraphFlag=!1,!0)}destructStartLink(t){let e=t.trim(),s="arrow_open";switch(e[0]){case"<":s="arrow_point",e=e.slice(1);break;case"x":s="arrow_cross",e=e.slice(1);break;case"o":s="arrow_circle",e=e.slice(1)}let i="normal";return e.includes("=")&&(i="thick"),e.includes(".")&&(i="dotted"),{type:s,stroke:i}}countChar(t,e){const s=e.length;let i=0;for(let n=0;n":i="arrow_point",e.startsWith("<")&&(i="double_"+i,s=s.slice(1));break;case"o":i="arrow_circle",e.startsWith("o")&&(i="double_"+i,s=s.slice(1))}let n="normal",r=s.length-1;s.startsWith("=")&&(n="thick"),s.startsWith("~")&&(n="invisible");const a=this.countChar(".",s);return a&&(n="dotted",r=a),{type:i,stroke:n,length:r}}destructLink(t,e){const s=this.destructEndLink(t);let i;if(e){if(i=this.destructStartLink(e),i.stroke!==s.stroke)return{type:"INVALID",stroke:"INVALID"};if("arrow_open"===i.type)i.type=s.type;else{if(i.type!==s.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return"double_arrow"===i.type&&(i.type="double_arrow_point"),i.length=s.length,i}return s}exists(t,e){for(const s of t)if(s.nodes.includes(e))return!0;return!1}makeUniq(t,e){const s=[];return t.nodes.forEach((i,n)=>{this.exists(e,i)||s.push(t.nodes[n])}),{nodes:s}}getTypeFromVertex(t){if(t.img)return"imageSquare";if(t.icon)return"circle"===t.form?"iconCircle":"square"===t.form?"iconSquare":"rounded"===t.form?"iconRounded":"icon";switch(t.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return t.type}}findNode(t,e){return t.find(t=>t.id===e)}destructEdgeType(t){let e="none",s="arrow_point";switch(t){case"arrow_point":case"arrow_circle":case"arrow_cross":s=t;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":e=t.replace("double_",""),s=e}return{arrowTypeStart:e,arrowTypeEnd:s}}addNodeFromVertex(t,e,s,i,n,r){const a=s.get(t.id),u=i.get(t.id)??!1,o=this.findNode(e,t.id);if(o)o.cssStyles=t.styles,o.cssCompiledStyles=this.getCompiledStyles(t.classes),o.cssClasses=t.classes.join(" ");else{const s={id:t.id,label:t.text,labelStyle:"",parentId:a,padding:n.flowchart?.padding||8,cssStyles:t.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...t.classes]),cssClasses:"default "+t.classes.join(" "),dir:t.dir,domId:t.domId,look:r,link:t.link,linkTarget:t.linkTarget,tooltip:this.getTooltip(t.id),icon:t.icon,pos:t.pos,img:t.img,assetWidth:t.assetWidth,assetHeight:t.assetHeight,constraint:t.constraint};u?e.push({...s,isGroup:!0,shape:"rect"}):e.push({...s,isGroup:!1,shape:this.getTypeFromVertex(t)})}}getCompiledStyles(t){let e=[];for(const s of t){const t=this.classes.get(s);t?.styles&&(e=[...e,...t.styles??[]].map(t=>t.trim())),t?.textStyles&&(e=[...e,...t.textStyles??[]].map(t=>t.trim()))}return e}getData(){const t=(0,c.D7)(),e=[],s=[],i=this.getSubGraphs(),n=new Map,r=new Map;for(let u=i.length-1;u>=0;u--){const t=i[u];t.nodes.length>0&&r.set(t.id,!0);for(const e of t.nodes)n.set(e,t.id)}for(let u=i.length-1;u>=0;u--){const s=i[u];e.push({id:s.id,label:s.title,labelStyle:"",parentId:n.get(s.id),padding:8,cssCompiledStyles:this.getCompiledStyles(s.classes),cssClasses:s.classes.join(" "),shape:"rect",dir:s.dir,isGroup:!0,look:t.look})}this.getVertices().forEach(s=>{this.addNodeFromVertex(s,e,n,r,t,t.look||"classic")});const a=this.getEdges();return a.forEach((e,i)=>{const{arrowTypeStart:n,arrowTypeEnd:r}=this.destructEdgeType(e.type),u=[...a.defaultStyle??[]];e.style&&u.push(...e.style);const o={id:(0,l.rY)(e.start,e.end,{counter:i,prefix:"L"},e.id),isUserDefinedId:e.isUserDefinedId,start:e.start,end:e.end,type:e.type??"normal",label:e.text,labelpos:"c",thickness:e.stroke,minlen:e.length,classes:"invisible"===e?.stroke?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:"invisible"===e?.stroke||"arrow_open"===e?.type?"none":n,arrowTypeEnd:"invisible"===e?.stroke||"arrow_open"===e?.type?"none":r,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(e.classes),labelStyle:u,style:u,pattern:e.stroke,look:t.look,animate:e.animate,animation:e.animation,curve:e.interpolate||this.edges.defaultInterpolate||t.flowchart?.curve};s.push(o)}),{nodes:e,edges:s,other:{},config:t}}defaultConfig(){return c.ME.flowchart}},A={getClasses:(0,c.K2)(function(t,e){return e.db.getClasses()},"getClasses"),draw:(0,c.K2)(async function(t,e,s,i){c.Rm.info("REF0:"),c.Rm.info("Drawing state diagram (v2)",e);const{securityLevel:n,flowchart:o,layout:d}=(0,c.D7)();let p;"sandbox"===n&&(p=(0,h.Ltv)("#i"+e));const g="sandbox"===n?p.nodes()[0].contentDocument:document;c.Rm.debug("Before getData: ");const A=i.db.getData();c.Rm.debug("Data: ",A);const b=(0,r.A)(e,n),y=i.db.getDirection();A.type=i.type,A.layoutAlgorithm=(0,u.q7)(d),"dagre"===A.layoutAlgorithm&&"elk"===d&&c.Rm.warn("flowchart-elk was moved to an external package in Mermaid v11. Please refer [release notes](https://github.com/mermaid-js/mermaid/releases/tag/v11.0.0) for more details. This diagram will be rendered using `dagre` layout as a fallback."),A.direction=y,A.nodeSpacing=o?.nodeSpacing||50,A.rankSpacing=o?.rankSpacing||50,A.markers=["point","circle","cross"],A.diagramId=e,c.Rm.debug("REF1:",A),await(0,u.XX)(A,b);const k=A.config.flowchart?.diagramPadding??8;l._K.insertTitle(b,"flowchartTitleText",o?.titleTopMargin||0,i.db.getDiagramTitle()),(0,a.P)(b,k,"flowchart",o?.useMaxWidth||!1);for(const r of A.nodes){const t=(0,h.Ltv)(`#${e} [id="${r.id}"]`);if(!t||!r.link)continue;const s=g.createElementNS("http://www.w3.org/2000/svg","a");s.setAttributeNS("http://www.w3.org/2000/svg","class",r.cssClasses),s.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),"sandbox"===n?s.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):r.linkTarget&&s.setAttributeNS("http://www.w3.org/2000/svg","target",r.linkTarget);const i=t.insert(function(){return s},":first-child"),a=t.select(".label-container");a&&i.append(function(){return a.node()});const u=t.select(".label");u&&i.append(function(){return u.node()})}},"draw")},b=function(){var t=(0,c.K2)(function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s},"o"),e=[1,4],s=[1,3],i=[1,5],n=[1,8,9,10,11,27,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],r=[2,2],a=[1,13],u=[1,14],o=[1,15],l=[1,16],h=[1,23],d=[1,25],p=[1,26],g=[1,27],A=[1,49],b=[1,48],y=[1,29],k=[1,30],f=[1,31],m=[1,32],E=[1,33],D=[1,44],C=[1,46],x=[1,42],T=[1,47],S=[1,43],F=[1,50],_=[1,45],v=[1,51],B=[1,52],w=[1,34],L=[1,35],$=[1,36],I=[1,37],R=[1,57],N=[1,8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],P=[1,61],K=[1,60],G=[1,62],O=[8,9,11,75,77,78],V=[1,78],M=[1,91],U=[1,96],W=[1,95],Y=[1,92],j=[1,88],z=[1,94],X=[1,90],H=[1,97],q=[1,93],Q=[1,98],Z=[1,89],J=[8,9,10,11,40,75,77,78],tt=[8,9,10,11,40,46,75,77,78],et=[8,9,10,11,29,40,44,46,48,50,52,54,56,58,60,63,65,67,68,70,75,77,78,89,102,105,106,109,111,114,115,116],st=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],it=[44,60,89,102,105,106,109,111,114,115,116],nt=[1,121],rt=[1,122],at=[1,124],ut=[1,123],ot=[44,60,62,74,89,102,105,106,109,111,114,115,116],lt=[1,133],ct=[1,147],ht=[1,148],dt=[1,149],pt=[1,150],gt=[1,135],At=[1,137],bt=[1,141],yt=[1,142],kt=[1,143],ft=[1,144],mt=[1,145],Et=[1,146],Dt=[1,151],Ct=[1,152],xt=[1,131],Tt=[1,132],St=[1,139],Ft=[1,134],_t=[1,138],vt=[1,136],Bt=[8,9,10,11,27,32,34,36,38,44,60,84,85,86,87,88,89,102,105,106,109,111,114,115,116,121,122,123,124],wt=[1,154],Lt=[1,156],$t=[8,9,11],It=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],Rt=[1,176],Nt=[1,172],Pt=[1,173],Kt=[1,177],Gt=[1,174],Ot=[1,175],Vt=[77,116,119],Mt=[8,9,10,11,12,14,27,29,32,44,60,75,84,85,86,87,88,89,90,105,109,111,114,115,116],Ut=[10,106],Wt=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],Yt=[1,247],jt=[1,245],zt=[1,249],Xt=[1,243],Ht=[1,244],qt=[1,246],Qt=[1,248],Zt=[1,250],Jt=[1,268],te=[8,9,11,106],ee=[8,9,10,11,60,84,105,106,109,110,111,112],se={trace:(0,c.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,graphConfig:4,document:5,line:6,statement:7,SEMI:8,NEWLINE:9,SPACE:10,EOF:11,GRAPH:12,NODIR:13,DIR:14,FirstStmtSeparator:15,ending:16,endToken:17,spaceList:18,spaceListNewline:19,vertexStatement:20,separator:21,styleStatement:22,linkStyleStatement:23,classDefStatement:24,classStatement:25,clickStatement:26,subgraph:27,textNoTags:28,SQS:29,text:30,SQE:31,end:32,direction:33,acc_title:34,acc_title_value:35,acc_descr:36,acc_descr_value:37,acc_descr_multiline_value:38,shapeData:39,SHAPE_DATA:40,link:41,node:42,styledVertex:43,AMP:44,vertex:45,STYLE_SEPARATOR:46,idString:47,DOUBLECIRCLESTART:48,DOUBLECIRCLEEND:49,PS:50,PE:51,"(-":52,"-)":53,STADIUMSTART:54,STADIUMEND:55,SUBROUTINESTART:56,SUBROUTINEEND:57,VERTEX_WITH_PROPS_START:58,"NODE_STRING[field]":59,COLON:60,"NODE_STRING[value]":61,PIPE:62,CYLINDERSTART:63,CYLINDEREND:64,DIAMOND_START:65,DIAMOND_STOP:66,TAGEND:67,TRAPSTART:68,TRAPEND:69,INVTRAPSTART:70,INVTRAPEND:71,linkStatement:72,arrowText:73,TESTSTR:74,START_LINK:75,edgeText:76,LINK:77,LINK_ID:78,edgeTextToken:79,STR:80,MD_STR:81,textToken:82,keywords:83,STYLE:84,LINKSTYLE:85,CLASSDEF:86,CLASS:87,CLICK:88,DOWN:89,UP:90,textNoTagsToken:91,stylesOpt:92,"idString[vertex]":93,"idString[class]":94,CALLBACKNAME:95,CALLBACKARGS:96,HREF:97,LINK_TARGET:98,"STR[link]":99,"STR[tooltip]":100,alphaNum:101,DEFAULT:102,numList:103,INTERPOLATE:104,NUM:105,COMMA:106,style:107,styleComponent:108,NODE_STRING:109,UNIT:110,BRKT:111,PCT:112,idStringToken:113,MINUS:114,MULT:115,UNICODE_TEXT:116,TEXT:117,TAGSTART:118,EDGE_TEXT:119,alphaNumToken:120,direction_tb:121,direction_bt:122,direction_rl:123,direction_lr:124,$accept:0,$end:1},terminals_:{2:"error",8:"SEMI",9:"NEWLINE",10:"SPACE",11:"EOF",12:"GRAPH",13:"NODIR",14:"DIR",27:"subgraph",29:"SQS",31:"SQE",32:"end",34:"acc_title",35:"acc_title_value",36:"acc_descr",37:"acc_descr_value",38:"acc_descr_multiline_value",40:"SHAPE_DATA",44:"AMP",46:"STYLE_SEPARATOR",48:"DOUBLECIRCLESTART",49:"DOUBLECIRCLEEND",50:"PS",51:"PE",52:"(-",53:"-)",54:"STADIUMSTART",55:"STADIUMEND",56:"SUBROUTINESTART",57:"SUBROUTINEEND",58:"VERTEX_WITH_PROPS_START",59:"NODE_STRING[field]",60:"COLON",61:"NODE_STRING[value]",62:"PIPE",63:"CYLINDERSTART",64:"CYLINDEREND",65:"DIAMOND_START",66:"DIAMOND_STOP",67:"TAGEND",68:"TRAPSTART",69:"TRAPEND",70:"INVTRAPSTART",71:"INVTRAPEND",74:"TESTSTR",75:"START_LINK",77:"LINK",78:"LINK_ID",80:"STR",81:"MD_STR",84:"STYLE",85:"LINKSTYLE",86:"CLASSDEF",87:"CLASS",88:"CLICK",89:"DOWN",90:"UP",93:"idString[vertex]",94:"idString[class]",95:"CALLBACKNAME",96:"CALLBACKARGS",97:"HREF",98:"LINK_TARGET",99:"STR[link]",100:"STR[tooltip]",102:"DEFAULT",104:"INTERPOLATE",105:"NUM",106:"COMMA",109:"NODE_STRING",110:"UNIT",111:"BRKT",112:"PCT",114:"MINUS",115:"MULT",116:"UNICODE_TEXT",117:"TEXT",118:"TAGSTART",119:"EDGE_TEXT",121:"direction_tb",122:"direction_bt",123:"direction_rl",124:"direction_lr"},productions_:[0,[3,2],[5,0],[5,2],[6,1],[6,1],[6,1],[6,1],[6,1],[4,2],[4,2],[4,2],[4,3],[16,2],[16,1],[17,1],[17,1],[17,1],[15,1],[15,1],[15,2],[19,2],[19,2],[19,1],[19,1],[18,2],[18,1],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,9],[7,6],[7,4],[7,1],[7,2],[7,2],[7,1],[21,1],[21,1],[21,1],[39,2],[39,1],[20,4],[20,3],[20,4],[20,2],[20,2],[20,1],[42,1],[42,6],[42,5],[43,1],[43,3],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,8],[45,4],[45,4],[45,4],[45,6],[45,4],[45,4],[45,4],[45,4],[45,4],[45,1],[41,2],[41,3],[41,3],[41,1],[41,3],[41,4],[76,1],[76,2],[76,1],[76,1],[72,1],[72,2],[73,3],[30,1],[30,2],[30,1],[30,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[28,1],[28,2],[28,1],[28,1],[24,5],[25,5],[26,2],[26,4],[26,3],[26,5],[26,3],[26,5],[26,5],[26,7],[26,2],[26,4],[26,2],[26,4],[26,4],[26,6],[22,5],[23,5],[23,5],[23,9],[23,9],[23,7],[23,7],[103,1],[103,3],[92,1],[92,3],[107,1],[107,2],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[108,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[113,1],[82,1],[82,1],[82,1],[82,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[79,1],[79,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[120,1],[47,1],[47,2],[101,1],[101,2],[33,1],[33,1],[33,1],[33,1]],performAction:(0,c.K2)(function(t,e,s,i,n,r,a){var u=r.length-1;switch(n){case 2:case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 3:(!Array.isArray(r[u])||r[u].length>0)&&r[u-1].push(r[u]),this.$=r[u-1];break;case 4:case 183:case 44:case 54:case 76:case 181:this.$=r[u];break;case 11:i.setDirection("TB"),this.$="TB";break;case 12:i.setDirection(r[u-1]),this.$=r[u-1];break;case 27:this.$=r[u-1].nodes;break;case 33:this.$=i.addSubGraph(r[u-6],r[u-1],r[u-4]);break;case 34:this.$=i.addSubGraph(r[u-3],r[u-1],r[u-3]);break;case 35:this.$=i.addSubGraph(void 0,r[u-1],void 0);break;case 37:this.$=r[u].trim(),i.setAccTitle(this.$);break;case 38:case 39:this.$=r[u].trim(),i.setAccDescription(this.$);break;case 43:case 133:this.$=r[u-1]+r[u];break;case 45:i.addVertex(r[u-1][r[u-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,r[u]),i.addLink(r[u-3].stmt,r[u-1],r[u-2]),this.$={stmt:r[u-1],nodes:r[u-1].concat(r[u-3].nodes)};break;case 46:i.addLink(r[u-2].stmt,r[u],r[u-1]),this.$={stmt:r[u],nodes:r[u].concat(r[u-2].nodes)};break;case 47:i.addLink(r[u-3].stmt,r[u-1],r[u-2]),this.$={stmt:r[u-1],nodes:r[u-1].concat(r[u-3].nodes)};break;case 48:this.$={stmt:r[u-1],nodes:r[u-1]};break;case 49:i.addVertex(r[u-1][r[u-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,r[u]),this.$={stmt:r[u-1],nodes:r[u-1],shapeData:r[u]};break;case 50:this.$={stmt:r[u],nodes:r[u]};break;case 51:case 128:case 130:this.$=[r[u]];break;case 52:i.addVertex(r[u-5][r[u-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,r[u-4]),this.$=r[u-5].concat(r[u]);break;case 53:this.$=r[u-4].concat(r[u]);break;case 55:this.$=r[u-2],i.setClass(r[u-2],r[u]);break;case 56:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"square");break;case 57:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"doublecircle");break;case 58:this.$=r[u-5],i.addVertex(r[u-5],r[u-2],"circle");break;case 59:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"ellipse");break;case 60:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"stadium");break;case 61:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"subroutine");break;case 62:this.$=r[u-7],i.addVertex(r[u-7],r[u-1],"rect",void 0,void 0,void 0,Object.fromEntries([[r[u-5],r[u-3]]]));break;case 63:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"cylinder");break;case 64:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"round");break;case 65:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"diamond");break;case 66:this.$=r[u-5],i.addVertex(r[u-5],r[u-2],"hexagon");break;case 67:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"odd");break;case 68:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"trapezoid");break;case 69:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"inv_trapezoid");break;case 70:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"lean_right");break;case 71:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"lean_left");break;case 72:this.$=r[u],i.addVertex(r[u]);break;case 73:r[u-1].text=r[u],this.$=r[u-1];break;case 74:case 75:r[u-2].text=r[u-1],this.$=r[u-2];break;case 77:var o=i.destructLink(r[u],r[u-2]);this.$={type:o.type,stroke:o.stroke,length:o.length,text:r[u-1]};break;case 78:o=i.destructLink(r[u],r[u-2]);this.$={type:o.type,stroke:o.stroke,length:o.length,text:r[u-1],id:r[u-3]};break;case 79:case 86:case 101:case 103:this.$={text:r[u],type:"text"};break;case 80:case 87:case 102:this.$={text:r[u-1].text+""+r[u],type:r[u-1].type};break;case 81:case 88:this.$={text:r[u],type:"string"};break;case 82:case 89:case 104:this.$={text:r[u],type:"markdown"};break;case 83:o=i.destructLink(r[u]);this.$={type:o.type,stroke:o.stroke,length:o.length};break;case 84:o=i.destructLink(r[u]);this.$={type:o.type,stroke:o.stroke,length:o.length,id:r[u-1]};break;case 85:this.$=r[u-1];break;case 105:this.$=r[u-4],i.addClass(r[u-2],r[u]);break;case 106:this.$=r[u-4],i.setClass(r[u-2],r[u]);break;case 107:case 115:this.$=r[u-1],i.setClickEvent(r[u-1],r[u]);break;case 108:case 116:this.$=r[u-3],i.setClickEvent(r[u-3],r[u-2]),i.setTooltip(r[u-3],r[u]);break;case 109:this.$=r[u-2],i.setClickEvent(r[u-2],r[u-1],r[u]);break;case 110:this.$=r[u-4],i.setClickEvent(r[u-4],r[u-3],r[u-2]),i.setTooltip(r[u-4],r[u]);break;case 111:this.$=r[u-2],i.setLink(r[u-2],r[u]);break;case 112:this.$=r[u-4],i.setLink(r[u-4],r[u-2]),i.setTooltip(r[u-4],r[u]);break;case 113:this.$=r[u-4],i.setLink(r[u-4],r[u-2],r[u]);break;case 114:this.$=r[u-6],i.setLink(r[u-6],r[u-4],r[u]),i.setTooltip(r[u-6],r[u-2]);break;case 117:this.$=r[u-1],i.setLink(r[u-1],r[u]);break;case 118:this.$=r[u-3],i.setLink(r[u-3],r[u-2]),i.setTooltip(r[u-3],r[u]);break;case 119:this.$=r[u-3],i.setLink(r[u-3],r[u-2],r[u]);break;case 120:this.$=r[u-5],i.setLink(r[u-5],r[u-4],r[u]),i.setTooltip(r[u-5],r[u-2]);break;case 121:this.$=r[u-4],i.addVertex(r[u-2],void 0,void 0,r[u]);break;case 122:this.$=r[u-4],i.updateLink([r[u-2]],r[u]);break;case 123:this.$=r[u-4],i.updateLink(r[u-2],r[u]);break;case 124:this.$=r[u-8],i.updateLinkInterpolate([r[u-6]],r[u-2]),i.updateLink([r[u-6]],r[u]);break;case 125:this.$=r[u-8],i.updateLinkInterpolate(r[u-6],r[u-2]),i.updateLink(r[u-6],r[u]);break;case 126:this.$=r[u-6],i.updateLinkInterpolate([r[u-4]],r[u]);break;case 127:this.$=r[u-6],i.updateLinkInterpolate(r[u-4],r[u]);break;case 129:case 131:r[u-2].push(r[u]),this.$=r[u-2];break;case 182:case 184:this.$=r[u-1]+""+r[u];break;case 185:this.$={stmt:"dir",value:"TB"};break;case 186:this.$={stmt:"dir",value:"BT"};break;case 187:this.$={stmt:"dir",value:"RL"};break;case 188:this.$={stmt:"dir",value:"LR"}}},"anonymous"),table:[{3:1,4:2,9:e,10:s,12:i},{1:[3]},t(n,r,{5:6}),{4:7,9:e,10:s,12:i},{4:8,9:e,10:s,12:i},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:a,9:u,10:o,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B,121:w,122:L,123:$,124:I},t(n,[2,9]),t(n,[2,10]),t(n,[2,11]),{8:[1,54],9:[1,55],10:R,15:53,18:56},t(N,[2,3]),t(N,[2,4]),t(N,[2,5]),t(N,[2,6]),t(N,[2,7]),t(N,[2,8]),{8:P,9:K,11:G,21:58,41:59,72:63,75:[1,64],77:[1,66],78:[1,65]},{8:P,9:K,11:G,21:67},{8:P,9:K,11:G,21:68},{8:P,9:K,11:G,21:69},{8:P,9:K,11:G,21:70},{8:P,9:K,11:G,21:71},{8:P,9:K,10:[1,72],11:G,21:73},t(N,[2,36]),{35:[1,74]},{37:[1,75]},t(N,[2,39]),t(O,[2,50],{18:76,39:77,10:R,40:V}),{10:[1,79]},{10:[1,80]},{10:[1,81]},{10:[1,82]},{14:M,44:U,60:W,80:[1,86],89:Y,95:[1,83],97:[1,84],101:85,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z,120:87},t(N,[2,185]),t(N,[2,186]),t(N,[2,187]),t(N,[2,188]),t(J,[2,51]),t(J,[2,54],{46:[1,99]}),t(tt,[2,72],{113:112,29:[1,100],44:A,48:[1,101],50:[1,102],52:[1,103],54:[1,104],56:[1,105],58:[1,106],60:b,63:[1,107],65:[1,108],67:[1,109],68:[1,110],70:[1,111],89:D,102:C,105:x,106:T,109:S,111:F,114:_,115:v,116:B}),t(et,[2,181]),t(et,[2,142]),t(et,[2,143]),t(et,[2,144]),t(et,[2,145]),t(et,[2,146]),t(et,[2,147]),t(et,[2,148]),t(et,[2,149]),t(et,[2,150]),t(et,[2,151]),t(et,[2,152]),t(n,[2,12]),t(n,[2,18]),t(n,[2,19]),{9:[1,113]},t(st,[2,26],{18:114,10:R}),t(N,[2,27]),{42:115,43:38,44:A,45:39,47:40,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},t(N,[2,40]),t(N,[2,41]),t(N,[2,42]),t(it,[2,76],{73:116,62:[1,118],74:[1,117]}),{76:119,79:120,80:nt,81:rt,116:at,119:ut},{75:[1,125],77:[1,126]},t(ot,[2,83]),t(N,[2,28]),t(N,[2,29]),t(N,[2,30]),t(N,[2,31]),t(N,[2,32]),{10:lt,12:ct,14:ht,27:dt,28:127,32:pt,44:gt,60:At,75:bt,80:[1,129],81:[1,130],83:140,84:yt,85:kt,86:ft,87:mt,88:Et,89:Dt,90:Ct,91:128,105:xt,109:Tt,111:St,114:Ft,115:_t,116:vt},t(Bt,r,{5:153}),t(N,[2,37]),t(N,[2,38]),t(O,[2,48],{44:wt}),t(O,[2,49],{18:155,10:R,40:Lt}),t(J,[2,44]),{44:A,47:157,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},{102:[1,158],103:159,105:[1,160]},{44:A,47:161,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},{44:A,47:162,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},t($t,[2,107],{10:[1,163],96:[1,164]}),{80:[1,165]},t($t,[2,115],{120:167,10:[1,166],14:M,44:U,60:W,89:Y,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z}),t($t,[2,117],{10:[1,168]}),t(It,[2,183]),t(It,[2,170]),t(It,[2,171]),t(It,[2,172]),t(It,[2,173]),t(It,[2,174]),t(It,[2,175]),t(It,[2,176]),t(It,[2,177]),t(It,[2,178]),t(It,[2,179]),t(It,[2,180]),{44:A,47:169,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},{30:170,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:178,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:180,50:[1,179],67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:181,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:182,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:183,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{109:[1,184]},{30:185,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:186,65:[1,187],67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:188,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:189,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:190,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},t(et,[2,182]),t(n,[2,20]),t(st,[2,25]),t(O,[2,46],{39:191,18:192,10:R,40:V}),t(it,[2,73],{10:[1,193]}),{10:[1,194]},{30:195,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{77:[1,196],79:197,116:at,119:ut},t(Vt,[2,79]),t(Vt,[2,81]),t(Vt,[2,82]),t(Vt,[2,168]),t(Vt,[2,169]),{76:198,79:120,80:nt,81:rt,116:at,119:ut},t(ot,[2,84]),{8:P,9:K,10:lt,11:G,12:ct,14:ht,21:200,27:dt,29:[1,199],32:pt,44:gt,60:At,75:bt,83:140,84:yt,85:kt,86:ft,87:mt,88:Et,89:Dt,90:Ct,91:201,105:xt,109:Tt,111:St,114:Ft,115:_t,116:vt},t(Mt,[2,101]),t(Mt,[2,103]),t(Mt,[2,104]),t(Mt,[2,157]),t(Mt,[2,158]),t(Mt,[2,159]),t(Mt,[2,160]),t(Mt,[2,161]),t(Mt,[2,162]),t(Mt,[2,163]),t(Mt,[2,164]),t(Mt,[2,165]),t(Mt,[2,166]),t(Mt,[2,167]),t(Mt,[2,90]),t(Mt,[2,91]),t(Mt,[2,92]),t(Mt,[2,93]),t(Mt,[2,94]),t(Mt,[2,95]),t(Mt,[2,96]),t(Mt,[2,97]),t(Mt,[2,98]),t(Mt,[2,99]),t(Mt,[2,100]),{6:11,7:12,8:a,9:u,10:o,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,202],33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B,121:w,122:L,123:$,124:I},{10:R,18:203},{44:[1,204]},t(J,[2,43]),{10:[1,205],44:A,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:112,114:_,115:v,116:B},{10:[1,206]},{10:[1,207],106:[1,208]},t(Ut,[2,128]),{10:[1,209],44:A,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:112,114:_,115:v,116:B},{10:[1,210],44:A,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:112,114:_,115:v,116:B},{80:[1,211]},t($t,[2,109],{10:[1,212]}),t($t,[2,111],{10:[1,213]}),{80:[1,214]},t(It,[2,184]),{80:[1,215],98:[1,216]},t(J,[2,55],{113:112,44:A,60:b,89:D,102:C,105:x,106:T,109:S,111:F,114:_,115:v,116:B}),{31:[1,217],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(Wt,[2,86]),t(Wt,[2,88]),t(Wt,[2,89]),t(Wt,[2,153]),t(Wt,[2,154]),t(Wt,[2,155]),t(Wt,[2,156]),{49:[1,219],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{30:220,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{51:[1,221],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{53:[1,222],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{55:[1,223],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{57:[1,224],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{60:[1,225]},{64:[1,226],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{66:[1,227],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{30:228,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{31:[1,229],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{67:Rt,69:[1,230],71:[1,231],82:218,116:Kt,117:Gt,118:Ot},{67:Rt,69:[1,233],71:[1,232],82:218,116:Kt,117:Gt,118:Ot},t(O,[2,45],{18:155,10:R,40:Lt}),t(O,[2,47],{44:wt}),t(it,[2,75]),t(it,[2,74]),{62:[1,234],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(it,[2,77]),t(Vt,[2,80]),{77:[1,235],79:197,116:at,119:ut},{30:236,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},t(Bt,r,{5:237}),t(Mt,[2,102]),t(N,[2,35]),{43:238,44:A,45:39,47:40,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},{10:R,18:239},{10:Yt,60:jt,84:zt,92:240,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{10:Yt,60:jt,84:zt,92:251,104:[1,252],105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{10:Yt,60:jt,84:zt,92:253,104:[1,254],105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{105:[1,255]},{10:Yt,60:jt,84:zt,92:256,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{44:A,47:257,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},t($t,[2,108]),{80:[1,258]},{80:[1,259],98:[1,260]},t($t,[2,116]),t($t,[2,118],{10:[1,261]}),t($t,[2,119]),t(tt,[2,56]),t(Wt,[2,87]),t(tt,[2,57]),{51:[1,262],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(tt,[2,64]),t(tt,[2,59]),t(tt,[2,60]),t(tt,[2,61]),{109:[1,263]},t(tt,[2,63]),t(tt,[2,65]),{66:[1,264],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(tt,[2,67]),t(tt,[2,68]),t(tt,[2,70]),t(tt,[2,69]),t(tt,[2,71]),t([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),t(it,[2,78]),{31:[1,265],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{6:11,7:12,8:a,9:u,10:o,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,266],33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B,121:w,122:L,123:$,124:I},t(J,[2,53]),{43:267,44:A,45:39,47:40,60:b,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B},t($t,[2,121],{106:Jt}),t(te,[2,130],{108:269,10:Yt,60:jt,84:zt,105:Xt,109:Ht,110:qt,111:Qt,112:Zt}),t(ee,[2,132]),t(ee,[2,134]),t(ee,[2,135]),t(ee,[2,136]),t(ee,[2,137]),t(ee,[2,138]),t(ee,[2,139]),t(ee,[2,140]),t(ee,[2,141]),t($t,[2,122],{106:Jt}),{10:[1,270]},t($t,[2,123],{106:Jt}),{10:[1,271]},t(Ut,[2,129]),t($t,[2,105],{106:Jt}),t($t,[2,106],{113:112,44:A,60:b,89:D,102:C,105:x,106:T,109:S,111:F,114:_,115:v,116:B}),t($t,[2,110]),t($t,[2,112],{10:[1,272]}),t($t,[2,113]),{98:[1,273]},{51:[1,274]},{62:[1,275]},{66:[1,276]},{8:P,9:K,11:G,21:277},t(N,[2,34]),t(J,[2,52]),{10:Yt,60:jt,84:zt,105:Xt,107:278,108:242,109:Ht,110:qt,111:Qt,112:Zt},t(ee,[2,133]),{14:M,44:U,60:W,89:Y,101:279,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z,120:87},{14:M,44:U,60:W,89:Y,101:280,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z,120:87},{98:[1,281]},t($t,[2,120]),t(tt,[2,58]),{30:282,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},t(tt,[2,66]),t(Bt,r,{5:283}),t(te,[2,131],{108:269,10:Yt,60:jt,84:zt,105:Xt,109:Ht,110:qt,111:Qt,112:Zt}),t($t,[2,126],{120:167,10:[1,284],14:M,44:U,60:W,89:Y,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z}),t($t,[2,127],{120:167,10:[1,285],14:M,44:U,60:W,89:Y,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z}),t($t,[2,114]),{31:[1,286],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{6:11,7:12,8:a,9:u,10:o,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,287],33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:D,102:C,105:x,106:T,109:S,111:F,113:41,114:_,115:v,116:B,121:w,122:L,123:$,124:I},{10:Yt,60:jt,84:zt,92:288,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{10:Yt,60:jt,84:zt,92:289,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},t(tt,[2,62]),t(N,[2,33]),t($t,[2,124],{106:Jt}),t($t,[2,125],{106:Jt})],defaultActions:{},parseError:(0,c.K2)(function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)},"parseError"),parse:(0,c.K2)(function(t){var e=this,s=[0],i=[],n=[null],r=[],a=this.table,u="",o=0,l=0,h=0,d=r.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var A in this.yy)Object.prototype.hasOwnProperty.call(this.yy,A)&&(g.yy[A]=this.yy[A]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var b=p.yylloc;r.push(b);var y=p.options&&p.options.ranges;function k(){var t;return"number"!=typeof(t=i.pop()||p.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,c.K2)(function(t){s.length=s.length-2*t,n.length=n.length-t,r.length=r.length-t},"popStack"),(0,c.K2)(k,"lex");for(var f,m,E,D,C,x,T,S,F,_={};;){if(E=s[s.length-1],this.defaultActions[E]?D=this.defaultActions[E]:(null==f&&(f=k()),D=a[E]&&a[E][f]),void 0===D||!D.length||!D[0]){var v="";for(x in F=[],a[E])this.terminals_[x]&&x>2&&F.push("'"+this.terminals_[x]+"'");v=p.showPosition?"Parse error on line "+(o+1)+":\n"+p.showPosition()+"\nExpecting "+F.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(o+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(v,{text:p.match,token:this.terminals_[f]||f,line:p.yylineno,loc:b,expected:F})}if(D[0]instanceof Array&&D.length>1)throw new Error("Parse Error: multiple actions possible at state: "+E+", token: "+f);switch(D[0]){case 1:s.push(f),n.push(p.yytext),r.push(p.yylloc),s.push(D[1]),f=null,m?(f=m,m=null):(l=p.yyleng,u=p.yytext,o=p.yylineno,b=p.yylloc,h>0&&h--);break;case 2:if(T=this.productions_[D[1]][1],_.$=n[n.length-T],_._$={first_line:r[r.length-(T||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(T||1)].first_column,last_column:r[r.length-1].last_column},y&&(_._$.range=[r[r.length-(T||1)].range[0],r[r.length-1].range[1]]),void 0!==(C=this.performAction.apply(_,[u,l,o,g.yy,D[1],n,r].concat(d))))return C;T&&(s=s.slice(0,-1*T*2),n=n.slice(0,-1*T),r=r.slice(0,-1*T)),s.push(this.productions_[D[1]][0]),n.push(_.$),r.push(_._$),S=a[s[s.length-2]][s[s.length-1]],s.push(S);break;case 3:return!0}}return!0},"parse")},ie=function(){return{EOF:1,parseError:(0,c.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,c.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,c.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,c.K2)(function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,c.K2)(function(){return this._more=!0,this},"more"),reject:(0,c.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,c.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,c.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,c.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,c.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,c.K2)(function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1},"test_match"),next:(0,c.K2)(function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;re[0].length)){if(e=s,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,c.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,c.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,c.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,c.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,c.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,c.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,c.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:(0,c.K2)(function(t,e,s,i){switch(s){case 0:return this.begin("acc_title"),34;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),36;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:case 12:case 14:case 17:case 20:case 23:case 33:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),e.yytext="",40;case 8:return this.pushState("shapeDataStr"),40;case 9:return this.popState(),40;case 10:const s=/\n\s*/g;return e.yytext=e.yytext.replace(s,"
"),40;case 11:return 40;case 13:this.begin("callbackname");break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 18:return 96;case 19:return"MD_STR";case 21:this.begin("md_string");break;case 22:return"STR";case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 34:return 88;case 35:case 36:case 37:return t.lex.firstGraph()&&this.begin("dir"),12;case 38:return 27;case 39:return 32;case 40:case 41:case 42:case 43:return 98;case 44:return this.popState(),13;case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:return this.popState(),14;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 78;case 60:return 105;case 61:case 102:return 111;case 62:return 46;case 63:return 60;case 64:case 103:return 44;case 65:return 8;case 66:return 106;case 67:case 101:return 115;case 68:case 71:case 74:return this.popState(),77;case 69:return this.pushState("edgeText"),75;case 70:case 73:case 76:return 119;case 72:return this.pushState("thickEdgeText"),75;case 75:return this.pushState("dottedEdgeText"),75;case 77:return 77;case 78:return this.popState(),53;case 79:case 115:return"TEXT";case 80:return this.pushState("ellipseText"),52;case 81:return this.popState(),55;case 82:return this.pushState("text"),54;case 83:return this.popState(),57;case 84:return this.pushState("text"),56;case 85:return 58;case 86:return this.pushState("text"),67;case 87:return this.popState(),64;case 88:return this.pushState("text"),63;case 89:return this.popState(),49;case 90:return this.pushState("text"),48;case 91:return this.popState(),69;case 92:return this.popState(),71;case 93:return 117;case 94:return this.pushState("trapText"),68;case 95:return this.pushState("trapText"),70;case 96:return 118;case 97:return 67;case 98:return 90;case 99:return"SEP";case 100:return 89;case 104:return 109;case 105:return 114;case 106:return 116;case 107:return this.popState(),62;case 108:return this.pushState("text"),62;case 109:return this.popState(),51;case 110:return this.pushState("text"),50;case 111:return this.popState(),31;case 112:return this.pushState("text"),29;case 113:return this.popState(),66;case 114:return this.pushState("text"),65;case 116:return"QUOTE";case 117:return 9;case 118:return 10;case 119:return 11}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:@\{)/,/^(?:["])/,/^(?:["])/,/^(?:[^\"]+)/,/^(?:[^}^"]+)/,/^(?:\})/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["][`])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:["])/,/^(?:style\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\b)/,/^(?:class\b)/,/^(?:href[\s])/,/^(?:click[\s]+)/,/^(?:[\s\n])/,/^(?:[^\s\n]*)/,/^(?:flowchart-elk\b)/,/^(?:graph\b)/,/^(?:flowchart\b)/,/^(?:subgraph\b)/,/^(?:end\b\s*)/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:(\r?\n)*\s*\n)/,/^(?:\s*LR\b)/,/^(?:\s*RL\b)/,/^(?:\s*TB\b)/,/^(?:\s*BT\b)/,/^(?:\s*TD\b)/,/^(?:\s*BR\b)/,/^(?:\s*<)/,/^(?:\s*>)/,/^(?:\s*\^)/,/^(?:\s*v\b)/,/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:[^\s\"]+@(?=[^\{\"]))/,/^(?:[0-9]+)/,/^(?:#)/,/^(?::::)/,/^(?::)/,/^(?:&)/,/^(?:;)/,/^(?:,)/,/^(?:\*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:[^-]|-(?!-)+)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:[^=]|=(?!))/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:[^\.]|\.(?!))/,/^(?:\s*~~[\~]+\s*)/,/^(?:[-/\)][\)])/,/^(?:[^\(\)\[\]\{\}]|!\)+)/,/^(?:\(-)/,/^(?:\]\))/,/^(?:\(\[)/,/^(?:\]\])/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:>)/,/^(?:\)\])/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\(\(\()/,/^(?:[\\(?=\])][\]])/,/^(?:\/(?=\])\])/,/^(?:\/(?!\])|\\(?!\])|[^\\\[\]\(\)\{\}\/]+)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:<)/,/^(?:>)/,/^(?:\^)/,/^(?:\\\|)/,/^(?:v\b)/,/^(?:\*)/,/^(?:#)/,/^(?:&)/,/^(?:([A-Za-z0-9!"\#$%&'*+\.`?\\_\/]|-(?=[^\>\-\.])|(?!))+)/,/^(?:-)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\|)/,/^(?:\|)/,/^(?:\))/,/^(?:\()/,/^(?:\])/,/^(?:\[)/,/^(?:(\}))/,/^(?:\{)/,/^(?:[^\[\]\(\)\{\}\|\"]+)/,/^(?:")/,/^(?:(\r?\n)+)/,/^(?:\s)/,/^(?:$)/],conditions:{shapeDataEndBracket:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeDataStr:{rules:[9,10,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeData:{rules:[8,11,12,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackargs:{rules:[17,18,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackname:{rules:[14,15,16,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},href:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},click:{rules:[21,24,33,34,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dottedEdgeText:{rules:[21,24,74,76,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},thickEdgeText:{rules:[21,24,71,73,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},edgeText:{rules:[21,24,68,70,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},trapText:{rules:[21,24,77,80,82,84,88,90,91,92,93,94,95,108,110,112,114],inclusive:!1},ellipseText:{rules:[21,24,77,78,79,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},text:{rules:[21,24,77,80,81,82,83,84,87,88,89,90,94,95,107,108,109,110,111,112,113,114,115],inclusive:!1},vertex:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dir:{rules:[21,24,44,45,46,47,48,49,50,51,52,53,54,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr_multiline:{rules:[5,6,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr:{rules:[3,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_title:{rules:[1,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},md_string:{rules:[19,20,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},string:{rules:[21,22,23,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},INITIAL:{rules:[0,2,4,7,13,21,24,25,26,27,28,29,30,31,32,35,36,37,38,39,40,41,42,43,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,71,72,74,75,77,80,82,84,85,86,88,90,94,95,96,97,98,99,100,101,102,103,104,105,106,108,110,112,114,116,117,118,119],inclusive:!0}}}}();function ne(){this.yy={}}return se.lexer=ie,(0,c.K2)(ne,"Parser"),ne.prototype=se,se.Parser=ne,new ne}();b.parser=b;var y=b,k=Object.assign({},y);k.parse=t=>{const e=t.replace(/}\s*\n/g,"}\n");return y.parse(e)};var f=k,m=(0,c.K2)((t,e)=>{const s=d.A,i=s(t,"r"),n=s(t,"g"),r=s(t,"b");return p.A(i,n,r,e)},"fade"),E=(0,c.K2)(t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n .cluster-label text {\n fill: ${t.titleColor};\n }\n .cluster-label span {\n color: ${t.titleColor};\n }\n .cluster-label span p {\n background-color: transparent;\n }\n\n .label text,span {\n fill: ${t.nodeTextColor||t.textColor};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n .rough-node .label text , .node .label text, .image-shape .label, .icon-shape .label {\n text-anchor: middle;\n }\n // .flowchart-label .text-outer-tspan {\n // text-anchor: middle;\n // }\n // .flowchart-label .text-inner-tspan {\n // text-anchor: start;\n // }\n\n .node .katex path {\n fill: #000;\n stroke: #000;\n stroke-width: 1px;\n }\n\n .rough-node .label,.node .label, .image-shape .label, .icon-shape .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n\n .root .anchor path {\n fill: ${t.lineColor} !important;\n stroke-width: 0;\n stroke: ${t.lineColor};\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n p {\n background-color: ${t.edgeLabelBackground};\n }\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n\n /* For html labels only */\n .labelBkg {\n background-color: ${m(t.edgeLabelBackground,.5)};\n // background-color:\n }\n\n .cluster rect {\n fill: ${t.clusterBkg};\n stroke: ${t.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n .cluster span {\n color: ${t.titleColor};\n }\n /* .cluster div {\n color: ${t.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n\n rect.text {\n fill: none;\n stroke-width: 0;\n }\n\n .icon-shape, .image-shape {\n background-color: ${t.edgeLabelBackground};\n p {\n background-color: ${t.edgeLabelBackground};\n padding: 2px;\n }\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n ${(0,i.o)()}\n`,"getStyles"),D={parser:f,get db(){return new g},renderer:A,styles:E,init:(0,c.K2)(t=>{t.flowchart||(t.flowchart={}),t.layout&&(0,c.XV)({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,(0,c.XV)({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}})},"init")}},80124:(t,e,s)=>{s.d(e,{A:()=>r});var i=s(46554),n=s(55385);const r=(t,e)=>i.A.lang.round(n.A.parse(t)[e])},91544:(t,e,s)=>{s.d(e,{A:()=>r});var i=s(97485),n=s(3170),r=(0,i.K2)((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)},"getDiagramElement")}}]); \ No newline at end of file diff --git a/assets/js/2950f807.da4a2425.js b/assets/js/2950f807.da4a2425.js new file mode 100644 index 0000000000..e59883180b --- /dev/null +++ b/assets/js/2950f807.da4a2425.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7914],{48456:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>r,contentTitle:()=>i,default:()=>l,frontMatter:()=>d,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/docs/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/next/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/must_be_api.md","tags":[],"version":"current","frontMatter":{"id":"must_be_api","slug":"/rules/must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/next/rules/unused_dependency"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/next/rules/inherited_dependency"}}');var o=t(23420),c=t(65404);const d={id:"must_be_api",slug:"/rules/must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},i=void 0,r={},u=[];function a(e){const s={code:"code",p:"p",...(0,c.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,c.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},65404:(e,s,t)=>{t.d(s,{R:()=>d,x:()=>i});var n=t(36672);const o={},c=n.createContext(o);function d(e){const s=n.useContext(c);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function i(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),n.createElement(c.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/299.732d79d4.js b/assets/js/299.732d79d4.js new file mode 100644 index 0000000000..45cbb148a1 --- /dev/null +++ b/assets/js/299.732d79d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[299],{30299:(t,i,e)=>{e.d(i,{diagram:()=>tt});var s=e(63727),a=e(9420),n=e(47765),h=e(97485),o=e(3170),r=function(){var t=(0,h.K2)(function(t,i,e,s){for(e=e||{},s=t.length;s--;e[t[s]]=i);return e},"o"),i=[1,10,12,14,16,18,19,21,23],e=[2,6],s=[1,3],a=[1,5],n=[1,6],o=[1,7],r=[1,5,10,12,14,16,18,19,21,23,34,35,36],l=[1,25],c=[1,26],g=[1,28],u=[1,29],x=[1,30],d=[1,31],p=[1,32],f=[1,33],y=[1,34],m=[1,35],b=[1,36],A=[1,37],w=[1,43],S=[1,42],C=[1,47],k=[1,50],_=[1,10,12,14,16,18,19,21,23,34,35,36],T=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],R=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36,41,42,43,44,45,46,47,48,49,50],D=[1,64],L={trace:(0,h.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,eol:4,XYCHART:5,chartConfig:6,document:7,CHART_ORIENTATION:8,statement:9,title:10,text:11,X_AXIS:12,parseXAxis:13,Y_AXIS:14,parseYAxis:15,LINE:16,plotData:17,BAR:18,acc_title:19,acc_title_value:20,acc_descr:21,acc_descr_value:22,acc_descr_multiline_value:23,SQUARE_BRACES_START:24,commaSeparatedNumbers:25,SQUARE_BRACES_END:26,NUMBER_WITH_DECIMAL:27,COMMA:28,xAxisData:29,bandData:30,ARROW_DELIMITER:31,commaSeparatedTexts:32,yAxisData:33,NEWLINE:34,SEMI:35,EOF:36,alphaNum:37,STR:38,MD_STR:39,alphaNumToken:40,AMP:41,NUM:42,ALPHA:43,PLUS:44,EQUALS:45,MULT:46,DOT:47,BRKT:48,MINUS:49,UNDERSCORE:50,$accept:0,$end:1},terminals_:{2:"error",5:"XYCHART",8:"CHART_ORIENTATION",10:"title",12:"X_AXIS",14:"Y_AXIS",16:"LINE",18:"BAR",19:"acc_title",20:"acc_title_value",21:"acc_descr",22:"acc_descr_value",23:"acc_descr_multiline_value",24:"SQUARE_BRACES_START",26:"SQUARE_BRACES_END",27:"NUMBER_WITH_DECIMAL",28:"COMMA",31:"ARROW_DELIMITER",34:"NEWLINE",35:"SEMI",36:"EOF",38:"STR",39:"MD_STR",41:"AMP",42:"NUM",43:"ALPHA",44:"PLUS",45:"EQUALS",46:"MULT",47:"DOT",48:"BRKT",49:"MINUS",50:"UNDERSCORE"},productions_:[0,[3,2],[3,3],[3,2],[3,1],[6,1],[7,0],[7,2],[9,2],[9,2],[9,2],[9,2],[9,2],[9,3],[9,2],[9,3],[9,2],[9,2],[9,1],[17,3],[25,3],[25,1],[13,1],[13,2],[13,1],[29,1],[29,3],[30,3],[32,3],[32,1],[15,1],[15,2],[15,1],[33,3],[4,1],[4,1],[4,1],[11,1],[11,1],[11,1],[37,1],[37,2],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1],[40,1]],performAction:(0,h.K2)(function(t,i,e,s,a,n,h){var o=n.length-1;switch(a){case 5:s.setOrientation(n[o]);break;case 9:s.setDiagramTitle(n[o].text.trim());break;case 12:s.setLineData({text:"",type:"text"},n[o]);break;case 13:s.setLineData(n[o-1],n[o]);break;case 14:s.setBarData({text:"",type:"text"},n[o]);break;case 15:s.setBarData(n[o-1],n[o]);break;case 16:this.$=n[o].trim(),s.setAccTitle(this.$);break;case 17:case 18:this.$=n[o].trim(),s.setAccDescription(this.$);break;case 19:case 27:this.$=n[o-1];break;case 20:this.$=[Number(n[o-2]),...n[o]];break;case 21:this.$=[Number(n[o])];break;case 22:s.setXAxisTitle(n[o]);break;case 23:s.setXAxisTitle(n[o-1]);break;case 24:s.setXAxisTitle({type:"text",text:""});break;case 25:s.setXAxisBand(n[o]);break;case 26:s.setXAxisRangeData(Number(n[o-2]),Number(n[o]));break;case 28:this.$=[n[o-2],...n[o]];break;case 29:this.$=[n[o]];break;case 30:s.setYAxisTitle(n[o]);break;case 31:s.setYAxisTitle(n[o-1]);break;case 32:s.setYAxisTitle({type:"text",text:""});break;case 33:s.setYAxisRangeData(Number(n[o-2]),Number(n[o]));break;case 37:case 38:this.$={text:n[o],type:"text"};break;case 39:this.$={text:n[o],type:"markdown"};break;case 40:this.$=n[o];break;case 41:this.$=n[o-1]+""+n[o]}},"anonymous"),table:[t(i,e,{3:1,4:2,7:4,5:s,34:a,35:n,36:o}),{1:[3]},t(i,e,{4:2,7:4,3:8,5:s,34:a,35:n,36:o}),t(i,e,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:a,35:n,36:o}),{1:[2,4],9:12,10:[1,13],12:[1,14],14:[1,15],16:[1,16],18:[1,17],19:[1,18],21:[1,19],23:[1,20]},t(r,[2,34]),t(r,[2,35]),t(r,[2,36]),{1:[2,1]},t(i,e,{4:2,7:4,3:21,5:s,34:a,35:n,36:o}),{1:[2,3]},t(r,[2,5]),t(i,[2,7],{4:22,34:a,35:n,36:o}),{11:23,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:39,13:38,24:w,27:S,29:40,30:41,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:45,15:44,27:C,33:46,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:49,17:48,24:k,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:52,17:51,24:k,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{20:[1,53]},{22:[1,54]},t(_,[2,18]),{1:[2,2]},t(_,[2,8]),t(_,[2,9]),t(T,[2,37],{40:55,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A}),t(T,[2,38]),t(T,[2,39]),t(R,[2,40]),t(R,[2,42]),t(R,[2,43]),t(R,[2,44]),t(R,[2,45]),t(R,[2,46]),t(R,[2,47]),t(R,[2,48]),t(R,[2,49]),t(R,[2,50]),t(R,[2,51]),t(_,[2,10]),t(_,[2,22],{30:41,29:56,24:w,27:S}),t(_,[2,24]),t(_,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},t(_,[2,11]),t(_,[2,30],{33:60,27:C}),t(_,[2,32]),{31:[1,61]},t(_,[2,12]),{17:62,24:k},{25:63,27:D},t(_,[2,14]),{17:65,24:k},t(_,[2,16]),t(_,[2,17]),t(R,[2,41]),t(_,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(_,[2,31]),{27:[1,69]},t(_,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(_,[2,15]),t(_,[2,26]),t(_,[2,27]),{11:59,32:72,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},t(_,[2,33]),t(_,[2,19]),{25:73,27:D},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:(0,h.K2)(function(t,i){if(!i.recoverable){var e=new Error(t);throw e.hash=i,e}this.trace(t)},"parseError"),parse:(0,h.K2)(function(t){var i=this,e=[0],s=[],a=[null],n=[],o=this.table,r="",l=0,c=0,g=0,u=n.slice.call(arguments,1),x=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);x.setInput(t,d.yy),d.yy.lexer=x,d.yy.parser=this,void 0===x.yylloc&&(x.yylloc={});var f=x.yylloc;n.push(f);var y=x.options&&x.options.ranges;function m(){var t;return"number"!=typeof(t=s.pop()||x.lex()||1)&&(t instanceof Array&&(t=(s=t).pop()),t=i.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,h.K2)(function(t){e.length=e.length-2*t,a.length=a.length-t,n.length=n.length-t},"popStack"),(0,h.K2)(m,"lex");for(var b,A,w,S,C,k,_,T,R,D={};;){if(w=e[e.length-1],this.defaultActions[w]?S=this.defaultActions[w]:(null==b&&(b=m()),S=o[w]&&o[w][b]),void 0===S||!S.length||!S[0]){var L="";for(k in R=[],o[w])this.terminals_[k]&&k>2&&R.push("'"+this.terminals_[k]+"'");L=x.showPosition?"Parse error on line "+(l+1)+":\n"+x.showPosition()+"\nExpecting "+R.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(L,{text:x.match,token:this.terminals_[b]||b,line:x.yylineno,loc:f,expected:R})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+w+", token: "+b);switch(S[0]){case 1:e.push(b),a.push(x.yytext),n.push(x.yylloc),e.push(S[1]),b=null,A?(b=A,A=null):(c=x.yyleng,r=x.yytext,l=x.yylineno,f=x.yylloc,g>0&&g--);break;case 2:if(_=this.productions_[S[1]][1],D.$=a[a.length-_],D._$={first_line:n[n.length-(_||1)].first_line,last_line:n[n.length-1].last_line,first_column:n[n.length-(_||1)].first_column,last_column:n[n.length-1].last_column},y&&(D._$.range=[n[n.length-(_||1)].range[0],n[n.length-1].range[1]]),void 0!==(C=this.performAction.apply(D,[r,c,l,d.yy,S[1],a,n].concat(u))))return C;_&&(e=e.slice(0,-1*_*2),a=a.slice(0,-1*_),n=n.slice(0,-1*_)),e.push(this.productions_[S[1]][0]),a.push(D.$),n.push(D._$),T=o[e[e.length-2]][e[e.length-1]],e.push(T);break;case 3:return!0}}return!0},"parse")},P=function(){return{EOF:1,parseError:(0,h.K2)(function(t,i){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,i)},"parseError"),setInput:(0,h.K2)(function(t,i){return this.yy=i||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,h.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,h.K2)(function(t){var i=t.length,e=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-i),this.offset-=i;var s=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),e.length-1&&(this.yylineno-=e.length-1);var a=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:e?(e.length===s.length?this.yylloc.first_column:0)+s[s.length-e.length].length-e[0].length:this.yylloc.first_column-i},this.options.ranges&&(this.yylloc.range=[a[0],a[0]+this.yyleng-i]),this.yyleng=this.yytext.length,this},"unput"),more:(0,h.K2)(function(){return this._more=!0,this},"more"),reject:(0,h.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,h.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,h.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,h.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,h.K2)(function(){var t=this.pastInput(),i=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+i+"^"},"showPosition"),test_match:(0,h.K2)(function(t,i){var e,s,a;if(this.options.backtrack_lexer&&(a={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(a.yylloc.range=this.yylloc.range.slice(0))),(s=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,i,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e)return e;if(this._backtrack){for(var n in a)this[n]=a[n];return!1}return!1},"test_match"),next:(0,h.K2)(function(){if(this.done)return this.EOF;var t,i,e,s;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var a=this._currentRules(),n=0;ni[0].length)){if(i=e,s=n,this.options.backtrack_lexer){if(!1!==(t=this.test_match(e,a[n])))return t;if(this._backtrack){i=!1;continue}return!1}if(!this.options.flex)break}return i?!1!==(t=this.test_match(i,a[s]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,h.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,h.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,h.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,h.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,h.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,h.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,h.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,h.K2)(function(t,i,e,s){switch(e){case 0:case 1:case 5:case 43:break;case 2:case 3:return this.popState(),34;case 4:return 34;case 6:return 10;case 7:return this.pushState("acc_title"),19;case 8:return this.popState(),"acc_title_value";case 9:return this.pushState("acc_descr"),21;case 10:return this.popState(),"acc_descr_value";case 11:this.pushState("acc_descr_multiline");break;case 12:case 25:case 27:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 8;case 16:return this.pushState("axis_data"),"X_AXIS";case 17:return this.pushState("axis_data"),"Y_AXIS";case 18:return this.pushState("axis_band_data"),24;case 19:return 31;case 20:return this.pushState("data"),16;case 21:return this.pushState("data"),18;case 22:return this.pushState("data_inner"),24;case 23:return 27;case 24:return this.popState(),26;case 26:this.pushState("string");break;case 28:return"STR";case 29:return 24;case 30:return 26;case 31:return 43;case 32:return"COLON";case 33:return 44;case 34:return 28;case 35:return 45;case 36:return 46;case 37:return 48;case 38:return 50;case 39:return 47;case 40:return 41;case 41:return 49;case 42:return 42;case 44:return 35;case 45:return 36}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:(\r?\n))/i,/^(?:(\r?\n))/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:\{)/i,/^(?:[^\}]*)/i,/^(?:xychart-beta\b)/i,/^(?:(?:vertical|horizontal))/i,/^(?:x-axis\b)/i,/^(?:y-axis\b)/i,/^(?:\[)/i,/^(?:-->)/i,/^(?:line\b)/i,/^(?:bar\b)/i,/^(?:\[)/i,/^(?:[+-]?(?:\d+(?:\.\d+)?|\.\d+))/i,/^(?:\])/i,/^(?:(?:`\) \{ this\.pushState\(md_string\); \}\n\(\?:\(\?!`"\)\.\)\+ \{ return MD_STR; \}\n\(\?:`))/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s+)/i,/^(?:;)/i,/^(?:$)/i],conditions:{data_inner:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,20,21,22,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,23,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[27,28],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0}}}}();function E(){this.yy={}}return L.lexer=P,(0,h.K2)(E,"Parser"),E.prototype=L,L.Parser=E,new E}();r.parser=r;var l=r;function c(t){return"bar"===t.type}function g(t){return"band"===t.type}function u(t){return"linear"===t.type}(0,h.K2)(c,"isBarPlot"),(0,h.K2)(g,"isBandAxisData"),(0,h.K2)(u,"isLinearAxisData");var x=class{constructor(t){this.parentGroup=t}static{(0,h.K2)(this,"TextDimensionCalculatorWithFont")}getMaxDimension(t,i){if(!this.parentGroup)return{width:t.reduce((t,i)=>Math.max(i.length,t),0)*i,height:i};const e={width:0,height:0},a=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",i);for(const n of t){const t=(0,s.W6)(a,1,n),h=t?t.width:n.length*i,o=t?t.height:i;e.width=Math.max(e.width,h),e.height=Math.max(e.height,o)}return a.remove(),e}},d=class{constructor(t,i,e,s){this.axisConfig=t,this.title=i,this.textDimensionCalculator=e,this.axisThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left",this.showTitle=!1,this.showLabel=!1,this.showTick=!1,this.showAxisLine=!1,this.outerPadding=0,this.titleTextHeight=0,this.labelTextHeight=0,this.range=[0,10],this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left"}static{(0,h.K2)(this,"BaseAxis")}setRange(t){this.range=t,"left"===this.axisPosition||"right"===this.axisPosition?this.boundingRect.height=t[1]-t[0]:this.boundingRect.width=t[1]-t[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(t){this.axisPosition=t,this.setRange(this.range)}getTickDistance(){const t=this.getRange();return Math.abs(t[0]-t[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map(t=>t.toString()),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>2*this.outerPadding&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(t){let i=t.height;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){const e=this.getLabelDimension(),s=.2*t.width;this.outerPadding=Math.min(e.width/2,s);const a=e.height+2*this.axisConfig.labelPadding;this.labelTextHeight=e.height,a<=i&&(i-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){const t=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),e=t.height+2*this.axisConfig.titlePadding;this.titleTextHeight=t.height,e<=i&&(i-=e,this.showTitle=!0)}this.boundingRect.width=t.width,this.boundingRect.height=t.height-i}calculateSpaceIfDrawnVertical(t){let i=t.width;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){const e=this.getLabelDimension(),s=.2*t.height;this.outerPadding=Math.min(e.height/2,s);const a=e.width+2*this.axisConfig.labelPadding;a<=i&&(i-=a,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){const t=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),e=t.height+2*this.axisConfig.titlePadding;this.titleTextHeight=t.height,e<=i&&(i-=e,this.showTitle=!0)}this.boundingRect.width=t.width-i,this.boundingRect.height=t.height}calculateSpace(t){return"left"===this.axisPosition||"right"===this.axisPosition?this.calculateSpaceIfDrawnVertical(t):this.calculateSpaceIfDrawnHorizontally(t),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}getDrawableElementsForLeftAxis(){const t=[];if(this.showAxisLine){const i=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${i},${this.boundingRect.y} L ${i},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map(t=>({text:t.toString(),x:this.boundingRect.x+this.boundingRect.width-(this.showLabel?this.axisConfig.labelPadding:0)-(this.showTick?this.axisConfig.tickLength:0)-(this.showAxisLine?this.axisConfig.axisLineWidth:0),y:this.getScaleValue(t),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"}))}),this.showTick){const i=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map(t=>({path:`M ${i},${this.getScaleValue(t)} L ${i-this.axisConfig.tickLength},${this.getScaleValue(t)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["left-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.axisConfig.titlePadding,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:270,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForBottomAxis(){const t=[];if(this.showAxisLine){const i=this.boundingRect.y+this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map(t=>({text:t.toString(),x:this.getScaleValue(t),y:this.boundingRect.y+this.axisConfig.labelPadding+(this.showTick?this.axisConfig.tickLength:0)+(this.showAxisLine?this.axisConfig.axisLineWidth:0),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){const i=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map(t=>({path:`M ${this.getScaleValue(t)},${i} L ${this.getScaleValue(t)},${i+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["bottom-axis","title"],data:[{text:this.title,x:this.range[0]+(this.range[1]-this.range[0])/2,y:this.boundingRect.y+this.boundingRect.height-this.axisConfig.titlePadding-this.titleTextHeight,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElementsForTopAxis(){const t=[];if(this.showAxisLine){const i=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map(t=>({text:t.toString(),x:this.getScaleValue(t),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+2*this.axisConfig.titlePadding:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}))}),this.showTick){const i=this.boundingRect.y;t.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map(t=>({path:`M ${this.getScaleValue(t)},${i+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(t)},${i+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth}))})}return this.showTitle&&t.push({type:"text",groupTexts:["top-axis","title"],data:[{text:this.title,x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.axisConfig.titlePadding,fill:this.axisThemeConfig.titleColor,fontSize:this.axisConfig.titleFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"}]}),t}getDrawableElements(){if("left"===this.axisPosition)return this.getDrawableElementsForLeftAxis();if("right"===this.axisPosition)throw Error("Drawing of right axis is not implemented");return"bottom"===this.axisPosition?this.getDrawableElementsForBottomAxis():"top"===this.axisPosition?this.getDrawableElementsForTopAxis():[]}},p=class extends d{static{(0,h.K2)(this,"BandAxis")}constructor(t,i,e,s,a){super(t,s,a,i),this.categories=e,this.scale=(0,o.WH)().domain(this.categories).range(this.getRange())}setRange(t){super.setRange(t)}recalculateScale(){this.scale=(0,o.WH)().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),h.Rm.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(t){return this.scale(t)??this.getRange()[0]}},f=class extends d{static{(0,h.K2)(this,"LinearAxis")}constructor(t,i,e,s,a){super(t,s,a,i),this.domain=e,this.scale=(0,o.m4Y)().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){const t=[...this.domain];"left"===this.axisPosition&&t.reverse(),this.scale=(0,o.m4Y)().domain(t).range(this.getRange())}getScaleValue(t){return this.scale(t)}};function y(t,i,e,s){const a=new x(s);return g(t)?new p(i,e,t.categories,t.title,a):new f(i,e,[t.min,t.max],t.title,a)}(0,h.K2)(y,"getAxis");var m=class{constructor(t,i,e,s){this.textDimensionCalculator=t,this.chartConfig=i,this.chartData=e,this.chartThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static{(0,h.K2)(this,"ChartTitle")}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){const i=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),e=Math.max(i.width,t.width),s=i.height+2*this.chartConfig.titlePadding;return i.width<=e&&i.height<=s&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=e,this.boundingRect.height=s,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){const t=[];return this.showChartTitle&&t.push({groupTexts:["chart-title"],type:"text",data:[{fontSize:this.chartConfig.titleFontSize,text:this.chartData.title,verticalPos:"middle",horizontalPos:"center",x:this.boundingRect.x+this.boundingRect.width/2,y:this.boundingRect.y+this.boundingRect.height/2,fill:this.chartThemeConfig.titleColor,rotation:0}]}),t}};function b(t,i,e,s){const a=new x(s);return new m(a,t,i,e)}(0,h.K2)(b,"getChartTitleComponent");var A=class{constructor(t,i,e,s,a){this.plotData=t,this.xAxis=i,this.yAxis=e,this.orientation=s,this.plotIndex=a}static{(0,h.K2)(this,"LinePlot")}getDrawableElement(){const t=this.plotData.data.map(t=>[this.xAxis.getScaleValue(t[0]),this.yAxis.getScaleValue(t[1])]);let i;return i="horizontal"===this.orientation?(0,o.n8j)().y(t=>t[0]).x(t=>t[1])(t):(0,o.n8j)().x(t=>t[0]).y(t=>t[1])(t),i?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:i,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}},w=class{constructor(t,i,e,s,a,n){this.barData=t,this.boundingRect=i,this.xAxis=e,this.yAxis=s,this.orientation=a,this.plotIndex=n}static{(0,h.K2)(this,"BarPlot")}getDrawableElement(){const t=this.barData.data.map(t=>[this.xAxis.getScaleValue(t[0]),this.yAxis.getScaleValue(t[1])]),i=.95*Math.min(2*this.xAxis.getAxisOuterPadding(),this.xAxis.getTickDistance()),e=i/2;return"horizontal"===this.orientation?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(t=>({x:this.boundingRect.x,y:t[0]-e,height:i,width:t[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map(t=>({x:t[0]-e,y:t[1],width:i,height:this.boundingRect.y+this.boundingRect.height-t[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill}))}]}},S=class{constructor(t,i,e){this.chartConfig=t,this.chartData=i,this.chartThemeConfig=e,this.boundingRect={x:0,y:0,width:0,height:0}}static{(0,h.K2)(this,"BasePlot")}setAxes(t,i){this.xAxis=t,this.yAxis=i}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){return this.boundingRect.width=t.width,this.boundingRect.height=t.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!this.xAxis||!this.yAxis)throw Error("Axes must be passed to render Plots");const t=[];for(const[i,e]of this.chartData.plots.entries())switch(e.type){case"line":{const s=new A(e,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}break;case"bar":{const s=new w(e,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}}return t}};function C(t,i,e){return new S(t,i,e)}(0,h.K2)(C,"getPlotComponent");var k,_=class{constructor(t,i,e,s){this.chartConfig=t,this.chartData=i,this.componentStore={title:b(t,i,e,s),plot:C(t,i,e),xAxis:y(i.xAxis,t.xAxis,{titleColor:e.xAxisTitleColor,labelColor:e.xAxisLabelColor,tickColor:e.xAxisTickColor,axisLineColor:e.xAxisLineColor},s),yAxis:y(i.yAxis,t.yAxis,{titleColor:e.yAxisTitleColor,labelColor:e.yAxisLabelColor,tickColor:e.yAxisTickColor,axisLineColor:e.yAxisLineColor},s)}}static{(0,h.K2)(this,"Orchestrator")}calculateVerticalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,a=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),n=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),h=this.componentStore.plot.calculateSpace({width:a,height:n});t-=h.width,i-=h.height,h=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),s=h.height,i-=h.height,this.componentStore.xAxis.setAxisPosition("bottom"),h=this.componentStore.xAxis.calculateSpace({width:t,height:i}),i-=h.height,this.componentStore.yAxis.setAxisPosition("left"),h=this.componentStore.yAxis.calculateSpace({width:t,height:i}),e=h.width,t-=h.width,t>0&&(a+=t,t=0),i>0&&(n+=i,i=0),this.componentStore.plot.calculateSpace({width:a,height:n}),this.componentStore.plot.setBoundingBoxXY({x:e,y:s}),this.componentStore.xAxis.setRange([e,e+a]),this.componentStore.xAxis.setBoundingBoxXY({x:e,y:s+n}),this.componentStore.yAxis.setRange([s,s+n]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:s}),this.chartData.plots.some(t=>c(t))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,a=0,n=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),h=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),o=this.componentStore.plot.calculateSpace({width:n,height:h});t-=o.width,i-=o.height,o=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),e=o.height,i-=o.height,this.componentStore.xAxis.setAxisPosition("left"),o=this.componentStore.xAxis.calculateSpace({width:t,height:i}),t-=o.width,s=o.width,this.componentStore.yAxis.setAxisPosition("top"),o=this.componentStore.yAxis.calculateSpace({width:t,height:i}),i-=o.height,a=e+o.height,t>0&&(n+=t,t=0),i>0&&(h+=i,i=0),this.componentStore.plot.calculateSpace({width:n,height:h}),this.componentStore.plot.setBoundingBoxXY({x:s,y:a}),this.componentStore.yAxis.setRange([s,s+n]),this.componentStore.yAxis.setBoundingBoxXY({x:s,y:e}),this.componentStore.xAxis.setRange([a,a+h]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:a}),this.chartData.plots.some(t=>c(t))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){"horizontal"===this.chartConfig.chartOrientation?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();const t=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(const i of Object.values(this.componentStore))t.push(...i.getDrawableElements());return t}},T=class{static{(0,h.K2)(this,"XYChartBuilder")}static build(t,i,e,s){return new _(t,i,e,s).getDrawableElement()}},R=0,D=$(),L=I(),P=M(),E=L.plotColorPalette.split(",").map(t=>t.trim()),v=!1,K=!1;function I(){const t=(0,h.P$)(),i=(0,h.zj)();return(0,a.$t)(t.xyChart,i.themeVariables.xyChart)}function $(){const t=(0,h.zj)();return(0,a.$t)(h.UI.xyChart,t.xyChart)}function M(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function z(t){const i=(0,h.zj)();return(0,h.jZ)(t.trim(),i)}function B(t){k=t}function W(t){D.chartOrientation="horizontal"===t?"horizontal":"vertical"}function O(t){P.xAxis.title=z(t.text)}function F(t,i){P.xAxis={type:"linear",title:P.xAxis.title,min:t,max:i},v=!0}function N(t){P.xAxis={type:"band",title:P.xAxis.title,categories:t.map(t=>z(t.text))},v=!0}function X(t){P.yAxis.title=z(t.text)}function V(t,i){P.yAxis={type:"linear",title:P.yAxis.title,min:t,max:i},K=!0}function Y(t){const i=Math.min(...t),e=Math.max(...t),s=u(P.yAxis)?P.yAxis.min:1/0,a=u(P.yAxis)?P.yAxis.max:-1/0;P.yAxis={type:"linear",title:P.yAxis.title,min:Math.min(s,i),max:Math.max(a,e)}}function H(t){let i=[];if(0===t.length)return i;if(!v){const i=u(P.xAxis)?P.xAxis.min:1/0,e=u(P.xAxis)?P.xAxis.max:-1/0;F(Math.min(i,1),Math.max(e,t.length))}if(K||Y(t),g(P.xAxis)&&(i=P.xAxis.categories.map((i,e)=>[i,t[e]])),u(P.xAxis)){const e=P.xAxis.min,s=P.xAxis.max,a=(s-e)/(t.length-1),n=[];for(let t=e;t<=s;t+=a)n.push(`${t}`);i=n.map((i,e)=>[i,t[e]])}return i}function U(t){return E[0===t?0:t%E.length]}function j(t,i){const e=H(i);P.plots.push({type:"line",strokeFill:U(R),strokeWidth:2,data:e}),R++}function G(t,i){const e=H(i);P.plots.push({type:"bar",fill:U(R),data:e}),R++}function Q(){if(0===P.plots.length)throw Error("No Plot to render, please provide a plot with some data");return P.title=(0,h.ab)(),T.build(D,P,L,k)}function Z(){return L}function q(){return D}function J(){return P}(0,h.K2)(I,"getChartDefaultThemeConfig"),(0,h.K2)($,"getChartDefaultConfig"),(0,h.K2)(M,"getChartDefaultData"),(0,h.K2)(z,"textSanitizer"),(0,h.K2)(B,"setTmpSVGG"),(0,h.K2)(W,"setOrientation"),(0,h.K2)(O,"setXAxisTitle"),(0,h.K2)(F,"setXAxisRangeData"),(0,h.K2)(N,"setXAxisBand"),(0,h.K2)(X,"setYAxisTitle"),(0,h.K2)(V,"setYAxisRangeData"),(0,h.K2)(Y,"setYAxisRangeFromPlotData"),(0,h.K2)(H,"transformDataWithoutCategory"),(0,h.K2)(U,"getPlotColorFromPalette"),(0,h.K2)(j,"setLineData"),(0,h.K2)(G,"setBarData"),(0,h.K2)(Q,"getDrawableElem"),(0,h.K2)(Z,"getChartThemeConfig"),(0,h.K2)(q,"getChartConfig"),(0,h.K2)(J,"getXYChartData");var tt={parser:l,db:{getDrawableElem:Q,clear:(0,h.K2)(function(){(0,h.IU)(),R=0,D=$(),P={yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]},L=I(),E=L.plotColorPalette.split(",").map(t=>t.trim()),v=!1,K=!1},"clear"),setAccTitle:h.SV,getAccTitle:h.iN,setDiagramTitle:h.ke,getDiagramTitle:h.ab,getAccDescription:h.m7,setAccDescription:h.EI,setOrientation:W,setXAxisTitle:O,setXAxisRangeData:F,setXAxisBand:N,setYAxisTitle:X,setYAxisRangeData:V,setLineData:j,setBarData:G,setTmpSVGG:B,getChartThemeConfig:Z,getChartConfig:q,getXYChartData:J},renderer:{draw:(0,h.K2)((t,i,e,s)=>{const a=s.db,o=a.getChartThemeConfig(),r=a.getChartConfig(),l=a.getXYChartData().plots[0].data.map(t=>t[1]);function c(t){return"top"===t?"text-before-edge":"middle"}function g(t){return"left"===t?"start":"right"===t?"end":"middle"}function u(t){return`translate(${t.x}, ${t.y}) rotate(${t.rotation||0})`}(0,h.K2)(c,"getDominantBaseLine"),(0,h.K2)(g,"getTextAnchor"),(0,h.K2)(u,"getTextTransformation"),h.Rm.debug("Rendering xychart chart\n"+t);const x=(0,n.D)(i),d=x.append("g").attr("class","main"),p=d.append("rect").attr("width",r.width).attr("height",r.height).attr("class","background");(0,h.a$)(x,r.height,r.width,!0),x.attr("viewBox",`0 0 ${r.width} ${r.height}`),p.attr("fill",o.backgroundColor),a.setTmpSVGG(x.append("g").attr("class","mermaid-tmp-group"));const f=a.getDrawableElem(),y={};function m(t){let i=d,e="";for(const[s]of t.entries()){let a=d;s>0&&y[e]&&(a=y[e]),e+=t[s],i=y[e],i||(i=y[e]=a.append("g").attr("class",t[s]))}return i}(0,h.K2)(m,"getGroup");for(const n of f){if(0===n.data.length)continue;const t=m(n.groupTexts);switch(n.type){case"rect":if(t.selectAll("rect").data(n.data).enter().append("rect").attr("x",t=>t.x).attr("y",t=>t.y).attr("width",t=>t.width).attr("height",t=>t.height).attr("fill",t=>t.fill).attr("stroke",t=>t.strokeFill).attr("stroke-width",t=>t.strokeWidth),r.showDataLabel)if("horizontal"===r.chartOrientation){let i=function(t,i){const{data:s,label:a}=t;return i*a.length*e<=s.width-10};(0,h.K2)(i,"fitsHorizontally");const e=.7,s=n.data.map((t,i)=>({data:t,label:l[i].toString()})).filter(t=>t.data.width>0&&t.data.height>0),a=s.map(t=>{const{data:e}=t;let s=.7*e.height;for(;!i(t,s)&&s>0;)s-=1;return s}),o=Math.floor(Math.min(...a));t.selectAll("text").data(s).enter().append("text").attr("x",t=>t.data.x+t.data.width-10).attr("y",t=>t.data.y+t.data.height/2).attr("text-anchor","end").attr("dominant-baseline","middle").attr("fill","black").attr("font-size",`${o}px`).text(t=>t.label)}else{let i=function(t,i,e){const{data:s,label:a}=t,n=i*a.length*.7,h=s.x+s.width/2,o=h+n/2,r=h-n/2>=s.x&&o<=s.x+s.width,l=s.y+e+i<=s.y+s.height;return r&&l};(0,h.K2)(i,"fitsInBar");const e=10,s=n.data.map((t,i)=>({data:t,label:l[i].toString()})).filter(t=>t.data.width>0&&t.data.height>0),a=s.map(t=>{const{data:s,label:a}=t;let n=s.width/(.7*a.length);for(;!i(t,n,e)&&n>0;)n-=1;return n}),o=Math.floor(Math.min(...a));t.selectAll("text").data(s).enter().append("text").attr("x",t=>t.data.x+t.data.width/2).attr("y",t=>t.data.y+e).attr("text-anchor","middle").attr("dominant-baseline","hanging").attr("fill","black").attr("font-size",`${o}px`).text(t=>t.label)}break;case"text":t.selectAll("text").data(n.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",t=>t.fill).attr("font-size",t=>t.fontSize).attr("dominant-baseline",t=>c(t.verticalPos)).attr("text-anchor",t=>g(t.horizontalPos)).attr("transform",t=>u(t)).text(t=>t.text);break;case"path":t.selectAll("path").data(n.data).enter().append("path").attr("d",t=>t.path).attr("fill",t=>t.fill?t.fill:"none").attr("stroke",t=>t.strokeFill).attr("stroke-width",t=>t.strokeWidth)}}},"draw")}}}}]); \ No newline at end of file diff --git a/assets/js/29a2444a.ca3c70d1.js b/assets/js/29a2444a.ca3c70d1.js new file mode 100644 index 0000000000..ac7f92da82 --- /dev/null +++ b/assets/js/29a2444a.ca3c70d1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4040],{61091:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.12.2/rules/compiler/custom_kapt_matchers.md","sourceDirName":"rules/compiler","slug":"/rules/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/compiler/custom_kapt_matchers.md","tags":[],"version":"0.12.2","frontMatter":{"id":"custom_kapt_matchers","slug":"/rules/custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.2/rules/sort_dependencies"}}');var n=s(23420),r=s(65404);const c={id:"custom_kapt_matchers",slug:"/rules/custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},a=void 0,i={},l=[];function u(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,n.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},65404:(e,t,s)=>{s.d(t,{R:()=>c,x:()=>a});var o=s(36672);const n={},r=o.createContext(n);function c(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/2f675600.bb74ddd9.js b/assets/js/2f675600.bb74ddd9.js new file mode 100644 index 0000000000..5f9ab7be5f --- /dev/null +++ b/assets/js/2f675600.bb74ddd9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7079],{65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const o={},r=n.createContext(o);function i(e){const s=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:s},e.children)}},99112:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.12.0/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_plugins","permalink":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/sorting/sort_plugins.md","tags":[],"version":"0.12.0","frontMatter":{"id":"sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.0/rules/android/disable_resources"}}');var o=t(23420),r=t(65404);const i={id:"sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d()}}}]); \ No newline at end of file diff --git a/assets/js/30f6db9d.c745195e.js b/assets/js/30f6db9d.c745195e.js new file mode 100644 index 0000000000..d3b32858dc --- /dev/null +++ b/assets/js/30f6db9d.c745195e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3911],{32305:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.11.0/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.11.0/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/configuration.mdx","tags":[],"version":"0.11.0","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.11.0/"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.0/rules/unused"}}');var s=t(23420),r=t(65404);const i={id:"configuration",sidebar_label:"Configuration"},a=void 0,c={},u=[];function d(e){const n={code:"code",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:'plugins {\n id("com.rickbusarow.module-check") version "0.11.0"\n}\n\nmoduleCheck {\n\n autoCorrect = true // default is true\n deleteUnused = true // default is false\n\n checks {\n overshotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedImplementation = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n ignoreAll.set(setOf(":app"))\n\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(36672);const s={},r=o.createContext(s);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3139ff2f.c26a0908.js b/assets/js/3139ff2f.c26a0908.js new file mode 100644 index 0000000000..c021e33c19 --- /dev/null +++ b/assets/js/3139ff2f.c26a0908.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8355],{65404:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var o=s(36672);const t={},i=o.createContext(t);function r(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(i.Provider,{value:n},e.children)}},82295:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.11.2/rules/kapt/unused_kapt_processor.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/kapt/unused_kapt_processor.md","tags":[],"version":"0.11.2","frontMatter":{"id":"unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin"}}');var t=s(23420),i=s(65404);const r={id:"unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,d={},c=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/324fc7ff.4b3af6c2.js b/assets/js/324fc7ff.4b3af6c2.js new file mode 100644 index 0000000000..f28cf785f8 --- /dev/null +++ b/assets/js/324fc7ff.4b3af6c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8020],{7357:(e,n,r)=>{r.d(n,{A:()=>s});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var l=r(23420);function s({children:e,hidden:n,className:r}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},13335:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"Dependencies","source":"@site/versioned_docs/version-0.12.5/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/quickstart.mdx","tags":[],"version":"0.12.5","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/configuration"}}');var a=r(23420),l=r(65404),s=r(83796),o=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},c=void 0,u={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsxs)(o.A,{value:"Kotlin",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven("https://oss.sonatype.org/content/repositories/snapshots/")\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.13.0-SNAPSHOT"\n}\n'})})]}),(0,a.jsxs)(o.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven {\n url "https://oss.sonatype.org/content/repositories/snapshots"\n }\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.13.0-SNAPSHOT'\n}\n"})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,a.jsx)(n.p,{children:"all checks"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,a.jsx)(n.p,{children:"all checks with auto-correct"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"check sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,a.jsx)(n.p,{children:"apply sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"report depths of each module"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckDepths\n"})}),"\n",(0,a.jsx)(n.p,{children:"generate (module-only) dependency graphs"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckGraphs\n"})}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsxs)(o.A,{value:"Kotlin",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var t=r(36672);const a={},l=t.createContext(a);function s(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(l.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(36672),a=r(13526),l=r(58797),s=r(85291),o=r(52245),i=r(32342),c=r(45223),u=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the component should be , and every should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in . Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,l=h(e),[s,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the component requires at least one children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l})),[c,d]=g({queryString:r,groupId:a}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=c??m;return p({value:e,tabValues:l})?e:null})();(0,o.A)(()=>{b&&i(b)},[b]);return{selectedValue:s,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)},[d,f,l]),tabValues:l}}var f=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:t,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,l.a_)(),c=e=>{const n=e.currentTarget,a=o.indexOf(n),l=s[a].value;l!==r&&(i(n),t(l))},u=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:u,onClick:c,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/325152a5.7841a58f.js b/assets/js/325152a5.7841a58f.js new file mode 100644 index 0000000000..c5c1bc9571 --- /dev/null +++ b/assets/js/325152a5.7841a58f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6313],{46461:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.12.1/rules/android/disable_android_resources.md","sourceDirName":"rules/android","slug":"/rules/disable_android_resources","permalink":"/ModuleCheck/docs/0.12.1/rules/disable_android_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/android/disable_android_resources.md","tags":[],"version":"0.12.1","frontMatter":{"id":"disable_android_resources","slug":"/rules/disable_android_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.1/rules/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.1/rules/disable_view_binding"}}');var o=r(23420),d=r(65404);const i={id:"disable_android_resources",slug:"/rules/disable_android_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,a={},c=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3287.4167c976.js b/assets/js/3287.4167c976.js new file mode 100644 index 0000000000..73a7e72f5e --- /dev/null +++ b/assets/js/3287.4167c976.js @@ -0,0 +1,2 @@ +/*! For license information please see 3287.4167c976.js.LICENSE.txt */ +(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3287],{267:(t,e,r)=>{"use strict";r.d(e,{O:()=>n});var n=(0,r(97485).K2)(({flowchart:t})=>{const e=t?.subGraphTitleMargin?.top??0,r=t?.subGraphTitleMargin?.bottom??0;return{subGraphTitleTopMargin:e,subGraphTitleBottomMargin:r,subGraphTitleTotalMargin:e+r}},"getSubGraphTitleMargins")},290:(t,e,r)=>{"use strict";r.d(e,{R:()=>s});var n=r(97485),i={aggregation:18,extension:18,composition:18,dependency:6,lollipop:13.5,arrow_point:4};function a(t,e){if(void 0===t||void 0===e)return{angle:0,deltaX:0,deltaY:0};t=o(t),e=o(e);const[r,n]=[t.x,t.y],[i,a]=[e.x,e.y],s=i-r,l=a-n;return{angle:Math.atan(l/s),deltaX:s,deltaY:l}}(0,n.K2)(a,"calculateDeltaAndAngle");var o=(0,n.K2)(t=>Array.isArray(t)?{x:t[0],y:t[1]}:t,"pointTransformer"),s=(0,n.K2)(t=>({x:(0,n.K2)(function(e,r,n){let s=0;const l=o(n[0]).x=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(i,t.arrowTypeEnd)){const{angle:e,deltaX:r}=a(n[n.length-1],n[n.length-2]);s=i[t.arrowTypeEnd]*Math.cos(e)*(r>=0?1:-1)}const c=Math.abs(o(e).x-o(n[n.length-1]).x),h=Math.abs(o(e).y-o(n[n.length-1]).y),u=Math.abs(o(e).x-o(n[0]).x),d=Math.abs(o(e).y-o(n[0]).y),p=i[t.arrowTypeStart],f=i[t.arrowTypeEnd];if(c0&&h0&&d=0?1:-1)}else if(r===n.length-1&&Object.hasOwn(i,t.arrowTypeEnd)){const{angle:e,deltaY:r}=a(n[n.length-1],n[n.length-2]);s=i[t.arrowTypeEnd]*Math.abs(Math.sin(e))*(r>=0?1:-1)}const c=Math.abs(o(e).y-o(n[n.length-1]).y),h=Math.abs(o(e).x-o(n[n.length-1]).x),u=Math.abs(o(e).y-o(n[0]).y),d=Math.abs(o(e).x-o(n[0]).x),p=i[t.arrowTypeStart],f=i[t.arrowTypeEnd];if(c0&&h0&&d{"use strict";function n(t,e){let r;if(void 0===e)for(const n of t)null!=n&&(r=n)&&(r=n);else{let n=-1;for(let i of t)null!=(i=e(i,++n,t))&&(r=i)&&(r=i)}return r}function i(t,e){let r;if(void 0===e)for(const n of t)null!=n&&(r>n||void 0===r&&n>=n)&&(r=n);else{let n=-1;for(let i of t)null!=(i=e(i,++n,t))&&(r>i||void 0===r&&i>=i)&&(r=i)}return r}function a(t){return t}r.d(e,{JLW:()=>us,l78:()=>x,tlR:()=>y,qrM:()=>vs,Yu4:()=>As,IA3:()=>Ms,Wi0:()=>Ls,PGM:()=>Fs,OEq:()=>Es,y8u:()=>Os,olC:()=>Is,IrU:()=>zs,oDi:()=>qs,Q7f:()=>Hs,cVp:()=>Ys,lUB:()=>fs,Lx9:()=>Xs,nVG:()=>nl,uxU:()=>il,Xf2:()=>sl,GZz:()=>cl,UPb:()=>ul,dyv:()=>hl,GPZ:()=>Yr,Sk5:()=>Jr,bEH:()=>En,n8j:()=>ys,T9B:()=>n,jkA:()=>i,rLf:()=>ks,WH:()=>Kn,m4Y:()=>bi,UMr:()=>Pn,w7C:()=>Oo,zt:()=>Ro,Ltv:()=>Io,UAC:()=>Oi,DCK:()=>fa,TUC:()=>Hi,Agd:()=>Di,t6C:()=>Li,wXd:()=>$i,ABi:()=>Pi,Ui6:()=>ea,rGn:()=>Ui,ucG:()=>Fi,YPH:()=>zi,Mol:()=>Wi,PGu:()=>Ki,GuW:()=>qi,hkb:()=>pn});var o=1,s=2,l=3,c=4,h=1e-6;function u(t){return"translate("+t+",0)"}function d(t){return"translate(0,"+t+")"}function p(t){return e=>+t(e)}function f(t,e){return e=Math.max(0,t.bandwidth()-2*e)/2,t.round()&&(e=Math.round(e)),r=>+t(r)+e}function g(){return!this.__axis}function m(t,e){var r=[],n=null,i=null,m=6,y=6,x=3,b="undefined"!=typeof window&&window.devicePixelRatio>1?0:.5,k=t===o||t===c?-1:1,C=t===c||t===s?"x":"y",w=t===o||t===l?u:d;function _(u){var d=null==n?e.ticks?e.ticks.apply(e,r):e.domain():n,_=null==i?e.tickFormat?e.tickFormat.apply(e,r):a:i,v=Math.max(m,0)+x,S=e.range(),A=+S[0]+b,T=+S[S.length-1]+b,M=(e.bandwidth?f:p)(e.copy(),b),B=u.selection?u.selection():u,L=B.selectAll(".domain").data([null]),F=B.selectAll(".tick").data(d,e).order(),$=F.exit(),E=F.enter().append("g").attr("class","tick"),D=F.select("line"),N=F.select("text");L=L.merge(L.enter().insert("path",".tick").attr("class","domain").attr("stroke","currentColor")),F=F.merge(E),D=D.merge(E.append("line").attr("stroke","currentColor").attr(C+"2",k*m)),N=N.merge(E.append("text").attr("fill","currentColor").attr(C,k*v).attr("dy",t===o?"0em":t===l?"0.71em":"0.32em")),u!==B&&(L=L.transition(u),F=F.transition(u),D=D.transition(u),N=N.transition(u),$=$.transition(u).attr("opacity",h).attr("transform",function(t){return isFinite(t=M(t))?w(t+b):this.getAttribute("transform")}),E.attr("opacity",h).attr("transform",function(t){var e=this.parentNode.__axis;return w((e&&isFinite(e=e(t))?e:M(t))+b)})),$.remove(),L.attr("d",t===c||t===s?y?"M"+k*y+","+A+"H"+b+"V"+T+"H"+k*y:"M"+b+","+A+"V"+T:y?"M"+A+","+k*y+"V"+b+"H"+T+"V"+k*y:"M"+A+","+b+"H"+T),F.attr("opacity",1).attr("transform",function(t){return w(M(t)+b)}),D.attr(C+"2",k*m),N.attr(C,k*v).text(_),B.filter(g).attr("fill","none").attr("font-size",10).attr("font-family","sans-serif").attr("text-anchor",t===s?"start":t===c?"end":"middle"),B.each(function(){this.__axis=M})}return _.scale=function(t){return arguments.length?(e=t,_):e},_.ticks=function(){return r=Array.from(arguments),_},_.tickArguments=function(t){return arguments.length?(r=null==t?[]:Array.from(t),_):r.slice()},_.tickValues=function(t){return arguments.length?(n=null==t?null:Array.from(t),_):n&&n.slice()},_.tickFormat=function(t){return arguments.length?(i=t,_):i},_.tickSize=function(t){return arguments.length?(m=y=+t,_):m},_.tickSizeInner=function(t){return arguments.length?(m=+t,_):m},_.tickSizeOuter=function(t){return arguments.length?(y=+t,_):y},_.tickPadding=function(t){return arguments.length?(x=+t,_):x},_.offset=function(t){return arguments.length?(b=+t,_):b},_}function y(t){return m(o,t)}function x(t){return m(l,t)}function b(){}function k(t){return null==t?b:function(){return this.querySelector(t)}}function C(){return[]}function w(t){return null==t?C:function(){return this.querySelectorAll(t)}}function _(t){return function(){return null==(e=t.apply(this,arguments))?[]:Array.isArray(e)?e:Array.from(e);var e}}function v(t){return function(){return this.matches(t)}}function S(t){return function(e){return e.matches(t)}}var A=Array.prototype.find;function T(){return this.firstElementChild}var M=Array.prototype.filter;function B(){return Array.from(this.children)}function L(t){return new Array(t.length)}function F(t,e){this.ownerDocument=t.ownerDocument,this.namespaceURI=t.namespaceURI,this._next=null,this._parent=t,this.__data__=e}function $(t,e,r,n,i,a){for(var o,s=0,l=e.length,c=a.length;se?1:t>=e?0:NaN}F.prototype={constructor:F,appendChild:function(t){return this._parent.insertBefore(t,this._next)},insertBefore:function(t,e){return this._parent.insertBefore(t,e)},querySelector:function(t){return this._parent.querySelector(t)},querySelectorAll:function(t){return this._parent.querySelectorAll(t)}};var R="http://www.w3.org/1999/xhtml";const I={svg:"http://www.w3.org/2000/svg",xhtml:R,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function j(t){var e=t+="",r=e.indexOf(":");return r>=0&&"xmlns"!==(e=t.slice(0,r))&&(t=t.slice(r+1)),I.hasOwnProperty(e)?{space:I[e],local:t}:t}function z(t){return function(){this.removeAttribute(t)}}function P(t){return function(){this.removeAttributeNS(t.space,t.local)}}function K(t,e){return function(){this.setAttribute(t,e)}}function q(t,e){return function(){this.setAttributeNS(t.space,t.local,e)}}function W(t,e){return function(){var r=e.apply(this,arguments);null==r?this.removeAttribute(t):this.setAttribute(t,r)}}function H(t,e){return function(){var r=e.apply(this,arguments);null==r?this.removeAttributeNS(t.space,t.local):this.setAttributeNS(t.space,t.local,r)}}function U(t){return t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView}function Y(t){return function(){this.style.removeProperty(t)}}function G(t,e,r){return function(){this.style.setProperty(t,e,r)}}function X(t,e,r){return function(){var n=e.apply(this,arguments);null==n?this.style.removeProperty(t):this.style.setProperty(t,n,r)}}function V(t,e){return t.style.getPropertyValue(e)||U(t).getComputedStyle(t,null).getPropertyValue(e)}function Z(t){return function(){delete this[t]}}function Q(t,e){return function(){this[t]=e}}function J(t,e){return function(){var r=e.apply(this,arguments);null==r?delete this[t]:this[t]=r}}function tt(t){return t.trim().split(/^|\s+/)}function et(t){return t.classList||new rt(t)}function rt(t){this._node=t,this._names=tt(t.getAttribute("class")||"")}function nt(t,e){for(var r=et(t),n=-1,i=e.length;++n=0&&(this._names.splice(e,1),this._node.setAttribute("class",this._names.join(" ")))},contains:function(t){return this._names.indexOf(t)>=0}};var Mt=[null];function Bt(t,e){this._groups=t,this._parents=e}function Lt(){return new Bt([[document.documentElement]],Mt)}Bt.prototype=Lt.prototype={constructor:Bt,select:function(t){"function"!=typeof t&&(t=k(t));for(var e=this._groups,r=e.length,n=new Array(r),i=0;i=C&&(C=k+1);!(b=y[C])&&++C=0;)(n=i[a])&&(o&&4^n.compareDocumentPosition(o)&&o.parentNode.insertBefore(n,o),o=n);return this},sort:function(t){function e(e,r){return e&&r?t(e.__data__,r.__data__):!e-!r}t||(t=O);for(var r=this._groups,n=r.length,i=new Array(n),a=0;a1?this.each((null==e?Y:"function"==typeof e?X:G)(t,e,null==r?"":r)):V(this.node(),t)},property:function(t,e){return arguments.length>1?this.each((null==e?Z:"function"==typeof e?J:Q)(t,e)):this.node()[t]},classed:function(t,e){var r=tt(t+"");if(arguments.length<2){for(var n=et(this.node()),i=-1,a=r.length;++i=0&&(e=t.slice(r+1),t=t.slice(0,r)),{type:t,name:e}})}(t+""),o=a.length;if(!(arguments.length<2)){for(s=e?vt:_t,n=0;n{}};function Et(){for(var t,e=0,r=arguments.length,n={};e=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})),o=-1,s=a.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++o0)for(var r,n,i=new Array(r),a=0;a=0&&e._call.call(void 0,t),e=e._next;--zt}()}finally{zt=0,function(){var t,e,r=It,n=1/0;for(;r;)r._call?(n>r._time&&(n=r._time),t=r,r=r._next):(e=r._next,r._next=null,r=t?t._next=e:It=e);jt=t,te(n)}(),Wt=0}}function Jt(){var t=Ut.now(),e=t-qt;e>1e3&&(Ht-=e,qt=t)}function te(t){zt||(Pt&&(Pt=clearTimeout(Pt)),t-Wt>24?(t<1/0&&(Pt=setTimeout(Qt,t-Ut.now()-Ht)),Kt&&(Kt=clearInterval(Kt))):(Kt||(qt=Ut.now(),Kt=setInterval(Jt,1e3)),zt=1,Yt(Qt)))}function ee(t,e,r){var n=new Vt;return e=null==e?0:+e,n.restart(r=>{n.stop(),t(r+e)},e,r),n}Vt.prototype=Zt.prototype={constructor:Vt,restart:function(t,e,r){if("function"!=typeof t)throw new TypeError("callback is not a function");r=(null==r?Gt():+r)+(null==e?0:+e),this._next||jt===this||(jt?jt._next=this:It=this,jt=this),this._call=t,this._time=r,te()},stop:function(){this._call&&(this._call=null,this._time=1/0,te())}};var re=Rt("start","end","cancel","interrupt"),ne=[];function ie(t,e,r,n,i,a){var o=t.__transition;if(o){if(r in o)return}else t.__transition={};!function(t,e,r){var n,i=t.__transition;function a(t){r.state=1,r.timer.restart(o,r.delay,r.time),r.delay<=t&&o(t-r.delay)}function o(a){var c,h,u,d;if(1!==r.state)return l();for(c in i)if((d=i[c]).name===r.name){if(3===d.state)return ee(o);4===d.state?(d.state=6,d.timer.stop(),d.on.call("interrupt",t,t.__data__,d.index,d.group),delete i[c]):+c0)throw new Error("too late; already scheduled");return r}function oe(t,e){var r=se(t,e);if(r.state>3)throw new Error("too late; already running");return r}function se(t,e){var r=t.__transition;if(!r||!(r=r[e]))throw new Error("transition not found");return r}function le(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}var ce,he=180/Math.PI,ue={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1};function de(t,e,r,n,i,a){var o,s,l;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(l=t*r+e*n)&&(r-=t*l,n-=e*l),(s=Math.sqrt(r*r+n*n))&&(r/=s,n/=s,l/=s),t*n180?e+=360:e-t>180&&(t+=360),a.push({i:r.push(i(r)+"rotate(",null,n)-2,x:le(t,e)})):e&&r.push(i(r)+"rotate("+e+n)}(a.rotate,o.rotate,s,l),function(t,e,r,a){t!==e?a.push({i:r.push(i(r)+"skewX(",null,n)-2,x:le(t,e)}):e&&r.push(i(r)+"skewX("+e+n)}(a.skewX,o.skewX,s,l),function(t,e,r,n,a,o){if(t!==r||e!==n){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:le(t,r)},{i:s-2,x:le(e,n)})}else 1===r&&1===n||a.push(i(a)+"scale("+r+","+n+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,l),a=o=null,function(t){for(var e,r=-1,n=l.length;++r>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):8===r?je(e>>24&255,e>>16&255,e>>8&255,(255&e)/255):4===r?je(e>>12&15|e>>8&240,e>>8&15|e>>4&240,e>>4&15|240&e,((15&e)<<4|15&e)/255):null):(e=Me.exec(t))?new Ke(e[1],e[2],e[3],1):(e=Be.exec(t))?new Ke(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=Le.exec(t))?je(e[1],e[2],e[3],e[4]):(e=Fe.exec(t))?je(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=$e.exec(t))?Ge(e[1],e[2]/100,e[3]/100,1):(e=Ee.exec(t))?Ge(e[1],e[2]/100,e[3]/100,e[4]):De.hasOwnProperty(t)?Ie(De[t]):"transparent"===t?new Ke(NaN,NaN,NaN,0):null}function Ie(t){return new Ke(t>>16&255,t>>8&255,255&t,1)}function je(t,e,r,n){return n<=0&&(t=e=r=NaN),new Ke(t,e,r,n)}function ze(t){return t instanceof Ce||(t=Re(t)),t?new Ke((t=t.rgb()).r,t.g,t.b,t.opacity):new Ke}function Pe(t,e,r,n){return 1===arguments.length?ze(t):new Ke(t,e,r,null==n?1:n)}function Ke(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function qe(){return`#${Ye(this.r)}${Ye(this.g)}${Ye(this.b)}`}function We(){const t=He(this.opacity);return`${1===t?"rgb(":"rgba("}${Ue(this.r)}, ${Ue(this.g)}, ${Ue(this.b)}${1===t?")":`, ${t})`}`}function He(t){return isNaN(t)?1:Math.max(0,Math.min(1,t))}function Ue(t){return Math.max(0,Math.min(255,Math.round(t)||0))}function Ye(t){return((t=Ue(t))<16?"0":"")+t.toString(16)}function Ge(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new Ve(t,e,r,n)}function Xe(t){if(t instanceof Ve)return new Ve(t.h,t.s,t.l,t.opacity);if(t instanceof Ce||(t=Re(t)),!t)return new Ve;if(t instanceof Ve)return t;var e=(t=t.rgb()).r/255,r=t.g/255,n=t.b/255,i=Math.min(e,r,n),a=Math.max(e,r,n),o=NaN,s=a-i,l=(a+i)/2;return s?(o=e===a?(r-n)/s+6*(r0&&l<1?0:o,new Ve(o,s,l,t.opacity)}function Ve(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function Ze(t){return(t=(t||0)%360)<0?t+360:t}function Qe(t){return Math.max(0,Math.min(1,t||0))}function Je(t,e,r){return 255*(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)}function tr(t,e,r,n,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*r+(1+3*t+3*a-3*o)*n+o*i)/6}be(Ce,Re,{copy(t){return Object.assign(new this.constructor,this,t)},displayable(){return this.rgb().displayable()},hex:Ne,formatHex:Ne,formatHex8:function(){return this.rgb().formatHex8()},formatHsl:function(){return Xe(this).formatHsl()},formatRgb:Oe,toString:Oe}),be(Ke,Pe,ke(Ce,{brighter(t){return t=null==t?_e:Math.pow(_e,t),new Ke(this.r*t,this.g*t,this.b*t,this.opacity)},darker(t){return t=null==t?we:Math.pow(we,t),new Ke(this.r*t,this.g*t,this.b*t,this.opacity)},rgb(){return this},clamp(){return new Ke(Ue(this.r),Ue(this.g),Ue(this.b),He(this.opacity))},displayable(){return-.5<=this.r&&this.r<255.5&&-.5<=this.g&&this.g<255.5&&-.5<=this.b&&this.b<255.5&&0<=this.opacity&&this.opacity<=1},hex:qe,formatHex:qe,formatHex8:function(){return`#${Ye(this.r)}${Ye(this.g)}${Ye(this.b)}${Ye(255*(isNaN(this.opacity)?1:this.opacity))}`},formatRgb:We,toString:We})),be(Ve,function(t,e,r,n){return 1===arguments.length?Xe(t):new Ve(t,e,r,null==n?1:n)},ke(Ce,{brighter(t){return t=null==t?_e:Math.pow(_e,t),new Ve(this.h,this.s,this.l*t,this.opacity)},darker(t){return t=null==t?we:Math.pow(we,t),new Ve(this.h,this.s,this.l*t,this.opacity)},rgb(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new Ke(Je(t>=240?t-240:t+120,i,n),Je(t,i,n),Je(t<120?t+240:t-120,i,n),this.opacity)},clamp(){return new Ve(Ze(this.h),Qe(this.s),Qe(this.l),He(this.opacity))},displayable(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1},formatHsl(){const t=He(this.opacity);return`${1===t?"hsl(":"hsla("}${Ze(this.h)}, ${100*Qe(this.s)}%, ${100*Qe(this.l)}%${1===t?")":`, ${t})`}`}}));const er=t=>()=>t;function rr(t,e){return function(r){return t+r*e}}function nr(t){return 1===(t=+t)?ir:function(e,r){return r-e?function(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}(e,r,t):er(isNaN(e)?r:e)}}function ir(t,e){var r=e-t;return r?rr(t,r):er(isNaN(t)?e:t)}const ar=function t(e){var r=nr(e);function n(t,e){var n=r((t=Pe(t)).r,(e=Pe(e)).r),i=r(t.g,e.g),a=r(t.b,e.b),o=ir(t.opacity,e.opacity);return function(e){return t.r=n(e),t.g=i(e),t.b=a(e),t.opacity=o(e),t+""}}return n.gamma=t,n}(1);function or(t){return function(e){var r,n,i=e.length,a=new Array(i),o=new Array(i),s=new Array(i);for(r=0;r=1?(r=1,e-1):Math.floor(r*e),i=t[n],a=t[n+1],o=n>0?t[n-1]:2*i-a,s=na&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:le(r,n)})),a=lr.lastIndex;return a=0&&(t=t.slice(0,e)),!t||"start"===t})}(e)?ae:oe;return function(){var o=a(this,t),s=o.on;s!==n&&(i=(n=s).copy()).on(e,r),o.on=i}}(r,t,e))},attr:function(t,e){var r=j(t),n="transform"===r?ge:hr;return this.attrTween(t,"function"==typeof e?(r.local?mr:gr)(r,n,xe(this,"attr."+t,e)):null==e?(r.local?dr:ur)(r):(r.local?fr:pr)(r,n,e))},attrTween:function(t,e){var r="attr."+t;if(arguments.length<2)return(r=this.tween(r))&&r._value;if(null==e)return this.tween(r,null);if("function"!=typeof e)throw new Error;var n=j(t);return this.tween(r,(n.local?yr:xr)(n,e))},style:function(t,e,r){var n="transform"==(t+="")?fe:hr;return null==e?this.styleTween(t,function(t,e){var r,n,i;return function(){var a=V(this,t),o=(this.style.removeProperty(t),V(this,t));return a===o?null:a===r&&o===n?i:i=e(r=a,n=o)}}(t,n)).on("end.style."+t,vr(t)):"function"==typeof e?this.styleTween(t,function(t,e,r){var n,i,a;return function(){var o=V(this,t),s=r(this),l=s+"";return null==s&&(this.style.removeProperty(t),l=s=V(this,t)),o===l?null:o===n&&l===i?a:(i=l,a=e(n=o,s))}}(t,n,xe(this,"style."+t,e))).each(function(t,e){var r,n,i,a,o="style."+e,s="end."+o;return function(){var l=oe(this,t),c=l.on,h=null==l.value[o]?a||(a=vr(e)):void 0;c===r&&i===h||(n=(r=c).copy()).on(s,i=h),l.on=n}}(this._id,t)):this.styleTween(t,function(t,e,r){var n,i,a=r+"";return function(){var o=V(this,t);return o===a?null:o===n?i:i=e(n=o,r)}}(t,n,e),r).on("end.style."+t,null)},styleTween:function(t,e,r){var n="style."+(t+="");if(arguments.length<2)return(n=this.tween(n))&&n._value;if(null==e)return this.tween(n,null);if("function"!=typeof e)throw new Error;return this.tween(n,function(t,e,r){var n,i;function a(){var a=e.apply(this,arguments);return a!==i&&(n=(i=a)&&function(t,e,r){return function(n){this.style.setProperty(t,e.call(this,n),r)}}(t,a,r)),n}return a._value=e,a}(t,e,null==r?"":r))},text:function(t){return this.tween("text","function"==typeof t?function(t){return function(){var e=t(this);this.textContent=null==e?"":e}}(xe(this,"text",t)):function(t){return function(){this.textContent=t}}(null==t?"":t+""))},textTween:function(t){var e="text";if(arguments.length<1)return(e=this.tween(e))&&e._value;if(null==t)return this.tween(e,null);if("function"!=typeof t)throw new Error;return this.tween(e,function(t){var e,r;function n(){var n=t.apply(this,arguments);return n!==r&&(e=(r=n)&&function(t){return function(e){this.textContent=t.call(this,e)}}(n)),e}return n._value=t,n}(t))},remove:function(){return this.on("end.remove",function(t){return function(){var e=this.parentNode;for(var r in this.__transition)if(+r!==t)return;e&&e.removeChild(this)}}(this._id))},tween:function(t,e){var r=this._id;if(t+="",arguments.length<2){for(var n,i=se(this.node(),r).tween,a=0,o=i.length;a2&&r.state<5,r.state=6,r.timer.stop(),r.on.call(n?"interrupt":"cancel",t,t.__data__,r.index,r.group),delete a[i]):o=!1;o&&delete t.__transition}}(this,t)})},Ft.prototype.transition=function(t){var e,r;t instanceof Ar?(e=t._id,t=t._name):(e=Tr(),(r=Br).time=Gt(),t=null==t?null:t+"");for(var n=this._groups,i=n.length,a=0;a1?n[0]+n.slice(2):n,+t.slice(r+1)]}function Ir(t){return(t=Rr(Math.abs(t)))?t[1]:NaN}var jr,zr=/^(?:(.)?([<>=^]))?([+\-( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?(~)?([a-z%])?$/i;function Pr(t){if(!(e=zr.exec(t)))throw new Error("invalid format: "+t);var e;return new Kr({fill:e[1],align:e[2],sign:e[3],symbol:e[4],zero:e[5],width:e[6],comma:e[7],precision:e[8]&&e[8].slice(1),trim:e[9],type:e[10]})}function Kr(t){this.fill=void 0===t.fill?" ":t.fill+"",this.align=void 0===t.align?">":t.align+"",this.sign=void 0===t.sign?"-":t.sign+"",this.symbol=void 0===t.symbol?"":t.symbol+"",this.zero=!!t.zero,this.width=void 0===t.width?void 0:+t.width,this.comma=!!t.comma,this.precision=void 0===t.precision?void 0:+t.precision,this.trim=!!t.trim,this.type=void 0===t.type?"":t.type+""}function qr(t,e){var r=Rr(t,e);if(!r)return t+"";var n=r[0],i=r[1];return i<0?"0."+new Array(-i).join("0")+n:n.length>i+1?n.slice(0,i+1)+"."+n.slice(i+1):n+new Array(i-n.length+2).join("0")}Pr.prototype=Kr.prototype,Kr.prototype.toString=function(){return this.fill+this.align+this.sign+this.symbol+(this.zero?"0":"")+(void 0===this.width?"":Math.max(1,0|this.width))+(this.comma?",":"")+(void 0===this.precision?"":"."+Math.max(0,0|this.precision))+(this.trim?"~":"")+this.type};const Wr={"%":(t,e)=>(100*t).toFixed(e),b:t=>Math.round(t).toString(2),c:t=>t+"",d:function(t){return Math.abs(t=Math.round(t))>=1e21?t.toLocaleString("en").replace(/,/g,""):t.toString(10)},e:(t,e)=>t.toExponential(e),f:(t,e)=>t.toFixed(e),g:(t,e)=>t.toPrecision(e),o:t=>Math.round(t).toString(8),p:(t,e)=>qr(100*t,e),r:qr,s:function(t,e){var r=Rr(t,e);if(!r)return t+"";var n=r[0],i=r[1],a=i-(jr=3*Math.max(-8,Math.min(8,Math.floor(i/3))))+1,o=n.length;return a===o?n:a>o?n+new Array(a-o+1).join("0"):a>0?n.slice(0,a)+"."+n.slice(a):"0."+new Array(1-a).join("0")+Rr(t,Math.max(0,e+a-1))[0]},X:t=>Math.round(t).toString(16).toUpperCase(),x:t=>Math.round(t).toString(16)};function Hr(t){return t}var Ur,Yr,Gr,Xr=Array.prototype.map,Vr=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"];function Zr(t){var e,r,n=void 0===t.grouping||void 0===t.thousands?Hr:(e=Xr.call(t.grouping,Number),r=t.thousands+"",function(t,n){for(var i=t.length,a=[],o=0,s=e[0],l=0;i>0&&s>0&&(l+s+1>n&&(s=Math.max(1,n-l)),a.push(t.substring(i-=s,i+s)),!((l+=s+1)>n));)s=e[o=(o+1)%e.length];return a.reverse().join(r)}),i=void 0===t.currency?"":t.currency[0]+"",a=void 0===t.currency?"":t.currency[1]+"",o=void 0===t.decimal?".":t.decimal+"",s=void 0===t.numerals?Hr:function(t){return function(e){return e.replace(/[0-9]/g,function(e){return t[+e]})}}(Xr.call(t.numerals,String)),l=void 0===t.percent?"%":t.percent+"",c=void 0===t.minus?"\u2212":t.minus+"",h=void 0===t.nan?"NaN":t.nan+"";function u(t){var e=(t=Pr(t)).fill,r=t.align,u=t.sign,d=t.symbol,p=t.zero,f=t.width,g=t.comma,m=t.precision,y=t.trim,x=t.type;"n"===x?(g=!0,x="g"):Wr[x]||(void 0===m&&(m=12),y=!0,x="g"),(p||"0"===e&&"="===r)&&(p=!0,e="0",r="=");var b="$"===d?i:"#"===d&&/[boxX]/.test(x)?"0"+x.toLowerCase():"",k="$"===d?a:/[%p]/.test(x)?l:"",C=Wr[x],w=/[defgprs%]/.test(x);function _(t){var i,a,l,d=b,_=k;if("c"===x)_=C(t)+_,t="";else{var v=(t=+t)<0||1/t<0;if(t=isNaN(t)?h:C(Math.abs(t),m),y&&(t=function(t){t:for(var e,r=t.length,n=1,i=-1;n0&&(i=0)}return i>0?t.slice(0,i)+t.slice(e+1):t}(t)),v&&0===+t&&"+"!==u&&(v=!1),d=(v?"("===u?u:c:"-"===u||"("===u?"":u)+d,_=("s"===x?Vr[8+jr/3]:"")+_+(v&&"("===u?")":""),w)for(i=-1,a=t.length;++i(l=t.charCodeAt(i))||l>57){_=(46===l?o+t.slice(i+1):t.slice(i))+_,t=t.slice(0,i);break}}g&&!p&&(t=n(t,1/0));var S=d.length+t.length+_.length,A=S>1)+d+t+_+A.slice(S);break;default:t=A+d+t+_}return s(t)}return m=void 0===m?6:/[gprs]/.test(x)?Math.max(1,Math.min(21,m)):Math.max(0,Math.min(20,m)),_.toString=function(){return t+""},_}return{format:u,formatPrefix:function(t,e){var r=u(((t=Pr(t)).type="f",t)),n=3*Math.max(-8,Math.min(8,Math.floor(Ir(e)/3))),i=Math.pow(10,-n),a=Vr[8+n/3];return function(t){return r(i*t)+a}}}}function Qr(t){var e=0,r=t.children,n=r&&r.length;if(n)for(;--n>=0;)e+=r[n].value;else e=1;t.value=e}function Jr(t,e){t instanceof Map?(t=[void 0,t],void 0===e&&(e=en)):void 0===e&&(e=tn);for(var r,n,i,a,o,s=new an(t),l=[s];r=l.pop();)if((i=e(r.data))&&(o=(i=Array.from(i)).length))for(r.children=i,a=o-1;a>=0;--a)l.push(n=i[a]=new an(i[a])),n.parent=r,n.depth=r.depth+1;return s.eachBefore(nn)}function tn(t){return t.children}function en(t){return Array.isArray(t)?t[1]:null}function rn(t){void 0!==t.data.value&&(t.value=t.data.value),t.data=t.data.data}function nn(t){var e=0;do{t.height=e}while((t=t.parent)&&t.height<++e)}function an(t){this.data=t,this.depth=this.height=0,this.parent=null}function on(t){t.x0=Math.round(t.x0),t.y0=Math.round(t.y0),t.x1=Math.round(t.x1),t.y1=Math.round(t.y1)}function sn(t,e,r,n,i){for(var a,o=t.children,s=-1,l=o.length,c=t.value&&(n-e)/t.value;++s=0;--n)a.push(r[n]);return this},find:function(t,e){let r=-1;for(const n of this)if(t.call(e,n,++r,this))return n},sum:function(t){return this.eachAfter(function(e){for(var r=+t(e.data)||0,n=e.children,i=n&&n.length;--i>=0;)r+=n[i].value;e.value=r})},sort:function(t){return this.eachBefore(function(e){e.children&&e.children.sort(t)})},path:function(t){for(var e=this,r=function(t,e){if(t===e)return t;var r=t.ancestors(),n=e.ancestors(),i=null;t=r.pop(),e=n.pop();for(;t===e;)i=t,t=r.pop(),e=n.pop();return i}(e,t),n=[e];e!==r;)e=e.parent,n.push(e);for(var i=n.length;t!==r;)n.splice(i,0,t),t=t.parent;return n},ancestors:function(){for(var t=this,e=[t];t=t.parent;)e.push(t);return e},descendants:function(){return Array.from(this)},leaves:function(){var t=[];return this.eachBefore(function(e){e.children||t.push(e)}),t},links:function(){var t=this,e=[];return t.each(function(r){r!==t&&e.push({source:r.parent,target:r})}),e},copy:function(){return Jr(this).eachBefore(rn)},[Symbol.iterator]:function*(){var t,e,r,n,i=this,a=[i];do{for(t=a.reverse(),a=[];i=t.pop();)if(yield i,e=i.children)for(r=0,n=e.length;rd&&(d=s),m=h*h*g,(p=Math.max(d/m,m/u))>f){h-=s;break}f=p}y.push(o={value:h,dice:l1?e:1)},r}((1+Math.sqrt(5))/2);function hn(t){if("function"!=typeof t)throw new Error;return t}function un(){return 0}function dn(t){return function(){return t}}function pn(){var t=cn,e=!1,r=1,n=1,i=[0],a=un,o=un,s=un,l=un,c=un;function h(t){return t.x0=t.y0=0,t.x1=r,t.y1=n,t.eachBefore(u),i=[0],e&&t.eachBefore(on),t}function u(e){var r=i[e.depth],n=e.x0+r,h=e.y0+r,u=e.x1-r,d=e.y1-r;uCn?Math.pow(t,1/3):t/kn+xn}function Sn(t){return t>bn?t*t*t:kn*(t-xn)}function An(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function Tn(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function Mn(t){if(t instanceof Ln)return new Ln(t.h,t.c,t.l,t.opacity);if(t instanceof _n||(t=wn(t)),0===t.a&&0===t.b)return new Ln(NaN,0180||r<-180?r-360*Math.round(r/360):r):er(isNaN(t)?e:t)});$n(ir);function Dn(t,e){switch(arguments.length){case 0:break;case 1:this.range(t);break;default:this.range(e).domain(t)}return this}class Nn extends Map{constructor(t,e=jn){if(super(),Object.defineProperties(this,{_intern:{value:new Map},_key:{value:e}}),null!=t)for(const[r,n]of t)this.set(r,n)}get(t){return super.get(On(this,t))}has(t){return super.has(On(this,t))}set(t,e){return super.set(Rn(this,t),e)}delete(t){return super.delete(In(this,t))}}Set;function On({_intern:t,_key:e},r){const n=e(r);return t.has(n)?t.get(n):r}function Rn({_intern:t,_key:e},r){const n=e(r);return t.has(n)?t.get(n):(t.set(n,r),r)}function In({_intern:t,_key:e},r){const n=e(r);return t.has(n)&&(r=t.get(n),t.delete(n)),r}function jn(t){return null!==t&&"object"==typeof t?t.valueOf():t}const zn=Symbol("implicit");function Pn(){var t=new Nn,e=[],r=[],n=zn;function i(i){let a=t.get(i);if(void 0===a){if(n!==zn)return n;t.set(i,a=e.push(i)-1)}return r[a%r.length]}return i.domain=function(r){if(!arguments.length)return e.slice();e=[],t=new Nn;for(const n of r)t.has(n)||t.set(n,e.push(n)-1);return i},i.range=function(t){return arguments.length?(r=Array.from(t),i):r.slice()},i.unknown=function(t){return arguments.length?(n=t,i):n},i.copy=function(){return Pn(e,r).unknown(n)},Dn.apply(i,arguments),i}function Kn(){var t,e,r=Pn().unknown(void 0),n=r.domain,i=r.range,a=0,o=1,s=!1,l=0,c=0,h=.5;function u(){var r=n().length,u=o=qn?10:a>=Wn?5:a>=Hn?2:1;let s,l,c;return i<0?(c=Math.pow(10,-i)/o,s=Math.round(t*c),l=Math.round(e*c),s/ce&&--l,c=-c):(c=Math.pow(10,i)*o,s=Math.round(t/c),l=Math.round(e/c),s*ce&&--l),le?1:t>=e?0:NaN}function Vn(t,e){return null==t||null==e?NaN:et?1:e>=t?0:NaN}function Zn(t){let e,r,n;function i(t,n,i=0,a=t.length){if(i>>1;r(t[e],n)<0?i=e+1:a=e}while(iXn(t(e),r),n=(e,r)=>t(e)-r):(e=t===Xn||t===Vn?t:Qn,r=t,n=t),{left:i,center:function(t,e,r=0,a=t.length){const o=i(t,e,r,a-1);return o>r&&n(t[o-1],e)>-n(t[o],e)?o-1:o},right:function(t,n,i=0,a=t.length){if(i>>1;r(t[e],n)<=0?i=e+1:a=e}while(ie&&(r=t,t=e,e=r),c=function(r){return Math.max(t,Math.min(e,r))}),n=l>2?pi:di,i=a=null,u}function u(e){return null==e||isNaN(e=+e)?r:(i||(i=n(o.map(t),s,l)))(t(c(e)))}return u.invert=function(r){return c(e((a||(a=n(s,o.map(t),le)))(r)))},u.domain=function(t){return arguments.length?(o=Array.from(t,li),h()):o.slice()},u.range=function(t){return arguments.length?(s=Array.from(t),h()):s.slice()},u.rangeRound=function(t){return s=Array.from(t),l=si,h()},u.clamp=function(t){return arguments.length?(c=!!t||hi,h()):c!==hi},u.interpolate=function(t){return arguments.length?(l=t,h()):l},u.unknown=function(t){return arguments.length?(r=t,u):r},function(r,n){return t=r,e=n,h()}}function mi(){return gi()(hi,hi)}function yi(t,e,r,n){var i,a=Gn(t,e,r);switch((n=Pr(null==n?",f":n)).type){case"s":var o=Math.max(Math.abs(t),Math.abs(e));return null!=n.precision||isNaN(i=function(t,e){return Math.max(0,3*Math.max(-8,Math.min(8,Math.floor(Ir(e)/3)))-Ir(Math.abs(t)))}(a,o))||(n.precision=i),Gr(n,o);case"":case"e":case"g":case"p":case"r":null!=n.precision||isNaN(i=function(t,e){return t=Math.abs(t),e=Math.abs(e)-t,Math.max(0,Ir(e)-Ir(t))+1}(a,Math.max(Math.abs(t),Math.abs(e))))||(n.precision=i-("e"===n.type));break;case"f":case"%":null!=n.precision||isNaN(i=function(t){return Math.max(0,-Ir(Math.abs(t)))}(a))||(n.precision=i-2*("%"===n.type))}return Yr(n)}function xi(t){var e=t.domain;return t.ticks=function(t){var r=e();return function(t,e,r){if(!((r=+r)>0))return[];if((t=+t)===(e=+e))return[t];const n=e=i))return[];const s=a-i+1,l=new Array(s);if(n)if(o<0)for(let c=0;c0;){if((i=Yn(l,c,r))===n)return a[o]=l,a[s]=c,e(a);if(i>0)l=Math.floor(l/i)*i,c=Math.ceil(c/i)*i;else{if(!(i<0))break;l=Math.ceil(l*i)/i,c=Math.floor(c*i)/i}n=i}return t},t}function bi(){var t=mi();return t.copy=function(){return fi(t,bi())},Dn.apply(t,arguments),xi(t)}const ki=1e3,Ci=6e4,wi=36e5,_i=864e5,vi=6048e5,Si=2592e6,Ai=31536e6,Ti=new Date,Mi=new Date;function Bi(t,e,r,n){function i(e){return t(e=0===arguments.length?new Date:new Date(+e)),e}return i.floor=e=>(t(e=new Date(+e)),e),i.ceil=r=>(t(r=new Date(r-1)),e(r,1),t(r),r),i.round=t=>{const e=i(t),r=i.ceil(t);return t-e(e(t=new Date(+t),null==r?1:Math.floor(r)),t),i.range=(r,n,a)=>{const o=[];if(r=i.ceil(r),a=null==a?1:Math.floor(a),!(r0))return o;let s;do{o.push(s=new Date(+r)),e(r,a),t(r)}while(sBi(e=>{if(e>=e)for(;t(e),!r(e);)e.setTime(e-1)},(t,n)=>{if(t>=t)if(n<0)for(;++n<=0;)for(;e(t,-1),!r(t););else for(;--n>=0;)for(;e(t,1),!r(t););}),r&&(i.count=(e,n)=>(Ti.setTime(+e),Mi.setTime(+n),t(Ti),t(Mi),Math.floor(r(Ti,Mi))),i.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?i.filter(n?e=>n(e)%t===0:e=>i.count(0,e)%t===0):i:null)),i}const Li=Bi(()=>{},(t,e)=>{t.setTime(+t+e)},(t,e)=>e-t);Li.every=t=>(t=Math.floor(t),isFinite(t)&&t>0?t>1?Bi(e=>{e.setTime(Math.floor(e/t)*t)},(e,r)=>{e.setTime(+e+r*t)},(e,r)=>(r-e)/t):Li:null);Li.range;const Fi=Bi(t=>{t.setTime(t-t.getMilliseconds())},(t,e)=>{t.setTime(+t+e*ki)},(t,e)=>(e-t)/ki,t=>t.getUTCSeconds()),$i=(Fi.range,Bi(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*ki)},(t,e)=>{t.setTime(+t+e*Ci)},(t,e)=>(e-t)/Ci,t=>t.getMinutes())),Ei=($i.range,Bi(t=>{t.setUTCSeconds(0,0)},(t,e)=>{t.setTime(+t+e*Ci)},(t,e)=>(e-t)/Ci,t=>t.getUTCMinutes())),Di=(Ei.range,Bi(t=>{t.setTime(t-t.getMilliseconds()-t.getSeconds()*ki-t.getMinutes()*Ci)},(t,e)=>{t.setTime(+t+e*wi)},(t,e)=>(e-t)/wi,t=>t.getHours())),Ni=(Di.range,Bi(t=>{t.setUTCMinutes(0,0,0)},(t,e)=>{t.setTime(+t+e*wi)},(t,e)=>(e-t)/wi,t=>t.getUTCHours())),Oi=(Ni.range,Bi(t=>t.setHours(0,0,0,0),(t,e)=>t.setDate(t.getDate()+e),(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*Ci)/_i,t=>t.getDate()-1)),Ri=(Oi.range,Bi(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/_i,t=>t.getUTCDate()-1)),Ii=(Ri.range,Bi(t=>{t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+e)},(t,e)=>(e-t)/_i,t=>Math.floor(t/_i)));Ii.range;function ji(t){return Bi(e=>{e.setDate(e.getDate()-(e.getDay()+7-t)%7),e.setHours(0,0,0,0)},(t,e)=>{t.setDate(t.getDate()+7*e)},(t,e)=>(e-t-(e.getTimezoneOffset()-t.getTimezoneOffset())*Ci)/vi)}const zi=ji(0),Pi=ji(1),Ki=ji(2),qi=ji(3),Wi=ji(4),Hi=ji(5),Ui=ji(6);zi.range,Pi.range,Ki.range,qi.range,Wi.range,Hi.range,Ui.range;function Yi(t){return Bi(e=>{e.setUTCDate(e.getUTCDate()-(e.getUTCDay()+7-t)%7),e.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCDate(t.getUTCDate()+7*e)},(t,e)=>(e-t)/vi)}const Gi=Yi(0),Xi=Yi(1),Vi=Yi(2),Zi=Yi(3),Qi=Yi(4),Ji=Yi(5),ta=Yi(6),ea=(Gi.range,Xi.range,Vi.range,Zi.range,Qi.range,Ji.range,ta.range,Bi(t=>{t.setDate(1),t.setHours(0,0,0,0)},(t,e)=>{t.setMonth(t.getMonth()+e)},(t,e)=>e.getMonth()-t.getMonth()+12*(e.getFullYear()-t.getFullYear()),t=>t.getMonth())),ra=(ea.range,Bi(t=>{t.setUTCDate(1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCMonth(t.getUTCMonth()+e)},(t,e)=>e.getUTCMonth()-t.getUTCMonth()+12*(e.getUTCFullYear()-t.getUTCFullYear()),t=>t.getUTCMonth())),na=(ra.range,Bi(t=>{t.setMonth(0,1),t.setHours(0,0,0,0)},(t,e)=>{t.setFullYear(t.getFullYear()+e)},(t,e)=>e.getFullYear()-t.getFullYear(),t=>t.getFullYear()));na.every=t=>isFinite(t=Math.floor(t))&&t>0?Bi(e=>{e.setFullYear(Math.floor(e.getFullYear()/t)*t),e.setMonth(0,1),e.setHours(0,0,0,0)},(e,r)=>{e.setFullYear(e.getFullYear()+r*t)}):null;na.range;const ia=Bi(t=>{t.setUTCMonth(0,1),t.setUTCHours(0,0,0,0)},(t,e)=>{t.setUTCFullYear(t.getUTCFullYear()+e)},(t,e)=>e.getUTCFullYear()-t.getUTCFullYear(),t=>t.getUTCFullYear());ia.every=t=>isFinite(t=Math.floor(t))&&t>0?Bi(e=>{e.setUTCFullYear(Math.floor(e.getUTCFullYear()/t)*t),e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0)},(e,r)=>{e.setUTCFullYear(e.getUTCFullYear()+r*t)}):null;ia.range;function aa(t,e,r,n,i,a){const o=[[Fi,1,ki],[Fi,5,5e3],[Fi,15,15e3],[Fi,30,3e4],[a,1,Ci],[a,5,3e5],[a,15,9e5],[a,30,18e5],[i,1,wi],[i,3,108e5],[i,6,216e5],[i,12,432e5],[n,1,_i],[n,2,1728e5],[r,1,vi],[e,1,Si],[e,3,7776e6],[t,1,Ai]];function s(e,r,n){const i=Math.abs(r-e)/n,a=Zn(([,,t])=>t).right(o,i);if(a===o.length)return t.every(Gn(e/Ai,r/Ai,n));if(0===a)return Li.every(Math.max(Gn(e,r,n),1));const[s,l]=o[i/o[a-1][2][t.toLowerCase(),e]))}function _a(t,e,r){var n=ma.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function va(t,e,r){var n=ma.exec(e.slice(r,r+1));return n?(t.u=+n[0],r+n[0].length):-1}function Sa(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.U=+n[0],r+n[0].length):-1}function Aa(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.V=+n[0],r+n[0].length):-1}function Ta(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.W=+n[0],r+n[0].length):-1}function Ma(t,e,r){var n=ma.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function Ba(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.y=+n[0]+(+n[0]>68?1900:2e3),r+n[0].length):-1}function La(t,e,r){var n=/^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(e.slice(r,r+6));return n?(t.Z=n[1]?0:-(n[2]+(n[3]||"00")),r+n[0].length):-1}function Fa(t,e,r){var n=ma.exec(e.slice(r,r+1));return n?(t.q=3*n[0]-3,r+n[0].length):-1}function $a(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function Ea(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function Da(t,e,r){var n=ma.exec(e.slice(r,r+3));return n?(t.m=0,t.d=+n[0],r+n[0].length):-1}function Na(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function Oa(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function Ra(t,e,r){var n=ma.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function Ia(t,e,r){var n=ma.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function ja(t,e,r){var n=ma.exec(e.slice(r,r+6));return n?(t.L=Math.floor(n[0]/1e3),r+n[0].length):-1}function za(t,e,r){var n=ya.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function Pa(t,e,r){var n=ma.exec(e.slice(r));return n?(t.Q=+n[0],r+n[0].length):-1}function Ka(t,e,r){var n=ma.exec(e.slice(r));return n?(t.s=+n[0],r+n[0].length):-1}function qa(t,e){return ba(t.getDate(),e,2)}function Wa(t,e){return ba(t.getHours(),e,2)}function Ha(t,e){return ba(t.getHours()%12||12,e,2)}function Ua(t,e){return ba(1+Oi.count(na(t),t),e,3)}function Ya(t,e){return ba(t.getMilliseconds(),e,3)}function Ga(t,e){return Ya(t,e)+"000"}function Xa(t,e){return ba(t.getMonth()+1,e,2)}function Va(t,e){return ba(t.getMinutes(),e,2)}function Za(t,e){return ba(t.getSeconds(),e,2)}function Qa(t){var e=t.getDay();return 0===e?7:e}function Ja(t,e){return ba(zi.count(na(t)-1,t),e,2)}function to(t){var e=t.getDay();return e>=4||0===e?Wi(t):Wi.ceil(t)}function eo(t,e){return t=to(t),ba(Wi.count(na(t),t)+(4===na(t).getDay()),e,2)}function ro(t){return t.getDay()}function no(t,e){return ba(Pi.count(na(t)-1,t),e,2)}function io(t,e){return ba(t.getFullYear()%100,e,2)}function ao(t,e){return ba((t=to(t)).getFullYear()%100,e,2)}function oo(t,e){return ba(t.getFullYear()%1e4,e,4)}function so(t,e){var r=t.getDay();return ba((t=r>=4||0===r?Wi(t):Wi.ceil(t)).getFullYear()%1e4,e,4)}function lo(t){var e=t.getTimezoneOffset();return(e>0?"-":(e*=-1,"+"))+ba(e/60|0,"0",2)+ba(e%60,"0",2)}function co(t,e){return ba(t.getUTCDate(),e,2)}function ho(t,e){return ba(t.getUTCHours(),e,2)}function uo(t,e){return ba(t.getUTCHours()%12||12,e,2)}function po(t,e){return ba(1+Ri.count(ia(t),t),e,3)}function fo(t,e){return ba(t.getUTCMilliseconds(),e,3)}function go(t,e){return fo(t,e)+"000"}function mo(t,e){return ba(t.getUTCMonth()+1,e,2)}function yo(t,e){return ba(t.getUTCMinutes(),e,2)}function xo(t,e){return ba(t.getUTCSeconds(),e,2)}function bo(t){var e=t.getUTCDay();return 0===e?7:e}function ko(t,e){return ba(Gi.count(ia(t)-1,t),e,2)}function Co(t){var e=t.getUTCDay();return e>=4||0===e?Qi(t):Qi.ceil(t)}function wo(t,e){return t=Co(t),ba(Qi.count(ia(t),t)+(4===ia(t).getUTCDay()),e,2)}function _o(t){return t.getUTCDay()}function vo(t,e){return ba(Xi.count(ia(t)-1,t),e,2)}function So(t,e){return ba(t.getUTCFullYear()%100,e,2)}function Ao(t,e){return ba((t=Co(t)).getUTCFullYear()%100,e,2)}function To(t,e){return ba(t.getUTCFullYear()%1e4,e,4)}function Mo(t,e){var r=t.getUTCDay();return ba((t=r>=4||0===r?Qi(t):Qi.ceil(t)).getUTCFullYear()%1e4,e,4)}function Bo(){return"+0000"}function Lo(){return"%"}function Fo(t){return+t}function $o(t){return Math.floor(+t/1e3)}function Eo(t){return new Date(t)}function Do(t){return t instanceof Date?+t:+new Date(+t)}function No(t,e,r,n,i,a,o,s,l,c){var h=mi(),u=h.invert,d=h.domain,p=c(".%L"),f=c(":%S"),g=c("%I:%M"),m=c("%I %p"),y=c("%a %d"),x=c("%b %d"),b=c("%B"),k=c("%Y");function C(t){return(l(t)=12)]},q:function(t){return 1+~~(t.getMonth()/3)},Q:Fo,s:$o,S:Za,u:Qa,U:Ja,V:eo,w:ro,W:no,x:null,X:null,y:io,Y:oo,Z:lo,"%":Lo},k={a:function(t){return o[t.getUTCDay()]},A:function(t){return a[t.getUTCDay()]},b:function(t){return l[t.getUTCMonth()]},B:function(t){return s[t.getUTCMonth()]},c:null,d:co,e:co,f:go,g:Ao,G:Mo,H:ho,I:uo,j:po,L:fo,m:mo,M:yo,p:function(t){return i[+(t.getUTCHours()>=12)]},q:function(t){return 1+~~(t.getUTCMonth()/3)},Q:Fo,s:$o,S:xo,u:bo,U:ko,V:wo,w:_o,W:vo,x:null,X:null,y:So,Y:To,Z:Bo,"%":Lo},C={a:function(t,e,r){var n=p.exec(e.slice(r));return n?(t.w=f.get(n[0].toLowerCase()),r+n[0].length):-1},A:function(t,e,r){var n=u.exec(e.slice(r));return n?(t.w=d.get(n[0].toLowerCase()),r+n[0].length):-1},b:function(t,e,r){var n=y.exec(e.slice(r));return n?(t.m=x.get(n[0].toLowerCase()),r+n[0].length):-1},B:function(t,e,r){var n=g.exec(e.slice(r));return n?(t.m=m.get(n[0].toLowerCase()),r+n[0].length):-1},c:function(t,r,n){return v(t,e,r,n)},d:Ea,e:Ea,f:ja,g:Ba,G:Ma,H:Na,I:Na,j:Da,L:Ia,m:$a,M:Oa,p:function(t,e,r){var n=c.exec(e.slice(r));return n?(t.p=h.get(n[0].toLowerCase()),r+n[0].length):-1},q:Fa,Q:Pa,s:Ka,S:Ra,u:va,U:Sa,V:Aa,w:_a,W:Ta,x:function(t,e,n){return v(t,r,e,n)},X:function(t,e,r){return v(t,n,e,r)},y:Ba,Y:Ma,Z:La,"%":za};function w(t,e){return function(r){var n,i,a,o=[],s=-1,l=0,c=t.length;for(r instanceof Date||(r=new Date(+r));++s53)return null;"w"in a||(a.w=1),"Z"in a?(i=(n=ua(da(a.y,0,1))).getUTCDay(),n=i>4||0===i?Xi.ceil(n):Xi(n),n=Ri.offset(n,7*(a.V-1)),a.y=n.getUTCFullYear(),a.m=n.getUTCMonth(),a.d=n.getUTCDate()+(a.w+6)%7):(i=(n=ha(da(a.y,0,1))).getDay(),n=i>4||0===i?Pi.ceil(n):Pi(n),n=Oi.offset(n,7*(a.V-1)),a.y=n.getFullYear(),a.m=n.getMonth(),a.d=n.getDate()+(a.w+6)%7)}else("W"in a||"U"in a)&&("w"in a||(a.w="u"in a?a.u%7:"W"in a?1:0),i="Z"in a?ua(da(a.y,0,1)).getUTCDay():ha(da(a.y,0,1)).getDay(),a.m=0,a.d="W"in a?(a.w+6)%7+7*a.W-(i+5)%7:a.w+7*a.U-(i+6)%7);return"Z"in a?(a.H+=a.Z/100|0,a.M+=a.Z%100,ua(a)):ha(a)}}function v(t,e,r,n){for(var i,a,o=0,s=e.length,l=r.length;o=l)return-1;if(37===(i=e.charCodeAt(o++))){if(i=e.charAt(o++),!(a=C[i in ga?e.charAt(o++):i])||(n=a(t,r,n))<0)return-1}else if(i!=r.charCodeAt(n++))return-1}return n}return b.x=w(r,b),b.X=w(n,b),b.c=w(e,b),k.x=w(r,k),k.X=w(n,k),k.c=w(e,k),{format:function(t){var e=w(t+="",b);return e.toString=function(){return t},e},parse:function(t){var e=_(t+="",!1);return e.toString=function(){return t},e},utcFormat:function(t){var e=w(t+="",k);return e.toString=function(){return t},e},utcParse:function(t){var e=_(t+="",!0);return e.toString=function(){return t},e}}}(t),fa=pa.format,pa.parse,pa.utcFormat,pa.utcParse}({dateTime:"%x, %X",date:"%-m/%-d/%Y",time:"%-I:%M:%S %p",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});const Ro=function(t){for(var e=t.length/6|0,r=new Array(e),n=0;n=1?Xo:t<=-1?-Xo:Math.asin(t)}const Qo=Math.PI,Jo=2*Qo,ts=1e-6,es=Jo-ts;function rs(t){this._+=t[0];for(let e=1,r=t.length;e=0))throw new Error(`invalid digits: ${t}`);if(e>15)return rs;const r=10**e;return function(t){this._+=t[0];for(let e=1,n=t.length;ets)if(Math.abs(h*s-l*c)>ts&&i){let d=r-a,p=n-o,f=s*s+l*l,g=d*d+p*p,m=Math.sqrt(f),y=Math.sqrt(u),x=i*Math.tan((Qo-Math.acos((f+u-g)/(2*m*y)))/2),b=x/y,k=x/m;Math.abs(b-1)>ts&&this._append`L${t+b*c},${e+b*h}`,this._append`A${i},${i},0,0,${+(h*d>c*p)},${this._x1=t+k*s},${this._y1=e+k*l}`}else this._append`L${this._x1=t},${this._y1=e}`;else;}arc(t,e,r,n,i,a){if(t=+t,e=+e,a=!!a,(r=+r)<0)throw new Error(`negative radius: ${r}`);let o=r*Math.cos(n),s=r*Math.sin(n),l=t+o,c=e+s,h=1^a,u=a?n-i:i-n;null===this._x1?this._append`M${l},${c}`:(Math.abs(this._x1-l)>ts||Math.abs(this._y1-c)>ts)&&this._append`L${l},${c}`,r&&(u<0&&(u=u%Jo+Jo),u>es?this._append`A${r},${r},0,1,${h},${t-o},${e-s}A${r},${r},0,1,${h},${this._x1=l},${this._y1=c}`:u>ts&&this._append`A${r},${r},0,${+(u>=Qo)},${h},${this._x1=t+r*Math.cos(i)},${this._y1=e+r*Math.sin(i)}`)}rect(t,e,r,n){this._append`M${this._x0=this._x1=+t},${this._y0=this._y1=+e}h${r=+r}v${+n}h${-r}Z`}toString(){return this._}}function is(t){let e=3;return t.digits=function(r){if(!arguments.length)return e;if(null==r)e=null;else{const t=Math.floor(r);if(!(t>=0))throw new RangeError(`invalid digits: ${r}`);e=t}return t},()=>new ns(e)}function as(t){return t.innerRadius}function os(t){return t.outerRadius}function ss(t){return t.startAngle}function ls(t){return t.endAngle}function cs(t){return t&&t.padAngle}function hs(t,e,r,n,i,a,o){var s=t-r,l=e-n,c=(o?a:-a)/Uo(s*s+l*l),h=c*l,u=-c*s,d=t+h,p=e+u,f=r+h,g=n+u,m=(d+f)/2,y=(p+g)/2,x=f-d,b=g-p,k=x*x+b*b,C=i-a,w=d*g-f*p,_=(b<0?-1:1)*Uo(qo(0,C*C*k-w*w)),v=(w*b-x*_)/k,S=(-w*x-b*_)/k,A=(w*b+x*_)/k,T=(-w*x+b*_)/k,M=v-m,B=S-y,L=A-m,F=T-y;return M*M+B*B>L*L+F*F&&(v=A,S=T),{cx:v,cy:S,x01:-h,y01:-u,x11:v*(i/C-1),y11:S*(i/C-1)}}function us(){var t=as,e=os,r=jo(0),n=null,i=ss,a=ls,o=cs,s=null,l=is(c);function c(){var c,h,u,d=+t.apply(this,arguments),p=+e.apply(this,arguments),f=i.apply(this,arguments)-Xo,g=a.apply(this,arguments)-Xo,m=zo(g-f),y=g>f;if(s||(s=c=l()),pYo)if(m>Vo-Yo)s.moveTo(p*Ko(f),p*Ho(f)),s.arc(0,0,p,f,g,!y),d>Yo&&(s.moveTo(d*Ko(g),d*Ho(g)),s.arc(0,0,d,g,f,y));else{var x,b,k=f,C=g,w=f,_=g,v=m,S=m,A=o.apply(this,arguments)/2,T=A>Yo&&(n?+n.apply(this,arguments):Uo(d*d+p*p)),M=Wo(zo(p-d)/2,+r.apply(this,arguments)),B=M,L=M;if(T>Yo){var F=Zo(T/d*Ho(A)),$=Zo(T/p*Ho(A));(v-=2*F)>Yo?(w+=F*=y?1:-1,_-=F):(v=0,w=_=(f+g)/2),(S-=2*$)>Yo?(k+=$*=y?1:-1,C-=$):(S=0,k=C=(f+g)/2)}var E=p*Ko(k),D=p*Ho(k),N=d*Ko(_),O=d*Ho(_);if(M>Yo){var R,I=p*Ko(C),j=p*Ho(C),z=d*Ko(w),P=d*Ho(w);if(m1?0:u<-1?Go:Math.acos(u))/2),Y=Uo(R[0]*R[0]+R[1]*R[1]);B=Wo(M,(d-Y)/(U-1)),L=Wo(M,(p-Y)/(U+1))}else B=L=0}S>Yo?L>Yo?(x=hs(z,P,E,D,p,L,y),b=hs(I,j,N,O,p,L,y),s.moveTo(x.cx+x.x01,x.cy+x.y01),LYo&&v>Yo?B>Yo?(x=hs(N,O,I,j,d,-B,y),b=hs(E,D,z,P,d,-B,y),s.lineTo(x.cx+x.x01,x.cy+x.y01),Bt?1:e>=t?0:NaN}function bs(t){return t}function ks(){var t=bs,e=xs,r=null,n=jo(0),i=jo(Vo),a=jo(0);function o(o){var s,l,c,h,u,d=(o=ds(o)).length,p=0,f=new Array(d),g=new Array(d),m=+n.apply(this,arguments),y=Math.min(Vo,Math.max(-Vo,i.apply(this,arguments)-m)),x=Math.min(Math.abs(y)/d,a.apply(this,arguments)),b=x*(y<0?-1:1);for(s=0;s0&&(p+=u);for(null!=e?f.sort(function(t,r){return e(g[t],g[r])}):null!=r&&f.sort(function(t,e){return r(o[t],o[e])}),s=0,c=p?(y-d*b)/p:0;s0?u*c:0)+b,g[l]={data:o[l],index:s,value:u,startAngle:m,endAngle:h,padAngle:x};return g}return o.value=function(e){return arguments.length?(t="function"==typeof e?e:jo(+e),o):t},o.sortValues=function(t){return arguments.length?(e=t,r=null,o):e},o.sort=function(t){return arguments.length?(r=t,e=null,o):r},o.startAngle=function(t){return arguments.length?(n="function"==typeof t?t:jo(+t),o):n},o.endAngle=function(t){return arguments.length?(i="function"==typeof t?t:jo(+t),o):i},o.padAngle=function(t){return arguments.length?(a="function"==typeof t?t:jo(+t),o):a},o}function Cs(){}function ws(t,e,r){t._context.bezierCurveTo((2*t._x0+t._x1)/3,(2*t._y0+t._y1)/3,(t._x0+2*t._x1)/3,(t._y0+2*t._y1)/3,(t._x0+4*t._x1+e)/6,(t._y0+4*t._y1+r)/6)}function _s(t){this._context=t}function vs(t){return new _s(t)}function Ss(t){this._context=t}function As(t){return new Ss(t)}function Ts(t){this._context=t}function Ms(t){return new Ts(t)}ps.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._point=0},lineEnd:function(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._context.lineTo(t,e)}}},_s.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){switch(this._point){case 3:ws(this,this._x1,this._y1);case 2:this._context.lineTo(this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3,this._context.lineTo((5*this._x0+this._x1)/6,(5*this._y0+this._y1)/6);default:ws(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Ss.prototype={areaStart:Cs,areaEnd:Cs,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._y0=this._y1=this._y2=this._y3=this._y4=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x2,this._y2),this._context.closePath();break;case 2:this._context.moveTo((this._x2+2*this._x3)/3,(this._y2+2*this._y3)/3),this._context.lineTo((this._x3+2*this._x2)/3,(this._y3+2*this._y2)/3),this._context.closePath();break;case 3:this.point(this._x2,this._y2),this.point(this._x3,this._y3),this.point(this._x4,this._y4)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x2=t,this._y2=e;break;case 1:this._point=2,this._x3=t,this._y3=e;break;case 2:this._point=3,this._x4=t,this._y4=e,this._context.moveTo((this._x0+4*this._x1+t)/6,(this._y0+4*this._y1+e)/6);break;default:ws(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}},Ts.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._y0=this._y1=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3;var r=(this._x0+4*this._x1+t)/6,n=(this._y0+4*this._y1+e)/6;this._line?this._context.lineTo(r,n):this._context.moveTo(r,n);break;case 3:this._point=4;default:ws(this,t,e)}this._x0=this._x1,this._x1=t,this._y0=this._y1,this._y1=e}};class Bs{constructor(t,e){this._context=t,this._x=e}areaStart(){this._line=0}areaEnd(){this._line=NaN}lineStart(){this._point=0}lineEnd(){(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line}point(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:this._x?this._context.bezierCurveTo(this._x0=(this._x0+t)/2,this._y0,this._x0,e,t,e):this._context.bezierCurveTo(this._x0,this._y0=(this._y0+e)/2,t,this._y0,t,e)}this._x0=t,this._y0=e}}function Ls(t){return new Bs(t,!0)}function Fs(t){return new Bs(t,!1)}function $s(t,e){this._basis=new _s(t),this._beta=e}$s.prototype={lineStart:function(){this._x=[],this._y=[],this._basis.lineStart()},lineEnd:function(){var t=this._x,e=this._y,r=t.length-1;if(r>0)for(var n,i=t[0],a=e[0],o=t[r]-i,s=e[r]-a,l=-1;++l<=r;)n=l/r,this._basis.point(this._beta*t[l]+(1-this._beta)*(i+n*o),this._beta*e[l]+(1-this._beta)*(a+n*s));this._x=this._y=null,this._basis.lineEnd()},point:function(t,e){this._x.push(+t),this._y.push(+e)}};const Es=function t(e){function r(t){return 1===e?new _s(t):new $s(t,e)}return r.beta=function(e){return t(+e)},r}(.85);function Ds(t,e,r){t._context.bezierCurveTo(t._x1+t._k*(t._x2-t._x0),t._y1+t._k*(t._y2-t._y0),t._x2+t._k*(t._x1-e),t._y2+t._k*(t._y1-r),t._x2,t._y2)}function Ns(t,e){this._context=t,this._k=(1-e)/6}Ns.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:Ds(this,this._x1,this._y1)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2,this._x1=t,this._y1=e;break;case 2:this._point=3;default:Ds(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Os=function t(e){function r(t){return new Ns(t,e)}return r.tension=function(e){return t(+e)},r}(0);function Rs(t,e){this._context=t,this._k=(1-e)/6}Rs.prototype={areaStart:Cs,areaEnd:Cs,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Ds(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Is=function t(e){function r(t){return new Rs(t,e)}return r.tension=function(e){return t(+e)},r}(0);function js(t,e){this._context=t,this._k=(1-e)/6}js.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Ds(this,t,e)}this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const zs=function t(e){function r(t){return new js(t,e)}return r.tension=function(e){return t(+e)},r}(0);function Ps(t,e,r){var n=t._x1,i=t._y1,a=t._x2,o=t._y2;if(t._l01_a>Yo){var s=2*t._l01_2a+3*t._l01_a*t._l12_a+t._l12_2a,l=3*t._l01_a*(t._l01_a+t._l12_a);n=(n*s-t._x0*t._l12_2a+t._x2*t._l01_2a)/l,i=(i*s-t._y0*t._l12_2a+t._y2*t._l01_2a)/l}if(t._l23_a>Yo){var c=2*t._l23_2a+3*t._l23_a*t._l12_a+t._l12_2a,h=3*t._l23_a*(t._l23_a+t._l12_a);a=(a*c+t._x1*t._l23_2a-e*t._l12_2a)/h,o=(o*c+t._y1*t._l23_2a-r*t._l12_2a)/h}t._context.bezierCurveTo(n,i,a,o,t._x2,t._y2)}function Ks(t,e){this._context=t,this._alpha=e}Ks.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 2:this._context.lineTo(this._x2,this._y2);break;case 3:this.point(this._x2,this._y2)}(this._line||0!==this._line&&1===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;break;case 2:this._point=3;default:Ps(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const qs=function t(e){function r(t){return e?new Ks(t,e):new Ns(t,0)}return r.alpha=function(e){return t(+e)},r}(.5);function Ws(t,e){this._context=t,this._alpha=e}Ws.prototype={areaStart:Cs,areaEnd:Cs,lineStart:function(){this._x0=this._x1=this._x2=this._x3=this._x4=this._x5=this._y0=this._y1=this._y2=this._y3=this._y4=this._y5=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){switch(this._point){case 1:this._context.moveTo(this._x3,this._y3),this._context.closePath();break;case 2:this._context.lineTo(this._x3,this._y3),this._context.closePath();break;case 3:this.point(this._x3,this._y3),this.point(this._x4,this._y4),this.point(this._x5,this._y5)}},point:function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1,this._x3=t,this._y3=e;break;case 1:this._point=2,this._context.moveTo(this._x4=t,this._y4=e);break;case 2:this._point=3,this._x5=t,this._y5=e;break;default:Ps(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Hs=function t(e){function r(t){return e?new Ws(t,e):new Rs(t,0)}return r.alpha=function(e){return t(+e)},r}(.5);function Us(t,e){this._context=t,this._alpha=e}Us.prototype={areaStart:function(){this._line=0},areaEnd:function(){this._line=NaN},lineStart:function(){this._x0=this._x1=this._x2=this._y0=this._y1=this._y2=NaN,this._l01_a=this._l12_a=this._l23_a=this._l01_2a=this._l12_2a=this._l23_2a=this._point=0},lineEnd:function(){(this._line||0!==this._line&&3===this._point)&&this._context.closePath(),this._line=1-this._line},point:function(t,e){if(t=+t,e=+e,this._point){var r=this._x2-t,n=this._y2-e;this._l23_a=Math.sqrt(this._l23_2a=Math.pow(r*r+n*n,this._alpha))}switch(this._point){case 0:this._point=1;break;case 1:this._point=2;break;case 2:this._point=3,this._line?this._context.lineTo(this._x2,this._y2):this._context.moveTo(this._x2,this._y2);break;case 3:this._point=4;default:Ps(this,t,e)}this._l01_a=this._l12_a,this._l12_a=this._l23_a,this._l01_2a=this._l12_2a,this._l12_2a=this._l23_2a,this._x0=this._x1,this._x1=this._x2,this._x2=t,this._y0=this._y1,this._y1=this._y2,this._y2=e}};const Ys=function t(e){function r(t){return e?new Us(t,e):new js(t,0)}return r.alpha=function(e){return t(+e)},r}(.5);function Gs(t){this._context=t}function Xs(t){return new Gs(t)}function Vs(t){return t<0?-1:1}function Zs(t,e,r){var n=t._x1-t._x0,i=e-t._x1,a=(t._y1-t._y0)/(n||i<0&&-0),o=(r-t._y1)/(i||n<0&&-0),s=(a*i+o*n)/(n+i);return(Vs(a)+Vs(o))*Math.min(Math.abs(a),Math.abs(o),.5*Math.abs(s))||0}function Qs(t,e){var r=t._x1-t._x0;return r?(3*(t._y1-t._y0)/r-e)/2:e}function Js(t,e,r){var n=t._x0,i=t._y0,a=t._x1,o=t._y1,s=(a-n)/3;t._context.bezierCurveTo(n+s,i+s*e,a-s,o-s*r,a,o)}function tl(t){this._context=t}function el(t){this._context=new rl(t)}function rl(t){this._context=t}function nl(t){return new tl(t)}function il(t){return new el(t)}function al(t){this._context=t}function ol(t){var e,r,n=t.length-1,i=new Array(n),a=new Array(n),o=new Array(n);for(i[0]=0,a[0]=2,o[0]=t[0]+2*t[1],e=1;e=0;--e)i[e]=(o[e]-i[e+1])/a[e];for(a[n-1]=(t[n]+i[n-1])/2,e=0;e=0&&(this._t=1-this._t,this._line=1-this._line)},point:function(t,e){switch(t=+t,e=+e,this._point){case 0:this._point=1,this._line?this._context.lineTo(t,e):this._context.moveTo(t,e);break;case 1:this._point=2;default:if(this._t<=0)this._context.lineTo(this._x,e),this._context.lineTo(t,e);else{var r=this._x*(1-this._t)+t*this._t;this._context.lineTo(r,this._y),this._context.lineTo(r,e)}}this._x=t,this._y=e}},dl.prototype={constructor:dl,scale:function(t){return 1===t?this:new dl(this.k*t,this.x,this.y)},translate:function(t,e){return 0===t&0===e?this:new dl(this.k,this.x+this.k*t,this.y+this.k*e)},apply:function(t){return[t[0]*this.k+this.x,t[1]*this.k+this.y]},applyX:function(t){return t*this.k+this.x},applyY:function(t){return t*this.k+this.y},invert:function(t){return[(t[0]-this.x)/this.k,(t[1]-this.y)/this.k]},invertX:function(t){return(t-this.x)/this.k},invertY:function(t){return(t-this.y)/this.k},rescaleX:function(t){return t.copy().domain(t.range().map(this.invertX,this).map(t.invert,t))},rescaleY:function(t){return t.copy().domain(t.range().map(this.invertY,this).map(t.invert,t))},toString:function(){return"translate("+this.x+","+this.y+") scale("+this.k+")"}};new dl(1,0,0);dl.prototype},4003:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(45786);function i(t,e){if("function"!=typeof t||null!=e&&"function"!=typeof e)throw new TypeError("Expected a function");var r=function(){var n=arguments,i=e?e.apply(this,n):n[0],a=r.cache;if(a.has(i))return a.get(i);var o=t.apply(this,n);return r.cache=a.set(i,o)||a,o};return r.cache=new(i.Cache||n.A),r}i.Cache=n.A;const a=i},5220:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t){return function(e){return t(e)}}},6727:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n="object"==typeof global&&global&&global.Object===Object&&global},9420:(t,e,r)=>{"use strict";r.d(e,{$C:()=>T,$t:()=>q,C4:()=>H,I5:()=>K,Ib:()=>g,KL:()=>G,Sm:()=>U,Un:()=>N,_K:()=>W,bH:()=>$,dq:()=>z,pe:()=>l,rY:()=>Y,ru:()=>D,sM:()=>S,vU:()=>p,yT:()=>B});var n=r(97485),i=r(41407),a=r(3170),o=r(4003),s=r(75856),l="\u200b",c={curveBasis:a.qrM,curveBasisClosed:a.Yu4,curveBasisOpen:a.IA3,curveBumpX:a.Wi0,curveBumpY:a.PGM,curveBundle:a.OEq,curveCardinalClosed:a.olC,curveCardinalOpen:a.IrU,curveCardinal:a.y8u,curveCatmullRomClosed:a.Q7f,curveCatmullRomOpen:a.cVp,curveCatmullRom:a.oDi,curveLinear:a.lUB,curveLinearClosed:a.Lx9,curveMonotoneX:a.nVG,curveMonotoneY:a.uxU,curveNatural:a.Xf2,curveStep:a.GZz,curveStepAfter:a.UPb,curveStepBefore:a.dyv},h=/\s*(?:(\w+)(?=:):|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,u=(0,n.K2)(function(t,e){const r=d(t,/(?:init\b)|(?:initialize\b)/);let i={};if(Array.isArray(r)){const t=r.map(t=>t.args);(0,n.$i)(t),i=(0,n.hH)(i,[...t])}else i=r.args;if(!i)return;let a=(0,n.Ch)(t,e);const o="config";return void 0!==i[o]&&("flowchart-v2"===a&&(a="flowchart"),i[a]=i[o],delete i[o]),i},"detectInit"),d=(0,n.K2)(function(t,e=null){try{const r=new RegExp(`[%]{2}(?![{]${h.source})(?=[}][%]{2}).*\n`,"ig");let i;t=t.trim().replace(r,"").replace(/'/gm,'"'),n.Rm.debug(`Detecting diagram directive${null!==e?" type:"+e:""} based on the text:${t}`);const a=[];for(;null!==(i=n.DB.exec(t));)if(i.index===n.DB.lastIndex&&n.DB.lastIndex++,i&&!e||e&&i[1]?.match(e)||e&&i[2]?.match(e)){const t=i[1]?i[1]:i[2],e=i[3]?i[3].trim():i[4]?JSON.parse(i[4].trim()):null;a.push({type:t,args:e})}return 0===a.length?{type:t,args:null}:1===a.length?a[0]:a}catch(r){return n.Rm.error(`ERROR: ${r.message} - Unable to parse directive type: '${e}' based on the text: '${t}'`),{type:void 0,args:null}}},"detectDirective"),p=(0,n.K2)(function(t){return t.replace(n.DB,"")},"removeDirectives"),f=(0,n.K2)(function(t,e){for(const[r,n]of e.entries())if(n.match(t))return r;return-1},"isSubstringInArray");function g(t,e){if(!t)return e;const r=`curve${t.charAt(0).toUpperCase()+t.slice(1)}`;return c[r]??e}function m(t,e){const r=t.trim();if(r)return"loose"!==e.securityLevel?(0,i.J)(r):r}(0,n.K2)(g,"interpolateToCurve"),(0,n.K2)(m,"formatUrl");var y=(0,n.K2)((t,...e)=>{const r=t.split("."),i=r.length-1,a=r[i];let o=window;for(let s=0;s{r+=x(t,e),e=t});return w(t,r/2)}function k(t){return 1===t.length?t[0]:b(t)}(0,n.K2)(x,"distance"),(0,n.K2)(b,"traverseEdge"),(0,n.K2)(k,"calcLabelPosition");var C=(0,n.K2)((t,e=2)=>{const r=Math.pow(10,e);return Math.round(t*r)/r},"roundNumber"),w=(0,n.K2)((t,e)=>{let r,n=e;for(const i of t){if(r){const t=x(i,r);if(0===t)return r;if(t=1)return{x:i.x,y:i.y};if(e>0&&e<1)return{x:C((1-e)*r.x+e*i.x,5),y:C((1-e)*r.y+e*i.y,5)}}}r=i}throw new Error("Could not find a suitable point for the given distance")},"calculatePoint"),_=(0,n.K2)((t,e,r)=>{n.Rm.info(`our points ${JSON.stringify(e)}`),e[0]!==r&&(e=e.reverse());const i=w(e,25),a=t?10:5,o=Math.atan2(e[0].y-i.y,e[0].x-i.x),s={x:0,y:0};return s.x=Math.sin(o)*a+(e[0].x+i.x)/2,s.y=-Math.cos(o)*a+(e[0].y+i.y)/2,s},"calcCardinalityPosition");function v(t,e,r){const i=structuredClone(r);n.Rm.info("our points",i),"start_left"!==e&&"start_right"!==e&&i.reverse();const a=w(i,25+t),o=10+.5*t,s=Math.atan2(i[0].y-a.y,i[0].x-a.x),l={x:0,y:0};return"start_left"===e?(l.x=Math.sin(s+Math.PI)*o+(i[0].x+a.x)/2,l.y=-Math.cos(s+Math.PI)*o+(i[0].y+a.y)/2):"end_right"===e?(l.x=Math.sin(s-Math.PI)*o+(i[0].x+a.x)/2-5,l.y=-Math.cos(s-Math.PI)*o+(i[0].y+a.y)/2-5):"end_left"===e?(l.x=Math.sin(s)*o+(i[0].x+a.x)/2-5,l.y=-Math.cos(s)*o+(i[0].y+a.y)/2-5):(l.x=Math.sin(s)*o+(i[0].x+a.x)/2,l.y=-Math.cos(s)*o+(i[0].y+a.y)/2),l}function S(t){let e="",r="";for(const n of t)void 0!==n&&(n.startsWith("color:")||n.startsWith("text-align:")?r=r+n+";":e=e+n+";");return{style:e,labelStyle:r}}(0,n.K2)(v,"calcTerminalLabelPosition"),(0,n.K2)(S,"getStylesFromArray");var A=0,T=(0,n.K2)(()=>(A++,"id-"+Math.random().toString(36).substr(2,12)+"-"+A),"generateId");function M(t){let e="";const r="0123456789abcdef";for(let n=0;nM(t.length),"random"),L=(0,n.K2)(function(){return{x:0,y:0,fill:void 0,anchor:"start",style:"#666",width:100,height:100,textMargin:0,rx:0,ry:0,valign:void 0,text:""}},"getTextObj"),F=(0,n.K2)(function(t,e){const r=e.text.replace(n.Y2.lineBreakRegex," "),[,i]=K(e.fontSize),a=t.append("text");a.attr("x",e.x),a.attr("y",e.y),a.style("text-anchor",e.anchor),a.style("font-family",e.fontFamily),a.style("font-size",i),a.style("font-weight",e.fontWeight),a.attr("fill",e.fill),void 0!==e.class&&a.attr("class",e.class);const o=a.append("tspan");return o.attr("x",e.x+2*e.textMargin),o.attr("fill",e.fill),o.text(r),a},"drawSimpleText"),$=(0,o.A)((t,e,r)=>{if(!t)return t;if(r=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",joinWith:"
"},r),n.Y2.lineBreakRegex.test(t))return t;const i=t.split(" ").filter(Boolean),a=[];let o="";return i.forEach((t,n)=>{const s=N(`${t} `,r),l=N(o,r);if(s>e){const{hyphenatedStrings:n,remainingWord:i}=E(t,e,"-",r);a.push(o,...n),o=i}else l+s>=e?(a.push(o),o=t):o=[o,t].filter(Boolean).join(" ");n+1===i.length&&a.push(o)}),a.filter(t=>""!==t).join(r.joinWith)},(t,e,r)=>`${t}${e}${r.fontSize}${r.fontWeight}${r.fontFamily}${r.joinWith}`),E=(0,o.A)((t,e,r="-",n)=>{n=Object.assign({fontSize:12,fontWeight:400,fontFamily:"Arial",margin:0},n);const i=[...t],a=[];let o="";return i.forEach((t,s)=>{const l=`${o}${t}`;if(N(l,n)>=e){const t=s+1,e=i.length===t,n=`${l}${r}`;a.push(e?l:n),o=""}else o=l}),{hyphenatedStrings:a,remainingWord:o}},(t,e,r="-",n)=>`${t}${e}${r}${n.fontSize}${n.fontWeight}${n.fontFamily}`);function D(t,e){return R(t,e).height}function N(t,e){return R(t,e).width}(0,n.K2)(D,"calculateTextHeight"),(0,n.K2)(N,"calculateTextWidth");var O,R=(0,o.A)((t,e)=>{const{fontSize:r=12,fontFamily:i="Arial",fontWeight:o=400}=e;if(!t)return{width:0,height:0};const[,s]=K(r),c=["sans-serif",i],h=t.split(n.Y2.lineBreakRegex),u=[],d=(0,a.Ltv)("body");if(!d.remove)return{width:0,height:0,lineHeight:0};const p=d.append("svg");for(const n of c){let t=0;const e={width:0,height:0,lineHeight:0};for(const r of h){const i=L();i.text=r||l;const a=F(p,i).style("font-size",s).style("font-weight",o).style("font-family",n),c=(a._groups||a)[0][0].getBBox();if(0===c.width&&0===c.height)throw new Error("svg element not in render tree");e.width=Math.round(Math.max(e.width,c.width)),t=Math.round(c.height),e.height+=t,e.lineHeight=Math.round(Math.max(e.lineHeight,t))}u.push(e)}p.remove();return u[isNaN(u[1].height)||isNaN(u[1].width)||isNaN(u[1].lineHeight)||u[0].height>u[1].height&&u[0].width>u[1].width&&u[0].lineHeight>u[1].lineHeight?0:1]},(t,e)=>`${t}${e.fontSize}${e.fontWeight}${e.fontFamily}`),I=class{constructor(t=!1,e){this.count=0,this.count=e?e.length:0,this.next=t?()=>this.count++:()=>Date.now()}static{(0,n.K2)(this,"InitIDGenerator")}},j=(0,n.K2)(function(t){return O=O||document.createElement("div"),t=escape(t).replace(/%26/g,"&").replace(/%23/g,"#").replace(/%3B/g,";"),O.innerHTML=t,unescape(O.textContent)},"entityDecode");function z(t){return"str"in t}(0,n.K2)(z,"isDetailedError");var P=(0,n.K2)((t,e,r,n)=>{if(!n)return;const i=t.node()?.getBBox();i&&t.append("text").text(n).attr("text-anchor","middle").attr("x",i.x+i.width/2).attr("y",-r).attr("class",e)},"insertTitle"),K=(0,n.K2)(t=>{if("number"==typeof t)return[t,t+"px"];const e=parseInt(t??"",10);return Number.isNaN(e)?[void 0,void 0]:t===String(e)?[e,t+"px"]:[e,t]},"parseFontSize");function q(t,e){return(0,s.A)({},t,e)}(0,n.K2)(q,"cleanAndMerge");var W={assignWithDepth:n.hH,wrapLabel:$,calculateTextHeight:D,calculateTextWidth:N,calculateTextDimensions:R,cleanAndMerge:q,detectInit:u,detectDirective:d,isSubstringInArray:f,interpolateToCurve:g,calcLabelPosition:k,calcCardinalityPosition:_,calcTerminalLabelPosition:v,formatUrl:m,getStylesFromArray:S,generateId:T,random:B,runFunc:y,entityDecode:j,insertTitle:P,parseFontSize:K,InitIDGenerator:I},H=(0,n.K2)(function(t){let e=t;return e=e.replace(/style.*:\S*#.*;/g,function(t){return t.substring(0,t.length-1)}),e=e.replace(/classDef.*:\S*#.*;/g,function(t){return t.substring(0,t.length-1)}),e=e.replace(/#\w+;/g,function(t){const e=t.substring(1,t.length-1);return/^\+?\d+$/.test(e)?"\ufb02\xb0\xb0"+e+"\xb6\xdf":"\ufb02\xb0"+e+"\xb6\xdf"}),e},"encodeEntities"),U=(0,n.K2)(function(t){return t.replace(/\ufb02\xb0\xb0/g,"&#").replace(/\ufb02\xb0/g,"&").replace(/\xb6\xdf/g,";")},"decodeEntities"),Y=(0,n.K2)((t,e,{counter:r=0,prefix:n,suffix:i},a)=>a||`${n?`${n}_`:""}${t}_${e}_${r}${i?`_${i}`:""}`,"getEdgeId");function G(t){return t??null}(0,n.K2)(G,"handleUndefinedAttr")},9554:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t,e){var r=-1,n=t.length;for(e||(e=Array(n));++r{"use strict";r.d(e,{A:()=>i});var n=r(83927);const i=function(t){var e=new t.constructor(t.byteLength);return new n.A(e).set(new n.A(t)),e}},10130:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(6727),i="object"==typeof exports&&exports&&!exports.nodeType&&exports,a=i&&"object"==typeof module&&module&&!module.nodeType&&module,o=a&&a.exports===i&&n.A.process;const s=function(){try{var t=a&&a.require&&a.require("util").types;return t||o&&o.binding&&o.binding("util")}catch(e){}}()},11628:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(46554),i=r(55385);const a=(t,e,r)=>{const a=i.A.parse(t),o=a[e],s=n.A.channel.clamp[e](o+r);return o!==s&&(a[e]=s),i.A.stringify(a)}},13212:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(46554),i=r(55385);const a=t=>{const{r:e,g:r,b:a}=i.A.parse(t),o=.2126*n.A.channel.toLinear(e)+.7152*n.A.channel.toLinear(r)+.0722*n.A.channel.toLinear(a);return n.A.lang.round(o)},o=t=>a(t)>=.5,s=t=>!o(t)},14779:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(57454),i="object"==typeof exports&&exports&&!exports.nodeType&&exports,a=i&&"object"==typeof module&&module&&!module.nodeType&&module,o=a&&a.exports===i?n.A.Buffer:void 0,s=o?o.allocUnsafe:void 0;const l=function(t,e){if(e)return t.slice();var r=t.length,n=s?s(r):new t.constructor(r);return t.copy(n),n}},16599:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(16957),i=r(42849),a=r(31408),o=r(49084);const s=function(t,e,r){if(!(0,o.A)(r))return!1;var s=typeof e;return!!("number"==s?(0,i.A)(r)&&(0,a.A)(e,r.length):"string"==s&&e in r)&&(0,n.A)(r[e],t)}},16957:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t,e){return t===e||t!=t&&e!=e}},21187:(t,e,r)=>{"use strict";r.d(e,{A:()=>c});r(36672);var n=r(13526),i=r(98332);const a={tableOfContents:"tableOfContents_baz9",docItemContainer:"docItemContainer_jSd8"};var o=r(23420);const s="table-of-contents__link toc-highlight",l="table-of-contents__link--active";function c({className:t,...e}){return(0,o.jsx)("div",{className:(0,n.A)(a.tableOfContents,"thin-scrollbar",t),children:(0,o.jsx)(i.A,{...e,linkClassName:s,linkActiveClassName:l})})}},21763:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(46554),i=r(55385);const a=(t,e)=>{const r=i.A.parse(t);for(const i in e)r[i]=n.A.channel.clamp[i](e[i]);return i.A.stringify(r)}},22470:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(48203),i=r(90372),a=r(56117);const o=i.A?function(t,e){return(0,i.A)(t,"toString",{configurable:!0,enumerable:!1,value:(0,n.A)(e),writable:!0})}:a.A;var s=Date.now;const l=function(t){var e=0,r=0;return function(){var n=s(),i=16-(n-r);if(r=n,i>0){if(++e>=800)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}(o)},27163:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(57454);const i=function(){return!1};var a="object"==typeof exports&&exports&&!exports.nodeType&&exports,o=a&&"object"==typeof module&&module&&!module.nodeType&&module,s=o&&o.exports===a?n.A.Buffer:void 0;const l=(s?s.isBuffer:void 0)||i},28404:(t,e,r)=>{"use strict";r.d(e,{A:()=>st});const{entries:n,setPrototypeOf:i,isFrozen:a,getPrototypeOf:o,getOwnPropertyDescriptor:s}=Object;let{freeze:l,seal:c,create:h}=Object,{apply:u,construct:d}="undefined"!=typeof Reflect&&Reflect;l||(l=function(t){return t}),c||(c=function(t){return t}),u||(u=function(t,e,r){return t.apply(e,r)}),d||(d=function(t,e){return new t(...e)});const p=M(Array.prototype.forEach),f=M(Array.prototype.lastIndexOf),g=M(Array.prototype.pop),m=M(Array.prototype.push),y=M(Array.prototype.splice),x=M(String.prototype.toLowerCase),b=M(String.prototype.toString),k=M(String.prototype.match),C=M(String.prototype.replace),w=M(String.prototype.indexOf),_=M(String.prototype.trim),v=M(Object.prototype.hasOwnProperty),S=M(RegExp.prototype.test),A=(T=TypeError,function(){for(var t=arguments.length,e=new Array(t),r=0;r1?r-1:0),i=1;i2&&void 0!==arguments[2]?arguments[2]:x;i&&i(t,null);let n=e.length;for(;n--;){let i=e[n];if("string"==typeof i){const t=r(i);t!==i&&(a(e)||(e[n]=t),i=t)}t[i]=!0}return t}function L(t){for(let e=0;e/gm),U=c(/\$\{[\w\W]*/gm),Y=c(/^data-[\-\w.\u00B7-\uFFFF]+$/),G=c(/^aria-[\-\w]+$/),X=c(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp|matrix):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),V=c(/^(?:\w+script|data):/i),Z=c(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),Q=c(/^html$/i),J=c(/^[a-z][.\w]*(-[.\w]+)+$/i);var tt=Object.freeze({__proto__:null,ARIA_ATTR:G,ATTR_WHITESPACE:Z,CUSTOM_ELEMENT:J,DATA_ATTR:Y,DOCTYPE_NAME:Q,ERB_EXPR:H,IS_ALLOWED_URI:X,IS_SCRIPT_OR_DATA:V,MUSTACHE_EXPR:W,TMPLIT_EXPR:U});const et=1,rt=3,nt=7,it=8,at=9,ot=function(){return"undefined"==typeof window?null:window};var st=function t(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:ot();const r=e=>t(e);if(r.version="3.2.6",r.removed=[],!e||!e.document||e.document.nodeType!==at||!e.Element)return r.isSupported=!1,r;let{document:i}=e;const a=i,o=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:c,Node:u,Element:d,NodeFilter:T,NamedNodeMap:M=e.NamedNodeMap||e.MozNamedAttrMap,HTMLFormElement:L,DOMParser:W,trustedTypes:H}=e,U=d.prototype,Y=$(U,"cloneNode"),G=$(U,"remove"),V=$(U,"nextSibling"),Z=$(U,"childNodes"),J=$(U,"parentNode");if("function"==typeof c){const t=i.createElement("template");t.content&&t.content.ownerDocument&&(i=t.content.ownerDocument)}let st,lt="";const{implementation:ct,createNodeIterator:ht,createDocumentFragment:ut,getElementsByTagName:dt}=i,{importNode:pt}=a;let ft={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};r.isSupported="function"==typeof n&&"function"==typeof J&&ct&&void 0!==ct.createHTMLDocument;const{MUSTACHE_EXPR:gt,ERB_EXPR:mt,TMPLIT_EXPR:yt,DATA_ATTR:xt,ARIA_ATTR:bt,IS_SCRIPT_OR_DATA:kt,ATTR_WHITESPACE:Ct,CUSTOM_ELEMENT:wt}=tt;let{IS_ALLOWED_URI:_t}=tt,vt=null;const St=B({},[...E,...D,...N,...R,...j]);let At=null;const Tt=B({},[...z,...P,...K,...q]);let Mt=Object.seal(h(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Bt=null,Lt=null,Ft=!0,$t=!0,Et=!1,Dt=!0,Nt=!1,Ot=!0,Rt=!1,It=!1,jt=!1,zt=!1,Pt=!1,Kt=!1,qt=!0,Wt=!1,Ht=!0,Ut=!1,Yt={},Gt=null;const Xt=B({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Vt=null;const Zt=B({},["audio","video","img","source","image","track"]);let Qt=null;const Jt=B({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),te="http://www.w3.org/1998/Math/MathML",ee="http://www.w3.org/2000/svg",re="http://www.w3.org/1999/xhtml";let ne=re,ie=!1,ae=null;const oe=B({},[te,ee,re],b);let se=B({},["mi","mo","mn","ms","mtext"]),le=B({},["annotation-xml"]);const ce=B({},["title","style","font","a","script"]);let he=null;const ue=["application/xhtml+xml","text/html"];let de=null,pe=null;const fe=i.createElement("form"),ge=function(t){return t instanceof RegExp||t instanceof Function},me=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!pe||pe!==t){if(t&&"object"==typeof t||(t={}),t=F(t),he=-1===ue.indexOf(t.PARSER_MEDIA_TYPE)?"text/html":t.PARSER_MEDIA_TYPE,de="application/xhtml+xml"===he?b:x,vt=v(t,"ALLOWED_TAGS")?B({},t.ALLOWED_TAGS,de):St,At=v(t,"ALLOWED_ATTR")?B({},t.ALLOWED_ATTR,de):Tt,ae=v(t,"ALLOWED_NAMESPACES")?B({},t.ALLOWED_NAMESPACES,b):oe,Qt=v(t,"ADD_URI_SAFE_ATTR")?B(F(Jt),t.ADD_URI_SAFE_ATTR,de):Jt,Vt=v(t,"ADD_DATA_URI_TAGS")?B(F(Zt),t.ADD_DATA_URI_TAGS,de):Zt,Gt=v(t,"FORBID_CONTENTS")?B({},t.FORBID_CONTENTS,de):Xt,Bt=v(t,"FORBID_TAGS")?B({},t.FORBID_TAGS,de):F({}),Lt=v(t,"FORBID_ATTR")?B({},t.FORBID_ATTR,de):F({}),Yt=!!v(t,"USE_PROFILES")&&t.USE_PROFILES,Ft=!1!==t.ALLOW_ARIA_ATTR,$t=!1!==t.ALLOW_DATA_ATTR,Et=t.ALLOW_UNKNOWN_PROTOCOLS||!1,Dt=!1!==t.ALLOW_SELF_CLOSE_IN_ATTR,Nt=t.SAFE_FOR_TEMPLATES||!1,Ot=!1!==t.SAFE_FOR_XML,Rt=t.WHOLE_DOCUMENT||!1,zt=t.RETURN_DOM||!1,Pt=t.RETURN_DOM_FRAGMENT||!1,Kt=t.RETURN_TRUSTED_TYPE||!1,jt=t.FORCE_BODY||!1,qt=!1!==t.SANITIZE_DOM,Wt=t.SANITIZE_NAMED_PROPS||!1,Ht=!1!==t.KEEP_CONTENT,Ut=t.IN_PLACE||!1,_t=t.ALLOWED_URI_REGEXP||X,ne=t.NAMESPACE||re,se=t.MATHML_TEXT_INTEGRATION_POINTS||se,le=t.HTML_INTEGRATION_POINTS||le,Mt=t.CUSTOM_ELEMENT_HANDLING||{},t.CUSTOM_ELEMENT_HANDLING&&ge(t.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(Mt.tagNameCheck=t.CUSTOM_ELEMENT_HANDLING.tagNameCheck),t.CUSTOM_ELEMENT_HANDLING&&ge(t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(Mt.attributeNameCheck=t.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),t.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(Mt.allowCustomizedBuiltInElements=t.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Nt&&($t=!1),Pt&&(zt=!0),Yt&&(vt=B({},j),At=[],!0===Yt.html&&(B(vt,E),B(At,z)),!0===Yt.svg&&(B(vt,D),B(At,P),B(At,q)),!0===Yt.svgFilters&&(B(vt,N),B(At,P),B(At,q)),!0===Yt.mathMl&&(B(vt,R),B(At,K),B(At,q))),t.ADD_TAGS&&(vt===St&&(vt=F(vt)),B(vt,t.ADD_TAGS,de)),t.ADD_ATTR&&(At===Tt&&(At=F(At)),B(At,t.ADD_ATTR,de)),t.ADD_URI_SAFE_ATTR&&B(Qt,t.ADD_URI_SAFE_ATTR,de),t.FORBID_CONTENTS&&(Gt===Xt&&(Gt=F(Gt)),B(Gt,t.FORBID_CONTENTS,de)),Ht&&(vt["#text"]=!0),Rt&&B(vt,["html","head","body"]),vt.table&&(B(vt,["tbody"]),delete Bt.tbody),t.TRUSTED_TYPES_POLICY){if("function"!=typeof t.TRUSTED_TYPES_POLICY.createHTML)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof t.TRUSTED_TYPES_POLICY.createScriptURL)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');st=t.TRUSTED_TYPES_POLICY,lt=st.createHTML("")}else void 0===st&&(st=function(t,e){if("object"!=typeof t||"function"!=typeof t.createPolicy)return null;let r=null;const n="data-tt-policy-suffix";e&&e.hasAttribute(n)&&(r=e.getAttribute(n));const i="dompurify"+(r?"#"+r:"");try{return t.createPolicy(i,{createHTML:t=>t,createScriptURL:t=>t})}catch(a){return console.warn("TrustedTypes policy "+i+" could not be created."),null}}(H,o)),null!==st&&"string"==typeof lt&&(lt=st.createHTML(""));l&&l(t),pe=t}},ye=B({},[...D,...N,...O]),xe=B({},[...R,...I]),be=function(t){m(r.removed,{element:t});try{J(t).removeChild(t)}catch(e){G(t)}},ke=function(t,e){try{m(r.removed,{attribute:e.getAttributeNode(t),from:e})}catch(n){m(r.removed,{attribute:null,from:e})}if(e.removeAttribute(t),"is"===t)if(zt||Pt)try{be(e)}catch(n){}else try{e.setAttribute(t,"")}catch(n){}},Ce=function(t){let e=null,r=null;if(jt)t=""+t;else{const e=k(t,/^[\r\n\t ]+/);r=e&&e[0]}"application/xhtml+xml"===he&&ne===re&&(t=''+t+"");const n=st?st.createHTML(t):t;if(ne===re)try{e=(new W).parseFromString(n,he)}catch(o){}if(!e||!e.documentElement){e=ct.createDocument(ne,"template",null);try{e.documentElement.innerHTML=ie?lt:n}catch(o){}}const a=e.body||e.documentElement;return t&&r&&a.insertBefore(i.createTextNode(r),a.childNodes[0]||null),ne===re?dt.call(e,Rt?"html":"body")[0]:Rt?e.documentElement:a},we=function(t){return ht.call(t.ownerDocument||t,t,T.SHOW_ELEMENT|T.SHOW_COMMENT|T.SHOW_TEXT|T.SHOW_PROCESSING_INSTRUCTION|T.SHOW_CDATA_SECTION,null)},_e=function(t){return t instanceof L&&("string"!=typeof t.nodeName||"string"!=typeof t.textContent||"function"!=typeof t.removeChild||!(t.attributes instanceof M)||"function"!=typeof t.removeAttribute||"function"!=typeof t.setAttribute||"string"!=typeof t.namespaceURI||"function"!=typeof t.insertBefore||"function"!=typeof t.hasChildNodes)},ve=function(t){return"function"==typeof u&&t instanceof u};function Se(t,e,n){p(t,t=>{t.call(r,e,n,pe)})}const Ae=function(t){let e=null;if(Se(ft.beforeSanitizeElements,t,null),_e(t))return be(t),!0;const n=de(t.nodeName);if(Se(ft.uponSanitizeElement,t,{tagName:n,allowedTags:vt}),Ot&&t.hasChildNodes()&&!ve(t.firstElementChild)&&S(/<[/\w!]/g,t.innerHTML)&&S(/<[/\w!]/g,t.textContent))return be(t),!0;if(t.nodeType===nt)return be(t),!0;if(Ot&&t.nodeType===it&&S(/<[/\w]/g,t.data))return be(t),!0;if(!vt[n]||Bt[n]){if(!Bt[n]&&Me(n)){if(Mt.tagNameCheck instanceof RegExp&&S(Mt.tagNameCheck,n))return!1;if(Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(n))return!1}if(Ht&&!Gt[n]){const e=J(t)||t.parentNode,r=Z(t)||t.childNodes;if(r&&e){for(let n=r.length-1;n>=0;--n){const i=Y(r[n],!0);i.__removalCount=(t.__removalCount||0)+1,e.insertBefore(i,V(t))}}}return be(t),!0}return t instanceof d&&!function(t){let e=J(t);e&&e.tagName||(e={namespaceURI:ne,tagName:"template"});const r=x(t.tagName),n=x(e.tagName);return!!ae[t.namespaceURI]&&(t.namespaceURI===ee?e.namespaceURI===re?"svg"===r:e.namespaceURI===te?"svg"===r&&("annotation-xml"===n||se[n]):Boolean(ye[r]):t.namespaceURI===te?e.namespaceURI===re?"math"===r:e.namespaceURI===ee?"math"===r&&le[n]:Boolean(xe[r]):t.namespaceURI===re?!(e.namespaceURI===ee&&!le[n])&&!(e.namespaceURI===te&&!se[n])&&!xe[r]&&(ce[r]||!ye[r]):!("application/xhtml+xml"!==he||!ae[t.namespaceURI]))}(t)?(be(t),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!S(/<\/no(script|embed|frames)/i,t.innerHTML)?(Nt&&t.nodeType===rt&&(e=t.textContent,p([gt,mt,yt],t=>{e=C(e,t," ")}),t.textContent!==e&&(m(r.removed,{element:t.cloneNode()}),t.textContent=e)),Se(ft.afterSanitizeElements,t,null),!1):(be(t),!0)},Te=function(t,e,r){if(qt&&("id"===e||"name"===e)&&(r in i||r in fe))return!1;if($t&&!Lt[e]&&S(xt,e));else if(Ft&&S(bt,e));else if(!At[e]||Lt[e]){if(!(Me(t)&&(Mt.tagNameCheck instanceof RegExp&&S(Mt.tagNameCheck,t)||Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(t))&&(Mt.attributeNameCheck instanceof RegExp&&S(Mt.attributeNameCheck,e)||Mt.attributeNameCheck instanceof Function&&Mt.attributeNameCheck(e))||"is"===e&&Mt.allowCustomizedBuiltInElements&&(Mt.tagNameCheck instanceof RegExp&&S(Mt.tagNameCheck,r)||Mt.tagNameCheck instanceof Function&&Mt.tagNameCheck(r))))return!1}else if(Qt[e]);else if(S(_t,C(r,Ct,"")));else if("src"!==e&&"xlink:href"!==e&&"href"!==e||"script"===t||0!==w(r,"data:")||!Vt[t]){if(Et&&!S(kt,C(r,Ct,"")));else if(r)return!1}else;return!0},Me=function(t){return"annotation-xml"!==t&&k(t,wt)},Be=function(t){Se(ft.beforeSanitizeAttributes,t,null);const{attributes:e}=t;if(!e||_e(t))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:At,forceKeepAttr:void 0};let i=e.length;for(;i--;){const o=e[i],{name:s,namespaceURI:l,value:c}=o,h=de(s),u=c;let d="value"===s?u:_(u);if(n.attrName=h,n.attrValue=d,n.keepAttr=!0,n.forceKeepAttr=void 0,Se(ft.uponSanitizeAttribute,t,n),d=n.attrValue,!Wt||"id"!==h&&"name"!==h||(ke(s,t),d="user-content-"+d),Ot&&S(/((--!?|])>)|<\/(style|title)/i,d)){ke(s,t);continue}if(n.forceKeepAttr)continue;if(!n.keepAttr){ke(s,t);continue}if(!Dt&&S(/\/>/i,d)){ke(s,t);continue}Nt&&p([gt,mt,yt],t=>{d=C(d,t," ")});const f=de(t.nodeName);if(Te(f,h,d)){if(st&&"object"==typeof H&&"function"==typeof H.getAttributeType)if(l);else switch(H.getAttributeType(f,h)){case"TrustedHTML":d=st.createHTML(d);break;case"TrustedScriptURL":d=st.createScriptURL(d)}if(d!==u)try{l?t.setAttributeNS(l,s,d):t.setAttribute(s,d),_e(t)?be(t):g(r.removed)}catch(a){ke(s,t)}}else ke(s,t)}Se(ft.afterSanitizeAttributes,t,null)},Le=function t(e){let r=null;const n=we(e);for(Se(ft.beforeSanitizeShadowDOM,e,null);r=n.nextNode();)Se(ft.uponSanitizeShadowNode,r,null),Ae(r),Be(r),r.content instanceof s&&t(r.content);Se(ft.afterSanitizeShadowDOM,e,null)};return r.sanitize=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,i=null,o=null,l=null;if(ie=!t,ie&&(t="\x3c!--\x3e"),"string"!=typeof t&&!ve(t)){if("function"!=typeof t.toString)throw A("toString is not a function");if("string"!=typeof(t=t.toString()))throw A("dirty is not a string, aborting")}if(!r.isSupported)return t;if(It||me(e),r.removed=[],"string"==typeof t&&(Ut=!1),Ut){if(t.nodeName){const e=de(t.nodeName);if(!vt[e]||Bt[e])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(t instanceof u)n=Ce("\x3c!----\x3e"),i=n.ownerDocument.importNode(t,!0),i.nodeType===et&&"BODY"===i.nodeName||"HTML"===i.nodeName?n=i:n.appendChild(i);else{if(!zt&&!Nt&&!Rt&&-1===t.indexOf("<"))return st&&Kt?st.createHTML(t):t;if(n=Ce(t),!n)return zt?null:Kt?lt:""}n&&jt&&be(n.firstChild);const c=we(Ut?t:n);for(;o=c.nextNode();)Ae(o),Be(o),o.content instanceof s&&Le(o.content);if(Ut)return t;if(zt){if(Pt)for(l=ut.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(At.shadowroot||At.shadowrootmode)&&(l=pt.call(a,l,!0)),l}let h=Rt?n.outerHTML:n.innerHTML;return Rt&&vt["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&S(Q,n.ownerDocument.doctype.name)&&(h="\n"+h),Nt&&p([gt,mt,yt],t=>{h=C(h,t," ")}),st&&Kt?st.createHTML(h):h},r.setConfig=function(){me(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),It=!0},r.clearConfig=function(){pe=null,It=!1},r.isValidAttribute=function(t,e,r){pe||me({});const n=de(t),i=de(e);return Te(n,i,r)},r.addHook=function(t,e){"function"==typeof e&&m(ft[t],e)},r.removeHook=function(t,e){if(void 0!==e){const r=f(ft[t],e);return-1===r?void 0:y(ft[t],r,1)[0]}return g(ft[t])},r.removeHooks=function(t){ft[t]=[]},r.removeAllHooks=function(){ft={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},r}()},29951:(t,e,r)=>{"use strict";r.d(e,{Fr:()=>c,GX:()=>l,KX:()=>s,WW:()=>a,ue:()=>i});var n=r(97485),i=(0,n.K2)(t=>{const{handDrawnSeed:e}=(0,n.D7)();return{fill:t,hachureAngle:120,hachureGap:4,fillWeight:2,roughness:.7,stroke:t,seed:e}},"solidStateFill"),a=(0,n.K2)(t=>{const e=o([...t.cssCompiledStyles||[],...t.cssStyles||[]]);return{stylesMap:e,stylesArray:[...e]}},"compileStyles"),o=(0,n.K2)(t=>{const e=new Map;return t.forEach(t=>{const[r,n]=t.split(":");e.set(r.trim(),n?.trim())}),e},"styles2Map"),s=(0,n.K2)(t=>"color"===t||"font-size"===t||"font-family"===t||"font-weight"===t||"font-style"===t||"text-decoration"===t||"text-align"===t||"text-transform"===t||"line-height"===t||"letter-spacing"===t||"word-spacing"===t||"text-shadow"===t||"text-overflow"===t||"white-space"===t||"word-wrap"===t||"word-break"===t||"overflow-wrap"===t||"hyphens"===t,"isLabelStyle"),l=(0,n.K2)(t=>{const{stylesArray:e}=a(t),r=[],n=[],i=[],o=[];return e.forEach(t=>{const e=t[0];s(e)?r.push(t.join(":")+" !important"):(n.push(t.join(":")+" !important"),e.includes("stroke")&&i.push(t.join(":")+" !important"),"fill"===e&&o.push(t.join(":")+" !important"))}),{labelStyles:r.join(";"),nodeStyles:n.join(";"),stylesArray:e,borderStyles:i,backgroundStyles:o}},"styles2String"),c=(0,n.K2)((t,e)=>{const{themeVariables:r,handDrawnSeed:i}=(0,n.D7)(),{nodeBorder:o,mainBkg:s}=r,{stylesMap:l}=a(t);return Object.assign({roughness:.7,fill:l.get("fill")||s,fillStyle:"hachure",fillWeight:4,hachureGap:5.2,stroke:l.get("stroke")||o,seed:i,strokeWidth:l.get("stroke-width")?.replace("px","")||1.3,fillLineDash:[0,0]},e)},"userNodeOverrides")},30150:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t,e){return function(r){return t(e(r))}}},30226:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=Function.prototype.toString;const i=function(t){if(null!=t){try{return n.call(t)}catch(e){}try{return t+""}catch(e){}}return""}},30256:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(53443),i=r(57454);const a=(0,n.A)(i.A,"Set")},30726:(t,e,r)=>{"use strict";function n(t,e,r){if(t&&t.length){const[n,i]=e,a=Math.PI/180*r,o=Math.cos(a),s=Math.sin(a);for(const e of t){const[t,r]=e;e[0]=(t-n)*o-(r-i)*s+n,e[1]=(t-n)*s+(r-i)*o+i}}}function i(t,e){return t[0]===e[0]&&t[1]===e[1]}function a(t,e,r,a=1){const o=r,s=Math.max(e,.1),l=t[0]&&t[0][0]&&"number"==typeof t[0][0]?[t]:t,c=[0,0];if(o)for(const i of l)n(i,c,o);const h=function(t,e,r){const n=[];for(const h of t){const t=[...h];i(t[0],t[t.length-1])||t.push([t[0][0],t[0][1]]),t.length>2&&n.push(t)}const a=[];e=Math.max(e,.1);const o=[];for(const i of n)for(let t=0;tt.ymine.ymin?1:t.xe.x?1:t.ymax===e.ymax?0:(t.ymax-e.ymax)/Math.abs(t.ymax-e.ymax)),!o.length)return a;let s=[],l=o[0].ymin,c=0;for(;s.length||o.length;){if(o.length){let t=-1;for(let e=0;el);e++)t=e;o.splice(0,t+1).forEach(t=>{s.push({s:l,edge:t})})}if(s=s.filter(t=>!(t.edge.ymax<=l)),s.sort((t,e)=>t.edge.x===e.edge.x?0:(t.edge.x-e.edge.x)/Math.abs(t.edge.x-e.edge.x)),(1!==r||c%e==0)&&s.length>1)for(let t=0;t=s.length)break;const r=s[t].edge,n=s[e].edge;a.push([[Math.round(r.x),l],[Math.round(n.x),l]])}l+=r,s.forEach(t=>{t.edge.x=t.edge.x+r*t.edge.islope}),c++}return a}(l,s,a);if(o){for(const t of l)n(t,c,-o);!function(t,e,r){const i=[];t.forEach(t=>i.push(...t)),n(i,e,r)}(h,c,-o)}return h}function o(t,e){var r;const n=e.hachureAngle+90;let i=e.hachureGap;i<0&&(i=4*e.strokeWidth),i=Math.round(Math.max(i,.1));let o=1;return e.roughness>=1&&((null===(r=e.randomizer)||void 0===r?void 0:r.next())||Math.random())>.7&&(o=i),a(t,i,n,o||1)}r.d(e,{A:()=>it});class s{constructor(t){this.helper=t}fillPolygons(t,e){return this._fillPolygons(t,e)}_fillPolygons(t,e){const r=o(t,e);return{type:"fillSketch",ops:this.renderLines(r,e)}}renderLines(t,e){const r=[];for(const n of t)r.push(...this.helper.doubleLineOps(n[0][0],n[0][1],n[1][0],n[1][1],e));return r}}function l(t){const e=t[0],r=t[1];return Math.sqrt(Math.pow(e[0]-r[0],2)+Math.pow(e[1]-r[1],2))}class c extends s{fillPolygons(t,e){let r=e.hachureGap;r<0&&(r=4*e.strokeWidth),r=Math.max(r,.1);const n=o(t,Object.assign({},e,{hachureGap:r})),i=Math.PI/180*e.hachureAngle,a=[],s=.5*r*Math.cos(i),c=.5*r*Math.sin(i);for(const[o,h]of n)l([o,h])&&a.push([[o[0]-s,o[1]+c],[...h]],[[o[0]+s,o[1]-c],[...h]]);return{type:"fillSketch",ops:this.renderLines(a,e)}}}class h extends s{fillPolygons(t,e){const r=this._fillPolygons(t,e),n=Object.assign({},e,{hachureAngle:e.hachureAngle+90}),i=this._fillPolygons(t,n);return r.ops=r.ops.concat(i.ops),r}}class u{constructor(t){this.helper=t}fillPolygons(t,e){const r=o(t,e=Object.assign({},e,{hachureAngle:0}));return this.dotsOnLines(r,e)}dotsOnLines(t,e){const r=[];let n=e.hachureGap;n<0&&(n=4*e.strokeWidth),n=Math.max(n,.1);let i=e.fillWeight;i<0&&(i=e.strokeWidth/2);const a=n/4;for(const o of t){const t=l(o),s=t/n,c=Math.ceil(s)-1,h=t-c*n,u=(o[0][0]+o[1][0])/2-n/4,d=Math.min(o[0][1],o[1][1]);for(let o=0;o{const a=l(t),o=Math.floor(a/(r+n)),s=(a+n-o*(r+n))/2;let c=t[0],h=t[1];c[0]>h[0]&&(c=t[1],h=t[0]);const u=Math.atan((h[1]-c[1])/(h[0]-c[0]));for(let l=0;l{const i=l(t),a=Math.round(i/(2*e));let o=t[0],s=t[1];o[0]>s[0]&&(o=t[1],s=t[0]);const c=Math.atan((s[1]-o[1])/(s[0]-o[0]));for(let l=0;ln%2?t+r:t+e);a.push({key:"C",data:t}),e=t[4],r=t[5];break}case"Q":a.push({key:"Q",data:[...s]}),e=s[2],r=s[3];break;case"q":{const t=s.map((t,n)=>n%2?t+r:t+e);a.push({key:"Q",data:t}),e=t[2],r=t[3];break}case"A":a.push({key:"A",data:[...s]}),e=s[5],r=s[6];break;case"a":e+=s[5],r+=s[6],a.push({key:"A",data:[s[0],s[1],s[2],s[3],s[4],e,r]});break;case"H":a.push({key:"H",data:[...s]}),e=s[0];break;case"h":e+=s[0],a.push({key:"H",data:[e]});break;case"V":a.push({key:"V",data:[...s]}),r=s[0];break;case"v":r+=s[0],a.push({key:"V",data:[r]});break;case"S":a.push({key:"S",data:[...s]}),e=s[2],r=s[3];break;case"s":{const t=s.map((t,n)=>n%2?t+r:t+e);a.push({key:"S",data:t}),e=t[2],r=t[3];break}case"T":a.push({key:"T",data:[...s]}),e=s[0],r=s[1];break;case"t":e+=s[0],r+=s[1],a.push({key:"T",data:[e,r]});break;case"Z":case"z":a.push({key:"Z",data:[]}),e=n,r=i}return a}function k(t){const e=[];let r="",n=0,i=0,a=0,o=0,s=0,l=0;for(const{key:c,data:h}of t){switch(c){case"M":e.push({key:"M",data:[...h]}),[n,i]=h,[a,o]=h;break;case"C":e.push({key:"C",data:[...h]}),n=h[4],i=h[5],s=h[2],l=h[3];break;case"L":e.push({key:"L",data:[...h]}),[n,i]=h;break;case"H":n=h[0],e.push({key:"L",data:[n,i]});break;case"V":i=h[0],e.push({key:"L",data:[n,i]});break;case"S":{let t=0,a=0;"C"===r||"S"===r?(t=n+(n-s),a=i+(i-l)):(t=n,a=i),e.push({key:"C",data:[t,a,...h]}),s=h[0],l=h[1],n=h[2],i=h[3];break}case"T":{const[t,a]=h;let o=0,c=0;"Q"===r||"T"===r?(o=n+(n-s),c=i+(i-l)):(o=n,c=i);const u=n+2*(o-n)/3,d=i+2*(c-i)/3,p=t+2*(o-t)/3,f=a+2*(c-a)/3;e.push({key:"C",data:[u,d,p,f,t,a]}),s=o,l=c,n=t,i=a;break}case"Q":{const[t,r,a,o]=h,c=n+2*(t-n)/3,u=i+2*(r-i)/3,d=a+2*(t-a)/3,p=o+2*(r-o)/3;e.push({key:"C",data:[c,u,d,p,a,o]}),s=t,l=r,n=a,i=o;break}case"A":{const t=Math.abs(h[0]),r=Math.abs(h[1]),a=h[2],o=h[3],s=h[4],l=h[5],c=h[6];0===t||0===r?(e.push({key:"C",data:[n,i,l,c,l,c]}),n=l,i=c):n===l&&i===c||(w(n,i,l,c,t,r,a,o,s).forEach(function(t){e.push({key:"C",data:t})}),n=l,i=c);break}case"Z":e.push({key:"Z",data:[]}),n=a,i=o}r=c}return e}function C(t,e,r){return[t*Math.cos(r)-e*Math.sin(r),t*Math.sin(r)+e*Math.cos(r)]}function w(t,e,r,n,i,a,o,s,l,c){const h=(u=o,Math.PI*u/180);var u;let d=[],p=0,f=0,g=0,m=0;if(c)[p,f,g,m]=c;else{[t,e]=C(t,e,-h),[r,n]=C(r,n,-h);const o=(t-r)/2,c=(e-n)/2;let u=o*o/(i*i)+c*c/(a*a);u>1&&(u=Math.sqrt(u),i*=u,a*=u);const d=i*i,y=a*a,x=d*y-d*c*c-y*o*o,b=d*c*c+y*o*o,k=(s===l?-1:1)*Math.sqrt(Math.abs(x/b));g=k*i*c/a+(t+r)/2,m=k*-a*o/i+(e+n)/2,p=Math.asin(parseFloat(((e-m)/a).toFixed(9))),f=Math.asin(parseFloat(((n-m)/a).toFixed(9))),tf&&(p-=2*Math.PI),!l&&f>p&&(f-=2*Math.PI)}let y=f-p;if(Math.abs(y)>120*Math.PI/180){const t=f,e=r,s=n;f=l&&f>p?p+120*Math.PI/180*1:p+120*Math.PI/180*-1,d=w(r=g+i*Math.cos(f),n=m+a*Math.sin(f),e,s,i,a,o,0,l,[f,t,g,m])}y=f-p;const x=Math.cos(p),b=Math.sin(p),k=Math.cos(f),_=Math.sin(f),v=Math.tan(y/4),S=4/3*i*v,A=4/3*a*v,T=[t,e],M=[t+S*b,e-A*x],B=[r+S*_,n-A*k],L=[r,n];if(M[0]=2*T[0]-M[0],M[1]=2*T[1]-M[1],c)return[M,B,L].concat(d);{d=[M,B,L].concat(d);const t=[];for(let e=0;e2){const i=[];for(let e=0;e2*Math.PI&&(p=0,f=2*Math.PI);const g=2*Math.PI/l.curveStepCount,m=Math.min(g/2,(f-p)/2),y=K(m,c,h,u,d,p,f,1,l);if(!l.disableMultiStroke){const t=K(m,c,h,u,d,p,f,1.5,l);y.push(...t)}return o&&(s?y.push(...R(c,h,c+u*Math.cos(p),h+d*Math.sin(p),l),...R(c,h,c+u*Math.cos(f),h+d*Math.sin(f),l)):y.push({op:"lineTo",data:[c,h]},{op:"lineTo",data:[c+u*Math.cos(p),h+d*Math.sin(p)]})),{type:"path",ops:y}}function L(t,e){const r=k(b(x(t))),n=[];let i=[0,0],a=[0,0];for(const{key:o,data:s}of r)switch(o){case"M":a=[s[0],s[1]],i=[s[0],s[1]];break;case"L":n.push(...R(a[0],a[1],s[0],s[1],e)),a=[s[0],s[1]];break;case"C":{const[t,r,i,o,l,c]=s;n.push(...q(t,r,i,o,l,c,a,e)),a=[l,c];break}case"Z":n.push(...R(a[0],a[1],i[0],i[1],e)),a=[i[0],i[1]]}return{type:"path",ops:n}}function F(t,e){const r=[];for(const n of t)if(n.length){const t=e.maxRandomnessOffset||0,i=n.length;if(i>2){r.push({op:"move",data:[n[0][0]+O(t,e),n[0][1]+O(t,e)]});for(let a=1;a500?.4:-.0016668*l+1.233334;let h=i.maxRandomnessOffset||0;h*h*100>s&&(h=l/10);const u=h/2,d=.2+.2*D(i);let p=i.bowing*i.maxRandomnessOffset*(n-e)/200,f=i.bowing*i.maxRandomnessOffset*(t-r)/200;p=O(p,i,c),f=O(f,i,c);const g=[],m=()=>O(u,i,c),y=()=>O(h,i,c),x=i.preserveVertices;return a&&(o?g.push({op:"move",data:[t+(x?0:m()),e+(x?0:m())]}):g.push({op:"move",data:[t+(x?0:O(h,i,c)),e+(x?0:O(h,i,c))]})),o?g.push({op:"bcurveTo",data:[p+t+(r-t)*d+m(),f+e+(n-e)*d+m(),p+t+2*(r-t)*d+m(),f+e+2*(n-e)*d+m(),r+(x?0:m()),n+(x?0:m())]}):g.push({op:"bcurveTo",data:[p+t+(r-t)*d+y(),f+e+(n-e)*d+y(),p+t+2*(r-t)*d+y(),f+e+2*(n-e)*d+y(),r+(x?0:y()),n+(x?0:y())]}),g}function j(t,e,r){if(!t.length)return[];const n=[];n.push([t[0][0]+O(e,r),t[0][1]+O(e,r)]),n.push([t[0][0]+O(e,r),t[0][1]+O(e,r)]);for(let i=1;i3){const a=[],o=1-r.curveTightness;i.push({op:"move",data:[t[1][0],t[1][1]]});for(let e=1;e+21&&i.push(r)):i.push(r),i.push(t[e+3])}else{const n=.5,a=t[e+0],o=t[e+1],s=t[e+2],l=t[e+3],c=G(a,o,n),h=G(o,s,n),u=G(s,l,n),d=G(c,h,n),p=G(h,u,n),f=G(d,p,n);X([a,c,d,f],0,r,i),X([f,p,u,l],0,r,i)}var a,o;return i}function V(t,e){return Z(t,0,t.length,e)}function Z(t,e,r,n,i){const a=i||[],o=t[e],s=t[r-1];let l=0,c=1;for(let h=e+1;hl&&(l=e,c=h)}return Math.sqrt(l)>n?(Z(t,e,c+1,n,a),Z(t,c,r,n,a)):(a.length||a.push(o),a.push(s)),a}function Q(t,e=.15,r){const n=[],i=(t.length-1)/3;for(let a=0;a0?Z(n,0,n.length,r):n}const J="none";class tt{constructor(t){this.defaultOptions={maxRandomnessOffset:2,roughness:1,bowing:1,stroke:"#000",strokeWidth:1,curveTightness:0,curveFitting:.95,curveStepCount:9,fillStyle:"hachure",fillWeight:-1,hachureAngle:-41,hachureGap:-1,dashOffset:-1,dashGap:-1,zigzagOffset:-1,seed:0,disableMultiStroke:!1,disableMultiStrokeFill:!1,preserveVertices:!1,fillShapeRoughnessGain:.8},this.config=t||{},this.config.options&&(this.defaultOptions=this._o(this.config.options))}static newSeed(){return Math.floor(Math.random()*2**31)}_o(t){return t?Object.assign({},this.defaultOptions,t):this.defaultOptions}_d(t,e,r){return{shape:t,sets:e||[],options:r||this.defaultOptions}}line(t,e,r,n,i){const a=this._o(i);return this._d("line",[v(t,e,r,n,a)],a)}rectangle(t,e,r,n,i){const a=this._o(i),o=[],s=function(t,e,r,n,i){return function(t,e){return S(t,!0,e)}([[t,e],[t+r,e],[t+r,e+n],[t,e+n]],i)}(t,e,r,n,a);if(a.fill){const i=[[t,e],[t+r,e],[t+r,e+n],[t,e+n]];"solid"===a.fillStyle?o.push(F([i],a)):o.push($([i],a))}return a.stroke!==J&&o.push(s),this._d("rectangle",o,a)}ellipse(t,e,r,n,i){const a=this._o(i),o=[],s=T(r,n,a),l=M(t,e,a,s);if(a.fill)if("solid"===a.fillStyle){const r=M(t,e,a,s).opset;r.type="fillPath",o.push(r)}else o.push($([l.estimatedPoints],a));return a.stroke!==J&&o.push(l.opset),this._d("ellipse",o,a)}circle(t,e,r,n){const i=this.ellipse(t,e,r,r,n);return i.shape="circle",i}linearPath(t,e){const r=this._o(e);return this._d("linearPath",[S(t,!1,r)],r)}arc(t,e,r,n,i,a,o=!1,s){const l=this._o(s),c=[],h=B(t,e,r,n,i,a,o,!0,l);if(o&&l.fill)if("solid"===l.fillStyle){const o=Object.assign({},l);o.disableMultiStroke=!0;const s=B(t,e,r,n,i,a,!0,!1,o);s.type="fillPath",c.push(s)}else c.push(function(t,e,r,n,i,a,o){const s=t,l=e;let c=Math.abs(r/2),h=Math.abs(n/2);c+=O(.01*c,o),h+=O(.01*h,o);let u=i,d=a;for(;u<0;)u+=2*Math.PI,d+=2*Math.PI;d-u>2*Math.PI&&(u=0,d=2*Math.PI);const p=(d-u)/o.curveStepCount,f=[];for(let g=u;g<=d;g+=p)f.push([s+c*Math.cos(g),l+h*Math.sin(g)]);return f.push([s+c*Math.cos(d),l+h*Math.sin(d)]),f.push([s,l]),$([f],o)}(t,e,r,n,i,a,l));return l.stroke!==J&&c.push(h),this._d("arc",c,l)}curve(t,e){const r=this._o(e),n=[],i=A(t,r);if(r.fill&&r.fill!==J)if("solid"===r.fillStyle){const e=A(t,Object.assign(Object.assign({},r),{disableMultiStroke:!0,roughness:r.roughness?r.roughness+r.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(e.ops)})}else{const e=[],i=t;if(i.length){const t="number"==typeof i[0][0]?[i]:i;for(const n of t)n.length<3?e.push(...n):3===n.length?e.push(...Q(H([n[0],n[0],n[1],n[2]]),10,(1+r.roughness)/2)):e.push(...Q(H(n),10,(1+r.roughness)/2))}e.length&&n.push($([e],r))}return r.stroke!==J&&n.push(i),this._d("curve",n,r)}polygon(t,e){const r=this._o(e),n=[],i=S(t,!0,r);return r.fill&&("solid"===r.fillStyle?n.push(F([t],r)):n.push($([t],r))),r.stroke!==J&&n.push(i),this._d("polygon",n,r)}path(t,e){const r=this._o(e),n=[];if(!t)return this._d("path",n,r);t=(t||"").replace(/\n/g," ").replace(/(-\s)/g,"-").replace("/(ss)/g"," ");const i=r.fill&&"transparent"!==r.fill&&r.fill!==J,a=r.stroke!==J,o=!!(r.simplification&&r.simplification<1),s=function(t,e,r){const n=k(b(x(t))),i=[];let a=[],o=[0,0],s=[];const l=()=>{s.length>=4&&a.push(...Q(s,1)),s=[]},c=()=>{l(),a.length&&(i.push(a),a=[])};for(const{key:u,data:d}of n)switch(u){case"M":c(),o=[d[0],d[1]],a.push(o);break;case"L":l(),a.push([d[0],d[1]]);break;case"C":if(!s.length){const t=a.length?a[a.length-1]:o;s.push([t[0],t[1]])}s.push([d[0],d[1]]),s.push([d[2],d[3]]),s.push([d[4],d[5]]);break;case"Z":l(),a.push([o[0],o[1]])}if(c(),!r)return i;const h=[];for(const u of i){const t=V(u,r);t.length&&h.push(t)}return h}(t,0,o?4-4*(r.simplification||1):(1+r.roughness)/2),l=L(t,r);if(i)if("solid"===r.fillStyle)if(1===s.length){const e=L(t,Object.assign(Object.assign({},r),{disableMultiStroke:!0,roughness:r.roughness?r.roughness+r.fillShapeRoughnessGain:0}));n.push({type:"fillPath",ops:this._mergedShape(e.ops)})}else n.push(F(s,r));else n.push($(s,r));return a&&(o?s.forEach(t=>{n.push(S(t,!1,r))}):n.push(l)),this._d("path",n,r)}opsToPath(t,e){let r="";for(const n of t.ops){const t="number"==typeof e&&e>=0?n.data.map(t=>+t.toFixed(e)):n.data;switch(n.op){case"move":r+=`M${t[0]} ${t[1]} `;break;case"bcurveTo":r+=`C${t[0]} ${t[1]}, ${t[2]} ${t[3]}, ${t[4]} ${t[5]} `;break;case"lineTo":r+=`L${t[0]} ${t[1]} `}}return r.trim()}toPaths(t){const e=t.sets||[],r=t.options||this.defaultOptions,n=[];for(const i of e){let t=null;switch(i.type){case"path":t={d:this.opsToPath(i),stroke:r.stroke,strokeWidth:r.strokeWidth,fill:J};break;case"fillPath":t={d:this.opsToPath(i),stroke:J,strokeWidth:0,fill:r.fill||J};break;case"fillSketch":t=this.fillSketch(i,r)}t&&n.push(t)}return n}fillSketch(t,e){let r=e.fillWeight;return r<0&&(r=e.strokeWidth/2),{d:this.opsToPath(t),stroke:e.fill||J,strokeWidth:r,fill:J}}_mergedShape(t){return t.filter((t,e)=>0===e||"move"!==t.op)}}class et{constructor(t,e){this.canvas=t,this.ctx=this.canvas.getContext("2d"),this.gen=new tt(e)}draw(t){const e=t.sets||[],r=t.options||this.getDefaultOptions(),n=this.ctx,i=t.options.fixedDecimalPlaceDigits;for(const a of e)switch(a.type){case"path":n.save(),n.strokeStyle="none"===r.stroke?"transparent":r.stroke,n.lineWidth=r.strokeWidth,r.strokeLineDash&&n.setLineDash(r.strokeLineDash),r.strokeLineDashOffset&&(n.lineDashOffset=r.strokeLineDashOffset),this._drawToContext(n,a,i),n.restore();break;case"fillPath":{n.save(),n.fillStyle=r.fill||"";const e="curve"===t.shape||"polygon"===t.shape||"path"===t.shape?"evenodd":"nonzero";this._drawToContext(n,a,i,e),n.restore();break}case"fillSketch":this.fillSketch(n,a,r)}}fillSketch(t,e,r){let n=r.fillWeight;n<0&&(n=r.strokeWidth/2),t.save(),r.fillLineDash&&t.setLineDash(r.fillLineDash),r.fillLineDashOffset&&(t.lineDashOffset=r.fillLineDashOffset),t.strokeStyle=r.fill||"",t.lineWidth=n,this._drawToContext(t,e,r.fixedDecimalPlaceDigits),t.restore()}_drawToContext(t,e,r,n="nonzero"){t.beginPath();for(const i of e.ops){const e="number"==typeof r&&r>=0?i.data.map(t=>+t.toFixed(r)):i.data;switch(i.op){case"move":t.moveTo(e[0],e[1]);break;case"bcurveTo":t.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]);break;case"lineTo":t.lineTo(e[0],e[1])}}"fillPath"===e.type?t.fill(n):t.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(t,e,r,n,i){const a=this.gen.line(t,e,r,n,i);return this.draw(a),a}rectangle(t,e,r,n,i){const a=this.gen.rectangle(t,e,r,n,i);return this.draw(a),a}ellipse(t,e,r,n,i){const a=this.gen.ellipse(t,e,r,n,i);return this.draw(a),a}circle(t,e,r,n){const i=this.gen.circle(t,e,r,n);return this.draw(i),i}linearPath(t,e){const r=this.gen.linearPath(t,e);return this.draw(r),r}polygon(t,e){const r=this.gen.polygon(t,e);return this.draw(r),r}arc(t,e,r,n,i,a,o=!1,s){const l=this.gen.arc(t,e,r,n,i,a,o,s);return this.draw(l),l}curve(t,e){const r=this.gen.curve(t,e);return this.draw(r),r}path(t,e){const r=this.gen.path(t,e);return this.draw(r),r}}const rt="http://www.w3.org/2000/svg";class nt{constructor(t,e){this.svg=t,this.gen=new tt(e)}draw(t){const e=t.sets||[],r=t.options||this.getDefaultOptions(),n=this.svg.ownerDocument||window.document,i=n.createElementNS(rt,"g"),a=t.options.fixedDecimalPlaceDigits;for(const o of e){let e=null;switch(o.type){case"path":e=n.createElementNS(rt,"path"),e.setAttribute("d",this.opsToPath(o,a)),e.setAttribute("stroke",r.stroke),e.setAttribute("stroke-width",r.strokeWidth+""),e.setAttribute("fill","none"),r.strokeLineDash&&e.setAttribute("stroke-dasharray",r.strokeLineDash.join(" ").trim()),r.strokeLineDashOffset&&e.setAttribute("stroke-dashoffset",`${r.strokeLineDashOffset}`);break;case"fillPath":e=n.createElementNS(rt,"path"),e.setAttribute("d",this.opsToPath(o,a)),e.setAttribute("stroke","none"),e.setAttribute("stroke-width","0"),e.setAttribute("fill",r.fill||""),"curve"!==t.shape&&"polygon"!==t.shape||e.setAttribute("fill-rule","evenodd");break;case"fillSketch":e=this.fillSketch(n,o,r)}e&&i.appendChild(e)}return i}fillSketch(t,e,r){let n=r.fillWeight;n<0&&(n=r.strokeWidth/2);const i=t.createElementNS(rt,"path");return i.setAttribute("d",this.opsToPath(e,r.fixedDecimalPlaceDigits)),i.setAttribute("stroke",r.fill||""),i.setAttribute("stroke-width",n+""),i.setAttribute("fill","none"),r.fillLineDash&&i.setAttribute("stroke-dasharray",r.fillLineDash.join(" ").trim()),r.fillLineDashOffset&&i.setAttribute("stroke-dashoffset",`${r.fillLineDashOffset}`),i}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(t,e){return this.gen.opsToPath(t,e)}line(t,e,r,n,i){const a=this.gen.line(t,e,r,n,i);return this.draw(a)}rectangle(t,e,r,n,i){const a=this.gen.rectangle(t,e,r,n,i);return this.draw(a)}ellipse(t,e,r,n,i){const a=this.gen.ellipse(t,e,r,n,i);return this.draw(a)}circle(t,e,r,n){const i=this.gen.circle(t,e,r,n);return this.draw(i)}linearPath(t,e){const r=this.gen.linearPath(t,e);return this.draw(r)}polygon(t,e){const r=this.gen.polygon(t,e);return this.draw(r)}arc(t,e,r,n,i,a,o=!1,s){const l=this.gen.arc(t,e,r,n,i,a,o,s);return this.draw(l)}curve(t,e){const r=this.gen.curve(t,e);return this.draw(r)}path(t,e){const r=this.gen.path(t,e);return this.draw(r)}}var it={canvas:(t,e)=>new et(t,e),svg:(t,e)=>new nt(t,e),generator:t=>new tt(t),newSeed:()=>tt.newSeed()}},30941:(t,e,r)=>{"use strict";r.d(e,{A:()=>s});var n=r(46554),i=r(68676),a=r(55385),o=r(21763);const s=(t,e,r=0,s=1)=>{if("number"!=typeof t)return(0,o.A)(t,{a:e});const l=i.A.set({r:n.A.channel.clamp.r(t),g:n.A.channel.clamp.g(e),b:n.A.channel.clamp.b(r),a:n.A.channel.clamp.a(s)});return a.A.stringify(l)}},31156:(t,e,r)=>{"use strict";r.d(e,{A:()=>$n});var n=r(36672),i=r(65404),a=r(33412),o=r(64407),s=r(13526),l=r(43062),c=r(67797);function h(){const{prism:t}=(0,c.p)(),{colorMode:e}=(0,l.G)(),r=t.theme,n=t.darkTheme||r;return"dark"===e?n:r}var u=r(84862),d=r(34809),p=r.n(d),f=r(92471),g=r(23420);const m=/title=(?["'])(?.*?)\1/,y=/\{(?<range>[\d,-]+)\}/,x={js:{start:"\\/\\/",end:""},jsBlock:{start:"\\/\\*",end:"\\*\\/"},jsx:{start:"\\{\\s*\\/\\*",end:"\\*\\/\\s*\\}"},bash:{start:"#",end:""},html:{start:"\x3c!--",end:"--\x3e"}},b={...x,lua:{start:"--",end:""},wasm:{start:"\\;\\;",end:""},tex:{start:"%",end:""},vb:{start:"['\u2018\u2019]",end:""},vbnet:{start:"(?:_\\s*)?['\u2018\u2019]",end:""},rem:{start:"[Rr][Ee][Mm]\\b",end:""},f90:{start:"!",end:""},ml:{start:"\\(\\*",end:"\\*\\)"},cobol:{start:"\\*>",end:""}},k=Object.keys(x);function C(t,e){const r=t.map(t=>{const{start:r,end:n}=b[t];return`(?:${r}\\s*(${e.flatMap(t=>[t.line,t.block?.start,t.block?.end].filter(Boolean)).join("|")})\\s*${n})`}).join("|");return new RegExp(`^\\s*(?:${r})\\s*$`)}function w({showLineNumbers:t,metastring:e}){return"boolean"==typeof t?t?1:void 0:"number"==typeof t?t:function(t){const e=t?.split(" ").find(t=>t.startsWith("showLineNumbers"));if(e){if(e.startsWith("showLineNumbers=")){const t=e.replace("showLineNumbers=","");return parseInt(t,10)}return 1}}(e)}function _(t,e){const{language:r,magicComments:n}=e;if(void 0===r)return{lineClassNames:{},code:t};const i=function(t,e){switch(t){case"js":case"javascript":case"ts":case"typescript":return C(["js","jsBlock"],e);case"jsx":case"tsx":return C(["js","jsBlock","jsx"],e);case"html":return C(["js","jsBlock","html"],e);case"python":case"py":case"bash":return C(["bash"],e);case"markdown":case"md":return C(["html","jsx","bash"],e);case"tex":case"latex":case"matlab":return C(["tex"],e);case"lua":case"haskell":return C(["lua"],e);case"sql":return C(["lua","jsBlock"],e);case"wasm":return C(["wasm"],e);case"vb":case"vba":case"visual-basic":return C(["vb","rem"],e);case"vbnet":return C(["vbnet","rem"],e);case"batch":return C(["rem"],e);case"basic":return C(["rem","f90"],e);case"fsharp":return C(["js","ml"],e);case"ocaml":case"sml":return C(["ml"],e);case"fortran":return C(["f90"],e);case"cobol":return C(["cobol"],e);default:return C(k,e)}}(r,n),a=t.split(/\r?\n/),o=Object.fromEntries(n.map(t=>[t.className,{start:0,range:""}])),s=Object.fromEntries(n.filter(t=>t.line).map(({className:t,line:e})=>[e,t])),l=Object.fromEntries(n.filter(t=>t.block).map(({className:t,block:e})=>[e.start,t])),c=Object.fromEntries(n.filter(t=>t.block).map(({className:t,block:e})=>[e.end,t]));for(let u=0;u<a.length;){const t=a[u].match(i);if(!t){u+=1;continue}const e=t.slice(1).find(t=>void 0!==t);s[e]?o[s[e]].range+=`${u},`:l[e]?o[l[e]].start=u:c[e]&&(o[c[e]].range+=`${o[c[e]].start}-${u-1},`),a.splice(u,1)}const h={};return Object.entries(o).forEach(([t,{range:e}])=>{p()(e).forEach(e=>{h[e]??=[],h[e].push(t)})}),{code:a.join("\n"),lineClassNames:h}}function v(t,e){const r=t.replace(/\r?\n$/,"");return function(t,{metastring:e,magicComments:r}){if(e&&y.test(e)){const n=e.match(y).groups.range;if(0===r.length)throw new Error(`A highlight range has been given in code block's metastring (\`\`\` ${e}), but no magic comment config is available. Docusaurus applies the first magic comment entry's className for metastring ranges.`);const i=r[0].className,a=p()(n).filter(t=>t>0).map(t=>[t-1,[i]]);return{lineClassNames:Object.fromEntries(a),code:t}}return null}(r,{...e})??_(r,{...e})}function S(t){const e=function(t){return e=t.language??function(t){if(!t)return;const e=t.split(" ").find(t=>t.startsWith("language-"));return e?.replace(/language-/,"")}(t.className)??t.defaultLanguage,e?.toLowerCase()??"text";var e}({language:t.language,defaultLanguage:t.defaultLanguage,className:t.className}),{lineClassNames:r,code:n}=v(t.code,{metastring:t.metastring,magicComments:t.magicComments,language:e}),i=function({className:t,language:e}){return(0,s.A)(t,e&&!t?.includes(`language-${e}`)&&`language-${e}`)}({className:t.className,language:e}),a=(o=t.metastring,(o?.match(m)?.groups.title??"")||t.title);var o;const l=w({showLineNumbers:t.showLineNumbers,metastring:t.metastring});return{codeInput:t.code,code:n,className:i,language:e,title:a,lineNumbersStart:l,lineClassNames:r}}const A=(0,n.createContext)(null);function T({metadata:t,wordWrap:e,children:r}){const i=(0,n.useMemo)(()=>({metadata:t,wordWrap:e}),[t,e]);return(0,g.jsx)(A.Provider,{value:i,children:r})}function M(){const t=(0,n.useContext)(A);if(null===t)throw new f.dV("CodeBlockContextProvider");return t}const B="codeBlockContainer_tyQ7";function L({as:t,...e}){const r=function(t){const e={color:"--prism-color",backgroundColor:"--prism-background-color"},r={};return Object.entries(t.plain).forEach(([t,n])=>{const i=e[t];i&&"string"==typeof n&&(r[i]=n)}),r}(h());return(0,g.jsx)(t,{...e,style:r,className:(0,s.A)(e.className,B,u.G.common.codeBlock)})}const F="codeBlock__bzz",$="codeBlockStandalone_Z1WV",E="codeBlockLines_b1Li",D="codeBlockLinesWithNumbering_lTB5";function N({children:t,className:e}){return(0,g.jsx)(L,{as:"pre",tabIndex:0,className:(0,s.A)($,"thin-scrollbar",e),children:(0,g.jsx)("code",{className:E,children:t})})}const O={attributes:!0,characterData:!0,childList:!0,subtree:!0};function R(t,e){const[r,i]=(0,n.useState)(),a=(0,n.useCallback)(()=>{i(t.current?.closest("[role=tabpanel][hidden]"))},[t,i]);(0,n.useEffect)(()=>{a()},[a]),function(t,e,r=O){const i=(0,f._q)(e),a=(0,f.Be)(r);(0,n.useEffect)(()=>{const e=new MutationObserver(i);return t&&e.observe(t,a),()=>e.disconnect()},[t,i,a])}(r,t=>{t.forEach(t=>{"attributes"===t.type&&"hidden"===t.attributeName&&(e(),a())})},{attributes:!0,characterData:!1,childList:!1,subtree:!1})}function I({children:t}){return t}var j=r(3416);function z({line:t,token:e,...r}){return(0,g.jsx)("span",{...r})}const P="codeLine_p4HS",K="codeLineNumber_o6ZJ",q="codeLineContent_Z4Pr";function W({line:t,classNames:e,showLineNumbers:r,getLineProps:n,getTokenProps:i}){const a=function(t){const e=1===t.length&&"\n"===t[0].content?t[0]:void 0;return e?[{...e,content:""}]:t}(t),o=n({line:a,className:(0,s.A)(e,r&&P)}),l=a.map((t,e)=>{const r=i({token:t});return(0,g.jsx)(z,{...r,line:a,token:t,children:r.children},e)});return(0,g.jsxs)("span",{...o,children:[r?(0,g.jsxs)(g.Fragment,{children:[(0,g.jsx)("span",{className:K}),(0,g.jsx)("span",{className:q,children:l})]}):l,(0,g.jsx)("br",{})]})}const H=n.forwardRef((t,e)=>(0,g.jsx)("pre",{ref:e,tabIndex:0,...t,className:(0,s.A)(t.className,F,"thin-scrollbar")}));function U(t){const{metadata:e}=M();return(0,g.jsx)("code",{...t,className:(0,s.A)(t.className,E,void 0!==e.lineNumbersStart&&D),style:{...t.style,counterReset:void 0===e.lineNumbersStart?void 0:"line-count "+(e.lineNumbersStart-1)}})}function Y({className:t}){const{metadata:e,wordWrap:r}=M(),n=h(),{code:i,language:a,lineNumbersStart:o,lineClassNames:l}=e;return(0,g.jsx)(j.f4,{theme:n,code:i,language:a,children:({className:e,style:n,tokens:i,getLineProps:a,getTokenProps:c})=>(0,g.jsx)(H,{ref:r.codeBlockRef,className:(0,s.A)(t,e),style:n,children:(0,g.jsx)(U,{children:i.map((t,e)=>(0,g.jsx)(W,{line:t,getLineProps:a,getTokenProps:c,classNames:l[e],showLineNumbers:void 0!==o},e))})})})}function G({children:t,fallback:e}){return(0,o.A)()?(0,g.jsx)(g.Fragment,{children:t?.()}):e??null}var X=r(53499);function V({className:t,...e}){return(0,g.jsx)("button",{type:"button",...e,className:(0,s.A)("clean-btn",t)})}function Z(t){return(0,g.jsx)("svg",{viewBox:"0 0 24 24",...t,children:(0,g.jsx)("path",{fill:"currentColor",d:"M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"})})}function Q(t){return(0,g.jsx)("svg",{viewBox:"0 0 24 24",...t,children:(0,g.jsx)("path",{fill:"currentColor",d:"M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"})})}const J={copyButtonCopied:"copyButtonCopied_lzuF",copyButtonIcons:"copyButtonIcons_Vzzk",copyButtonIcon:"copyButtonIcon_yGyI",copyButtonSuccessIcon:"copyButtonSuccessIcon_Vqwn"};function tt(t){return t?(0,X.T)({id:"theme.CodeBlock.copied",message:"Copied",description:"The copied button label on code blocks"}):(0,X.T)({id:"theme.CodeBlock.copyButtonAriaLabel",message:"Copy code to clipboard",description:"The ARIA label for copy code blocks button"})}function et(){const{metadata:{code:t}}=M(),[e,r]=(0,n.useState)(!1),i=(0,n.useRef)(void 0),a=(0,n.useCallback)(()=>{!function(t,{target:e=document.body}={}){if("string"!=typeof t)throw new TypeError(`Expected parameter \`text\` to be a \`string\`, got \`${typeof t}\`.`);const r=document.createElement("textarea"),n=document.activeElement;r.value=t,r.setAttribute("readonly",""),r.style.contain="strict",r.style.position="absolute",r.style.left="-9999px",r.style.fontSize="12pt";const i=document.getSelection(),a=i.rangeCount>0&&i.getRangeAt(0);e.append(r),r.select(),r.selectionStart=0,r.selectionEnd=t.length;let o=!1;try{o=document.execCommand("copy")}catch{}r.remove(),a&&(i.removeAllRanges(),i.addRange(a)),n&&n.focus()}(t),r(!0),i.current=window.setTimeout(()=>{r(!1)},1e3)},[t]);return(0,n.useEffect)(()=>()=>window.clearTimeout(i.current),[]),{copyCode:a,isCopied:e}}function rt({className:t}){const{copyCode:e,isCopied:r}=et();return(0,g.jsx)(V,{"aria-label":tt(r),title:(0,X.T)({id:"theme.CodeBlock.copy",message:"Copy",description:"The copy button label on code blocks"}),className:(0,s.A)(t,J.copyButton,r&&J.copyButtonCopied),onClick:e,children:(0,g.jsxs)("span",{className:J.copyButtonIcons,"aria-hidden":"true",children:[(0,g.jsx)(Z,{className:J.copyButtonIcon}),(0,g.jsx)(Q,{className:J.copyButtonSuccessIcon})]})})}function nt(t){return(0,g.jsx)("svg",{viewBox:"0 0 24 24",...t,children:(0,g.jsx)("path",{fill:"currentColor",d:"M4 19h6v-2H4v2zM20 5H4v2h16V5zm-3 6H4v2h13.25c1.1 0 2 .9 2 2s-.9 2-2 2H15v-2l-3 3l3 3v-2h2c2.21 0 4-1.79 4-4s-1.79-4-4-4z"})})}const it="wordWrapButtonIcon_evTN",at="wordWrapButtonEnabled_Aice";function ot({className:t}){const{wordWrap:e}=M();if(!(e.isEnabled||e.isCodeScrollable))return!1;const r=(0,X.T)({id:"theme.CodeBlock.wordWrapToggle",message:"Toggle word wrap",description:"The title attribute for toggle word wrapping button of code block lines"});return(0,g.jsx)(V,{onClick:()=>e.toggle(),className:(0,s.A)(t,e.isEnabled&&at),"aria-label":r,title:r,children:(0,g.jsx)(nt,{className:it,"aria-hidden":"true"})})}const st="buttonGroup_uSbf";function lt({className:t}){return(0,g.jsx)(G,{children:()=>(0,g.jsxs)("div",{className:(0,s.A)(t,st),children:[(0,g.jsx)(ot,{}),(0,g.jsx)(rt,{})]})})}const ct="codeBlockContent_nOVm",ht="codeBlockTitle_rVa_";function ut({className:t}){const{metadata:e}=M();return(0,g.jsxs)(L,{as:"div",className:(0,s.A)(t,e.className),children:[e.title&&(0,g.jsx)("div",{className:ht,children:(0,g.jsx)(I,{children:e.title})}),(0,g.jsxs)("div",{className:ct,children:[(0,g.jsx)(Y,{}),(0,g.jsx)(lt,{})]})]})}function dt(t){const e=function(t){const{prism:e}=(0,c.p)();return S({code:t.children,className:t.className,metastring:t.metastring,magicComments:e.magicComments,defaultLanguage:e.defaultLanguage,language:t.language,title:t.title,showLineNumbers:t.showLineNumbers})}(t),r=function(){const[t,e]=(0,n.useState)(!1),[r,i]=(0,n.useState)(!1),a=(0,n.useRef)(null),o=(0,n.useCallback)(()=>{const r=a.current.querySelector("code");t?r.removeAttribute("style"):(r.style.whiteSpace="pre-wrap",r.style.overflowWrap="anywhere"),e(t=>!t)},[a,t]),s=(0,n.useCallback)(()=>{const{scrollWidth:t,clientWidth:e}=a.current,r=t>e||a.current.querySelector("code").hasAttribute("style");i(r)},[a]);return R(a,s),(0,n.useEffect)(()=>{s()},[t,s]),(0,n.useEffect)(()=>(window.addEventListener("resize",s,{passive:!0}),()=>{window.removeEventListener("resize",s)}),[s]),{codeBlockRef:a,isEnabled:t,isCodeScrollable:r,toggle:o}}();return(0,g.jsx)(T,{metadata:e,wordWrap:r,children:(0,g.jsx)(ut,{})})}function pt({children:t,...e}){const r=(0,o.A)(),i=function(t){return n.Children.toArray(t).some(t=>(0,n.isValidElement)(t))?t:Array.isArray(t)?t.join(""):t}(t),a="string"==typeof i?dt:N;return(0,g.jsx)(a,{...e,children:i},String(r))}function ft(t){return(0,g.jsx)("code",{...t})}var gt=r(75150);var mt=r(92573),yt=r(90317);const xt="details_FSmu",bt="isBrowser_iXC9",kt="collapsibleContent_uSUc";function Ct(t){return!!t&&("SUMMARY"===t.tagName||Ct(t.parentElement))}function wt(t,e){return!!t&&(t===e||wt(t.parentElement,e))}function _t({summary:t,children:e,...r}){(0,mt.A)().collectAnchor(r.id);const i=(0,o.A)(),a=(0,n.useRef)(null),{collapsed:l,setCollapsed:c}=(0,yt.u)({initialState:!r.open}),[h,u]=(0,n.useState)(r.open),d=n.isValidElement(t)?t:(0,g.jsx)("summary",{children:t??"Details"});return(0,g.jsxs)("details",{...r,ref:a,open:h,"data-collapsed":l,className:(0,s.A)(xt,i&&bt,r.className),onMouseDown:t=>{Ct(t.target)&&t.detail>1&&t.preventDefault()},onClick:t=>{t.stopPropagation();const e=t.target;Ct(e)&&wt(e,a.current)&&(t.preventDefault(),l?(c(!1),u(!0)):c(!0))},children:[d,(0,g.jsx)(yt.N,{lazy:!1,collapsed:l,onCollapseTransitionEnd:t=>{c(t),u(!t)},children:(0,g.jsx)("div",{className:kt,children:e})})]})}const vt="details_seRW";function St({...t}){return(0,g.jsx)(_t,{...t,className:(0,s.A)("alert alert--info",vt,t.className)})}function At(t){const e=n.Children.toArray(t.children),r=e.find(t=>n.isValidElement(t)&&"summary"===t.type),i=(0,g.jsx)(g.Fragment,{children:e.filter(t=>t!==r)});return(0,g.jsx)(St,{...t,summary:r,children:i})}var Tt=r(33555);function Mt(t){return(0,g.jsx)(Tt.A,{...t})}const Bt="containsTaskList_RROW";function Lt(t){if(void 0!==t)return(0,s.A)(t,t?.includes("contains-task-list")&&Bt)}const Ft="img_AUsV";var $t=r(67231),Et=r(51728),Dt=r(74306),Nt=r(89790),Ot=r(80284),Rt=(r(61923),r(290),r(49636),r(267),r(29951),r(63727)),It=r(9420),jt=r(84926),zt=r(47765),Pt=r(97485),Kt=r(86793),qt=r(3170),Wt="comm",Ht="rule",Ut="decl",Yt=Math.abs,Gt=String.fromCharCode;Object.assign;function Xt(t){return t.trim()}function Vt(t,e,r){return t.replace(e,r)}function Zt(t,e,r){return t.indexOf(e,r)}function Qt(t,e){return 0|t.charCodeAt(e)}function Jt(t,e,r){return t.slice(e,r)}function te(t){return t.length}function ee(t,e){return e.push(t),t}function re(t,e){for(var r="",n=0;n<t.length;n++)r+=e(t[n],n,t,e)||"";return r}function ne(t,e,r,n){switch(t.type){case"@layer":if(t.children.length)break;case"@import":case"@namespace":case Ut:return t.return=t.return||t.value;case Wt:return"";case"@keyframes":return t.return=t.value+"{"+re(t.children,n)+"}";case Ht:if(!te(t.value=t.props.join(",")))return""}return te(r=re(t.children,n))?t.return=t.value+"{"+r+"}":""}var ie=1,ae=1,oe=0,se=0,le=0,ce="";function he(t,e,r,n,i,a,o,s){return{value:t,root:e,parent:r,type:n,props:i,children:a,line:ie,column:ae,length:o,return:"",siblings:s}}function ue(){return le=se>0?Qt(ce,--se):0,ae--,10===le&&(ae=1,ie--),le}function de(){return le=se<oe?Qt(ce,se++):0,ae++,10===le&&(ae=1,ie++),le}function pe(){return Qt(ce,se)}function fe(){return se}function ge(t,e){return Jt(ce,t,e)}function me(t){switch(t){case 0:case 9:case 10:case 13:case 32:return 5;case 33:case 43:case 44:case 47:case 62:case 64:case 126:case 59:case 123:case 125:return 4;case 58:return 3;case 34:case 39:case 40:case 91:return 2;case 41:case 93:return 1}return 0}function ye(t){return ie=ae=1,oe=te(ce=t),se=0,[]}function xe(t){return ce="",t}function be(t){return Xt(ge(se-1,we(91===t?t+2:40===t?t+1:t)))}function ke(t){for(;(le=pe())&&le<33;)de();return me(t)>2||me(le)>3?"":" "}function Ce(t,e){for(;--e&&de()&&!(le<48||le>102||le>57&&le<65||le>70&&le<97););return ge(t,fe()+(e<6&&32==pe()&&32==de()))}function we(t){for(;de();)switch(le){case t:return se;case 34:case 39:34!==t&&39!==t&&we(le);break;case 40:41===t&&we(t);break;case 92:de()}return se}function _e(t,e){for(;de()&&t+le!==57&&(t+le!==84||47!==pe()););return"/*"+ge(e,se-1)+"*"+Gt(47===t?t:de())}function ve(t){for(;!me(pe());)de();return ge(t,se)}function Se(t){return xe(Ae("",null,null,null,[""],t=ye(t),0,[0],t))}function Ae(t,e,r,n,i,a,o,s,l){for(var c=0,h=0,u=o,d=0,p=0,f=0,g=1,m=1,y=1,x=0,b="",k=i,C=a,w=n,_=b;m;)switch(f=x,x=de()){case 40:if(108!=f&&58==Qt(_,u-1)){-1!=Zt(_+=Vt(be(x),"&","&\f"),"&\f",Yt(c?s[c-1]:0))&&(y=-1);break}case 34:case 39:case 91:_+=be(x);break;case 9:case 10:case 13:case 32:_+=ke(f);break;case 92:_+=Ce(fe()-1,7);continue;case 47:switch(pe()){case 42:case 47:ee(Me(_e(de(),fe()),e,r,l),l),5!=me(f||1)&&5!=me(pe()||1)||!te(_)||" "===Jt(_,-1,void 0)||(_+=" ");break;default:_+="/"}break;case 123*g:s[c++]=te(_)*y;case 125*g:case 59:case 0:switch(x){case 0:case 125:m=0;case 59+h:-1==y&&(_=Vt(_,/\f/g,"")),p>0&&(te(_)-u||0===g&&47===f)&&ee(p>32?Be(_+";",n,r,u-1,l):Be(Vt(_," ","")+";",n,r,u-2,l),l);break;case 59:_+=";";default:if(ee(w=Te(_,e,r,c,h,i,s,b,k=[],C=[],u,a),a),123===x)if(0===h)Ae(_,e,w,w,k,a,u,s,C);else{switch(d){case 99:if(110===Qt(_,3))break;case 108:if(97===Qt(_,2))break;default:h=0;case 100:case 109:case 115:}h?Ae(t,w,w,n&&ee(Te(t,w,w,0,0,i,s,b,i,k=[],u,C),C),i,C,u,s,n?k:C):Ae(_,w,w,w,[""],C,0,s,C)}}c=h=p=0,g=y=1,b=_="",u=o;break;case 58:u=1+te(_),p=f;default:if(g<1)if(123==x)--g;else if(125==x&&0==g++&&125==ue())continue;switch(_+=Gt(x),x*g){case 38:y=h>0?1:(_+="\f",-1);break;case 44:s[c++]=(te(_)-1)*y,y=1;break;case 64:45===pe()&&(_+=be(de())),d=pe(),h=u=te(b=_+=ve(fe())),x++;break;case 45:45===f&&2==te(_)&&(g=0)}}return a}function Te(t,e,r,n,i,a,o,s,l,c,h,u){for(var d=i-1,p=0===i?a:[""],f=function(t){return t.length}(p),g=0,m=0,y=0;g<n;++g)for(var x=0,b=Jt(t,d+1,d=Yt(m=o[g])),k=t;x<f;++x)(k=Xt(m>0?p[x]+" "+b:Vt(b,/&\f/g,p[x])))&&(l[y++]=k);return he(t,e,r,0===i?Ht:s,l,c,h,u)}function Me(t,e,r,n){return he(t,e,r,Wt,Gt(le),Jt(t,2,-2),0,n)}function Be(t,e,r,n,i){return he(t,e,r,Ut,Jt(t,0,n),Jt(t,n+1,-1),n,i)}var Le=r(28404),Fe=r(90570),$e={id:"c4",detector:(0,Pt.K2)(t=>/^\s*C4Context|C4Container|C4Component|C4Dynamic|C4Deployment/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(7339).then(r.bind(r,37339));return{id:"c4",diagram:t}},"loader")},Ee="flowchart",De={id:Ee,detector:(0,Pt.K2)((t,e)=>"dagre-wrapper"!==e?.flowchart?.defaultRenderer&&"elk"!==e?.flowchart?.defaultRenderer&&/^\s*graph/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(2570).then(r.bind(r,62570));return{id:Ee,diagram:t}},"loader")},Ne="flowchart-v2",Oe={id:Ne,detector:(0,Pt.K2)((t,e)=>"dagre-d3"!==e?.flowchart?.defaultRenderer&&("elk"===e?.flowchart?.defaultRenderer&&(e.layout="elk"),!(!/^\s*graph/.test(t)||"dagre-wrapper"!==e?.flowchart?.defaultRenderer)||/^\s*flowchart/.test(t)),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(2570).then(r.bind(r,62570));return{id:Ne,diagram:t}},"loader")},Re={id:"er",detector:(0,Pt.K2)(t=>/^\s*erDiagram/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(6767).then(r.bind(r,16767));return{id:"er",diagram:t}},"loader")},Ie="gitGraph",je={id:Ie,detector:(0,Pt.K2)(t=>/^\s*gitGraph/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(9339),r.e(5792)]).then(r.bind(r,75792));return{id:Ie,diagram:t}},"loader")},ze="gantt",Pe={id:ze,detector:(0,Pt.K2)(t=>/^\s*gantt/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(7720).then(r.bind(r,57720));return{id:ze,diagram:t}},"loader")},Ke="info",qe={id:Ke,detector:(0,Pt.K2)(t=>/^\s*info/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(9339),r.e(6508)]).then(r.bind(r,26508));return{id:Ke,diagram:t}},"loader")},We={id:"pie",detector:(0,Pt.K2)(t=>/^\s*pie/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(9339),r.e(5110)]).then(r.bind(r,5110));return{id:"pie",diagram:t}},"loader")},He="quadrantChart",Ue={id:He,detector:(0,Pt.K2)(t=>/^\s*quadrantChart/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(7133).then(r.bind(r,94276));return{id:He,diagram:t}},"loader")},Ye="xychart",Ge={id:Ye,detector:(0,Pt.K2)(t=>/^\s*xychart-beta/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(299).then(r.bind(r,30299));return{id:Ye,diagram:t}},"loader")},Xe="requirement",Ve={id:Xe,detector:(0,Pt.K2)(t=>/^\s*requirement(Diagram)?/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(6192).then(r.bind(r,66192));return{id:Xe,diagram:t}},"loader")},Ze="sequence",Qe={id:Ze,detector:(0,Pt.K2)(t=>/^\s*sequenceDiagram/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(5493).then(r.bind(r,65493));return{id:Ze,diagram:t}},"loader")},Je="class",tr={id:Je,detector:(0,Pt.K2)((t,e)=>"dagre-wrapper"!==e?.class?.defaultRenderer&&/^\s*classDiagram/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(8479),r.e(9311)]).then(r.bind(r,29311));return{id:Je,diagram:t}},"loader")},er="classDiagram",rr={id:er,detector:(0,Pt.K2)((t,e)=>!(!/^\s*classDiagram/.test(t)||"dagre-wrapper"!==e?.class?.defaultRenderer)||/^\s*classDiagram-v2/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(8479),r.e(25)]).then(r.bind(r,10025));return{id:er,diagram:t}},"loader")},nr="state",ir={id:nr,detector:(0,Pt.K2)((t,e)=>"dagre-wrapper"!==e?.state?.defaultRenderer&&/^\s*stateDiagram/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(4326),r.e(1556),r.e(2129)]).then(r.bind(r,32129));return{id:nr,diagram:t}},"loader")},ar="stateDiagram",or={id:ar,detector:(0,Pt.K2)((t,e)=>!!/^\s*stateDiagram-v2/.test(t)||!(!/^\s*stateDiagram/.test(t)||"dagre-wrapper"!==e?.state?.defaultRenderer),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1556),r.e(1772)]).then(r.bind(r,1772));return{id:ar,diagram:t}},"loader")},sr="journey",lr={id:sr,detector:(0,Pt.K2)(t=>/^\s*journey/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(4078).then(r.bind(r,4078));return{id:sr,diagram:t}},"loader")},cr={draw:(0,Pt.K2)((t,e,r)=>{Pt.Rm.debug("rendering svg for syntax error\n");const n=(0,zt.D)(e),i=n.append("g");n.attr("viewBox","0 0 2412 512"),(0,Pt.a$)(n,100,512,!0),i.append("path").attr("class","error-icon").attr("d","m411.313,123.313c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32-9.375,9.375-20.688-20.688c-12.484-12.5-32.766-12.5-45.25,0l-16,16c-1.261,1.261-2.304,2.648-3.31,4.051-21.739-8.561-45.324-13.426-70.065-13.426-105.867,0-192,86.133-192,192s86.133,192 192,192 192-86.133 192-192c0-24.741-4.864-48.327-13.426-70.065 1.402-1.007 2.79-2.049 4.051-3.31l16-16c12.5-12.492 12.5-32.758 0-45.25l-20.688-20.688 9.375-9.375 32.001-31.999zm-219.313,100.687c-52.938,0-96,43.063-96,96 0,8.836-7.164,16-16,16s-16-7.164-16-16c0-70.578 57.422-128 128-128 8.836,0 16,7.164 16,16s-7.164,16-16,16z"),i.append("path").attr("class","error-icon").attr("d","m459.02,148.98c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l16,16c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16.001-16z"),i.append("path").attr("class","error-icon").attr("d","m340.395,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688 6.25-6.25 6.25-16.375 0-22.625l-16-16c-6.25-6.25-16.375-6.25-22.625,0s-6.25,16.375 0,22.625l15.999,16z"),i.append("path").attr("class","error-icon").attr("d","m400,64c8.844,0 16-7.164 16-16v-32c0-8.836-7.156-16-16-16-8.844,0-16,7.164-16,16v32c0,8.836 7.156,16 16,16z"),i.append("path").attr("class","error-icon").attr("d","m496,96.586h-32c-8.844,0-16,7.164-16,16 0,8.836 7.156,16 16,16h32c8.844,0 16-7.164 16-16 0-8.836-7.156-16-16-16z"),i.append("path").attr("class","error-icon").attr("d","m436.98,75.605c3.125,3.125 7.219,4.688 11.313,4.688 4.094,0 8.188-1.563 11.313-4.688l32-32c6.25-6.25 6.25-16.375 0-22.625s-16.375-6.25-22.625,0l-32,32c-6.251,6.25-6.251,16.375-0.001,22.625z"),i.append("text").attr("class","error-text").attr("x",1440).attr("y",250).attr("font-size","150px").style("text-anchor","middle").text("Syntax error in text"),i.append("text").attr("class","error-text").attr("x",1250).attr("y",400).attr("font-size","100px").style("text-anchor","middle").text(`mermaid version ${r}`)},"draw")},hr=cr,ur={db:{},renderer:cr,parser:{parse:(0,Pt.K2)(()=>{},"parse")}},dr="flowchart-elk",pr={id:dr,detector:(0,Pt.K2)((t,e={})=>!!(/^\s*flowchart-elk/.test(t)||/^\s*flowchart|graph/.test(t)&&"elk"===e?.flowchart?.defaultRenderer)&&(e.layout="elk",!0),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(2570).then(r.bind(r,62570));return{id:dr,diagram:t}},"loader")},fr="timeline",gr={id:fr,detector:(0,Pt.K2)(t=>/^\s*timeline/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(1937).then(r.bind(r,81937));return{id:fr,diagram:t}},"loader")},mr="mindmap",yr={id:mr,detector:(0,Pt.K2)(t=>/^\s*mindmap/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(9219),r.e(1853)]).then(r.bind(r,41853));return{id:mr,diagram:t}},"loader")},xr="kanban",br={id:xr,detector:(0,Pt.K2)(t=>/^\s*kanban/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(5932).then(r.bind(r,45932));return{id:xr,diagram:t}},"loader")},kr="sankey",Cr={id:kr,detector:(0,Pt.K2)(t=>/^\s*sankey-beta/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await r.e(756).then(r.bind(r,90756));return{id:kr,diagram:t}},"loader")},wr="packet",_r={id:wr,detector:(0,Pt.K2)(t=>/^\s*packet-beta/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(9339),r.e(5019)]).then(r.bind(r,45019));return{id:wr,diagram:t}},"loader")},vr="radar",Sr={id:vr,detector:(0,Pt.K2)(t=>/^\s*radar-beta/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(9339),r.e(248)]).then(r.bind(r,50248));return{id:vr,diagram:t}},"loader")},Ar="block",Tr={id:Ar,detector:(0,Pt.K2)(t=>/^\s*block-beta/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(713)]).then(r.bind(r,30713));return{id:Ar,diagram:t}},"loader")},Mr="architecture",Br={id:Mr,detector:(0,Pt.K2)(t=>/^\s*architecture/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(9339),r.e(9219),r.e(3346)]).then(r.bind(r,43346));return{id:Mr,diagram:t}},"loader")},Lr="treemap",Fr={id:Lr,detector:(0,Pt.K2)(t=>/^\s*treemap/.test(t),"detector"),loader:(0,Pt.K2)(async()=>{const{diagram:t}=await Promise.all([r.e(1874),r.e(9339),r.e(8998)]).then(r.bind(r,38998));return{id:Lr,diagram:t}},"loader")},$r=!1,Er=(0,Pt.K2)(()=>{$r||($r=!0,(0,Pt.Js)("error",ur,t=>"error"===t.toLowerCase().trim()),(0,Pt.Js)("---",{db:{clear:(0,Pt.K2)(()=>{},"clear")},styles:{},renderer:{draw:(0,Pt.K2)(()=>{},"draw")},parser:{parse:(0,Pt.K2)(()=>{throw new Error("Diagrams beginning with --- are not valid. If you were trying to use a YAML front-matter, please ensure that you've correctly opened and closed the YAML front-matter with un-indented `---` blocks")},"parse")},init:(0,Pt.K2)(()=>null,"init")},t=>t.toLowerCase().trimStart().startsWith("---")),(0,Pt.Xd)(pr,yr,Br),(0,Pt.Xd)($e,br,rr,tr,Re,Pe,qe,We,Ve,Qe,Oe,De,gr,je,or,ir,lr,Ue,Cr,_r,Ge,Tr,Sr,Fr))},"addDiagrams"),Dr=(0,Pt.K2)(async()=>{Pt.Rm.debug("Loading registered diagrams");const t=(await Promise.allSettled(Object.entries(Pt.mW).map(async([t,{detector:e,loader:r}])=>{if(r)try{(0,Pt.Gs)(t)}catch{try{const{diagram:t,id:n}=await r();(0,Pt.Js)(n,t,e)}catch(n){throw Pt.Rm.error(`Failed to load external diagram with key ${t}. Removing from detectors.`),delete Pt.mW[t],n}}}))).filter(t=>"rejected"===t.status);if(t.length>0){Pt.Rm.error(`Failed to load ${t.length} external diagrams`);for(const e of t)Pt.Rm.error(e);throw new Error(`Failed to load ${t.length} external diagrams`)}},"loadRegisteredDiagrams");function Nr(t,e){t.attr("role","graphics-document document"),""!==e&&t.attr("aria-roledescription",e)}function Or(t,e,r,n){if(void 0!==t.insert){if(r){const e=`chart-desc-${n}`;t.attr("aria-describedby",e),t.insert("desc",":first-child").attr("id",e).text(r)}if(e){const r=`chart-title-${n}`;t.attr("aria-labelledby",r),t.insert("title",":first-child").attr("id",r).text(e)}}}(0,Pt.K2)(Nr,"setA11yDiagramInfo"),(0,Pt.K2)(Or,"addSVGa11yTitleDescription");var Rr=class t{constructor(t,e,r,n,i){this.type=t,this.text=e,this.db=r,this.parser=n,this.renderer=i}static{(0,Pt.K2)(this,"Diagram")}static async fromText(e,r={}){const n=(0,Pt.zj)(),i=(0,Pt.Ch)(e,n);e=(0,It.C4)(e)+"\n";try{(0,Pt.Gs)(i)}catch{const t=(0,Pt.J$)(i);if(!t)throw new Pt.C0(`Diagram ${i} not found.`);const{id:e,diagram:r}=await t();(0,Pt.Js)(e,r)}const{db:a,parser:o,renderer:s,init:l}=(0,Pt.Gs)(i);return o.parser&&(o.parser.yy=a),a.clear?.(),l?.(n),r.title&&a.setDiagramTitle?.(r.title),await o.parse(e),new t(i,e,a,o,s)}async render(t,e){await this.renderer.draw(this.text,t,e,this)}getParser(){return this.parser}getType(){return this.type}},Ir=[],jr=(0,Pt.K2)(()=>{Ir.forEach(t=>{t()}),Ir=[]},"attachFunctions"),zr=(0,Pt.K2)(t=>t.replace(/^\s*%%(?!{)[^\n]+\n?/gm,"").trimStart(),"cleanupComments");function Pr(t){const e=t.match(Pt.EJ);if(!e)return{text:t,metadata:{}};let r=(0,Nt.H)(e[1],{schema:Nt.r})??{};r="object"!=typeof r||Array.isArray(r)?{}:r;const n={};return r.displayMode&&(n.displayMode=r.displayMode.toString()),r.title&&(n.title=r.title.toString()),r.config&&(n.config=r.config),{text:t.slice(e[0].length),metadata:n}}(0,Pt.K2)(Pr,"extractFrontMatter");var Kr=(0,Pt.K2)(t=>t.replace(/\r\n?/g,"\n").replace(/<(\w+)([^>]*)>/g,(t,e,r)=>"<"+e+r.replace(/="([^"]*)"/g,"='$1'")+">"),"cleanupText"),qr=(0,Pt.K2)(t=>{const{text:e,metadata:r}=Pr(t),{displayMode:n,title:i,config:a={}}=r;return n&&(a.gantt||(a.gantt={}),a.gantt.displayMode=n),{title:i,config:a,text:e}},"processFrontmatter"),Wr=(0,Pt.K2)(t=>{const e=It._K.detectInit(t)??{},r=It._K.detectDirective(t,"wrap");return Array.isArray(r)?e.wrap=r.some(({type:t})=>"wrap"===t):"wrap"===r?.type&&(e.wrap=!0),{text:(0,It.vU)(t),directive:e}},"processDirectives");function Hr(t){const e=Kr(t),r=qr(e),n=Wr(r.text),i=(0,It.$t)(r.config,n.directive);return{code:t=zr(n.text),title:r.title,config:i}}function Ur(t){const e=(new TextEncoder).encode(t),r=Array.from(e,t=>String.fromCodePoint(t)).join("");return btoa(r)}(0,Pt.K2)(Hr,"preprocessDiagram"),(0,Pt.K2)(Ur,"toBase64");var Yr=["foreignobject"],Gr=["dominant-baseline"];function Xr(t){const e=Hr(t);return(0,Pt.cL)(),(0,Pt.xA)(e.config??{}),e}async function Vr(t,e){Er();try{const{code:e,config:r}=Xr(t);return{diagramType:(await ln(e)).type,config:r}}catch(r){if(e?.suppressErrors)return!1;throw r}}(0,Pt.K2)(Xr,"processAndSetConfigs"),(0,Pt.K2)(Vr,"parse");var Zr=(0,Pt.K2)((t,e,r=[])=>`\n.${t} ${e} { ${r.join(" !important; ")} !important; }`,"cssImportantStyles"),Qr=(0,Pt.K2)((t,e=new Map)=>{let r="";if(void 0!==t.themeCSS&&(r+=`\n${t.themeCSS}`),void 0!==t.fontFamily&&(r+=`\n:root { --mermaid-font-family: ${t.fontFamily}}`),void 0!==t.altFontFamily&&(r+=`\n:root { --mermaid-alt-font-family: ${t.altFontFamily}}`),e instanceof Map){const n=t.htmlLabels??t.flowchart?.htmlLabels?["> *","span"]:["rect","polygon","ellipse","circle","path"];e.forEach(t=>{(0,Fe.A)(t.styles)||n.forEach(e=>{r+=Zr(t.id,e,t.styles)}),(0,Fe.A)(t.textStyles)||(r+=Zr(t.id,"tspan",(t?.textStyles||[]).map(t=>t.replace("color","fill"))))})}return r},"createCssStyles"),Jr=(0,Pt.K2)((t,e,r,n)=>{const i=Qr(t,r);return re(Se(`${n}{${(0,Pt.tM)(e,i,t.themeVariables)}}`),ne)},"createUserStyles"),tn=(0,Pt.K2)((t="",e,r)=>{let n=t;return r||e||(n=n.replace(/marker-end="url\([\d+./:=?A-Za-z-]*?#/g,'marker-end="url(#')),n=(0,It.Sm)(n),n=n.replace(/<br>/g,"<br/>"),n},"cleanUpSvgCode"),en=(0,Pt.K2)((t="",e)=>`<iframe style="width:100%;height:${e?.viewBox?.baseVal?.height?e.viewBox.baseVal.height+"px":"100%"};border:0;margin:0;" src="data:text/html;charset=UTF-8;base64,${Ur(`<body style="margin:0">${t}</body>`)}" sandbox="allow-top-navigation-by-user-activation allow-popups">\n The "iframe" tag is not supported by your browser.\n</iframe>`,"putIntoIFrame"),rn=(0,Pt.K2)((t,e,r,n,i)=>{const a=t.append("div");a.attr("id",r),n&&a.attr("style",n);const o=a.append("svg").attr("id",e).attr("width","100%").attr("xmlns","http://www.w3.org/2000/svg");return i&&o.attr("xmlns:xlink",i),o.append("g"),t},"appendDivSvgG");function nn(t,e){return t.append("iframe").attr("id",e).attr("style","width: 100%; height: 100%;").attr("sandbox","")}(0,Pt.K2)(nn,"sandboxedIframe");var an=(0,Pt.K2)((t,e,r,n)=>{t.getElementById(e)?.remove(),t.getElementById(r)?.remove(),t.getElementById(n)?.remove()},"removeExistingElements"),on=(0,Pt.K2)(async function(t,e,r){Er();const n=Xr(e);e=n.code;const i=(0,Pt.zj)();Pt.Rm.debug(i),e.length>(i?.maxTextSize??5e4)&&(e="graph TB;a[Maximum text size in diagram exceeded];style a fill:#faa");const a="#"+t,o="i"+t,s="#"+o,l="d"+t,c="#"+l,h=(0,Pt.K2)(()=>{const t=d?s:c,e=(0,qt.Ltv)(t).node();e&&"remove"in e&&e.remove()},"removeTempElements");let u=(0,qt.Ltv)("body");const d="sandbox"===i.securityLevel,p="loose"===i.securityLevel,f=i.fontFamily;if(void 0!==r){if(r&&(r.innerHTML=""),d){const t=nn((0,qt.Ltv)(r),o);u=(0,qt.Ltv)(t.nodes()[0].contentDocument.body),u.node().style.margin=0}else u=(0,qt.Ltv)(r);rn(u,t,l,`font-family: ${f}`,"http://www.w3.org/1999/xlink")}else{if(an(document,t,l,o),d){const t=nn((0,qt.Ltv)("body"),o);u=(0,qt.Ltv)(t.nodes()[0].contentDocument.body),u.node().style.margin=0}else u=(0,qt.Ltv)("body");rn(u,t,l)}let g,m;try{g=await Rr.fromText(e,{title:n.title})}catch(M){if(i.suppressErrorRendering)throw h(),M;g=await Rr.fromText("error"),m=M}const y=u.select(c).node(),x=g.type,b=y.firstChild,k=b.firstChild,C=g.renderer.getClasses?.(e,g),w=Jr(i,x,C,a),_=document.createElement("style");_.innerHTML=w,b.insertBefore(_,k);try{await g.renderer.draw(e,t,jt.n.version,g)}catch(B){throw i.suppressErrorRendering?h():hr.draw(e,t,jt.n.version),B}const v=u.select(`${c} svg`),S=g.db.getAccTitle?.(),A=g.db.getAccDescription?.();cn(x,v,S,A),u.select(`[id="${t}"]`).selectAll("foreignobject > *").attr("xmlns","http://www.w3.org/1999/xhtml");let T=u.select(c).node().innerHTML;if(Pt.Rm.debug("config.arrowMarkerAbsolute",i.arrowMarkerAbsolute),T=tn(T,d,(0,Pt._3)(i.arrowMarkerAbsolute)),d){const t=u.select(c+" svg").node();T=en(T,t)}else p||(T=Le.A.sanitize(T,{ADD_TAGS:Yr,ADD_ATTR:Gr,HTML_INTEGRATION_POINTS:{foreignobject:!0}}));if(jr(),m)throw m;return h(),{diagramType:x,svg:T,bindFunctions:g.db.bindFunctions}},"render");function sn(t={}){const e=(0,Pt.hH)({},t);e?.fontFamily&&!e.themeVariables?.fontFamily&&(e.themeVariables||(e.themeVariables={}),e.themeVariables.fontFamily=e.fontFamily),(0,Pt.wZ)(e),e?.theme&&e.theme in Pt.H$?e.themeVariables=Pt.H$[e.theme].getThemeVariables(e.themeVariables):e&&(e.themeVariables=Pt.H$.default.getThemeVariables(e.themeVariables));const r="object"==typeof e?(0,Pt.UU)(e):(0,Pt.Q2)();(0,Pt.He)(r.logLevel),Er()}(0,Pt.K2)(sn,"initialize");var ln=(0,Pt.K2)((t,e={})=>{const{code:r}=Hr(t);return Rr.fromText(r,e)},"getDiagramFromText");function cn(t,e,r,n){Nr(e,t),Or(e,r,n,e.attr("id"))}(0,Pt.K2)(cn,"addA11yInfo");var hn=Object.freeze({render:on,parse:Vr,getDiagramFromText:ln,initialize:sn,getConfig:Pt.zj,setConfig:Pt.Nk,getSiteConfig:Pt.Q2,updateSiteConfig:Pt.B6,reset:(0,Pt.K2)(()=>{(0,Pt.cL)()},"reset"),globalReset:(0,Pt.K2)(()=>{(0,Pt.cL)(Pt.sb)},"globalReset"),defaultConfig:Pt.sb});(0,Pt.He)((0,Pt.zj)().logLevel),(0,Pt.cL)((0,Pt.zj)());var un=(0,Pt.K2)((t,e,r)=>{Pt.Rm.warn(t),(0,It.dq)(t)?(r&&r(t.str,t.hash),e.push({...t,message:t.str,error:t})):(r&&r(t),t instanceof Error&&e.push({str:t.message,message:t.message,hash:t.name,error:t}))},"handleError"),dn=(0,Pt.K2)(async function(t={querySelector:".mermaid"}){try{await pn(t)}catch(e){if((0,It.dq)(e)&&Pt.Rm.error(e.str),vn.parseError&&vn.parseError(e),!t.suppressErrors)throw Pt.Rm.error("Use the suppressErrors option to suppress these errors"),e}},"run"),pn=(0,Pt.K2)(async function({postRenderCallback:t,querySelector:e,nodes:r}={querySelector:".mermaid"}){const n=hn.getConfig();let i;if(Pt.Rm.debug((t?"":"No ")+"Callback function found"),r)i=r;else{if(!e)throw new Error("Nodes and querySelector are both undefined");i=document.querySelectorAll(e)}Pt.Rm.debug(`Found ${i.length} diagrams`),void 0!==n?.startOnLoad&&(Pt.Rm.debug("Start On Load: "+n?.startOnLoad),hn.updateSiteConfig({startOnLoad:n?.startOnLoad}));const a=new It._K.InitIDGenerator(n.deterministicIds,n.deterministicIDSeed);let o;const s=[];for(const c of Array.from(i)){if(Pt.Rm.info("Rendering diagram: "+c.id),c.getAttribute("data-processed"))continue;c.setAttribute("data-processed","true");const e=`mermaid-${a.next()}`;o=c.innerHTML,o=(0,Kt.T)(It._K.entityDecode(o)).trim().replace(/<br\s*\/?>/gi,"<br/>");const r=It._K.detectInit(o);r&&Pt.Rm.debug("Detected early reinit: ",r);try{const{svg:r,bindFunctions:n}=await _n(e,o,c);c.innerHTML=r,t&&await t(e),n&&n(c)}catch(l){un(l,s,vn.parseError)}}if(s.length>0)throw s[0]},"runThrowsErrors"),fn=(0,Pt.K2)(function(t){hn.initialize(t)},"initialize"),gn=(0,Pt.K2)(async function(t,e,r){Pt.Rm.warn("mermaid.init is deprecated. Please use run instead."),t&&fn(t);const n={postRenderCallback:r,querySelector:".mermaid"};"string"==typeof e?n.querySelector=e:e&&(e instanceof HTMLElement?n.nodes=[e]:n.nodes=e),await dn(n)},"init"),mn=(0,Pt.K2)(async(t,{lazyLoad:e=!0}={})=>{Er(),(0,Pt.Xd)(...t),!1===e&&await Dr()},"registerExternalDiagrams"),yn=(0,Pt.K2)(function(){if(vn.startOnLoad){const{startOnLoad:t}=hn.getConfig();t&&vn.run().catch(t=>Pt.Rm.error("Mermaid failed to initialize",t))}},"contentLoaded");"undefined"!=typeof document&&window.addEventListener("load",yn,!1);var xn=(0,Pt.K2)(function(t){vn.parseError=t},"setParseErrorHandler"),bn=[],kn=!1,Cn=(0,Pt.K2)(async()=>{if(!kn){for(kn=!0;bn.length>0;){const e=bn.shift();if(e)try{await e()}catch(t){Pt.Rm.error("Error executing queue",t)}}kn=!1}},"executeQueue"),wn=(0,Pt.K2)(async(t,e)=>new Promise((r,n)=>{const i=(0,Pt.K2)(()=>new Promise((i,a)=>{hn.parse(t,e).then(t=>{i(t),r(t)},t=>{Pt.Rm.error("Error parsing",t),vn.parseError?.(t),a(t),n(t)})}),"performCall");bn.push(i),Cn().catch(n)}),"parse"),_n=(0,Pt.K2)((t,e,r)=>new Promise((n,i)=>{const a=(0,Pt.K2)(()=>new Promise((a,o)=>{hn.render(t,e,r).then(t=>{a(t),n(t)},t=>{Pt.Rm.error("Error parsing",t),vn.parseError?.(t),o(t),i(t)})}),"performCall");bn.push(a),Cn().catch(i)}),"render"),vn={startOnLoad:!0,mermaidAPI:hn,parse:wn,render:_n,init:gn,run:dn,registerExternalDiagrams:mn,registerLayoutLoaders:Ot.sO,initialize:fn,parseError:void 0,contentLoaded:yn,setParseErrorHandler:xn,detectType:Pt.Ch,registerIconPacks:Rt.pC},Sn=vn;function An(){const{colorMode:t}=(0,l.G)(),e=(0,c.p)().mermaid,r=e.theme[t],{options:i}=e;return(0,n.useMemo)(()=>({startOnLoad:!1,...i,theme:r}),[r,i])}function Tn({text:t,config:e}){const[r,i]=(0,n.useState)(null),a=(0,n.useState)(`mermaid-svg-${Math.round(1e7*Math.random())}`)[0],o=An(),s=e??o;return(0,n.useEffect)(()=>{(async function({id:t,text:e,config:r}){Sn.mermaidAPI.initialize(r);try{return await Sn.render(t,e)}catch(n){throw document.querySelector(`#d${t}`)?.remove(),n}})({id:a,text:t,config:s}).then(i).catch(t=>{i(()=>{throw t})})},[a,t,s]),r}const Mn="container_QZpv";function Bn({renderResult:t}){const e=(0,n.useRef)(null);return(0,n.useEffect)(()=>{const r=e.current;t.bindFunctions?.(r)},[t]),(0,g.jsx)("div",{ref:e,className:`docusaurus-mermaid-container ${Mn}`,dangerouslySetInnerHTML:{__html:t.svg}})}function Ln({value:t}){const e=Tn({text:t});return null===e?null:(0,g.jsx)(Bn,{renderResult:e})}const Fn={Head:a.A,details:At,Details:At,code:function(t){return function(t){return void 0!==t.children&&n.Children.toArray(t.children).every(t=>"string"==typeof t&&!t.includes("\n"))}(t)?(0,g.jsx)(ft,{...t}):(0,g.jsx)(pt,{...t})},a:function(t){return(0,g.jsx)(gt.A,{...t})},pre:function(t){return(0,g.jsx)(g.Fragment,{children:t.children})},ul:function(t){return(0,g.jsx)("ul",{...t,className:Lt(t.className)})},li:function(t){return(0,mt.A)().collectAnchor(t.id),(0,g.jsx)("li",{...t})},img:function(t){return(0,g.jsx)("img",{decoding:"async",loading:"lazy",...t,className:(e=t.className,(0,s.A)(e,Ft))});var e},h1:t=>(0,g.jsx)(Mt,{as:"h1",...t}),h2:t=>(0,g.jsx)(Mt,{as:"h2",...t}),h3:t=>(0,g.jsx)(Mt,{as:"h3",...t}),h4:t=>(0,g.jsx)(Mt,{as:"h4",...t}),h5:t=>(0,g.jsx)(Mt,{as:"h5",...t}),h6:t=>(0,g.jsx)(Mt,{as:"h6",...t}),admonition:$t.A,mermaid:function(t){return(0,g.jsx)(Et.A,{fallback:t=>(0,g.jsx)(Dt.MN,{...t}),children:(0,g.jsx)(Ln,{...t})})}};function $n({children:t}){return(0,g.jsx)(i.x,{components:Fn,children:t})}},31408:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=/^(?:0|[1-9]\d*)$/;const i=function(t,e){var r=typeof t;return!!(e=null==e?9007199254740991:e)&&("number"==r||"symbol"!=r&&n.test(t))&&t>-1&&t%1==0&&t<e}},33998:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(42849),i=r(97427);const a=function(t){return(0,i.A)(t)&&(0,n.A)(t)}},34713:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(56117),i=r(71398),a=r(22470);const o=function(t,e){return(0,a.A)((0,i.A)(t,e,n.A),t+"")}},34809:(t,e)=>{function r(t){let e,r=[];for(let n of t.split(",").map(t=>t.trim()))if(/^-?\d+$/.test(n))r.push(parseInt(n,10));else if(e=n.match(/^(-?\d+)(-|\.\.\.?|\u2025|\u2026|\u22EF)(-?\d+)$/)){let[t,n,i,a]=e;if(n&&a){n=parseInt(n),a=parseInt(a);const t=n<a?1:-1;"-"!==i&&".."!==i&&"\u2025"!==i||(a+=t);for(let e=n;e!==a;e+=t)r.push(e)}}return r}e.default=r,t.exports=r},35745:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=r(90372);const i=function(t,e,r){"__proto__"==e&&n.A?(0,n.A)(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}},38819:(t,e,r)=>{"use strict";r.d(e,{Y:()=>i,Z:()=>a});var n=r(46554);const i={};for(let o=0;o<=255;o++)i[o]=n.A.unit.dec2hex(o);const a={ALL:0,RGB:1,HSL:2}},39448:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=r(9634);const i=function(t,e){var r=e?(0,n.A)(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}},39458:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=Object.prototype;const i=function(t){var e=t&&t.constructor;return t===("function"==typeof e&&e.prototype||n)}},41407:(t,e,r)=>{"use strict";e.J=void 0;var n=r(70370);function i(t){return t.replace(n.ctrlCharactersRegex,"").replace(n.htmlEntitiesRegex,function(t,e){return String.fromCharCode(e)})}function a(t){try{return decodeURIComponent(t)}catch(e){return t}}e.J=function(t){if(!t)return n.BLANK_URL;var e,r=a(t.trim());do{e=(r=a(r=i(r).replace(n.htmlCtrlEntityRegex,"").replace(n.ctrlCharactersRegex,"").replace(n.whitespaceEscapeCharsRegex,"").trim())).match(n.ctrlCharactersRegex)||r.match(n.htmlEntitiesRegex)||r.match(n.htmlCtrlEntityRegex)||r.match(n.whitespaceEscapeCharsRegex)}while(e&&e.length>0);var o=r;if(!o)return n.BLANK_URL;if(function(t){return n.relativeFirstCharacters.indexOf(t[0])>-1}(o))return o;var s=o.trimStart(),l=s.match(n.urlSchemeRegex);if(!l)return o;var c=l[0].toLowerCase().trim();if(n.invalidProtocolRegex.test(c))return n.BLANK_URL;var h=s.replace(/\\/g,"/");if("mailto:"===c||c.includes("://"))return h;if("http:"===c||"https:"===c){if(!function(t){return URL.canParse(t)}(h))return n.BLANK_URL;var u=new URL(h);return u.protocol=u.protocol.toLowerCase(),u.hostname=u.hostname.toLowerCase(),u.toString()}return h}},41863:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(80565),i=r(49084);const a=function(t){if(!(0,i.A)(t))return!1;var e=(0,n.A)(t);return"[object Function]"==e||"[object GeneratorFunction]"==e||"[object AsyncFunction]"==e||"[object Proxy]"==e}},42849:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(41863),i=r(47227);const a=function(t){return null!=t&&(0,i.A)(t.length)&&!(0,n.A)(t)}},44254:(t,e,r)=>{"use strict";r.d(e,{A:()=>_});var n=r(53443),i=r(57454);const a=(0,n.A)(i.A,"DataView");var o=r(86986);const s=(0,n.A)(i.A,"Promise");var l=r(30256);const c=(0,n.A)(i.A,"WeakMap");var h=r(80565),u=r(30226),d="[object Map]",p="[object Promise]",f="[object Set]",g="[object WeakMap]",m="[object DataView]",y=(0,u.A)(a),x=(0,u.A)(o.A),b=(0,u.A)(s),k=(0,u.A)(l.A),C=(0,u.A)(c),w=h.A;(a&&w(new a(new ArrayBuffer(1)))!=m||o.A&&w(new o.A)!=d||s&&w(s.resolve())!=p||l.A&&w(new l.A)!=f||c&&w(new c)!=g)&&(w=function(t){var e=(0,h.A)(t),r="[object Object]"==e?t.constructor:void 0,n=r?(0,u.A)(r):"";if(n)switch(n){case y:return m;case x:return d;case b:return p;case k:return f;case C:return g}return e});const _=w},45235:(t,e,r)=>{"use strict";r.d(e,{A:()=>y});r(36672);var n=r(13526),i=r(53499),a=r(33412),o=r(23420);function s(){return(0,o.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.title",description:"The unlisted content banner title",children:"Unlisted page"})}function l(){return(0,o.jsx)(i.A,{id:"theme.contentVisibility.unlistedBanner.message",description:"The unlisted content banner message",children:"This page is unlisted. Search engines will not index it, and only users having a direct link can access it."})}function c(){return(0,o.jsx)(a.A,{children:(0,o.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})}function h(){return(0,o.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.title",description:"The draft content banner title",children:"Draft page"})}function u(){return(0,o.jsx)(i.A,{id:"theme.contentVisibility.draftBanner.message",description:"The draft content banner message",children:"This page is a draft. It will only be visible in dev and be excluded from the production build."})}var d=r(84862),p=r(67231);function f({className:t}){return(0,o.jsx)(p.A,{type:"caution",title:(0,o.jsx)(h,{}),className:(0,n.A)(t,d.G.common.draftBanner),children:(0,o.jsx)(u,{})})}function g({className:t}){return(0,o.jsx)(p.A,{type:"caution",title:(0,o.jsx)(s,{}),className:(0,n.A)(t,d.G.common.unlistedBanner),children:(0,o.jsx)(l,{})})}function m(t){return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(c,{}),(0,o.jsx)(g,{...t})]})}function y({metadata:t}){const{unlisted:e,frontMatter:r}=t;return(0,o.jsxs)(o.Fragment,{children:[(e||r.unlisted)&&(0,o.jsx)(m,{}),r.draft&&(0,o.jsx)(f,{})]})}},45786:(t,e,r)=>{"use strict";r.d(e,{A:()=>_});const n=(0,r(53443).A)(Object,"create");const i=function(){this.__data__=n?n(null):{},this.size=0};const a=function(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e};var o=Object.prototype.hasOwnProperty;const s=function(t){var e=this.__data__;if(n){var r=e[t];return"__lodash_hash_undefined__"===r?void 0:r}return o.call(e,t)?e[t]:void 0};var l=Object.prototype.hasOwnProperty;const c=function(t){var e=this.__data__;return n?void 0!==e[t]:l.call(e,t)};const h=function(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=n&&void 0===e?"__lodash_hash_undefined__":e,this};function u(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}u.prototype.clear=i,u.prototype.delete=a,u.prototype.get=s,u.prototype.has=c,u.prototype.set=h;const d=u;var p=r(89732),f=r(86986);const g=function(){this.size=0,this.__data__={hash:new d,map:new(f.A||p.A),string:new d}};const m=function(t){var e=typeof t;return"string"==e||"number"==e||"symbol"==e||"boolean"==e?"__proto__"!==t:null===t};const y=function(t,e){var r=t.__data__;return m(e)?r["string"==typeof e?"string":"hash"]:r.map};const x=function(t){var e=y(this,t).delete(t);return this.size-=e?1:0,e};const b=function(t){return y(this,t).get(t)};const k=function(t){return y(this,t).has(t)};const C=function(t,e){var r=y(this,t),n=r.size;return r.set(t,e),this.size+=r.size==n?0:1,this};function w(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}w.prototype.clear=g,w.prototype.delete=x,w.prototype.get=b,w.prototype.has=k,w.prototype.set=C;const _=w},46554:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});const n={min:{r:0,g:0,b:0,s:0,l:0,a:0},max:{r:255,g:255,b:255,h:360,s:100,l:100,a:1},clamp:{r:t=>t>=255?255:t<0?0:t,g:t=>t>=255?255:t<0?0:t,b:t=>t>=255?255:t<0?0:t,h:t=>t%360,s:t=>t>=100?100:t<0?0:t,l:t=>t>=100?100:t<0?0:t,a:t=>t>=1?1:t<0?0:t},toLinear:t=>{const e=t/255;return t>.03928?Math.pow((e+.055)/1.055,2.4):e/12.92},hue2rgb:(t,e,r)=>(r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t),hsl2rgb:({h:t,s:e,l:r},i)=>{if(!e)return 2.55*r;t/=360,e/=100;const a=(r/=100)<.5?r*(1+e):r+e-r*e,o=2*r-a;switch(i){case"r":return 255*n.hue2rgb(o,a,t+1/3);case"g":return 255*n.hue2rgb(o,a,t);case"b":return 255*n.hue2rgb(o,a,t-1/3)}},rgb2hsl:({r:t,g:e,b:r},n)=>{t/=255,e/=255,r/=255;const i=Math.max(t,e,r),a=Math.min(t,e,r),o=(i+a)/2;if("l"===n)return 100*o;if(i===a)return 0;const s=i-a;if("s"===n)return 100*(o>.5?s/(2-i-a):s/(i+a));switch(i){case t:return 60*((e-r)/s+(e<r?6:0));case e:return 60*((r-t)/s+2);case r:return 60*((t-e)/s+4);default:return-1}}},i={channel:n,lang:{clamp:(t,e,r)=>e>r?Math.min(e,Math.max(r,t)):Math.min(r,Math.max(e,t)),round:t=>Math.round(1e10*t)/1e10},unit:{dec2hex:t=>{const e=Math.round(t).toString(16);return e.length>1?e:`0${e}`}}}},47227:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t){return"number"==typeof t&&t>-1&&t%1==0&&t<=9007199254740991}},47765:(t,e,r)=>{"use strict";r.d(e,{D:()=>a});var n=r(97485),i=r(3170),a=(0,n.K2)(t=>{const{securityLevel:e}=(0,n.D7)();let r=(0,i.Ltv)("body");if("sandbox"===e){const e=(0,i.Ltv)(`#i${t}`),n=e.node()?.contentDocument??document;r=(0,i.Ltv)(n.body)}return r.select(`#${t}`)},"selectSvgElement")},47848:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(34713),i=r(16599);const a=function(t){return(0,n.A)(function(e,r){var n=-1,a=r.length,o=a>1?r[a-1]:void 0,s=a>2?r[2]:void 0;for(o=t.length>3&&"function"==typeof o?(a--,o):void 0,s&&(0,i.A)(r[0],r[1],s)&&(o=a<3?void 0:o,a=1),e=Object(e);++n<a;){var l=r[n];l&&t(e,l,n,o)}return e})}},48203:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t){return function(){return t}}},49084:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t){var e=typeof t;return null!=t&&("object"==e||"function"==e)}},49636:(t,e,r)=>{"use strict";r.d(e,{DA:()=>k,IU:()=>B,U:()=>M,U7:()=>Ce,U_:()=>_e,Zk:()=>h,aP:()=>xe,gh:()=>we,lC:()=>d,on:()=>ke});var n=r(267),i=r(29951),a=r(63727),o=r(9420),s=r(97485),l=r(3170),c=r(30726),h=(0,s.K2)(async(t,e,r)=>{let n;const i=e.useHtmlLabels||(0,s._3)((0,s.D7)()?.htmlLabels);n=r||"node default";const c=t.insert("g").attr("class",n).attr("id",e.domId||e.id),h=c.insert("g").attr("class","label").attr("style",(0,o.KL)(e.labelStyle));let u;u=void 0===e.label?"":"string"==typeof e.label?e.label:e.label[0];const d=await(0,a.GZ)(h,(0,s.jZ)((0,o.Sm)(u),(0,s.D7)()),{useHtmlLabels:i,width:e.width||(0,s.D7)().flowchart?.wrappingWidth,cssClasses:"markdown-node-label",style:e.labelStyle,addSvgBackground:!!e.icon||!!e.img});let p=d.getBBox();const f=(e?.padding??0)/2;if(i){const t=d.children[0],e=(0,l.Ltv)(d),r=t.getElementsByTagName("img");if(r){const t=""===u.replace(/<img[^>]*>/g,"").trim();await Promise.all([...r].map(e=>new Promise(r=>{function n(){if(e.style.display="flex",e.style.flexDirection="column",t){const t=(0,s.D7)().fontSize?(0,s.D7)().fontSize:window.getComputedStyle(document.body).fontSize,r=5,[n=s.UI.fontSize]=(0,o.I5)(t),i=n*r+"px";e.style.minWidth=i,e.style.maxWidth=i}else e.style.width="100%";r(e)}(0,s.K2)(n,"setupImage"),setTimeout(()=>{e.complete&&n()}),e.addEventListener("error",n),e.addEventListener("load",n)})))}p=t.getBoundingClientRect(),e.attr("width",p.width),e.attr("height",p.height)}return i?h.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"):h.attr("transform","translate(0, "+-p.height/2+")"),e.centerLabel&&h.attr("transform","translate("+-p.width/2+", "+-p.height/2+")"),h.insert("rect",":first-child"),{shapeSvg:c,bbox:p,halfPadding:f,label:h}},"labelHelper"),u=(0,s.K2)(async(t,e,r)=>{const n=r.useHtmlLabels||(0,s._3)((0,s.D7)()?.flowchart?.htmlLabels),i=t.insert("g").attr("class","label").attr("style",r.labelStyle||""),c=await(0,a.GZ)(i,(0,s.jZ)((0,o.Sm)(e),(0,s.D7)()),{useHtmlLabels:n,width:r.width||(0,s.D7)()?.flowchart?.wrappingWidth,style:r.labelStyle,addSvgBackground:!!r.icon||!!r.img});let h=c.getBBox();const u=r.padding/2;if((0,s._3)((0,s.D7)()?.flowchart?.htmlLabels)){const t=c.children[0],e=(0,l.Ltv)(c);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}return n?i.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"):i.attr("transform","translate(0, "+-h.height/2+")"),r.centerLabel&&i.attr("transform","translate("+-h.width/2+", "+-h.height/2+")"),i.insert("rect",":first-child"),{shapeSvg:t,bbox:h,halfPadding:u,label:i}},"insertLabel"),d=(0,s.K2)((t,e)=>{const r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds"),p=(0,s.K2)((t,e)=>("handDrawn"===t.look?"rough-node":"node")+" "+t.cssClasses+" "+(e||""),"getNodeClasses");function f(t){const e=t.map((t,e)=>`${0===e?"M":"L"}${t.x},${t.y}`);return e.push("Z"),e.join(" ")}function g(t,e,r,n,i,a){const o=[],s=r-t,l=n-e,c=s/a,h=2*Math.PI/c,u=e+l/2;for(let d=0;d<=50;d++){const e=t+d/50*s,r=u+i*Math.sin(h*(e-t));o.push({x:e,y:r})}return o}function m(t,e,r,n,i,a){const o=[],s=i*Math.PI/180,l=(a*Math.PI/180-s)/(n-1);for(let c=0;c<n;c++){const n=s+c*l,i=t+r*Math.cos(n),a=e+r*Math.sin(n);o.push({x:-i,y:-a})}return o}(0,s.K2)(f,"createPathFromPoints"),(0,s.K2)(g,"generateFullSineWavePoints"),(0,s.K2)(m,"generateCirclePoints");var y=(0,s.K2)((t,e)=>{var r,n,i=t.x,a=t.y,o=e.x-i,s=e.y-a,l=t.width/2,c=t.height/2;return Math.abs(s)*l>Math.abs(o)*c?(s<0&&(c=-c),r=0===s?0:c*o/s,n=c):(o<0&&(l=-l),r=l,n=0===o?0:l*s/o),{x:i+r,y:a+n}},"intersectRect");function x(t,e){e&&t.attr("style",e)}async function b(t){const e=(0,l.Ltv)(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div");let n=t.label;t.label&&(0,s.Wi)(t.label)&&(n=await(0,s.VJ)(t.label.replace(s.Y2.lineBreakRegex,"\n"),(0,s.D7)()));const i=t.isNode?"nodeLabel":"edgeLabel";return r.html('<span class="'+i+'" '+(t.labelStyle?'style="'+t.labelStyle+'"':"")+">"+n+"</span>"),x(r,t.labelStyle),r.style("display","inline-block"),r.style("padding-right","1px"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}(0,s.K2)(x,"applyStyle"),(0,s.K2)(b,"addHtmlLabel");var k=(0,s.K2)(async(t,e,r,n)=>{let i=t||"";if("object"==typeof i&&(i=i[0]),(0,s._3)((0,s.D7)().flowchart.htmlLabels)){i=i.replace(/\\n|\n/g,"<br />"),s.Rm.info("vertexText"+i);const t={isNode:n,label:(0,o.Sm)(i).replace(/fa[blrs]?:fa-[\w-]+/g,t=>`<i class='${t.replace(":"," ")}'></i>`),labelStyle:e?e.replace("fill:","color:"):e};return await b(t)}{const t=document.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",e.replace("color:","fill:"));let n=[];n="string"==typeof i?i.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(i)?i:[];for(const e of n){const n=document.createElementNS("http://www.w3.org/2000/svg","tspan");n.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),n.setAttribute("dy","1em"),n.setAttribute("x","0"),r?n.setAttribute("class","title-row"):n.setAttribute("class","row"),n.textContent=e.trim(),t.appendChild(n)}return t}},"createLabel"),C=(0,s.K2)((t,e,r,n,i)=>["M",t+i,e,"H",t+r-i,"A",i,i,0,0,1,t+r,e+i,"V",e+n-i,"A",i,i,0,0,1,t+r-i,e+n,"H",t+i,"A",i,i,0,0,1,t,e+n-i,"V",e+i,"A",i,i,0,0,1,t+i,e,"Z"].join(" "),"createRoundedRectPathD"),w=(0,s.K2)(async(t,e)=>{s.Rm.info("Creating subgraph rect for ",e.id,e);const r=(0,s.D7)(),{themeVariables:o,handDrawnSeed:h}=r,{clusterBkg:u,clusterBorder:d}=o,{labelStyles:p,nodeStyles:f,borderStyles:g,backgroundStyles:m}=(0,i.GX)(e),x=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),b=(0,s._3)(r.flowchart.htmlLabels),k=x.insert("g").attr("class","cluster-label "),w=await(0,a.GZ)(k,e.label,{style:e.labelStyle,useHtmlLabels:b,isNode:!0});let _=w.getBBox();if((0,s._3)(r.flowchart.htmlLabels)){const t=w.children[0],e=(0,l.Ltv)(w);_=t.getBoundingClientRect(),e.attr("width",_.width),e.attr("height",_.height)}const v=e.width<=_.width+e.padding?_.width+e.padding:e.width;e.width<=_.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;const S=e.height,A=e.x-v/2,T=e.y-S/2;let M;if(s.Rm.trace("Data ",e,JSON.stringify(e)),"handDrawn"===e.look){const t=c.A.svg(x),r=(0,i.Fr)(e,{roughness:.7,fill:u,stroke:d,fillWeight:3,seed:h}),n=t.path(C(A,T,v,S,0),r);M=x.insert(()=>(s.Rm.debug("Rough node insert CXC",n),n),":first-child"),M.select("path:nth-child(2)").attr("style",g.join(";")),M.select("path").attr("style",m.join(";").replace("fill","stroke"))}else M=x.insert("rect",":first-child"),M.attr("style",f).attr("rx",e.rx).attr("ry",e.ry).attr("x",A).attr("y",T).attr("width",v).attr("height",S);const{subGraphTitleTopMargin:B}=(0,n.O)(r);if(k.attr("transform",`translate(${e.x-_.width/2}, ${e.y-e.height/2+B})`),p){const t=k.select("span");t&&t.attr("style",p)}const L=M.node().getBBox();return e.offsetX=0,e.width=L.width,e.height=L.height,e.offsetY=_.height-e.padding/2,e.intersect=function(t){return y(e,t)},{cluster:x,labelBBox:_}},"rect"),_=(0,s.K2)((t,e)=>{const r=t.insert("g").attr("class","note-cluster").attr("id",e.id),n=r.insert("rect",":first-child"),i=0*e.padding,a=i/2;n.attr("rx",e.rx).attr("ry",e.ry).attr("x",e.x-e.width/2-a).attr("y",e.y-e.height/2-a).attr("width",e.width+i).attr("height",e.height+i).attr("fill","none");const o=n.node().getBBox();return e.width=o.width,e.height=o.height,e.intersect=function(t){return y(e,t)},{cluster:r,labelBBox:{width:0,height:0}}},"noteGroup"),v=(0,s.K2)(async(t,e)=>{const r=(0,s.D7)(),{themeVariables:n,handDrawnSeed:i}=r,{altBackground:a,compositeBackground:o,compositeTitleBackground:h,nodeBorder:u}=n,d=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-id",e.id).attr("data-look",e.look),p=d.insert("g",":first-child"),f=d.insert("g").attr("class","cluster-label");let g=d.append("rect");const m=f.node().appendChild(await k(e.label,e.labelStyle,void 0,!0));let x=m.getBBox();if((0,s._3)(r.flowchart.htmlLabels)){const t=m.children[0],e=(0,l.Ltv)(m);x=t.getBoundingClientRect(),e.attr("width",x.width),e.attr("height",x.height)}const b=0*e.padding,w=b/2,_=(e.width<=x.width+e.padding?x.width+e.padding:e.width)+b;e.width<=x.width+e.padding?e.diff=(_-e.width)/2-e.padding:e.diff=-e.padding;const v=e.height+b,S=e.height+b-x.height-6,A=e.x-_/2,T=e.y-v/2;e.width=_;const M=e.y-e.height/2-w+x.height+2;let B;if("handDrawn"===e.look){const t=e.cssClasses.includes("statediagram-cluster-alt"),r=c.A.svg(d),n=e.rx||e.ry?r.path(C(A,T,_,v,10),{roughness:.7,fill:h,fillStyle:"solid",stroke:u,seed:i}):r.rectangle(A,T,_,v,{seed:i});B=d.insert(()=>n,":first-child");const s=r.rectangle(A,M,_,S,{fill:t?a:o,fillStyle:t?"hachure":"solid",stroke:u,seed:i});B=d.insert(()=>n,":first-child"),g=d.insert(()=>s)}else{B=p.insert("rect",":first-child");const t="outer";B.attr("class",t).attr("x",A).attr("y",T).attr("width",_).attr("height",v).attr("data-look",e.look),g.attr("class","inner").attr("x",A).attr("y",M).attr("width",_).attr("height",S)}f.attr("transform",`translate(${e.x-x.width/2}, ${T+1-((0,s._3)(r.flowchart.htmlLabels)?0:3)})`);const L=B.node().getBBox();return e.height=L.height,e.offsetX=0,e.offsetY=x.height-e.padding/2,e.labelBBox=x,e.intersect=function(t){return y(e,t)},{cluster:d,labelBBox:x}},"roundedWithTitle"),S=(0,s.K2)(async(t,e)=>{s.Rm.info("Creating subgraph rect for ",e.id,e);const r=(0,s.D7)(),{themeVariables:o,handDrawnSeed:h}=r,{clusterBkg:u,clusterBorder:d}=o,{labelStyles:p,nodeStyles:f,borderStyles:g,backgroundStyles:m}=(0,i.GX)(e),x=t.insert("g").attr("class","cluster "+e.cssClasses).attr("id",e.id).attr("data-look",e.look),b=(0,s._3)(r.flowchart.htmlLabels),k=x.insert("g").attr("class","cluster-label "),w=await(0,a.GZ)(k,e.label,{style:e.labelStyle,useHtmlLabels:b,isNode:!0,width:e.width});let _=w.getBBox();if((0,s._3)(r.flowchart.htmlLabels)){const t=w.children[0],e=(0,l.Ltv)(w);_=t.getBoundingClientRect(),e.attr("width",_.width),e.attr("height",_.height)}const v=e.width<=_.width+e.padding?_.width+e.padding:e.width;e.width<=_.width+e.padding?e.diff=(v-e.width)/2-e.padding:e.diff=-e.padding;const S=e.height,A=e.x-v/2,T=e.y-S/2;let M;if(s.Rm.trace("Data ",e,JSON.stringify(e)),"handDrawn"===e.look){const t=c.A.svg(x),r=(0,i.Fr)(e,{roughness:.7,fill:u,stroke:d,fillWeight:4,seed:h}),n=t.path(C(A,T,v,S,e.rx),r);M=x.insert(()=>(s.Rm.debug("Rough node insert CXC",n),n),":first-child"),M.select("path:nth-child(2)").attr("style",g.join(";")),M.select("path").attr("style",m.join(";").replace("fill","stroke"))}else M=x.insert("rect",":first-child"),M.attr("style",f).attr("rx",e.rx).attr("ry",e.ry).attr("x",A).attr("y",T).attr("width",v).attr("height",S);const{subGraphTitleTopMargin:B}=(0,n.O)(r);if(k.attr("transform",`translate(${e.x-_.width/2}, ${e.y-e.height/2+B})`),p){const t=k.select("span");t&&t.attr("style",p)}const L=M.node().getBBox();return e.offsetX=0,e.width=L.width,e.height=L.height,e.offsetY=_.height-e.padding/2,e.intersect=function(t){return y(e,t)},{cluster:x,labelBBox:_}},"kanbanSection"),A={rect:w,squareRect:w,roundedWithTitle:v,noteGroup:_,divider:(0,s.K2)((t,e)=>{const r=(0,s.D7)(),{themeVariables:n,handDrawnSeed:i}=r,{nodeBorder:a}=n,o=t.insert("g").attr("class",e.cssClasses).attr("id",e.id).attr("data-look",e.look),l=o.insert("g",":first-child"),h=0*e.padding,u=e.width+h;e.diff=-e.padding;const d=e.height+h,p=e.x-u/2,f=e.y-d/2;let g;if(e.width=u,"handDrawn"===e.look){const t=c.A.svg(o).rectangle(p,f,u,d,{fill:"lightgrey",roughness:.5,strokeLineDash:[5],stroke:a,seed:i});g=o.insert(()=>t,":first-child")}else{g=l.insert("rect",":first-child");const t="divider";g.attr("class",t).attr("x",p).attr("y",f).attr("width",u).attr("height",d).attr("data-look",e.look)}const m=g.node().getBBox();return e.height=m.height,e.offsetX=0,e.offsetY=0,e.intersect=function(t){return y(e,t)},{cluster:o,labelBBox:{}}},"divider"),kanbanSection:S},T=new Map,M=(0,s.K2)(async(t,e)=>{const r=e.shape||"rect",n=await A[r](t,e);return T.set(e.id,n),n},"insertCluster"),B=(0,s.K2)(()=>{T=new Map},"clear");function L(t,e){return t.intersect(e)}(0,s.K2)(L,"intersectNode");var F=L;function $(t,e,r,n){var i=t.x,a=t.y,o=i-n.x,s=a-n.y,l=Math.sqrt(e*e*s*s+r*r*o*o),c=Math.abs(e*r*o/l);n.x<i&&(c=-c);var h=Math.abs(e*r*s/l);return n.y<a&&(h=-h),{x:i+c,y:a+h}}(0,s.K2)($,"intersectEllipse");var E=$;function D(t,e,r){return E(t,e,e,r)}(0,s.K2)(D,"intersectCircle");var N=D;function O(t,e,r,n){var i,a,o,s,l,c,h,u,d,p,f,g,m;if(i=e.y-t.y,o=t.x-e.x,l=e.x*t.y-t.x*e.y,d=i*r.x+o*r.y+l,p=i*n.x+o*n.y+l,!(0!==d&&0!==p&&R(d,p)||(a=n.y-r.y,s=r.x-n.x,c=n.x*r.y-r.x*n.y,h=a*t.x+s*t.y+c,u=a*e.x+s*e.y+c,0!==h&&0!==u&&R(h,u)||0===(f=i*s-a*o))))return g=Math.abs(f/2),{x:(m=o*c-s*l)<0?(m-g)/f:(m+g)/f,y:(m=a*l-i*c)<0?(m-g)/f:(m+g)/f}}function R(t,e){return t*e>0}(0,s.K2)(O,"intersectLine"),(0,s.K2)(R,"sameSign");var I=O;function j(t,e,r){let n=t.x,i=t.y,a=[],o=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY;"function"==typeof e.forEach?e.forEach(function(t){o=Math.min(o,t.x),s=Math.min(s,t.y)}):(o=Math.min(o,e.x),s=Math.min(s,e.y));let l=n-t.width/2-o,c=i-t.height/2-s;for(let h=0;h<e.length;h++){let n=e[h],i=e[h<e.length-1?h+1:0],o=I(t,r,{x:l+n.x,y:c+n.y},{x:l+i.x,y:c+i.y});o&&a.push(o)}return a.length?(a.length>1&&a.sort(function(t,e){let n=t.x-r.x,i=t.y-r.y,a=Math.sqrt(n*n+i*i),o=e.x-r.x,s=e.y-r.y,l=Math.sqrt(o*o+s*s);return a<l?-1:a===l?0:1}),a[0]):t}(0,s.K2)(j,"intersectPolygon");var z={node:F,circle:N,ellipse:E,polygon:j,rect:y};function P(t,e){const{labelStyles:r}=(0,i.GX)(e);e.labelStyle=r;const n=p(e);let a=n;n||(a="anchor");const l=t.insert("g").attr("class",a).attr("id",e.domId||e.id),{cssStyles:h}=e,u=c.A.svg(l),f=(0,i.Fr)(e,{fill:"black",stroke:"none",fillStyle:"solid"});"handDrawn"!==e.look&&(f.roughness=0);const g=u.circle(0,0,2,f),m=l.insert(()=>g,":first-child");return m.attr("class","anchor").attr("style",(0,o.KL)(h)),d(e,m),e.intersect=function(t){return s.Rm.info("Circle intersect",e,1,t),z.circle(e,1,t)},l}function K(t,e,r,n,i,a,o){const s=(t+r)/2,l=(e+n)/2,c=Math.atan2(n-e,r-t),h=(r-t)/2/i,u=(n-e)/2/a,d=Math.sqrt(h**2+u**2);if(d>1)throw new Error("The given radii are too small to create an arc between the points.");const p=Math.sqrt(1-d**2),f=s+p*a*Math.sin(c)*(o?-1:1),g=l-p*i*Math.cos(c)*(o?-1:1),m=Math.atan2((e-g)/a,(t-f)/i);let y=Math.atan2((n-g)/a,(r-f)/i)-m;o&&y<0&&(y+=2*Math.PI),!o&&y>0&&(y-=2*Math.PI);const x=[];for(let b=0;b<20;b++){const t=m+b/19*y,e=f+i*Math.cos(t),r=g+a*Math.sin(t);x.push({x:e,y:r})}return x}async function q(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=o.width+e.padding+20,l=o.height+e.padding,u=l/2,g=u/(2.5+l/50),{cssStyles:m}=e,y=[{x:s/2,y:-l/2},{x:-s/2,y:-l/2},...K(-s/2,-l/2,-s/2,l/2,g,u,!1),{x:s/2,y:l/2},...K(s/2,l/2,s/2,-l/2,g,u,!0)],x=c.A.svg(a),b=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=f(y),C=x.path(k,b),w=a.insert(()=>C,":first-child");return w.attr("class","basic label-container"),m&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",m),n&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",n),w.attr("transform",`translate(${g/2}, 0)`),d(e,w),e.intersect=function(t){return z.polygon(e,y,t)},a}function W(t,e,r,n){return t.insert("polygon",":first-child").attr("points",n.map(function(t){return t.x+","+t.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}async function H(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=o.height+e.padding,l=o.width+e.padding+12,u=-s,g=[{x:12,y:u},{x:l,y:u},{x:l,y:0},{x:0,y:0},{x:0,y:u+12},{x:12,y:u}];let m;const{cssStyles:y}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=f(g),o=t.path(n,r);m=a.insert(()=>o,":first-child").attr("transform",`translate(${-l/2}, ${s/2})`),y&&m.attr("style",y)}else m=W(a,l,s,g);return n&&m.attr("style",n),d(e,m),e.intersect=function(t){return z.polygon(e,g,t)},a}function U(t,e){const{nodeStyles:r}=(0,i.GX)(e);e.label="";const n=t.insert("g").attr("class",p(e)).attr("id",e.domId??e.id),{cssStyles:a}=e,o=Math.max(28,e.width??0),s=[{x:0,y:o/2},{x:o/2,y:0},{x:0,y:-o/2},{x:-o/2,y:0}],l=c.A.svg(n),h=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(h.roughness=0,h.fillStyle="solid");const u=f(s),d=l.path(u,h),g=n.insert(()=>d,":first-child");return a&&"handDrawn"!==e.look&&g.selectAll("path").attr("style",a),r&&"handDrawn"!==e.look&&g.selectAll("path").attr("style",r),e.width=28,e.height=28,e.intersect=function(t){return z.polygon(e,s,t)},n}async function Y(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:l,halfPadding:u}=await h(t,e,p(e)),f=l.width/2+u;let g;const{cssStyles:m}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=t.circle(0,0,2*f,r);g=a.insert(()=>n,":first-child"),g.attr("class","basic label-container").attr("style",(0,o.KL)(m))}else g=a.insert("circle",":first-child").attr("class","basic label-container").attr("style",n).attr("r",f).attr("cx",0).attr("cy",0);return d(e,g),e.intersect=function(t){return s.Rm.info("Circle intersect",e,f,t),z.circle(e,f,t)},a}function G(t){const e=Math.cos(Math.PI/4),r=Math.sin(Math.PI/4),n=2*t;return`M ${-n/2*e},${n/2*r} L ${n/2*e},${-n/2*r}\n M ${n/2*e},${n/2*r} L ${-n/2*e},${-n/2*r}`}function X(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r,e.label="";const a=t.insert("g").attr("class",p(e)).attr("id",e.domId??e.id),o=Math.max(30,e?.width??0),{cssStyles:l}=e,h=c.A.svg(a),u=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(u.roughness=0,u.fillStyle="solid");const f=h.circle(0,0,2*o,u),g=G(o),m=h.path(g,u),y=a.insert(()=>f,":first-child");return y.insert(()=>m),l&&"handDrawn"!==e.look&&y.selectAll("path").attr("style",l),n&&"handDrawn"!==e.look&&y.selectAll("path").attr("style",n),d(e,y),e.intersect=function(t){s.Rm.info("crossedCircle intersect",e,{radius:o,point:t});return z.circle(e,o,t)},a}function V(t,e,r,n=100,i=0,a=180){const o=[],s=i*Math.PI/180,l=(a*Math.PI/180-s)/(n-1);for(let c=0;c<n;c++){const n=s+c*l,i=t+r*Math.cos(n),a=e+r*Math.sin(n);o.push({x:-i,y:-a})}return o}async function Z(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=o.width+(e.padding??0),u=o.height+(e.padding??0),g=Math.max(5,.1*u),{cssStyles:m}=e,y=[...V(l/2,-u/2,g,30,-90,0),{x:-l/2-g,y:g},...V(l/2+2*g,-g,g,20,-180,-270),...V(l/2+2*g,g,g,20,-90,-180),{x:-l/2-g,y:-u/2},...V(l/2,u/2,g,20,0,90)],x=[{x:l/2,y:-u/2-g},{x:-l/2,y:-u/2-g},...V(l/2,-u/2,g,20,-90,0),{x:-l/2-g,y:-g},...V(l/2+.1*l,-g,g,20,-180,-270),...V(l/2+.1*l,g,g,20,-90,-180),{x:-l/2-g,y:u/2},...V(l/2,u/2,g,20,0,90),{x:-l/2,y:u/2+g},{x:l/2,y:u/2+g}],b=c.A.svg(a),k=(0,i.Fr)(e,{fill:"none"});"handDrawn"!==e.look&&(k.roughness=0,k.fillStyle="solid");const C=f(y).replace("Z",""),w=b.path(C,k),_=f(x),v=b.path(_,{...k}),S=a.insert("g",":first-child");return S.insert(()=>v,":first-child").attr("stroke-opacity",0),S.insert(()=>w,":first-child"),S.attr("class","text"),m&&"handDrawn"!==e.look&&S.selectAll("path").attr("style",m),n&&"handDrawn"!==e.look&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${g}, 0)`),s.attr("transform",`translate(${-l/2+g-(o.x-(o.left??0))},${-u/2+(e.padding??0)/2-(o.y-(o.top??0))})`),d(e,S),e.intersect=function(t){return z.polygon(e,x,t)},a}function Q(t,e,r,n=100,i=0,a=180){const o=[],s=i*Math.PI/180,l=(a*Math.PI/180-s)/(n-1);for(let c=0;c<n;c++){const n=s+c*l,i=t+r*Math.cos(n),a=e+r*Math.sin(n);o.push({x:i,y:a})}return o}async function J(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=o.width+(e.padding??0),u=o.height+(e.padding??0),g=Math.max(5,.1*u),{cssStyles:m}=e,y=[...Q(l/2,-u/2,g,20,-90,0),{x:l/2+g,y:-g},...Q(l/2+2*g,-g,g,20,-180,-270),...Q(l/2+2*g,g,g,20,-90,-180),{x:l/2+g,y:u/2},...Q(l/2,u/2,g,20,0,90)],x=[{x:-l/2,y:-u/2-g},{x:l/2,y:-u/2-g},...Q(l/2,-u/2,g,20,-90,0),{x:l/2+g,y:-g},...Q(l/2+2*g,-g,g,20,-180,-270),...Q(l/2+2*g,g,g,20,-90,-180),{x:l/2+g,y:u/2},...Q(l/2,u/2,g,20,0,90),{x:l/2,y:u/2+g},{x:-l/2,y:u/2+g}],b=c.A.svg(a),k=(0,i.Fr)(e,{fill:"none"});"handDrawn"!==e.look&&(k.roughness=0,k.fillStyle="solid");const C=f(y).replace("Z",""),w=b.path(C,k),_=f(x),v=b.path(_,{...k}),S=a.insert("g",":first-child");return S.insert(()=>v,":first-child").attr("stroke-opacity",0),S.insert(()=>w,":first-child"),S.attr("class","text"),m&&"handDrawn"!==e.look&&S.selectAll("path").attr("style",m),n&&"handDrawn"!==e.look&&S.selectAll("path").attr("style",n),S.attr("transform",`translate(${-g}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(o.x-(o.left??0))},${-u/2+(e.padding??0)/2-(o.y-(o.top??0))})`),d(e,S),e.intersect=function(t){return z.polygon(e,x,t)},a}function tt(t,e,r,n=100,i=0,a=180){const o=[],s=i*Math.PI/180,l=(a*Math.PI/180-s)/(n-1);for(let c=0;c<n;c++){const n=s+c*l,i=t+r*Math.cos(n),a=e+r*Math.sin(n);o.push({x:-i,y:-a})}return o}async function et(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=o.width+(e.padding??0),u=o.height+(e.padding??0),g=Math.max(5,.1*u),{cssStyles:m}=e,y=[...tt(l/2,-u/2,g,30,-90,0),{x:-l/2-g,y:g},...tt(l/2+2*g,-g,g,20,-180,-270),...tt(l/2+2*g,g,g,20,-90,-180),{x:-l/2-g,y:-u/2},...tt(l/2,u/2,g,20,0,90)],x=[...tt(-l/2+g+g/2,-u/2,g,20,-90,-180),{x:l/2-g/2,y:g},...tt(-l/2-g/2,-g,g,20,0,90),...tt(-l/2-g/2,g,g,20,-90,0),{x:l/2-g/2,y:-g},...tt(-l/2+g+g/2,u/2,g,30,-180,-270)],b=[{x:l/2,y:-u/2-g},{x:-l/2,y:-u/2-g},...tt(l/2,-u/2,g,20,-90,0),{x:-l/2-g,y:-g},...tt(l/2+2*g,-g,g,20,-180,-270),...tt(l/2+2*g,g,g,20,-90,-180),{x:-l/2-g,y:u/2},...tt(l/2,u/2,g,20,0,90),{x:-l/2,y:u/2+g},{x:l/2-g-g/2,y:u/2+g},...tt(-l/2+g+g/2,-u/2,g,20,-90,-180),{x:l/2-g/2,y:g},...tt(-l/2-g/2,-g,g,20,0,90),...tt(-l/2-g/2,g,g,20,-90,0),{x:l/2-g/2,y:-g},...tt(-l/2+g+g/2,u/2,g,30,-180,-270)],k=c.A.svg(a),C=(0,i.Fr)(e,{fill:"none"});"handDrawn"!==e.look&&(C.roughness=0,C.fillStyle="solid");const w=f(y).replace("Z",""),_=k.path(w,C),v=f(x).replace("Z",""),S=k.path(v,C),A=f(b),T=k.path(A,{...C}),M=a.insert("g",":first-child");return M.insert(()=>T,":first-child").attr("stroke-opacity",0),M.insert(()=>_,":first-child"),M.insert(()=>S,":first-child"),M.attr("class","text"),m&&"handDrawn"!==e.look&&M.selectAll("path").attr("style",m),n&&"handDrawn"!==e.look&&M.selectAll("path").attr("style",n),M.attr("transform",`translate(${g-g/4}, 0)`),s.attr("transform",`translate(${-l/2+(e.padding??0)/2-(o.x-(o.left??0))},${-u/2+(e.padding??0)/2-(o.y-(o.top??0))})`),d(e,M),e.intersect=function(t){return z.polygon(e,b,t)},a}async function rt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(80,1.25*(o.width+2*(e.padding??0)),e?.width??0),l=Math.max(20,o.height+2*(e.padding??0),e?.height??0),u=l/2,{cssStyles:g}=e,y=c.A.svg(a),x=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(x.roughness=0,x.fillStyle="solid");const b=s-u,k=l/4,C=[{x:b,y:0},{x:k,y:0},{x:0,y:l/2},{x:k,y:l},{x:b,y:l},...m(-b,-l/2,u,50,270,90)],w=f(C),_=y.path(w,x),v=a.insert(()=>_,":first-child");return v.attr("class","basic label-container"),g&&"handDrawn"!==e.look&&v.selectChildren("path").attr("style",g),n&&"handDrawn"!==e.look&&v.selectChildren("path").attr("style",n),v.attr("transform",`translate(${-s/2}, ${-l/2})`),d(e,v),e.intersect=function(t){return z.polygon(e,C,t)},a}(0,s.K2)(P,"anchor"),(0,s.K2)(K,"generateArcPoints"),(0,s.K2)(q,"bowTieRect"),(0,s.K2)(W,"insertPolygonShape"),(0,s.K2)(H,"card"),(0,s.K2)(U,"choice"),(0,s.K2)(Y,"circle"),(0,s.K2)(G,"createLine"),(0,s.K2)(X,"crossedCircle"),(0,s.K2)(V,"generateCirclePoints"),(0,s.K2)(Z,"curlyBraceLeft"),(0,s.K2)(Q,"generateCirclePoints"),(0,s.K2)(J,"curlyBraceRight"),(0,s.K2)(tt,"generateCirclePoints"),(0,s.K2)(et,"curlyBraces"),(0,s.K2)(rt,"curvedTrapezoid");var nt=(0,s.K2)((t,e,r,n,i,a)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,"l0,"+-n].join(" "),"createCylinderPathD"),it=(0,s.K2)((t,e,r,n,i,a)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,"l0,"+-n].join(" "),"createOuterCylinderPathD"),at=(0,s.K2)((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");async function ot(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:s,label:l}=await h(t,e,p(e)),u=Math.max(s.width+e.padding,e.width??0),f=u/2,g=f/(2.5+u/50),m=Math.max(s.height+g+e.padding,e.height??0);let y;const{cssStyles:x}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=it(0,0,u,m,f,g),n=at(0,g,u,m,f,g),o=t.path(r,(0,i.Fr)(e,{})),s=t.path(n,(0,i.Fr)(e,{fill:"none"}));y=a.insert(()=>s,":first-child"),y=a.insert(()=>o,":first-child"),y.attr("class","basic label-container"),x&&y.attr("style",x)}else{const t=nt(0,0,u,m,f,g);y=a.insert("path",":first-child").attr("d",t).attr("class","basic label-container").attr("style",(0,o.KL)(x)).attr("style",n)}return y.attr("label-offset-y",g),y.attr("transform",`translate(${-u/2}, ${-(m/2+g)})`),d(e,y),l.attr("transform",`translate(${-s.width/2-(s.x-(s.left??0))}, ${-s.height/2+(e.padding??0)/1.5-(s.y-(s.top??0))})`),e.intersect=function(t){const r=z.rect(e,t),n=r.x-(e.x??0);if(0!=f&&(Math.abs(n)<(e.width??0)/2||Math.abs(n)==(e.width??0)/2&&Math.abs(r.y-(e.y??0))>(e.height??0)/2-g)){let i=g*g*(1-n*n/(f*f));i>0&&(i=Math.sqrt(i)),i=g-i,t.y-(e.y??0)>0&&(i=-i),r.y+=i}return r},a}async function st(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=o.width+e.padding,u=o.height+e.padding,f=.2*u,g=-l/2,m=-u/2-f/2,{cssStyles:y}=e,x=c.A.svg(a),b=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=[{x:g,y:m+f},{x:-g,y:m+f},{x:-g,y:-m},{x:g,y:-m},{x:g,y:m},{x:-g,y:m},{x:-g,y:m+f}],C=x.polygon(k.map(t=>[t.x,t.y]),b),w=a.insert(()=>C,":first-child");return w.attr("class","basic label-container"),y&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",y),n&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",n),s.attr("transform",`translate(${g+(e.padding??0)/2-(o.x-(o.left??0))}, ${m+f+(e.padding??0)/2-(o.y-(o.top??0))})`),d(e,w),e.intersect=function(t){return z.rect(e,t)},a}async function lt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:l,halfPadding:u}=await h(t,e,p(e)),f=l.width/2+u+5,g=l.width/2+u;let m;const{cssStyles:y}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{roughness:.2,strokeWidth:2.5}),n=(0,i.Fr)(e,{roughness:.2,strokeWidth:1.5}),s=t.circle(0,0,2*f,r),l=t.circle(0,0,2*g,n);m=a.insert("g",":first-child"),m.attr("class",(0,o.KL)(e.cssClasses)).attr("style",(0,o.KL)(y)),m.node()?.appendChild(s),m.node()?.appendChild(l)}else{m=a.insert("g",":first-child");const t=m.insert("circle",":first-child"),e=m.insert("circle");m.attr("class","basic label-container").attr("style",n),t.attr("class","outer-circle").attr("style",n).attr("r",f).attr("cx",0).attr("cy",0),e.attr("class","inner-circle").attr("style",n).attr("r",g).attr("cx",0).attr("cy",0)}return d(e,m),e.intersect=function(t){return s.Rm.info("DoubleCircle intersect",e,f,t),z.circle(e,f,t)},a}function ct(t,e,{config:{themeVariables:r}}){const{labelStyles:n,nodeStyles:a}=(0,i.GX)(e);e.label="",e.labelStyle=n;const o=t.insert("g").attr("class",p(e)).attr("id",e.domId??e.id),{cssStyles:l}=e,h=c.A.svg(o),{nodeBorder:u}=r,f=(0,i.Fr)(e,{fillStyle:"solid"});"handDrawn"!==e.look&&(f.roughness=0);const g=h.circle(0,0,14,f),m=o.insert(()=>g,":first-child");return m.selectAll("path").attr("style",`fill: ${u} !important;`),l&&l.length>0&&"handDrawn"!==e.look&&m.selectAll("path").attr("style",l),a&&"handDrawn"!==e.look&&m.selectAll("path").attr("style",a),d(e,m),e.intersect=function(t){s.Rm.info("filledCircle intersect",e,{radius:7,point:t});return z.circle(e,7,t)},o}async function ht(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:l}=await h(t,e,p(e)),u=o.width+(e.padding??0),g=u+o.height,m=u+o.height,y=[{x:0,y:-g},{x:m,y:-g},{x:m/2,y:0}],{cssStyles:x}=e,b=c.A.svg(a),k=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(k.roughness=0,k.fillStyle="solid");const C=f(y),w=b.path(C,k),_=a.insert(()=>w,":first-child").attr("transform",`translate(${-g/2}, ${g/2})`);return x&&"handDrawn"!==e.look&&_.selectChildren("path").attr("style",x),n&&"handDrawn"!==e.look&&_.selectChildren("path").attr("style",n),e.width=u,e.height=g,d(e,_),l.attr("transform",`translate(${-o.width/2-(o.x-(o.left??0))}, ${-g/2+(e.padding??0)/2+(o.y-(o.top??0))})`),e.intersect=function(t){return s.Rm.info("Triangle intersect",e,y,t),z.polygon(e,y,t)},a}function ut(t,e,{dir:r,config:{state:n,themeVariables:a}}){const{nodeStyles:o}=(0,i.GX)(e);e.label="";const s=t.insert("g").attr("class",p(e)).attr("id",e.domId??e.id),{cssStyles:l}=e;let h=Math.max(70,e?.width??0),u=Math.max(10,e?.height??0);"LR"===r&&(h=Math.max(10,e?.width??0),u=Math.max(70,e?.height??0));const f=-1*h/2,g=-1*u/2,m=c.A.svg(s),y=(0,i.Fr)(e,{stroke:a.lineColor,fill:a.lineColor});"handDrawn"!==e.look&&(y.roughness=0,y.fillStyle="solid");const x=m.rectangle(f,g,h,u,y),b=s.insert(()=>x,":first-child");l&&"handDrawn"!==e.look&&b.selectAll("path").attr("style",l),o&&"handDrawn"!==e.look&&b.selectAll("path").attr("style",o),d(e,b);const k=n?.padding??0;return e.width&&e.height&&(e.width+=k/2||0,e.height+=k/2||0),e.intersect=function(t){return z.rect(e,t)},s}async function dt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),l=Math.max(80,o.width+2*(e.padding??0),e?.width??0),u=Math.max(50,o.height+2*(e.padding??0),e?.height??0),g=u/2,{cssStyles:y}=e,x=c.A.svg(a),b=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=[{x:-l/2,y:-u/2},{x:l/2-g,y:-u/2},...m(-l/2+g,0,g,50,90,270),{x:l/2-g,y:u/2},{x:-l/2,y:u/2}],C=f(k),w=x.path(C,b),_=a.insert(()=>w,":first-child");return _.attr("class","basic label-container"),y&&"handDrawn"!==e.look&&_.selectChildren("path").attr("style",y),n&&"handDrawn"!==e.look&&_.selectChildren("path").attr("style",n),d(e,_),e.intersect=function(t){s.Rm.info("Pill intersect",e,{radius:g,point:t});return z.polygon(e,k,t)},a}(0,s.K2)(ot,"cylinder"),(0,s.K2)(st,"dividedRectangle"),(0,s.K2)(lt,"doublecircle"),(0,s.K2)(ct,"filledCircle"),(0,s.K2)(ht,"flippedTriangle"),(0,s.K2)(ut,"forkJoin"),(0,s.K2)(dt,"halfRoundedRectangle");var pt=(0,s.K2)((t,e,r,n,i)=>[`M${t+i},${e}`,`L${t+r-i},${e}`,`L${t+r},${e-n/2}`,`L${t+r-i},${e-n}`,`L${t+i},${e-n}`,`L${t},${e-n/2}`,"Z"].join(" "),"createHexagonPathD");async function ft(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=o.height+e.padding,l=s/4,u=o.width+2*l+e.padding,f=[{x:l,y:0},{x:u-l,y:0},{x:u,y:-s/2},{x:u-l,y:-s},{x:l,y:-s},{x:0,y:-s/2}];let g;const{cssStyles:m}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=pt(0,0,u,s,l),o=t.path(n,r);g=a.insert(()=>o,":first-child").attr("transform",`translate(${-u/2}, ${s/2})`),m&&g.attr("style",m)}else g=W(a,u,s,f);return n&&g.attr("style",n),e.width=u,e.height=s,d(e,g),e.intersect=function(t){return z.polygon(e,f,t)},a}async function gt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.label="",e.labelStyle=r;const{shapeSvg:a}=await h(t,e,p(e)),o=Math.max(30,e?.width??0),l=Math.max(30,e?.height??0),{cssStyles:u}=e,g=c.A.svg(a),m=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(m.roughness=0,m.fillStyle="solid");const y=[{x:0,y:0},{x:o,y:0},{x:0,y:l},{x:o,y:l}],x=f(y),b=g.path(x,m),k=a.insert(()=>b,":first-child");return k.attr("class","basic label-container"),u&&"handDrawn"!==e.look&&k.selectChildren("path").attr("style",u),n&&"handDrawn"!==e.look&&k.selectChildren("path").attr("style",n),k.attr("transform",`translate(${-o/2}, ${-l/2})`),d(e,k),e.intersect=function(t){s.Rm.info("Pill intersect",e,{points:y});return z.polygon(e,y,t)},a}async function mt(t,e,{config:{themeVariables:r,flowchart:n}}){const{labelStyles:o}=(0,i.GX)(e);e.labelStyle=o;const l=e.assetHeight??48,u=e.assetWidth??48,p=Math.max(l,u),f=n?.wrappingWidth;e.width=Math.max(p,f??0);const{shapeSvg:g,bbox:m,label:y}=await h(t,e,"icon-shape default"),x="t"===e.pos,b=p,k=p,{nodeBorder:C}=r,{stylesMap:w}=(0,i.WW)(e),_=-k/2,v=-b/2,S=e.label?8:0,A=c.A.svg(g),T=(0,i.Fr)(e,{stroke:"none",fill:"none"});"handDrawn"!==e.look&&(T.roughness=0,T.fillStyle="solid");const M=A.rectangle(_,v,k,b,T),B=Math.max(k,m.width),L=b+m.height+S,F=A.rectangle(-B/2,-L/2,B,L,{...T,fill:"transparent",stroke:"none"}),$=g.insert(()=>M,":first-child"),E=g.insert(()=>F);if(e.icon){const t=g.append("g");t.html(`<g>${await(0,a.WY)(e.icon,{height:p,width:p,fallbackPrefix:""})}</g>`);const r=t.node().getBBox(),n=r.width,i=r.height,o=r.x,s=r.y;t.attr("transform",`translate(${-n/2-o},${x?m.height/2+S/2-i/2-s:-m.height/2-S/2-i/2-s})`),t.attr("style",`color: ${w.get("stroke")??C};`)}return y.attr("transform",`translate(${-m.width/2-(m.x-(m.left??0))},${x?-L/2:L/2-m.height})`),$.attr("transform",`translate(0,${x?m.height/2+S/2:-m.height/2-S/2})`),d(e,E),e.intersect=function(t){if(s.Rm.info("iconSquare intersect",e,t),!e.label)return z.rect(e,t);const r=e.x??0,n=e.y??0,i=e.height??0;let a=[];a=x?[{x:r-m.width/2,y:n-i/2},{x:r+m.width/2,y:n-i/2},{x:r+m.width/2,y:n-i/2+m.height+S},{x:r+k/2,y:n-i/2+m.height+S},{x:r+k/2,y:n+i/2},{x:r-k/2,y:n+i/2},{x:r-k/2,y:n-i/2+m.height+S},{x:r-m.width/2,y:n-i/2+m.height+S}]:[{x:r-k/2,y:n-i/2},{x:r+k/2,y:n-i/2},{x:r+k/2,y:n-i/2+b},{x:r+m.width/2,y:n-i/2+b},{x:r+m.width/2/2,y:n+i/2},{x:r-m.width/2,y:n+i/2},{x:r-m.width/2,y:n-i/2+b},{x:r-k/2,y:n-i/2+b}];return z.polygon(e,a,t)},g}async function yt(t,e,{config:{themeVariables:r,flowchart:n}}){const{labelStyles:o}=(0,i.GX)(e);e.labelStyle=o;const l=e.assetHeight??48,u=e.assetWidth??48,p=Math.max(l,u),f=n?.wrappingWidth;e.width=Math.max(p,f??0);const{shapeSvg:g,bbox:m,label:y}=await h(t,e,"icon-shape default"),x=e.label?8:0,b="t"===e.pos,{nodeBorder:k,mainBkg:C}=r,{stylesMap:w}=(0,i.WW)(e),_=c.A.svg(g),v=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(v.roughness=0,v.fillStyle="solid");const S=w.get("fill");v.stroke=S??C;const A=g.append("g");e.icon&&A.html(`<g>${await(0,a.WY)(e.icon,{height:p,width:p,fallbackPrefix:""})}</g>`);const T=A.node().getBBox(),M=T.width,B=T.height,L=T.x,F=T.y,$=Math.max(M,B)*Math.SQRT2+40,E=_.circle(0,0,$,v),D=Math.max($,m.width),N=$+m.height+x,O=_.rectangle(-D/2,-N/2,D,N,{...v,fill:"transparent",stroke:"none"}),R=g.insert(()=>E,":first-child"),I=g.insert(()=>O);return A.attr("transform",`translate(${-M/2-L},${b?m.height/2+x/2-B/2-F:-m.height/2-x/2-B/2-F})`),A.attr("style",`color: ${w.get("stroke")??k};`),y.attr("transform",`translate(${-m.width/2-(m.x-(m.left??0))},${b?-N/2:N/2-m.height})`),R.attr("transform",`translate(0,${b?m.height/2+x/2:-m.height/2-x/2})`),d(e,I),e.intersect=function(t){s.Rm.info("iconSquare intersect",e,t);return z.rect(e,t)},g}async function xt(t,e,{config:{themeVariables:r,flowchart:n}}){const{labelStyles:o}=(0,i.GX)(e);e.labelStyle=o;const l=e.assetHeight??48,u=e.assetWidth??48,p=Math.max(l,u),f=n?.wrappingWidth;e.width=Math.max(p,f??0);const{shapeSvg:g,bbox:m,halfPadding:y,label:x}=await h(t,e,"icon-shape default"),b="t"===e.pos,k=p+2*y,w=p+2*y,{nodeBorder:_,mainBkg:v}=r,{stylesMap:S}=(0,i.WW)(e),A=-w/2,T=-k/2,M=e.label?8:0,B=c.A.svg(g),L=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(L.roughness=0,L.fillStyle="solid");const F=S.get("fill");L.stroke=F??v;const $=B.path(C(A,T,w,k,5),L),E=Math.max(w,m.width),D=k+m.height+M,N=B.rectangle(-E/2,-D/2,E,D,{...L,fill:"transparent",stroke:"none"}),O=g.insert(()=>$,":first-child").attr("class","icon-shape2"),R=g.insert(()=>N);if(e.icon){const t=g.append("g");t.html(`<g>${await(0,a.WY)(e.icon,{height:p,width:p,fallbackPrefix:""})}</g>`);const r=t.node().getBBox(),n=r.width,i=r.height,o=r.x,s=r.y;t.attr("transform",`translate(${-n/2-o},${b?m.height/2+M/2-i/2-s:-m.height/2-M/2-i/2-s})`),t.attr("style",`color: ${S.get("stroke")??_};`)}return x.attr("transform",`translate(${-m.width/2-(m.x-(m.left??0))},${b?-D/2:D/2-m.height})`),O.attr("transform",`translate(0,${b?m.height/2+M/2:-m.height/2-M/2})`),d(e,R),e.intersect=function(t){if(s.Rm.info("iconSquare intersect",e,t),!e.label)return z.rect(e,t);const r=e.x??0,n=e.y??0,i=e.height??0;let a=[];a=b?[{x:r-m.width/2,y:n-i/2},{x:r+m.width/2,y:n-i/2},{x:r+m.width/2,y:n-i/2+m.height+M},{x:r+w/2,y:n-i/2+m.height+M},{x:r+w/2,y:n+i/2},{x:r-w/2,y:n+i/2},{x:r-w/2,y:n-i/2+m.height+M},{x:r-m.width/2,y:n-i/2+m.height+M}]:[{x:r-w/2,y:n-i/2},{x:r+w/2,y:n-i/2},{x:r+w/2,y:n-i/2+k},{x:r+m.width/2,y:n-i/2+k},{x:r+m.width/2/2,y:n+i/2},{x:r-m.width/2,y:n+i/2},{x:r-m.width/2,y:n-i/2+k},{x:r-w/2,y:n-i/2+k}];return z.polygon(e,a,t)},g}async function bt(t,e,{config:{themeVariables:r,flowchart:n}}){const{labelStyles:o}=(0,i.GX)(e);e.labelStyle=o;const l=e.assetHeight??48,u=e.assetWidth??48,p=Math.max(l,u),f=n?.wrappingWidth;e.width=Math.max(p,f??0);const{shapeSvg:g,bbox:m,halfPadding:y,label:x}=await h(t,e,"icon-shape default"),b="t"===e.pos,k=p+2*y,w=p+2*y,{nodeBorder:_,mainBkg:v}=r,{stylesMap:S}=(0,i.WW)(e),A=-w/2,T=-k/2,M=e.label?8:0,B=c.A.svg(g),L=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(L.roughness=0,L.fillStyle="solid");const F=S.get("fill");L.stroke=F??v;const $=B.path(C(A,T,w,k,.1),L),E=Math.max(w,m.width),D=k+m.height+M,N=B.rectangle(-E/2,-D/2,E,D,{...L,fill:"transparent",stroke:"none"}),O=g.insert(()=>$,":first-child"),R=g.insert(()=>N);if(e.icon){const t=g.append("g");t.html(`<g>${await(0,a.WY)(e.icon,{height:p,width:p,fallbackPrefix:""})}</g>`);const r=t.node().getBBox(),n=r.width,i=r.height,o=r.x,s=r.y;t.attr("transform",`translate(${-n/2-o},${b?m.height/2+M/2-i/2-s:-m.height/2-M/2-i/2-s})`),t.attr("style",`color: ${S.get("stroke")??_};`)}return x.attr("transform",`translate(${-m.width/2-(m.x-(m.left??0))},${b?-D/2:D/2-m.height})`),O.attr("transform",`translate(0,${b?m.height/2+M/2:-m.height/2-M/2})`),d(e,R),e.intersect=function(t){if(s.Rm.info("iconSquare intersect",e,t),!e.label)return z.rect(e,t);const r=e.x??0,n=e.y??0,i=e.height??0;let a=[];a=b?[{x:r-m.width/2,y:n-i/2},{x:r+m.width/2,y:n-i/2},{x:r+m.width/2,y:n-i/2+m.height+M},{x:r+w/2,y:n-i/2+m.height+M},{x:r+w/2,y:n+i/2},{x:r-w/2,y:n+i/2},{x:r-w/2,y:n-i/2+m.height+M},{x:r-m.width/2,y:n-i/2+m.height+M}]:[{x:r-w/2,y:n-i/2},{x:r+w/2,y:n-i/2},{x:r+w/2,y:n-i/2+k},{x:r+m.width/2,y:n-i/2+k},{x:r+m.width/2/2,y:n+i/2},{x:r-m.width/2,y:n+i/2},{x:r-m.width/2,y:n-i/2+k},{x:r-w/2,y:n-i/2+k}];return z.polygon(e,a,t)},g}async function kt(t,e,{config:{flowchart:r}}){const n=new Image;n.src=e?.img??"",await n.decode();const a=Number(n.naturalWidth.toString().replace("px","")),o=Number(n.naturalHeight.toString().replace("px",""));e.imageAspectRatio=a/o;const{labelStyles:l}=(0,i.GX)(e);e.labelStyle=l;const u=r?.wrappingWidth;e.defaultWidth=r?.wrappingWidth;const p=Math.max(e.label?u??0:0,e?.assetWidth??a),f="on"===e.constraint&&e?.assetHeight?e.assetHeight*e.imageAspectRatio:p,g="on"===e.constraint?f/e.imageAspectRatio:e?.assetHeight??o;e.width=Math.max(f,u??0);const{shapeSvg:m,bbox:y,label:x}=await h(t,e,"image-shape default"),b="t"===e.pos,k=-f/2,C=-g/2,w=e.label?8:0,_=c.A.svg(m),v=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(v.roughness=0,v.fillStyle="solid");const S=_.rectangle(k,C,f,g,v),A=Math.max(f,y.width),T=g+y.height+w,M=_.rectangle(-A/2,-T/2,A,T,{...v,fill:"none",stroke:"none"}),B=m.insert(()=>S,":first-child"),L=m.insert(()=>M);if(e.img){const t=m.append("image");t.attr("href",e.img),t.attr("width",f),t.attr("height",g),t.attr("preserveAspectRatio","none"),t.attr("transform",`translate(${-f/2},${b?T/2-g:-T/2})`)}return x.attr("transform",`translate(${-y.width/2-(y.x-(y.left??0))},${b?-g/2-y.height/2-w/2:g/2-y.height/2+w/2})`),B.attr("transform",`translate(0,${b?y.height/2+w/2:-y.height/2-w/2})`),d(e,L),e.intersect=function(t){if(s.Rm.info("iconSquare intersect",e,t),!e.label)return z.rect(e,t);const r=e.x??0,n=e.y??0,i=e.height??0;let a=[];a=b?[{x:r-y.width/2,y:n-i/2},{x:r+y.width/2,y:n-i/2},{x:r+y.width/2,y:n-i/2+y.height+w},{x:r+f/2,y:n-i/2+y.height+w},{x:r+f/2,y:n+i/2},{x:r-f/2,y:n+i/2},{x:r-f/2,y:n-i/2+y.height+w},{x:r-y.width/2,y:n-i/2+y.height+w}]:[{x:r-f/2,y:n-i/2},{x:r+f/2,y:n-i/2},{x:r+f/2,y:n-i/2+g},{x:r+y.width/2,y:n-i/2+g},{x:r+y.width/2/2,y:n+i/2},{x:r-y.width/2,y:n+i/2},{x:r-y.width/2,y:n-i/2+g},{x:r-f/2,y:n-i/2+g}];return z.polygon(e,a,t)},m}async function Ct(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(o.width+2*(e.padding??0),e?.width??0),l=Math.max(o.height+2*(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:-3*l/6,y:-l}];let g;const{cssStyles:m}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=f(u),o=t.path(n,r);g=a.insert(()=>o,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),m&&g.attr("style",m)}else g=W(a,s,l,u);return n&&g.attr("style",n),e.width=s,e.height=l,d(e,g),e.intersect=function(t){return z.polygon(e,u,t)},a}async function wt(t,e,r){const{labelStyles:n,nodeStyles:a}=(0,i.GX)(e);e.labelStyle=n;const{shapeSvg:s,bbox:l}=await h(t,e,p(e)),u=Math.max(l.width+2*r.labelPaddingX,e?.width||0),f=Math.max(l.height+2*r.labelPaddingY,e?.height||0),g=-u/2,m=-f/2;let y,{rx:x,ry:b}=e;const{cssStyles:k}=e;if(r?.rx&&r.ry&&(x=r.rx,b=r.ry),"handDrawn"===e.look){const t=c.A.svg(s),r=(0,i.Fr)(e,{}),n=x||b?t.path(C(g,m,u,f,x||0),r):t.rectangle(g,m,u,f,r);y=s.insert(()=>n,":first-child"),y.attr("class","basic label-container").attr("style",(0,o.KL)(k))}else y=s.insert("rect",":first-child"),y.attr("class","basic label-container").attr("style",a).attr("rx",(0,o.KL)(x)).attr("ry",(0,o.KL)(b)).attr("x",g).attr("y",m).attr("width",u).attr("height",f);return d(e,y),e.intersect=function(t){return z.rect(e,t)},s}async function _t(t,e){const{shapeSvg:r,bbox:n,label:i}=await h(t,e,"label"),a=r.insert("rect",":first-child");return a.attr("width",.1).attr("height",.1),r.attr("class","label edgeLabel"),i.attr("transform",`translate(${-n.width/2-(n.x-(n.left??0))}, ${-n.height/2-(n.y-(n.top??0))})`),d(e,a),e.intersect=function(t){return z.rect(e,t)},r}async function vt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(o.width+(e.padding??0),e?.width??0),l=Math.max(o.height+(e.padding??0),e?.height??0),u=[{x:0,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:-3*l/6,y:-l}];let g;const{cssStyles:m}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=f(u),o=t.path(n,r);g=a.insert(()=>o,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),m&&g.attr("style",m)}else g=W(a,s,l,u);return n&&g.attr("style",n),e.width=s,e.height=l,d(e,g),e.intersect=function(t){return z.polygon(e,u,t)},a}async function St(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(o.width+(e.padding??0),e?.width??0),l=Math.max(o.height+(e.padding??0),e?.height??0),u=[{x:-3*l/6,y:0},{x:s,y:0},{x:s+3*l/6,y:-l},{x:0,y:-l}];let g;const{cssStyles:m}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=f(u),o=t.path(n,r);g=a.insert(()=>o,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),m&&g.attr("style",m)}else g=W(a,s,l,u);return n&&g.attr("style",n),e.width=s,e.height=l,d(e,g),e.intersect=function(t){return z.polygon(e,u,t)},a}function At(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.label="",e.labelStyle=r;const a=t.insert("g").attr("class",p(e)).attr("id",e.domId??e.id),{cssStyles:o}=e,l=Math.max(35,e?.width??0),h=Math.max(35,e?.height??0),u=[{x:l,y:0},{x:0,y:h+3.5},{x:l-14,y:h+3.5},{x:0,y:2*h},{x:l,y:h-3.5},{x:14,y:h-3.5}],g=c.A.svg(a),m=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(m.roughness=0,m.fillStyle="solid");const y=f(u),x=g.path(y,m),b=a.insert(()=>x,":first-child");return o&&"handDrawn"!==e.look&&b.selectAll("path").attr("style",o),n&&"handDrawn"!==e.look&&b.selectAll("path").attr("style",n),b.attr("transform",`translate(-${l/2},${-h})`),d(e,b),e.intersect=function(t){s.Rm.info("lightningBolt intersect",e,t);return z.polygon(e,u,t)},a}(0,s.K2)(ft,"hexagon"),(0,s.K2)(gt,"hourglass"),(0,s.K2)(mt,"icon"),(0,s.K2)(yt,"iconCircle"),(0,s.K2)(xt,"iconRounded"),(0,s.K2)(bt,"iconSquare"),(0,s.K2)(kt,"imageSquare"),(0,s.K2)(Ct,"inv_trapezoid"),(0,s.K2)(wt,"drawRect"),(0,s.K2)(_t,"labelRect"),(0,s.K2)(vt,"lean_left"),(0,s.K2)(St,"lean_right"),(0,s.K2)(At,"lightningBolt");var Tt=(0,s.K2)((t,e,r,n,i,a,o)=>[`M${t},${e+a}`,`a${i},${a} 0,0,0 ${r},0`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,"l0,"+-n,`M${t},${e+a+o}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createCylinderPathD"),Mt=(0,s.K2)((t,e,r,n,i,a,o)=>[`M${t},${e+a}`,`M${t+r},${e+a}`,`a${i},${a} 0,0,0 ${-r},0`,`l0,${n}`,`a${i},${a} 0,0,0 ${r},0`,"l0,"+-n,`M${t},${e+a+o}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createOuterCylinderPathD"),Bt=(0,s.K2)((t,e,r,n,i,a)=>[`M${t-r/2},${-n/2}`,`a${i},${a} 0,0,0 ${r},0`].join(" "),"createInnerCylinderPathD");async function Lt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:s,label:l}=await h(t,e,p(e)),u=Math.max(s.width+(e.padding??0),e.width??0),f=u/2,g=f/(2.5+u/50),m=Math.max(s.height+g+(e.padding??0),e.height??0),y=.1*m;let x;const{cssStyles:b}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=Mt(0,0,u,m,f,g,y),n=Bt(0,g,u,m,f,g),o=(0,i.Fr)(e,{}),s=t.path(r,o),l=t.path(n,o);a.insert(()=>l,":first-child").attr("class","line"),x=a.insert(()=>s,":first-child"),x.attr("class","basic label-container"),b&&x.attr("style",b)}else{const t=Tt(0,0,u,m,f,g,y);x=a.insert("path",":first-child").attr("d",t).attr("class","basic label-container").attr("style",(0,o.KL)(b)).attr("style",n)}return x.attr("label-offset-y",g),x.attr("transform",`translate(${-u/2}, ${-(m/2+g)})`),d(e,x),l.attr("transform",`translate(${-s.width/2-(s.x-(s.left??0))}, ${-s.height/2+g-(s.y-(s.top??0))})`),e.intersect=function(t){const r=z.rect(e,t),n=r.x-(e.x??0);if(0!=f&&(Math.abs(n)<(e.width??0)/2||Math.abs(n)==(e.width??0)/2&&Math.abs(r.y-(e.y??0))>(e.height??0)/2-g)){let i=g*g*(1-n*n/(f*f));i>0&&(i=Math.sqrt(i)),i=g-i,t.y-(e.y??0)>0&&(i=-i),r.y+=i}return r},a}async function Ft(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=Math.max(o.width+2*(e.padding??0),e?.width??0),u=Math.max(o.height+2*(e.padding??0),e?.height??0),f=u/4,m=u+f,{cssStyles:y}=e,x=c.A.svg(a),b=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=[{x:-l/2-l/2*.1,y:-m/2},{x:-l/2-l/2*.1,y:m/2},...g(-l/2-l/2*.1,m/2,l/2+l/2*.1,m/2,f,.8),{x:l/2+l/2*.1,y:-m/2},{x:-l/2-l/2*.1,y:-m/2},{x:-l/2,y:-m/2},{x:-l/2,y:m/2*1.1},{x:-l/2,y:-m/2}],C=x.polygon(k.map(t=>[t.x,t.y]),b),w=a.insert(()=>C,":first-child");return w.attr("class","basic label-container"),y&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",y),n&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",n),w.attr("transform",`translate(0,${-f/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)+l/2*.1/2-(o.x-(o.left??0))},${-u/2+(e.padding??0)-f/2-(o.y-(o.top??0))})`),d(e,w),e.intersect=function(t){return z.polygon(e,k,t)},a}async function $t(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=Math.max(o.width+2*(e.padding??0),e?.width??0),u=Math.max(o.height+2*(e.padding??0),e?.height??0),g=-l/2,m=-u/2,{cssStyles:y}=e,x=c.A.svg(a),b=(0,i.Fr)(e,{}),k=[{x:g-5,y:m+5},{x:g-5,y:m+u+5},{x:g+l-5,y:m+u+5},{x:g+l-5,y:m+u},{x:g+l,y:m+u},{x:g+l,y:m+u-5},{x:g+l+5,y:m+u-5},{x:g+l+5,y:m-5},{x:g+5,y:m-5},{x:g+5,y:m},{x:g,y:m},{x:g,y:m+5}],C=[{x:g,y:m+5},{x:g+l-5,y:m+5},{x:g+l-5,y:m+u},{x:g+l,y:m+u},{x:g+l,y:m},{x:g,y:m}];"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const w=f(k),_=x.path(w,b),v=f(C),S=x.path(v,{...b,fill:"none"}),A=a.insert(()=>S,":first-child");return A.insert(()=>_,":first-child"),A.attr("class","basic label-container"),y&&"handDrawn"!==e.look&&A.selectAll("path").attr("style",y),n&&"handDrawn"!==e.look&&A.selectAll("path").attr("style",n),s.attr("transform",`translate(${-o.width/2-5-(o.x-(o.left??0))}, ${-o.height/2+5-(o.y-(o.top??0))})`),d(e,A),e.intersect=function(t){return z.polygon(e,k,t)},a}async function Et(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=Math.max(o.width+2*(e.padding??0),e?.width??0),u=Math.max(o.height+2*(e.padding??0),e?.height??0),m=u/4,y=u+m,x=-l/2,b=-y/2,{cssStyles:k}=e,C=g(x-5,b+y+5,x+l-5,b+y+5,m,.8),w=C?.[C.length-1],_=[{x:x-5,y:b+5},{x:x-5,y:b+y+5},...C,{x:x+l-5,y:w.y-5},{x:x+l,y:w.y-5},{x:x+l,y:w.y-10},{x:x+l+5,y:w.y-10},{x:x+l+5,y:b-5},{x:x+5,y:b-5},{x:x+5,y:b},{x:x,y:b},{x:x,y:b+5}],v=[{x:x,y:b+5},{x:x+l-5,y:b+5},{x:x+l-5,y:w.y-5},{x:x+l,y:w.y-5},{x:x+l,y:b},{x:x,y:b}],S=c.A.svg(a),A=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(A.roughness=0,A.fillStyle="solid");const T=f(_),M=S.path(T,A),B=f(v),L=S.path(B,A),F=a.insert(()=>M,":first-child");return F.insert(()=>L),F.attr("class","basic label-container"),k&&"handDrawn"!==e.look&&F.selectAll("path").attr("style",k),n&&"handDrawn"!==e.look&&F.selectAll("path").attr("style",n),F.attr("transform",`translate(0,${-m/2})`),s.attr("transform",`translate(${-o.width/2-5-(o.x-(o.left??0))}, ${-o.height/2+5-m/2-(o.y-(o.top??0))})`),d(e,F),e.intersect=function(t){return z.polygon(e,_,t)},a}async function Dt(t,e,{config:{themeVariables:r}}){const{labelStyles:n,nodeStyles:a}=(0,i.GX)(e);e.labelStyle=n;e.useHtmlLabels||!1!==(0,s.zj)().flowchart?.htmlLabels||(e.centerLabel=!0);const{shapeSvg:o,bbox:l}=await h(t,e,p(e)),u=Math.max(l.width+2*(e.padding??0),e?.width??0),f=Math.max(l.height+2*(e.padding??0),e?.height??0),g=-u/2,m=-f/2,{cssStyles:y}=e,x=c.A.svg(o),b=(0,i.Fr)(e,{fill:r.noteBkgColor,stroke:r.noteBorderColor});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=x.rectangle(g,m,u,f,b),C=o.insert(()=>k,":first-child");return C.attr("class","basic label-container"),y&&"handDrawn"!==e.look&&C.selectAll("path").attr("style",y),a&&"handDrawn"!==e.look&&C.selectAll("path").attr("style",a),d(e,C),e.intersect=function(t){return z.rect(e,t)},o}(0,s.K2)(Lt,"linedCylinder"),(0,s.K2)(Ft,"linedWaveEdgedRect"),(0,s.K2)($t,"multiRect"),(0,s.K2)(Et,"multiWaveEdgedRectangle"),(0,s.K2)(Dt,"note");var Nt=(0,s.K2)((t,e,r)=>[`M${t+r/2},${e}`,`L${t+r},${e-r/2}`,`L${t+r/2},${e-r}`,`L${t},${e-r/2}`,"Z"].join(" "),"createDecisionBoxPathD");async function Ot(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),l=o.width+e.padding+(o.height+e.padding),u=[{x:l/2,y:0},{x:l,y:-l/2},{x:l/2,y:-l},{x:0,y:-l/2}];let f;const{cssStyles:g}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=Nt(0,0,l),o=t.path(n,r);f=a.insert(()=>o,":first-child").attr("transform",`translate(${-l/2}, ${l/2})`),g&&f.attr("style",g)}else f=W(a,l,l,u);return n&&f.attr("style",n),d(e,f),e.intersect=function(t){return s.Rm.debug("APA12 Intersect called SPLIT\npoint:",t,"\nnode:\n",e,"\nres:",z.polygon(e,u,t)),z.polygon(e,u,t)},a}async function Rt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=-Math.max(o.width+(e.padding??0),e?.width??0)/2,u=-Math.max(o.height+(e.padding??0),e?.height??0)/2,g=u/2,m=[{x:l+g,y:u},{x:l,y:0},{x:l+g,y:-u},{x:-l,y:-u},{x:-l,y:u}],{cssStyles:y}=e,x=c.A.svg(a),b=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=f(m),C=x.path(k,b),w=a.insert(()=>C,":first-child");return w.attr("class","basic label-container"),y&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",y),n&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",n),w.attr("transform",`translate(${-g/2},0)`),s.attr("transform",`translate(${-g/2-o.width/2-(o.x-(o.left??0))}, ${-o.height/2-(o.y-(o.top??0))})`),d(e,w),e.intersect=function(t){return z.polygon(e,m,t)},a}async function It(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);let a;e.labelStyle=r,a=e.cssClasses?"node "+e.cssClasses:"node default";const o=t.insert("g").attr("class",a).attr("id",e.domId||e.id),h=o.insert("g"),u=o.insert("g").attr("class","label").attr("style",n),p=e.description,f=e.label,g=u.node().appendChild(await k(f,e.labelStyle,!0,!0));let m={width:0,height:0};if((0,s._3)((0,s.D7)()?.flowchart?.htmlLabels)){const t=g.children[0],e=(0,l.Ltv)(g);m=t.getBoundingClientRect(),e.attr("width",m.width),e.attr("height",m.height)}s.Rm.info("Text 2",p);const y=p||[],x=g.getBBox(),b=u.node().appendChild(await k(y.join?y.join("<br/>"):y,e.labelStyle,!0,!0)),w=b.children[0],_=(0,l.Ltv)(b);m=w.getBoundingClientRect(),_.attr("width",m.width),_.attr("height",m.height);const v=(e.padding||0)/2;(0,l.Ltv)(b).attr("transform","translate( "+(m.width>x.width?0:(x.width-m.width)/2)+", "+(x.height+v+5)+")"),(0,l.Ltv)(g).attr("transform","translate( "+(m.width<x.width?0:-(x.width-m.width)/2)+", 0)"),m=u.node().getBBox(),u.attr("transform","translate("+-m.width/2+", "+(-m.height/2-v+3)+")");const S=m.width+(e.padding||0),A=m.height+(e.padding||0),T=-m.width/2-v,M=-m.height/2-v;let B,L;if("handDrawn"===e.look){const t=c.A.svg(o),r=(0,i.Fr)(e,{}),n=t.path(C(T,M,S,A,e.rx||0),r),a=t.line(-m.width/2-v,-m.height/2-v+x.height+v,m.width/2+v,-m.height/2-v+x.height+v,r);L=o.insert(()=>(s.Rm.debug("Rough node insert CXC",n),a),":first-child"),B=o.insert(()=>(s.Rm.debug("Rough node insert CXC",n),n),":first-child")}else B=h.insert("rect",":first-child"),L=h.insert("line"),B.attr("class","outer title-state").attr("style",n).attr("x",-m.width/2-v).attr("y",-m.height/2-v).attr("width",m.width+(e.padding||0)).attr("height",m.height+(e.padding||0)),L.attr("class","divider").attr("x1",-m.width/2-v).attr("x2",m.width/2+v).attr("y1",-m.height/2-v+x.height+v).attr("y2",-m.height/2-v+x.height+v);return d(e,B),e.intersect=function(t){return z.rect(e,t)},o}async function jt(t,e){return wt(t,e,{rx:5,ry:5,classes:"",labelPaddingX:1*(e?.padding||0),labelPaddingY:1*(e?.padding||0)})}async function zt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:s,label:l}=await h(t,e,p(e)),u=e?.padding??0,f=Math.max(s.width+2*(e.padding??0),e?.width??0),g=Math.max(s.height+2*(e.padding??0),e?.height??0),m=-s.width/2-u,y=-s.height/2-u,{cssStyles:x}=e,b=c.A.svg(a),k=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(k.roughness=0,k.fillStyle="solid");const C=[{x:m,y:y},{x:m+f+8,y:y},{x:m+f+8,y:y+g},{x:m-8,y:y+g},{x:m-8,y:y},{x:m,y:y},{x:m,y:y+g}],w=b.polygon(C.map(t=>[t.x,t.y]),k),_=a.insert(()=>w,":first-child");return _.attr("class","basic label-container").attr("style",(0,o.KL)(x)),n&&"handDrawn"!==e.look&&_.selectAll("path").attr("style",n),x&&"handDrawn"!==e.look&&_.selectAll("path").attr("style",n),l.attr("transform",`translate(${-f/2+4+(e.padding??0)-(s.x-(s.left??0))},${-g/2+(e.padding??0)-(s.y-(s.top??0))})`),d(e,_),e.intersect=function(t){return z.rect(e,t)},a}async function Pt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=Math.max(o.width+2*(e.padding??0),e?.width??0),u=Math.max(o.height+2*(e.padding??0),e?.height??0),g=-l/2,m=-u/2,{cssStyles:y}=e,x=c.A.svg(a),b=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=[{x:g,y:m},{x:g,y:m+u},{x:g+l,y:m+u},{x:g+l,y:m-u/2}],C=f(k),w=x.path(C,b),_=a.insert(()=>w,":first-child");return _.attr("class","basic label-container"),y&&"handDrawn"!==e.look&&_.selectChildren("path").attr("style",y),n&&"handDrawn"!==e.look&&_.selectChildren("path").attr("style",n),_.attr("transform",`translate(0, ${u/4})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(o.x-(o.left??0))}, ${-u/4+(e.padding??0)-(o.y-(o.top??0))})`),d(e,_),e.intersect=function(t){return z.polygon(e,k,t)},a}async function Kt(t,e){return wt(t,e,{rx:0,ry:0,classes:"",labelPaddingX:2*(e?.padding||0),labelPaddingY:1*(e?.padding||0)})}async function qt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:s}=await h(t,e,p(e)),l=s.height+e.padding,u=s.width+l/4+e.padding;let f;const{cssStyles:g}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=C(-u/2,-l/2,u,l,l/2),s=t.path(n,r);f=a.insert(()=>s,":first-child"),f.attr("class","basic label-container").attr("style",(0,o.KL)(g))}else f=a.insert("rect",":first-child"),f.attr("class","basic label-container").attr("style",n).attr("rx",l/2).attr("ry",l/2).attr("x",-u/2).attr("y",-l/2).attr("width",u).attr("height",l);return d(e,f),e.intersect=function(t){return z.rect(e,t)},a}async function Wt(t,e){return wt(t,e,{rx:5,ry:5,classes:"flowchart-node"})}function Ht(t,e,{config:{themeVariables:r}}){const{labelStyles:n,nodeStyles:a}=(0,i.GX)(e);e.labelStyle=n;const{cssStyles:o}=e,{lineColor:s,stateBorder:l,nodeBorder:h}=r,u=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),p=c.A.svg(u),f=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(f.roughness=0,f.fillStyle="solid");const g=p.circle(0,0,14,{...f,stroke:s,strokeWidth:2}),m=l??h,y=p.circle(0,0,5,{...f,fill:m,stroke:m,strokeWidth:2,fillStyle:"solid"}),x=u.insert(()=>g,":first-child");return x.insert(()=>y),o&&x.selectAll("path").attr("style",o),a&&x.selectAll("path").attr("style",a),d(e,x),e.intersect=function(t){return z.circle(e,7,t)},u}function Ut(t,e,{config:{themeVariables:r}}){const{lineColor:n}=r,a=t.insert("g").attr("class","node default").attr("id",e.domId||e.id);let o;if("handDrawn"===e.look){const t=c.A.svg(a).circle(0,0,14,(0,i.ue)(n));o=a.insert(()=>t),o.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14)}else o=a.insert("circle",":first-child"),o.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14);return d(e,o),e.intersect=function(t){return z.circle(e,7,t)},a}async function Yt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:s}=await h(t,e,p(e)),l=(e?.padding||0)/2,u=s.width+e.padding,f=s.height+e.padding,g=-s.width/2-l,m=-s.height/2-l,y=[{x:0,y:0},{x:u,y:0},{x:u,y:-f},{x:0,y:-f},{x:0,y:0},{x:-8,y:0},{x:u+8,y:0},{x:u+8,y:-f},{x:-8,y:-f},{x:-8,y:0}];if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=t.rectangle(g-8,m,u+16,f,r),s=t.line(g,m,g,m+f,r),l=t.line(g+u,m,g+u,m+f,r);a.insert(()=>s,":first-child"),a.insert(()=>l,":first-child");const h=a.insert(()=>n,":first-child"),{cssStyles:p}=e;h.attr("class","basic label-container").attr("style",(0,o.KL)(p)),d(e,h)}else{const t=W(a,u,f,y);n&&t.attr("style",n),d(e,t)}return e.intersect=function(t){return z.polygon(e,y,t)},a}async function Gt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(o.width+2*(e.padding??0),e?.width??0),l=Math.max(o.height+2*(e.padding??0),e?.height??0),u=-s/2,g=-l/2,m=.2*l,y=.2*l,{cssStyles:x}=e,b=c.A.svg(a),k=(0,i.Fr)(e,{}),C=[{x:u-m/2,y:g},{x:u+s+m/2,y:g},{x:u+s+m/2,y:g+l},{x:u-m/2,y:g+l}],w=[{x:u+s-m/2,y:g+l},{x:u+s+m/2,y:g+l},{x:u+s+m/2,y:g+l-y}];"handDrawn"!==e.look&&(k.roughness=0,k.fillStyle="solid");const _=f(C),v=b.path(_,k),S=f(w),A=b.path(S,{...k,fillStyle:"solid"}),T=a.insert(()=>A,":first-child");return T.insert(()=>v,":first-child"),T.attr("class","basic label-container"),x&&"handDrawn"!==e.look&&T.selectAll("path").attr("style",x),n&&"handDrawn"!==e.look&&T.selectAll("path").attr("style",n),d(e,T),e.intersect=function(t){return z.polygon(e,C,t)},a}async function Xt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=Math.max(o.width+2*(e.padding??0),e?.width??0),u=Math.max(o.height+2*(e.padding??0),e?.height??0),m=u/4,y=.2*l,x=.2*u,b=u+m,{cssStyles:k}=e,C=c.A.svg(a),w=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(w.roughness=0,w.fillStyle="solid");const _=[{x:-l/2-l/2*.1,y:b/2},...g(-l/2-l/2*.1,b/2,l/2+l/2*.1,b/2,m,.8),{x:l/2+l/2*.1,y:-b/2},{x:-l/2-l/2*.1,y:-b/2}],v=-l/2+l/2*.1,S=-b/2-.4*x,A=[{x:v+l-y,y:1.4*(S+u)},{x:v+l,y:S+u-x},{x:v+l,y:.9*(S+u)},...g(v+l,1.3*(S+u),v+l-y,1.5*(S+u),.03*-u,.5)],T=f(_),M=C.path(T,w),B=f(A),L=C.path(B,{...w,fillStyle:"solid"}),F=a.insert(()=>L,":first-child");return F.insert(()=>M,":first-child"),F.attr("class","basic label-container"),k&&"handDrawn"!==e.look&&F.selectAll("path").attr("style",k),n&&"handDrawn"!==e.look&&F.selectAll("path").attr("style",n),F.attr("transform",`translate(0,${-m/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(o.x-(o.left??0))},${-u/2+(e.padding??0)-m/2-(o.y-(o.top??0))})`),d(e,F),e.intersect=function(t){return z.polygon(e,_,t)},a}async function Vt(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(o.width+e.padding,e?.width||0),l=Math.max(o.height+e.padding,e?.height||0),c=-s/2,u=-l/2,f=a.insert("rect",":first-child");return f.attr("class","text").attr("style",n).attr("rx",0).attr("ry",0).attr("x",c).attr("y",u).attr("width",s).attr("height",l),d(e,f),e.intersect=function(t){return z.rect(e,t)},a}(0,s.K2)(Ot,"question"),(0,s.K2)(Rt,"rect_left_inv_arrow"),(0,s.K2)(It,"rectWithTitle"),(0,s.K2)(jt,"roundedRect"),(0,s.K2)(zt,"shadedProcess"),(0,s.K2)(Pt,"slopedRect"),(0,s.K2)(Kt,"squareRect"),(0,s.K2)(qt,"stadium"),(0,s.K2)(Wt,"state"),(0,s.K2)(Ht,"stateEnd"),(0,s.K2)(Ut,"stateStart"),(0,s.K2)(Yt,"subroutine"),(0,s.K2)(Gt,"taggedRect"),(0,s.K2)(Xt,"taggedWaveEdgedRectangle"),(0,s.K2)(Vt,"text");var Zt=(0,s.K2)((t,e,r,n,i,a)=>`M${t},${e}\n a${i},${a} 0,0,1 0,${-n}\n l${r},0\n a${i},${a} 0,0,1 0,${n}\n M${r},${-n}\n a${i},${a} 0,0,0 0,${n}\n l${-r},0`,"createCylinderPathD"),Qt=(0,s.K2)((t,e,r,n,i,a)=>[`M${t},${e}`,`M${t+r},${e}`,`a${i},${a} 0,0,0 0,${-n}`,`l${-r},0`,`a${i},${a} 0,0,0 0,${n}`,`l${r},0`].join(" "),"createOuterCylinderPathD"),Jt=(0,s.K2)((t,e,r,n,i,a)=>[`M${t+r/2},${-n/2}`,`a${i},${a} 0,0,0 0,${n}`].join(" "),"createInnerCylinderPathD");async function te(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:s,label:l,halfPadding:u}=await h(t,e,p(e)),f="neo"===e.look?2*u:u,g=s.height+f,m=g/2,y=m/(2.5+g/50),x=s.width+y+f,{cssStyles:b}=e;let k;if("handDrawn"===e.look){const t=c.A.svg(a),r=Qt(0,0,x,g,y,m),n=Jt(0,0,x,g,y,m),o=t.path(r,(0,i.Fr)(e,{})),s=t.path(n,(0,i.Fr)(e,{fill:"none"}));k=a.insert(()=>s,":first-child"),k=a.insert(()=>o,":first-child"),k.attr("class","basic label-container"),b&&k.attr("style",b)}else{const t=Zt(0,0,x,g,y,m);k=a.insert("path",":first-child").attr("d",t).attr("class","basic label-container").attr("style",(0,o.KL)(b)).attr("style",n),k.attr("class","basic label-container"),b&&k.selectAll("path").attr("style",b),n&&k.selectAll("path").attr("style",n)}return k.attr("label-offset-x",y),k.attr("transform",`translate(${-x/2}, ${g/2} )`),l.attr("transform",`translate(${-s.width/2-y-(s.x-(s.left??0))}, ${-s.height/2-(s.y-(s.top??0))})`),d(e,k),e.intersect=function(t){const r=z.rect(e,t),n=r.y-(e.y??0);if(0!=m&&(Math.abs(n)<(e.height??0)/2||Math.abs(n)==(e.height??0)/2&&Math.abs(r.x-(e.x??0))>(e.width??0)/2-y)){let i=y*y*(1-n*n/(m*m));0!=i&&(i=Math.sqrt(Math.abs(i))),i=y-i,t.x-(e.x??0)>0&&(i=-i),r.x+=i}return r},a}async function ee(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=o.width+e.padding,l=o.height+e.padding,u=[{x:-3*l/6,y:0},{x:s+3*l/6,y:0},{x:s,y:-l},{x:0,y:-l}];let g;const{cssStyles:m}=e;if("handDrawn"===e.look){const t=c.A.svg(a),r=(0,i.Fr)(e,{}),n=f(u),o=t.path(n,r);g=a.insert(()=>o,":first-child").attr("transform",`translate(${-s/2}, ${l/2})`),m&&g.attr("style",m)}else g=W(a,s,l,u);return n&&g.attr("style",n),e.width=s,e.height=l,d(e,g),e.intersect=function(t){return z.polygon(e,u,t)},a}async function re(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(60,o.width+2*(e.padding??0),e?.width??0),l=Math.max(20,o.height+2*(e.padding??0),e?.height??0),{cssStyles:u}=e,g=c.A.svg(a),m=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(m.roughness=0,m.fillStyle="solid");const y=[{x:-s/2*.8,y:-l/2},{x:s/2*.8,y:-l/2},{x:s/2,y:-l/2*.6},{x:s/2,y:l/2},{x:-s/2,y:l/2},{x:-s/2,y:-l/2*.6}],x=f(y),b=g.path(x,m),k=a.insert(()=>b,":first-child");return k.attr("class","basic label-container"),u&&"handDrawn"!==e.look&&k.selectChildren("path").attr("style",u),n&&"handDrawn"!==e.look&&k.selectChildren("path").attr("style",n),d(e,k),e.intersect=function(t){return z.polygon(e,y,t)},a}async function ne(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:l}=await h(t,e,p(e)),u=(0,s._3)((0,s.D7)().flowchart?.htmlLabels),g=o.width+(e.padding??0),m=g+o.height,y=g+o.height,x=[{x:0,y:0},{x:y,y:0},{x:y/2,y:-m}],{cssStyles:b}=e,k=c.A.svg(a),C=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(C.roughness=0,C.fillStyle="solid");const w=f(x),_=k.path(w,C),v=a.insert(()=>_,":first-child").attr("transform",`translate(${-m/2}, ${m/2})`);return b&&"handDrawn"!==e.look&&v.selectChildren("path").attr("style",b),n&&"handDrawn"!==e.look&&v.selectChildren("path").attr("style",n),e.width=g,e.height=m,d(e,v),l.attr("transform",`translate(${-o.width/2-(o.x-(o.left??0))}, ${m/2-(o.height+(e.padding??0)/(u?2:1)-(o.y-(o.top??0)))})`),e.intersect=function(t){return s.Rm.info("Triangle intersect",e,x,t),z.polygon(e,x,t)},a}async function ie(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=Math.max(o.width+2*(e.padding??0),e?.width??0),u=Math.max(o.height+2*(e.padding??0),e?.height??0),m=u/8,y=u+m,{cssStyles:x}=e,b=70-l,k=b>0?b/2:0,C=c.A.svg(a),w=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(w.roughness=0,w.fillStyle="solid");const _=[{x:-l/2-k,y:y/2},...g(-l/2-k,y/2,l/2+k,y/2,m,.8),{x:l/2+k,y:-y/2},{x:-l/2-k,y:-y/2}],v=f(_),S=C.path(v,w),A=a.insert(()=>S,":first-child");return A.attr("class","basic label-container"),x&&"handDrawn"!==e.look&&A.selectAll("path").attr("style",x),n&&"handDrawn"!==e.look&&A.selectAll("path").attr("style",n),A.attr("transform",`translate(0,${-m/2})`),s.attr("transform",`translate(${-l/2+(e.padding??0)-(o.x-(o.left??0))},${-u/2+(e.padding??0)-m-(o.y-(o.top??0))})`),d(e,A),e.intersect=function(t){return z.polygon(e,_,t)},a}async function ae(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o}=await h(t,e,p(e)),s=Math.max(o.width+2*(e.padding??0),e?.width??0),l=Math.max(o.height+2*(e.padding??0),e?.height??0),u=s/l;let m=s,y=l;m>y*u?y=m/u:m=y*u,m=Math.max(m,100),y=Math.max(y,50);const x=Math.min(.2*y,y/4),b=y+2*x,{cssStyles:k}=e,C=c.A.svg(a),w=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(w.roughness=0,w.fillStyle="solid");const _=[{x:-m/2,y:b/2},...g(-m/2,b/2,m/2,b/2,x,1),{x:m/2,y:-b/2},...g(m/2,-b/2,-m/2,-b/2,x,-1)],v=f(_),S=C.path(v,w),A=a.insert(()=>S,":first-child");return A.attr("class","basic label-container"),k&&"handDrawn"!==e.look&&A.selectAll("path").attr("style",k),n&&"handDrawn"!==e.look&&A.selectAll("path").attr("style",n),d(e,A),e.intersect=function(t){return z.polygon(e,_,t)},a}async function oe(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const{shapeSvg:a,bbox:o,label:s}=await h(t,e,p(e)),l=Math.max(o.width+2*(e.padding??0),e?.width??0),u=Math.max(o.height+2*(e.padding??0),e?.height??0),f=-l/2,g=-u/2,{cssStyles:m}=e,y=c.A.svg(a),x=(0,i.Fr)(e,{}),b=[{x:f-5,y:g-5},{x:f-5,y:g+u},{x:f+l,y:g+u},{x:f+l,y:g-5}],k=`M${f-5},${g-5} L${f+l},${g-5} L${f+l},${g+u} L${f-5},${g+u} L${f-5},${g-5}\n M${f-5},${g} L${f+l},${g}\n M${f},${g-5} L${f},${g+u}`;"handDrawn"!==e.look&&(x.roughness=0,x.fillStyle="solid");const C=y.path(k,x),w=a.insert(()=>C,":first-child");return w.attr("transform","translate(2.5, 2.5)"),w.attr("class","basic label-container"),m&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",m),n&&"handDrawn"!==e.look&&w.selectAll("path").attr("style",n),s.attr("transform",`translate(${-o.width/2+2.5-(o.x-(o.left??0))}, ${-o.height/2+2.5-(o.y-(o.top??0))})`),d(e,w),e.intersect=function(t){return z.polygon(e,b,t)},a}async function se(t,e){const r=e;if(r.alias&&(e.label=r.alias),"handDrawn"===e.look){const{themeVariables:r}=(0,s.zj)(),{background:n}=r,i={...e,id:e.id+"-background",look:"default",cssStyles:["stroke: none",`fill: ${n}`]};await se(t,i)}const n=(0,s.zj)();e.useHtmlLabels=n.htmlLabels;let a=n.er?.diagramPadding??10,h=n.er?.entityPadding??6;const{cssStyles:u}=e,{labelStyles:f,nodeStyles:g}=(0,i.GX)(e);if(0===r.attributes.length&&e.label){const r={rx:0,ry:0,labelPaddingX:a,labelPaddingY:1.5*a,classes:""};(0,o.Un)(e.label,n)+2*r.labelPaddingX<n.er.minEntityWidth&&(e.width=n.er.minEntityWidth);const i=await wt(t,e,r);if(!(0,s._3)(n.htmlLabels)){const t=i.select("text"),e=t.node()?.getBBox();t.attr("transform",`translate(${-e.width/2}, 0)`)}return i}n.htmlLabels||(a*=1.25,h*=1.25);let m=p(e);m||(m="node default");const y=t.insert("g").attr("class",m).attr("id",e.domId||e.id),x=await le(y,e.label??"",n,0,0,["name"],f);x.height+=h;let b=0;const k=[],C=[];let w=0,_=0,v=0,S=0,A=!0,T=!0;for(const i of r.attributes){const t=await le(y,i.type,n,0,b,["attribute-type"],f);w=Math.max(w,t.width+a);const e=await le(y,i.name,n,0,b,["attribute-name"],f);_=Math.max(_,e.width+a);const r=await le(y,i.keys.join(),n,0,b,["attribute-keys"],f);v=Math.max(v,r.width+a);const o=await le(y,i.comment,n,0,b,["attribute-comment"],f);S=Math.max(S,o.width+a);const s=Math.max(t.height,e.height,r.height,o.height)+h;C.push({yOffset:b,rowHeight:s}),b+=s}let M=4;v<=a&&(A=!1,v=0,M--),S<=a&&(T=!1,S=0,M--);const B=y.node().getBBox();if(x.width+2*a-(w+_+v+S)>0){const t=x.width+2*a-(w+_+v+S);w+=t/M,_+=t/M,v>0&&(v+=t/M),S>0&&(S+=t/M)}const L=w+_+v+S,F=c.A.svg(y),$=(0,i.Fr)(e,{});"handDrawn"!==e.look&&($.roughness=0,$.fillStyle="solid");let E=0;C.length>0&&(E=C.reduce((t,e)=>t+(e?.rowHeight??0),0));const D=Math.max(B.width+2*a,e?.width||0,L),N=Math.max((E??0)+x.height,e?.height||0),O=-D/2,R=-N/2;y.selectAll("g:not(:first-child)").each((t,e,r)=>{const n=(0,l.Ltv)(r[e]),i=n.attr("transform");let o=0,s=0;if(i){const t=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(i);t&&(o=parseFloat(t[1]),s=parseFloat(t[2]),n.attr("class").includes("attribute-name")?o+=w:n.attr("class").includes("attribute-keys")?o+=w+_:n.attr("class").includes("attribute-comment")&&(o+=w+_+v))}n.attr("transform",`translate(${O+a/2+o}, ${s+R+x.height+h/2})`)}),y.select(".name").attr("transform","translate("+-x.width/2+", "+(R+h/2)+")");const I=F.rectangle(O,R,D,N,$),j=y.insert(()=>I,":first-child").attr("style",u.join("")),{themeVariables:P}=(0,s.zj)(),{rowEven:K,rowOdd:q,nodeBorder:W}=P;k.push(0);for(const[i,o]of C.entries()){const t=(i+1)%2==0&&0!==o.yOffset,e=F.rectangle(O,x.height+R+o?.yOffset,D,o?.rowHeight,{...$,fill:t?K:q,stroke:W});y.insert(()=>e,"g.label").attr("style",u.join("")).attr("class","row-rect-"+(t?"even":"odd"))}let H=F.line(O,x.height+R,D+O,x.height+R,$);y.insert(()=>H).attr("class","divider"),H=F.line(w+O,x.height+R,w+O,N+R,$),y.insert(()=>H).attr("class","divider"),A&&(H=F.line(w+_+O,x.height+R,w+_+O,N+R,$),y.insert(()=>H).attr("class","divider")),T&&(H=F.line(w+_+v+O,x.height+R,w+_+v+O,N+R,$),y.insert(()=>H).attr("class","divider"));for(const i of k)H=F.line(O,x.height+R+i,D+O,x.height+R+i,$),y.insert(()=>H).attr("class","divider");if(d(e,j),g&&"handDrawn"!==e.look){const t=g.split(";"),e=t?.filter(t=>t.includes("stroke"))?.map(t=>`${t}`).join("; ");y.selectAll("path").attr("style",e??""),y.selectAll(".row-rect-even path").attr("style",g)}return e.intersect=function(t){return z.rect(e,t)},y}async function le(t,e,r,n=0,i=0,c=[],h=""){const u=t.insert("g").attr("class",`label ${c.join(" ")}`).attr("transform",`translate(${n}, ${i})`).attr("style",h);e!==(0,s.QO)(e)&&(e=(e=(0,s.QO)(e)).replaceAll("<","<").replaceAll(">",">"));const d=u.node().appendChild(await(0,a.GZ)(u,e,{width:(0,o.Un)(e,r)+100,style:h,useHtmlLabels:r.htmlLabels},r));if(e.includes("<")||e.includes(">")){let t=d.children[0];for(t.textContent=t.textContent.replaceAll("<","<").replaceAll(">",">");t.childNodes[0];)t=t.childNodes[0],t.textContent=t.textContent.replaceAll("<","<").replaceAll(">",">")}let p=d.getBBox();if((0,s._3)(r.htmlLabels)){const t=d.children[0];t.style.textAlign="start";const e=(0,l.Ltv)(d);p=t.getBoundingClientRect(),e.attr("width",p.width),e.attr("height",p.height)}return p}async function ce(t,e,r,n,i=r.class.padding??12){const a=n?0:3,o=t.insert("g").attr("class",p(e)).attr("id",e.domId||e.id);let s=null,l=null,c=null,h=null,u=0,d=0,f=0;if(s=o.insert("g").attr("class","annotation-group text"),e.annotations.length>0){const t=e.annotations[0];await he(s,{text:`\xab${t}\xbb`},0);u=s.node().getBBox().height}l=o.insert("g").attr("class","label-group text"),await he(l,e,0,["font-weight: bolder"]);const g=l.node().getBBox();d=g.height,c=o.insert("g").attr("class","members-group text");let m=0;for(const p of e.members){m+=await he(c,p,m,[p.parseClassifier()])+a}f=c.node().getBBox().height,f<=0&&(f=i/2),h=o.insert("g").attr("class","methods-group text");let y=0;for(const p of e.methods){y+=await he(h,p,y,[p.parseClassifier()])+a}let x=o.node().getBBox();if(null!==s){const t=s.node().getBBox();s.attr("transform",`translate(${-t.width/2})`)}return l.attr("transform",`translate(${-g.width/2}, ${u})`),x=o.node().getBBox(),c.attr("transform",`translate(0, ${u+d+2*i})`),x=o.node().getBBox(),h.attr("transform",`translate(0, ${u+d+(f?f+4*i:2*i)})`),x=o.node().getBBox(),{shapeSvg:o,bbox:x}}async function he(t,e,r,n=[]){const i=t.insert("g").attr("class","label").attr("style",n.join("; ")),c=(0,s.zj)();let h="useHtmlLabels"in e?e.useHtmlLabels:(0,s._3)(c.htmlLabels)??!0,u="";u="text"in e?e.text:e.label,!h&&u.startsWith("\\")&&(u=u.substring(1)),(0,s.Wi)(u)&&(h=!0);const d=await(0,a.GZ)(i,(0,s.oB)((0,o.Sm)(u)),{width:(0,o.Un)(u,c)+50,classes:"markdown-node-label",useHtmlLabels:h},c);let p,f=1;if(h){const t=d.children[0],e=(0,l.Ltv)(d);f=t.innerHTML.split("<br>").length,t.innerHTML.includes("</math>")&&(f+=t.innerHTML.split("<mrow>").length-1);const r=t.getElementsByTagName("img");if(r){const t=""===u.replace(/<img[^>]*>/g,"").trim();await Promise.all([...r].map(e=>new Promise(r=>{function n(){if(e.style.display="flex",e.style.flexDirection="column",t){const t=c.fontSize?.toString()??window.getComputedStyle(document.body).fontSize,r=5,n=parseInt(t,10)*r+"px";e.style.minWidth=n,e.style.maxWidth=n}else e.style.width="100%";r(e)}(0,s.K2)(n,"setupImage"),setTimeout(()=>{e.complete&&n()}),e.addEventListener("error",n),e.addEventListener("load",n)})))}p=t.getBoundingClientRect(),e.attr("width",p.width),e.attr("height",p.height)}else{n.includes("font-weight: bolder")&&(0,l.Ltv)(d).selectAll("tspan").attr("font-weight",""),f=d.children.length;const t=d.children[0];if(""===d.textContent||d.textContent.includes(">")){t.textContent=u[0]+u.substring(1).replaceAll(">",">").replaceAll("<","<").trim();" "===u[1]&&(t.textContent=t.textContent[0]+" "+t.textContent.substring(1))}"undefined"===t.textContent&&(t.textContent=""),p=d.getBBox()}return i.attr("transform","translate(0,"+(-p.height/(2*f)+r)+")"),p.height}async function ue(t,e){const r=(0,s.D7)(),n=r.class.padding??12,a=n,o=e.useHtmlLabels??(0,s._3)(r.htmlLabels)??!0,h=e;h.annotations=h.annotations??[],h.members=h.members??[],h.methods=h.methods??[];const{shapeSvg:u,bbox:p}=await ce(t,e,r,o,a),{labelStyles:f,nodeStyles:g}=(0,i.GX)(e);e.labelStyle=f,e.cssStyles=h.styles||"";const m=h.styles?.join(";")||g||"";e.cssStyles||(e.cssStyles=m.replaceAll("!important","").split(";"));const y=0===h.members.length&&0===h.methods.length&&!r.class?.hideEmptyMembersBox,x=c.A.svg(u),b=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(b.roughness=0,b.fillStyle="solid");const k=p.width;let C=p.height;0===h.members.length&&0===h.methods.length?C+=a:h.members.length>0&&0===h.methods.length&&(C+=2*a);const w=-k/2,_=-C/2,v=x.rectangle(w-n,_-n-(y?n:0===h.members.length&&0===h.methods.length?-n/2:0),k+2*n,C+2*n+(y?2*n:0===h.members.length&&0===h.methods.length?-n:0),b),S=u.insert(()=>v,":first-child");S.attr("class","basic label-container");const A=S.node().getBBox();u.selectAll(".text").each((t,e,r)=>{const i=(0,l.Ltv)(r[e]),a=i.attr("transform");let s=0;if(a){const t=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(a);t&&(s=parseFloat(t[2]))}let c=s+_+n-(y?n:0===h.members.length&&0===h.methods.length?-n/2:0);o||(c-=4);let d=w;(i.attr("class").includes("label-group")||i.attr("class").includes("annotation-group"))&&(d=-i.node()?.getBBox().width/2||0,u.selectAll("text").each(function(t,e,r){"middle"===window.getComputedStyle(r[e]).textAnchor&&(d=0)})),i.attr("transform",`translate(${d}, ${c})`)});const T=u.select(".annotation-group").node().getBBox().height-(y?n/2:0)||0,M=u.select(".label-group").node().getBBox().height-(y?n/2:0)||0,B=u.select(".members-group").node().getBBox().height-(y?n/2:0)||0;if(h.members.length>0||h.methods.length>0||y){const t=x.line(A.x,T+M+_+n,A.x+A.width,T+M+_+n,b);u.insert(()=>t).attr("class","divider").attr("style",m)}if(y||h.members.length>0||h.methods.length>0){const t=x.line(A.x,T+M+B+_+2*a+n,A.x+A.width,T+M+B+_+n+2*a,b);u.insert(()=>t).attr("class","divider").attr("style",m)}if("handDrawn"!==h.look&&u.selectAll("path").attr("style",m),S.select(":nth-child(2)").attr("style",m),u.selectAll(".divider").select("path").attr("style",m),e.labelStyle?u.selectAll("span").attr("style",e.labelStyle):u.selectAll("span").attr("style",m),!o){const t=RegExp(/color\s*:\s*([^;]*)/),e=t.exec(m);if(e){const t=e[0].replace("color","fill");u.selectAll("tspan").attr("style",t)}else if(f){const e=t.exec(f);if(e){const t=e[0].replace("color","fill");u.selectAll("tspan").attr("style",t)}}}return d(e,S),e.intersect=function(t){return z.rect(e,t)},u}async function de(t,e){const{labelStyles:r,nodeStyles:n}=(0,i.GX)(e);e.labelStyle=r;const a=e,o=e,s="verifyMethod"in e,h=p(e),u=t.insert("g").attr("class",h).attr("id",e.domId??e.id);let f;f=s?await pe(u,`<<${a.type}>>`,0,e.labelStyle):await pe(u,"<<Element>>",0,e.labelStyle);let g=f;const m=await pe(u,a.name,g,e.labelStyle+"; font-weight: bold;");if(g+=m+20,s){g+=await pe(u,""+(a.requirementId?`id: ${a.requirementId}`:""),g,e.labelStyle);g+=await pe(u,""+(a.text?`Text: ${a.text}`:""),g,e.labelStyle);g+=await pe(u,""+(a.risk?`Risk: ${a.risk}`:""),g,e.labelStyle),await pe(u,""+(a.verifyMethod?`Verification: ${a.verifyMethod}`:""),g,e.labelStyle)}else{g+=await pe(u,""+(o.type?`Type: ${o.type}`:""),g,e.labelStyle),await pe(u,""+(o.docRef?`Doc Ref: ${o.docRef}`:""),g,e.labelStyle)}const y=(u.node()?.getBBox().width??200)+20,x=(u.node()?.getBBox().height??200)+20,b=-y/2,k=-x/2,C=c.A.svg(u),w=(0,i.Fr)(e,{});"handDrawn"!==e.look&&(w.roughness=0,w.fillStyle="solid");const _=C.rectangle(b,k,y,x,w),v=u.insert(()=>_,":first-child");if(v.attr("class","basic label-container").attr("style",n),u.selectAll(".label").each((t,e,r)=>{const n=(0,l.Ltv)(r[e]),i=n.attr("transform");let a=0,o=0;if(i){const t=RegExp(/translate\(([^,]+),([^)]+)\)/).exec(i);t&&(a=parseFloat(t[1]),o=parseFloat(t[2]))}const s=o-x/2;let c=b+10;0!==e&&1!==e||(c=a),n.attr("transform",`translate(${c}, ${s+20})`)}),g>f+m+20){const t=C.line(b,k+f+m+20,b+y,k+f+m+20,w);u.insert(()=>t).attr("style",n)}return d(e,v),e.intersect=function(t){return z.rect(e,t)},u}async function pe(t,e,r,n=""){if(""===e)return 0;const i=t.insert("g").attr("class","label").attr("style",n),c=(0,s.D7)(),h=c.htmlLabels??!0,u=await(0,a.GZ)(i,(0,s.oB)((0,o.Sm)(e)),{width:(0,o.Un)(e,c)+50,classes:"markdown-node-label",useHtmlLabels:h,style:n},c);let d;if(h){const t=u.children[0],e=(0,l.Ltv)(u);d=t.getBoundingClientRect(),e.attr("width",d.width),e.attr("height",d.height)}else{const t=u.children[0];for(const e of t.children)e.textContent=e.textContent.replaceAll(">",">").replaceAll("<","<"),n&&e.setAttribute("style",n);d=u.getBBox(),d.height+=6}return i.attr("transform",`translate(${-d.width/2},${-d.height/2+r})`),d.height}(0,s.K2)(te,"tiltedCylinder"),(0,s.K2)(ee,"trapezoid"),(0,s.K2)(re,"trapezoidalPentagon"),(0,s.K2)(ne,"triangle"),(0,s.K2)(ie,"waveEdgedRectangle"),(0,s.K2)(ae,"waveRectangle"),(0,s.K2)(oe,"windowPane"),(0,s.K2)(se,"erBox"),(0,s.K2)(le,"addText"),(0,s.K2)(ce,"textHelper"),(0,s.K2)(he,"addText"),(0,s.K2)(ue,"classBox"),(0,s.K2)(de,"requirementBox"),(0,s.K2)(pe,"addText");var fe=(0,s.K2)(t=>{switch(t){case"Very High":return"red";case"High":return"orange";case"Medium":return null;case"Low":return"blue";case"Very Low":return"lightblue"}},"colorFromPriority");async function ge(t,e,{config:r}){const{labelStyles:n,nodeStyles:a}=(0,i.GX)(e);e.labelStyle=n||"";const o=e.width;e.width=(e.width??200)-10;const{shapeSvg:s,bbox:l,label:f}=await h(t,e,p(e)),g=e.padding||10;let m,y="";"ticket"in e&&e.ticket&&r?.kanban?.ticketBaseUrl&&(y=r?.kanban?.ticketBaseUrl.replace("#TICKET#",e.ticket),m=s.insert("svg:a",":first-child").attr("class","kanban-ticket-link").attr("xlink:href",y).attr("target","_blank"));const x={useHtmlLabels:e.useHtmlLabels,labelStyle:e.labelStyle||"",width:e.width,img:e.img,padding:e.padding||8,centerLabel:!1};let b,k;({label:b,bbox:k}=m?await u(m,"ticket"in e&&e.ticket||"",x):await u(s,"ticket"in e&&e.ticket||"",x));const{label:w,bbox:_}=await u(s,"assigned"in e&&e.assigned||"",x);e.width=o;const v=e?.width||0,S=Math.max(k.height,_.height)/2,A=Math.max(l.height+20,e?.height||0)+S,T=-v/2,M=-A/2;let B;f.attr("transform","translate("+(g-v/2)+", "+(-S-l.height/2)+")"),b.attr("transform","translate("+(g-v/2)+", "+(-S+l.height/2)+")"),w.attr("transform","translate("+(g+v/2-_.width-20)+", "+(-S+l.height/2)+")");const{rx:L,ry:F}=e,{cssStyles:$}=e;if("handDrawn"===e.look){const t=c.A.svg(s),r=(0,i.Fr)(e,{}),n=L||F?t.path(C(T,M,v,A,L||0),r):t.rectangle(T,M,v,A,r);B=s.insert(()=>n,":first-child"),B.attr("class","basic label-container").attr("style",$||null)}else{B=s.insert("rect",":first-child"),B.attr("class","basic label-container __APA__").attr("style",a).attr("rx",L??5).attr("ry",F??5).attr("x",T).attr("y",M).attr("width",v).attr("height",A);const t="priority"in e&&e.priority;if(t){const e=s.append("line"),r=T+2,n=M+Math.floor((L??0)/2),i=M+A-Math.floor((L??0)/2);e.attr("x1",r).attr("y1",n).attr("x2",r).attr("y2",i).attr("stroke-width","4").attr("stroke",fe(t))}}return d(e,B),e.height=A,e.intersect=function(t){return z.rect(e,t)},s}(0,s.K2)(ge,"kanbanItem");var me=[{semanticName:"Process",name:"Rectangle",shortName:"rect",description:"Standard process shape",aliases:["proc","process","rectangle"],internalAliases:["squareRect"],handler:Kt},{semanticName:"Event",name:"Rounded Rectangle",shortName:"rounded",description:"Represents an event",aliases:["event"],internalAliases:["roundedRect"],handler:jt},{semanticName:"Terminal Point",name:"Stadium",shortName:"stadium",description:"Terminal point",aliases:["terminal","pill"],handler:qt},{semanticName:"Subprocess",name:"Framed Rectangle",shortName:"fr-rect",description:"Subprocess",aliases:["subprocess","subproc","framed-rectangle","subroutine"],handler:Yt},{semanticName:"Database",name:"Cylinder",shortName:"cyl",description:"Database storage",aliases:["db","database","cylinder"],handler:ot},{semanticName:"Start",name:"Circle",shortName:"circle",description:"Starting point",aliases:["circ"],handler:Y},{semanticName:"Decision",name:"Diamond",shortName:"diam",description:"Decision-making step",aliases:["decision","diamond","question"],handler:Ot},{semanticName:"Prepare Conditional",name:"Hexagon",shortName:"hex",description:"Preparation or condition step",aliases:["hexagon","prepare"],handler:ft},{semanticName:"Data Input/Output",name:"Lean Right",shortName:"lean-r",description:"Represents input or output",aliases:["lean-right","in-out"],internalAliases:["lean_right"],handler:St},{semanticName:"Data Input/Output",name:"Lean Left",shortName:"lean-l",description:"Represents output or input",aliases:["lean-left","out-in"],internalAliases:["lean_left"],handler:vt},{semanticName:"Priority Action",name:"Trapezoid Base Bottom",shortName:"trap-b",description:"Priority action",aliases:["priority","trapezoid-bottom","trapezoid"],handler:ee},{semanticName:"Manual Operation",name:"Trapezoid Base Top",shortName:"trap-t",description:"Represents a manual task",aliases:["manual","trapezoid-top","inv-trapezoid"],internalAliases:["inv_trapezoid"],handler:Ct},{semanticName:"Stop",name:"Double Circle",shortName:"dbl-circ",description:"Represents a stop point",aliases:["double-circle"],internalAliases:["doublecircle"],handler:lt},{semanticName:"Text Block",name:"Text Block",shortName:"text",description:"Text block",handler:Vt},{semanticName:"Card",name:"Notched Rectangle",shortName:"notch-rect",description:"Represents a card",aliases:["card","notched-rectangle"],handler:H},{semanticName:"Lined/Shaded Process",name:"Lined Rectangle",shortName:"lin-rect",description:"Lined process shape",aliases:["lined-rectangle","lined-process","lin-proc","shaded-process"],handler:zt},{semanticName:"Start",name:"Small Circle",shortName:"sm-circ",description:"Small starting point",aliases:["start","small-circle"],internalAliases:["stateStart"],handler:Ut},{semanticName:"Stop",name:"Framed Circle",shortName:"fr-circ",description:"Stop point",aliases:["stop","framed-circle"],internalAliases:["stateEnd"],handler:Ht},{semanticName:"Fork/Join",name:"Filled Rectangle",shortName:"fork",description:"Fork or join in process flow",aliases:["join"],internalAliases:["forkJoin"],handler:ut},{semanticName:"Collate",name:"Hourglass",shortName:"hourglass",description:"Represents a collate operation",aliases:["hourglass","collate"],handler:gt},{semanticName:"Comment",name:"Curly Brace",shortName:"brace",description:"Adds a comment",aliases:["comment","brace-l"],handler:Z},{semanticName:"Comment Right",name:"Curly Brace",shortName:"brace-r",description:"Adds a comment",handler:J},{semanticName:"Comment with braces on both sides",name:"Curly Braces",shortName:"braces",description:"Adds a comment",handler:et},{semanticName:"Com Link",name:"Lightning Bolt",shortName:"bolt",description:"Communication link",aliases:["com-link","lightning-bolt"],handler:At},{semanticName:"Document",name:"Document",shortName:"doc",description:"Represents a document",aliases:["doc","document"],handler:ie},{semanticName:"Delay",name:"Half-Rounded Rectangle",shortName:"delay",description:"Represents a delay",aliases:["half-rounded-rectangle"],handler:dt},{semanticName:"Direct Access Storage",name:"Horizontal Cylinder",shortName:"h-cyl",description:"Direct access storage",aliases:["das","horizontal-cylinder"],handler:te},{semanticName:"Disk Storage",name:"Lined Cylinder",shortName:"lin-cyl",description:"Disk storage",aliases:["disk","lined-cylinder"],handler:Lt},{semanticName:"Display",name:"Curved Trapezoid",shortName:"curv-trap",description:"Represents a display",aliases:["curved-trapezoid","display"],handler:rt},{semanticName:"Divided Process",name:"Divided Rectangle",shortName:"div-rect",description:"Divided process shape",aliases:["div-proc","divided-rectangle","divided-process"],handler:st},{semanticName:"Extract",name:"Triangle",shortName:"tri",description:"Extraction process",aliases:["extract","triangle"],handler:ne},{semanticName:"Internal Storage",name:"Window Pane",shortName:"win-pane",description:"Internal storage",aliases:["internal-storage","window-pane"],handler:oe},{semanticName:"Junction",name:"Filled Circle",shortName:"f-circ",description:"Junction point",aliases:["junction","filled-circle"],handler:ct},{semanticName:"Loop Limit",name:"Trapezoidal Pentagon",shortName:"notch-pent",description:"Loop limit step",aliases:["loop-limit","notched-pentagon"],handler:re},{semanticName:"Manual File",name:"Flipped Triangle",shortName:"flip-tri",description:"Manual file operation",aliases:["manual-file","flipped-triangle"],handler:ht},{semanticName:"Manual Input",name:"Sloped Rectangle",shortName:"sl-rect",description:"Manual input step",aliases:["manual-input","sloped-rectangle"],handler:Pt},{semanticName:"Multi-Document",name:"Stacked Document",shortName:"docs",description:"Multiple documents",aliases:["documents","st-doc","stacked-document"],handler:Et},{semanticName:"Multi-Process",name:"Stacked Rectangle",shortName:"st-rect",description:"Multiple processes",aliases:["procs","processes","stacked-rectangle"],handler:$t},{semanticName:"Stored Data",name:"Bow Tie Rectangle",shortName:"bow-rect",description:"Stored data",aliases:["stored-data","bow-tie-rectangle"],handler:q},{semanticName:"Summary",name:"Crossed Circle",shortName:"cross-circ",description:"Summary",aliases:["summary","crossed-circle"],handler:X},{semanticName:"Tagged Document",name:"Tagged Document",shortName:"tag-doc",description:"Tagged document",aliases:["tag-doc","tagged-document"],handler:Xt},{semanticName:"Tagged Process",name:"Tagged Rectangle",shortName:"tag-rect",description:"Tagged process",aliases:["tagged-rectangle","tag-proc","tagged-process"],handler:Gt},{semanticName:"Paper Tape",name:"Flag",shortName:"flag",description:"Paper tape",aliases:["paper-tape"],handler:ae},{semanticName:"Odd",name:"Odd",shortName:"odd",description:"Odd shape",internalAliases:["rect_left_inv_arrow"],handler:Rt},{semanticName:"Lined Document",name:"Lined Document",shortName:"lin-doc",description:"Lined document",aliases:["lined-document"],handler:Ft}],ye=(0,s.K2)(()=>{const t={state:Wt,choice:U,note:Dt,rectWithTitle:It,labelRect:_t,iconSquare:bt,iconCircle:yt,icon:mt,iconRounded:xt,imageSquare:kt,anchor:P,kanbanItem:ge,classBox:ue,erBox:se,requirementBox:de},e=[...Object.entries(t),...me.flatMap(t=>[t.shortName,..."aliases"in t?t.aliases:[],..."internalAliases"in t?t.internalAliases:[]].map(e=>[e,t.handler]))];return Object.fromEntries(e)},"generateShapeMap")();function xe(t){return t in ye}(0,s.K2)(xe,"isValidShape");var be=new Map;async function ke(t,e,r){let n,i;"rect"===e.shape&&(e.rx&&e.ry?e.shape="roundedRect":e.shape="squareRect");const a=e.shape?ye[e.shape]:void 0;if(!a)throw new Error(`No such shape: ${e.shape}. Please check your syntax.`);if(e.link){let o;"sandbox"===r.config.securityLevel?o="_top":e.linkTarget&&(o=e.linkTarget||"_blank"),n=t.insert("svg:a").attr("xlink:href",e.link).attr("target",o??null),i=await a(n,e,r)}else i=await a(t,e,r),n=i;return e.tooltip&&i.attr("title",e.tooltip),be.set(e.id,n),e.haveCallback&&n.attr("class",n.attr("class")+" clickable"),n}(0,s.K2)(ke,"insertNode");var Ce=(0,s.K2)((t,e)=>{be.set(e.id,t)},"setNodeElem"),we=(0,s.K2)(()=>{be.clear()},"clear"),_e=(0,s.K2)(t=>{const e=be.get(t.id);s.Rm.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");const r=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+r-t.width/2)+", "+(t.y-t.height/2-8)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),r},"positionNode")},53443:(t,e,r)=>{"use strict";r.d(e,{A:()=>x});var n=r(41863);const i=r(57454).A["__core-js_shared__"];var a,o=(a=/[^.]+$/.exec(i&&i.keys&&i.keys.IE_PROTO||""))?"Symbol(src)_1."+a:"";const s=function(t){return!!o&&o in t};var l=r(49084),c=r(30226),h=/^\[object .+?Constructor\]$/,u=Function.prototype,d=Object.prototype,p=u.toString,f=d.hasOwnProperty,g=RegExp("^"+p.call(f).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");const m=function(t){return!(!(0,l.A)(t)||s(t))&&((0,n.A)(t)?g:h).test((0,c.A)(t))};const y=function(t,e){return null==t?void 0:t[e]};const x=function(t,e){var r=y(t,e);return m(r)?r:void 0}},55385:(t,e,r)=>{"use strict";r.d(e,{A:()=>g});var n=r(68676),i=r(38819);const a={re:/^#((?:[a-f0-9]{2}){2,4}|[a-f0-9]{3})$/i,parse:t=>{if(35!==t.charCodeAt(0))return;const e=t.match(a.re);if(!e)return;const r=e[1],i=parseInt(r,16),o=r.length,s=o%4==0,l=o>4,c=l?1:17,h=l?8:4,u=s?0:-1,d=l?255:15;return n.A.set({r:(i>>h*(u+3)&d)*c,g:(i>>h*(u+2)&d)*c,b:(i>>h*(u+1)&d)*c,a:s?(i&d)*c/255:1},t)},stringify:t=>{const{r:e,g:r,b:n,a:a}=t;return a<1?`#${i.Y[Math.round(e)]}${i.Y[Math.round(r)]}${i.Y[Math.round(n)]}${i.Y[Math.round(255*a)]}`:`#${i.Y[Math.round(e)]}${i.Y[Math.round(r)]}${i.Y[Math.round(n)]}`}},o=a;var s=r(46554);const l={re:/^hsla?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(?:deg|grad|rad|turn)?)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?%)(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e-?\d+)?(%)?))?\s*?\)$/i,hueRe:/^(.+?)(deg|grad|rad|turn)$/i,_hue2deg:t=>{const e=t.match(l.hueRe);if(e){const[,t,r]=e;switch(r){case"grad":return s.A.channel.clamp.h(.9*parseFloat(t));case"rad":return s.A.channel.clamp.h(180*parseFloat(t)/Math.PI);case"turn":return s.A.channel.clamp.h(360*parseFloat(t))}}return s.A.channel.clamp.h(parseFloat(t))},parse:t=>{const e=t.charCodeAt(0);if(104!==e&&72!==e)return;const r=t.match(l.re);if(!r)return;const[,i,a,o,c,h]=r;return n.A.set({h:l._hue2deg(i),s:s.A.channel.clamp.s(parseFloat(a)),l:s.A.channel.clamp.l(parseFloat(o)),a:c?s.A.channel.clamp.a(h?parseFloat(c)/100:parseFloat(c)):1},t)},stringify:t=>{const{h:e,s:r,l:n,a:i}=t;return i<1?`hsla(${s.A.lang.round(e)}, ${s.A.lang.round(r)}%, ${s.A.lang.round(n)}%, ${i})`:`hsl(${s.A.lang.round(e)}, ${s.A.lang.round(r)}%, ${s.A.lang.round(n)}%)`}},c=l,h={colors:{aliceblue:"#f0f8ff",antiquewhite:"#faebd7",aqua:"#00ffff",aquamarine:"#7fffd4",azure:"#f0ffff",beige:"#f5f5dc",bisque:"#ffe4c4",black:"#000000",blanchedalmond:"#ffebcd",blue:"#0000ff",blueviolet:"#8a2be2",brown:"#a52a2a",burlywood:"#deb887",cadetblue:"#5f9ea0",chartreuse:"#7fff00",chocolate:"#d2691e",coral:"#ff7f50",cornflowerblue:"#6495ed",cornsilk:"#fff8dc",crimson:"#dc143c",cyanaqua:"#00ffff",darkblue:"#00008b",darkcyan:"#008b8b",darkgoldenrod:"#b8860b",darkgray:"#a9a9a9",darkgreen:"#006400",darkgrey:"#a9a9a9",darkkhaki:"#bdb76b",darkmagenta:"#8b008b",darkolivegreen:"#556b2f",darkorange:"#ff8c00",darkorchid:"#9932cc",darkred:"#8b0000",darksalmon:"#e9967a",darkseagreen:"#8fbc8f",darkslateblue:"#483d8b",darkslategray:"#2f4f4f",darkslategrey:"#2f4f4f",darkturquoise:"#00ced1",darkviolet:"#9400d3",deeppink:"#ff1493",deepskyblue:"#00bfff",dimgray:"#696969",dimgrey:"#696969",dodgerblue:"#1e90ff",firebrick:"#b22222",floralwhite:"#fffaf0",forestgreen:"#228b22",fuchsia:"#ff00ff",gainsboro:"#dcdcdc",ghostwhite:"#f8f8ff",gold:"#ffd700",goldenrod:"#daa520",gray:"#808080",green:"#008000",greenyellow:"#adff2f",grey:"#808080",honeydew:"#f0fff0",hotpink:"#ff69b4",indianred:"#cd5c5c",indigo:"#4b0082",ivory:"#fffff0",khaki:"#f0e68c",lavender:"#e6e6fa",lavenderblush:"#fff0f5",lawngreen:"#7cfc00",lemonchiffon:"#fffacd",lightblue:"#add8e6",lightcoral:"#f08080",lightcyan:"#e0ffff",lightgoldenrodyellow:"#fafad2",lightgray:"#d3d3d3",lightgreen:"#90ee90",lightgrey:"#d3d3d3",lightpink:"#ffb6c1",lightsalmon:"#ffa07a",lightseagreen:"#20b2aa",lightskyblue:"#87cefa",lightslategray:"#778899",lightslategrey:"#778899",lightsteelblue:"#b0c4de",lightyellow:"#ffffe0",lime:"#00ff00",limegreen:"#32cd32",linen:"#faf0e6",magenta:"#ff00ff",maroon:"#800000",mediumaquamarine:"#66cdaa",mediumblue:"#0000cd",mediumorchid:"#ba55d3",mediumpurple:"#9370db",mediumseagreen:"#3cb371",mediumslateblue:"#7b68ee",mediumspringgreen:"#00fa9a",mediumturquoise:"#48d1cc",mediumvioletred:"#c71585",midnightblue:"#191970",mintcream:"#f5fffa",mistyrose:"#ffe4e1",moccasin:"#ffe4b5",navajowhite:"#ffdead",navy:"#000080",oldlace:"#fdf5e6",olive:"#808000",olivedrab:"#6b8e23",orange:"#ffa500",orangered:"#ff4500",orchid:"#da70d6",palegoldenrod:"#eee8aa",palegreen:"#98fb98",paleturquoise:"#afeeee",palevioletred:"#db7093",papayawhip:"#ffefd5",peachpuff:"#ffdab9",peru:"#cd853f",pink:"#ffc0cb",plum:"#dda0dd",powderblue:"#b0e0e6",purple:"#800080",rebeccapurple:"#663399",red:"#ff0000",rosybrown:"#bc8f8f",royalblue:"#4169e1",saddlebrown:"#8b4513",salmon:"#fa8072",sandybrown:"#f4a460",seagreen:"#2e8b57",seashell:"#fff5ee",sienna:"#a0522d",silver:"#c0c0c0",skyblue:"#87ceeb",slateblue:"#6a5acd",slategray:"#708090",slategrey:"#708090",snow:"#fffafa",springgreen:"#00ff7f",tan:"#d2b48c",teal:"#008080",thistle:"#d8bfd8",transparent:"#00000000",turquoise:"#40e0d0",violet:"#ee82ee",wheat:"#f5deb3",white:"#ffffff",whitesmoke:"#f5f5f5",yellow:"#ffff00",yellowgreen:"#9acd32"},parse:t=>{t=t.toLowerCase();const e=h.colors[t];if(e)return o.parse(e)},stringify:t=>{const e=o.stringify(t);for(const r in h.colors)if(h.colors[r]===e)return r}},u=h,d={re:/^rgba?\(\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))\s*?(?:,|\s)\s*?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?))(?:\s*?(?:,|\/)\s*?\+?(-?(?:\d+(?:\.\d+)?|(?:\.\d+))(?:e\d+)?(%?)))?\s*?\)$/i,parse:t=>{const e=t.charCodeAt(0);if(114!==e&&82!==e)return;const r=t.match(d.re);if(!r)return;const[,i,a,o,l,c,h,u,p]=r;return n.A.set({r:s.A.channel.clamp.r(a?2.55*parseFloat(i):parseFloat(i)),g:s.A.channel.clamp.g(l?2.55*parseFloat(o):parseFloat(o)),b:s.A.channel.clamp.b(h?2.55*parseFloat(c):parseFloat(c)),a:u?s.A.channel.clamp.a(p?parseFloat(u)/100:parseFloat(u)):1},t)},stringify:t=>{const{r:e,g:r,b:n,a:i}=t;return i<1?`rgba(${s.A.lang.round(e)}, ${s.A.lang.round(r)}, ${s.A.lang.round(n)}, ${s.A.lang.round(i)})`:`rgb(${s.A.lang.round(e)}, ${s.A.lang.round(r)}, ${s.A.lang.round(n)})`}},p=d,f={format:{keyword:h,hex:o,rgb:d,rgba:d,hsl:l,hsla:l},parse:t=>{if("string"!=typeof t)return t;const e=o.parse(t)||p.parse(t)||c.parse(t)||u.parse(t);if(e)return e;throw new Error(`Unsupported color format: "${t}"`)},stringify:t=>!t.changed&&t.color?t.color:t.type.is(i.Z.HSL)||void 0===t.data.r?c.stringify(t):t.a<1||!Number.isInteger(t.r)||!Number.isInteger(t.g)||!Number.isInteger(t.b)?p.stringify(t):o.stringify(t)},g=f},55842:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=r(57454).A.Symbol},56117:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t){return t}},56267:(t,e,r)=>{"use strict";r.d(e,{A:()=>c});var n=r(80565),i=r(97427);const a=function(t){return(0,i.A)(t)&&"[object Arguments]"==(0,n.A)(t)};var o=Object.prototype,s=o.hasOwnProperty,l=o.propertyIsEnumerable;const c=a(function(){return arguments}())?a:function(t){return(0,i.A)(t)&&s.call(t,"callee")&&!l.call(t,"callee")}},56287:function(t){t.exports=function(){"use strict";var t=1e3,e=6e4,r=36e5,n="millisecond",i="second",a="minute",o="hour",s="day",l="week",c="month",h="quarter",u="year",d="date",p="Invalid Date",f=/^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/,g=/\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g,m={name:"en",weekdays:"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),months:"January_February_March_April_May_June_July_August_September_October_November_December".split("_"),ordinal:function(t){var e=["th","st","nd","rd"],r=t%100;return"["+t+(e[(r-20)%10]||e[r]||e[0])+"]"}},y=function(t,e,r){var n=String(t);return!n||n.length>=e?t:""+Array(e+1-n.length).join(r)+t},x={s:y,z:function(t){var e=-t.utcOffset(),r=Math.abs(e),n=Math.floor(r/60),i=r%60;return(e<=0?"+":"-")+y(n,2,"0")+":"+y(i,2,"0")},m:function t(e,r){if(e.date()<r.date())return-t(r,e);var n=12*(r.year()-e.year())+(r.month()-e.month()),i=e.clone().add(n,c),a=r-i<0,o=e.clone().add(n+(a?-1:1),c);return+(-(n+(r-i)/(a?i-o:o-i))||0)},a:function(t){return t<0?Math.ceil(t)||0:Math.floor(t)},p:function(t){return{M:c,y:u,w:l,d:s,D:d,h:o,m:a,s:i,ms:n,Q:h}[t]||String(t||"").toLowerCase().replace(/s$/,"")},u:function(t){return void 0===t}},b="en",k={};k[b]=m;var C="$isDayjsObject",w=function(t){return t instanceof A||!(!t||!t[C])},_=function t(e,r,n){var i;if(!e)return b;if("string"==typeof e){var a=e.toLowerCase();k[a]&&(i=a),r&&(k[a]=r,i=a);var o=e.split("-");if(!i&&o.length>1)return t(o[0])}else{var s=e.name;k[s]=e,i=s}return!n&&i&&(b=i),i||!n&&b},v=function(t,e){if(w(t))return t.clone();var r="object"==typeof e?e:{};return r.date=t,r.args=arguments,new A(r)},S=x;S.l=_,S.i=w,S.w=function(t,e){return v(t,{locale:e.$L,utc:e.$u,x:e.$x,$offset:e.$offset})};var A=function(){function m(t){this.$L=_(t.locale,null,!0),this.parse(t),this.$x=this.$x||t.x||{},this[C]=!0}var y=m.prototype;return y.parse=function(t){this.$d=function(t){var e=t.date,r=t.utc;if(null===e)return new Date(NaN);if(S.u(e))return new Date;if(e instanceof Date)return new Date(e);if("string"==typeof e&&!/Z$/i.test(e)){var n=e.match(f);if(n){var i=n[2]-1||0,a=(n[7]||"0").substring(0,3);return r?new Date(Date.UTC(n[1],i,n[3]||1,n[4]||0,n[5]||0,n[6]||0,a)):new Date(n[1],i,n[3]||1,n[4]||0,n[5]||0,n[6]||0,a)}}return new Date(e)}(t),this.init()},y.init=function(){var t=this.$d;this.$y=t.getFullYear(),this.$M=t.getMonth(),this.$D=t.getDate(),this.$W=t.getDay(),this.$H=t.getHours(),this.$m=t.getMinutes(),this.$s=t.getSeconds(),this.$ms=t.getMilliseconds()},y.$utils=function(){return S},y.isValid=function(){return!(this.$d.toString()===p)},y.isSame=function(t,e){var r=v(t);return this.startOf(e)<=r&&r<=this.endOf(e)},y.isAfter=function(t,e){return v(t)<this.startOf(e)},y.isBefore=function(t,e){return this.endOf(e)<v(t)},y.$g=function(t,e,r){return S.u(t)?this[e]:this.set(r,t)},y.unix=function(){return Math.floor(this.valueOf()/1e3)},y.valueOf=function(){return this.$d.getTime()},y.startOf=function(t,e){var r=this,n=!!S.u(e)||e,h=S.p(t),p=function(t,e){var i=S.w(r.$u?Date.UTC(r.$y,e,t):new Date(r.$y,e,t),r);return n?i:i.endOf(s)},f=function(t,e){return S.w(r.toDate()[t].apply(r.toDate("s"),(n?[0,0,0,0]:[23,59,59,999]).slice(e)),r)},g=this.$W,m=this.$M,y=this.$D,x="set"+(this.$u?"UTC":"");switch(h){case u:return n?p(1,0):p(31,11);case c:return n?p(1,m):p(0,m+1);case l:var b=this.$locale().weekStart||0,k=(g<b?g+7:g)-b;return p(n?y-k:y+(6-k),m);case s:case d:return f(x+"Hours",0);case o:return f(x+"Minutes",1);case a:return f(x+"Seconds",2);case i:return f(x+"Milliseconds",3);default:return this.clone()}},y.endOf=function(t){return this.startOf(t,!1)},y.$set=function(t,e){var r,l=S.p(t),h="set"+(this.$u?"UTC":""),p=(r={},r[s]=h+"Date",r[d]=h+"Date",r[c]=h+"Month",r[u]=h+"FullYear",r[o]=h+"Hours",r[a]=h+"Minutes",r[i]=h+"Seconds",r[n]=h+"Milliseconds",r)[l],f=l===s?this.$D+(e-this.$W):e;if(l===c||l===u){var g=this.clone().set(d,1);g.$d[p](f),g.init(),this.$d=g.set(d,Math.min(this.$D,g.daysInMonth())).$d}else p&&this.$d[p](f);return this.init(),this},y.set=function(t,e){return this.clone().$set(t,e)},y.get=function(t){return this[S.p(t)]()},y.add=function(n,h){var d,p=this;n=Number(n);var f=S.p(h),g=function(t){var e=v(p);return S.w(e.date(e.date()+Math.round(t*n)),p)};if(f===c)return this.set(c,this.$M+n);if(f===u)return this.set(u,this.$y+n);if(f===s)return g(1);if(f===l)return g(7);var m=(d={},d[a]=e,d[o]=r,d[i]=t,d)[f]||1,y=this.$d.getTime()+n*m;return S.w(y,this)},y.subtract=function(t,e){return this.add(-1*t,e)},y.format=function(t){var e=this,r=this.$locale();if(!this.isValid())return r.invalidDate||p;var n=t||"YYYY-MM-DDTHH:mm:ssZ",i=S.z(this),a=this.$H,o=this.$m,s=this.$M,l=r.weekdays,c=r.months,h=r.meridiem,u=function(t,r,i,a){return t&&(t[r]||t(e,n))||i[r].slice(0,a)},d=function(t){return S.s(a%12||12,t,"0")},f=h||function(t,e,r){var n=t<12?"AM":"PM";return r?n.toLowerCase():n};return n.replace(g,function(t,n){return n||function(t){switch(t){case"YY":return String(e.$y).slice(-2);case"YYYY":return S.s(e.$y,4,"0");case"M":return s+1;case"MM":return S.s(s+1,2,"0");case"MMM":return u(r.monthsShort,s,c,3);case"MMMM":return u(c,s);case"D":return e.$D;case"DD":return S.s(e.$D,2,"0");case"d":return String(e.$W);case"dd":return u(r.weekdaysMin,e.$W,l,2);case"ddd":return u(r.weekdaysShort,e.$W,l,3);case"dddd":return l[e.$W];case"H":return String(a);case"HH":return S.s(a,2,"0");case"h":return d(1);case"hh":return d(2);case"a":return f(a,o,!0);case"A":return f(a,o,!1);case"m":return String(o);case"mm":return S.s(o,2,"0");case"s":return String(e.$s);case"ss":return S.s(e.$s,2,"0");case"SSS":return S.s(e.$ms,3,"0");case"Z":return i}return null}(t)||i.replace(":","")})},y.utcOffset=function(){return 15*-Math.round(this.$d.getTimezoneOffset()/15)},y.diff=function(n,d,p){var f,g=this,m=S.p(d),y=v(n),x=(y.utcOffset()-this.utcOffset())*e,b=this-y,k=function(){return S.m(g,y)};switch(m){case u:f=k()/12;break;case c:f=k();break;case h:f=k()/3;break;case l:f=(b-x)/6048e5;break;case s:f=(b-x)/864e5;break;case o:f=b/r;break;case a:f=b/e;break;case i:f=b/t;break;default:f=b}return p?f:S.a(f)},y.daysInMonth=function(){return this.endOf(c).$D},y.$locale=function(){return k[this.$L]},y.locale=function(t,e){if(!t)return this.$L;var r=this.clone(),n=_(t,e,!0);return n&&(r.$L=n),r},y.clone=function(){return S.w(this.$d,this)},y.toDate=function(){return new Date(this.valueOf())},y.toJSON=function(){return this.isValid()?this.toISOString():null},y.toISOString=function(){return this.$d.toISOString()},y.toString=function(){return this.$d.toUTCString()},m}(),T=A.prototype;return v.prototype=T,[["$ms",n],["$s",i],["$m",a],["$H",o],["$W",s],["$M",c],["$y",u],["$D",d]].forEach(function(t){T[t[1]]=function(e){return this.$g(e,t[0],t[1])}}),v.extend=function(t,e){return t.$i||(t(e,A,v),t.$i=!0),v},v.locale=_,v.isDayjs=w,v.unix=function(t){return v(1e3*t)},v.en=k[b],v.Ls=k,v.p={},v}()},56389:(t,e,r)=>{"use strict";r.d(e,{A:()=>d});var n=r(89732);const i=function(){this.__data__=new n.A,this.size=0};const a=function(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r};const o=function(t){return this.__data__.get(t)};const s=function(t){return this.__data__.has(t)};var l=r(86986),c=r(45786);const h=function(t,e){var r=this.__data__;if(r instanceof n.A){var i=r.__data__;if(!l.A||i.length<199)return i.push([t,e]),this.size=++r.size,this;r=this.__data__=new c.A(i)}return r.set(t,e),this.size=r.size,this};function u(t){var e=this.__data__=new n.A(t);this.size=e.size}u.prototype.clear=i,u.prototype.delete=a,u.prototype.get=o,u.prototype.has=s,u.prototype.set=h;const d=u},57454:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(6727),i="object"==typeof self&&self&&self.Object===Object&&self;const a=n.A||i||Function("return this")()},58480:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=r(11628);const i=(t,e)=>(0,n.A)(t,"l",e)},61923:(t,e,r)=>{"use strict";r.d(e,{IU:()=>y,Jo:()=>M,T_:()=>C,g0:()=>F,jP:()=>b});var n=r(290),i=r(49636),a=r(267),o=r(29951),s=r(63727),l=r(9420),c=r(97485),h=r(3170),u=r(30726),d=(0,c.K2)((t,e,r,n,i,a)=>{e.arrowTypeStart&&f(t,"start",e.arrowTypeStart,r,n,i,a),e.arrowTypeEnd&&f(t,"end",e.arrowTypeEnd,r,n,i,a)},"addEdgeMarkers"),p={arrow_cross:{type:"cross",fill:!1},arrow_point:{type:"point",fill:!0},arrow_barb:{type:"barb",fill:!0},arrow_circle:{type:"circle",fill:!1},aggregation:{type:"aggregation",fill:!1},extension:{type:"extension",fill:!1},composition:{type:"composition",fill:!0},dependency:{type:"dependency",fill:!0},lollipop:{type:"lollipop",fill:!1},only_one:{type:"onlyOne",fill:!1},zero_or_one:{type:"zeroOrOne",fill:!1},one_or_more:{type:"oneOrMore",fill:!1},zero_or_more:{type:"zeroOrMore",fill:!1},requirement_arrow:{type:"requirement_arrow",fill:!1},requirement_contains:{type:"requirement_contains",fill:!1}},f=(0,c.K2)((t,e,r,n,i,a,o)=>{const s=p[r];if(!s)return void c.Rm.warn(`Unknown arrow type: ${r}`);const l=`${i}_${a}-${s.type}${"start"===e?"Start":"End"}`;if(o&&""!==o.trim()){const r=`${l}_${o.replace(/[^\dA-Za-z]/g,"_")}`;if(!document.getElementById(r)){const t=document.getElementById(l);if(t){const e=t.cloneNode(!0);e.id=r;e.querySelectorAll("path, circle, line").forEach(t=>{t.setAttribute("stroke",o),s.fill&&t.setAttribute("fill",o)}),t.parentNode?.appendChild(e)}}t.attr(`marker-${e}`,`url(${n}#${r})`)}else t.attr(`marker-${e}`,`url(${n}#${l})`)},"addEdgeMarker"),g=new Map,m=new Map,y=(0,c.K2)(()=>{g.clear(),m.clear()},"clear"),x=(0,c.K2)(t=>t?t.reduce((t,e)=>t+";"+e,""):"","getLabelStyles"),b=(0,c.K2)(async(t,e)=>{let r=(0,c._3)((0,c.D7)().flowchart.htmlLabels);const n=await(0,s.GZ)(t,e.label,{style:x(e.labelStyle),useHtmlLabels:r,addSvgBackground:!0,isNode:!1});c.Rm.info("abc82",e,e.labelType);const a=t.insert("g").attr("class","edgeLabel"),o=a.insert("g").attr("class","label");o.node().appendChild(n);let l,u=n.getBBox();if(r){const t=n.children[0],e=(0,h.Ltv)(n);u=t.getBoundingClientRect(),e.attr("width",u.width),e.attr("height",u.height)}if(o.attr("transform","translate("+-u.width/2+", "+-u.height/2+")"),g.set(e.id,a),e.width=u.width,e.height=u.height,e.startLabelLeft){const r=await(0,i.DA)(e.startLabelLeft,x(e.labelStyle)),n=t.insert("g").attr("class","edgeTerminals"),a=n.insert("g").attr("class","inner");l=a.node().appendChild(r);const o=r.getBBox();a.attr("transform","translate("+-o.width/2+", "+-o.height/2+")"),m.get(e.id)||m.set(e.id,{}),m.get(e.id).startLeft=n,k(l,e.startLabelLeft)}if(e.startLabelRight){const r=await(0,i.DA)(e.startLabelRight,x(e.labelStyle)),n=t.insert("g").attr("class","edgeTerminals"),a=n.insert("g").attr("class","inner");l=n.node().appendChild(r),a.node().appendChild(r);const o=r.getBBox();a.attr("transform","translate("+-o.width/2+", "+-o.height/2+")"),m.get(e.id)||m.set(e.id,{}),m.get(e.id).startRight=n,k(l,e.startLabelRight)}if(e.endLabelLeft){const r=await(0,i.DA)(e.endLabelLeft,x(e.labelStyle)),n=t.insert("g").attr("class","edgeTerminals"),a=n.insert("g").attr("class","inner");l=a.node().appendChild(r);const o=r.getBBox();a.attr("transform","translate("+-o.width/2+", "+-o.height/2+")"),n.node().appendChild(r),m.get(e.id)||m.set(e.id,{}),m.get(e.id).endLeft=n,k(l,e.endLabelLeft)}if(e.endLabelRight){const r=await(0,i.DA)(e.endLabelRight,x(e.labelStyle)),n=t.insert("g").attr("class","edgeTerminals"),a=n.insert("g").attr("class","inner");l=a.node().appendChild(r);const o=r.getBBox();a.attr("transform","translate("+-o.width/2+", "+-o.height/2+")"),n.node().appendChild(r),m.get(e.id)||m.set(e.id,{}),m.get(e.id).endRight=n,k(l,e.endLabelRight)}return n},"insertEdgeLabel");function k(t,e){(0,c.D7)().flowchart.htmlLabels&&t&&(t.style.width=9*e.length+"px",t.style.height="12px")}(0,c.K2)(k,"setTerminalWidth");var C=(0,c.K2)((t,e)=>{c.Rm.debug("Moving label abc88 ",t.id,t.label,g.get(t.id),e);let r=e.updatedPath?e.updatedPath:e.originalPath;const n=(0,c.D7)(),{subGraphTitleTotalMargin:i}=(0,a.O)(n);if(t.label){const n=g.get(t.id);let a=t.x,o=t.y;if(r){const n=l._K.calcLabelPosition(r);c.Rm.debug("Moving label "+t.label+" from (",a,",",o,") to (",n.x,",",n.y,") abc88"),e.updatedPath&&(a=n.x,o=n.y)}n.attr("transform",`translate(${a}, ${o+i/2})`)}if(t.startLabelLeft){const e=m.get(t.id).startLeft;let n=t.x,i=t.y;if(r){const e=l._K.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);n=e.x,i=e.y}e.attr("transform",`translate(${n}, ${i})`)}if(t.startLabelRight){const e=m.get(t.id).startRight;let n=t.x,i=t.y;if(r){const e=l._K.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);n=e.x,i=e.y}e.attr("transform",`translate(${n}, ${i})`)}if(t.endLabelLeft){const e=m.get(t.id).endLeft;let n=t.x,i=t.y;if(r){const e=l._K.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);n=e.x,i=e.y}e.attr("transform",`translate(${n}, ${i})`)}if(t.endLabelRight){const e=m.get(t.id).endRight;let n=t.x,i=t.y;if(r){const e=l._K.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);n=e.x,i=e.y}e.attr("transform",`translate(${n}, ${i})`)}},"positionEdgeLabel"),w=(0,c.K2)((t,e)=>{const r=t.x,n=t.y,i=Math.abs(e.x-r),a=Math.abs(e.y-n),o=t.width/2,s=t.height/2;return i>=o||a>=s},"outsideNode"),_=(0,c.K2)((t,e,r)=>{c.Rm.debug(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(e)}\n insidePoint : ${JSON.stringify(r)}\n node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);const n=t.x,i=t.y,a=Math.abs(n-r.x),o=t.width/2;let s=r.x<e.x?o-a:o+a;const l=t.height/2,h=Math.abs(e.y-r.y),u=Math.abs(e.x-r.x);if(Math.abs(i-e.y)*o>Math.abs(n-e.x)*l){let t=r.y<e.y?e.y-l-i:i-l-e.y;s=u*t/h;const n={x:r.x<e.x?r.x+s:r.x-u+s,y:r.y<e.y?r.y+h-t:r.y-h+t};return 0===s&&(n.x=e.x,n.y=e.y),0===u&&(n.x=e.x),0===h&&(n.y=e.y),c.Rm.debug(`abc89 top/bottom calc, Q ${h}, q ${t}, R ${u}, r ${s}`,n),n}{s=r.x<e.x?e.x-o-n:n-o-e.x;let t=h*s/u,i=r.x<e.x?r.x+u-s:r.x-u+s,a=r.y<e.y?r.y+t:r.y-t;return c.Rm.debug(`sides calc abc89, Q ${h}, q ${t}, R ${u}, r ${s}`,{_x:i,_y:a}),0===s&&(i=e.x,a=e.y),0===u&&(i=e.x),0===h&&(a=e.y),{x:i,y:a}}},"intersection"),v=(0,c.K2)((t,e)=>{c.Rm.warn("abc88 cutPathAtIntersect",t,e);let r=[],n=t[0],i=!1;return t.forEach(t=>{if(c.Rm.info("abc88 checking point",t,e),w(e,t)||i)c.Rm.warn("abc88 outside",t,n),n=t,i||r.push(t);else{const a=_(e,n,t);c.Rm.debug("abc88 inside",t,n,a),c.Rm.debug("abc88 intersection",a,e);let o=!1;r.forEach(t=>{o=o||t.x===a.x&&t.y===a.y}),r.some(t=>t.x===a.x&&t.y===a.y)?c.Rm.warn("abc88 no intersect",a,r):r.push(a),i=!0}}),c.Rm.debug("returning points",r),r},"cutPathAtIntersect");function S(t){const e=[],r=[];for(let n=1;n<t.length-1;n++){const i=t[n-1],a=t[n],o=t[n+1];(i.x===a.x&&a.y===o.y&&Math.abs(a.x-o.x)>5&&Math.abs(a.y-i.y)>5||i.y===a.y&&a.x===o.x&&Math.abs(a.x-i.x)>5&&Math.abs(a.y-o.y)>5)&&(e.push(a),r.push(n))}return{cornerPoints:e,cornerPointPositions:r}}(0,c.K2)(S,"extractCornerPoints");var A=(0,c.K2)(function(t,e,r){const n=e.x-t.x,i=e.y-t.y,a=r/Math.sqrt(n*n+i*i);return{x:e.x-a*n,y:e.y-a*i}},"findAdjacentPoint"),T=(0,c.K2)(function(t){const{cornerPointPositions:e}=S(t),r=[];for(let n=0;n<t.length;n++)if(e.includes(n)){const e=t[n-1],i=t[n+1],a=t[n],o=A(e,a,5),s=A(i,a,5),l=s.x-o.x,h=s.y-o.y;r.push(o);const u=2*Math.sqrt(2);let d={x:a.x,y:a.y};if(Math.abs(i.x-e.x)>10&&Math.abs(i.y-e.y)>=10){c.Rm.debug("Corner point fixing",Math.abs(i.x-e.x),Math.abs(i.y-e.y));const t=5;d=a.x===o.x?{x:l<0?o.x-t+u:o.x+t-u,y:h<0?o.y-u:o.y+u}:{x:l<0?o.x-u:o.x+u,y:h<0?o.y-t+u:o.y+t-u}}else c.Rm.debug("Corner point skipping fixing",Math.abs(i.x-e.x),Math.abs(i.y-e.y));r.push(d,s)}else r.push(t[n]);return r},"fixCorners"),M=(0,c.K2)(function(t,e,r,i,a,s,l){const{handDrawnSeed:p}=(0,c.D7)();let f=e.points,g=!1;const m=a;var y=s;const x=[];for(const n in e.cssCompiledStyles)(0,o.KX)(n)||x.push(e.cssCompiledStyles[n]);y.intersect&&m.intersect&&(f=f.slice(1,e.points.length-1),f.unshift(m.intersect(f[0])),c.Rm.debug("Last point APA12",e.start,"--\x3e",e.end,f[f.length-1],y,y.intersect(f[f.length-1])),f.push(y.intersect(f[f.length-1]))),e.toCluster&&(c.Rm.info("to cluster abc88",r.get(e.toCluster)),f=v(e.points,r.get(e.toCluster).node),g=!0),e.fromCluster&&(c.Rm.debug("from cluster abc88",r.get(e.fromCluster),JSON.stringify(f,null,2)),f=v(f.reverse(),r.get(e.fromCluster).node).reverse(),g=!0);let b=f.filter(t=>!Number.isNaN(t.y));b=T(b);let k=h.qrM;switch(k=h.lUB,e.curve){case"linear":k=h.lUB;break;case"basis":default:k=h.qrM;break;case"cardinal":k=h.y8u;break;case"bumpX":k=h.Wi0;break;case"bumpY":k=h.PGM;break;case"catmullRom":k=h.oDi;break;case"monotoneX":k=h.nVG;break;case"monotoneY":k=h.uxU;break;case"natural":k=h.Xf2;break;case"step":k=h.GZz;break;case"stepAfter":k=h.UPb;break;case"stepBefore":k=h.dyv}const{x:C,y:w}=(0,n.R)(e),_=(0,h.n8j)().x(C).y(w).curve(k);let S,A;switch(e.thickness){case"normal":default:S="edge-thickness-normal";break;case"thick":S="edge-thickness-thick";break;case"invisible":S="edge-thickness-invisible"}switch(e.pattern){case"solid":default:S+=" edge-pattern-solid";break;case"dotted":S+=" edge-pattern-dotted";break;case"dashed":S+=" edge-pattern-dashed"}let M=_(b);const B=Array.isArray(e.style)?e.style:e.style?[e.style]:[];let L=B.find(t=>t?.startsWith("stroke:"));if("handDrawn"===e.look){const r=u.A.svg(t);Object.assign([],b);const n=r.path(M,{roughness:.3,seed:p});S+=" transition",A=(0,h.Ltv)(n).select("path").attr("id",e.id).attr("class"," "+S+(e.classes?" "+e.classes:"")).attr("style",B?B.reduce((t,e)=>t+";"+e,""):"");let i=A.attr("d");A.attr("d",i),t.node().appendChild(A.node())}else{const r=x.join(";"),n=B?B.reduce((t,e)=>t+e+";",""):"";let i="";e.animate&&(i=" edge-animation-fast"),e.animation&&(i=" edge-animation-"+e.animation);const a=r?r+";"+n+";":n;A=t.append("path").attr("d",M).attr("id",e.id).attr("class"," "+S+(e.classes?" "+e.classes:"")+(i??"")).attr("style",a),L=a.match(/stroke:([^;]+)/)?.[1]}let F="";((0,c.D7)().flowchart.arrowMarkerAbsolute||(0,c.D7)().state.arrowMarkerAbsolute)&&(F=(0,c.ID)(!0)),c.Rm.info("arrowTypeStart",e.arrowTypeStart),c.Rm.info("arrowTypeEnd",e.arrowTypeEnd),d(A,e,F,l,i,L);let $={};return g&&($.updatedPath=f),$.originalPath=e.points,$},"insertEdge"),B=(0,c.K2)((t,e,r,n)=>{e.forEach(e=>{L[e](t,r,n)})},"insertMarkers"),L={extension:(0,c.K2)((t,e,r)=>{c.Rm.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),composition:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),aggregation:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),dependency:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),lollipop:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),point:(0,c.K2)((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",8).attr("markerHeight",8).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),circle:(0,c.K2)((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),cross:(0,c.K2)((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),barb:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","userSpaceOnUse").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb"),only_one:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneStart").attr("class","marker onlyOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M9,0 L9,18 M15,0 L15,18"),t.append("defs").append("marker").attr("id",r+"_"+e+"-onlyOneEnd").attr("class","marker onlyOne "+e).attr("refX",18).attr("refY",9).attr("markerWidth",18).attr("markerHeight",18).attr("orient","auto").append("path").attr("d","M3,0 L3,18 M9,0 L9,18")},"only_one"),zero_or_one:(0,c.K2)((t,e,r)=>{const n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneStart").attr("class","marker zeroOrOne "+e).attr("refX",0).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",21).attr("cy",9).attr("r",6),n.append("path").attr("d","M9,0 L9,18");const i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrOneEnd").attr("class","marker zeroOrOne "+e).attr("refX",30).attr("refY",9).attr("markerWidth",30).attr("markerHeight",18).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",9).attr("r",6),i.append("path").attr("d","M21,0 L21,18")},"zero_or_one"),one_or_more:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreStart").attr("class","marker oneOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M0,18 Q 18,0 36,18 Q 18,36 0,18 M42,9 L42,27"),t.append("defs").append("marker").attr("id",r+"_"+e+"-oneOrMoreEnd").attr("class","marker oneOrMore "+e).attr("refX",27).attr("refY",18).attr("markerWidth",45).attr("markerHeight",36).attr("orient","auto").append("path").attr("d","M3,9 L3,27 M9,18 Q27,0 45,18 Q27,36 9,18")},"one_or_more"),zero_or_more:(0,c.K2)((t,e,r)=>{const n=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreStart").attr("class","marker zeroOrMore "+e).attr("refX",18).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");n.append("circle").attr("fill","white").attr("cx",48).attr("cy",18).attr("r",6),n.append("path").attr("d","M0,18 Q18,0 36,18 Q18,36 0,18");const i=t.append("defs").append("marker").attr("id",r+"_"+e+"-zeroOrMoreEnd").attr("class","marker zeroOrMore "+e).attr("refX",39).attr("refY",18).attr("markerWidth",57).attr("markerHeight",36).attr("orient","auto");i.append("circle").attr("fill","white").attr("cx",9).attr("cy",18).attr("r",6),i.append("path").attr("d","M21,18 Q39,0 57,18 Q39,36 21,18")},"zero_or_more"),requirement_arrow:(0,c.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_arrowEnd").attr("refX",20).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("path").attr("d","M0,0\n L20,10\n M20,10\n L0,20")},"requirement_arrow"),requirement_contains:(0,c.K2)((t,e,r)=>{const n=t.append("defs").append("marker").attr("id",r+"_"+e+"-requirement_containsStart").attr("refX",0).attr("refY",10).attr("markerWidth",20).attr("markerHeight",20).attr("orient","auto").append("g");n.append("circle").attr("cx",10).attr("cy",10).attr("r",9).attr("fill","none"),n.append("line").attr("x1",1).attr("x2",19).attr("y1",10).attr("y2",10),n.append("line").attr("y1",1).attr("y2",19).attr("x1",10).attr("x2",10)},"requirement_contains")},F=B},63406:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(35745),i=r(16957),a=Object.prototype.hasOwnProperty;const o=function(t,e,r){var o=t[e];a.call(t,e)&&(0,i.A)(o,r)&&(void 0!==r||e in t)||(0,n.A)(t,e,r)}},63727:(t,e,r)=>{"use strict";r.d(e,{W6:()=>Jt,GZ:()=>ne,WY:()=>zt,pC:()=>Rt,hE:()=>re,Gc:()=>Dt});var n=r(9420),i=r(97485);const a=(t,e)=>!!t&&!(!(e&&""===t.prefix||t.prefix)||!t.name),o=Object.freeze({left:0,top:0,width:16,height:16}),s=Object.freeze({rotate:0,vFlip:!1,hFlip:!1}),l=Object.freeze({...o,...s}),c=Object.freeze({...l,body:"",hidden:!1});function h(t,e){const r=function(t,e){const r={};!t.hFlip!=!e.hFlip&&(r.hFlip=!0),!t.vFlip!=!e.vFlip&&(r.vFlip=!0);const n=((t.rotate||0)+(e.rotate||0))%4;return n&&(r.rotate=n),r}(t,e);for(const n in c)n in s?n in t&&!(n in r)&&(r[n]=s[n]):n in e?r[n]=e[n]:n in t&&(r[n]=t[n]);return r}function u(t,e,r){const n=t.icons,i=t.aliases||Object.create(null);let a={};function o(t){a=h(n[t]||i[t],a)}return o(e),r.forEach(o),h(t,a)}function d(t,e){if(t.icons[e])return u(t,e,[]);const r=function(t,e){const r=t.icons,n=t.aliases||Object.create(null),i=Object.create(null);return(e||Object.keys(r).concat(Object.keys(n))).forEach(function t(e){if(r[e])return i[e]=[];if(!(e in i)){i[e]=null;const r=n[e]&&n[e].parent,a=r&&t(r);a&&(i[e]=[r].concat(a))}return i[e]}),i}(t,[e])[e];return r?u(t,e,r):null}const p=Object.freeze({width:null,height:null}),f=Object.freeze({...p,...s}),g=/(-?[0-9.]*[0-9]+[0-9.]*)/g,m=/^-?[0-9.]*[0-9]+[0-9.]*$/g;function y(t,e,r){if(1===e)return t;if(r=r||100,"number"==typeof t)return Math.ceil(t*e*r)/r;if("string"!=typeof t)return t;const n=t.split(g);if(null===n||!n.length)return t;const i=[];let a=n.shift(),o=m.test(a);for(;;){if(o){const t=parseFloat(a);isNaN(t)?i.push(a):i.push(Math.ceil(t*e*r)/r)}else i.push(a);if(a=n.shift(),void 0===a)return i.join("");o=!o}}const x=/\sid="(\S+)"/g,b="IconifyId"+Date.now().toString(16)+(16777216*Math.random()|0).toString(16);let k=0;var C=r(3170);function w(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var _={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};function v(t){_=t}var S={exec:()=>null};function A(t,e=""){let r="string"==typeof t?t:t.source;const n={replace:(t,e)=>{let i="string"==typeof e?e:e.source;return i=i.replace(T.caret,"$1"),r=r.replace(t,i),n},getRegex:()=>new RegExp(r,e)};return n}var T={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceTabs:/^\t+/,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] /,listReplaceTask:/^\[[ xX]\] +/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,unescapeTest:/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/gi,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:t=>new RegExp(`^( {0,3}${t})((?:[\t ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ \t][^\\n]*)?(?:\\n|$))`),hrRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`),fencesBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}(?:\`\`\`|~~~)`),headingBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}#`),htmlBeginRegex:t=>new RegExp(`^ {0,${Math.min(3,t-1)}}<(?:[a-z].*>|!--)`,"i")},M=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,B=/(?:[*+-]|\d{1,9}[.)])/,L=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,F=A(L).replace(/bull/g,B).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),$=A(L).replace(/bull/g,B).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),E=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/,D=/(?!\s*\])(?:\\.|[^\[\]\\])+/,N=A(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",D).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),O=A(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g,B).getRegex(),R="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",I=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,j=A("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|<![A-Z][\\s\\S]*?(?:>\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>\\n*|$)|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ \t]*)+\\n|$))","i").replace("comment",I).replace("tag",R).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),z=A(E).replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",R).getRegex(),P={blockquote:A(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",z).getRegex(),code:/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,def:N,fences:/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,heading:/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,hr:M,html:j,lheading:F,list:O,newline:/^(?:[ \t]*(?:\n|$))+/,paragraph:z,table:S,text:/^[^\n]+/},K=A("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3}\t)[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",R).getRegex(),q={...P,lheading:$,table:K,paragraph:A(E).replace("hr",M).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",K).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list"," {0,3}(?:[*+-]|1[.)]) ").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",R).getRegex()},W={...P,html:A("^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\s[^'\"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))").replace("comment",I).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:S,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:A(E).replace("hr",M).replace("heading"," *#{1,6} *[^\n]").replace("lheading",F).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()},H=/^( {2,}|\\)\n(?!\s*$)/,U=/[\p{P}\p{S}]/u,Y=/[\s\p{P}\p{S}]/u,G=/[^\s\p{P}\p{S}]/u,X=A(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,Y).getRegex(),V=/(?!~)[\p{P}\p{S}]/u,Z=/^(?:\*+(?:((?!\*)punct)|[^\s*]))|^_+(?:((?!_)punct)|([^\s_]))/,Q=A(Z,"u").replace(/punct/g,U).getRegex(),J=A(Z,"u").replace(/punct/g,V).getRegex(),tt="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",et=A(tt,"gu").replace(/notPunctSpace/g,G).replace(/punctSpace/g,Y).replace(/punct/g,U).getRegex(),rt=A(tt,"gu").replace(/notPunctSpace/g,/(?:[^\s\p{P}\p{S}]|~)/u).replace(/punctSpace/g,/(?!~)[\s\p{P}\p{S}]/u).replace(/punct/g,V).getRegex(),nt=A("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,G).replace(/punctSpace/g,Y).replace(/punct/g,U).getRegex(),it=A(/\\(punct)/,"gu").replace(/punct/g,U).getRegex(),at=A(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),ot=A(I).replace("(?:--\x3e|$)","--\x3e").getRegex(),st=A("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",ot).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),lt=/(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/,ct=A(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]*(?:\n[ \t]*)?)(title))?\s*\)/).replace("label",lt).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]*/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),ht=A(/^!?\[(label)\]\[(ref)\]/).replace("label",lt).replace("ref",D).getRegex(),ut=A(/^!?\[(ref)\](?:\[\])?/).replace("ref",D).getRegex(),dt={_backpedal:S,anyPunctuation:it,autolink:at,blockSkip:/\[[^[\]]*?\]\((?:\\.|[^\\\(\)]|\((?:\\.|[^\\\(\)])*\))*\)|`[^`]*?`|<[^<>]*?>/g,br:H,code:/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,del:S,emStrongLDelim:Q,emStrongRDelimAst:et,emStrongRDelimUnd:nt,escape:/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,link:ct,nolink:ut,punctuation:X,reflink:ht,reflinkSearch:A("reflink|nolink(?!\\()","g").replace("reflink",ht).replace("nolink",ut).getRegex(),tag:st,text:/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,url:S},pt={...dt,link:A(/^!?\[(label)\]\((.*?)\)/).replace("label",lt).getRegex(),reflink:A(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",lt).getRegex()},ft={...dt,emStrongRDelimAst:rt,emStrongLDelim:J,url:A(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,"i").replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\.|[^\\])*?(?:\\.|[^\s~\\]))\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/},gt={...ft,br:A(H).replace("{2,}","*").getRegex(),text:A(ft.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()},mt={normal:P,gfm:q,pedantic:W},yt={normal:dt,gfm:ft,breaks:gt,pedantic:pt},xt={"&":"&","<":"<",">":">",'"':""","'":"'"},bt=t=>xt[t];function kt(t,e){if(e){if(T.escapeTest.test(t))return t.replace(T.escapeReplace,bt)}else if(T.escapeTestNoEncode.test(t))return t.replace(T.escapeReplaceNoEncode,bt);return t}function Ct(t){try{t=encodeURI(t).replace(T.percentDecode,"%")}catch{return null}return t}function wt(t,e){const r=t.replace(T.findPipe,(t,e,r)=>{let n=!1,i=e;for(;--i>=0&&"\\"===r[i];)n=!n;return n?"|":" |"}).split(T.splitPipe);let n=0;if(r[0].trim()||r.shift(),r.length>0&&!r.at(-1)?.trim()&&r.pop(),e)if(r.length>e)r.splice(e);else for(;r.length<e;)r.push("");for(;n<r.length;n++)r[n]=r[n].trim().replace(T.slashPipe,"|");return r}function _t(t,e,r){const n=t.length;if(0===n)return"";let i=0;for(;i<n;){const a=t.charAt(n-i-1);if(a!==e||r){if(a===e||!r)break;i++}else i++}return t.slice(0,n-i)}function vt(t,e,r,n,i){const a=e.href,o=e.title||null,s=t[1].replace(i.other.outputLinkReplace,"$1");n.state.inLink=!0;const l={type:"!"===t[0].charAt(0)?"image":"link",raw:r,href:a,title:o,text:s,tokens:n.inlineTokens(s)};return n.state.inLink=!1,l}var St=class{options;rules;lexer;constructor(t){this.options=t||_}space(t){const e=this.rules.block.newline.exec(t);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(t){const e=this.rules.block.code.exec(t);if(e){const t=e[0].replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:e[0],codeBlockStyle:"indented",text:this.options.pedantic?t:_t(t,"\n")}}}fences(t){const e=this.rules.block.fences.exec(t);if(e){const t=e[0],r=function(t,e,r){const n=t.match(r.other.indentCodeCompensation);if(null===n)return e;const i=n[1];return e.split("\n").map(t=>{const e=t.match(r.other.beginningSpace);if(null===e)return t;const[n]=e;return n.length>=i.length?t.slice(i.length):t}).join("\n")}(t,e[3]||"",this.rules);return{type:"code",raw:t,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:r}}}heading(t){const e=this.rules.block.heading.exec(t);if(e){let t=e[2].trim();if(this.rules.other.endingHash.test(t)){const e=_t(t,"#");this.options.pedantic?t=e.trim():e&&!this.rules.other.endingSpaceChar.test(e)||(t=e.trim())}return{type:"heading",raw:e[0],depth:e[1].length,text:t,tokens:this.lexer.inline(t)}}}hr(t){const e=this.rules.block.hr.exec(t);if(e)return{type:"hr",raw:_t(e[0],"\n")}}blockquote(t){const e=this.rules.block.blockquote.exec(t);if(e){let t=_t(e[0],"\n").split("\n"),r="",n="";const i=[];for(;t.length>0;){let e=!1;const a=[];let o;for(o=0;o<t.length;o++)if(this.rules.other.blockquoteStart.test(t[o]))a.push(t[o]),e=!0;else{if(e)break;a.push(t[o])}t=t.slice(o);const s=a.join("\n"),l=s.replace(this.rules.other.blockquoteSetextReplace,"\n $1").replace(this.rules.other.blockquoteSetextReplace2,"");r=r?`${r}\n${s}`:s,n=n?`${n}\n${l}`:l;const c=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(l,i,!0),this.lexer.state.top=c,0===t.length)break;const h=i.at(-1);if("code"===h?.type)break;if("blockquote"===h?.type){const e=h,a=e.raw+"\n"+t.join("\n"),o=this.blockquote(a);i[i.length-1]=o,r=r.substring(0,r.length-e.raw.length)+o.raw,n=n.substring(0,n.length-e.text.length)+o.text;break}if("list"===h?.type){const e=h,a=e.raw+"\n"+t.join("\n"),o=this.list(a);i[i.length-1]=o,r=r.substring(0,r.length-h.raw.length)+o.raw,n=n.substring(0,n.length-e.raw.length)+o.raw,t=a.substring(i.at(-1).raw.length).split("\n");continue}}return{type:"blockquote",raw:r,tokens:i,text:n}}}list(t){let e=this.rules.block.list.exec(t);if(e){let r=e[1].trim();const n=r.length>1,i={type:"list",raw:"",ordered:n,start:n?+r.slice(0,-1):"",loose:!1,items:[]};r=n?`\\d{1,9}\\${r.slice(-1)}`:`\\${r}`,this.options.pedantic&&(r=n?r:"[*+-]");const a=this.rules.other.listItemRegex(r);let o=!1;for(;t;){let r=!1,n="",s="";if(!(e=a.exec(t)))break;if(this.rules.block.hr.test(t))break;n=e[0],t=t.substring(n.length);let l=e[2].split("\n",1)[0].replace(this.rules.other.listReplaceTabs,t=>" ".repeat(3*t.length)),c=t.split("\n",1)[0],h=!l.trim(),u=0;if(this.options.pedantic?(u=2,s=l.trimStart()):h?u=e[1].length+1:(u=e[2].search(this.rules.other.nonSpaceChar),u=u>4?1:u,s=l.slice(u),u+=e[1].length),h&&this.rules.other.blankLine.test(c)&&(n+=c+"\n",t=t.substring(c.length+1),r=!0),!r){const e=this.rules.other.nextBulletRegex(u),r=this.rules.other.hrRegex(u),i=this.rules.other.fencesBeginRegex(u),a=this.rules.other.headingBeginRegex(u),o=this.rules.other.htmlBeginRegex(u);for(;t;){const d=t.split("\n",1)[0];let p;if(c=d,this.options.pedantic?(c=c.replace(this.rules.other.listReplaceNesting," "),p=c):p=c.replace(this.rules.other.tabCharGlobal," "),i.test(c))break;if(a.test(c))break;if(o.test(c))break;if(e.test(c))break;if(r.test(c))break;if(p.search(this.rules.other.nonSpaceChar)>=u||!c.trim())s+="\n"+p.slice(u);else{if(h)break;if(l.replace(this.rules.other.tabCharGlobal," ").search(this.rules.other.nonSpaceChar)>=4)break;if(i.test(l))break;if(a.test(l))break;if(r.test(l))break;s+="\n"+c}h||c.trim()||(h=!0),n+=d+"\n",t=t.substring(d.length+1),l=p.slice(u)}}i.loose||(o?i.loose=!0:this.rules.other.doubleBlankLine.test(n)&&(o=!0));let d,p=null;this.options.gfm&&(p=this.rules.other.listIsTask.exec(s),p&&(d="[ ] "!==p[0],s=s.replace(this.rules.other.listReplaceTask,""))),i.items.push({type:"list_item",raw:n,task:!!p,checked:d,loose:!1,text:s,tokens:[]}),i.raw+=n}const s=i.items.at(-1);if(!s)return;s.raw=s.raw.trimEnd(),s.text=s.text.trimEnd(),i.raw=i.raw.trimEnd();for(let t=0;t<i.items.length;t++)if(this.lexer.state.top=!1,i.items[t].tokens=this.lexer.blockTokens(i.items[t].text,[]),!i.loose){const e=i.items[t].tokens.filter(t=>"space"===t.type),r=e.length>0&&e.some(t=>this.rules.other.anyLine.test(t.raw));i.loose=r}if(i.loose)for(let t=0;t<i.items.length;t++)i.items[t].loose=!0;return i}}html(t){const e=this.rules.block.html.exec(t);if(e){return{type:"html",block:!0,raw:e[0],pre:"pre"===e[1]||"script"===e[1]||"style"===e[1],text:e[0]}}}def(t){const e=this.rules.block.def.exec(t);if(e){const t=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),r=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",n=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:t,raw:e[0],href:r,title:n}}}table(t){const e=this.rules.block.table.exec(t);if(!e)return;if(!this.rules.other.tableDelimiter.test(e[2]))return;const r=wt(e[1]),n=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),i=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split("\n"):[],a={type:"table",raw:e[0],header:[],align:[],rows:[]};if(r.length===n.length){for(const t of n)this.rules.other.tableAlignRight.test(t)?a.align.push("right"):this.rules.other.tableAlignCenter.test(t)?a.align.push("center"):this.rules.other.tableAlignLeft.test(t)?a.align.push("left"):a.align.push(null);for(let t=0;t<r.length;t++)a.header.push({text:r[t],tokens:this.lexer.inline(r[t]),header:!0,align:a.align[t]});for(const t of i)a.rows.push(wt(t,a.header.length).map((t,e)=>({text:t,tokens:this.lexer.inline(t),header:!1,align:a.align[e]})));return a}}lheading(t){const e=this.rules.block.lheading.exec(t);if(e)return{type:"heading",raw:e[0],depth:"="===e[2].charAt(0)?1:2,text:e[1],tokens:this.lexer.inline(e[1])}}paragraph(t){const e=this.rules.block.paragraph.exec(t);if(e){const t="\n"===e[1].charAt(e[1].length-1)?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(t){const e=this.rules.block.text.exec(t);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(t){const e=this.rules.inline.escape.exec(t);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(t){const e=this.rules.inline.tag.exec(t);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(t){const e=this.rules.inline.link.exec(t);if(e){const t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;const e=_t(t.slice(0,-1),"\\");if((t.length-e.length)%2==0)return}else{const t=function(t,e){if(-1===t.indexOf(e[1]))return-1;let r=0;for(let n=0;n<t.length;n++)if("\\"===t[n])n++;else if(t[n]===e[0])r++;else if(t[n]===e[1]&&(r--,r<0))return n;return r>0?-2:-1}(e[2],"()");if(-2===t)return;if(t>-1){const r=(0===e[0].indexOf("!")?5:4)+e[1].length+t;e[2]=e[2].substring(0,t),e[0]=e[0].substring(0,r).trim(),e[3]=""}}let r=e[2],n="";if(this.options.pedantic){const t=this.rules.other.pedanticHrefTitle.exec(r);t&&(r=t[1],n=t[3])}else n=e[3]?e[3].slice(1,-1):"";return r=r.trim(),this.rules.other.startAngleBracket.test(r)&&(r=this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?r.slice(1):r.slice(1,-1)),vt(e,{href:r?r.replace(this.rules.inline.anyPunctuation,"$1"):r,title:n?n.replace(this.rules.inline.anyPunctuation,"$1"):n},e[0],this.lexer,this.rules)}}reflink(t,e){let r;if((r=this.rules.inline.reflink.exec(t))||(r=this.rules.inline.nolink.exec(t))){const t=e[(r[2]||r[1]).replace(this.rules.other.multipleSpaceGlobal," ").toLowerCase()];if(!t){const t=r[0].charAt(0);return{type:"text",raw:t,text:t}}return vt(r,t,r[0],this.lexer,this.rules)}}emStrong(t,e,r=""){let n=this.rules.inline.emStrongLDelim.exec(t);if(!n)return;if(n[3]&&r.match(this.rules.other.unicodeAlphaNumeric))return;if(!(n[1]||n[2]||"")||!r||this.rules.inline.punctuation.exec(r)){const r=[...n[0]].length-1;let i,a,o=r,s=0;const l="*"===n[0][0]?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(l.lastIndex=0,e=e.slice(-1*t.length+r);null!=(n=l.exec(e));){if(i=n[1]||n[2]||n[3]||n[4]||n[5]||n[6],!i)continue;if(a=[...i].length,n[3]||n[4]){o+=a;continue}if((n[5]||n[6])&&r%3&&!((r+a)%3)){s+=a;continue}if(o-=a,o>0)continue;a=Math.min(a,a+o+s);const e=[...n[0]][0].length,l=t.slice(0,r+n.index+e+a);if(Math.min(r,a)%2){const t=l.slice(1,-1);return{type:"em",raw:l,text:t,tokens:this.lexer.inlineTokens(t)}}const c=l.slice(2,-2);return{type:"strong",raw:l,text:c,tokens:this.lexer.inlineTokens(c)}}}}codespan(t){const e=this.rules.inline.code.exec(t);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," ");const r=this.rules.other.nonSpaceChar.test(t),n=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return r&&n&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(t){const e=this.rules.inline.br.exec(t);if(e)return{type:"br",raw:e[0]}}del(t){const e=this.rules.inline.del.exec(t);if(e)return{type:"del",raw:e[0],text:e[2],tokens:this.lexer.inlineTokens(e[2])}}autolink(t){const e=this.rules.inline.autolink.exec(t);if(e){let t,r;return"@"===e[2]?(t=e[1],r="mailto:"+t):(t=e[1],r=t),{type:"link",raw:e[0],text:t,href:r,tokens:[{type:"text",raw:t,text:t}]}}}url(t){let e;if(e=this.rules.inline.url.exec(t)){let t,r;if("@"===e[2])t=e[0],r="mailto:"+t;else{let n;do{n=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??""}while(n!==e[0]);t=e[0],r="www."===e[1]?"http://"+e[0]:e[0]}return{type:"link",raw:e[0],text:t,href:r,tokens:[{type:"text",raw:t,text:t}]}}}inlineText(t){const e=this.rules.inline.text.exec(t);if(e){const t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},At=class t{tokens;options;state;tokenizer;inlineQueue;constructor(t){this.tokens=[],this.tokens.links=Object.create(null),this.options=t||_,this.options.tokenizer=this.options.tokenizer||new St,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};const e={other:T,block:mt.normal,inline:yt.normal};this.options.pedantic?(e.block=mt.pedantic,e.inline=yt.pedantic):this.options.gfm&&(e.block=mt.gfm,this.options.breaks?e.inline=yt.breaks:e.inline=yt.gfm),this.tokenizer.rules=e}static get rules(){return{block:mt,inline:yt}}static lex(e,r){return new t(r).lex(e)}static lexInline(e,r){return new t(r).inlineTokens(e)}lex(t){t=t.replace(T.carriageReturn,"\n"),this.blockTokens(t,this.tokens);for(let e=0;e<this.inlineQueue.length;e++){const t=this.inlineQueue[e];this.inlineTokens(t.src,t.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(t,e=[],r=!1){for(this.options.pedantic&&(t=t.replace(T.tabCharGlobal," ").replace(T.spaceLine,""));t;){let n;if(this.options.extensions?.block?.some(r=>!!(n=r.call({lexer:this},t,e))&&(t=t.substring(n.raw.length),e.push(n),!0)))continue;if(n=this.tokenizer.space(t)){t=t.substring(n.raw.length);const r=e.at(-1);1===n.raw.length&&void 0!==r?r.raw+="\n":e.push(n);continue}if(n=this.tokenizer.code(t)){t=t.substring(n.raw.length);const r=e.at(-1);"paragraph"===r?.type||"text"===r?.type?(r.raw+="\n"+n.raw,r.text+="\n"+n.text,this.inlineQueue.at(-1).src=r.text):e.push(n);continue}if(n=this.tokenizer.fences(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.heading(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.hr(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.blockquote(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.list(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.html(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.def(t)){t=t.substring(n.raw.length);const r=e.at(-1);"paragraph"===r?.type||"text"===r?.type?(r.raw+="\n"+n.raw,r.text+="\n"+n.raw,this.inlineQueue.at(-1).src=r.text):this.tokens.links[n.tag]||(this.tokens.links[n.tag]={href:n.href,title:n.title});continue}if(n=this.tokenizer.table(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.lheading(t)){t=t.substring(n.raw.length),e.push(n);continue}let i=t;if(this.options.extensions?.startBlock){let e=1/0;const r=t.slice(1);let n;this.options.extensions.startBlock.forEach(t=>{n=t.call({lexer:this},r),"number"==typeof n&&n>=0&&(e=Math.min(e,n))}),e<1/0&&e>=0&&(i=t.substring(0,e+1))}if(this.state.top&&(n=this.tokenizer.paragraph(i))){const a=e.at(-1);r&&"paragraph"===a?.type?(a.raw+="\n"+n.raw,a.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=a.text):e.push(n),r=i.length!==t.length,t=t.substring(n.raw.length);continue}if(n=this.tokenizer.text(t)){t=t.substring(n.raw.length);const r=e.at(-1);"text"===r?.type?(r.raw+="\n"+n.raw,r.text+="\n"+n.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=r.text):e.push(n);continue}if(t){const e="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(e);break}throw new Error(e)}}return this.state.top=!0,e}inline(t,e=[]){return this.inlineQueue.push({src:t,tokens:e}),e}inlineTokens(t,e=[]){let r=t,n=null;if(this.tokens.links){const t=Object.keys(this.tokens.links);if(t.length>0)for(;null!=(n=this.tokenizer.rules.inline.reflinkSearch.exec(r));)t.includes(n[0].slice(n[0].lastIndexOf("[")+1,-1))&&(r=r.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;null!=(n=this.tokenizer.rules.inline.anyPunctuation.exec(r));)r=r.slice(0,n.index)+"++"+r.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex);for(;null!=(n=this.tokenizer.rules.inline.blockSkip.exec(r));)r=r.slice(0,n.index)+"["+"a".repeat(n[0].length-2)+"]"+r.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);let i=!1,a="";for(;t;){let n;if(i||(a=""),i=!1,this.options.extensions?.inline?.some(r=>!!(n=r.call({lexer:this},t,e))&&(t=t.substring(n.raw.length),e.push(n),!0)))continue;if(n=this.tokenizer.escape(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.tag(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.link(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.reflink(t,this.tokens.links)){t=t.substring(n.raw.length);const r=e.at(-1);"text"===n.type&&"text"===r?.type?(r.raw+=n.raw,r.text+=n.text):e.push(n);continue}if(n=this.tokenizer.emStrong(t,r,a)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.codespan(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.br(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.del(t)){t=t.substring(n.raw.length),e.push(n);continue}if(n=this.tokenizer.autolink(t)){t=t.substring(n.raw.length),e.push(n);continue}if(!this.state.inLink&&(n=this.tokenizer.url(t))){t=t.substring(n.raw.length),e.push(n);continue}let o=t;if(this.options.extensions?.startInline){let e=1/0;const r=t.slice(1);let n;this.options.extensions.startInline.forEach(t=>{n=t.call({lexer:this},r),"number"==typeof n&&n>=0&&(e=Math.min(e,n))}),e<1/0&&e>=0&&(o=t.substring(0,e+1))}if(n=this.tokenizer.inlineText(o)){t=t.substring(n.raw.length),"_"!==n.raw.slice(-1)&&(a=n.raw.slice(-1)),i=!0;const r=e.at(-1);"text"===r?.type?(r.raw+=n.raw,r.text+=n.text):e.push(n);continue}if(t){const e="Infinite loop on byte: "+t.charCodeAt(0);if(this.options.silent){console.error(e);break}throw new Error(e)}}return e}},Tt=class{options;parser;constructor(t){this.options=t||_}space(t){return""}code({text:t,lang:e,escaped:r}){const n=(e||"").match(T.notSpaceStart)?.[0],i=t.replace(T.endingNewline,"")+"\n";return n?'<pre><code class="language-'+kt(n)+'">'+(r?i:kt(i,!0))+"</code></pre>\n":"<pre><code>"+(r?i:kt(i,!0))+"</code></pre>\n"}blockquote({tokens:t}){return`<blockquote>\n${this.parser.parse(t)}</blockquote>\n`}html({text:t}){return t}heading({tokens:t,depth:e}){return`<h${e}>${this.parser.parseInline(t)}</h${e}>\n`}hr(t){return"<hr>\n"}list(t){const e=t.ordered,r=t.start;let n="";for(let a=0;a<t.items.length;a++){const e=t.items[a];n+=this.listitem(e)}const i=e?"ol":"ul";return"<"+i+(e&&1!==r?' start="'+r+'"':"")+">\n"+n+"</"+i+">\n"}listitem(t){let e="";if(t.task){const r=this.checkbox({checked:!!t.checked});t.loose?"paragraph"===t.tokens[0]?.type?(t.tokens[0].text=r+" "+t.tokens[0].text,t.tokens[0].tokens&&t.tokens[0].tokens.length>0&&"text"===t.tokens[0].tokens[0].type&&(t.tokens[0].tokens[0].text=r+" "+kt(t.tokens[0].tokens[0].text),t.tokens[0].tokens[0].escaped=!0)):t.tokens.unshift({type:"text",raw:r+" ",text:r+" ",escaped:!0}):e+=r+" "}return e+=this.parser.parse(t.tokens,!!t.loose),`<li>${e}</li>\n`}checkbox({checked:t}){return"<input "+(t?'checked="" ':"")+'disabled="" type="checkbox">'}paragraph({tokens:t}){return`<p>${this.parser.parseInline(t)}</p>\n`}table(t){let e="",r="";for(let i=0;i<t.header.length;i++)r+=this.tablecell(t.header[i]);e+=this.tablerow({text:r});let n="";for(let i=0;i<t.rows.length;i++){const e=t.rows[i];r="";for(let t=0;t<e.length;t++)r+=this.tablecell(e[t]);n+=this.tablerow({text:r})}return n&&(n=`<tbody>${n}</tbody>`),"<table>\n<thead>\n"+e+"</thead>\n"+n+"</table>\n"}tablerow({text:t}){return`<tr>\n${t}</tr>\n`}tablecell(t){const e=this.parser.parseInline(t.tokens),r=t.header?"th":"td";return(t.align?`<${r} align="${t.align}">`:`<${r}>`)+e+`</${r}>\n`}strong({tokens:t}){return`<strong>${this.parser.parseInline(t)}</strong>`}em({tokens:t}){return`<em>${this.parser.parseInline(t)}</em>`}codespan({text:t}){return`<code>${kt(t,!0)}</code>`}br(t){return"<br>"}del({tokens:t}){return`<del>${this.parser.parseInline(t)}</del>`}link({href:t,title:e,tokens:r}){const n=this.parser.parseInline(r),i=Ct(t);if(null===i)return n;let a='<a href="'+(t=i)+'"';return e&&(a+=' title="'+kt(e)+'"'),a+=">"+n+"</a>",a}image({href:t,title:e,text:r,tokens:n}){n&&(r=this.parser.parseInline(n,this.parser.textRenderer));const i=Ct(t);if(null===i)return kt(r);let a=`<img src="${t=i}" alt="${r}"`;return e&&(a+=` title="${kt(e)}"`),a+=">",a}text(t){return"tokens"in t&&t.tokens?this.parser.parseInline(t.tokens):"escaped"in t&&t.escaped?t.text:kt(t.text)}},Mt=class{strong({text:t}){return t}em({text:t}){return t}codespan({text:t}){return t}del({text:t}){return t}html({text:t}){return t}text({text:t}){return t}link({text:t}){return""+t}image({text:t}){return""+t}br(){return""}},Bt=class t{options;renderer;textRenderer;constructor(t){this.options=t||_,this.options.renderer=this.options.renderer||new Tt,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Mt}static parse(e,r){return new t(r).parse(e)}static parseInline(e,r){return new t(r).parseInline(e)}parse(t,e=!0){let r="";for(let n=0;n<t.length;n++){const i=t[n];if(this.options.extensions?.renderers?.[i.type]){const t=i,e=this.options.extensions.renderers[t.type].call({parser:this},t);if(!1!==e||!["space","hr","heading","code","table","blockquote","list","html","paragraph","text"].includes(t.type)){r+=e||"";continue}}const a=i;switch(a.type){case"space":r+=this.renderer.space(a);continue;case"hr":r+=this.renderer.hr(a);continue;case"heading":r+=this.renderer.heading(a);continue;case"code":r+=this.renderer.code(a);continue;case"table":r+=this.renderer.table(a);continue;case"blockquote":r+=this.renderer.blockquote(a);continue;case"list":r+=this.renderer.list(a);continue;case"html":r+=this.renderer.html(a);continue;case"paragraph":r+=this.renderer.paragraph(a);continue;case"text":{let i=a,o=this.renderer.text(i);for(;n+1<t.length&&"text"===t[n+1].type;)i=t[++n],o+="\n"+this.renderer.text(i);r+=e?this.renderer.paragraph({type:"paragraph",raw:o,text:o,tokens:[{type:"text",raw:o,text:o,escaped:!0}]}):o;continue}default:{const t='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(t),"";throw new Error(t)}}}return r}parseInline(t,e=this.renderer){let r="";for(let n=0;n<t.length;n++){const i=t[n];if(this.options.extensions?.renderers?.[i.type]){const t=this.options.extensions.renderers[i.type].call({parser:this},i);if(!1!==t||!["escape","html","link","image","strong","em","codespan","br","del","text"].includes(i.type)){r+=t||"";continue}}const a=i;switch(a.type){case"escape":case"text":r+=e.text(a);break;case"html":r+=e.html(a);break;case"link":r+=e.link(a);break;case"image":r+=e.image(a);break;case"strong":r+=e.strong(a);break;case"em":r+=e.em(a);break;case"codespan":r+=e.codespan(a);break;case"br":r+=e.br(a);break;case"del":r+=e.del(a);break;default:{const t='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(t),"";throw new Error(t)}}}return r}},Lt=class{options;block;constructor(t){this.options=t||_}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(t){return t}postprocess(t){return t}processAllTokens(t){return t}provideLexer(){return this.block?At.lex:At.lexInline}provideParser(){return this.block?Bt.parse:Bt.parseInline}},Ft=new class{defaults={async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null};options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=Bt;Renderer=Tt;TextRenderer=Mt;Lexer=At;Tokenizer=St;Hooks=Lt;constructor(...t){this.use(...t)}walkTokens(t,e){let r=[];for(const n of t)switch(r=r.concat(e.call(this,n)),n.type){case"table":{const t=n;for(const n of t.header)r=r.concat(this.walkTokens(n.tokens,e));for(const n of t.rows)for(const t of n)r=r.concat(this.walkTokens(t.tokens,e));break}case"list":{const t=n;r=r.concat(this.walkTokens(t.items,e));break}default:{const t=n;this.defaults.extensions?.childTokens?.[t.type]?this.defaults.extensions.childTokens[t.type].forEach(n=>{const i=t[n].flat(1/0);r=r.concat(this.walkTokens(i,e))}):t.tokens&&(r=r.concat(this.walkTokens(t.tokens,e)))}}return r}use(...t){const e=this.defaults.extensions||{renderers:{},childTokens:{}};return t.forEach(t=>{const r={...t};if(r.async=this.defaults.async||r.async||!1,t.extensions&&(t.extensions.forEach(t=>{if(!t.name)throw new Error("extension name required");if("renderer"in t){const r=e.renderers[t.name];e.renderers[t.name]=r?function(...e){let n=t.renderer.apply(this,e);return!1===n&&(n=r.apply(this,e)),n}:t.renderer}if("tokenizer"in t){if(!t.level||"block"!==t.level&&"inline"!==t.level)throw new Error("extension level must be 'block' or 'inline'");const r=e[t.level];r?r.unshift(t.tokenizer):e[t.level]=[t.tokenizer],t.start&&("block"===t.level?e.startBlock?e.startBlock.push(t.start):e.startBlock=[t.start]:"inline"===t.level&&(e.startInline?e.startInline.push(t.start):e.startInline=[t.start]))}"childTokens"in t&&t.childTokens&&(e.childTokens[t.name]=t.childTokens)}),r.extensions=e),t.renderer){const e=this.defaults.renderer||new Tt(this.defaults);for(const r in t.renderer){if(!(r in e))throw new Error(`renderer '${r}' does not exist`);if(["options","parser"].includes(r))continue;const n=r,i=t.renderer[n],a=e[n];e[n]=(...t)=>{let r=i.apply(e,t);return!1===r&&(r=a.apply(e,t)),r||""}}r.renderer=e}if(t.tokenizer){const e=this.defaults.tokenizer||new St(this.defaults);for(const r in t.tokenizer){if(!(r in e))throw new Error(`tokenizer '${r}' does not exist`);if(["options","rules","lexer"].includes(r))continue;const n=r,i=t.tokenizer[n],a=e[n];e[n]=(...t)=>{let r=i.apply(e,t);return!1===r&&(r=a.apply(e,t)),r}}r.tokenizer=e}if(t.hooks){const e=this.defaults.hooks||new Lt;for(const r in t.hooks){if(!(r in e))throw new Error(`hook '${r}' does not exist`);if(["options","block"].includes(r))continue;const n=r,i=t.hooks[n],a=e[n];Lt.passThroughHooks.has(r)?e[n]=t=>{if(this.defaults.async)return Promise.resolve(i.call(e,t)).then(t=>a.call(e,t));const r=i.call(e,t);return a.call(e,r)}:e[n]=(...t)=>{let r=i.apply(e,t);return!1===r&&(r=a.apply(e,t)),r}}r.hooks=e}if(t.walkTokens){const e=this.defaults.walkTokens,n=t.walkTokens;r.walkTokens=function(t){let r=[];return r.push(n.call(this,t)),e&&(r=r.concat(e.call(this,t))),r}}this.defaults={...this.defaults,...r}}),this}setOptions(t){return this.defaults={...this.defaults,...t},this}lexer(t,e){return At.lex(t,e??this.defaults)}parser(t,e){return Bt.parse(t,e??this.defaults)}parseMarkdown(t){return(e,r)=>{const n={...r},i={...this.defaults,...n},a=this.onError(!!i.silent,!!i.async);if(!0===this.defaults.async&&!1===n.async)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(null==e)return a(new Error("marked(): input parameter is undefined or null"));if("string"!=typeof e)return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));i.hooks&&(i.hooks.options=i,i.hooks.block=t);const o=i.hooks?i.hooks.provideLexer():t?At.lex:At.lexInline,s=i.hooks?i.hooks.provideParser():t?Bt.parse:Bt.parseInline;if(i.async)return Promise.resolve(i.hooks?i.hooks.preprocess(e):e).then(t=>o(t,i)).then(t=>i.hooks?i.hooks.processAllTokens(t):t).then(t=>i.walkTokens?Promise.all(this.walkTokens(t,i.walkTokens)).then(()=>t):t).then(t=>s(t,i)).then(t=>i.hooks?i.hooks.postprocess(t):t).catch(a);try{i.hooks&&(e=i.hooks.preprocess(e));let t=o(e,i);i.hooks&&(t=i.hooks.processAllTokens(t)),i.walkTokens&&this.walkTokens(t,i.walkTokens);let r=s(t,i);return i.hooks&&(r=i.hooks.postprocess(r)),r}catch(l){return a(l)}}}onError(t,e){return r=>{if(r.message+="\nPlease report this to https://github.com/markedjs/marked.",t){const t="<p>An error occurred:</p><pre>"+kt(r.message+"",!0)+"</pre>";return e?Promise.resolve(t):t}if(e)return Promise.reject(r);throw r}}};function $t(t,e){return Ft.parse(t,e)}$t.options=$t.setOptions=function(t){return Ft.setOptions(t),$t.defaults=Ft.defaults,v($t.defaults),$t},$t.getDefaults=w,$t.defaults=_,$t.use=function(...t){return Ft.use(...t),$t.defaults=Ft.defaults,v($t.defaults),$t},$t.walkTokens=function(t,e){return Ft.walkTokens(t,e)},$t.parseInline=Ft.parseInline,$t.Parser=Bt,$t.parser=Bt.parse,$t.Renderer=Tt,$t.TextRenderer=Mt,$t.Lexer=At,$t.lexer=At.lex,$t.Tokenizer=St,$t.Hooks=Lt,$t.parse=$t;$t.options,$t.setOptions,$t.use,$t.walkTokens,$t.parseInline,Bt.parse,At.lex;var Et=r(86793),Dt={body:'<g><rect width="80" height="80" style="fill: #087ebf; stroke-width: 0px;"/><text transform="translate(21.16 64.67)" style="fill: #fff; font-family: ArialMT, Arial; font-size: 67.75px;"><tspan x="0" y="0">?</tspan></text></g>',height:80,width:80},Nt=new Map,Ot=new Map,Rt=(0,i.K2)(t=>{for(const e of t){if(!e.name)throw new Error('Invalid icon loader. Must have a "name" property with non-empty string value.');if(i.Rm.debug("Registering icon pack:",e.name),"loader"in e)Ot.set(e.name,e.loader);else{if(!("icons"in e))throw i.Rm.error("Invalid icon loader:",e),new Error('Invalid icon loader. Must have either "icons" or "loader" property.');Nt.set(e.name,e.icons)}}},"registerIconPacks"),It=(0,i.K2)(async(t,e)=>{const r=((t,e,r,n="")=>{const i=t.split(":");if("@"===t.slice(0,1)){if(i.length<2||i.length>3)return null;n=i.shift().slice(1)}if(i.length>3||!i.length)return null;if(i.length>1){const t=i.pop(),r=i.pop(),o={provider:i.length>0?i[0]:n,prefix:r,name:t};return e&&!a(o)?null:o}const o=i[0],s=o.split("-");if(s.length>1){const t={provider:n,prefix:s.shift(),name:s.join("-")};return e&&!a(t)?null:t}if(r&&""===n){const t={provider:n,prefix:"",name:o};return e&&!a(t,r)?null:t}return null})(t,!0,void 0!==e);if(!r)throw new Error(`Invalid icon name: ${t}`);const n=r.prefix||e;if(!n)throw new Error(`Icon name must contain a prefix: ${t}`);let o=Nt.get(n);if(!o){const t=Ot.get(n);if(!t)throw new Error(`Icon set not found: ${r.prefix}`);try{o={...await t(),prefix:n},Nt.set(n,o)}catch(l){throw i.Rm.error(l),new Error(`Failed to load icon set: ${r.prefix}`)}}const s=d(o,r.name);if(!s)throw new Error(`Icon not found: ${t}`);return s},"getRegisteredIconData"),jt=(0,i.K2)(async t=>{try{return await It(t),!0}catch{return!1}},"isIconAvailable"),zt=(0,i.K2)(async(t,e,r)=>{let n;try{n=await It(t,e?.fallbackPrefix)}catch(o){i.Rm.error(o),n=Dt}const a=function(t,e){const r={...l,...t},n={...f,...e},i={left:r.left,top:r.top,width:r.width,height:r.height};let a=r.body;[r,n].forEach(t=>{const e=[],r=t.hFlip,n=t.vFlip;let o,s=t.rotate;switch(r?n?s+=2:(e.push("translate("+(i.width+i.left).toString()+" "+(0-i.top).toString()+")"),e.push("scale(-1 1)"),i.top=i.left=0):n&&(e.push("translate("+(0-i.left).toString()+" "+(i.height+i.top).toString()+")"),e.push("scale(1 -1)"),i.top=i.left=0),s<0&&(s-=4*Math.floor(s/4)),s%=4,s){case 1:o=i.height/2+i.top,e.unshift("rotate(90 "+o.toString()+" "+o.toString()+")");break;case 2:e.unshift("rotate(180 "+(i.width/2+i.left).toString()+" "+(i.height/2+i.top).toString()+")");break;case 3:o=i.width/2+i.left,e.unshift("rotate(-90 "+o.toString()+" "+o.toString()+")")}s%2==1&&(i.left!==i.top&&(o=i.left,i.left=i.top,i.top=o),i.width!==i.height&&(o=i.width,i.width=i.height,i.height=o)),e.length&&(a=function(t,e,r){const n=function(t,e="defs"){let r="";const n=t.indexOf("<"+e);for(;n>=0;){const i=t.indexOf(">",n),a=t.indexOf("</"+e);if(-1===i||-1===a)break;const o=t.indexOf(">",a);if(-1===o)break;r+=t.slice(i+1,a).trim(),t=t.slice(0,n).trim()+t.slice(o+1)}return{defs:r,content:t}}(t);return i=n.defs,a=e+n.content+r,i?"<defs>"+i+"</defs>"+a:a;var i,a}(a,'<g transform="'+e.join(" ")+'">',"</g>"))});const o=n.width,s=n.height,c=i.width,h=i.height;let u,d;null===o?(d=null===s?"1em":"auto"===s?h:s,u=y(d,c/h)):(u="auto"===o?c:o,d=null===s?y(u,h/c):"auto"===s?h:s);const p={},g=(t,e)=>{(t=>"unset"===t||"undefined"===t||"none"===t)(e)||(p[t]=e.toString())};g("width",u),g("height",d);const m=[i.left,i.top,c,h];return p.viewBox=m.join(" "),{attributes:p,viewBox:m,body:a}}(n,e);return function(t,e){let r=-1===t.indexOf("xlink:")?"":' xmlns:xlink="http://www.w3.org/1999/xlink"';for(const n in e)r+=" "+n+'="'+e[n]+'"';return'<svg xmlns="http://www.w3.org/2000/svg"'+r+">"+t+"</svg>"}(function(t,e=b){const r=[];let n;for(;n=x.exec(t);)r.push(n[1]);if(!r.length)return t;const i="suffix"+(16777216*Math.random()|Date.now()).toString(16);return r.forEach(r=>{const n="function"==typeof e?e(r):e+(k++).toString(),a=r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");t=t.replace(new RegExp('([#;"])('+a+')([")]|\\.[a-z])',"g"),"$1"+n+i+"$3")}),t=t.replace(new RegExp(i,"g"),"")}(a.body),{...a.attributes,...r})},"getIconSVG");function Pt(t,{markdownAutoWrap:e}){const r=t.replace(/<br\/>/g,"\n").replace(/\n{2,}/g,"\n"),n=(0,Et.T)(r);return!1===e?n.replace(/ /g," "):n}function Kt(t,e={}){const r=Pt(t,e),n=$t.lexer(r),a=[[]];let o=0;function s(t,e="normal"){if("text"===t.type){t.text.split("\n").forEach((t,r)=>{0!==r&&(o++,a.push([])),t.split(" ").forEach(t=>{(t=t.replace(/'/g,"'"))&&a[o].push({content:t,type:e})})})}else"strong"===t.type||"em"===t.type?t.tokens.forEach(e=>{s(e,t.type)}):"html"===t.type&&a[o].push({content:t.text,type:"normal"})}return(0,i.K2)(s,"processNode"),n.forEach(t=>{"paragraph"===t.type?t.tokens?.forEach(t=>{s(t)}):"html"===t.type&&a[o].push({content:t.text,type:"normal"})}),a}function qt(t,{markdownAutoWrap:e}={}){const r=$t.lexer(t);function n(t){return"text"===t.type?!1===e?t.text.replace(/\n */g,"<br/>").replace(/ /g," "):t.text.replace(/\n */g,"<br/>"):"strong"===t.type?`<strong>${t.tokens?.map(n).join("")}</strong>`:"em"===t.type?`<em>${t.tokens?.map(n).join("")}</em>`:"paragraph"===t.type?`<p>${t.tokens?.map(n).join("")}</p>`:"space"===t.type?"":"html"===t.type?`${t.text}`:"escape"===t.type?t.text:`Unsupported markdown: ${t.type}`}return(0,i.K2)(n,"output"),r.map(n).join("")}function Wt(t){return Intl.Segmenter?[...(new Intl.Segmenter).segment(t)].map(t=>t.segment):[...t]}function Ht(t,e){return Ut(t,[],Wt(e.content),e.type)}function Ut(t,e,r,n){if(0===r.length)return[{content:e.join(""),type:n},{content:"",type:n}];const[i,...a]=r,o=[...e,i];return t([{content:o.join(""),type:n}])?Ut(t,o,a,n):(0===e.length&&i&&(e.push(i),r.shift()),[{content:e.join(""),type:n},{content:r.join(""),type:n}])}function Yt(t,e){if(t.some(({content:t})=>t.includes("\n")))throw new Error("splitLineToFitWidth does not support newlines in the line");return Gt(t,e)}function Gt(t,e,r=[],n=[]){if(0===t.length)return n.length>0&&r.push(n),r.length>0?r:[];let i="";" "===t[0].content&&(i=" ",t.shift());const a=t.shift()??{content:" ",type:"normal"},o=[...n];if(""!==i&&o.push({content:i,type:"normal"}),o.push(a),e(o))return Gt(t,e,r,o);if(n.length>0)r.push(n),t.unshift(a);else if(a.content){const[n,i]=Ht(e,a);r.push([n]),i.content&&t.unshift(i)}return Gt(t,e,r)}function Xt(t,e){e&&t.attr("style",e)}async function Vt(t,e,r,n,a=!1){const o=t.append("foreignObject");o.attr("width",10*r+"px"),o.attr("height",10*r+"px");const s=o.append("xhtml:div");let l=e.label;e.label&&(0,i.Wi)(e.label)&&(l=await(0,i.VJ)(e.label.replace(i.Y2.lineBreakRegex,"\n"),(0,i.D7)()));const c=e.isNode?"nodeLabel":"edgeLabel",h=s.append("span");h.html(l),Xt(h,e.labelStyle),h.attr("class",`${c} ${n}`),Xt(s,e.labelStyle),s.style("display","table-cell"),s.style("white-space","nowrap"),s.style("line-height","1.5"),s.style("max-width",r+"px"),s.style("text-align","center"),s.attr("xmlns","http://www.w3.org/1999/xhtml"),a&&s.attr("class","labelBkg");let u=s.node().getBoundingClientRect();return u.width===r&&(s.style("display","table"),s.style("white-space","break-spaces"),s.style("width",r+"px"),u=s.node().getBoundingClientRect()),o.node()}function Zt(t,e,r){return t.append("tspan").attr("class","text-outer-tspan").attr("x",0).attr("y",e*r-.1+"em").attr("dy",r+"em")}function Qt(t,e,r){const n=t.append("text"),i=Zt(n,1,e);ee(i,r);const a=i.node().getComputedTextLength();return n.remove(),a}function Jt(t,e,r){const n=t.append("text"),i=Zt(n,1,e);ee(i,[{content:r,type:"normal"}]);const a=i.node()?.getBoundingClientRect();return a&&n.remove(),a}function te(t,e,r,n=!1){const a=e.append("g"),o=a.insert("rect").attr("class","background").attr("style","stroke: none"),s=a.append("text").attr("y","-10.1");let l=0;for(const c of r){const e=(0,i.K2)(e=>Qt(a,1.1,e)<=t,"checkWidth"),r=e(c)?[c]:Yt(c,e);for(const t of r){ee(Zt(s,l,1.1),t),l++}}if(n){const t=s.node().getBBox(),e=2;return o.attr("x",t.x-e).attr("y",t.y-e).attr("width",t.width+2*e).attr("height",t.height+2*e),a.node()}return s.node()}function ee(t,e){t.text(""),e.forEach((e,r)=>{const n=t.append("tspan").attr("font-style","em"===e.type?"italic":"normal").attr("class","text-inner-tspan").attr("font-weight","strong"===e.type?"bold":"normal");0===r?n.text(e.content):n.text(" "+e.content)})}async function re(t){const e=[];t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,(t,r,n)=>(e.push((async()=>{const e=`${r}:${n}`;return await jt(e)?await zt(e,void 0,{class:"label-icon"}):`<i class='${(0,i.oB)(t).replace(":"," ")}'></i>`})()),t));const r=await Promise.all(e);return t.replace(/(fa[bklrs]?):fa-([\w-]+)/g,()=>r.shift()??"")}(0,i.K2)(Pt,"preprocessMarkdown"),(0,i.K2)(Kt,"markdownToLines"),(0,i.K2)(qt,"markdownToHTML"),(0,i.K2)(Wt,"splitTextToChars"),(0,i.K2)(Ht,"splitWordToFitWidth"),(0,i.K2)(Ut,"splitWordToFitWidthRecursion"),(0,i.K2)(Yt,"splitLineToFitWidth"),(0,i.K2)(Gt,"splitLineToFitWidthRecursion"),(0,i.K2)(Xt,"applyStyle"),(0,i.K2)(Vt,"addHtmlSpan"),(0,i.K2)(Zt,"createTspan"),(0,i.K2)(Qt,"computeWidthOfText"),(0,i.K2)(Jt,"computeDimensionOfText"),(0,i.K2)(te,"createFormattedText"),(0,i.K2)(ee,"updateTextContentAndStyles"),(0,i.K2)(re,"replaceIconSubstring");var ne=(0,i.K2)(async(t,e="",{style:r="",isTitle:a=!1,classes:o="",useHtmlLabels:s=!0,isNode:l=!0,width:c=200,addSvgBackground:h=!1}={},u)=>{if(i.Rm.debug("XYZ createText",e,r,a,o,s,l,"addSvgBackground: ",h),s){const a=qt(e,u),s=await re((0,n.Sm)(a)),d=e.replace(/\\\\/g,"\\"),p={isNode:l,label:(0,i.Wi)(e)?d:s,labelStyle:r.replace("fill:","color:")};return await Vt(t,p,c,o,h)}{const n=te(c,t,Kt(e.replace(/<br\s*\/?>/g,"<br/>").replace("<br>","<br/>"),u),!!e&&h);if(l){/stroke:/.exec(r)&&(r=r.replace("stroke:","lineColor:"));const t=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");(0,C.Ltv)(n).attr("style",t)}else{const t=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/background:/g,"fill:");(0,C.Ltv)(n).select("rect").attr("style",t.replace(/background:/g,"fill:"));const e=r.replace(/stroke:[^;]+;?/g,"").replace(/stroke-width:[^;]+;?/g,"").replace(/fill:[^;]+;?/g,"").replace(/color:/g,"fill:");(0,C.Ltv)(n).select("text").attr("style",e)}return n}},"createText")},65404:(t,e,r)=>{"use strict";r.d(e,{R:()=>o,x:()=>s});var n=r(36672);const i={},a=n.createContext(i);function o(t){const e=n.useContext(a);return n.useMemo(function(){return"function"==typeof t?t(e):{...e,...t}},[e,t])}function s(t){let e;return e=t.disableParentContext?"function"==typeof t.components?t.components(i):t.components||i:o(t.components),n.createElement(a.Provider,{value:e},t.children)}},66916:(t,e,r)=>{"use strict";r.d(e,{A:()=>h});const n=function(t,e){for(var r=-1,n=Array(t);++r<t;)n[r]=e(r);return n};var i=r(56267),a=r(95526),o=r(27163),s=r(31408),l=r(69065),c=Object.prototype.hasOwnProperty;const h=function(t,e){var r=(0,a.A)(t),h=!r&&(0,i.A)(t),u=!r&&!h&&(0,o.A)(t),d=!r&&!h&&!u&&(0,l.A)(t),p=r||h||u||d,f=p?n(t.length,String):[],g=f.length;for(var m in t)!e&&!c.call(t,m)||p&&("length"==m||u&&("offset"==m||"parent"==m)||d&&("buffer"==m||"byteLength"==m||"byteOffset"==m)||(0,s.A)(m,g))||f.push(m);return f}},67231:(t,e,r)=>{"use strict";r.d(e,{A:()=>$});var n=r(36672),i=r(23420);function a(t){const{mdxAdmonitionTitle:e,rest:r}=function(t){const e=n.Children.toArray(t),r=e.find(t=>n.isValidElement(t)&&"mdxAdmonitionTitle"===t.type),a=e.filter(t=>t!==r),o=r?.props.children;return{mdxAdmonitionTitle:o,rest:a.length>0?(0,i.jsx)(i.Fragment,{children:a}):null}}(t.children),a=t.title??e;return{...t,...a&&{title:a},children:r}}var o=r(13526),s=r(53499),l=r(84862);const c="admonition_NGYd",h="admonitionHeading_hx_a",u="admonitionIcon_n04r",d="admonitionContent_LOU5";function p({type:t,className:e,children:r}){return(0,i.jsx)("div",{className:(0,o.A)(l.G.common.admonition,l.G.common.admonitionType(t),c,e),children:r})}function f({icon:t,title:e}){return(0,i.jsxs)("div",{className:h,children:[(0,i.jsx)("span",{className:u,children:t}),e]})}function g({children:t}){return t?(0,i.jsx)("div",{className:d,children:t}):null}function m(t){const{type:e,icon:r,title:n,children:a,className:o}=t;return(0,i.jsxs)(p,{type:e,className:o,children:[n||r?(0,i.jsx)(f,{title:n,icon:r}):null,(0,i.jsx)(g,{children:a})]})}function y(t){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...t,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"})})}const x={icon:(0,i.jsx)(y,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.note",description:"The default label used for the Note admonition (:::note)",children:"note"})};function b(t){return(0,i.jsx)(m,{...x,...t,className:(0,o.A)("alert alert--secondary",t.className),children:t.children})}function k(t){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...t,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"})})}const C={icon:(0,i.jsx)(k,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.tip",description:"The default label used for the Tip admonition (:::tip)",children:"tip"})};function w(t){return(0,i.jsx)(m,{...C,...t,className:(0,o.A)("alert alert--success",t.className),children:t.children})}function _(t){return(0,i.jsx)("svg",{viewBox:"0 0 14 16",...t,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"})})}const v={icon:(0,i.jsx)(_,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.info",description:"The default label used for the Info admonition (:::info)",children:"info"})};function S(t){return(0,i.jsx)(m,{...v,...t,className:(0,o.A)("alert alert--info",t.className),children:t.children})}function A(t){return(0,i.jsx)("svg",{viewBox:"0 0 16 16",...t,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"})})}const T={icon:(0,i.jsx)(A,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.warning",description:"The default label used for the Warning admonition (:::warning)",children:"warning"})};function M(t){return(0,i.jsx)("svg",{viewBox:"0 0 12 16",...t,children:(0,i.jsx)("path",{fillRule:"evenodd",d:"M5.05.31c.81 2.17.41 3.38-.52 4.31C3.55 5.67 1.98 6.45.9 7.98c-1.45 2.05-1.7 6.53 3.53 7.7-2.2-1.16-2.67-4.52-.3-6.61-.61 2.03.53 3.33 1.94 2.86 1.39-.47 2.3.53 2.27 1.67-.02.78-.31 1.44-1.13 1.81 3.42-.59 4.78-3.42 4.78-5.56 0-2.84-2.53-3.22-1.25-5.61-1.52.13-2.03 1.13-1.89 2.75.09 1.08-1.02 1.8-1.86 1.33-.67-.41-.66-1.19-.06-1.78C8.18 5.31 8.68 2.45 5.05.32L5.03.3l.02.01z"})})}const B={icon:(0,i.jsx)(M,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.danger",description:"The default label used for the Danger admonition (:::danger)",children:"danger"})};const L={icon:(0,i.jsx)(A,{}),title:(0,i.jsx)(s.A,{id:"theme.admonition.caution",description:"The default label used for the Caution admonition (:::caution)",children:"caution"})};const F={...{note:b,tip:w,info:S,warning:function(t){return(0,i.jsx)(m,{...T,...t,className:(0,o.A)("alert alert--warning",t.className),children:t.children})},danger:function(t){return(0,i.jsx)(m,{...B,...t,className:(0,o.A)("alert alert--danger",t.className),children:t.children})}},...{secondary:t=>(0,i.jsx)(b,{title:"secondary",...t}),important:t=>(0,i.jsx)(S,{title:"important",...t}),success:t=>(0,i.jsx)(w,{title:"success",...t}),caution:function(t){return(0,i.jsx)(m,{...L,...t,className:(0,o.A)("alert alert--warning",t.className),children:t.children})}}};function $(t){const e=a(t),r=(n=e.type,F[n]||(console.warn(`No admonition component found for admonition type "${n}". Using Info as fallback.`),F.info));var n;return(0,i.jsx)(r,{...e})}},68676:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(46554),i=r(38819);const a=class{constructor(){this.type=i.Z.ALL}get(){return this.type}set(t){if(this.type&&this.type!==t)throw new Error("Cannot change both RGB and HSL channels at the same time");this.type=t}reset(){this.type=i.Z.ALL}is(t){return this.type===t}};const o=new class{constructor(t,e){this.color=e,this.changed=!1,this.data=t,this.type=new a}set(t,e){return this.color=e,this.changed=!1,this.data=t,this.type.type=i.Z.ALL,this}_ensureHSL(){const t=this.data,{h:e,s:r,l:i}=t;void 0===e&&(t.h=n.A.channel.rgb2hsl(t,"h")),void 0===r&&(t.s=n.A.channel.rgb2hsl(t,"s")),void 0===i&&(t.l=n.A.channel.rgb2hsl(t,"l"))}_ensureRGB(){const t=this.data,{r:e,g:r,b:i}=t;void 0===e&&(t.r=n.A.channel.hsl2rgb(t,"r")),void 0===r&&(t.g=n.A.channel.hsl2rgb(t,"g")),void 0===i&&(t.b=n.A.channel.hsl2rgb(t,"b"))}get r(){const t=this.data,e=t.r;return this.type.is(i.Z.HSL)||void 0===e?(this._ensureHSL(),n.A.channel.hsl2rgb(t,"r")):e}get g(){const t=this.data,e=t.g;return this.type.is(i.Z.HSL)||void 0===e?(this._ensureHSL(),n.A.channel.hsl2rgb(t,"g")):e}get b(){const t=this.data,e=t.b;return this.type.is(i.Z.HSL)||void 0===e?(this._ensureHSL(),n.A.channel.hsl2rgb(t,"b")):e}get h(){const t=this.data,e=t.h;return this.type.is(i.Z.RGB)||void 0===e?(this._ensureRGB(),n.A.channel.rgb2hsl(t,"h")):e}get s(){const t=this.data,e=t.s;return this.type.is(i.Z.RGB)||void 0===e?(this._ensureRGB(),n.A.channel.rgb2hsl(t,"s")):e}get l(){const t=this.data,e=t.l;return this.type.is(i.Z.RGB)||void 0===e?(this._ensureRGB(),n.A.channel.rgb2hsl(t,"l")):e}get a(){return this.data.a}set r(t){this.type.set(i.Z.RGB),this.changed=!0,this.data.r=t}set g(t){this.type.set(i.Z.RGB),this.changed=!0,this.data.g=t}set b(t){this.type.set(i.Z.RGB),this.changed=!0,this.data.b=t}set h(t){this.type.set(i.Z.HSL),this.changed=!0,this.data.h=t}set s(t){this.type.set(i.Z.HSL),this.changed=!0,this.data.s=t}set l(t){this.type.set(i.Z.HSL),this.changed=!0,this.data.l=t}set a(t){this.changed=!0,this.data.a=t}}({r:0,g:0,b:0,a:0},"transparent")},69065:(t,e,r)=>{"use strict";r.d(e,{A:()=>u});var n=r(80565),i=r(47227),a=r(97427),o={};o["[object Float32Array]"]=o["[object Float64Array]"]=o["[object Int8Array]"]=o["[object Int16Array]"]=o["[object Int32Array]"]=o["[object Uint8Array]"]=o["[object Uint8ClampedArray]"]=o["[object Uint16Array]"]=o["[object Uint32Array]"]=!0,o["[object Arguments]"]=o["[object Array]"]=o["[object ArrayBuffer]"]=o["[object Boolean]"]=o["[object DataView]"]=o["[object Date]"]=o["[object Error]"]=o["[object Function]"]=o["[object Map]"]=o["[object Number]"]=o["[object Object]"]=o["[object RegExp]"]=o["[object Set]"]=o["[object String]"]=o["[object WeakMap]"]=!1;const s=function(t){return(0,a.A)(t)&&(0,i.A)(t.length)&&!!o[(0,n.A)(t)]};var l=r(5220),c=r(10130),h=c.A&&c.A.isTypedArray;const u=h?(0,l.A)(h):s},70370:(t,e)=>{"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.BLANK_URL=e.relativeFirstCharacters=e.whitespaceEscapeCharsRegex=e.urlSchemeRegex=e.ctrlCharactersRegex=e.htmlCtrlEntityRegex=e.htmlEntitiesRegex=e.invalidProtocolRegex=void 0,e.invalidProtocolRegex=/^([^\w]*)(javascript|data|vbscript)/im,e.htmlEntitiesRegex=/&#(\w+)(^\w|;)?/g,e.htmlCtrlEntityRegex=/&(newline|tab);/gi,e.ctrlCharactersRegex=/[\u0000-\u001F\u007F-\u009F\u2000-\u200D\uFEFF]/gim,e.urlSchemeRegex=/^.+(:|:)/gim,e.whitespaceEscapeCharsRegex=/(\\|%5[cC])((%(6[eE]|72|74))|[nrt])/g,e.relativeFirstCharacters=[".","/"],e.BLANK_URL="about:blank"},71398:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});const n=function(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)};var i=Math.max;const a=function(t,e,r){return e=i(void 0===e?t.length-1:e,0),function(){for(var a=arguments,o=-1,s=i(a.length-e,0),l=Array(s);++o<s;)l[o]=a[e+o];o=-1;for(var c=Array(e+1);++o<e;)c[o]=a[o];return c[e]=r(l),n(t,this,c)}}},71822:(t,e,r)=>{"use strict";r.d(e,{A:()=>y});r(36672);var n=r(13526),i=r(53499),a=r(84862),o=r(75150);const s={iconEdit:"iconEdit_M1a8"};var l=r(23420);function c({className:t,...e}){return(0,l.jsx)("svg",{fill:"currentColor",height:"20",width:"20",viewBox:"0 0 40 40",className:(0,n.A)(s.iconEdit,t),"aria-hidden":"true",...e,children:(0,l.jsx)("g",{children:(0,l.jsx)("path",{d:"m34.5 11.7l-3 3.1-6.3-6.3 3.1-3q0.5-0.5 1.2-0.5t1.1 0.5l3.9 3.9q0.5 0.4 0.5 1.1t-0.5 1.2z m-29.5 17.1l18.4-18.5 6.3 6.3-18.4 18.4h-6.3v-6.2z"})})})}function h({editUrl:t}){return(0,l.jsxs)(o.A,{to:t,className:a.G.common.editThisPage,children:[(0,l.jsx)(c,{}),(0,l.jsx)(i.A,{id:"theme.common.editThisPage",description:"The link label to edit the current page",children:"Edit this page"})]})}var u=r(56562);function d(t={}){const{i18n:{currentLocale:e}}=(0,u.A)(),r=function(){const{i18n:{currentLocale:t,localeConfigs:e}}=(0,u.A)();return e[t].calendar}();return new Intl.DateTimeFormat(e,{calendar:r,...t})}function p({lastUpdatedAt:t}){const e=new Date(t),r=d({day:"numeric",month:"short",year:"numeric",timeZone:"UTC"}).format(e);return(0,l.jsx)(i.A,{id:"theme.lastUpdated.atDate",description:"The words used to describe on which date a page has been last updated",values:{date:(0,l.jsx)("b",{children:(0,l.jsx)("time",{dateTime:e.toISOString(),itemProp:"dateModified",children:r})})},children:" on {date}"})}function f({lastUpdatedBy:t}){return(0,l.jsx)(i.A,{id:"theme.lastUpdated.byUser",description:"The words used to describe by who the page has been last updated",values:{user:(0,l.jsx)("b",{children:t})},children:" by {user}"})}function g({lastUpdatedAt:t,lastUpdatedBy:e}){return(0,l.jsxs)("span",{className:a.G.common.lastUpdated,children:[(0,l.jsx)(i.A,{id:"theme.lastUpdated.lastUpdatedAtBy",description:"The sentence used to display when a page has been last updated, and by who",values:{atDate:t?(0,l.jsx)(p,{lastUpdatedAt:t}):"",byUser:e?(0,l.jsx)(f,{lastUpdatedBy:e}):""},children:"Last updated{atDate}{byUser}"}),!1]})}const m={lastUpdated:"lastUpdated_UgWq"};function y({className:t,editUrl:e,lastUpdatedAt:r,lastUpdatedBy:i}){return(0,l.jsxs)("div",{className:(0,n.A)("row",t),children:[(0,l.jsx)("div",{className:"col",children:e&&(0,l.jsx)(h,{editUrl:e})}),(0,l.jsx)("div",{className:(0,n.A)("col",m.lastUpdated),children:(r||i)&&(0,l.jsx)(g,{lastUpdatedAt:r,lastUpdatedBy:i})})]})}},75856:(t,e,r)=>{"use strict";r.d(e,{A:()=>D});var n=r(56389),i=r(35745),a=r(16957);const o=function(t,e,r){(void 0!==r&&!(0,a.A)(t[e],r)||void 0===r&&!(e in t))&&(0,i.A)(t,e,r)};var s=r(88749),l=r(14779),c=r(39448),h=r(9554),u=r(77585),d=r(56267),p=r(95526),f=r(33998),g=r(27163),m=r(41863),y=r(49084),x=r(80565),b=r(79728),k=r(97427),C=Function.prototype,w=Object.prototype,_=C.toString,v=w.hasOwnProperty,S=_.call(Object);const A=function(t){if(!(0,k.A)(t)||"[object Object]"!=(0,x.A)(t))return!1;var e=(0,b.A)(t);if(null===e)return!0;var r=v.call(e,"constructor")&&e.constructor;return"function"==typeof r&&r instanceof r&&_.call(r)==S};var T=r(69065);const M=function(t,e){if(("constructor"!==e||"function"!=typeof t[e])&&"__proto__"!=e)return t[e]};var B=r(88168),L=r(96920);const F=function(t){return(0,B.A)(t,(0,L.A)(t))};const $=function(t,e,r,n,i,a,s){var x=M(t,r),b=M(e,r),k=s.get(b);if(k)o(t,r,k);else{var C=a?a(x,b,r+"",t,e,s):void 0,w=void 0===C;if(w){var _=(0,p.A)(b),v=!_&&(0,g.A)(b),S=!_&&!v&&(0,T.A)(b);C=b,_||v||S?(0,p.A)(x)?C=x:(0,f.A)(x)?C=(0,h.A)(x):v?(w=!1,C=(0,l.A)(b,!0)):S?(w=!1,C=(0,c.A)(b,!0)):C=[]:A(b)||(0,d.A)(b)?(C=x,(0,d.A)(x)?C=F(x):(0,y.A)(x)&&!(0,m.A)(x)||(C=(0,u.A)(b))):w=!1}w&&(s.set(b,C),i(C,b,n,a,s),s.delete(b)),o(t,r,C)}};const E=function t(e,r,i,a,l){e!==r&&(0,s.A)(r,function(s,c){if(l||(l=new n.A),(0,y.A)(s))$(e,r,c,i,t,a,l);else{var h=a?a(M(e,c),s,c+"",e,r,l):void 0;void 0===h&&(h=s),o(e,c,h)}},L.A)};const D=(0,r(47848).A)(function(t,e,r){E(t,e,r)})},77585:(t,e,r)=>{"use strict";r.d(e,{A:()=>l});var n=r(49084),i=Object.create;const a=function(){function t(){}return function(e){if(!(0,n.A)(e))return{};if(i)return i(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();var o=r(79728),s=r(39458);const l=function(t){return"function"!=typeof t.constructor||(0,s.A)(t)?{}:a((0,o.A)(t))}},79728:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=(0,r(30150).A)(Object.getPrototypeOf,Object)},80284:(t,e,r)=>{"use strict";r.d(e,{XX:()=>h,q7:()=>u,sO:()=>c});var n=r(61923),i=r(49636),a=r(9420),o=r(97485),s={common:o.Y2,getConfig:o.zj,insertCluster:i.U,insertEdge:n.Jo,insertEdgeLabel:n.jP,insertMarkers:n.g0,insertNode:i.on,interpolateToCurve:a.Ib,labelHelper:i.Zk,log:o.Rm,positionEdgeLabel:n.T_},l={},c=(0,o.K2)(t=>{for(const e of t)l[e.name]=e},"registerLayoutLoaders");(0,o.K2)(()=>{c([{name:"dagre",loader:(0,o.K2)(async()=>await Promise.all([r.e(1874),r.e(4326),r.e(8693)]).then(r.bind(r,98693)),"loader")}])},"registerDefaultLayoutLoaders")();var h=(0,o.K2)(async(t,e)=>{if(!(t.layoutAlgorithm in l))throw new Error(`Unknown layout algorithm: ${t.layoutAlgorithm}`);const r=l[t.layoutAlgorithm];return(await r.loader()).render(t,e,s,{algorithm:r.algorithm})},"render"),u=(0,o.K2)((t="",{fallback:e="dagre"}={})=>{if(t in l)return t;if(e in l)return o.Rm.warn(`Layout algorithm ${t} is not registered. Using ${e} as fallback.`),e;throw new Error(`Both layout algorithms ${t} and ${e} are not registered.`)},"getRegisteredLayoutAlgorithm")},80565:(t,e,r)=>{"use strict";r.d(e,{A:()=>d});var n=r(55842),i=Object.prototype,a=i.hasOwnProperty,o=i.toString,s=n.A?n.A.toStringTag:void 0;const l=function(t){var e=a.call(t,s),r=t[s];try{t[s]=void 0;var n=!0}catch(l){}var i=o.call(t);return n&&(e?t[s]=r:delete t[s]),i};var c=Object.prototype.toString;const h=function(t){return c.call(t)};var u=n.A?n.A.toStringTag:void 0;const d=function(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":u&&u in Object(t)?l(t):h(t)}},81896:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=r(11628);const i=(t,e)=>(0,n.A)(t,"l",-e)},83927:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=r(57454).A.Uint8Array},84738:(t,e,r)=>{"use strict";r.d(e,{A:()=>o});var n=r(39458);const i=(0,r(30150).A)(Object.keys,Object);var a=Object.prototype.hasOwnProperty;const o=function(t){if(!(0,n.A)(t))return i(t);var e=[];for(var r in Object(t))a.call(t,r)&&"constructor"!=r&&e.push(r);return e}},84926:(t,e,r)=>{"use strict";r.d(e,{n:()=>n});var n={name:"mermaid",version:"11.8.1",description:"Markdown-ish syntax for generating flowcharts, mindmaps, sequence diagrams, class diagrams, gantt charts, git graphs and more.",type:"module",module:"./dist/mermaid.core.mjs",types:"./dist/mermaid.d.ts",exports:{".":{types:"./dist/mermaid.d.ts",import:"./dist/mermaid.core.mjs",default:"./dist/mermaid.core.mjs"},"./*":"./*"},keywords:["diagram","markdown","flowchart","sequence diagram","gantt","class diagram","git graph","mindmap","packet diagram","c4 diagram","er diagram","pie chart","pie diagram","quadrant chart","requirement diagram","graph"],scripts:{clean:"rimraf dist",dev:"pnpm -w dev","docs:code":"typedoc src/defaultConfig.ts src/config.ts src/mermaid.ts && prettier --write ./src/docs/config/setup","docs:build":"rimraf ../../docs && pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts","docs:verify":"pnpm docs:code && pnpm docs:spellcheck && tsx scripts/docs.cli.mts --verify","docs:pre:vitepress":"pnpm --filter ./src/docs prefetch && rimraf src/vitepress && pnpm docs:code && tsx scripts/docs.cli.mts --vitepress && pnpm --filter ./src/vitepress install --no-frozen-lockfile --ignore-scripts","docs:build:vitepress":"pnpm docs:pre:vitepress && (cd src/vitepress && pnpm run build) && cpy --flat src/docs/landing/ ./src/vitepress/.vitepress/dist/landing","docs:dev":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:dev:docker":'pnpm docs:pre:vitepress && concurrently "pnpm --filter ./src/vitepress dev:docker" "tsx scripts/docs.cli.mts --watch --vitepress"',"docs:serve":"pnpm docs:build:vitepress && vitepress serve src/vitepress","docs:spellcheck":'cspell "src/docs/**/*.md"',"docs:release-version":"tsx scripts/update-release-version.mts","docs:verify-version":"tsx scripts/update-release-version.mts --verify","types:build-config":"tsx scripts/create-types-from-json-schema.mts","types:verify-config":"tsx scripts/create-types-from-json-schema.mts --verify",checkCircle:"npx madge --circular ./src",prepublishOnly:"pnpm docs:verify-version"},repository:{type:"git",url:"https://github.com/mermaid-js/mermaid"},author:"Knut Sveidqvist",license:"MIT",standard:{ignore:["**/parser/*.js","dist/**/*.js","cypress/**/*.js"],globals:["page"]},dependencies:{"@braintree/sanitize-url":"^7.0.4","@iconify/utils":"^2.1.33","@mermaid-js/parser":"workspace:^","@types/d3":"^7.4.3",cytoscape:"^3.29.3","cytoscape-cose-bilkent":"^4.1.0","cytoscape-fcose":"^2.2.0",d3:"^7.9.0","d3-sankey":"^0.12.3","dagre-d3-es":"7.0.11",dayjs:"^1.11.13",dompurify:"^3.2.5",katex:"^0.16.9",khroma:"^2.1.0","lodash-es":"^4.17.21",marked:"^15.0.7",roughjs:"^4.6.6",stylis:"^4.3.6","ts-dedent":"^2.2.0",uuid:"^11.1.0"},devDependencies:{"@adobe/jsonschema2md":"^8.0.2","@iconify/types":"^2.0.0","@types/cytoscape":"^3.21.9","@types/cytoscape-fcose":"^2.2.4","@types/d3-sankey":"^0.12.4","@types/d3-scale":"^4.0.9","@types/d3-scale-chromatic":"^3.1.0","@types/d3-selection":"^3.0.11","@types/d3-shape":"^3.1.7","@types/jsdom":"^21.1.7","@types/katex":"^0.16.7","@types/lodash-es":"^4.17.12","@types/micromatch":"^4.0.9","@types/stylis":"^4.2.7","@types/uuid":"^10.0.0",ajv:"^8.17.1",chokidar:"3.6.0",concurrently:"^9.1.2","csstree-validator":"^4.0.1",globby:"^14.0.2",jison:"^0.4.18","js-base64":"^3.7.7",jsdom:"^26.0.0","json-schema-to-typescript":"^15.0.4",micromatch:"^4.0.8","path-browserify":"^1.0.1",prettier:"^3.5.2",remark:"^15.0.1","remark-frontmatter":"^5.0.0","remark-gfm":"^4.0.1",rimraf:"^6.0.1","start-server-and-test":"^2.0.10","type-fest":"^4.35.0",typedoc:"^0.27.8","typedoc-plugin-markdown":"^4.4.2",typescript:"~5.7.3","unist-util-flatmap":"^1.0.0","unist-util-visit":"^5.0.0",vitepress:"^1.0.2","vitepress-plugin-search":"1.0.4-alpha.22"},files:["dist/","README.md"],publishConfig:{access:"public"}}},86793:(t,e,r)=>{"use strict";function n(t){for(var e=[],r=1;r<arguments.length;r++)e[r-1]=arguments[r];var n=Array.from("string"==typeof t?[t]:t);n[n.length-1]=n[n.length-1].replace(/\r?\n([\t ]*)$/,"");var i=n.reduce(function(t,e){var r=e.match(/\n([\t ]+|(?!\s).)/g);return r?t.concat(r.map(function(t){var e,r;return null!==(r=null===(e=t.match(/[\t ]/g))||void 0===e?void 0:e.length)&&void 0!==r?r:0})):t},[]);if(i.length){var a=new RegExp("\n[\t ]{"+Math.min.apply(Math,i)+"}","g");n=n.map(function(t){return t.replace(a,"\n")})}n[0]=n[0].replace(/^\r?\n/,"");var o=n[0];return e.forEach(function(t,e){var r=o.match(/(?:^|\n)( *)$/),i=r?r[1]:"",a=t;"string"==typeof t&&t.includes("\n")&&(a=String(t).split("\n").map(function(t,e){return 0===e?t:""+i+t}).join("\n")),o+=a+n[e+1]}),o}r.d(e,{T:()=>n})},86986:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(53443),i=r(57454);const a=(0,n.A)(i.A,"Map")},88168:(t,e,r)=>{"use strict";r.d(e,{A:()=>a});var n=r(63406),i=r(35745);const a=function(t,e,r,a){var o=!r;r||(r={});for(var s=-1,l=e.length;++s<l;){var c=e[s],h=a?a(r[c],t[c],c,r,t):void 0;void 0===h&&(h=t[c]),o?(0,i.A)(r,c,h):(0,n.A)(r,c,h)}return r}},88749:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t){return function(e,r,n){for(var i=-1,a=Object(e),o=n(e),s=o.length;s--;){var l=o[t?s:++i];if(!1===r(a[l],l,a))break}return e}}()},89732:(t,e,r)=>{"use strict";r.d(e,{A:()=>d});const n=function(){this.__data__=[],this.size=0};var i=r(16957);const a=function(t,e){for(var r=t.length;r--;)if((0,i.A)(t[r][0],e))return r;return-1};var o=Array.prototype.splice;const s=function(t){var e=this.__data__,r=a(e,t);return!(r<0)&&(r==e.length-1?e.pop():o.call(e,r,1),--this.size,!0)};const l=function(t){var e=this.__data__,r=a(e,t);return r<0?void 0:e[r][1]};const c=function(t){return a(this.__data__,t)>-1};const h=function(t,e){var r=this.__data__,n=a(r,t);return n<0?(++this.size,r.push([t,e])):r[n][1]=e,this};function u(t){var e=-1,r=null==t?0:t.length;for(this.clear();++e<r;){var n=t[e];this.set(n[0],n[1])}}u.prototype.clear=n,u.prototype.delete=s,u.prototype.get=l,u.prototype.has=c,u.prototype.set=h;const d=u},89790:(t,e,r)=>{"use strict";r.d(e,{H:()=>rr,r:()=>er});var n=r(97485);function i(t){return null==t}function a(t){return"object"==typeof t&&null!==t}function o(t){return Array.isArray(t)?t:i(t)?[]:[t]}function s(t,e){var r,n,i,a;if(e)for(r=0,n=(a=Object.keys(e)).length;r<n;r+=1)t[i=a[r]]=e[i];return t}function l(t,e){var r,n="";for(r=0;r<e;r+=1)n+=t;return n}function c(t){return 0===t&&Number.NEGATIVE_INFINITY===1/t}(0,n.K2)(i,"isNothing"),(0,n.K2)(a,"isObject"),(0,n.K2)(o,"toArray"),(0,n.K2)(s,"extend"),(0,n.K2)(l,"repeat"),(0,n.K2)(c,"isNegativeZero");var h={isNothing:i,isObject:a,toArray:o,repeat:l,isNegativeZero:c,extend:s};function u(t,e){var r="",n=t.reason||"(unknown reason)";return t.mark?(t.mark.name&&(r+='in "'+t.mark.name+'" '),r+="("+(t.mark.line+1)+":"+(t.mark.column+1)+")",!e&&t.mark.snippet&&(r+="\n\n"+t.mark.snippet),n+" "+r):n}function d(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=u(this,!1),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||""}(0,n.K2)(u,"formatError"),(0,n.K2)(d,"YAMLException$1"),d.prototype=Object.create(Error.prototype),d.prototype.constructor=d,d.prototype.toString=(0,n.K2)(function(t){return this.name+": "+u(this,t)},"toString");var p=d;function f(t,e,r,n,i){var a="",o="",s=Math.floor(i/2)-1;return n-e>s&&(e=n-s+(a=" ... ").length),r-n>s&&(r=n+s-(o=" ...").length),{str:a+t.slice(e,r).replace(/\t/g,"\u2192")+o,pos:n-e+a.length}}function g(t,e){return h.repeat(" ",e-t.length)+t}function m(t,e){if(e=Object.create(e||null),!t.buffer)return null;e.maxLength||(e.maxLength=79),"number"!=typeof e.indent&&(e.indent=1),"number"!=typeof e.linesBefore&&(e.linesBefore=3),"number"!=typeof e.linesAfter&&(e.linesAfter=2);for(var r,n=/\r?\n|\r|\0/g,i=[0],a=[],o=-1;r=n.exec(t.buffer);)a.push(r.index),i.push(r.index+r[0].length),t.position<=r.index&&o<0&&(o=i.length-2);o<0&&(o=i.length-1);var s,l,c="",u=Math.min(t.line+e.linesAfter,a.length).toString().length,d=e.maxLength-(e.indent+u+3);for(s=1;s<=e.linesBefore&&!(o-s<0);s++)l=f(t.buffer,i[o-s],a[o-s],t.position-(i[o]-i[o-s]),d),c=h.repeat(" ",e.indent)+g((t.line-s+1).toString(),u)+" | "+l.str+"\n"+c;for(l=f(t.buffer,i[o],a[o],t.position,d),c+=h.repeat(" ",e.indent)+g((t.line+1).toString(),u)+" | "+l.str+"\n",c+=h.repeat("-",e.indent+u+3+l.pos)+"^\n",s=1;s<=e.linesAfter&&!(o+s>=a.length);s++)l=f(t.buffer,i[o+s],a[o+s],t.position-(i[o]-i[o+s]),d),c+=h.repeat(" ",e.indent)+g((t.line+s+1).toString(),u)+" | "+l.str+"\n";return c.replace(/\n$/,"")}(0,n.K2)(f,"getLine"),(0,n.K2)(g,"padStart"),(0,n.K2)(m,"makeSnippet");var y=m,x=["kind","multi","resolve","construct","instanceOf","predicate","represent","representName","defaultStyle","styleAliases"],b=["scalar","sequence","mapping"];function k(t){var e={};return null!==t&&Object.keys(t).forEach(function(r){t[r].forEach(function(t){e[String(t)]=r})}),e}function C(t,e){if(e=e||{},Object.keys(e).forEach(function(e){if(-1===x.indexOf(e))throw new p('Unknown option "'+e+'" is met in definition of "'+t+'" YAML type.')}),this.options=e,this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(t){return t},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.representName=e.representName||null,this.defaultStyle=e.defaultStyle||null,this.multi=e.multi||!1,this.styleAliases=k(e.styleAliases||null),-1===b.indexOf(this.kind))throw new p('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}(0,n.K2)(k,"compileStyleAliases"),(0,n.K2)(C,"Type$1");var w=C;function _(t,e){var r=[];return t[e].forEach(function(t){var e=r.length;r.forEach(function(r,n){r.tag===t.tag&&r.kind===t.kind&&r.multi===t.multi&&(e=n)}),r[e]=t}),r}function v(){var t,e,r={scalar:{},sequence:{},mapping:{},fallback:{},multi:{scalar:[],sequence:[],mapping:[],fallback:[]}};function i(t){t.multi?(r.multi[t.kind].push(t),r.multi.fallback.push(t)):r[t.kind][t.tag]=r.fallback[t.tag]=t}for((0,n.K2)(i,"collectType"),t=0,e=arguments.length;t<e;t+=1)arguments[t].forEach(i);return r}function S(t){return this.extend(t)}(0,n.K2)(_,"compileList"),(0,n.K2)(v,"compileMap"),(0,n.K2)(S,"Schema$1"),S.prototype.extend=(0,n.K2)(function(t){var e=[],r=[];if(t instanceof w)r.push(t);else if(Array.isArray(t))r=r.concat(t);else{if(!t||!Array.isArray(t.implicit)&&!Array.isArray(t.explicit))throw new p("Schema.extend argument should be a Type, [ Type ], or a schema definition ({ implicit: [...], explicit: [...] })");t.implicit&&(e=e.concat(t.implicit)),t.explicit&&(r=r.concat(t.explicit))}e.forEach(function(t){if(!(t instanceof w))throw new p("Specified list of YAML types (or a single Type object) contains a non-Type object.");if(t.loadKind&&"scalar"!==t.loadKind)throw new p("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.");if(t.multi)throw new p("There is a multi type in the implicit list of a schema. Multi tags can only be listed as explicit.")}),r.forEach(function(t){if(!(t instanceof w))throw new p("Specified list of YAML types (or a single Type object) contains a non-Type object.")});var n=Object.create(S.prototype);return n.implicit=(this.implicit||[]).concat(e),n.explicit=(this.explicit||[]).concat(r),n.compiledImplicit=_(n,"implicit"),n.compiledExplicit=_(n,"explicit"),n.compiledTypeMap=v(n.compiledImplicit,n.compiledExplicit),n},"extend");var A=new S({explicit:[new w("tag:yaml.org,2002:str",{kind:"scalar",construct:(0,n.K2)(function(t){return null!==t?t:""},"construct")}),new w("tag:yaml.org,2002:seq",{kind:"sequence",construct:(0,n.K2)(function(t){return null!==t?t:[]},"construct")}),new w("tag:yaml.org,2002:map",{kind:"mapping",construct:(0,n.K2)(function(t){return null!==t?t:{}},"construct")})]});function T(t){if(null===t)return!0;var e=t.length;return 1===e&&"~"===t||4===e&&("null"===t||"Null"===t||"NULL"===t)}function M(){return null}function B(t){return null===t}(0,n.K2)(T,"resolveYamlNull"),(0,n.K2)(M,"constructYamlNull"),(0,n.K2)(B,"isNull");var L=new w("tag:yaml.org,2002:null",{kind:"scalar",resolve:T,construct:M,predicate:B,represent:{canonical:(0,n.K2)(function(){return"~"},"canonical"),lowercase:(0,n.K2)(function(){return"null"},"lowercase"),uppercase:(0,n.K2)(function(){return"NULL"},"uppercase"),camelcase:(0,n.K2)(function(){return"Null"},"camelcase"),empty:(0,n.K2)(function(){return""},"empty")},defaultStyle:"lowercase"});function F(t){if(null===t)return!1;var e=t.length;return 4===e&&("true"===t||"True"===t||"TRUE"===t)||5===e&&("false"===t||"False"===t||"FALSE"===t)}function $(t){return"true"===t||"True"===t||"TRUE"===t}function E(t){return"[object Boolean]"===Object.prototype.toString.call(t)}(0,n.K2)(F,"resolveYamlBoolean"),(0,n.K2)($,"constructYamlBoolean"),(0,n.K2)(E,"isBoolean");var D=new w("tag:yaml.org,2002:bool",{kind:"scalar",resolve:F,construct:$,predicate:E,represent:{lowercase:(0,n.K2)(function(t){return t?"true":"false"},"lowercase"),uppercase:(0,n.K2)(function(t){return t?"TRUE":"FALSE"},"uppercase"),camelcase:(0,n.K2)(function(t){return t?"True":"False"},"camelcase")},defaultStyle:"lowercase"});function N(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function O(t){return 48<=t&&t<=55}function R(t){return 48<=t&&t<=57}function I(t){if(null===t)return!1;var e,r=t.length,n=0,i=!1;if(!r)return!1;if("-"!==(e=t[n])&&"+"!==e||(e=t[++n]),"0"===e){if(n+1===r)return!0;if("b"===(e=t[++n])){for(n++;n<r;n++)if("_"!==(e=t[n])){if("0"!==e&&"1"!==e)return!1;i=!0}return i&&"_"!==e}if("x"===e){for(n++;n<r;n++)if("_"!==(e=t[n])){if(!N(t.charCodeAt(n)))return!1;i=!0}return i&&"_"!==e}if("o"===e){for(n++;n<r;n++)if("_"!==(e=t[n])){if(!O(t.charCodeAt(n)))return!1;i=!0}return i&&"_"!==e}}if("_"===e)return!1;for(;n<r;n++)if("_"!==(e=t[n])){if(!R(t.charCodeAt(n)))return!1;i=!0}return!(!i||"_"===e)}function j(t){var e,r=t,n=1;if(-1!==r.indexOf("_")&&(r=r.replace(/_/g,"")),"-"!==(e=r[0])&&"+"!==e||("-"===e&&(n=-1),e=(r=r.slice(1))[0]),"0"===r)return 0;if("0"===e){if("b"===r[1])return n*parseInt(r.slice(2),2);if("x"===r[1])return n*parseInt(r.slice(2),16);if("o"===r[1])return n*parseInt(r.slice(2),8)}return n*parseInt(r,10)}function z(t){return"[object Number]"===Object.prototype.toString.call(t)&&t%1==0&&!h.isNegativeZero(t)}(0,n.K2)(N,"isHexCode"),(0,n.K2)(O,"isOctCode"),(0,n.K2)(R,"isDecCode"),(0,n.K2)(I,"resolveYamlInteger"),(0,n.K2)(j,"constructYamlInteger"),(0,n.K2)(z,"isInteger");var P=new w("tag:yaml.org,2002:int",{kind:"scalar",resolve:I,construct:j,predicate:z,represent:{binary:(0,n.K2)(function(t){return t>=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},"binary"),octal:(0,n.K2)(function(t){return t>=0?"0o"+t.toString(8):"-0o"+t.toString(8).slice(1)},"octal"),decimal:(0,n.K2)(function(t){return t.toString(10)},"decimal"),hexadecimal:(0,n.K2)(function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)},"hexadecimal")},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}}),K=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function q(t){return null!==t&&!(!K.test(t)||"_"===t[t.length-1])}function W(t){var e,r;return r="-"===(e=t.replace(/_/g,"").toLowerCase())[0]?-1:1,"+-".indexOf(e[0])>=0&&(e=e.slice(1)),".inf"===e?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===e?NaN:r*parseFloat(e,10)}(0,n.K2)(q,"resolveYamlFloat"),(0,n.K2)(W,"constructYamlFloat");var H=/^[-+]?[0-9]+e/;function U(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(h.isNegativeZero(t))return"-0.0";return r=t.toString(10),H.test(r)?r.replace("e",".e"):r}function Y(t){return"[object Number]"===Object.prototype.toString.call(t)&&(t%1!=0||h.isNegativeZero(t))}(0,n.K2)(U,"representYamlFloat"),(0,n.K2)(Y,"isFloat");var G=new w("tag:yaml.org,2002:float",{kind:"scalar",resolve:q,construct:W,predicate:Y,represent:U,defaultStyle:"lowercase"}),X=A.extend({implicit:[L,D,P,G]}),V=X,Z=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Q=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function J(t){return null!==t&&(null!==Z.exec(t)||null!==Q.exec(t))}function tt(t){var e,r,n,i,a,o,s,l,c=0,h=null;if(null===(e=Z.exec(t))&&(e=Q.exec(t)),null===e)throw new Error("Date resolve error");if(r=+e[1],n=+e[2]-1,i=+e[3],!e[4])return new Date(Date.UTC(r,n,i));if(a=+e[4],o=+e[5],s=+e[6],e[7]){for(c=e[7].slice(0,3);c.length<3;)c+="0";c=+c}return e[9]&&(h=6e4*(60*+e[10]+ +(e[11]||0)),"-"===e[9]&&(h=-h)),l=new Date(Date.UTC(r,n,i,a,o,s,c)),h&&l.setTime(l.getTime()-h),l}function et(t){return t.toISOString()}(0,n.K2)(J,"resolveYamlTimestamp"),(0,n.K2)(tt,"constructYamlTimestamp"),(0,n.K2)(et,"representYamlTimestamp");var rt=new w("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:J,construct:tt,instanceOf:Date,represent:et});function nt(t){return"<<"===t||null===t}(0,n.K2)(nt,"resolveYamlMerge");var it=new w("tag:yaml.org,2002:merge",{kind:"scalar",resolve:nt}),at="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";function ot(t){if(null===t)return!1;var e,r,n=0,i=t.length,a=at;for(r=0;r<i;r++)if(!((e=a.indexOf(t.charAt(r)))>64)){if(e<0)return!1;n+=6}return n%8==0}function st(t){var e,r,n=t.replace(/[\r\n=]/g,""),i=n.length,a=at,o=0,s=[];for(e=0;e<i;e++)e%4==0&&e&&(s.push(o>>16&255),s.push(o>>8&255),s.push(255&o)),o=o<<6|a.indexOf(n.charAt(e));return 0===(r=i%4*6)?(s.push(o>>16&255),s.push(o>>8&255),s.push(255&o)):18===r?(s.push(o>>10&255),s.push(o>>2&255)):12===r&&s.push(o>>4&255),new Uint8Array(s)}function lt(t){var e,r,n="",i=0,a=t.length,o=at;for(e=0;e<a;e++)e%3==0&&e&&(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[63&i]),i=(i<<8)+t[e];return 0===(r=a%3)?(n+=o[i>>18&63],n+=o[i>>12&63],n+=o[i>>6&63],n+=o[63&i]):2===r?(n+=o[i>>10&63],n+=o[i>>4&63],n+=o[i<<2&63],n+=o[64]):1===r&&(n+=o[i>>2&63],n+=o[i<<4&63],n+=o[64],n+=o[64]),n}function ct(t){return"[object Uint8Array]"===Object.prototype.toString.call(t)}(0,n.K2)(ot,"resolveYamlBinary"),(0,n.K2)(st,"constructYamlBinary"),(0,n.K2)(lt,"representYamlBinary"),(0,n.K2)(ct,"isBinary");var ht=new w("tag:yaml.org,2002:binary",{kind:"scalar",resolve:ot,construct:st,predicate:ct,represent:lt}),ut=Object.prototype.hasOwnProperty,dt=Object.prototype.toString;function pt(t){if(null===t)return!0;var e,r,n,i,a,o=[],s=t;for(e=0,r=s.length;e<r;e+=1){if(n=s[e],a=!1,"[object Object]"!==dt.call(n))return!1;for(i in n)if(ut.call(n,i)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==o.indexOf(i))return!1;o.push(i)}return!0}function ft(t){return null!==t?t:[]}(0,n.K2)(pt,"resolveYamlOmap"),(0,n.K2)(ft,"constructYamlOmap");var gt=new w("tag:yaml.org,2002:omap",{kind:"sequence",resolve:pt,construct:ft}),mt=Object.prototype.toString;function yt(t){if(null===t)return!0;var e,r,n,i,a,o=t;for(a=new Array(o.length),e=0,r=o.length;e<r;e+=1){if(n=o[e],"[object Object]"!==mt.call(n))return!1;if(1!==(i=Object.keys(n)).length)return!1;a[e]=[i[0],n[i[0]]]}return!0}function xt(t){if(null===t)return[];var e,r,n,i,a,o=t;for(a=new Array(o.length),e=0,r=o.length;e<r;e+=1)n=o[e],i=Object.keys(n),a[e]=[i[0],n[i[0]]];return a}(0,n.K2)(yt,"resolveYamlPairs"),(0,n.K2)(xt,"constructYamlPairs");var bt=new w("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:yt,construct:xt}),kt=Object.prototype.hasOwnProperty;function Ct(t){if(null===t)return!0;var e,r=t;for(e in r)if(kt.call(r,e)&&null!==r[e])return!1;return!0}function wt(t){return null!==t?t:{}}(0,n.K2)(Ct,"resolveYamlSet"),(0,n.K2)(wt,"constructYamlSet");var _t=new w("tag:yaml.org,2002:set",{kind:"mapping",resolve:Ct,construct:wt}),vt=V.extend({implicit:[rt,it],explicit:[ht,gt,bt,_t]}),St=Object.prototype.hasOwnProperty,At=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Tt=/[\x85\u2028\u2029]/,Mt=/[,\[\]\{\}]/,Bt=/^(?:!|!!|![a-z\-]+!)$/i,Lt=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Ft(t){return Object.prototype.toString.call(t)}function $t(t){return 10===t||13===t}function Et(t){return 9===t||32===t}function Dt(t){return 9===t||32===t||10===t||13===t}function Nt(t){return 44===t||91===t||93===t||123===t||125===t}function Ot(t){var e;return 48<=t&&t<=57?t-48:97<=(e=32|t)&&e<=102?e-97+10:-1}function Rt(t){return 120===t?2:117===t?4:85===t?8:0}function It(t){return 48<=t&&t<=57?t-48:-1}function jt(t){return 48===t?"\0":97===t?"\x07":98===t?"\b":116===t||9===t?"\t":110===t?"\n":118===t?"\v":102===t?"\f":114===t?"\r":101===t?"\x1b":32===t?" ":34===t?'"':47===t?"/":92===t?"\\":78===t?"\x85":95===t?"\xa0":76===t?"\u2028":80===t?"\u2029":""}function zt(t){return t<=65535?String.fromCharCode(t):String.fromCharCode(55296+(t-65536>>10),56320+(t-65536&1023))}(0,n.K2)(Ft,"_class"),(0,n.K2)($t,"is_EOL"),(0,n.K2)(Et,"is_WHITE_SPACE"),(0,n.K2)(Dt,"is_WS_OR_EOL"),(0,n.K2)(Nt,"is_FLOW_INDICATOR"),(0,n.K2)(Ot,"fromHexCode"),(0,n.K2)(Rt,"escapedHexLen"),(0,n.K2)(It,"fromDecimalCode"),(0,n.K2)(jt,"simpleEscapeSequence"),(0,n.K2)(zt,"charFromCodepoint");var Pt,Kt=new Array(256),qt=new Array(256);for(Pt=0;Pt<256;Pt++)Kt[Pt]=jt(Pt)?1:0,qt[Pt]=jt(Pt);function Wt(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||vt,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.firstTabInLine=-1,this.documents=[]}function Ht(t,e){var r={name:t.filename,buffer:t.input.slice(0,-1),position:t.position,line:t.line,column:t.position-t.lineStart};return r.snippet=y(r),new p(e,r)}function Ut(t,e){throw Ht(t,e)}function Yt(t,e){t.onWarning&&t.onWarning.call(null,Ht(t,e))}(0,n.K2)(Wt,"State$1"),(0,n.K2)(Ht,"generateError"),(0,n.K2)(Ut,"throwError"),(0,n.K2)(Yt,"throwWarning");var Gt={YAML:(0,n.K2)(function(t,e,r){var n,i,a;null!==t.version&&Ut(t,"duplication of %YAML directive"),1!==r.length&&Ut(t,"YAML directive accepts exactly one argument"),null===(n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]))&&Ut(t,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),a=parseInt(n[2],10),1!==i&&Ut(t,"unacceptable YAML version of the document"),t.version=r[0],t.checkLineBreaks=a<2,1!==a&&2!==a&&Yt(t,"unsupported YAML version of the document")},"handleYamlDirective"),TAG:(0,n.K2)(function(t,e,r){var n,i;2!==r.length&&Ut(t,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],Bt.test(n)||Ut(t,"ill-formed tag handle (first argument) of the TAG directive"),St.call(t.tagMap,n)&&Ut(t,'there is a previously declared suffix for "'+n+'" tag handle'),Lt.test(i)||Ut(t,"ill-formed tag prefix (second argument) of the TAG directive");try{i=decodeURIComponent(i)}catch(a){Ut(t,"tag prefix is malformed: "+i)}t.tagMap[n]=i},"handleTagDirective")};function Xt(t,e,r,n){var i,a,o,s;if(e<r){if(s=t.input.slice(e,r),n)for(i=0,a=s.length;i<a;i+=1)9===(o=s.charCodeAt(i))||32<=o&&o<=1114111||Ut(t,"expected valid JSON character");else At.test(s)&&Ut(t,"the stream contains non-printable characters");t.result+=s}}function Vt(t,e,r,n){var i,a,o,s;for(h.isObject(r)||Ut(t,"cannot merge mappings; the provided source object is unacceptable"),o=0,s=(i=Object.keys(r)).length;o<s;o+=1)a=i[o],St.call(e,a)||(e[a]=r[a],n[a]=!0)}function Zt(t,e,r,n,i,a,o,s,l){var c,h;if(Array.isArray(i))for(c=0,h=(i=Array.prototype.slice.call(i)).length;c<h;c+=1)Array.isArray(i[c])&&Ut(t,"nested arrays are not supported inside keys"),"object"==typeof i&&"[object Object]"===Ft(i[c])&&(i[c]="[object Object]");if("object"==typeof i&&"[object Object]"===Ft(i)&&(i="[object Object]"),i=String(i),null===e&&(e={}),"tag:yaml.org,2002:merge"===n)if(Array.isArray(a))for(c=0,h=a.length;c<h;c+=1)Vt(t,e,a[c],r);else Vt(t,e,a,r);else t.json||St.call(r,i)||!St.call(e,i)||(t.line=o||t.line,t.lineStart=s||t.lineStart,t.position=l||t.position,Ut(t,"duplicated mapping key")),"__proto__"===i?Object.defineProperty(e,i,{configurable:!0,enumerable:!0,writable:!0,value:a}):e[i]=a,delete r[i];return e}function Qt(t){var e;10===(e=t.input.charCodeAt(t.position))?t.position++:13===e?(t.position++,10===t.input.charCodeAt(t.position)&&t.position++):Ut(t,"a line break is expected"),t.line+=1,t.lineStart=t.position,t.firstTabInLine=-1}function Jt(t,e,r){for(var n=0,i=t.input.charCodeAt(t.position);0!==i;){for(;Et(i);)9===i&&-1===t.firstTabInLine&&(t.firstTabInLine=t.position),i=t.input.charCodeAt(++t.position);if(e&&35===i)do{i=t.input.charCodeAt(++t.position)}while(10!==i&&13!==i&&0!==i);if(!$t(i))break;for(Qt(t),i=t.input.charCodeAt(t.position),n++,t.lineIndent=0;32===i;)t.lineIndent++,i=t.input.charCodeAt(++t.position)}return-1!==r&&0!==n&&t.lineIndent<r&&Yt(t,"deficient indentation"),n}function te(t){var e,r=t.position;return!(45!==(e=t.input.charCodeAt(r))&&46!==e||e!==t.input.charCodeAt(r+1)||e!==t.input.charCodeAt(r+2)||(r+=3,0!==(e=t.input.charCodeAt(r))&&!Dt(e)))}function ee(t,e){1===e?t.result+=" ":e>1&&(t.result+=h.repeat("\n",e-1))}function re(t,e,r){var n,i,a,o,s,l,c,h,u=t.kind,d=t.result;if(Dt(h=t.input.charCodeAt(t.position))||Nt(h)||35===h||38===h||42===h||33===h||124===h||62===h||39===h||34===h||37===h||64===h||96===h)return!1;if((63===h||45===h)&&(Dt(n=t.input.charCodeAt(t.position+1))||r&&Nt(n)))return!1;for(t.kind="scalar",t.result="",i=a=t.position,o=!1;0!==h;){if(58===h){if(Dt(n=t.input.charCodeAt(t.position+1))||r&&Nt(n))break}else if(35===h){if(Dt(t.input.charCodeAt(t.position-1)))break}else{if(t.position===t.lineStart&&te(t)||r&&Nt(h))break;if($t(h)){if(s=t.line,l=t.lineStart,c=t.lineIndent,Jt(t,!1,-1),t.lineIndent>=e){o=!0,h=t.input.charCodeAt(t.position);continue}t.position=a,t.line=s,t.lineStart=l,t.lineIndent=c;break}}o&&(Xt(t,i,a,!1),ee(t,t.line-s),i=a=t.position,o=!1),Et(h)||(a=t.position+1),h=t.input.charCodeAt(++t.position)}return Xt(t,i,a,!1),!!t.result||(t.kind=u,t.result=d,!1)}function ne(t,e){var r,n,i;if(39!==(r=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,n=i=t.position;0!==(r=t.input.charCodeAt(t.position));)if(39===r){if(Xt(t,n,t.position,!0),39!==(r=t.input.charCodeAt(++t.position)))return!0;n=t.position,t.position++,i=t.position}else $t(r)?(Xt(t,n,i,!0),ee(t,Jt(t,!1,e)),n=i=t.position):t.position===t.lineStart&&te(t)?Ut(t,"unexpected end of the document within a single quoted scalar"):(t.position++,i=t.position);Ut(t,"unexpected end of the stream within a single quoted scalar")}function ie(t,e){var r,n,i,a,o,s;if(34!==(s=t.input.charCodeAt(t.position)))return!1;for(t.kind="scalar",t.result="",t.position++,r=n=t.position;0!==(s=t.input.charCodeAt(t.position));){if(34===s)return Xt(t,r,t.position,!0),t.position++,!0;if(92===s){if(Xt(t,r,t.position,!0),$t(s=t.input.charCodeAt(++t.position)))Jt(t,!1,e);else if(s<256&&Kt[s])t.result+=qt[s],t.position++;else if((o=Rt(s))>0){for(i=o,a=0;i>0;i--)(o=Ot(s=t.input.charCodeAt(++t.position)))>=0?a=(a<<4)+o:Ut(t,"expected hexadecimal character");t.result+=zt(a),t.position++}else Ut(t,"unknown escape sequence");r=n=t.position}else $t(s)?(Xt(t,r,n,!0),ee(t,Jt(t,!1,e)),r=n=t.position):t.position===t.lineStart&&te(t)?Ut(t,"unexpected end of the document within a double quoted scalar"):(t.position++,n=t.position)}Ut(t,"unexpected end of the stream within a double quoted scalar")}function ae(t,e){var r,n,i,a,o,s,l,c,h,u,d,p,f=!0,g=t.tag,m=t.anchor,y=Object.create(null);if(91===(p=t.input.charCodeAt(t.position)))o=93,c=!1,a=[];else{if(123!==p)return!1;o=125,c=!0,a={}}for(null!==t.anchor&&(t.anchorMap[t.anchor]=a),p=t.input.charCodeAt(++t.position);0!==p;){if(Jt(t,!0,e),(p=t.input.charCodeAt(t.position))===o)return t.position++,t.tag=g,t.anchor=m,t.kind=c?"mapping":"sequence",t.result=a,!0;f?44===p&&Ut(t,"expected the node content, but found ','"):Ut(t,"missed comma between flow collection entries"),d=null,s=l=!1,63===p&&Dt(t.input.charCodeAt(t.position+1))&&(s=l=!0,t.position++,Jt(t,!0,e)),r=t.line,n=t.lineStart,i=t.position,de(t,e,1,!1,!0),u=t.tag,h=t.result,Jt(t,!0,e),p=t.input.charCodeAt(t.position),!l&&t.line!==r||58!==p||(s=!0,p=t.input.charCodeAt(++t.position),Jt(t,!0,e),de(t,e,1,!1,!0),d=t.result),c?Zt(t,a,y,u,h,d,r,n,i):s?a.push(Zt(t,null,y,u,h,d,r,n,i)):a.push(h),Jt(t,!0,e),44===(p=t.input.charCodeAt(t.position))?(f=!0,p=t.input.charCodeAt(++t.position)):f=!1}Ut(t,"unexpected end of the stream within a flow collection")}function oe(t,e){var r,n,i,a,o=1,s=!1,l=!1,c=e,u=0,d=!1;if(124===(a=t.input.charCodeAt(t.position)))n=!1;else{if(62!==a)return!1;n=!0}for(t.kind="scalar",t.result="";0!==a;)if(43===(a=t.input.charCodeAt(++t.position))||45===a)1===o?o=43===a?3:2:Ut(t,"repeat of a chomping mode identifier");else{if(!((i=It(a))>=0))break;0===i?Ut(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):l?Ut(t,"repeat of an indentation width identifier"):(c=e+i-1,l=!0)}if(Et(a)){do{a=t.input.charCodeAt(++t.position)}while(Et(a));if(35===a)do{a=t.input.charCodeAt(++t.position)}while(!$t(a)&&0!==a)}for(;0!==a;){for(Qt(t),t.lineIndent=0,a=t.input.charCodeAt(t.position);(!l||t.lineIndent<c)&&32===a;)t.lineIndent++,a=t.input.charCodeAt(++t.position);if(!l&&t.lineIndent>c&&(c=t.lineIndent),$t(a))u++;else{if(t.lineIndent<c){3===o?t.result+=h.repeat("\n",s?1+u:u):1===o&&s&&(t.result+="\n");break}for(n?Et(a)?(d=!0,t.result+=h.repeat("\n",s?1+u:u)):d?(d=!1,t.result+=h.repeat("\n",u+1)):0===u?s&&(t.result+=" "):t.result+=h.repeat("\n",u):t.result+=h.repeat("\n",s?1+u:u),s=!0,l=!0,u=0,r=t.position;!$t(a)&&0!==a;)a=t.input.charCodeAt(++t.position);Xt(t,r,t.position,!1)}}return!0}function se(t,e){var r,n,i=t.tag,a=t.anchor,o=[],s=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=o),n=t.input.charCodeAt(t.position);0!==n&&(-1!==t.firstTabInLine&&(t.position=t.firstTabInLine,Ut(t,"tab characters must not be used in indentation")),45===n)&&Dt(t.input.charCodeAt(t.position+1));)if(s=!0,t.position++,Jt(t,!0,-1)&&t.lineIndent<=e)o.push(null),n=t.input.charCodeAt(t.position);else if(r=t.line,de(t,e,3,!1,!0),o.push(t.result),Jt(t,!0,-1),n=t.input.charCodeAt(t.position),(t.line===r||t.lineIndent>e)&&0!==n)Ut(t,"bad indentation of a sequence entry");else if(t.lineIndent<e)break;return!!s&&(t.tag=i,t.anchor=a,t.kind="sequence",t.result=o,!0)}function le(t,e,r){var n,i,a,o,s,l,c,h=t.tag,u=t.anchor,d={},p=Object.create(null),f=null,g=null,m=null,y=!1,x=!1;if(-1!==t.firstTabInLine)return!1;for(null!==t.anchor&&(t.anchorMap[t.anchor]=d),c=t.input.charCodeAt(t.position);0!==c;){if(y||-1===t.firstTabInLine||(t.position=t.firstTabInLine,Ut(t,"tab characters must not be used in indentation")),n=t.input.charCodeAt(t.position+1),a=t.line,63!==c&&58!==c||!Dt(n)){if(o=t.line,s=t.lineStart,l=t.position,!de(t,r,2,!1,!0))break;if(t.line===a){for(c=t.input.charCodeAt(t.position);Et(c);)c=t.input.charCodeAt(++t.position);if(58===c)Dt(c=t.input.charCodeAt(++t.position))||Ut(t,"a whitespace character is expected after the key-value separator within a block mapping"),y&&(Zt(t,d,p,f,g,null,o,s,l),f=g=m=null),x=!0,y=!1,i=!1,f=t.tag,g=t.result;else{if(!x)return t.tag=h,t.anchor=u,!0;Ut(t,"can not read an implicit mapping pair; a colon is missed")}}else{if(!x)return t.tag=h,t.anchor=u,!0;Ut(t,"can not read a block mapping entry; a multiline key may not be an implicit key")}}else 63===c?(y&&(Zt(t,d,p,f,g,null,o,s,l),f=g=m=null),x=!0,y=!0,i=!0):y?(y=!1,i=!0):Ut(t,"incomplete explicit mapping pair; a key node is missed; or followed by a non-tabulated empty line"),t.position+=1,c=n;if((t.line===a||t.lineIndent>e)&&(y&&(o=t.line,s=t.lineStart,l=t.position),de(t,e,4,!0,i)&&(y?g=t.result:m=t.result),y||(Zt(t,d,p,f,g,m,o,s,l),f=g=m=null),Jt(t,!0,-1),c=t.input.charCodeAt(t.position)),(t.line===a||t.lineIndent>e)&&0!==c)Ut(t,"bad indentation of a mapping entry");else if(t.lineIndent<e)break}return y&&Zt(t,d,p,f,g,null,o,s,l),x&&(t.tag=h,t.anchor=u,t.kind="mapping",t.result=d),x}function ce(t){var e,r,n,i,a=!1,o=!1;if(33!==(i=t.input.charCodeAt(t.position)))return!1;if(null!==t.tag&&Ut(t,"duplication of a tag property"),60===(i=t.input.charCodeAt(++t.position))?(a=!0,i=t.input.charCodeAt(++t.position)):33===i?(o=!0,r="!!",i=t.input.charCodeAt(++t.position)):r="!",e=t.position,a){do{i=t.input.charCodeAt(++t.position)}while(0!==i&&62!==i);t.position<t.length?(n=t.input.slice(e,t.position),i=t.input.charCodeAt(++t.position)):Ut(t,"unexpected end of the stream within a verbatim tag")}else{for(;0!==i&&!Dt(i);)33===i&&(o?Ut(t,"tag suffix cannot contain exclamation marks"):(r=t.input.slice(e-1,t.position+1),Bt.test(r)||Ut(t,"named tag handle cannot contain such characters"),o=!0,e=t.position+1)),i=t.input.charCodeAt(++t.position);n=t.input.slice(e,t.position),Mt.test(n)&&Ut(t,"tag suffix cannot contain flow indicator characters")}n&&!Lt.test(n)&&Ut(t,"tag name cannot contain such characters: "+n);try{n=decodeURIComponent(n)}catch(s){Ut(t,"tag name is malformed: "+n)}return a?t.tag=n:St.call(t.tagMap,r)?t.tag=t.tagMap[r]+n:"!"===r?t.tag="!"+n:"!!"===r?t.tag="tag:yaml.org,2002:"+n:Ut(t,'undeclared tag handle "'+r+'"'),!0}function he(t){var e,r;if(38!==(r=t.input.charCodeAt(t.position)))return!1;for(null!==t.anchor&&Ut(t,"duplication of an anchor property"),r=t.input.charCodeAt(++t.position),e=t.position;0!==r&&!Dt(r)&&!Nt(r);)r=t.input.charCodeAt(++t.position);return t.position===e&&Ut(t,"name of an anchor node must contain at least one character"),t.anchor=t.input.slice(e,t.position),!0}function ue(t){var e,r,n;if(42!==(n=t.input.charCodeAt(t.position)))return!1;for(n=t.input.charCodeAt(++t.position),e=t.position;0!==n&&!Dt(n)&&!Nt(n);)n=t.input.charCodeAt(++t.position);return t.position===e&&Ut(t,"name of an alias node must contain at least one character"),r=t.input.slice(e,t.position),St.call(t.anchorMap,r)||Ut(t,'unidentified alias "'+r+'"'),t.result=t.anchorMap[r],Jt(t,!0,-1),!0}function de(t,e,r,n,i){var a,o,s,l,c,h,u,d,p,f=1,g=!1,m=!1;if(null!==t.listener&&t.listener("open",t),t.tag=null,t.anchor=null,t.kind=null,t.result=null,a=o=s=4===r||3===r,n&&Jt(t,!0,-1)&&(g=!0,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)),1===f)for(;ce(t)||he(t);)Jt(t,!0,-1)?(g=!0,s=a,t.lineIndent>e?f=1:t.lineIndent===e?f=0:t.lineIndent<e&&(f=-1)):s=!1;if(s&&(s=g||i),1!==f&&4!==r||(d=1===r||2===r?e:e+1,p=t.position-t.lineStart,1===f?s&&(se(t,p)||le(t,p,d))||ae(t,d)?m=!0:(o&&oe(t,d)||ne(t,d)||ie(t,d)?m=!0:ue(t)?(m=!0,null===t.tag&&null===t.anchor||Ut(t,"alias node should not have any properties")):re(t,d,1===r)&&(m=!0,null===t.tag&&(t.tag="?")),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):0===f&&(m=s&&se(t,p))),null===t.tag)null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);else if("?"===t.tag){for(null!==t.result&&"scalar"!==t.kind&&Ut(t,'unacceptable node kind for !<?> tag; it should be "scalar", not "'+t.kind+'"'),l=0,c=t.implicitTypes.length;l<c;l+=1)if((u=t.implicitTypes[l]).resolve(t.result)){t.result=u.construct(t.result),t.tag=u.tag,null!==t.anchor&&(t.anchorMap[t.anchor]=t.result);break}}else if("!"!==t.tag){if(St.call(t.typeMap[t.kind||"fallback"],t.tag))u=t.typeMap[t.kind||"fallback"][t.tag];else for(u=null,l=0,c=(h=t.typeMap.multi[t.kind||"fallback"]).length;l<c;l+=1)if(t.tag.slice(0,h[l].tag.length)===h[l].tag){u=h[l];break}u||Ut(t,"unknown tag !<"+t.tag+">"),null!==t.result&&u.kind!==t.kind&&Ut(t,"unacceptable node kind for !<"+t.tag+'> tag; it should be "'+u.kind+'", not "'+t.kind+'"'),u.resolve(t.result,t.tag)?(t.result=u.construct(t.result,t.tag),null!==t.anchor&&(t.anchorMap[t.anchor]=t.result)):Ut(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")}return null!==t.listener&&t.listener("close",t),null!==t.tag||null!==t.anchor||m}function pe(t){var e,r,n,i,a=t.position,o=!1;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap=Object.create(null),t.anchorMap=Object.create(null);0!==(i=t.input.charCodeAt(t.position))&&(Jt(t,!0,-1),i=t.input.charCodeAt(t.position),!(t.lineIndent>0||37!==i));){for(o=!0,i=t.input.charCodeAt(++t.position),e=t.position;0!==i&&!Dt(i);)i=t.input.charCodeAt(++t.position);for(n=[],(r=t.input.slice(e,t.position)).length<1&&Ut(t,"directive name must not be less than one character in length");0!==i;){for(;Et(i);)i=t.input.charCodeAt(++t.position);if(35===i){do{i=t.input.charCodeAt(++t.position)}while(0!==i&&!$t(i));break}if($t(i))break;for(e=t.position;0!==i&&!Dt(i);)i=t.input.charCodeAt(++t.position);n.push(t.input.slice(e,t.position))}0!==i&&Qt(t),St.call(Gt,r)?Gt[r](t,r,n):Yt(t,'unknown document directive "'+r+'"')}Jt(t,!0,-1),0===t.lineIndent&&45===t.input.charCodeAt(t.position)&&45===t.input.charCodeAt(t.position+1)&&45===t.input.charCodeAt(t.position+2)?(t.position+=3,Jt(t,!0,-1)):o&&Ut(t,"directives end mark is expected"),de(t,t.lineIndent-1,4,!1,!0),Jt(t,!0,-1),t.checkLineBreaks&&Tt.test(t.input.slice(a,t.position))&&Yt(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&te(t)?46===t.input.charCodeAt(t.position)&&(t.position+=3,Jt(t,!0,-1)):t.position<t.length-1&&Ut(t,"end of the stream or a document separator is expected")}function fe(t,e){e=e||{},0!==(t=String(t)).length&&(10!==t.charCodeAt(t.length-1)&&13!==t.charCodeAt(t.length-1)&&(t+="\n"),65279===t.charCodeAt(0)&&(t=t.slice(1)));var r=new Wt(t,e),n=t.indexOf("\0");for(-1!==n&&(r.position=n,Ut(r,"null byte is not allowed in input")),r.input+="\0";32===r.input.charCodeAt(r.position);)r.lineIndent+=1,r.position+=1;for(;r.position<r.length-1;)pe(r);return r.documents}function ge(t,e,r){null!==e&&"object"==typeof e&&void 0===r&&(r=e,e=null);var n=fe(t,r);if("function"!=typeof e)return n;for(var i=0,a=n.length;i<a;i+=1)e(n[i])}function me(t,e){var r=fe(t,e);if(0!==r.length){if(1===r.length)return r[0];throw new p("expected a single document in the stream, but found more")}}(0,n.K2)(Xt,"captureSegment"),(0,n.K2)(Vt,"mergeMappings"),(0,n.K2)(Zt,"storeMappingPair"),(0,n.K2)(Qt,"readLineBreak"),(0,n.K2)(Jt,"skipSeparationSpace"),(0,n.K2)(te,"testDocumentSeparator"),(0,n.K2)(ee,"writeFoldedLines"),(0,n.K2)(re,"readPlainScalar"),(0,n.K2)(ne,"readSingleQuotedScalar"),(0,n.K2)(ie,"readDoubleQuotedScalar"),(0,n.K2)(ae,"readFlowCollection"),(0,n.K2)(oe,"readBlockScalar"),(0,n.K2)(se,"readBlockSequence"),(0,n.K2)(le,"readBlockMapping"),(0,n.K2)(ce,"readTagProperty"),(0,n.K2)(he,"readAnchorProperty"),(0,n.K2)(ue,"readAlias"),(0,n.K2)(de,"composeNode"),(0,n.K2)(pe,"readDocument"),(0,n.K2)(fe,"loadDocuments"),(0,n.K2)(ge,"loadAll$1"),(0,n.K2)(me,"load$1");var ye={loadAll:ge,load:me},xe=Object.prototype.toString,be=Object.prototype.hasOwnProperty,ke=65279,Ce={0:"\\0",7:"\\a",8:"\\b",9:"\\t",10:"\\n",11:"\\v",12:"\\f",13:"\\r",27:"\\e",34:'\\"',92:"\\\\",133:"\\N",160:"\\_",8232:"\\L",8233:"\\P"},we=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"],_e=/^[-+]?[0-9_]+(?::[0-9_]+)+(?:\.[0-9_]*)?$/;function ve(t,e){var r,n,i,a,o,s,l;if(null===e)return{};for(r={},i=0,a=(n=Object.keys(e)).length;i<a;i+=1)o=n[i],s=String(e[o]),"!!"===o.slice(0,2)&&(o="tag:yaml.org,2002:"+o.slice(2)),(l=t.compiledTypeMap.fallback[o])&&be.call(l.styleAliases,s)&&(s=l.styleAliases[s]),r[o]=s;return r}function Se(t){var e,r,n;if(e=t.toString(16).toUpperCase(),t<=255)r="x",n=2;else if(t<=65535)r="u",n=4;else{if(!(t<=4294967295))throw new p("code point within a string may not be greater than 0xFFFFFFFF");r="U",n=8}return"\\"+r+h.repeat("0",n-e.length)+e}(0,n.K2)(ve,"compileStyleMap"),(0,n.K2)(Se,"encodeHex");function Ae(t){this.schema=t.schema||vt,this.indent=Math.max(1,t.indent||2),this.noArrayIndent=t.noArrayIndent||!1,this.skipInvalid=t.skipInvalid||!1,this.flowLevel=h.isNothing(t.flowLevel)?-1:t.flowLevel,this.styleMap=ve(this.schema,t.styles||null),this.sortKeys=t.sortKeys||!1,this.lineWidth=t.lineWidth||80,this.noRefs=t.noRefs||!1,this.noCompatMode=t.noCompatMode||!1,this.condenseFlow=t.condenseFlow||!1,this.quotingType='"'===t.quotingType?2:1,this.forceQuotes=t.forceQuotes||!1,this.replacer="function"==typeof t.replacer?t.replacer:null,this.implicitTypes=this.schema.compiledImplicit,this.explicitTypes=this.schema.compiledExplicit,this.tag=null,this.result="",this.duplicates=[],this.usedDuplicates=null}function Te(t,e){for(var r,n=h.repeat(" ",e),i=0,a=-1,o="",s=t.length;i<s;)-1===(a=t.indexOf("\n",i))?(r=t.slice(i),i=s):(r=t.slice(i,a+1),i=a+1),r.length&&"\n"!==r&&(o+=n),o+=r;return o}function Me(t,e){return"\n"+h.repeat(" ",t.indent*e)}function Be(t,e){var r,n;for(r=0,n=t.implicitTypes.length;r<n;r+=1)if(t.implicitTypes[r].resolve(e))return!0;return!1}function Le(t){return 32===t||9===t}function Fe(t){return 32<=t&&t<=126||161<=t&&t<=55295&&8232!==t&&8233!==t||57344<=t&&t<=65533&&t!==ke||65536<=t&&t<=1114111}function $e(t){return Fe(t)&&t!==ke&&13!==t&&10!==t}function Ee(t,e,r){var n=$e(t),i=n&&!Le(t);return(r?n:n&&44!==t&&91!==t&&93!==t&&123!==t&&125!==t)&&35!==t&&!(58===e&&!i)||$e(e)&&!Le(e)&&35===t||58===e&&i}function De(t){return Fe(t)&&t!==ke&&!Le(t)&&45!==t&&63!==t&&58!==t&&44!==t&&91!==t&&93!==t&&123!==t&&125!==t&&35!==t&&38!==t&&42!==t&&33!==t&&124!==t&&61!==t&&62!==t&&39!==t&&34!==t&&37!==t&&64!==t&&96!==t}function Ne(t){return!Le(t)&&58!==t}function Oe(t,e){var r,n=t.charCodeAt(e);return n>=55296&&n<=56319&&e+1<t.length&&(r=t.charCodeAt(e+1))>=56320&&r<=57343?1024*(n-55296)+r-56320+65536:n}function Re(t){return/^\n* /.test(t)}(0,n.K2)(Ae,"State"),(0,n.K2)(Te,"indentString"),(0,n.K2)(Me,"generateNextLine"),(0,n.K2)(Be,"testImplicitResolving"),(0,n.K2)(Le,"isWhitespace"),(0,n.K2)(Fe,"isPrintable"),(0,n.K2)($e,"isNsCharOrWhitespace"),(0,n.K2)(Ee,"isPlainSafe"),(0,n.K2)(De,"isPlainSafeFirst"),(0,n.K2)(Ne,"isPlainSafeLast"),(0,n.K2)(Oe,"codePointAt"),(0,n.K2)(Re,"needIndentIndicator");function Ie(t,e,r,n,i,a,o,s){var l,c=0,h=null,u=!1,d=!1,p=-1!==n,f=-1,g=De(Oe(t,0))&&Ne(Oe(t,t.length-1));if(e||o)for(l=0;l<t.length;c>=65536?l+=2:l++){if(!Fe(c=Oe(t,l)))return 5;g=g&&Ee(c,h,s),h=c}else{for(l=0;l<t.length;c>=65536?l+=2:l++){if(10===(c=Oe(t,l)))u=!0,p&&(d=d||l-f-1>n&&" "!==t[f+1],f=l);else if(!Fe(c))return 5;g=g&&Ee(c,h,s),h=c}d=d||p&&l-f-1>n&&" "!==t[f+1]}return u||d?r>9&&Re(t)?5:o?2===a?5:2:d?4:3:!g||o||i(t)?2===a?5:2:1}function je(t,e,r,i,a){t.dump=function(){if(0===e.length)return 2===t.quotingType?'""':"''";if(!t.noCompatMode&&(-1!==we.indexOf(e)||_e.test(e)))return 2===t.quotingType?'"'+e+'"':"'"+e+"'";var o=t.indent*Math.max(1,r),s=-1===t.lineWidth?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-o),l=i||t.flowLevel>-1&&r>=t.flowLevel;function c(e){return Be(t,e)}switch((0,n.K2)(c,"testAmbiguity"),Ie(e,l,t.indent,s,c,t.quotingType,t.forceQuotes&&!i,a)){case 1:return e;case 2:return"'"+e.replace(/'/g,"''")+"'";case 3:return"|"+ze(e,t.indent)+Pe(Te(e,o));case 4:return">"+ze(e,t.indent)+Pe(Te(Ke(e,s),o));case 5:return'"'+We(e)+'"';default:throw new p("impossible error: invalid scalar style")}}()}function ze(t,e){var r=Re(t)?String(e):"",n="\n"===t[t.length-1];return r+(n&&("\n"===t[t.length-2]||"\n"===t)?"+":n?"":"-")+"\n"}function Pe(t){return"\n"===t[t.length-1]?t.slice(0,-1):t}function Ke(t,e){for(var r,n,i,a=/(\n+)([^\n]*)/g,o=(r=-1!==(r=t.indexOf("\n"))?r:t.length,a.lastIndex=r,qe(t.slice(0,r),e)),s="\n"===t[0]||" "===t[0];i=a.exec(t);){var l=i[1],c=i[2];n=" "===c[0],o+=l+(s||n||""===c?"":"\n")+qe(c,e),s=n}return o}function qe(t,e){if(""===t||" "===t[0])return t;for(var r,n,i=/ [^ ]/g,a=0,o=0,s=0,l="";r=i.exec(t);)(s=r.index)-a>e&&(n=o>a?o:s,l+="\n"+t.slice(a,n),a=n+1),o=s;return l+="\n",t.length-a>e&&o>a?l+=t.slice(a,o)+"\n"+t.slice(o+1):l+=t.slice(a),l.slice(1)}function We(t){for(var e,r="",n=0,i=0;i<t.length;n>=65536?i+=2:i++)n=Oe(t,i),!(e=Ce[n])&&Fe(n)?(r+=t[i],n>=65536&&(r+=t[i+1])):r+=e||Se(n);return r}function He(t,e,r){var n,i,a,o="",s=t.tag;for(n=0,i=r.length;n<i;n+=1)a=r[n],t.replacer&&(a=t.replacer.call(r,String(n),a)),(Ve(t,e,a,!1,!1)||void 0===a&&Ve(t,e,null,!1,!1))&&(""!==o&&(o+=","+(t.condenseFlow?"":" ")),o+=t.dump);t.tag=s,t.dump="["+o+"]"}function Ue(t,e,r,n){var i,a,o,s="",l=t.tag;for(i=0,a=r.length;i<a;i+=1)o=r[i],t.replacer&&(o=t.replacer.call(r,String(i),o)),(Ve(t,e+1,o,!0,!0,!1,!0)||void 0===o&&Ve(t,e+1,null,!0,!0,!1,!0))&&(n&&""===s||(s+=Me(t,e)),t.dump&&10===t.dump.charCodeAt(0)?s+="-":s+="- ",s+=t.dump);t.tag=l,t.dump=s||"[]"}function Ye(t,e,r){var n,i,a,o,s,l="",c=t.tag,h=Object.keys(r);for(n=0,i=h.length;n<i;n+=1)s="",""!==l&&(s+=", "),t.condenseFlow&&(s+='"'),o=r[a=h[n]],t.replacer&&(o=t.replacer.call(r,a,o)),Ve(t,e,a,!1,!1)&&(t.dump.length>1024&&(s+="? "),s+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),Ve(t,e,o,!1,!1)&&(l+=s+=t.dump));t.tag=c,t.dump="{"+l+"}"}function Ge(t,e,r,n){var i,a,o,s,l,c,h="",u=t.tag,d=Object.keys(r);if(!0===t.sortKeys)d.sort();else if("function"==typeof t.sortKeys)d.sort(t.sortKeys);else if(t.sortKeys)throw new p("sortKeys must be a boolean or a function");for(i=0,a=d.length;i<a;i+=1)c="",n&&""===h||(c+=Me(t,e)),s=r[o=d[i]],t.replacer&&(s=t.replacer.call(r,o,s)),Ve(t,e+1,o,!0,!0,!0)&&((l=null!==t.tag&&"?"!==t.tag||t.dump&&t.dump.length>1024)&&(t.dump&&10===t.dump.charCodeAt(0)?c+="?":c+="? "),c+=t.dump,l&&(c+=Me(t,e)),Ve(t,e+1,s,!0,l)&&(t.dump&&10===t.dump.charCodeAt(0)?c+=":":c+=": ",h+=c+=t.dump));t.tag=u,t.dump=h||"{}"}function Xe(t,e,r){var n,i,a,o,s,l;for(a=0,o=(i=r?t.explicitTypes:t.implicitTypes).length;a<o;a+=1)if(((s=i[a]).instanceOf||s.predicate)&&(!s.instanceOf||"object"==typeof e&&e instanceof s.instanceOf)&&(!s.predicate||s.predicate(e))){if(r?s.multi&&s.representName?t.tag=s.representName(e):t.tag=s.tag:t.tag="?",s.represent){if(l=t.styleMap[s.tag]||s.defaultStyle,"[object Function]"===xe.call(s.represent))n=s.represent(e,l);else{if(!be.call(s.represent,l))throw new p("!<"+s.tag+'> tag resolver accepts not "'+l+'" style');n=s.represent[l](e,l)}t.dump=n}return!0}return!1}function Ve(t,e,r,n,i,a,o){t.tag=null,t.dump=r,Xe(t,r,!1)||Xe(t,r,!0);var s,l=xe.call(t.dump),c=n;n&&(n=t.flowLevel<0||t.flowLevel>e);var h,u,d="[object Object]"===l||"[object Array]"===l;if(d&&(u=-1!==(h=t.duplicates.indexOf(r))),(null!==t.tag&&"?"!==t.tag||u||2!==t.indent&&e>0)&&(i=!1),u&&t.usedDuplicates[h])t.dump="*ref_"+h;else{if(d&&u&&!t.usedDuplicates[h]&&(t.usedDuplicates[h]=!0),"[object Object]"===l)n&&0!==Object.keys(t.dump).length?(Ge(t,e,t.dump,i),u&&(t.dump="&ref_"+h+t.dump)):(Ye(t,e,t.dump),u&&(t.dump="&ref_"+h+" "+t.dump));else if("[object Array]"===l)n&&0!==t.dump.length?(t.noArrayIndent&&!o&&e>0?Ue(t,e-1,t.dump,i):Ue(t,e,t.dump,i),u&&(t.dump="&ref_"+h+t.dump)):(He(t,e,t.dump),u&&(t.dump="&ref_"+h+" "+t.dump));else{if("[object String]"!==l){if("[object Undefined]"===l)return!1;if(t.skipInvalid)return!1;throw new p("unacceptable kind of an object to dump "+l)}"?"!==t.tag&&je(t,t.dump,e,a,c)}null!==t.tag&&"?"!==t.tag&&(s=encodeURI("!"===t.tag[0]?t.tag.slice(1):t.tag).replace(/!/g,"%21"),s="!"===t.tag[0]?"!"+s:"tag:yaml.org,2002:"===s.slice(0,18)?"!!"+s.slice(18):"!<"+s+">",t.dump=s+" "+t.dump)}return!0}function Ze(t,e){var r,n,i=[],a=[];for(Qe(t,i,a),r=0,n=a.length;r<n;r+=1)e.duplicates.push(i[a[r]]);e.usedDuplicates=new Array(n)}function Qe(t,e,r){var n,i,a;if(null!==t&&"object"==typeof t)if(-1!==(i=e.indexOf(t)))-1===r.indexOf(i)&&r.push(i);else if(e.push(t),Array.isArray(t))for(i=0,a=t.length;i<a;i+=1)Qe(t[i],e,r);else for(i=0,a=(n=Object.keys(t)).length;i<a;i+=1)Qe(t[n[i]],e,r)}function Je(t,e){var r=new Ae(e=e||{});r.noRefs||Ze(t,r);var n=t;return r.replacer&&(n=r.replacer.call({"":n},"",n)),Ve(r,0,n,!0,!0)?r.dump+"\n":""}(0,n.K2)(Ie,"chooseScalarStyle"),(0,n.K2)(je,"writeScalar"),(0,n.K2)(ze,"blockHeader"),(0,n.K2)(Pe,"dropEndingNewline"),(0,n.K2)(Ke,"foldString"),(0,n.K2)(qe,"foldLine"),(0,n.K2)(We,"escapeString"),(0,n.K2)(He,"writeFlowSequence"),(0,n.K2)(Ue,"writeBlockSequence"),(0,n.K2)(Ye,"writeFlowMapping"),(0,n.K2)(Ge,"writeBlockMapping"),(0,n.K2)(Xe,"detectType"),(0,n.K2)(Ve,"writeNode"),(0,n.K2)(Ze,"getDuplicateReferences"),(0,n.K2)(Qe,"inspectNode"),(0,n.K2)(Je,"dump$1");function tr(t,e){return function(){throw new Error("Function yaml."+t+" is removed in js-yaml 4. Use yaml."+e+" instead, which is now safe by default.")}}(0,n.K2)(tr,"renamed");var er=X,rr=ye.load;tr("safeLoad","load"),tr("safeLoadAll","loadAll"),tr("safeDump","dump")},90372:(t,e,r)=>{"use strict";r.d(e,{A:()=>i});var n=r(53443);const i=function(){try{var t=(0,n.A)(Object,"defineProperty");return t({},"",{}),t}catch(e){}}()},90570:(t,e,r)=>{"use strict";r.d(e,{A:()=>d});var n=r(84738),i=r(44254),a=r(56267),o=r(95526),s=r(42849),l=r(27163),c=r(39458),h=r(69065),u=Object.prototype.hasOwnProperty;const d=function(t){if(null==t)return!0;if((0,s.A)(t)&&((0,o.A)(t)||"string"==typeof t||"function"==typeof t.splice||(0,l.A)(t)||(0,h.A)(t)||(0,a.A)(t)))return!t.length;var e=(0,i.A)(t);if("[object Map]"==e||"[object Set]"==e)return!t.size;if((0,c.A)(t))return!(0,n.A)(t).length;for(var r in t)if(u.call(t,r))return!1;return!0}},95526:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=Array.isArray},96920:(t,e,r)=>{"use strict";r.d(e,{A:()=>h});var n=r(66916),i=r(49084),a=r(39458);const o=function(t){var e=[];if(null!=t)for(var r in Object(t))e.push(r);return e};var s=Object.prototype.hasOwnProperty;const l=function(t){if(!(0,i.A)(t))return o(t);var e=(0,a.A)(t),r=[];for(var n in t)("constructor"!=n||!e&&s.call(t,n))&&r.push(n);return r};var c=r(42849);const h=function(t){return(0,c.A)(t)?(0,n.A)(t,!0):l(t)}},97427:(t,e,r)=>{"use strict";r.d(e,{A:()=>n});const n=function(t){return null!=t&&"object"==typeof t}},97485:(t,e,r)=>{"use strict";r.d(e,{C0:()=>S,VA:()=>y,K2:()=>m,xA:()=>ut,hH:()=>$,Dl:()=>zt,IU:()=>re,Wt:()=>Zt,Y2:()=>Kt,a$:()=>Ht,sb:()=>J,ME:()=>pe,UI:()=>V,Ch:()=>T,mW:()=>A,DB:()=>_,_3:()=>Lt,EJ:()=>w,m7:()=>oe,iN:()=>ie,zj:()=>ct,D7:()=>ue,Gs:()=>be,J$:()=>L,ab:()=>le,Q2:()=>st,P$:()=>P,ID:()=>Bt,Wi:()=>jt,H1:()=>yt,Rm:()=>b,QO:()=>Et,Js:()=>xe,Xd:()=>M,VJ:()=>Pt,cL:()=>dt,$i:()=>Z,jZ:()=>_t,oB:()=>fe,wZ:()=>at,EI:()=>ae,SV:()=>ne,Nk:()=>lt,XV:()=>de,ke:()=>se,He:()=>k,UU:()=>it,ot:()=>Ut,mj:()=>ge,tM:()=>Vt,H$:()=>H,B6:()=>ot});var n=r(56287),i=r(55385),a=r(21763);const o=(t,e)=>{const r=i.A.parse(t),n={};for(const i in e)e[i]&&(n[i]=r[i]+e[i]);return(0,a.A)(t,n)};var s=r(30941);const l=(t,e,r=50)=>{const{r:n,g:a,b:o,a:l}=i.A.parse(t),{r:c,g:h,b:u,a:d}=i.A.parse(e),p=r/100,f=2*p-1,g=l-d,m=((f*g===-1?f:(f+g)/(1+f*g))+1)/2,y=1-m,x=n*m+c*y,b=a*m+h*y,k=o*m+u*y,C=l*p+d*(1-p);return(0,s.A)(x,b,k,C)},c=(t,e=100)=>{const r=i.A.parse(t);return r.r=255-r.r,r.g=255-r.g,r.b=255-r.b,l(r,t,e)};var h,u=r(81896),d=r(58480),p=r(13212),f=r(28404),g=Object.defineProperty,m=(t,e)=>g(t,"name",{value:e,configurable:!0}),y=(t,e)=>{for(var r in e)g(t,r,{get:e[r],enumerable:!0})},x={trace:0,debug:1,info:2,warn:3,error:4,fatal:5},b={trace:m((...t)=>{},"trace"),debug:m((...t)=>{},"debug"),info:m((...t)=>{},"info"),warn:m((...t)=>{},"warn"),error:m((...t)=>{},"error"),fatal:m((...t)=>{},"fatal")},k=m(function(t="fatal"){let e=x.fatal;"string"==typeof t?t.toLowerCase()in x&&(e=x[t]):"number"==typeof t&&(e=t),b.trace=()=>{},b.debug=()=>{},b.info=()=>{},b.warn=()=>{},b.error=()=>{},b.fatal=()=>{},e<=x.fatal&&(b.fatal=console.error?console.error.bind(console,C("FATAL"),"color: orange"):console.log.bind(console,"\x1b[35m",C("FATAL"))),e<=x.error&&(b.error=console.error?console.error.bind(console,C("ERROR"),"color: orange"):console.log.bind(console,"\x1b[31m",C("ERROR"))),e<=x.warn&&(b.warn=console.warn?console.warn.bind(console,C("WARN"),"color: orange"):console.log.bind(console,"\x1b[33m",C("WARN"))),e<=x.info&&(b.info=console.info?console.info.bind(console,C("INFO"),"color: lightblue"):console.log.bind(console,"\x1b[34m",C("INFO"))),e<=x.debug&&(b.debug=console.debug?console.debug.bind(console,C("DEBUG"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",C("DEBUG"))),e<=x.trace&&(b.trace=console.debug?console.debug.bind(console,C("TRACE"),"color: lightgreen"):console.log.bind(console,"\x1b[32m",C("TRACE")))},"setLogLevel"),C=m(t=>`%c${n().format("ss.SSS")} : ${t} : `,"format"),w=/^-{3}\s*[\n\r](.*?)[\n\r]-{3}\s*[\n\r]+/s,_=/%{2}{\s*(?:(\w+)\s*:|(\w+))\s*(?:(\w+)|((?:(?!}%{2}).|\r?\n)*))?\s*(?:}%{2})?/gi,v=/\s*%%.*\n/gm,S=class extends Error{static{m(this,"UnknownDiagramError")}constructor(t){super(t),this.name="UnknownDiagramError"}},A={},T=m(function(t,e){t=t.replace(w,"").replace(_,"").replace(v,"\n");for(const[r,{detector:n}]of Object.entries(A)){if(n(t,e))return r}throw new S(`No diagram type detected matching given configuration for text: ${t}`)},"detectType"),M=m((...t)=>{for(const{id:e,detector:r,loader:n}of t)B(e,r,n)},"registerLazyLoadedDiagrams"),B=m((t,e,r)=>{A[t]&&b.warn(`Detector with key ${t} already exists. Overwriting.`),A[t]={detector:e,loader:r},b.debug(`Detector with key ${t} added${r?" with loader":""}`)},"addDetector"),L=m(t=>A[t].loader,"getDiagramLoader"),F=m((t,e,{depth:r=2,clobber:n=!1}={})=>{const i={depth:r,clobber:n};return Array.isArray(e)&&!Array.isArray(t)?(e.forEach(e=>F(t,e,i)),t):Array.isArray(e)&&Array.isArray(t)?(e.forEach(e=>{t.includes(e)||t.push(e)}),t):void 0===t||r<=0?null!=t&&"object"==typeof t&&"object"==typeof e?Object.assign(t,e):e:(void 0!==e&&"object"==typeof t&&"object"==typeof e&&Object.keys(e).forEach(i=>{"object"!=typeof e[i]||void 0!==t[i]&&"object"!=typeof t[i]?(n||"object"!=typeof t[i]&&"object"!=typeof e[i])&&(t[i]=e[i]):(void 0===t[i]&&(t[i]=Array.isArray(e[i])?[]:{}),t[i]=F(t[i],e[i],{depth:r-1,clobber:n}))}),t)},"assignWithDepth"),$=F,E="#ffffff",D="#f2f2f2",N=m((t,e)=>o(t,e?{s:-40,l:10}:{s:-40,l:-10}),"mkBorder"),O=class{static{m(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#fff4dd",this.noteBkgColor="#fff5ad",this.noteTextColor="#333",this.THEME_COLOR_LIMIT=12,this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px"}updateColors(){if(this.primaryTextColor=this.primaryTextColor||(this.darkMode?"#eee":"#333"),this.secondaryColor=this.secondaryColor||o(this.primaryColor,{h:-120}),this.tertiaryColor=this.tertiaryColor||o(this.primaryColor,{h:180,l:5}),this.primaryBorderColor=this.primaryBorderColor||N(this.primaryColor,this.darkMode),this.secondaryBorderColor=this.secondaryBorderColor||N(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=this.tertiaryBorderColor||N(this.tertiaryColor,this.darkMode),this.noteBorderColor=this.noteBorderColor||N(this.noteBkgColor,this.darkMode),this.noteBkgColor=this.noteBkgColor||"#fff5ad",this.noteTextColor=this.noteTextColor||"#333",this.secondaryTextColor=this.secondaryTextColor||c(this.secondaryColor),this.tertiaryTextColor=this.tertiaryTextColor||c(this.tertiaryColor),this.lineColor=this.lineColor||c(this.background),this.arrowheadColor=this.arrowheadColor||c(this.background),this.textColor=this.textColor||this.primaryTextColor,this.border2=this.border2||this.tertiaryBorderColor,this.nodeBkg=this.nodeBkg||this.primaryColor,this.mainBkg=this.mainBkg||this.primaryColor,this.nodeBorder=this.nodeBorder||this.primaryBorderColor,this.clusterBkg=this.clusterBkg||this.tertiaryColor,this.clusterBorder=this.clusterBorder||this.tertiaryBorderColor,this.defaultLinkColor=this.defaultLinkColor||this.lineColor,this.titleColor=this.titleColor||this.tertiaryTextColor,this.edgeLabelBackground=this.edgeLabelBackground||(this.darkMode?(0,u.A)(this.secondaryColor,30):this.secondaryColor),this.nodeTextColor=this.nodeTextColor||this.primaryTextColor,this.actorBorder=this.actorBorder||this.primaryBorderColor,this.actorBkg=this.actorBkg||this.mainBkg,this.actorTextColor=this.actorTextColor||this.primaryTextColor,this.actorLineColor=this.actorLineColor||this.actorBorder,this.labelBoxBkgColor=this.labelBoxBkgColor||this.actorBkg,this.signalColor=this.signalColor||this.textColor,this.signalTextColor=this.signalTextColor||this.textColor,this.labelBoxBorderColor=this.labelBoxBorderColor||this.actorBorder,this.labelTextColor=this.labelTextColor||this.actorTextColor,this.loopTextColor=this.loopTextColor||this.actorTextColor,this.activationBorderColor=this.activationBorderColor||(0,u.A)(this.secondaryColor,10),this.activationBkgColor=this.activationBkgColor||this.secondaryColor,this.sequenceNumberColor=this.sequenceNumberColor||c(this.lineColor),this.sectionBkgColor=this.sectionBkgColor||this.tertiaryColor,this.altSectionBkgColor=this.altSectionBkgColor||"white",this.sectionBkgColor=this.sectionBkgColor||this.secondaryColor,this.sectionBkgColor2=this.sectionBkgColor2||this.primaryColor,this.excludeBkgColor=this.excludeBkgColor||"#eeeeee",this.taskBorderColor=this.taskBorderColor||this.primaryBorderColor,this.taskBkgColor=this.taskBkgColor||this.primaryColor,this.activeTaskBorderColor=this.activeTaskBorderColor||this.primaryColor,this.activeTaskBkgColor=this.activeTaskBkgColor||(0,d.A)(this.primaryColor,23),this.gridColor=this.gridColor||"lightgrey",this.doneTaskBkgColor=this.doneTaskBkgColor||"lightgrey",this.doneTaskBorderColor=this.doneTaskBorderColor||"grey",this.critBorderColor=this.critBorderColor||"#ff8888",this.critBkgColor=this.critBkgColor||"red",this.todayLineColor=this.todayLineColor||"red",this.vertLineColor=this.vertLineColor||"navy",this.taskTextColor=this.taskTextColor||this.textColor,this.taskTextOutsideColor=this.taskTextOutsideColor||this.textColor,this.taskTextLightColor=this.taskTextLightColor||this.textColor,this.taskTextColor=this.taskTextColor||this.primaryTextColor,this.taskTextDarkColor=this.taskTextDarkColor||this.textColor,this.taskTextClickableColor=this.taskTextClickableColor||"#003163",this.personBorder=this.personBorder||this.primaryBorderColor,this.personBkg=this.personBkg||this.mainBkg,this.darkMode?(this.rowOdd=this.rowOdd||(0,u.A)(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||(0,u.A)(this.mainBkg,10)):(this.rowOdd=this.rowOdd||(0,d.A)(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||(0,d.A)(this.mainBkg,5)),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||this.tertiaryColor,this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.specialStateColor=this.lineColor,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210,l:150}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.darkMode)for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScale"+e]=(0,u.A)(this["cScale"+e],75);else for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScale"+e]=(0,u.A)(this["cScale"+e],25);for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScaleInv"+e]=this["cScaleInv"+e]||c(this["cScale"+e]);for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this.darkMode?this["cScalePeer"+e]=this["cScalePeer"+e]||(0,d.A)(this["cScale"+e],10):this["cScalePeer"+e]=this["cScalePeer"+e]||(0,u.A)(this["cScale"+e],10);this.scaleLabelColor=this.scaleLabelColor||this.labelTextColor;for(let e=0;e<this.THEME_COLOR_LIMIT;e++)this["cScaleLabel"+e]=this["cScaleLabel"+e]||this.scaleLabelColor;const t=this.darkMode?-4:-1;for(let e=0;e<5;e++)this["surface"+e]=this["surface"+e]||o(this.mainBkg,{h:180,s:-15,l:t*(5+3*e)}),this["surfacePeer"+e]=this["surfacePeer"+e]||o(this.mainBkg,{h:180,s:-15,l:t*(8+3*e)});this.classText=this.classText||this.textColor,this.fillType0=this.fillType0||this.primaryColor,this.fillType1=this.fillType1||this.secondaryColor,this.fillType2=this.fillType2||o(this.primaryColor,{h:64}),this.fillType3=this.fillType3||o(this.secondaryColor,{h:64}),this.fillType4=this.fillType4||o(this.primaryColor,{h:-64}),this.fillType5=this.fillType5||o(this.secondaryColor,{h:-64}),this.fillType6=this.fillType6||o(this.primaryColor,{h:128}),this.fillType7=this.fillType7||o(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||o(this.primaryColor,{l:-10}),this.pie5=this.pie5||o(this.secondaryColor,{l:-10}),this.pie6=this.pie6||o(this.tertiaryColor,{l:-10}),this.pie7=this.pie7||o(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||o(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||o(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||o(this.primaryColor,{h:60,l:-20}),this.pie11=this.pie11||o(this.primaryColor,{h:-60,l:-20}),this.pie12=this.pie12||o(this.primaryColor,{h:120,l:-10}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOuterStrokeWidth=this.pieOuterStrokeWidth||"2px",this.pieOuterStrokeColor=this.pieOuterStrokeColor||"black",this.pieOpacity=this.pieOpacity||"0.7",this.radar={axisColor:this.radar?.axisColor||this.lineColor,axisStrokeWidth:this.radar?.axisStrokeWidth||2,axisLabelFontSize:this.radar?.axisLabelFontSize||12,curveOpacity:this.radar?.curveOpacity||.5,curveStrokeWidth:this.radar?.curveStrokeWidth||2,graticuleColor:this.radar?.graticuleColor||"#DEDEDE",graticuleStrokeWidth:this.radar?.graticuleStrokeWidth||1,graticuleOpacity:this.radar?.graticuleOpacity||.3,legendBoxSize:this.radar?.legendBoxSize||12,legendFontSize:this.radar?.legendFontSize||12},this.archEdgeColor=this.archEdgeColor||"#777",this.archEdgeArrowColor=this.archEdgeArrowColor||"#777",this.archEdgeWidth=this.archEdgeWidth||"3",this.archGroupBorderColor=this.archGroupBorderColor||"#000",this.archGroupBorderWidth=this.archGroupBorderWidth||"2px",this.quadrant1Fill=this.quadrant1Fill||this.primaryColor,this.quadrant2Fill=this.quadrant2Fill||o(this.primaryColor,{r:5,g:5,b:5}),this.quadrant3Fill=this.quadrant3Fill||o(this.primaryColor,{r:10,g:10,b:10}),this.quadrant4Fill=this.quadrant4Fill||o(this.primaryColor,{r:15,g:15,b:15}),this.quadrant1TextFill=this.quadrant1TextFill||this.primaryTextColor,this.quadrant2TextFill=this.quadrant2TextFill||o(this.primaryTextColor,{r:-5,g:-5,b:-5}),this.quadrant3TextFill=this.quadrant3TextFill||o(this.primaryTextColor,{r:-10,g:-10,b:-10}),this.quadrant4TextFill=this.quadrant4TextFill||o(this.primaryTextColor,{r:-15,g:-15,b:-15}),this.quadrantPointFill=this.quadrantPointFill||(0,p.A)(this.quadrant1Fill)?(0,d.A)(this.quadrant1Fill):(0,u.A)(this.quadrant1Fill),this.quadrantPointTextFill=this.quadrantPointTextFill||this.primaryTextColor,this.quadrantXAxisTextFill=this.quadrantXAxisTextFill||this.primaryTextColor,this.quadrantYAxisTextFill=this.quadrantYAxisTextFill||this.primaryTextColor,this.quadrantInternalBorderStrokeFill=this.quadrantInternalBorderStrokeFill||this.primaryBorderColor,this.quadrantExternalBorderStrokeFill=this.quadrantExternalBorderStrokeFill||this.primaryBorderColor,this.quadrantTitleFill=this.quadrantTitleFill||this.primaryTextColor,this.xyChart={backgroundColor:this.xyChart?.backgroundColor||this.background,titleColor:this.xyChart?.titleColor||this.primaryTextColor,xAxisTitleColor:this.xyChart?.xAxisTitleColor||this.primaryTextColor,xAxisLabelColor:this.xyChart?.xAxisLabelColor||this.primaryTextColor,xAxisTickColor:this.xyChart?.xAxisTickColor||this.primaryTextColor,xAxisLineColor:this.xyChart?.xAxisLineColor||this.primaryTextColor,yAxisTitleColor:this.xyChart?.yAxisTitleColor||this.primaryTextColor,yAxisLabelColor:this.xyChart?.yAxisLabelColor||this.primaryTextColor,yAxisTickColor:this.xyChart?.yAxisTickColor||this.primaryTextColor,yAxisLineColor:this.xyChart?.yAxisLineColor||this.primaryTextColor,plotColorPalette:this.xyChart?.plotColorPalette||"#FFF4DD,#FFD8B1,#FFA07A,#ECEFF1,#D6DBDF,#C3E0A8,#FFB6A4,#FFD74D,#738FA7,#FFFFF0"},this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||"1",this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?(0,u.A)(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||o(this.primaryColor,{h:-30}),this.git4=this.git4||o(this.primaryColor,{h:-60}),this.git5=this.git5||o(this.primaryColor,{h:-90}),this.git6=this.git6||o(this.primaryColor,{h:60}),this.git7=this.git7||o(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,d.A)(this.git0,25),this.git1=(0,d.A)(this.git1,25),this.git2=(0,d.A)(this.git2,25),this.git3=(0,d.A)(this.git3,25),this.git4=(0,d.A)(this.git4,25),this.git5=(0,d.A)(this.git5,25),this.git6=(0,d.A)(this.git6,25),this.git7=(0,d.A)(this.git7,25)):(this.git0=(0,u.A)(this.git0,25),this.git1=(0,u.A)(this.git1,25),this.git2=(0,u.A)(this.git2,25),this.git3=(0,u.A)(this.git3,25),this.git4=(0,u.A)(this.git4,25),this.git5=(0,u.A)(this.git5,25),this.git6=(0,u.A)(this.git6,25),this.git7=(0,u.A)(this.git7,25)),this.gitInv0=this.gitInv0||c(this.git0),this.gitInv1=this.gitInv1||c(this.git1),this.gitInv2=this.gitInv2||c(this.git2),this.gitInv3=this.gitInv3||c(this.git3),this.gitInv4=this.gitInv4||c(this.git4),this.gitInv5=this.gitInv5||c(this.git5),this.gitInv6=this.gitInv6||c(this.git6),this.gitInv7=this.gitInv7||c(this.git7),this.branchLabelColor=this.branchLabelColor||(this.darkMode?"black":this.labelTextColor),this.gitBranchLabel0=this.gitBranchLabel0||this.branchLabelColor,this.gitBranchLabel1=this.gitBranchLabel1||this.branchLabelColor,this.gitBranchLabel2=this.gitBranchLabel2||this.branchLabelColor,this.gitBranchLabel3=this.gitBranchLabel3||this.branchLabelColor,this.gitBranchLabel4=this.gitBranchLabel4||this.branchLabelColor,this.gitBranchLabel5=this.gitBranchLabel5||this.branchLabelColor,this.gitBranchLabel6=this.gitBranchLabel6||this.branchLabelColor,this.gitBranchLabel7=this.gitBranchLabel7||this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||E,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||D}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach(e=>{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]})}},R=m(t=>{const e=new O;return e.calculate(t),e},"getThemeVariables"),I=class{static{m(this,"Theme")}constructor(){this.background="#333",this.primaryColor="#1f2020",this.secondaryColor=(0,d.A)(this.primaryColor,16),this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=c(this.background),this.secondaryBorderColor=N(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=N(this.tertiaryColor,this.darkMode),this.primaryTextColor=c(this.primaryColor),this.secondaryTextColor=c(this.secondaryColor),this.tertiaryTextColor=c(this.tertiaryColor),this.lineColor=c(this.background),this.textColor=c(this.background),this.mainBkg="#1f2020",this.secondBkg="calculated",this.mainContrastColor="lightgrey",this.darkTextColor=(0,d.A)(c("#323D47"),10),this.lineColor="calculated",this.border1="#ccc",this.border2=(0,s.A)(255,255,255,.25),this.arrowheadColor="calculated",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="#181818",this.textColor="#ccc",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#F9FFFE",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="calculated",this.activationBkgColor="calculated",this.sequenceNumberColor="black",this.sectionBkgColor=(0,u.A)("#EAE8D9",30),this.altSectionBkgColor="calculated",this.sectionBkgColor2="#EAE8D9",this.excludeBkgColor=(0,u.A)(this.sectionBkgColor,10),this.taskBorderColor=(0,s.A)(255,255,255,70),this.taskBkgColor="calculated",this.taskTextColor="calculated",this.taskTextLightColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor=(0,s.A)(255,255,255,50),this.activeTaskBkgColor="#81B1DB",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="grey",this.critBorderColor="#E83737",this.critBkgColor="#E83737",this.taskTextDarkColor="calculated",this.todayLineColor="#DB5757",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||(0,d.A)(this.mainBkg,5)||"#ffffff",this.rowEven=this.rowEven||(0,u.A)(this.mainBkg,10),this.labelColor="calculated",this.errorBkgColor="#a44141",this.errorTextColor="#ddd"}updateColors(){this.secondBkg=(0,d.A)(this.mainBkg,16),this.lineColor=this.mainContrastColor,this.arrowheadColor=this.mainContrastColor,this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.edgeLabelBackground=(0,d.A)(this.labelBackground,25),this.actorBorder=this.border1,this.actorBkg=this.mainBkg,this.actorTextColor=this.mainContrastColor,this.actorLineColor=this.actorBorder,this.signalColor=this.mainContrastColor,this.signalTextColor=this.mainContrastColor,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.mainContrastColor,this.loopTextColor=this.mainContrastColor,this.noteBorderColor=this.secondaryBorderColor,this.noteBkgColor=this.secondBkg,this.noteTextColor=this.secondaryTextColor,this.activationBorderColor=this.border1,this.activationBkgColor=this.secondBkg,this.altSectionBkgColor=this.background,this.taskBkgColor=(0,d.A)(this.mainBkg,23),this.taskTextColor=this.darkTextColor,this.taskTextLightColor=this.mainContrastColor,this.taskTextOutsideColor=this.taskTextLightColor,this.gridColor=this.mainContrastColor,this.doneTaskBkgColor=this.mainContrastColor,this.taskTextDarkColor=this.darkTextColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#555",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#f4f4f4",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=o(this.primaryColor,{h:64}),this.fillType3=o(this.secondaryColor,{h:64}),this.fillType4=o(this.primaryColor,{h:-64}),this.fillType5=o(this.secondaryColor,{h:-64}),this.fillType6=o(this.primaryColor,{h:128}),this.fillType7=o(this.secondaryColor,{h:128}),this.cScale1=this.cScale1||"#0b0000",this.cScale2=this.cScale2||"#4d1037",this.cScale3=this.cScale3||"#3f5258",this.cScale4=this.cScale4||"#4f2f1b",this.cScale5=this.cScale5||"#6e0a0a",this.cScale6=this.cScale6||"#3b0048",this.cScale7=this.cScale7||"#995a01",this.cScale8=this.cScale8||"#154706",this.cScale9=this.cScale9||"#161722",this.cScale10=this.cScale10||"#00296f",this.cScale11=this.cScale11||"#01629c",this.cScale12=this.cScale12||"#010029",this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||c(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScalePeer"+t]=this["cScalePeer"+t]||(0,d.A)(this["cScale"+t],10);for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||o(this.mainBkg,{h:30,s:-30,l:-(4*t-10)}),this["surfacePeer"+t]=this["surfacePeer"+t]||o(this.mainBkg,{h:30,s:-30,l:-(4*t-7)});this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOuterStrokeWidth=this.pieOuterStrokeWidth||"2px",this.pieOuterStrokeColor=this.pieOuterStrokeColor||"black",this.pieOpacity=this.pieOpacity||"0.7",this.quadrant1Fill=this.quadrant1Fill||this.primaryColor,this.quadrant2Fill=this.quadrant2Fill||o(this.primaryColor,{r:5,g:5,b:5}),this.quadrant3Fill=this.quadrant3Fill||o(this.primaryColor,{r:10,g:10,b:10}),this.quadrant4Fill=this.quadrant4Fill||o(this.primaryColor,{r:15,g:15,b:15}),this.quadrant1TextFill=this.quadrant1TextFill||this.primaryTextColor,this.quadrant2TextFill=this.quadrant2TextFill||o(this.primaryTextColor,{r:-5,g:-5,b:-5}),this.quadrant3TextFill=this.quadrant3TextFill||o(this.primaryTextColor,{r:-10,g:-10,b:-10}),this.quadrant4TextFill=this.quadrant4TextFill||o(this.primaryTextColor,{r:-15,g:-15,b:-15}),this.quadrantPointFill=this.quadrantPointFill||(0,p.A)(this.quadrant1Fill)?(0,d.A)(this.quadrant1Fill):(0,u.A)(this.quadrant1Fill),this.quadrantPointTextFill=this.quadrantPointTextFill||this.primaryTextColor,this.quadrantXAxisTextFill=this.quadrantXAxisTextFill||this.primaryTextColor,this.quadrantYAxisTextFill=this.quadrantYAxisTextFill||this.primaryTextColor,this.quadrantInternalBorderStrokeFill=this.quadrantInternalBorderStrokeFill||this.primaryBorderColor,this.quadrantExternalBorderStrokeFill=this.quadrantExternalBorderStrokeFill||this.primaryBorderColor,this.quadrantTitleFill=this.quadrantTitleFill||this.primaryTextColor,this.xyChart={backgroundColor:this.xyChart?.backgroundColor||this.background,titleColor:this.xyChart?.titleColor||this.primaryTextColor,xAxisTitleColor:this.xyChart?.xAxisTitleColor||this.primaryTextColor,xAxisLabelColor:this.xyChart?.xAxisLabelColor||this.primaryTextColor,xAxisTickColor:this.xyChart?.xAxisTickColor||this.primaryTextColor,xAxisLineColor:this.xyChart?.xAxisLineColor||this.primaryTextColor,yAxisTitleColor:this.xyChart?.yAxisTitleColor||this.primaryTextColor,yAxisLabelColor:this.xyChart?.yAxisLabelColor||this.primaryTextColor,yAxisTickColor:this.xyChart?.yAxisTickColor||this.primaryTextColor,yAxisLineColor:this.xyChart?.yAxisLineColor||this.primaryTextColor,plotColorPalette:this.xyChart?.plotColorPalette||"#3498db,#2ecc71,#e74c3c,#f1c40f,#bdc3c7,#ffffff,#34495e,#9b59b6,#1abc9c,#e67e22"},this.packet={startByteColor:this.primaryTextColor,endByteColor:this.primaryTextColor,labelColor:this.primaryTextColor,titleColor:this.primaryTextColor,blockStrokeColor:this.primaryTextColor,blockFillColor:this.background},this.radar={axisColor:this.radar?.axisColor||this.lineColor,axisStrokeWidth:this.radar?.axisStrokeWidth||2,axisLabelFontSize:this.radar?.axisLabelFontSize||12,curveOpacity:this.radar?.curveOpacity||.5,curveStrokeWidth:this.radar?.curveStrokeWidth||2,graticuleColor:this.radar?.graticuleColor||"#DEDEDE",graticuleStrokeWidth:this.radar?.graticuleStrokeWidth||1,graticuleOpacity:this.radar?.graticuleOpacity||.3,legendBoxSize:this.radar?.legendBoxSize||12,legendFontSize:this.radar?.legendFontSize||12},this.classText=this.primaryTextColor,this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||"1",this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||(this.darkMode?(0,u.A)(this.secondaryColor,30):this.secondaryColor),this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=(0,d.A)(this.secondaryColor,20),this.git1=(0,d.A)(this.pie2||this.secondaryColor,20),this.git2=(0,d.A)(this.pie3||this.tertiaryColor,20),this.git3=(0,d.A)(this.pie4||o(this.primaryColor,{h:-30}),20),this.git4=(0,d.A)(this.pie5||o(this.primaryColor,{h:-60}),20),this.git5=(0,d.A)(this.pie6||o(this.primaryColor,{h:-90}),10),this.git6=(0,d.A)(this.pie7||o(this.primaryColor,{h:60}),10),this.git7=(0,d.A)(this.pie8||o(this.primaryColor,{h:120}),20),this.gitInv0=this.gitInv0||c(this.git0),this.gitInv1=this.gitInv1||c(this.git1),this.gitInv2=this.gitInv2||c(this.git2),this.gitInv3=this.gitInv3||c(this.git3),this.gitInv4=this.gitInv4||c(this.git4),this.gitInv5=this.gitInv5||c(this.git5),this.gitInv6=this.gitInv6||c(this.git6),this.gitInv7=this.gitInv7||c(this.git7),this.gitBranchLabel0=this.gitBranchLabel0||c(this.labelTextColor),this.gitBranchLabel1=this.gitBranchLabel1||this.labelTextColor,this.gitBranchLabel2=this.gitBranchLabel2||this.labelTextColor,this.gitBranchLabel3=this.gitBranchLabel3||c(this.labelTextColor),this.gitBranchLabel4=this.gitBranchLabel4||this.labelTextColor,this.gitBranchLabel5=this.gitBranchLabel5||this.labelTextColor,this.gitBranchLabel6=this.gitBranchLabel6||this.labelTextColor,this.gitBranchLabel7=this.gitBranchLabel7||this.labelTextColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||(0,d.A)(this.background,12),this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||(0,d.A)(this.background,2),this.nodeBorder=this.nodeBorder||"#999"}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach(e=>{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]})}},j=m(t=>{const e=new I;return e.calculate(t),e},"getThemeVariables"),z=class{static{m(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#ECECFF",this.secondaryColor=o(this.primaryColor,{h:120}),this.secondaryColor="#ffffde",this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=N(this.primaryColor,this.darkMode),this.secondaryBorderColor=N(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=N(this.tertiaryColor,this.darkMode),this.primaryTextColor=c(this.primaryColor),this.secondaryTextColor=c(this.secondaryColor),this.tertiaryTextColor=c(this.tertiaryColor),this.lineColor=c(this.background),this.textColor=c(this.background),this.background="white",this.mainBkg="#ECECFF",this.secondBkg="#ffffde",this.lineColor="#333333",this.border1="#9370DB",this.border2="#aaaa33",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.labelBackground="rgba(232,232,232, 0.8)",this.textColor="#333",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="calculated",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="calculated",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="calculated",this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor="calculated",this.taskTextOutsideColor=this.taskTextDarkColor,this.taskTextClickableColor="calculated",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBorderColor="calculated",this.critBkgColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.sectionBkgColor=(0,s.A)(102,102,255,.49),this.altSectionBkgColor="white",this.sectionBkgColor2="#fff400",this.taskBorderColor="#534fbc",this.taskBkgColor="#8a90dd",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="#534fbc",this.activeTaskBkgColor="#bfc7ff",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="navy",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd="calculated",this.rowEven="calculated",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222",this.updateColors()}updateColors(){this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||(0,u.A)(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||(0,u.A)(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=(0,u.A)(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||(0,u.A)(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||o(this["cScale"+t],{h:180});for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||o(this.mainBkg,{h:30,l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||o(this.mainBkg,{h:30,l:-(7+5*t)});if(this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor,"calculated"!==this.labelTextColor){this.cScaleLabel0=this.cScaleLabel0||c(this.labelTextColor),this.cScaleLabel3=this.cScaleLabel3||c(this.labelTextColor);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.labelTextColor}this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.textColor,this.edgeLabelBackground=this.labelBackground,this.actorBorder=(0,d.A)(this.border1,23),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.signalColor=this.textColor,this.signalTextColor=this.textColor,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.rowOdd=this.rowOdd||(0,d.A)(this.primaryColor,75)||"#ffffff",this.rowEven=this.rowEven||(0,d.A)(this.primaryColor,1),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.nodeBorder,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=o(this.primaryColor,{h:64}),this.fillType3=o(this.secondaryColor,{h:64}),this.fillType4=o(this.primaryColor,{h:-64}),this.fillType5=o(this.secondaryColor,{h:-64}),this.fillType6=o(this.primaryColor,{h:128}),this.fillType7=o(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||o(this.tertiaryColor,{l:-40}),this.pie4=this.pie4||o(this.primaryColor,{l:-10}),this.pie5=this.pie5||o(this.secondaryColor,{l:-30}),this.pie6=this.pie6||o(this.tertiaryColor,{l:-20}),this.pie7=this.pie7||o(this.primaryColor,{h:60,l:-20}),this.pie8=this.pie8||o(this.primaryColor,{h:-60,l:-40}),this.pie9=this.pie9||o(this.primaryColor,{h:120,l:-40}),this.pie10=this.pie10||o(this.primaryColor,{h:60,l:-40}),this.pie11=this.pie11||o(this.primaryColor,{h:-90,l:-40}),this.pie12=this.pie12||o(this.primaryColor,{h:120,l:-30}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOuterStrokeWidth=this.pieOuterStrokeWidth||"2px",this.pieOuterStrokeColor=this.pieOuterStrokeColor||"black",this.pieOpacity=this.pieOpacity||"0.7",this.quadrant1Fill=this.quadrant1Fill||this.primaryColor,this.quadrant2Fill=this.quadrant2Fill||o(this.primaryColor,{r:5,g:5,b:5}),this.quadrant3Fill=this.quadrant3Fill||o(this.primaryColor,{r:10,g:10,b:10}),this.quadrant4Fill=this.quadrant4Fill||o(this.primaryColor,{r:15,g:15,b:15}),this.quadrant1TextFill=this.quadrant1TextFill||this.primaryTextColor,this.quadrant2TextFill=this.quadrant2TextFill||o(this.primaryTextColor,{r:-5,g:-5,b:-5}),this.quadrant3TextFill=this.quadrant3TextFill||o(this.primaryTextColor,{r:-10,g:-10,b:-10}),this.quadrant4TextFill=this.quadrant4TextFill||o(this.primaryTextColor,{r:-15,g:-15,b:-15}),this.quadrantPointFill=this.quadrantPointFill||(0,p.A)(this.quadrant1Fill)?(0,d.A)(this.quadrant1Fill):(0,u.A)(this.quadrant1Fill),this.quadrantPointTextFill=this.quadrantPointTextFill||this.primaryTextColor,this.quadrantXAxisTextFill=this.quadrantXAxisTextFill||this.primaryTextColor,this.quadrantYAxisTextFill=this.quadrantYAxisTextFill||this.primaryTextColor,this.quadrantInternalBorderStrokeFill=this.quadrantInternalBorderStrokeFill||this.primaryBorderColor,this.quadrantExternalBorderStrokeFill=this.quadrantExternalBorderStrokeFill||this.primaryBorderColor,this.quadrantTitleFill=this.quadrantTitleFill||this.primaryTextColor,this.radar={axisColor:this.radar?.axisColor||this.lineColor,axisStrokeWidth:this.radar?.axisStrokeWidth||2,axisLabelFontSize:this.radar?.axisLabelFontSize||12,curveOpacity:this.radar?.curveOpacity||.5,curveStrokeWidth:this.radar?.curveStrokeWidth||2,graticuleColor:this.radar?.graticuleColor||"#DEDEDE",graticuleStrokeWidth:this.radar?.graticuleStrokeWidth||1,graticuleOpacity:this.radar?.graticuleOpacity||.3,legendBoxSize:this.radar?.legendBoxSize||12,legendFontSize:this.radar?.legendFontSize||12},this.xyChart={backgroundColor:this.xyChart?.backgroundColor||this.background,titleColor:this.xyChart?.titleColor||this.primaryTextColor,xAxisTitleColor:this.xyChart?.xAxisTitleColor||this.primaryTextColor,xAxisLabelColor:this.xyChart?.xAxisLabelColor||this.primaryTextColor,xAxisTickColor:this.xyChart?.xAxisTickColor||this.primaryTextColor,xAxisLineColor:this.xyChart?.xAxisLineColor||this.primaryTextColor,yAxisTitleColor:this.xyChart?.yAxisTitleColor||this.primaryTextColor,yAxisLabelColor:this.xyChart?.yAxisLabelColor||this.primaryTextColor,yAxisTickColor:this.xyChart?.yAxisTickColor||this.primaryTextColor,yAxisLineColor:this.xyChart?.yAxisLineColor||this.primaryTextColor,plotColorPalette:this.xyChart?.plotColorPalette||"#ECECFF,#8493A6,#FFC3A0,#DCDDE1,#B8E994,#D1A36F,#C3CDE6,#FFB6C1,#496078,#F8F3E3"},this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||"1",this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.labelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||o(this.primaryColor,{h:-30}),this.git4=this.git4||o(this.primaryColor,{h:-60}),this.git5=this.git5||o(this.primaryColor,{h:-90}),this.git6=this.git6||o(this.primaryColor,{h:60}),this.git7=this.git7||o(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,d.A)(this.git0,25),this.git1=(0,d.A)(this.git1,25),this.git2=(0,d.A)(this.git2,25),this.git3=(0,d.A)(this.git3,25),this.git4=(0,d.A)(this.git4,25),this.git5=(0,d.A)(this.git5,25),this.git6=(0,d.A)(this.git6,25),this.git7=(0,d.A)(this.git7,25)):(this.git0=(0,u.A)(this.git0,25),this.git1=(0,u.A)(this.git1,25),this.git2=(0,u.A)(this.git2,25),this.git3=(0,u.A)(this.git3,25),this.git4=(0,u.A)(this.git4,25),this.git5=(0,u.A)(this.git5,25),this.git6=(0,u.A)(this.git6,25),this.git7=(0,u.A)(this.git7,25)),this.gitInv0=this.gitInv0||(0,u.A)(c(this.git0),25),this.gitInv1=this.gitInv1||c(this.git1),this.gitInv2=this.gitInv2||c(this.git2),this.gitInv3=this.gitInv3||c(this.git3),this.gitInv4=this.gitInv4||c(this.git4),this.gitInv5=this.gitInv5||c(this.git5),this.gitInv6=this.gitInv6||c(this.git6),this.gitInv7=this.gitInv7||c(this.git7),this.gitBranchLabel0=this.gitBranchLabel0||c(this.labelTextColor),this.gitBranchLabel1=this.gitBranchLabel1||this.labelTextColor,this.gitBranchLabel2=this.gitBranchLabel2||this.labelTextColor,this.gitBranchLabel3=this.gitBranchLabel3||c(this.labelTextColor),this.gitBranchLabel4=this.gitBranchLabel4||this.labelTextColor,this.gitBranchLabel5=this.gitBranchLabel5||this.labelTextColor,this.gitBranchLabel6=this.gitBranchLabel6||this.labelTextColor,this.gitBranchLabel7=this.gitBranchLabel7||this.labelTextColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||E,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||D}calculate(t){if(Object.keys(this).forEach(t=>{"calculated"===this[t]&&(this[t]=void 0)}),"object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach(e=>{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]})}},P=m(t=>{const e=new z;return e.calculate(t),e},"getThemeVariables"),K=class{static{m(this,"Theme")}constructor(){this.background="#f4f4f4",this.primaryColor="#cde498",this.secondaryColor="#cdffb2",this.background="white",this.mainBkg="#cde498",this.secondBkg="#cdffb2",this.lineColor="green",this.border1="#13540c",this.border2="#6eaa49",this.arrowheadColor="green",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.tertiaryColor=(0,d.A)("#cde498",10),this.primaryBorderColor=N(this.primaryColor,this.darkMode),this.secondaryBorderColor=N(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=N(this.tertiaryColor,this.darkMode),this.primaryTextColor=c(this.primaryColor),this.secondaryTextColor=c(this.secondaryColor),this.tertiaryTextColor=c(this.primaryColor),this.lineColor=c(this.background),this.textColor=c(this.background),this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="#333",this.edgeLabelBackground="#e8e8e8",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="black",this.actorLineColor="calculated",this.signalColor="#333",this.signalTextColor="#333",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="#326932",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="#fff5ad",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="#6eaa49",this.altSectionBkgColor="white",this.sectionBkgColor2="#6eaa49",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="#487e3a",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="black",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="lightgrey",this.doneTaskBkgColor="lightgrey",this.doneTaskBorderColor="grey",this.critBorderColor="#ff8888",this.critBkgColor="red",this.todayLineColor="red",this.vertLineColor="#00BFFF",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.actorBorder=(0,u.A)(this.mainBkg,20),this.actorBkg=this.mainBkg,this.labelBoxBkgColor=this.actorBkg,this.labelTextColor=this.actorTextColor,this.loopTextColor=this.actorTextColor,this.noteBorderColor=this.border2,this.noteTextColor=this.actorTextColor,this.actorLineColor=this.actorBorder,this.cScale0=this.cScale0||this.primaryColor,this.cScale1=this.cScale1||this.secondaryColor,this.cScale2=this.cScale2||this.tertiaryColor,this.cScale3=this.cScale3||o(this.primaryColor,{h:30}),this.cScale4=this.cScale4||o(this.primaryColor,{h:60}),this.cScale5=this.cScale5||o(this.primaryColor,{h:90}),this.cScale6=this.cScale6||o(this.primaryColor,{h:120}),this.cScale7=this.cScale7||o(this.primaryColor,{h:150}),this.cScale8=this.cScale8||o(this.primaryColor,{h:210}),this.cScale9=this.cScale9||o(this.primaryColor,{h:270}),this.cScale10=this.cScale10||o(this.primaryColor,{h:300}),this.cScale11=this.cScale11||o(this.primaryColor,{h:330}),this.cScalePeer1=this.cScalePeer1||(0,u.A)(this.secondaryColor,45),this.cScalePeer2=this.cScalePeer2||(0,u.A)(this.tertiaryColor,40);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScale"+t]=(0,u.A)(this["cScale"+t],10),this["cScalePeer"+t]=this["cScalePeer"+t]||(0,u.A)(this["cScale"+t],25);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||o(this["cScale"+t],{h:180});this.scaleLabelColor="calculated"!==this.scaleLabelColor&&this.scaleLabelColor?this.scaleLabelColor:this.labelTextColor;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||o(this.mainBkg,{h:30,s:-30,l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||o(this.mainBkg,{h:30,s:-30,l:-(8+5*t)});this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.taskBorderColor=this.border1,this.taskTextColor=this.taskTextLightColor,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.rowOdd=this.rowOdd||(0,d.A)(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||(0,d.A)(this.mainBkg,20),this.transitionColor=this.transitionColor||this.lineColor,this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f0f0f0",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.compositeBorder=this.compositeBorder||this.nodeBorder,this.innerEndBackground=this.primaryBorderColor,this.specialStateColor=this.lineColor,this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.transitionColor=this.transitionColor||this.lineColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=o(this.primaryColor,{h:64}),this.fillType3=o(this.secondaryColor,{h:64}),this.fillType4=o(this.primaryColor,{h:-64}),this.fillType5=o(this.secondaryColor,{h:-64}),this.fillType6=o(this.primaryColor,{h:128}),this.fillType7=o(this.secondaryColor,{h:128}),this.pie1=this.pie1||this.primaryColor,this.pie2=this.pie2||this.secondaryColor,this.pie3=this.pie3||this.tertiaryColor,this.pie4=this.pie4||o(this.primaryColor,{l:-30}),this.pie5=this.pie5||o(this.secondaryColor,{l:-30}),this.pie6=this.pie6||o(this.tertiaryColor,{h:40,l:-40}),this.pie7=this.pie7||o(this.primaryColor,{h:60,l:-10}),this.pie8=this.pie8||o(this.primaryColor,{h:-60,l:-10}),this.pie9=this.pie9||o(this.primaryColor,{h:120,l:0}),this.pie10=this.pie10||o(this.primaryColor,{h:60,l:-50}),this.pie11=this.pie11||o(this.primaryColor,{h:-60,l:-50}),this.pie12=this.pie12||o(this.primaryColor,{h:120,l:-50}),this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOuterStrokeWidth=this.pieOuterStrokeWidth||"2px",this.pieOuterStrokeColor=this.pieOuterStrokeColor||"black",this.pieOpacity=this.pieOpacity||"0.7",this.quadrant1Fill=this.quadrant1Fill||this.primaryColor,this.quadrant2Fill=this.quadrant2Fill||o(this.primaryColor,{r:5,g:5,b:5}),this.quadrant3Fill=this.quadrant3Fill||o(this.primaryColor,{r:10,g:10,b:10}),this.quadrant4Fill=this.quadrant4Fill||o(this.primaryColor,{r:15,g:15,b:15}),this.quadrant1TextFill=this.quadrant1TextFill||this.primaryTextColor,this.quadrant2TextFill=this.quadrant2TextFill||o(this.primaryTextColor,{r:-5,g:-5,b:-5}),this.quadrant3TextFill=this.quadrant3TextFill||o(this.primaryTextColor,{r:-10,g:-10,b:-10}),this.quadrant4TextFill=this.quadrant4TextFill||o(this.primaryTextColor,{r:-15,g:-15,b:-15}),this.quadrantPointFill=this.quadrantPointFill||(0,p.A)(this.quadrant1Fill)?(0,d.A)(this.quadrant1Fill):(0,u.A)(this.quadrant1Fill),this.quadrantPointTextFill=this.quadrantPointTextFill||this.primaryTextColor,this.quadrantXAxisTextFill=this.quadrantXAxisTextFill||this.primaryTextColor,this.quadrantYAxisTextFill=this.quadrantYAxisTextFill||this.primaryTextColor,this.quadrantInternalBorderStrokeFill=this.quadrantInternalBorderStrokeFill||this.primaryBorderColor,this.quadrantExternalBorderStrokeFill=this.quadrantExternalBorderStrokeFill||this.primaryBorderColor,this.quadrantTitleFill=this.quadrantTitleFill||this.primaryTextColor,this.packet={startByteColor:this.primaryTextColor,endByteColor:this.primaryTextColor,labelColor:this.primaryTextColor,titleColor:this.primaryTextColor,blockStrokeColor:this.primaryTextColor,blockFillColor:this.mainBkg},this.radar={axisColor:this.radar?.axisColor||this.lineColor,axisStrokeWidth:this.radar?.axisStrokeWidth||2,axisLabelFontSize:this.radar?.axisLabelFontSize||12,curveOpacity:this.radar?.curveOpacity||.5,curveStrokeWidth:this.radar?.curveStrokeWidth||2,graticuleColor:this.radar?.graticuleColor||"#DEDEDE",graticuleStrokeWidth:this.radar?.graticuleStrokeWidth||1,graticuleOpacity:this.radar?.graticuleOpacity||.3,legendBoxSize:this.radar?.legendBoxSize||12,legendFontSize:this.radar?.legendFontSize||12},this.xyChart={backgroundColor:this.xyChart?.backgroundColor||this.background,titleColor:this.xyChart?.titleColor||this.primaryTextColor,xAxisTitleColor:this.xyChart?.xAxisTitleColor||this.primaryTextColor,xAxisLabelColor:this.xyChart?.xAxisLabelColor||this.primaryTextColor,xAxisTickColor:this.xyChart?.xAxisTickColor||this.primaryTextColor,xAxisLineColor:this.xyChart?.xAxisLineColor||this.primaryTextColor,yAxisTitleColor:this.xyChart?.yAxisTitleColor||this.primaryTextColor,yAxisLabelColor:this.xyChart?.yAxisLabelColor||this.primaryTextColor,yAxisTickColor:this.xyChart?.yAxisTickColor||this.primaryTextColor,yAxisLineColor:this.xyChart?.yAxisLineColor||this.primaryTextColor,plotColorPalette:this.xyChart?.plotColorPalette||"#CDE498,#FF6B6B,#A0D2DB,#D7BDE2,#F0F0F0,#FFC3A0,#7FD8BE,#FF9A8B,#FAF3E0,#FFF176"},this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||"1",this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=this.git0||this.primaryColor,this.git1=this.git1||this.secondaryColor,this.git2=this.git2||this.tertiaryColor,this.git3=this.git3||o(this.primaryColor,{h:-30}),this.git4=this.git4||o(this.primaryColor,{h:-60}),this.git5=this.git5||o(this.primaryColor,{h:-90}),this.git6=this.git6||o(this.primaryColor,{h:60}),this.git7=this.git7||o(this.primaryColor,{h:120}),this.darkMode?(this.git0=(0,d.A)(this.git0,25),this.git1=(0,d.A)(this.git1,25),this.git2=(0,d.A)(this.git2,25),this.git3=(0,d.A)(this.git3,25),this.git4=(0,d.A)(this.git4,25),this.git5=(0,d.A)(this.git5,25),this.git6=(0,d.A)(this.git6,25),this.git7=(0,d.A)(this.git7,25)):(this.git0=(0,u.A)(this.git0,25),this.git1=(0,u.A)(this.git1,25),this.git2=(0,u.A)(this.git2,25),this.git3=(0,u.A)(this.git3,25),this.git4=(0,u.A)(this.git4,25),this.git5=(0,u.A)(this.git5,25),this.git6=(0,u.A)(this.git6,25),this.git7=(0,u.A)(this.git7,25)),this.gitInv0=this.gitInv0||c(this.git0),this.gitInv1=this.gitInv1||c(this.git1),this.gitInv2=this.gitInv2||c(this.git2),this.gitInv3=this.gitInv3||c(this.git3),this.gitInv4=this.gitInv4||c(this.git4),this.gitInv5=this.gitInv5||c(this.git5),this.gitInv6=this.gitInv6||c(this.git6),this.gitInv7=this.gitInv7||c(this.git7),this.gitBranchLabel0=this.gitBranchLabel0||c(this.labelTextColor),this.gitBranchLabel1=this.gitBranchLabel1||this.labelTextColor,this.gitBranchLabel2=this.gitBranchLabel2||this.labelTextColor,this.gitBranchLabel3=this.gitBranchLabel3||c(this.labelTextColor),this.gitBranchLabel4=this.gitBranchLabel4||this.labelTextColor,this.gitBranchLabel5=this.gitBranchLabel5||this.labelTextColor,this.gitBranchLabel6=this.gitBranchLabel6||this.labelTextColor,this.gitBranchLabel7=this.gitBranchLabel7||this.labelTextColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||E,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||D}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach(e=>{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]})}},q=m(t=>{const e=new K;return e.calculate(t),e},"getThemeVariables"),W=class{static{m(this,"Theme")}constructor(){this.primaryColor="#eee",this.contrast="#707070",this.secondaryColor=(0,d.A)(this.contrast,55),this.background="#ffffff",this.tertiaryColor=o(this.primaryColor,{h:-160}),this.primaryBorderColor=N(this.primaryColor,this.darkMode),this.secondaryBorderColor=N(this.secondaryColor,this.darkMode),this.tertiaryBorderColor=N(this.tertiaryColor,this.darkMode),this.primaryTextColor=c(this.primaryColor),this.secondaryTextColor=c(this.secondaryColor),this.tertiaryTextColor=c(this.tertiaryColor),this.lineColor=c(this.background),this.textColor=c(this.background),this.mainBkg="#eee",this.secondBkg="calculated",this.lineColor="#666",this.border1="#999",this.border2="calculated",this.note="#ffa",this.text="#333",this.critical="#d42",this.done="#bbb",this.arrowheadColor="#333333",this.fontFamily='"trebuchet ms", verdana, arial, sans-serif',this.fontSize="16px",this.THEME_COLOR_LIMIT=12,this.nodeBkg="calculated",this.nodeBorder="calculated",this.clusterBkg="calculated",this.clusterBorder="calculated",this.defaultLinkColor="calculated",this.titleColor="calculated",this.edgeLabelBackground="white",this.actorBorder="calculated",this.actorBkg="calculated",this.actorTextColor="calculated",this.actorLineColor=this.actorBorder,this.signalColor="calculated",this.signalTextColor="calculated",this.labelBoxBkgColor="calculated",this.labelBoxBorderColor="calculated",this.labelTextColor="calculated",this.loopTextColor="calculated",this.noteBorderColor="calculated",this.noteBkgColor="calculated",this.noteTextColor="calculated",this.activationBorderColor="#666",this.activationBkgColor="#f4f4f4",this.sequenceNumberColor="white",this.sectionBkgColor="calculated",this.altSectionBkgColor="white",this.sectionBkgColor2="calculated",this.excludeBkgColor="#eeeeee",this.taskBorderColor="calculated",this.taskBkgColor="calculated",this.taskTextLightColor="white",this.taskTextColor="calculated",this.taskTextDarkColor="calculated",this.taskTextOutsideColor="calculated",this.taskTextClickableColor="#003163",this.activeTaskBorderColor="calculated",this.activeTaskBkgColor="calculated",this.gridColor="calculated",this.doneTaskBkgColor="calculated",this.doneTaskBorderColor="calculated",this.critBkgColor="calculated",this.critBorderColor="calculated",this.todayLineColor="calculated",this.vertLineColor="calculated",this.personBorder=this.primaryBorderColor,this.personBkg=this.mainBkg,this.archEdgeColor="calculated",this.archEdgeArrowColor="calculated",this.archEdgeWidth="3",this.archGroupBorderColor=this.primaryBorderColor,this.archGroupBorderWidth="2px",this.rowOdd=this.rowOdd||(0,d.A)(this.mainBkg,75)||"#ffffff",this.rowEven=this.rowEven||"#f4f4f4",this.labelColor="black",this.errorBkgColor="#552222",this.errorTextColor="#552222"}updateColors(){this.secondBkg=(0,d.A)(this.contrast,55),this.border2=this.contrast,this.actorBorder=(0,d.A)(this.border1,23),this.actorBkg=this.mainBkg,this.actorTextColor=this.text,this.actorLineColor=this.actorBorder,this.signalColor=this.text,this.signalTextColor=this.text,this.labelBoxBkgColor=this.actorBkg,this.labelBoxBorderColor=this.actorBorder,this.labelTextColor=this.text,this.loopTextColor=this.text,this.noteBorderColor="#999",this.noteBkgColor="#666",this.noteTextColor="#fff",this.cScale0=this.cScale0||"#555",this.cScale1=this.cScale1||"#F4F4F4",this.cScale2=this.cScale2||"#555",this.cScale3=this.cScale3||"#BBB",this.cScale4=this.cScale4||"#777",this.cScale5=this.cScale5||"#999",this.cScale6=this.cScale6||"#DDD",this.cScale7=this.cScale7||"#FFF",this.cScale8=this.cScale8||"#DDD",this.cScale9=this.cScale9||"#BBB",this.cScale10=this.cScale10||"#999",this.cScale11=this.cScale11||"#777";for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleInv"+t]=this["cScaleInv"+t]||c(this["cScale"+t]);for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this.darkMode?this["cScalePeer"+t]=this["cScalePeer"+t]||(0,d.A)(this["cScale"+t],10):this["cScalePeer"+t]=this["cScalePeer"+t]||(0,u.A)(this["cScale"+t],10);this.scaleLabelColor=this.scaleLabelColor||(this.darkMode?"black":this.labelTextColor),this.cScaleLabel0=this.cScaleLabel0||this.cScale1,this.cScaleLabel2=this.cScaleLabel2||this.cScale1;for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["cScaleLabel"+t]=this["cScaleLabel"+t]||this.scaleLabelColor;for(let t=0;t<5;t++)this["surface"+t]=this["surface"+t]||o(this.mainBkg,{l:-(5+5*t)}),this["surfacePeer"+t]=this["surfacePeer"+t]||o(this.mainBkg,{l:-(8+5*t)});this.nodeBkg=this.mainBkg,this.nodeBorder=this.border1,this.clusterBkg=this.secondBkg,this.clusterBorder=this.border2,this.defaultLinkColor=this.lineColor,this.titleColor=this.text,this.sectionBkgColor=(0,d.A)(this.contrast,30),this.sectionBkgColor2=(0,d.A)(this.contrast,30),this.taskBorderColor=(0,u.A)(this.contrast,10),this.taskBkgColor=this.contrast,this.taskTextColor=this.taskTextLightColor,this.taskTextDarkColor=this.text,this.taskTextOutsideColor=this.taskTextDarkColor,this.activeTaskBorderColor=this.taskBorderColor,this.activeTaskBkgColor=this.mainBkg,this.gridColor=(0,d.A)(this.border1,30),this.doneTaskBkgColor=this.done,this.doneTaskBorderColor=this.lineColor,this.critBkgColor=this.critical,this.critBorderColor=(0,u.A)(this.critBkgColor,10),this.todayLineColor=this.critBkgColor,this.vertLineColor=this.critBkgColor,this.archEdgeColor=this.lineColor,this.archEdgeArrowColor=this.lineColor,this.transitionColor=this.transitionColor||"#000",this.transitionLabelColor=this.transitionLabelColor||this.textColor,this.stateLabelColor=this.stateLabelColor||this.stateBkg||this.primaryTextColor,this.stateBkg=this.stateBkg||this.mainBkg,this.labelBackgroundColor=this.labelBackgroundColor||this.stateBkg,this.compositeBackground=this.compositeBackground||this.background||this.tertiaryColor,this.altBackground=this.altBackground||"#f4f4f4",this.compositeTitleBackground=this.compositeTitleBackground||this.mainBkg,this.stateBorder=this.stateBorder||"#000",this.innerEndBackground=this.primaryBorderColor,this.specialStateColor="#222",this.errorBkgColor=this.errorBkgColor||this.tertiaryColor,this.errorTextColor=this.errorTextColor||this.tertiaryTextColor,this.classText=this.primaryTextColor,this.fillType0=this.primaryColor,this.fillType1=this.secondaryColor,this.fillType2=o(this.primaryColor,{h:64}),this.fillType3=o(this.secondaryColor,{h:64}),this.fillType4=o(this.primaryColor,{h:-64}),this.fillType5=o(this.secondaryColor,{h:-64}),this.fillType6=o(this.primaryColor,{h:128}),this.fillType7=o(this.secondaryColor,{h:128});for(let t=0;t<this.THEME_COLOR_LIMIT;t++)this["pie"+t]=this["cScale"+t];this.pie12=this.pie0,this.pieTitleTextSize=this.pieTitleTextSize||"25px",this.pieTitleTextColor=this.pieTitleTextColor||this.taskTextDarkColor,this.pieSectionTextSize=this.pieSectionTextSize||"17px",this.pieSectionTextColor=this.pieSectionTextColor||this.textColor,this.pieLegendTextSize=this.pieLegendTextSize||"17px",this.pieLegendTextColor=this.pieLegendTextColor||this.taskTextDarkColor,this.pieStrokeColor=this.pieStrokeColor||"black",this.pieStrokeWidth=this.pieStrokeWidth||"2px",this.pieOuterStrokeWidth=this.pieOuterStrokeWidth||"2px",this.pieOuterStrokeColor=this.pieOuterStrokeColor||"black",this.pieOpacity=this.pieOpacity||"0.7",this.quadrant1Fill=this.quadrant1Fill||this.primaryColor,this.quadrant2Fill=this.quadrant2Fill||o(this.primaryColor,{r:5,g:5,b:5}),this.quadrant3Fill=this.quadrant3Fill||o(this.primaryColor,{r:10,g:10,b:10}),this.quadrant4Fill=this.quadrant4Fill||o(this.primaryColor,{r:15,g:15,b:15}),this.quadrant1TextFill=this.quadrant1TextFill||this.primaryTextColor,this.quadrant2TextFill=this.quadrant2TextFill||o(this.primaryTextColor,{r:-5,g:-5,b:-5}),this.quadrant3TextFill=this.quadrant3TextFill||o(this.primaryTextColor,{r:-10,g:-10,b:-10}),this.quadrant4TextFill=this.quadrant4TextFill||o(this.primaryTextColor,{r:-15,g:-15,b:-15}),this.quadrantPointFill=this.quadrantPointFill||(0,p.A)(this.quadrant1Fill)?(0,d.A)(this.quadrant1Fill):(0,u.A)(this.quadrant1Fill),this.quadrantPointTextFill=this.quadrantPointTextFill||this.primaryTextColor,this.quadrantXAxisTextFill=this.quadrantXAxisTextFill||this.primaryTextColor,this.quadrantYAxisTextFill=this.quadrantYAxisTextFill||this.primaryTextColor,this.quadrantInternalBorderStrokeFill=this.quadrantInternalBorderStrokeFill||this.primaryBorderColor,this.quadrantExternalBorderStrokeFill=this.quadrantExternalBorderStrokeFill||this.primaryBorderColor,this.quadrantTitleFill=this.quadrantTitleFill||this.primaryTextColor,this.xyChart={backgroundColor:this.xyChart?.backgroundColor||this.background,titleColor:this.xyChart?.titleColor||this.primaryTextColor,xAxisTitleColor:this.xyChart?.xAxisTitleColor||this.primaryTextColor,xAxisLabelColor:this.xyChart?.xAxisLabelColor||this.primaryTextColor,xAxisTickColor:this.xyChart?.xAxisTickColor||this.primaryTextColor,xAxisLineColor:this.xyChart?.xAxisLineColor||this.primaryTextColor,yAxisTitleColor:this.xyChart?.yAxisTitleColor||this.primaryTextColor,yAxisLabelColor:this.xyChart?.yAxisLabelColor||this.primaryTextColor,yAxisTickColor:this.xyChart?.yAxisTickColor||this.primaryTextColor,yAxisLineColor:this.xyChart?.yAxisLineColor||this.primaryTextColor,plotColorPalette:this.xyChart?.plotColorPalette||"#EEE,#6BB8E4,#8ACB88,#C7ACD6,#E8DCC2,#FFB2A8,#FFF380,#7E8D91,#FFD8B1,#FAF3E0"},this.radar={axisColor:this.radar?.axisColor||this.lineColor,axisStrokeWidth:this.radar?.axisStrokeWidth||2,axisLabelFontSize:this.radar?.axisLabelFontSize||12,curveOpacity:this.radar?.curveOpacity||.5,curveStrokeWidth:this.radar?.curveStrokeWidth||2,graticuleColor:this.radar?.graticuleColor||"#DEDEDE",graticuleStrokeWidth:this.radar?.graticuleStrokeWidth||1,graticuleOpacity:this.radar?.graticuleOpacity||.3,legendBoxSize:this.radar?.legendBoxSize||12,legendFontSize:this.radar?.legendFontSize||12},this.requirementBackground=this.requirementBackground||this.primaryColor,this.requirementBorderColor=this.requirementBorderColor||this.primaryBorderColor,this.requirementBorderSize=this.requirementBorderSize||"1",this.requirementTextColor=this.requirementTextColor||this.primaryTextColor,this.relationColor=this.relationColor||this.lineColor,this.relationLabelBackground=this.relationLabelBackground||this.edgeLabelBackground,this.relationLabelColor=this.relationLabelColor||this.actorTextColor,this.git0=(0,u.A)(this.pie1,25)||this.primaryColor,this.git1=this.pie2||this.secondaryColor,this.git2=this.pie3||this.tertiaryColor,this.git3=this.pie4||o(this.primaryColor,{h:-30}),this.git4=this.pie5||o(this.primaryColor,{h:-60}),this.git5=this.pie6||o(this.primaryColor,{h:-90}),this.git6=this.pie7||o(this.primaryColor,{h:60}),this.git7=this.pie8||o(this.primaryColor,{h:120}),this.gitInv0=this.gitInv0||c(this.git0),this.gitInv1=this.gitInv1||c(this.git1),this.gitInv2=this.gitInv2||c(this.git2),this.gitInv3=this.gitInv3||c(this.git3),this.gitInv4=this.gitInv4||c(this.git4),this.gitInv5=this.gitInv5||c(this.git5),this.gitInv6=this.gitInv6||c(this.git6),this.gitInv7=this.gitInv7||c(this.git7),this.branchLabelColor=this.branchLabelColor||this.labelTextColor,this.gitBranchLabel0=this.branchLabelColor,this.gitBranchLabel1="white",this.gitBranchLabel2=this.branchLabelColor,this.gitBranchLabel3="white",this.gitBranchLabel4=this.branchLabelColor,this.gitBranchLabel5=this.branchLabelColor,this.gitBranchLabel6=this.branchLabelColor,this.gitBranchLabel7=this.branchLabelColor,this.tagLabelColor=this.tagLabelColor||this.primaryTextColor,this.tagLabelBackground=this.tagLabelBackground||this.primaryColor,this.tagLabelBorder=this.tagBorder||this.primaryBorderColor,this.tagLabelFontSize=this.tagLabelFontSize||"10px",this.commitLabelColor=this.commitLabelColor||this.secondaryTextColor,this.commitLabelBackground=this.commitLabelBackground||this.secondaryColor,this.commitLabelFontSize=this.commitLabelFontSize||"10px",this.attributeBackgroundColorOdd=this.attributeBackgroundColorOdd||E,this.attributeBackgroundColorEven=this.attributeBackgroundColorEven||D}calculate(t){if("object"!=typeof t)return void this.updateColors();const e=Object.keys(t);e.forEach(e=>{this[e]=t[e]}),this.updateColors(),e.forEach(e=>{this[e]=t[e]})}},H={base:{getThemeVariables:R},dark:{getThemeVariables:j},default:{getThemeVariables:P},forest:{getThemeVariables:q},neutral:{getThemeVariables:m(t=>{const e=new W;return e.calculate(t),e},"getThemeVariables")}},U={flowchart:{useMaxWidth:!0,titleTopMargin:25,subGraphTitleMargin:{top:0,bottom:0},diagramPadding:8,htmlLabels:!0,nodeSpacing:50,rankSpacing:50,curve:"basis",padding:15,defaultRenderer:"dagre-wrapper",wrappingWidth:200,inheritDir:!1},sequence:{useMaxWidth:!0,hideUnusedParticipants:!1,activationWidth:10,diagramMarginX:50,diagramMarginY:10,actorMargin:50,width:150,height:65,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",mirrorActors:!0,forceMenus:!1,bottomMarginAdj:1,rightAngles:!1,showSequenceNumbers:!1,actorFontSize:14,actorFontFamily:'"Open Sans", sans-serif',actorFontWeight:400,noteFontSize:14,noteFontFamily:'"trebuchet ms", verdana, arial, sans-serif',noteFontWeight:400,noteAlign:"center",messageFontSize:16,messageFontFamily:'"trebuchet ms", verdana, arial, sans-serif',messageFontWeight:400,wrap:!1,wrapPadding:10,labelBoxWidth:50,labelBoxHeight:20},gantt:{useMaxWidth:!0,titleTopMargin:25,barHeight:20,barGap:4,topPadding:50,rightPadding:75,leftPadding:75,gridLineStartPadding:35,fontSize:11,sectionFontSize:11,numberSectionStyles:4,axisFormat:"%Y-%m-%d",topAxis:!1,displayMode:"",weekday:"sunday"},journey:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,maxLabelWidth:360,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],titleColor:"",titleFontFamily:'"trebuchet ms", verdana, arial, sans-serif',titleFontSize:"4ex"},class:{useMaxWidth:!0,titleTopMargin:25,arrowMarkerAbsolute:!1,dividerMargin:10,padding:5,textHeight:10,defaultRenderer:"dagre-wrapper",htmlLabels:!1,hideEmptyMembersBox:!1},state:{useMaxWidth:!0,titleTopMargin:25,dividerMargin:10,sizeUnit:5,padding:8,textHeight:10,titleShift:-15,noteMargin:10,forkWidth:70,forkHeight:7,miniPadding:2,fontSizeFactor:5.02,fontSize:24,labelHeight:16,edgeLengthFactor:"20",compositTitleSize:35,radius:5,defaultRenderer:"dagre-wrapper"},er:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:20,layoutDirection:"TB",minEntityWidth:100,minEntityHeight:75,entityPadding:15,nodeSpacing:140,rankSpacing:80,stroke:"gray",fill:"honeydew",fontSize:12},pie:{useMaxWidth:!0,textPosition:.75},quadrantChart:{useMaxWidth:!0,chartWidth:500,chartHeight:500,titleFontSize:20,titlePadding:10,quadrantPadding:5,xAxisLabelPadding:5,yAxisLabelPadding:5,xAxisLabelFontSize:16,yAxisLabelFontSize:16,quadrantLabelFontSize:16,quadrantTextTopPadding:5,pointTextPadding:5,pointLabelFontSize:12,pointRadius:5,xAxisPosition:"top",yAxisPosition:"left",quadrantInternalBorderStrokeWidth:1,quadrantExternalBorderStrokeWidth:2},xyChart:{useMaxWidth:!0,width:700,height:500,titleFontSize:20,titlePadding:10,showDataLabel:!1,showTitle:!0,xAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},yAxis:{$ref:"#/$defs/XYChartAxisConfig",showLabel:!0,labelFontSize:14,labelPadding:5,showTitle:!0,titleFontSize:16,titlePadding:5,showTick:!0,tickLength:5,tickWidth:2,showAxisLine:!0,axisLineWidth:2},chartOrientation:"vertical",plotReservedSpacePercent:50},requirement:{useMaxWidth:!0,rect_fill:"#f9f9f9",text_color:"#333",rect_border_size:"0.5px",rect_border_color:"#bbb",rect_min_width:200,rect_min_height:200,fontSize:14,rect_padding:10,line_height:20},mindmap:{useMaxWidth:!0,padding:10,maxNodeWidth:200},kanban:{useMaxWidth:!0,padding:8,sectionWidth:200,ticketBaseUrl:""},timeline:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,leftMargin:150,width:150,height:50,boxMargin:10,boxTextMargin:5,noteMargin:10,messageMargin:35,messageAlign:"center",bottomMarginAdj:1,rightAngles:!1,taskFontSize:14,taskFontFamily:'"Open Sans", sans-serif',taskMargin:50,activationWidth:10,textPlacement:"fo",actorColours:["#8FBC8F","#7CFC00","#00FFFF","#20B2AA","#B0E0E6","#FFFFE0"],sectionFills:["#191970","#8B008B","#4B0082","#2F4F4F","#800000","#8B4513","#00008B"],sectionColours:["#fff"],disableMulticolor:!1},gitGraph:{useMaxWidth:!0,titleTopMargin:25,diagramPadding:8,nodeLabel:{width:75,height:100,x:-25,y:0},mainBranchName:"main",mainBranchOrder:0,showCommitLabel:!0,showBranches:!0,rotateCommitLabel:!0,parallelCommits:!1,arrowMarkerAbsolute:!1},c4:{useMaxWidth:!0,diagramMarginX:50,diagramMarginY:10,c4ShapeMargin:50,c4ShapePadding:20,width:216,height:60,boxMargin:10,c4ShapeInRow:4,nextLinePaddingX:0,c4BoundaryInRow:2,personFontSize:14,personFontFamily:'"Open Sans", sans-serif',personFontWeight:"normal",external_personFontSize:14,external_personFontFamily:'"Open Sans", sans-serif',external_personFontWeight:"normal",systemFontSize:14,systemFontFamily:'"Open Sans", sans-serif',systemFontWeight:"normal",external_systemFontSize:14,external_systemFontFamily:'"Open Sans", sans-serif',external_systemFontWeight:"normal",system_dbFontSize:14,system_dbFontFamily:'"Open Sans", sans-serif',system_dbFontWeight:"normal",external_system_dbFontSize:14,external_system_dbFontFamily:'"Open Sans", sans-serif',external_system_dbFontWeight:"normal",system_queueFontSize:14,system_queueFontFamily:'"Open Sans", sans-serif',system_queueFontWeight:"normal",external_system_queueFontSize:14,external_system_queueFontFamily:'"Open Sans", sans-serif',external_system_queueFontWeight:"normal",boundaryFontSize:14,boundaryFontFamily:'"Open Sans", sans-serif',boundaryFontWeight:"normal",messageFontSize:12,messageFontFamily:'"Open Sans", sans-serif',messageFontWeight:"normal",containerFontSize:14,containerFontFamily:'"Open Sans", sans-serif',containerFontWeight:"normal",external_containerFontSize:14,external_containerFontFamily:'"Open Sans", sans-serif',external_containerFontWeight:"normal",container_dbFontSize:14,container_dbFontFamily:'"Open Sans", sans-serif',container_dbFontWeight:"normal",external_container_dbFontSize:14,external_container_dbFontFamily:'"Open Sans", sans-serif',external_container_dbFontWeight:"normal",container_queueFontSize:14,container_queueFontFamily:'"Open Sans", sans-serif',container_queueFontWeight:"normal",external_container_queueFontSize:14,external_container_queueFontFamily:'"Open Sans", sans-serif',external_container_queueFontWeight:"normal",componentFontSize:14,componentFontFamily:'"Open Sans", sans-serif',componentFontWeight:"normal",external_componentFontSize:14,external_componentFontFamily:'"Open Sans", sans-serif',external_componentFontWeight:"normal",component_dbFontSize:14,component_dbFontFamily:'"Open Sans", sans-serif',component_dbFontWeight:"normal",external_component_dbFontSize:14,external_component_dbFontFamily:'"Open Sans", sans-serif',external_component_dbFontWeight:"normal",component_queueFontSize:14,component_queueFontFamily:'"Open Sans", sans-serif',component_queueFontWeight:"normal",external_component_queueFontSize:14,external_component_queueFontFamily:'"Open Sans", sans-serif',external_component_queueFontWeight:"normal",wrap:!0,wrapPadding:10,person_bg_color:"#08427B",person_border_color:"#073B6F",external_person_bg_color:"#686868",external_person_border_color:"#8A8A8A",system_bg_color:"#1168BD",system_border_color:"#3C7FC0",system_db_bg_color:"#1168BD",system_db_border_color:"#3C7FC0",system_queue_bg_color:"#1168BD",system_queue_border_color:"#3C7FC0",external_system_bg_color:"#999999",external_system_border_color:"#8A8A8A",external_system_db_bg_color:"#999999",external_system_db_border_color:"#8A8A8A",external_system_queue_bg_color:"#999999",external_system_queue_border_color:"#8A8A8A",container_bg_color:"#438DD5",container_border_color:"#3C7FC0",container_db_bg_color:"#438DD5",container_db_border_color:"#3C7FC0",container_queue_bg_color:"#438DD5",container_queue_border_color:"#3C7FC0",external_container_bg_color:"#B3B3B3",external_container_border_color:"#A6A6A6",external_container_db_bg_color:"#B3B3B3",external_container_db_border_color:"#A6A6A6",external_container_queue_bg_color:"#B3B3B3",external_container_queue_border_color:"#A6A6A6",component_bg_color:"#85BBF0",component_border_color:"#78A8D8",component_db_bg_color:"#85BBF0",component_db_border_color:"#78A8D8",component_queue_bg_color:"#85BBF0",component_queue_border_color:"#78A8D8",external_component_bg_color:"#CCCCCC",external_component_border_color:"#BFBFBF",external_component_db_bg_color:"#CCCCCC",external_component_db_border_color:"#BFBFBF",external_component_queue_bg_color:"#CCCCCC",external_component_queue_border_color:"#BFBFBF"},sankey:{useMaxWidth:!0,width:600,height:400,linkColor:"gradient",nodeAlignment:"justify",showValues:!0,prefix:"",suffix:""},block:{useMaxWidth:!0,padding:8},packet:{useMaxWidth:!0,rowHeight:32,bitWidth:32,bitsPerRow:32,showBits:!0,paddingX:5,paddingY:5},architecture:{useMaxWidth:!0,padding:40,iconSize:80,fontSize:16},radar:{useMaxWidth:!0,width:600,height:600,marginTop:50,marginRight:50,marginBottom:50,marginLeft:50,axisScaleFactor:1,axisLabelFactor:1.05,curveTension:.17},theme:"default",look:"classic",handDrawnSeed:0,layout:"dagre",maxTextSize:5e4,maxEdges:500,darkMode:!1,fontFamily:'"trebuchet ms", verdana, arial, sans-serif;',logLevel:5,securityLevel:"strict",startOnLoad:!0,arrowMarkerAbsolute:!1,secure:["secure","securityLevel","startOnLoad","maxTextSize","suppressErrorRendering","maxEdges"],legacyMathML:!1,forceLegacyMathML:!1,deterministicIds:!1,fontSize:16,markdownAutoWrap:!0,suppressErrorRendering:!1},Y={...U,deterministicIDSeed:void 0,elk:{mergeEdges:!1,nodePlacementStrategy:"BRANDES_KOEPF"},themeCSS:void 0,themeVariables:H.default.getThemeVariables(),sequence:{...U.sequence,messageFont:m(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont"),noteFont:m(function(){return{fontFamily:this.noteFontFamily,fontSize:this.noteFontSize,fontWeight:this.noteFontWeight}},"noteFont"),actorFont:m(function(){return{fontFamily:this.actorFontFamily,fontSize:this.actorFontSize,fontWeight:this.actorFontWeight}},"actorFont")},class:{hideEmptyMembersBox:!1},gantt:{...U.gantt,tickInterval:void 0,useWidth:void 0},c4:{...U.c4,useWidth:void 0,personFont:m(function(){return{fontFamily:this.personFontFamily,fontSize:this.personFontSize,fontWeight:this.personFontWeight}},"personFont"),flowchart:{...U.flowchart,inheritDir:!1},external_personFont:m(function(){return{fontFamily:this.external_personFontFamily,fontSize:this.external_personFontSize,fontWeight:this.external_personFontWeight}},"external_personFont"),systemFont:m(function(){return{fontFamily:this.systemFontFamily,fontSize:this.systemFontSize,fontWeight:this.systemFontWeight}},"systemFont"),external_systemFont:m(function(){return{fontFamily:this.external_systemFontFamily,fontSize:this.external_systemFontSize,fontWeight:this.external_systemFontWeight}},"external_systemFont"),system_dbFont:m(function(){return{fontFamily:this.system_dbFontFamily,fontSize:this.system_dbFontSize,fontWeight:this.system_dbFontWeight}},"system_dbFont"),external_system_dbFont:m(function(){return{fontFamily:this.external_system_dbFontFamily,fontSize:this.external_system_dbFontSize,fontWeight:this.external_system_dbFontWeight}},"external_system_dbFont"),system_queueFont:m(function(){return{fontFamily:this.system_queueFontFamily,fontSize:this.system_queueFontSize,fontWeight:this.system_queueFontWeight}},"system_queueFont"),external_system_queueFont:m(function(){return{fontFamily:this.external_system_queueFontFamily,fontSize:this.external_system_queueFontSize,fontWeight:this.external_system_queueFontWeight}},"external_system_queueFont"),containerFont:m(function(){return{fontFamily:this.containerFontFamily,fontSize:this.containerFontSize,fontWeight:this.containerFontWeight}},"containerFont"),external_containerFont:m(function(){return{fontFamily:this.external_containerFontFamily,fontSize:this.external_containerFontSize,fontWeight:this.external_containerFontWeight}},"external_containerFont"),container_dbFont:m(function(){return{fontFamily:this.container_dbFontFamily,fontSize:this.container_dbFontSize,fontWeight:this.container_dbFontWeight}},"container_dbFont"),external_container_dbFont:m(function(){return{fontFamily:this.external_container_dbFontFamily,fontSize:this.external_container_dbFontSize,fontWeight:this.external_container_dbFontWeight}},"external_container_dbFont"),container_queueFont:m(function(){return{fontFamily:this.container_queueFontFamily,fontSize:this.container_queueFontSize,fontWeight:this.container_queueFontWeight}},"container_queueFont"),external_container_queueFont:m(function(){return{fontFamily:this.external_container_queueFontFamily,fontSize:this.external_container_queueFontSize,fontWeight:this.external_container_queueFontWeight}},"external_container_queueFont"),componentFont:m(function(){return{fontFamily:this.componentFontFamily,fontSize:this.componentFontSize,fontWeight:this.componentFontWeight}},"componentFont"),external_componentFont:m(function(){return{fontFamily:this.external_componentFontFamily,fontSize:this.external_componentFontSize,fontWeight:this.external_componentFontWeight}},"external_componentFont"),component_dbFont:m(function(){return{fontFamily:this.component_dbFontFamily,fontSize:this.component_dbFontSize,fontWeight:this.component_dbFontWeight}},"component_dbFont"),external_component_dbFont:m(function(){return{fontFamily:this.external_component_dbFontFamily,fontSize:this.external_component_dbFontSize,fontWeight:this.external_component_dbFontWeight}},"external_component_dbFont"),component_queueFont:m(function(){return{fontFamily:this.component_queueFontFamily,fontSize:this.component_queueFontSize,fontWeight:this.component_queueFontWeight}},"component_queueFont"),external_component_queueFont:m(function(){return{fontFamily:this.external_component_queueFontFamily,fontSize:this.external_component_queueFontSize,fontWeight:this.external_component_queueFontWeight}},"external_component_queueFont"),boundaryFont:m(function(){return{fontFamily:this.boundaryFontFamily,fontSize:this.boundaryFontSize,fontWeight:this.boundaryFontWeight}},"boundaryFont"),messageFont:m(function(){return{fontFamily:this.messageFontFamily,fontSize:this.messageFontSize,fontWeight:this.messageFontWeight}},"messageFont")},pie:{...U.pie,useWidth:984},xyChart:{...U.xyChart,useWidth:void 0},requirement:{...U.requirement,useWidth:void 0},packet:{...U.packet},radar:{...U.radar},treemap:{useMaxWidth:!0,padding:10,diagramPadding:8,showValues:!0,nodeWidth:100,nodeHeight:40,borderWidth:1,valueFontSize:12,labelFontSize:14,valueFormat:","}},G=m((t,e="")=>Object.keys(t).reduce((r,n)=>Array.isArray(t[n])?r:"object"==typeof t[n]&&null!==t[n]?[...r,e+n,...G(t[n],"")]:[...r,e+n],[]),"keyify"),X=new Set(G(Y,"")),V=Y,Z=m(t=>{if(b.debug("sanitizeDirective called with",t),"object"==typeof t&&null!=t)if(Array.isArray(t))t.forEach(t=>Z(t));else{for(const e of Object.keys(t)){if(b.debug("Checking key",e),e.startsWith("__")||e.includes("proto")||e.includes("constr")||!X.has(e)||null==t[e]){b.debug("sanitize deleting key: ",e),delete t[e];continue}if("object"==typeof t[e]){b.debug("sanitizing object",e),Z(t[e]);continue}const r=["themeCSS","fontFamily","altFontFamily"];for(const n of r)e.includes(n)&&(b.debug("sanitizing css option",e),t[e]=Q(t[e]))}if(t.themeVariables)for(const e of Object.keys(t.themeVariables)){const r=t.themeVariables[e];r?.match&&!r.match(/^[\d "#%(),.;A-Za-z]+$/)&&(t.themeVariables[e]="")}b.debug("After sanitization",t)}},"sanitizeDirective"),Q=m(t=>{let e=0,r=0;for(const n of t){if(e<r)return"{ /* ERROR: Unbalanced CSS */ }";"{"===n?e++:"}"===n&&r++}return e!==r?"{ /* ERROR: Unbalanced CSS */ }":t},"sanitizeCss"),J=Object.freeze(V),tt=$({},J),et=[],rt=$({},J),nt=m((t,e)=>{let r=$({},t),n={};for(const i of e)ht(i),n=$(n,i);if(r=$(r,n),n.theme&&n.theme in H){const t=$({},h),e=$(t.themeVariables||{},n.themeVariables);r.theme&&r.theme in H&&(r.themeVariables=H[r.theme].getThemeVariables(e))}return mt(rt=r),rt},"updateCurrentConfig"),it=m(t=>(tt=$({},J),tt=$(tt,t),t.theme&&H[t.theme]&&(tt.themeVariables=H[t.theme].getThemeVariables(t.themeVariables)),nt(tt,et),tt),"setSiteConfig"),at=m(t=>{h=$({},t)},"saveConfigFromInitialize"),ot=m(t=>(tt=$(tt,t),nt(tt,et),tt),"updateSiteConfig"),st=m(()=>$({},tt),"getSiteConfig"),lt=m(t=>(mt(t),$(rt,t),ct()),"setConfig"),ct=m(()=>$({},rt),"getConfig"),ht=m(t=>{t&&(["secure",...tt.secure??[]].forEach(e=>{Object.hasOwn(t,e)&&(b.debug(`Denied attempt to modify a secure key ${e}`,t[e]),delete t[e])}),Object.keys(t).forEach(e=>{e.startsWith("__")&&delete t[e]}),Object.keys(t).forEach(e=>{"string"==typeof t[e]&&(t[e].includes("<")||t[e].includes(">")||t[e].includes("url(data:"))&&delete t[e],"object"==typeof t[e]&&ht(t[e])}))},"sanitize"),ut=m(t=>{Z(t),t.fontFamily&&!t.themeVariables?.fontFamily&&(t.themeVariables={...t.themeVariables,fontFamily:t.fontFamily}),et.push(t),nt(tt,et)},"addDirective"),dt=m((t=tt)=>{nt(t,et=[])},"reset"),pt={LAZY_LOAD_DEPRECATED:"The configuration options lazyLoadedDiagrams and loadExternalDiagramsAtStartup are deprecated. Please use registerExternalDiagrams instead."},ft={},gt=m(t=>{ft[t]||(b.warn(pt[t]),ft[t]=!0)},"issueWarning"),mt=m(t=>{t&&(t.lazyLoadedDiagrams||t.loadExternalDiagramsAtStartup)&>("LAZY_LOAD_DEPRECATED")},"checkConfig"),yt=/<br\s*\/?>/gi,xt=m(t=>{if(!t)return[""];return Mt(t).replace(/\\n/g,"#br#").split("#br#")},"getRows"),bt=(()=>{let t=!1;return()=>{t||(kt(),t=!0)}})();function kt(){const t="data-temp-href-target";f.A.addHook("beforeSanitizeAttributes",e=>{e instanceof Element&&"A"===e.tagName&&e.hasAttribute("target")&&e.setAttribute(t,e.getAttribute("target")??"")}),f.A.addHook("afterSanitizeAttributes",e=>{e instanceof Element&&"A"===e.tagName&&e.hasAttribute(t)&&(e.setAttribute("target",e.getAttribute(t)??""),e.removeAttribute(t),"_blank"===e.getAttribute("target")&&e.setAttribute("rel","noopener"))})}m(kt,"setupDompurifyHooks");var Ct=m(t=>{bt();return f.A.sanitize(t)},"removeScript"),wt=m((t,e)=>{if(!1!==e.flowchart?.htmlLabels){const r=e.securityLevel;"antiscript"===r||"strict"===r?t=Ct(t):"loose"!==r&&(t=(t=(t=Mt(t)).replace(/</g,"<").replace(/>/g,">")).replace(/=/g,"="),t=Tt(t))}return t},"sanitizeMore"),_t=m((t,e)=>t?t=e.dompurifyConfig?f.A.sanitize(wt(t,e),e.dompurifyConfig).toString():f.A.sanitize(wt(t,e),{FORBID_TAGS:["style"]}).toString():t,"sanitizeText"),vt=m((t,e)=>"string"==typeof t?_t(t,e):t.flat().map(t=>_t(t,e)),"sanitizeTextOrArray"),St=m(t=>yt.test(t),"hasBreaks"),At=m(t=>t.split(yt),"splitBreaks"),Tt=m(t=>t.replace(/#br#/g,"<br/>"),"placeholderToBreak"),Mt=m(t=>t.replace(yt,"#br#"),"breakToPlaceholder"),Bt=m(t=>{let e="";return t&&(e=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,e=CSS.escape(e)),e},"getUrl"),Lt=m(t=>!1!==t&&!["false","null","0"].includes(String(t).trim().toLowerCase()),"evaluate"),Ft=m(function(...t){const e=t.filter(t=>!isNaN(t));return Math.max(...e)},"getMax"),$t=m(function(...t){const e=t.filter(t=>!isNaN(t));return Math.min(...e)},"getMin"),Et=m(function(t){const e=t.split(/(,)/),r=[];for(let n=0;n<e.length;n++){let t=e[n];if(","===t&&n>0&&n+1<e.length){const i=e[n-1],a=e[n+1];Nt(i,a)&&(t=i+","+a,n++,r.pop())}r.push(Ot(t))}return r.join("")},"parseGenericTypes"),Dt=m((t,e)=>Math.max(0,t.split(e).length-1),"countOccurrence"),Nt=m((t,e)=>{const r=Dt(t,"~"),n=Dt(e,"~");return 1===r&&1===n},"shouldCombineSets"),Ot=m(t=>{const e=Dt(t,"~");let r=!1;if(e<=1)return t;e%2!=0&&t.startsWith("~")&&(t=t.substring(1),r=!0);const n=[...t];let i=n.indexOf("~"),a=n.lastIndexOf("~");for(;-1!==i&&-1!==a&&i!==a;)n[i]="<",n[a]=">",i=n.indexOf("~"),a=n.lastIndexOf("~");return r&&n.unshift("~"),n.join("")},"processSet"),Rt=m(()=>void 0!==window.MathMLElement,"isMathMLSupported"),It=/\$\$(.*)\$\$/g,jt=m(t=>(t.match(It)?.length??0)>0,"hasKatex"),zt=m(async(t,e)=>{t=await Pt(t,e);const r=document.createElement("div");r.innerHTML=t,r.id="katex-temp",r.style.visibility="hidden",r.style.position="absolute",r.style.top="0";const n=document.querySelector("body");n?.insertAdjacentElement("beforeend",r);const i={width:r.clientWidth,height:r.clientHeight};return r.remove(),i},"calculateMathMLDimensions"),Pt=m(async(t,e)=>{if(!jt(t))return t;if(!(Rt()||e.legacyMathML||e.forceLegacyMathML))return t.replace(It,"MathML is unsupported in this environment.");{const{default:n}=await r.e(9402).then(r.bind(r,19402)),i=e.forceLegacyMathML||!Rt()&&e.legacyMathML?"htmlAndMathml":"mathml";return t.split(yt).map(t=>jt(t)?`<div style="display: flex; align-items: center; justify-content: center; white-space: nowrap;">${t}</div>`:`<div>${t}</div>`).join("").replace(It,(t,e)=>n.renderToString(e,{throwOnError:!0,displayMode:!0,output:i}).replace(/\n/g," ").replace(/<annotation.*<\/annotation>/g,""))}},"renderKatex"),Kt={getRows:xt,sanitizeText:_t,sanitizeTextOrArray:vt,hasBreaks:St,splitBreaks:At,lineBreakRegex:yt,removeScript:Ct,getUrl:Bt,evaluate:Lt,getMax:Ft,getMin:$t},qt=m(function(t,e){for(let r of e)t.attr(r[0],r[1])},"d3Attrs"),Wt=m(function(t,e,r){let n=new Map;return r?(n.set("width","100%"),n.set("style",`max-width: ${e}px;`)):(n.set("height",t),n.set("width",e)),n},"calculateSvgSizeAttrs"),Ht=m(function(t,e,r,n){const i=Wt(e,r,n);qt(t,i)},"configureSvgSize"),Ut=m(function(t,e,r,n){const i=e.node().getBBox(),a=i.width,o=i.height;b.info(`SVG bounds: ${a}x${o}`,i);let s=0,l=0;b.info(`Graph bounds: ${s}x${l}`,t),s=a+2*r,l=o+2*r,b.info(`Calculated bounds: ${s}x${l}`),Ht(e,l,s,n);const c=`${i.x-r} ${i.y-r} ${i.width+2*r} ${i.height+2*r}`;e.attr("viewBox",c)},"setupGraphViewbox"),Yt={},Gt=m((t,e,r)=>{let n="";return t in Yt&&Yt[t]?n=Yt[t](r):b.warn(`No theme found for ${t}`),` & {\n font-family: ${r.fontFamily};\n font-size: ${r.fontSize};\n fill: ${r.textColor}\n }\n @keyframes edge-animation-frame {\n from {\n stroke-dashoffset: 0;\n }\n }\n @keyframes dash {\n to {\n stroke-dashoffset: 0;\n }\n }\n & .edge-animation-slow {\n stroke-dasharray: 9,5 !important;\n stroke-dashoffset: 900;\n animation: dash 50s linear infinite;\n stroke-linecap: round;\n }\n & .edge-animation-fast {\n stroke-dasharray: 9,5 !important;\n stroke-dashoffset: 900;\n animation: dash 20s linear infinite;\n stroke-linecap: round;\n }\n /* Classes common for multiple diagrams */\n\n & .error-icon {\n fill: ${r.errorBkgColor};\n }\n & .error-text {\n fill: ${r.errorTextColor};\n stroke: ${r.errorTextColor};\n }\n\n & .edge-thickness-normal {\n stroke-width: 1px;\n }\n & .edge-thickness-thick {\n stroke-width: 3.5px\n }\n & .edge-pattern-solid {\n stroke-dasharray: 0;\n }\n & .edge-thickness-invisible {\n stroke-width: 0;\n fill: none;\n }\n & .edge-pattern-dashed{\n stroke-dasharray: 3;\n }\n .edge-pattern-dotted {\n stroke-dasharray: 2;\n }\n\n & .marker {\n fill: ${r.lineColor};\n stroke: ${r.lineColor};\n }\n & .marker.cross {\n stroke: ${r.lineColor};\n }\n\n & svg {\n font-family: ${r.fontFamily};\n font-size: ${r.fontSize};\n }\n & p {\n margin: 0\n }\n\n ${n}\n\n ${e}\n`},"getStyles"),Xt=m((t,e)=>{void 0!==e&&(Yt[t]=e)},"addStylesForDiagram"),Vt=Gt,Zt={};y(Zt,{clear:()=>re,getAccDescription:()=>oe,getAccTitle:()=>ie,getDiagramTitle:()=>le,setAccDescription:()=>ae,setAccTitle:()=>ne,setDiagramTitle:()=>se});var Qt="",Jt="",te="",ee=m(t=>_t(t,ct()),"sanitizeText"),re=m(()=>{Qt="",te="",Jt=""},"clear"),ne=m(t=>{Qt=ee(t).replace(/^\s+/g,"")},"setAccTitle"),ie=m(()=>Qt,"getAccTitle"),ae=m(t=>{te=ee(t).replace(/\n\s+/g,"\n")},"setAccDescription"),oe=m(()=>te,"getAccDescription"),se=m(t=>{Jt=ee(t)},"setDiagramTitle"),le=m(()=>Jt,"getDiagramTitle"),ce=b,he=k,ue=ct,de=lt,pe=J,fe=m(t=>_t(t,ue()),"sanitizeText"),ge=Ut,me=m(()=>Zt,"getCommonDb"),ye={},xe=m((t,e,r)=>{ye[t]&&ce.warn(`Diagram with id ${t} already registered. Overwriting.`),ye[t]=e,r&&B(t,r),Xt(t,e.styles),e.injectUtils?.(ce,he,ue,fe,ge,me(),()=>{})},"registerDiagram"),be=m(t=>{if(t in ye)return ye[t];throw new ke(t)},"getDiagram"),ke=class extends Error{static{m(this,"DiagramNotFoundError")}constructor(t){super(`Diagram ${t} not found.`)}}},98332:(t,e,r)=>{"use strict";r.d(e,{A:()=>g});var n=r(36672),i=r(67797);function a(t){const e=t.map(t=>({...t,parentIndex:-1,children:[]})),r=Array(7).fill(-1);e.forEach((t,e)=>{const n=r.slice(2,t.level);t.parentIndex=Math.max(...n),r[t.level]=e});const n=[];return e.forEach(t=>{const{parentIndex:r,...i}=t;r>=0?e[r].children.push(i):n.push(i)}),n}function o({toc:t,minHeadingLevel:e,maxHeadingLevel:r}){return t.flatMap(t=>{const n=o({toc:t.children,minHeadingLevel:e,maxHeadingLevel:r});return function(t){return t.level>=e&&t.level<=r}(t)?[{...t,children:n}]:n})}function s(t){const e=t.getBoundingClientRect();return e.top===e.bottom?s(t.parentNode):e}function l(t,{anchorTopOffset:e}){const r=t.find(t=>s(t).top>=e);if(r){return function(t){return t.top>0&&t.bottom<window.innerHeight/2}(s(r))?r:t[t.indexOf(r)-1]??null}return t[t.length-1]??null}function c(){const t=(0,n.useRef)(0),{navbar:{hideOnScroll:e}}=(0,i.p)();return(0,n.useEffect)(()=>{t.current=e?0:document.querySelector(".navbar").clientHeight},[e]),t}function h(t){const e=(0,n.useRef)(void 0),r=c();(0,n.useEffect)(()=>{if(!t)return()=>{};const{linkClassName:n,linkActiveClassName:i,minHeadingLevel:a,maxHeadingLevel:o}=t;function s(){const t=function(t){return Array.from(document.getElementsByClassName(t))}(n),s=function({minHeadingLevel:t,maxHeadingLevel:e}){const r=[];for(let n=t;n<=e;n+=1)r.push(`h${n}.anchor`);return Array.from(document.querySelectorAll(r.join()))}({minHeadingLevel:a,maxHeadingLevel:o}),c=l(s,{anchorTopOffset:r.current}),h=t.find(t=>c&&c.id===function(t){return decodeURIComponent(t.href.substring(t.href.indexOf("#")+1))}(t));t.forEach(t=>{!function(t,r){r?(e.current&&e.current!==t&&e.current.classList.remove(i),t.classList.add(i),e.current=t):t.classList.remove(i)}(t,t===h)})}return document.addEventListener("scroll",s),document.addEventListener("resize",s),s(),()=>{document.removeEventListener("scroll",s),document.removeEventListener("resize",s)}},[t,r])}var u=r(75150),d=r(23420);function p({toc:t,className:e,linkClassName:r,isChild:n}){return t.length?(0,d.jsx)("ul",{className:n?void 0:e,children:t.map(t=>(0,d.jsxs)("li",{children:[(0,d.jsx)(u.A,{to:`#${t.id}`,className:r??void 0,dangerouslySetInnerHTML:{__html:t.value}}),(0,d.jsx)(p,{isChild:!0,toc:t.children,className:e,linkClassName:r})]},t.id))}):null}const f=n.memo(p);function g({toc:t,className:e="table-of-contents table-of-contents__left-border",linkClassName:r="table-of-contents__link",linkActiveClassName:s,minHeadingLevel:l,maxHeadingLevel:c,...u}){const p=(0,i.p)(),g=l??p.tableOfContents.minHeadingLevel,m=c??p.tableOfContents.maxHeadingLevel,y=function({toc:t,minHeadingLevel:e,maxHeadingLevel:r}){return(0,n.useMemo)(()=>o({toc:a(t),minHeadingLevel:e,maxHeadingLevel:r}),[t,e,r])}({toc:t,minHeadingLevel:g,maxHeadingLevel:m});return h((0,n.useMemo)(()=>{if(r&&s)return{linkClassName:r,linkActiveClassName:s,minHeadingLevel:g,maxHeadingLevel:m}},[r,s,g,m])),(0,d.jsx)(f,{toc:y,className:e,linkClassName:r,...u})}}}]); \ No newline at end of file diff --git a/assets/js/3287.4167c976.js.LICENSE.txt b/assets/js/3287.4167c976.js.LICENSE.txt new file mode 100644 index 0000000000..6e97ec6e05 --- /dev/null +++ b/assets/js/3287.4167c976.js.LICENSE.txt @@ -0,0 +1 @@ +/*! @license DOMPurify 3.2.6 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.6/LICENSE */ diff --git a/assets/js/3325f0a2.1e18f834.js b/assets/js/3325f0a2.1e18f834.js new file mode 100644 index 0000000000..177d21b1f8 --- /dev/null +++ b/assets/js/3325f0a2.1e18f834.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7141],{31347:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","source":"@site/versioned_docs/version-0.12.4/rules/compiler/unused_kapt_plugin.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/compiler/unused_kapt_plugin.md","tags":[],"version":"0.12.4","frontMatter":{"id":"unused_kapt_plugin","slug":"/rules/unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers"}}');var o=t(23420),u=t(65404);const r={id:"unused_kapt_plugin",slug:"/rules/unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,l={},c=[];function p(e){const n={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(n.p,{children:["If there are no ",(0,o.jsx)(n.code,{children:"kapt"}),"/",(0,o.jsx)(n.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in\napplying the ",(0,o.jsx)(n.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function d(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>i});var s=t(36672);const o={},u=s.createContext(o);function r(e){const n=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3346.011b0ace.js b/assets/js/3346.011b0ace.js new file mode 100644 index 0000000000..32d4c0fd4f --- /dev/null +++ b/assets/js/3346.011b0ace.js @@ -0,0 +1 @@ +(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3346],{7406:function(t,e,i){var n;n=function(t){return(()=>{"use strict";var e={658:t=>{t.exports=null!=Object.assign?Object.assign.bind(Object):function(t){for(var e=arguments.length,i=Array(e>1?e-1:0),n=1;n<e;n++)i[n-1]=arguments[n];return i.forEach(function(e){Object.keys(e).forEach(function(i){return t[i]=e[i]})}),t}},548:(t,e,i)=>{var n=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var i=[],n=!0,r=!1,o=void 0;try{for(var s,a=t[Symbol.iterator]();!(n=(s=a.next()).done)&&(i.push(s.value),!e||i.length!==e);n=!0);}catch(h){r=!0,o=h}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}return i}(t,e);throw new TypeError("Invalid attempt to destructure non-iterable instance")},r=i(140).layoutBase.LinkedList,o={getTopMostNodes:function(t){for(var e={},i=0;i<t.length;i++)e[t[i].id()]=!0;var n=t.filter(function(t,i){"number"==typeof t&&(t=i);for(var n=t.parent()[0];null!=n;){if(e[n.id()])return!1;n=n.parent()[0]}return!0});return n},connectComponents:function(t,e,i,n){var o=new r,s=new Set,a=[],h=void 0,l=void 0,c=void 0,d=!1,g=1,u=[],f=[],p=function(){var n=t.collection();f.push(n);var r=i[0],p=t.collection();p.merge(r).merge(r.descendants().intersection(e)),a.push(r),p.forEach(function(t){o.push(t),s.add(t),n.merge(t)});for(var v=function(){r=o.shift();var l=t.collection();r.neighborhood().nodes().forEach(function(t){e.intersection(r.edgesWith(t)).length>0&&l.merge(t)});for(var c=0;c<l.length;c++){var d=l[c];null==(h=i.intersection(d.union(d.ancestors())))||s.has(h[0])||h.union(h.descendants()).forEach(function(t){o.push(t),s.add(t),n.merge(t),i.has(t)&&a.push(t)})}};0!=o.length;)v();if(n.forEach(function(t){e.intersection(t.connectedEdges()).forEach(function(t){n.has(t.source())&&n.has(t.target())&&n.merge(t)})}),a.length==i.length&&(d=!0),!d||d&&g>1){l=a[0],c=l.connectedEdges().length,a.forEach(function(t){t.connectedEdges().length<c&&(c=t.connectedEdges().length,l=t)}),u.push(l.id());var y=t.collection();y.merge(a[0]),a.forEach(function(t){y.merge(t)}),a=[],i=i.difference(y),g++}};do{p()}while(!d);return n&&u.length>0&&n.set("dummy"+(n.size+1),u),f},relocateComponent:function(t,e,i){if(!i.fixedNodeConstraint){var r=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;if("draft"==i.quality){var h=!0,l=!1,c=void 0;try{for(var d,g=e.nodeIndexes[Symbol.iterator]();!(h=(d=g.next()).done);h=!0){var u=d.value,f=n(u,2),p=f[0],v=f[1],y=i.cy.getElementById(p);if(y){var m=y.boundingBox(),E=e.xCoords[v]-m.w/2,N=e.xCoords[v]+m.w/2,T=e.yCoords[v]-m.h/2,A=e.yCoords[v]+m.h/2;E<r&&(r=E),N>o&&(o=N),T<s&&(s=T),A>a&&(a=A)}}}catch(_){l=!0,c=_}finally{try{!h&&g.return&&g.return()}finally{if(l)throw c}}var w=t.x-(o+r)/2,L=t.y-(a+s)/2;e.xCoords=e.xCoords.map(function(t){return t+w}),e.yCoords=e.yCoords.map(function(t){return t+L})}else{Object.keys(e).forEach(function(t){var i=e[t],n=i.getRect().x,h=i.getRect().x+i.getRect().width,l=i.getRect().y,c=i.getRect().y+i.getRect().height;n<r&&(r=n),h>o&&(o=h),l<s&&(s=l),c>a&&(a=c)});var I=t.x-(o+r)/2,C=t.y-(a+s)/2;Object.keys(e).forEach(function(t){var i=e[t];i.setCenter(i.getCenterX()+I,i.getCenterY()+C)})}}},calcBoundingBox:function(t,e,i,n){for(var r=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER,s=Number.MAX_SAFE_INTEGER,a=Number.MIN_SAFE_INTEGER,h=void 0,l=void 0,c=void 0,d=void 0,g=t.descendants().not(":parent"),u=g.length,f=0;f<u;f++){var p=g[f];r>(h=e[n.get(p.id())]-p.width()/2)&&(r=h),o<(l=e[n.get(p.id())]+p.width()/2)&&(o=l),s>(c=i[n.get(p.id())]-p.height()/2)&&(s=c),a<(d=i[n.get(p.id())]+p.height()/2)&&(a=d)}var v={};return v.topLeftX=r,v.topLeftY=s,v.width=o-r,v.height=a-s,v},calcParentsWithoutChildren:function(t,e){var i=t.collection();return e.nodes(":parent").forEach(function(t){var e=!1;t.children().forEach(function(t){"none"!=t.css("display")&&(e=!0)}),e||i.merge(t)}),i}};t.exports=o},816:(t,e,i)=>{var n=i(548),r=i(140).CoSELayout,o=i(140).CoSENode,s=i(140).layoutBase.PointD,a=i(140).layoutBase.DimensionD,h=i(140).layoutBase.LayoutConstants,l=i(140).layoutBase.FDLayoutConstants,c=i(140).CoSEConstants;t.exports={coseLayout:function(t,e){var i=t.cy,d=t.eles,g=d.nodes(),u=d.edges(),f=void 0,p=void 0,v=void 0,y={};t.randomize&&(f=e.nodeIndexes,p=e.xCoords,v=e.yCoords);var m=function(t){return"function"==typeof t},E=function(t,e){return m(t)?t(e):t},N=n.calcParentsWithoutChildren(i,d);null!=t.nestingFactor&&(c.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=l.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=t.nestingFactor),null!=t.gravity&&(c.DEFAULT_GRAVITY_STRENGTH=l.DEFAULT_GRAVITY_STRENGTH=t.gravity),null!=t.numIter&&(c.MAX_ITERATIONS=l.MAX_ITERATIONS=t.numIter),null!=t.gravityRange&&(c.DEFAULT_GRAVITY_RANGE_FACTOR=l.DEFAULT_GRAVITY_RANGE_FACTOR=t.gravityRange),null!=t.gravityCompound&&(c.DEFAULT_COMPOUND_GRAVITY_STRENGTH=l.DEFAULT_COMPOUND_GRAVITY_STRENGTH=t.gravityCompound),null!=t.gravityRangeCompound&&(c.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=t.gravityRangeCompound),null!=t.initialEnergyOnIncremental&&(c.DEFAULT_COOLING_FACTOR_INCREMENTAL=l.DEFAULT_COOLING_FACTOR_INCREMENTAL=t.initialEnergyOnIncremental),null!=t.tilingCompareBy&&(c.TILING_COMPARE_BY=t.tilingCompareBy),"proof"==t.quality?h.QUALITY=2:h.QUALITY=0,c.NODE_DIMENSIONS_INCLUDE_LABELS=l.NODE_DIMENSIONS_INCLUDE_LABELS=h.NODE_DIMENSIONS_INCLUDE_LABELS=t.nodeDimensionsIncludeLabels,c.DEFAULT_INCREMENTAL=l.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!t.randomize,c.ANIMATE=l.ANIMATE=h.ANIMATE=t.animate,c.TILE=t.tile,c.TILING_PADDING_VERTICAL="function"==typeof t.tilingPaddingVertical?t.tilingPaddingVertical.call():t.tilingPaddingVertical,c.TILING_PADDING_HORIZONTAL="function"==typeof t.tilingPaddingHorizontal?t.tilingPaddingHorizontal.call():t.tilingPaddingHorizontal,c.DEFAULT_INCREMENTAL=l.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!0,c.PURE_INCREMENTAL=!t.randomize,h.DEFAULT_UNIFORM_LEAF_NODE_SIZES=t.uniformNodeDimensions,"transformed"==t.step&&(c.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,c.ENFORCE_CONSTRAINTS=!1,c.APPLY_LAYOUT=!1),"enforced"==t.step&&(c.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,c.ENFORCE_CONSTRAINTS=!0,c.APPLY_LAYOUT=!1),"cose"==t.step&&(c.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,c.ENFORCE_CONSTRAINTS=!1,c.APPLY_LAYOUT=!0),"all"==t.step&&(t.randomize?c.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:c.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,c.ENFORCE_CONSTRAINTS=!0,c.APPLY_LAYOUT=!0),t.fixedNodeConstraint||t.alignmentConstraint||t.relativePlacementConstraint?c.TREE_REDUCTION_ON_INCREMENTAL=!1:c.TREE_REDUCTION_ON_INCREMENTAL=!0;var T=new r,A=T.newGraphManager();return function t(e,i,r,h){for(var l=i.length,c=0;c<l;c++){var d=i[c],g=null;0==d.intersection(N).length&&(g=d.children());var u=void 0,m=d.layoutDimensions({nodeDimensionsIncludeLabels:h.nodeDimensionsIncludeLabels});if(null!=d.outerWidth()&&null!=d.outerHeight())if(h.randomize)if(d.isParent()){var T=n.calcBoundingBox(d,p,v,f);u=0==d.intersection(N).length?e.add(new o(r.graphManager,new s(T.topLeftX,T.topLeftY),new a(T.width,T.height))):e.add(new o(r.graphManager,new s(T.topLeftX,T.topLeftY),new a(parseFloat(m.w),parseFloat(m.h))))}else u=e.add(new o(r.graphManager,new s(p[f.get(d.id())]-m.w/2,v[f.get(d.id())]-m.h/2),new a(parseFloat(m.w),parseFloat(m.h))));else u=e.add(new o(r.graphManager,new s(d.position("x")-m.w/2,d.position("y")-m.h/2),new a(parseFloat(m.w),parseFloat(m.h))));else u=e.add(new o(this.graphManager));u.id=d.data("id"),u.nodeRepulsion=E(h.nodeRepulsion,d),u.paddingLeft=parseInt(d.css("padding")),u.paddingTop=parseInt(d.css("padding")),u.paddingRight=parseInt(d.css("padding")),u.paddingBottom=parseInt(d.css("padding")),h.nodeDimensionsIncludeLabels&&(u.labelWidth=d.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).w,u.labelHeight=d.boundingBox({includeLabels:!0,includeNodes:!1,includeOverlays:!1}).h,u.labelPosVertical=d.css("text-valign"),u.labelPosHorizontal=d.css("text-halign")),y[d.data("id")]=u,isNaN(u.rect.x)&&(u.rect.x=0),isNaN(u.rect.y)&&(u.rect.y=0),null!=g&&g.length>0&&t(r.getGraphManager().add(r.newGraph(),u),g,r,h)}}(A.addRoot(),n.getTopMostNodes(g),T,t),function(e,i,n){for(var r=0,o=0,s=0;s<n.length;s++){var a=n[s],h=y[a.data("source")],d=y[a.data("target")];if(h&&d&&h!==d&&0==h.getEdgesBetween(d).length){var g=i.add(e.newEdge(),h,d);g.id=a.id(),g.idealLength=E(t.idealEdgeLength,a),g.edgeElasticity=E(t.edgeElasticity,a),r+=g.idealLength,o++}}null!=t.idealEdgeLength&&(o>0?c.DEFAULT_EDGE_LENGTH=l.DEFAULT_EDGE_LENGTH=r/o:m(t.idealEdgeLength)?c.DEFAULT_EDGE_LENGTH=l.DEFAULT_EDGE_LENGTH=50:c.DEFAULT_EDGE_LENGTH=l.DEFAULT_EDGE_LENGTH=t.idealEdgeLength,c.MIN_REPULSION_DIST=l.MIN_REPULSION_DIST=l.DEFAULT_EDGE_LENGTH/10,c.DEFAULT_RADIAL_SEPARATION=l.DEFAULT_EDGE_LENGTH)}(T,A,u),function(t,e){e.fixedNodeConstraint&&(t.constraints.fixedNodeConstraint=e.fixedNodeConstraint),e.alignmentConstraint&&(t.constraints.alignmentConstraint=e.alignmentConstraint),e.relativePlacementConstraint&&(t.constraints.relativePlacementConstraint=e.relativePlacementConstraint)}(T,t),T.runLayout(),y}}},212:(t,e,i)=>{var n=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=i(658),o=i(548),s=i(657).spectralLayout,a=i(816).coseLayout,h=Object.freeze({quality:"default",randomize:!0,animate:!0,animationDuration:1e3,animationEasing:void 0,fit:!0,padding:30,nodeDimensionsIncludeLabels:!1,uniformNodeDimensions:!1,packComponents:!0,step:"all",samplingType:!0,sampleSize:25,nodeSeparation:75,piTol:1e-7,nodeRepulsion:function(t){return 4500},idealEdgeLength:function(t){return 50},edgeElasticity:function(t){return.45},nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,tilingCompareBy:void 0,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.3,fixedNodeConstraint:void 0,alignmentConstraint:void 0,relativePlacementConstraint:void 0,ready:function(){},stop:function(){}}),l=function(){function t(e){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.options=r({},h,e)}return n(t,[{key:"run",value:function(){var t=this.options,e=t.cy,i=t.eles,n=[],r=[],h=void 0,l=[];!t.fixedNodeConstraint||Array.isArray(t.fixedNodeConstraint)&&0!=t.fixedNodeConstraint.length||(t.fixedNodeConstraint=void 0),t.alignmentConstraint&&(!t.alignmentConstraint.vertical||Array.isArray(t.alignmentConstraint.vertical)&&0!=t.alignmentConstraint.vertical.length||(t.alignmentConstraint.vertical=void 0),!t.alignmentConstraint.horizontal||Array.isArray(t.alignmentConstraint.horizontal)&&0!=t.alignmentConstraint.horizontal.length||(t.alignmentConstraint.horizontal=void 0)),!t.relativePlacementConstraint||Array.isArray(t.relativePlacementConstraint)&&0!=t.relativePlacementConstraint.length||(t.relativePlacementConstraint=void 0),(t.fixedNodeConstraint||t.alignmentConstraint||t.relativePlacementConstraint)&&(t.tile=!1,t.packComponents=!1);var c=void 0,d=!1;if(e.layoutUtilities&&t.packComponents&&((c=e.layoutUtilities("get"))||(c=e.layoutUtilities()),d=!0),i.nodes().length>0)if(d){var g=o.getTopMostNodes(t.eles.nodes());if((h=o.connectComponents(e,t.eles,g)).forEach(function(t){var e=t.boundingBox();l.push({x:e.x1+e.w/2,y:e.y1+e.h/2})}),t.randomize&&h.forEach(function(e){t.eles=e,n.push(s(t))}),"default"==t.quality||"proof"==t.quality){var u=e.collection();if(t.tile){var f=new Map,p=0,v={nodeIndexes:f,xCoords:[],yCoords:[]},y=[];if(h.forEach(function(t,e){0==t.edges().length&&(t.nodes().forEach(function(e,i){u.merge(t.nodes()[i]),e.isParent()||(v.nodeIndexes.set(t.nodes()[i].id(),p++),v.xCoords.push(t.nodes()[0].position().x),v.yCoords.push(t.nodes()[0].position().y))}),y.push(e))}),u.length>1){var m=u.boundingBox();l.push({x:m.x1+m.w/2,y:m.y1+m.h/2}),h.push(u),n.push(v);for(var E=y.length-1;E>=0;E--)h.splice(y[E],1),n.splice(y[E],1),l.splice(y[E],1)}}h.forEach(function(e,i){t.eles=e,r.push(a(t,n[i])),o.relocateComponent(l[i],r[i],t)})}else h.forEach(function(e,i){o.relocateComponent(l[i],n[i],t)});var N=new Set;if(h.length>1){var T=[],A=i.filter(function(t){return"none"==t.css("display")});h.forEach(function(e,i){var s=void 0;if("draft"==t.quality&&(s=n[i].nodeIndexes),e.nodes().not(A).length>0){var a={edges:[],nodes:[]},h=void 0;e.nodes().not(A).forEach(function(e){if("draft"==t.quality)if(e.isParent()){var l=o.calcBoundingBox(e,n[i].xCoords,n[i].yCoords,s);a.nodes.push({x:l.topLeftX,y:l.topLeftY,width:l.width,height:l.height})}else h=s.get(e.id()),a.nodes.push({x:n[i].xCoords[h]-e.boundingbox().w/2,y:n[i].yCoords[h]-e.boundingbox().h/2,width:e.boundingbox().w,height:e.boundingbox().h});else r[i][e.id()]&&a.nodes.push({x:r[i][e.id()].getLeft(),y:r[i][e.id()].getTop(),width:r[i][e.id()].getWidth(),height:r[i][e.id()].getHeight()})}),e.edges().forEach(function(e){var h=e.source(),l=e.target();if("none"!=h.css("display")&&"none"!=l.css("display"))if("draft"==t.quality){var c=s.get(h.id()),d=s.get(l.id()),g=[],u=[];if(h.isParent()){var f=o.calcBoundingBox(h,n[i].xCoords,n[i].yCoords,s);g.push(f.topLeftX+f.width/2),g.push(f.topLeftY+f.height/2)}else g.push(n[i].xCoords[c]),g.push(n[i].yCoords[c]);if(l.isParent()){var p=o.calcBoundingBox(l,n[i].xCoords,n[i].yCoords,s);u.push(p.topLeftX+p.width/2),u.push(p.topLeftY+p.height/2)}else u.push(n[i].xCoords[d]),u.push(n[i].yCoords[d]);a.edges.push({startX:g[0],startY:g[1],endX:u[0],endY:u[1]})}else r[i][h.id()]&&r[i][l.id()]&&a.edges.push({startX:r[i][h.id()].getCenterX(),startY:r[i][h.id()].getCenterY(),endX:r[i][l.id()].getCenterX(),endY:r[i][l.id()].getCenterY()})}),a.nodes.length>0&&(T.push(a),N.add(i))}});var w=c.packComponents(T,t.randomize).shifts;if("draft"==t.quality)n.forEach(function(t,e){var i=t.xCoords.map(function(t){return t+w[e].dx}),n=t.yCoords.map(function(t){return t+w[e].dy});t.xCoords=i,t.yCoords=n});else{var L=0;N.forEach(function(t){Object.keys(r[t]).forEach(function(e){var i=r[t][e];i.setCenter(i.getCenterX()+w[L].dx,i.getCenterY()+w[L].dy)}),L++})}}}else{var I=t.eles.boundingBox();if(l.push({x:I.x1+I.w/2,y:I.y1+I.h/2}),t.randomize){var C=s(t);n.push(C)}"default"==t.quality||"proof"==t.quality?(r.push(a(t,n[0])),o.relocateComponent(l[0],r[0],t)):o.relocateComponent(l[0],n[0],t)}var _=function(e,i){if("default"==t.quality||"proof"==t.quality){"number"==typeof e&&(e=i);var o=void 0,s=void 0,a=e.data("id");return r.forEach(function(t){a in t&&(o={x:t[a].getRect().getCenterX(),y:t[a].getRect().getCenterY()},s=t[a])}),t.nodeDimensionsIncludeLabels&&(s.labelWidth&&("left"==s.labelPosHorizontal?o.x+=s.labelWidth/2:"right"==s.labelPosHorizontal&&(o.x-=s.labelWidth/2)),s.labelHeight&&("top"==s.labelPosVertical?o.y+=s.labelHeight/2:"bottom"==s.labelPosVertical&&(o.y-=s.labelHeight/2))),null==o&&(o={x:e.position("x"),y:e.position("y")}),{x:o.x,y:o.y}}var h=void 0;return n.forEach(function(t){var i=t.nodeIndexes.get(e.id());null!=i&&(h={x:t.xCoords[i],y:t.yCoords[i]})}),null==h&&(h={x:e.position("x"),y:e.position("y")}),{x:h.x,y:h.y}};if("default"==t.quality||"proof"==t.quality||t.randomize){var M=o.calcParentsWithoutChildren(e,i),x=i.filter(function(t){return"none"==t.css("display")});t.eles=i.not(x),i.nodes().not(":parent").not(x).layoutPositions(this,t,_),M.length>0&&M.forEach(function(t){t.position(_(t))})}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")}}]),t}();t.exports=l},657:(t,e,i)=>{var n=i(548),r=i(140).layoutBase.Matrix,o=i(140).layoutBase.SVD;t.exports={spectralLayout:function(t){var e=t.cy,i=t.eles,s=i.nodes(),a=i.nodes(":parent"),h=new Map,l=new Map,c=new Map,d=[],g=[],u=[],f=[],p=[],v=[],y=[],m=[],E=void 0,N=1e8,T=1e-9,A=t.piTol,w=t.samplingType,L=t.nodeSeparation,I=void 0,C=function(t,e,i){for(var n=[],r=0,o=0,s=0,a=void 0,h=[],c=0,g=1,u=0;u<E;u++)h[u]=N;for(n[o]=t,h[t]=0;o>=r;){s=n[r++];for(var f=d[s],y=0;y<f.length;y++)h[a=l.get(f[y])]==N&&(h[a]=h[s]+1,n[++o]=a);v[s][e]=h[s]*L}if(i){for(var m=0;m<E;m++)v[m][e]<p[m]&&(p[m]=v[m][e]);for(var T=0;T<E;T++)p[T]>c&&(c=p[T],g=T)}return g};n.connectComponents(e,i,n.getTopMostNodes(s),h),a.forEach(function(t){n.connectComponents(e,i,n.getTopMostNodes(t.descendants().intersection(i)),h)});for(var _=0,M=0;M<s.length;M++)s[M].isParent()||l.set(s[M].id(),_++);var x=!0,O=!1,D=void 0;try{for(var R,b=h.keys()[Symbol.iterator]();!(x=(R=b.next()).done);x=!0){var G=R.value;l.set(G,_++)}}catch(K){O=!0,D=K}finally{try{!x&&b.return&&b.return()}finally{if(O)throw D}}for(var F=0;F<l.size;F++)d[F]=[];a.forEach(function(t){for(var e=t.children().intersection(i);0==e.nodes(":childless").length;)e=e.nodes()[0].children().intersection(i);var n=0,r=e.nodes(":childless")[0].connectedEdges().length;e.nodes(":childless").forEach(function(t,e){t.connectedEdges().length<r&&(r=t.connectedEdges().length,n=e)}),c.set(t.id(),e.nodes(":childless")[n].id())}),s.forEach(function(t){var e=void 0;e=t.isParent()?l.get(c.get(t.id())):l.get(t.id()),t.neighborhood().nodes().forEach(function(n){i.intersection(t.edgesWith(n)).length>0&&(n.isParent()?d[e].push(c.get(n.id())):d[e].push(n.id()))})});var S=function(t){var i=l.get(t),n=void 0;h.get(t).forEach(function(r){n=e.getElementById(r).isParent()?c.get(r):r,d[i].push(n),d[l.get(n)].push(t)})},P=!0,U=!1,Y=void 0;try{for(var k,H=h.keys()[Symbol.iterator]();!(P=(k=H.next()).done);P=!0)S(k.value)}catch(K){U=!0,Y=K}finally{try{!P&&H.return&&H.return()}finally{if(U)throw Y}}var X=void 0;if((E=l.size)>2){I=E<t.sampleSize?E:t.sampleSize;for(var z=0;z<E;z++)v[z]=[];for(var V=0;V<I;V++)m[V]=[];return"draft"==t.quality||"all"==t.step?(function(t){var e=void 0;if(t){e=Math.floor(Math.random()*E);for(var i=0;i<E;i++)p[i]=N;for(var n=0;n<I;n++)f[n]=e,e=C(e,n,t)}else{!function(){for(var t=0,e=0,i=!1;e<I;){t=Math.floor(Math.random()*E),i=!1;for(var n=0;n<e;n++)if(f[n]==t){i=!0;break}i||(f[e]=t,e++)}}();for(var r=0;r<I;r++)C(f[r],r,t)}for(var o=0;o<E;o++)for(var s=0;s<I;s++)v[o][s]*=v[o][s];for(var a=0;a<I;a++)y[a]=[];for(var h=0;h<I;h++)for(var l=0;l<I;l++)y[h][l]=v[f[l]][h]}(w),function(){for(var t=o.svd(y),e=t.S,i=t.U,n=t.V,s=e[0]*e[0]*e[0],a=[],h=0;h<I;h++){a[h]=[];for(var l=0;l<I;l++)a[h][l]=0,h==l&&(a[h][l]=e[h]/(e[h]*e[h]+s/(e[h]*e[h])))}m=r.multMat(r.multMat(n,a),r.transpose(i))}(),function(){for(var t=void 0,e=void 0,i=[],n=[],o=[],s=[],a=0;a<E;a++)i[a]=Math.random(),n[a]=Math.random();i=r.normalize(i),n=r.normalize(n);for(var h=T,l=T,c=void 0;;){for(var d=0;d<E;d++)o[d]=i[d];if(i=r.multGamma(r.multL(r.multGamma(o),v,m)),t=r.dotProduct(o,i),i=r.normalize(i),h=r.dotProduct(o,i),(c=Math.abs(h/l))<=1+A&&c>=1)break;l=h}for(var f=0;f<E;f++)o[f]=i[f];for(l=T;;){for(var p=0;p<E;p++)s[p]=n[p];if(s=r.minusOp(s,r.multCons(o,r.dotProduct(o,s))),n=r.multGamma(r.multL(r.multGamma(s),v,m)),e=r.dotProduct(s,n),n=r.normalize(n),h=r.dotProduct(s,n),(c=Math.abs(h/l))<=1+A&&c>=1)break;l=h}for(var y=0;y<E;y++)s[y]=n[y];g=r.multCons(o,Math.sqrt(Math.abs(t))),u=r.multCons(s,Math.sqrt(Math.abs(e)))}(),X={nodeIndexes:l,xCoords:g,yCoords:u}):(l.forEach(function(t,i){g.push(e.getElementById(i).position("x")),u.push(e.getElementById(i).position("y"))}),X={nodeIndexes:l,xCoords:g,yCoords:u}),X}var B=l.keys(),W=e.getElementById(B.next().value),j=W.position(),$=W.outerWidth();if(g.push(j.x),u.push(j.y),2==E){var q=e.getElementById(B.next().value).outerWidth();g.push(j.x+$/2+q/2+t.idealEdgeLength),u.push(j.y)}return X={nodeIndexes:l,xCoords:g,yCoords:u}}}},579:(t,e,i)=>{var n=i(212),r=function(t){t&&t("layout","fcose",n)};"undefined"!=typeof cytoscape&&r(cytoscape),t.exports=r},140:e=>{e.exports=t}},i={},n=function t(n){var r=i[n];if(void 0!==r)return r.exports;var o=i[n]={exports:{}};return e[n](o,o.exports,t),o.exports}(579);return n})()},t.exports=n(i(57601))},22318:function(t){var e;e=function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=28)}([function(t,e,i){"use strict";function n(){}n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,i){"use strict";var n=i(2),r=i(8),o=i(9);function s(t,e,i){n.call(this,i),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=i,this.bendpoints=[],this.source=t,this.target=e}for(var a in s.prototype=Object.create(n.prototype),n)s[a]=n[a];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(t){if(this.source===t)return this.target;if(this.target===t)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(t,e){for(var i=this.getOtherEnd(t),n=e.getGraphManager().getRoot();;){if(i.getOwner()==e)return i;if(i.getOwner()==n)break;i=i.getOwner().getParent()}return null},s.prototype.updateLength=function(){var t=new Array(4);this.isOverlapingSourceAndTarget=r.getIntersection(this.target.getRect(),this.source.getRect(),t),this.isOverlapingSourceAndTarget||(this.lengthX=t[0]-t[2],this.lengthY=t[1]-t[3],Math.abs(this.lengthX)<1&&(this.lengthX=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.prototype.updateLengthSimple=function(){this.lengthX=this.target.getCenterX()-this.source.getCenterX(),this.lengthY=this.target.getCenterY()-this.source.getCenterY(),Math.abs(this.lengthX)<1&&(this.lengthX=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,i){"use strict";t.exports=function(t){this.vGraphObject=t}},function(t,e,i){"use strict";var n=i(2),r=i(10),o=i(13),s=i(0),a=i(16),h=i(5);function l(t,e,i,s){null==i&&null==s&&(s=e),n.call(this,s),null!=t.graphManager&&(t=t.graphManager),this.estimatedSize=r.MIN_VALUE,this.inclusionTreeDepth=r.MAX_VALUE,this.vGraphObject=s,this.edges=[],this.graphManager=t,this.rect=null!=i&&null!=e?new o(e.x,e.y,i.width,i.height):new o}for(var c in l.prototype=Object.create(n.prototype),n)l[c]=n[c];l.prototype.getEdges=function(){return this.edges},l.prototype.getChild=function(){return this.child},l.prototype.getOwner=function(){return this.owner},l.prototype.getWidth=function(){return this.rect.width},l.prototype.setWidth=function(t){this.rect.width=t},l.prototype.getHeight=function(){return this.rect.height},l.prototype.setHeight=function(t){this.rect.height=t},l.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},l.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},l.prototype.getCenter=function(){return new h(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},l.prototype.getLocation=function(){return new h(this.rect.x,this.rect.y)},l.prototype.getRect=function(){return this.rect},l.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},l.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},l.prototype.setRect=function(t,e){this.rect.x=t.x,this.rect.y=t.y,this.rect.width=e.width,this.rect.height=e.height},l.prototype.setCenter=function(t,e){this.rect.x=t-this.rect.width/2,this.rect.y=e-this.rect.height/2},l.prototype.setLocation=function(t,e){this.rect.x=t,this.rect.y=e},l.prototype.moveBy=function(t,e){this.rect.x+=t,this.rect.y+=e},l.prototype.getEdgeListToNode=function(t){var e=[],i=this;return i.edges.forEach(function(n){if(n.target==t){if(n.source!=i)throw"Incorrect edge source!";e.push(n)}}),e},l.prototype.getEdgesBetween=function(t){var e=[],i=this;return i.edges.forEach(function(n){if(n.source!=i&&n.target!=i)throw"Incorrect edge source and/or target";n.target!=t&&n.source!=t||e.push(n)}),e},l.prototype.getNeighborsList=function(){var t=new Set,e=this;return e.edges.forEach(function(i){if(i.source==e)t.add(i.target);else{if(i.target!=e)throw"Incorrect incidency!";t.add(i.source)}}),t},l.prototype.withChildren=function(){var t=new Set;if(t.add(this),null!=this.child)for(var e=this.child.getNodes(),i=0;i<e.length;i++)e[i].withChildren().forEach(function(e){t.add(e)});return t},l.prototype.getNoOfChildren=function(){var t=0;if(null==this.child)t=1;else for(var e=this.child.getNodes(),i=0;i<e.length;i++)t+=e[i].getNoOfChildren();return 0==t&&(t=1),t},l.prototype.getEstimatedSize=function(){if(this.estimatedSize==r.MIN_VALUE)throw"assert failed";return this.estimatedSize},l.prototype.calcEstimatedSize=function(){return null==this.child?this.estimatedSize=(this.rect.width+this.rect.height)/2:(this.estimatedSize=this.child.calcEstimatedSize(),this.rect.width=this.estimatedSize,this.rect.height=this.estimatedSize,this.estimatedSize)},l.prototype.scatter=function(){var t,e,i=-s.INITIAL_WORLD_BOUNDARY,n=s.INITIAL_WORLD_BOUNDARY;t=s.WORLD_CENTER_X+a.nextDouble()*(n-i)+i;var r=-s.INITIAL_WORLD_BOUNDARY,o=s.INITIAL_WORLD_BOUNDARY;e=s.WORLD_CENTER_Y+a.nextDouble()*(o-r)+r,this.rect.x=t,this.rect.y=e},l.prototype.updateBounds=function(){if(null==this.getChild())throw"assert failed";if(0!=this.getChild().getNodes().length){var t=this.getChild();if(t.updateBounds(!0),this.rect.x=t.getLeft(),this.rect.y=t.getTop(),this.setWidth(t.getRight()-t.getLeft()),this.setHeight(t.getBottom()-t.getTop()),s.NODE_DIMENSIONS_INCLUDE_LABELS){var e=t.getRight()-t.getLeft(),i=t.getBottom()-t.getTop();this.labelWidth&&("left"==this.labelPosHorizontal?(this.rect.x-=this.labelWidth,this.setWidth(e+this.labelWidth)):"center"==this.labelPosHorizontal&&this.labelWidth>e?(this.rect.x-=(this.labelWidth-e)/2,this.setWidth(this.labelWidth)):"right"==this.labelPosHorizontal&&this.setWidth(e+this.labelWidth)),this.labelHeight&&("top"==this.labelPosVertical?(this.rect.y-=this.labelHeight,this.setHeight(i+this.labelHeight)):"center"==this.labelPosVertical&&this.labelHeight>i?(this.rect.y-=(this.labelHeight-i)/2,this.setHeight(this.labelHeight)):"bottom"==this.labelPosVertical&&this.setHeight(i+this.labelHeight))}}},l.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==r.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},l.prototype.transform=function(t){var e=this.rect.x;e>s.WORLD_BOUNDARY?e=s.WORLD_BOUNDARY:e<-s.WORLD_BOUNDARY&&(e=-s.WORLD_BOUNDARY);var i=this.rect.y;i>s.WORLD_BOUNDARY?i=s.WORLD_BOUNDARY:i<-s.WORLD_BOUNDARY&&(i=-s.WORLD_BOUNDARY);var n=new h(e,i),r=t.inverseTransformPoint(n);this.setLocation(r.x,r.y)},l.prototype.getLeft=function(){return this.rect.x},l.prototype.getRight=function(){return this.rect.x+this.rect.width},l.prototype.getTop=function(){return this.rect.y},l.prototype.getBottom=function(){return this.rect.y+this.rect.height},l.prototype.getParent=function(){return null==this.owner?null:this.owner.getParent()},t.exports=l},function(t,e,i){"use strict";var n=i(0);function r(){}for(var o in n)r[o]=n[o];r.MAX_ITERATIONS=2500,r.DEFAULT_EDGE_LENGTH=50,r.DEFAULT_SPRING_STRENGTH=.45,r.DEFAULT_REPULSION_STRENGTH=4500,r.DEFAULT_GRAVITY_STRENGTH=.4,r.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,r.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,r.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,r.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,r.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,r.COOLING_ADAPTATION_FACTOR=.33,r.ADAPTATION_LOWER_NODE_LIMIT=1e3,r.ADAPTATION_UPPER_NODE_LIMIT=5e3,r.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,r.MAX_NODE_DISPLACEMENT=3*r.MAX_NODE_DISPLACEMENT_INCREMENTAL,r.MIN_REPULSION_DIST=r.DEFAULT_EDGE_LENGTH/10,r.CONVERGENCE_CHECK_PERIOD=100,r.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,r.MIN_EDGE_LENGTH=1,r.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=r},function(t,e,i){"use strict";function n(t,e){null==t&&null==e?(this.x=0,this.y=0):(this.x=t,this.y=e)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(t){this.x=t},n.prototype.setY=function(t){this.y=t},n.prototype.getDifference=function(t){return new DimensionD(this.x-t.x,this.y-t.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(t){return this.x+=t.width,this.y+=t.height,this},t.exports=n},function(t,e,i){"use strict";var n=i(2),r=i(10),o=i(0),s=i(7),a=i(3),h=i(1),l=i(13),c=i(12),d=i(11);function g(t,e,i){n.call(this,i),this.estimatedSize=r.MIN_VALUE,this.margin=o.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=t,null!=e&&e instanceof s?this.graphManager=e:null!=e&&e instanceof Layout&&(this.graphManager=e.graphManager)}for(var u in g.prototype=Object.create(n.prototype),n)g[u]=n[u];g.prototype.getNodes=function(){return this.nodes},g.prototype.getEdges=function(){return this.edges},g.prototype.getGraphManager=function(){return this.graphManager},g.prototype.getParent=function(){return this.parent},g.prototype.getLeft=function(){return this.left},g.prototype.getRight=function(){return this.right},g.prototype.getTop=function(){return this.top},g.prototype.getBottom=function(){return this.bottom},g.prototype.isConnected=function(){return this.isConnected},g.prototype.add=function(t,e,i){if(null==e&&null==i){var n=t;if(null==this.graphManager)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(n)>-1)throw"Node already in graph!";return n.owner=this,this.getNodes().push(n),n}var r=t;if(!(this.getNodes().indexOf(e)>-1&&this.getNodes().indexOf(i)>-1))throw"Source or target not in graph!";if(e.owner!=i.owner||e.owner!=this)throw"Both owners must be this graph!";return e.owner!=i.owner?null:(r.source=e,r.target=i,r.isInterGraph=!1,this.getEdges().push(r),e.edges.push(r),i!=e&&i.edges.push(r),r)},g.prototype.remove=function(t){var e=t;if(t instanceof a){if(null==e)throw"Node is null!";if(null==e.owner||e.owner!=this)throw"Owner graph is invalid!";if(null==this.graphManager)throw"Owner graph manager is invalid!";for(var i=e.edges.slice(),n=i.length,r=0;r<n;r++)(o=i[r]).isInterGraph?this.graphManager.remove(o):o.source.owner.remove(o);if(-1==(s=this.nodes.indexOf(e)))throw"Node not in owner node list!";this.nodes.splice(s,1)}else if(t instanceof h){var o;if(null==(o=t))throw"Edge is null!";if(null==o.source||null==o.target)throw"Source and/or target is null!";if(null==o.source.owner||null==o.target.owner||o.source.owner!=this||o.target.owner!=this)throw"Source and/or target owner is invalid!";var s,l=o.source.edges.indexOf(o),c=o.target.edges.indexOf(o);if(!(l>-1&&c>-1))throw"Source and/or target doesn't know this edge!";if(o.source.edges.splice(l,1),o.target!=o.source&&o.target.edges.splice(c,1),-1==(s=o.source.owner.getEdges().indexOf(o)))throw"Not in owner's edge list!";o.source.owner.getEdges().splice(s,1)}},g.prototype.updateLeftTop=function(){for(var t,e,i,n=r.MAX_VALUE,o=r.MAX_VALUE,s=this.getNodes(),a=s.length,h=0;h<a;h++){var l=s[h];n>(t=l.getTop())&&(n=t),o>(e=l.getLeft())&&(o=e)}return n==r.MAX_VALUE?null:(i=null!=s[0].getParent().paddingLeft?s[0].getParent().paddingLeft:this.margin,this.left=o-i,this.top=n-i,new c(this.left,this.top))},g.prototype.updateBounds=function(t){for(var e,i,n,o,s,a=r.MAX_VALUE,h=-r.MAX_VALUE,c=r.MAX_VALUE,d=-r.MAX_VALUE,g=this.nodes,u=g.length,f=0;f<u;f++){var p=g[f];t&&null!=p.child&&p.updateBounds(),a>(e=p.getLeft())&&(a=e),h<(i=p.getRight())&&(h=i),c>(n=p.getTop())&&(c=n),d<(o=p.getBottom())&&(d=o)}var v=new l(a,c,h-a,d-c);a==r.MAX_VALUE&&(this.left=this.parent.getLeft(),this.right=this.parent.getRight(),this.top=this.parent.getTop(),this.bottom=this.parent.getBottom()),s=null!=g[0].getParent().paddingLeft?g[0].getParent().paddingLeft:this.margin,this.left=v.x-s,this.right=v.x+v.width+s,this.top=v.y-s,this.bottom=v.y+v.height+s},g.calculateBounds=function(t){for(var e,i,n,o,s=r.MAX_VALUE,a=-r.MAX_VALUE,h=r.MAX_VALUE,c=-r.MAX_VALUE,d=t.length,g=0;g<d;g++){var u=t[g];s>(e=u.getLeft())&&(s=e),a<(i=u.getRight())&&(a=i),h>(n=u.getTop())&&(h=n),c<(o=u.getBottom())&&(c=o)}return new l(s,h,a-s,c-h)},g.prototype.getInclusionTreeDepth=function(){return this==this.graphManager.getRoot()?1:this.parent.getInclusionTreeDepth()},g.prototype.getEstimatedSize=function(){if(this.estimatedSize==r.MIN_VALUE)throw"assert failed";return this.estimatedSize},g.prototype.calcEstimatedSize=function(){for(var t=0,e=this.nodes,i=e.length,n=0;n<i;n++)t+=e[n].calcEstimatedSize();return this.estimatedSize=0==t?o.EMPTY_COMPOUND_NODE_SIZE:t/Math.sqrt(this.nodes.length),this.estimatedSize},g.prototype.updateConnected=function(){var t=this;if(0!=this.nodes.length){var e,i,n=new d,r=new Set,o=this.nodes[0];for(o.withChildren().forEach(function(t){n.push(t),r.add(t)});0!==n.length;)for(var s=(e=(o=n.shift()).getEdges()).length,a=0;a<s;a++)null==(i=e[a].getOtherEndInGraph(o,this))||r.has(i)||i.withChildren().forEach(function(t){n.push(t),r.add(t)});if(this.isConnected=!1,r.size>=this.nodes.length){var h=0;r.forEach(function(e){e.owner==t&&h++}),h==this.nodes.length&&(this.isConnected=!0)}}else this.isConnected=!0},t.exports=g},function(t,e,i){"use strict";var n,r=i(1);function o(t){n=i(6),this.layout=t,this.graphs=[],this.edges=[]}o.prototype.addRoot=function(){var t=this.layout.newGraph(),e=this.layout.newNode(null),i=this.add(t,e);return this.setRootGraph(i),this.rootGraph},o.prototype.add=function(t,e,i,n,r){if(null==i&&null==n&&null==r){if(null==t)throw"Graph is null!";if(null==e)throw"Parent node is null!";if(this.graphs.indexOf(t)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(t),null!=t.parent)throw"Already has a parent!";if(null!=e.child)throw"Already has a child!";return t.parent=e,e.child=t,t}r=i,i=t;var o=(n=e).getOwner(),s=r.getOwner();if(null==o||o.getGraphManager()!=this)throw"Source not in this graph mgr!";if(null==s||s.getGraphManager()!=this)throw"Target not in this graph mgr!";if(o==s)return i.isInterGraph=!1,o.add(i,n,r);if(i.isInterGraph=!0,i.source=n,i.target=r,this.edges.indexOf(i)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(i),null==i.source||null==i.target)throw"Edge source and/or target is null!";if(-1!=i.source.edges.indexOf(i)||-1!=i.target.edges.indexOf(i))throw"Edge already in source and/or target incidency list!";return i.source.edges.push(i),i.target.edges.push(i),i},o.prototype.remove=function(t){if(t instanceof n){var e=t;if(e.getGraphManager()!=this)throw"Graph not in this graph mgr";if(e!=this.rootGraph&&(null==e.parent||e.parent.graphManager!=this))throw"Invalid parent node!";for(var i,o=[],s=(o=o.concat(e.getEdges())).length,a=0;a<s;a++)i=o[a],e.remove(i);var h,l=[];for(s=(l=l.concat(e.getNodes())).length,a=0;a<s;a++)h=l[a],e.remove(h);e==this.rootGraph&&this.setRootGraph(null);var c=this.graphs.indexOf(e);this.graphs.splice(c,1),e.parent=null}else if(t instanceof r){if(null==(i=t))throw"Edge is null!";if(!i.isInterGraph)throw"Not an inter-graph edge!";if(null==i.source||null==i.target)throw"Source and/or target is null!";if(-1==i.source.edges.indexOf(i)||-1==i.target.edges.indexOf(i))throw"Source and/or target doesn't know this edge!";if(c=i.source.edges.indexOf(i),i.source.edges.splice(c,1),c=i.target.edges.indexOf(i),i.target.edges.splice(c,1),null==i.source.owner||null==i.source.owner.getGraphManager())throw"Edge owner graph or owner graph manager is null!";if(-1==i.source.owner.getGraphManager().edges.indexOf(i))throw"Not in owner graph manager's edge list!";c=i.source.owner.getGraphManager().edges.indexOf(i),i.source.owner.getGraphManager().edges.splice(c,1)}},o.prototype.updateBounds=function(){this.rootGraph.updateBounds(!0)},o.prototype.getGraphs=function(){return this.graphs},o.prototype.getAllNodes=function(){if(null==this.allNodes){for(var t=[],e=this.getGraphs(),i=e.length,n=0;n<i;n++)t=t.concat(e[n].getNodes());this.allNodes=t}return this.allNodes},o.prototype.resetAllNodes=function(){this.allNodes=null},o.prototype.resetAllEdges=function(){this.allEdges=null},o.prototype.resetAllNodesToApplyGravitation=function(){this.allNodesToApplyGravitation=null},o.prototype.getAllEdges=function(){if(null==this.allEdges){for(var t=[],e=this.getGraphs(),i=(e.length,0);i<e.length;i++)t=t.concat(e[i].getEdges());t=t.concat(this.edges),this.allEdges=t}return this.allEdges},o.prototype.getAllNodesToApplyGravitation=function(){return this.allNodesToApplyGravitation},o.prototype.setAllNodesToApplyGravitation=function(t){if(null!=this.allNodesToApplyGravitation)throw"assert failed";this.allNodesToApplyGravitation=t},o.prototype.getRoot=function(){return this.rootGraph},o.prototype.setRootGraph=function(t){if(t.getGraphManager()!=this)throw"Root not in this graph mgr!";this.rootGraph=t,null==t.parent&&(t.parent=this.layout.newNode("Root node"))},o.prototype.getLayout=function(){return this.layout},o.prototype.isOneAncestorOfOther=function(t,e){if(null==t||null==e)throw"assert failed";if(t==e)return!0;for(var i,n=t.getOwner();null!=(i=n.getParent());){if(i==e)return!0;if(null==(n=i.getOwner()))break}for(n=e.getOwner();null!=(i=n.getParent());){if(i==t)return!0;if(null==(n=i.getOwner()))break}return!1},o.prototype.calcLowestCommonAncestors=function(){for(var t,e,i,n,r,o=this.getAllEdges(),s=o.length,a=0;a<s;a++)if(e=(t=o[a]).source,i=t.target,t.lca=null,t.sourceInLca=e,t.targetInLca=i,e!=i){for(n=e.getOwner();null==t.lca;){for(t.targetInLca=i,r=i.getOwner();null==t.lca;){if(r==n){t.lca=r;break}if(r==this.rootGraph)break;if(null!=t.lca)throw"assert failed";t.targetInLca=r.getParent(),r=t.targetInLca.getOwner()}if(n==this.rootGraph)break;null==t.lca&&(t.sourceInLca=n.getParent(),n=t.sourceInLca.getOwner())}if(null==t.lca)throw"assert failed"}else t.lca=e.getOwner()},o.prototype.calcLowestCommonAncestor=function(t,e){if(t==e)return t.getOwner();for(var i=t.getOwner();null!=i;){for(var n=e.getOwner();null!=n;){if(n==i)return n;n=n.getParent().getOwner()}i=i.getParent().getOwner()}return i},o.prototype.calcInclusionTreeDepths=function(t,e){var i;null==t&&null==e&&(t=this.rootGraph,e=1);for(var n=t.getNodes(),r=n.length,o=0;o<r;o++)(i=n[o]).inclusionTreeDepth=e,null!=i.child&&this.calcInclusionTreeDepths(i.child,e+1)},o.prototype.includesInvalidEdge=function(){for(var t,e=[],i=this.edges.length,n=0;n<i;n++)t=this.edges[n],this.isOneAncestorOfOther(t.source,t.target)&&e.push(t);for(n=0;n<e.length;n++)this.remove(e[n]);return!1},t.exports=o},function(t,e,i){"use strict";var n=i(12);function r(){}r.calcSeparationAmount=function(t,e,i,n){if(!t.intersects(e))throw"assert failed";var r=new Array(2);this.decideDirectionsForOverlappingNodes(t,e,r),i[0]=Math.min(t.getRight(),e.getRight())-Math.max(t.x,e.x),i[1]=Math.min(t.getBottom(),e.getBottom())-Math.max(t.y,e.y),t.getX()<=e.getX()&&t.getRight()>=e.getRight()?i[0]+=Math.min(e.getX()-t.getX(),t.getRight()-e.getRight()):e.getX()<=t.getX()&&e.getRight()>=t.getRight()&&(i[0]+=Math.min(t.getX()-e.getX(),e.getRight()-t.getRight())),t.getY()<=e.getY()&&t.getBottom()>=e.getBottom()?i[1]+=Math.min(e.getY()-t.getY(),t.getBottom()-e.getBottom()):e.getY()<=t.getY()&&e.getBottom()>=t.getBottom()&&(i[1]+=Math.min(t.getY()-e.getY(),e.getBottom()-t.getBottom()));var o=Math.abs((e.getCenterY()-t.getCenterY())/(e.getCenterX()-t.getCenterX()));e.getCenterY()===t.getCenterY()&&e.getCenterX()===t.getCenterX()&&(o=1);var s=o*i[0],a=i[1]/o;i[0]<a?a=i[0]:s=i[1],i[0]=-1*r[0]*(a/2+n),i[1]=-1*r[1]*(s/2+n)},r.decideDirectionsForOverlappingNodes=function(t,e,i){t.getCenterX()<e.getCenterX()?i[0]=-1:i[0]=1,t.getCenterY()<e.getCenterY()?i[1]=-1:i[1]=1},r.getIntersection2=function(t,e,i){var n=t.getCenterX(),r=t.getCenterY(),o=e.getCenterX(),s=e.getCenterY();if(t.intersects(e))return i[0]=n,i[1]=r,i[2]=o,i[3]=s,!0;var a=t.getX(),h=t.getY(),l=t.getRight(),c=t.getX(),d=t.getBottom(),g=t.getRight(),u=t.getWidthHalf(),f=t.getHeightHalf(),p=e.getX(),v=e.getY(),y=e.getRight(),m=e.getX(),E=e.getBottom(),N=e.getRight(),T=e.getWidthHalf(),A=e.getHeightHalf(),w=!1,L=!1;if(n===o){if(r>s)return i[0]=n,i[1]=h,i[2]=o,i[3]=E,!1;if(r<s)return i[0]=n,i[1]=d,i[2]=o,i[3]=v,!1}else if(r===s){if(n>o)return i[0]=a,i[1]=r,i[2]=y,i[3]=s,!1;if(n<o)return i[0]=l,i[1]=r,i[2]=p,i[3]=s,!1}else{var I=t.height/t.width,C=e.height/e.width,_=(s-r)/(o-n),M=void 0,x=void 0,O=void 0,D=void 0,R=void 0,b=void 0;if(-I===_?n>o?(i[0]=c,i[1]=d,w=!0):(i[0]=l,i[1]=h,w=!0):I===_&&(n>o?(i[0]=a,i[1]=h,w=!0):(i[0]=g,i[1]=d,w=!0)),-C===_?o>n?(i[2]=m,i[3]=E,L=!0):(i[2]=y,i[3]=v,L=!0):C===_&&(o>n?(i[2]=p,i[3]=v,L=!0):(i[2]=N,i[3]=E,L=!0)),w&&L)return!1;if(n>o?r>s?(M=this.getCardinalDirection(I,_,4),x=this.getCardinalDirection(C,_,2)):(M=this.getCardinalDirection(-I,_,3),x=this.getCardinalDirection(-C,_,1)):r>s?(M=this.getCardinalDirection(-I,_,1),x=this.getCardinalDirection(-C,_,3)):(M=this.getCardinalDirection(I,_,2),x=this.getCardinalDirection(C,_,4)),!w)switch(M){case 1:D=h,O=n+-f/_,i[0]=O,i[1]=D;break;case 2:O=g,D=r+u*_,i[0]=O,i[1]=D;break;case 3:D=d,O=n+f/_,i[0]=O,i[1]=D;break;case 4:O=c,D=r+-u*_,i[0]=O,i[1]=D}if(!L)switch(x){case 1:b=v,R=o+-A/_,i[2]=R,i[3]=b;break;case 2:R=N,b=s+T*_,i[2]=R,i[3]=b;break;case 3:b=E,R=o+A/_,i[2]=R,i[3]=b;break;case 4:R=m,b=s+-T*_,i[2]=R,i[3]=b}}return!1},r.getCardinalDirection=function(t,e,i){return t>e?i:1+i%4},r.getIntersection=function(t,e,i,r){if(null==r)return this.getIntersection2(t,e,i);var o,s,a,h,l,c,d,g=t.x,u=t.y,f=e.x,p=e.y,v=i.x,y=i.y,m=r.x,E=r.y;return 0===(d=(o=p-u)*(h=v-m)-(s=E-y)*(a=g-f))?null:new n((a*(c=m*y-v*E)-h*(l=f*u-g*p))/d,(s*l-o*c)/d)},r.angleOfVector=function(t,e,i,n){var r=void 0;return t!==i?(r=Math.atan((n-e)/(i-t)),i<t?r+=Math.PI:n<e&&(r+=this.TWO_PI)):r=n<e?this.ONE_AND_HALF_PI:this.HALF_PI,r},r.doIntersect=function(t,e,i,n){var r=t.x,o=t.y,s=e.x,a=e.y,h=i.x,l=i.y,c=n.x,d=n.y,g=(s-r)*(d-l)-(c-h)*(a-o);if(0===g)return!1;var u=((d-l)*(c-r)+(h-c)*(d-o))/g,f=((o-a)*(c-r)+(s-r)*(d-o))/g;return 0<u&&u<1&&0<f&&f<1},r.findCircleLineIntersections=function(t,e,i,n,r,o,s){var a=(i-t)*(i-t)+(n-e)*(n-e),h=2*((t-r)*(i-t)+(e-o)*(n-e)),l=(t-r)*(t-r)+(e-o)*(e-o)-s*s;if(h*h-4*a*l>=0){var c=(-h+Math.sqrt(h*h-4*a*l))/(2*a),d=(-h-Math.sqrt(h*h-4*a*l))/(2*a);return c>=0&&c<=1?[c]:d>=0&&d<=1?[d]:null}return null},r.HALF_PI=.5*Math.PI,r.ONE_AND_HALF_PI=1.5*Math.PI,r.TWO_PI=2*Math.PI,r.THREE_PI=3*Math.PI,t.exports=r},function(t,e,i){"use strict";function n(){}n.sign=function(t){return t>0?1:t<0?-1:0},n.floor=function(t){return t<0?Math.ceil(t):Math.floor(t)},n.ceil=function(t){return t<0?Math.floor(t):Math.ceil(t)},t.exports=n},function(t,e,i){"use strict";function n(){}n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=function(t){return{value:t,next:null,prev:null}},o=function(t,e,i,n){return null!==t?t.next=e:n.head=e,null!==i?i.prev=e:n.tail=e,e.prev=t,e.next=i,n.length++,e},s=function(t,e){var i=t.prev,n=t.next;return null!==i?i.next=n:e.head=n,null!==n?n.prev=i:e.tail=i,t.prev=t.next=null,e.length--,t},a=function(){function t(e){var i=this;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.length=0,this.head=null,this.tail=null,null!=e&&e.forEach(function(t){return i.push(t)})}return n(t,[{key:"size",value:function(){return this.length}},{key:"insertBefore",value:function(t,e){return o(e.prev,r(t),e,this)}},{key:"insertAfter",value:function(t,e){return o(e,r(t),e.next,this)}},{key:"insertNodeBefore",value:function(t,e){return o(e.prev,t,e,this)}},{key:"insertNodeAfter",value:function(t,e){return o(e,t,e.next,this)}},{key:"push",value:function(t){return o(this.tail,r(t),null,this)}},{key:"unshift",value:function(t){return o(null,r(t),this.head,this)}},{key:"remove",value:function(t){return s(t,this)}},{key:"pop",value:function(){return s(this.tail,this).value}},{key:"popNode",value:function(){return s(this.tail,this)}},{key:"shift",value:function(){return s(this.head,this).value}},{key:"shiftNode",value:function(){return s(this.head,this)}},{key:"get_object_at",value:function(t){if(t<=this.length()){for(var e=1,i=this.head;e<t;)i=i.next,e++;return i.value}}},{key:"set_object_at",value:function(t,e){if(t<=this.length()){for(var i=1,n=this.head;i<t;)n=n.next,i++;n.value=e}}}]),t}();t.exports=a},function(t,e,i){"use strict";function n(t,e,i){this.x=null,this.y=null,null==t&&null==e&&null==i?(this.x=0,this.y=0):"number"==typeof t&&"number"==typeof e&&null==i?(this.x=t,this.y=e):"Point"==t.constructor.name&&null==e&&null==i&&(i=t,this.x=i.x,this.y=i.y)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.getLocation=function(){return new n(this.x,this.y)},n.prototype.setLocation=function(t,e,i){"Point"==t.constructor.name&&null==e&&null==i?(i=t,this.setLocation(i.x,i.y)):"number"==typeof t&&"number"==typeof e&&null==i&&(parseInt(t)==t&&parseInt(e)==e?this.move(t,e):(this.x=Math.floor(t+.5),this.y=Math.floor(e+.5)))},n.prototype.move=function(t,e){this.x=t,this.y=e},n.prototype.translate=function(t,e){this.x+=t,this.y+=e},n.prototype.equals=function(t){if("Point"==t.constructor.name){var e=t;return this.x==e.x&&this.y==e.y}return this==t},n.prototype.toString=function(){return(new n).constructor.name+"[x="+this.x+",y="+this.y+"]"},t.exports=n},function(t,e,i){"use strict";function n(t,e,i,n){this.x=0,this.y=0,this.width=0,this.height=0,null!=t&&null!=e&&null!=i&&null!=n&&(this.x=t,this.y=e,this.width=i,this.height=n)}n.prototype.getX=function(){return this.x},n.prototype.setX=function(t){this.x=t},n.prototype.getY=function(){return this.y},n.prototype.setY=function(t){this.y=t},n.prototype.getWidth=function(){return this.width},n.prototype.setWidth=function(t){this.width=t},n.prototype.getHeight=function(){return this.height},n.prototype.setHeight=function(t){this.height=t},n.prototype.getRight=function(){return this.x+this.width},n.prototype.getBottom=function(){return this.y+this.height},n.prototype.intersects=function(t){return!(this.getRight()<t.x||this.getBottom()<t.y||t.getRight()<this.x||t.getBottom()<this.y)},n.prototype.getCenterX=function(){return this.x+this.width/2},n.prototype.getMinX=function(){return this.getX()},n.prototype.getMaxX=function(){return this.getX()+this.width},n.prototype.getCenterY=function(){return this.y+this.height/2},n.prototype.getMinY=function(){return this.getY()},n.prototype.getMaxY=function(){return this.getY()+this.height},n.prototype.getWidthHalf=function(){return this.width/2},n.prototype.getHeightHalf=function(){return this.height/2},t.exports=n},function(t,e,i){"use strict";var n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t};function r(){}r.lastID=0,r.createID=function(t){return r.isPrimitive(t)?t:(null!=t.uniqueID||(t.uniqueID=r.getString(),r.lastID++),t.uniqueID)},r.getString=function(t){return null==t&&(t=r.lastID),"Object#"+t},r.isPrimitive=function(t){var e=void 0===t?"undefined":n(t);return null==t||"object"!=e&&"function"!=e},t.exports=r},function(t,e,i){"use strict";function n(t){if(Array.isArray(t)){for(var e=0,i=Array(t.length);e<t.length;e++)i[e]=t[e];return i}return Array.from(t)}var r=i(0),o=i(7),s=i(3),a=i(1),h=i(6),l=i(5),c=i(17),d=i(29);function g(t){d.call(this),this.layoutQuality=r.QUALITY,this.createBendsAsNeeded=r.DEFAULT_CREATE_BENDS_AS_NEEDED,this.incremental=r.DEFAULT_INCREMENTAL,this.animationOnLayout=r.DEFAULT_ANIMATION_ON_LAYOUT,this.animationDuringLayout=r.DEFAULT_ANIMATION_DURING_LAYOUT,this.animationPeriod=r.DEFAULT_ANIMATION_PERIOD,this.uniformLeafNodeSizes=r.DEFAULT_UNIFORM_LEAF_NODE_SIZES,this.edgeToDummyNodes=new Map,this.graphManager=new o(this),this.isLayoutFinished=!1,this.isSubLayout=!1,this.isRemoteUse=!1,null!=t&&(this.isRemoteUse=t)}g.RANDOM_SEED=1,g.prototype=Object.create(d.prototype),g.prototype.getGraphManager=function(){return this.graphManager},g.prototype.getAllNodes=function(){return this.graphManager.getAllNodes()},g.prototype.getAllEdges=function(){return this.graphManager.getAllEdges()},g.prototype.getAllNodesToApplyGravitation=function(){return this.graphManager.getAllNodesToApplyGravitation()},g.prototype.newGraphManager=function(){var t=new o(this);return this.graphManager=t,t},g.prototype.newGraph=function(t){return new h(null,this.graphManager,t)},g.prototype.newNode=function(t){return new s(this.graphManager,t)},g.prototype.newEdge=function(t){return new a(null,null,t)},g.prototype.checkLayoutSuccess=function(){return null==this.graphManager.getRoot()||0==this.graphManager.getRoot().getNodes().length||this.graphManager.includesInvalidEdge()},g.prototype.runLayout=function(){var t;return this.isLayoutFinished=!1,this.tilingPreLayout&&this.tilingPreLayout(),this.initParameters(),t=!this.checkLayoutSuccess()&&this.layout(),"during"!==r.ANIMATE&&(t&&(this.isSubLayout||this.doPostLayout()),this.tilingPostLayout&&this.tilingPostLayout(),this.isLayoutFinished=!0,t)},g.prototype.doPostLayout=function(){this.incremental||this.transform(),this.update()},g.prototype.update2=function(){if(this.createBendsAsNeeded&&(this.createBendpointsFromDummyNodes(),this.graphManager.resetAllEdges()),!this.isRemoteUse){for(var t=this.graphManager.getAllEdges(),e=0;e<t.length;e++)t[e];var i=this.graphManager.getRoot().getNodes();for(e=0;e<i.length;e++)i[e];this.update(this.graphManager.getRoot())}},g.prototype.update=function(t){if(null==t)this.update2();else if(t instanceof s){var e=t;if(null!=e.getChild())for(var i=e.getChild().getNodes(),n=0;n<i.length;n++)update(i[n]);null!=e.vGraphObject&&e.vGraphObject.update(e)}else if(t instanceof a){var r=t;null!=r.vGraphObject&&r.vGraphObject.update(r)}else if(t instanceof h){var o=t;null!=o.vGraphObject&&o.vGraphObject.update(o)}},g.prototype.initParameters=function(){this.isSubLayout||(this.layoutQuality=r.QUALITY,this.animationDuringLayout=r.DEFAULT_ANIMATION_DURING_LAYOUT,this.animationPeriod=r.DEFAULT_ANIMATION_PERIOD,this.animationOnLayout=r.DEFAULT_ANIMATION_ON_LAYOUT,this.incremental=r.DEFAULT_INCREMENTAL,this.createBendsAsNeeded=r.DEFAULT_CREATE_BENDS_AS_NEEDED,this.uniformLeafNodeSizes=r.DEFAULT_UNIFORM_LEAF_NODE_SIZES),this.animationDuringLayout&&(this.animationOnLayout=!1)},g.prototype.transform=function(t){if(null==t)this.transform(new l(0,0));else{var e=new c,i=this.graphManager.getRoot().updateLeftTop();if(null!=i){e.setWorldOrgX(t.x),e.setWorldOrgY(t.y),e.setDeviceOrgX(i.x),e.setDeviceOrgY(i.y);for(var n=this.getAllNodes(),r=0;r<n.length;r++)n[r].transform(e)}}},g.prototype.positionNodesRandomly=function(t){if(null==t)this.positionNodesRandomly(this.getGraphManager().getRoot()),this.getGraphManager().getRoot().updateBounds(!0);else for(var e,i,n=t.getNodes(),r=0;r<n.length;r++)null==(i=(e=n[r]).getChild())||0==i.getNodes().length?e.scatter():(this.positionNodesRandomly(i),e.updateBounds())},g.prototype.getFlatForest=function(){for(var t=[],e=!0,i=this.graphManager.getRoot().getNodes(),r=!0,o=0;o<i.length;o++)null!=i[o].getChild()&&(r=!1);if(!r)return t;var s=new Set,a=[],h=new Map,l=[];for(l=l.concat(i);l.length>0&&e;){for(a.push(l[0]);a.length>0&&e;){var c=a[0];a.splice(0,1),s.add(c);var d=c.getEdges();for(o=0;o<d.length;o++){var g=d[o].getOtherEnd(c);if(h.get(c)!=g){if(s.has(g)){e=!1;break}a.push(g),h.set(g,c)}}}if(e){var u=[].concat(n(s));for(t.push(u),o=0;o<u.length;o++){var f=u[o],p=l.indexOf(f);p>-1&&l.splice(p,1)}s=new Set,h=new Map}else t=[]}return t},g.prototype.createDummyNodesForBendpoints=function(t){for(var e=[],i=t.source,n=this.graphManager.calcLowestCommonAncestor(t.source,t.target),r=0;r<t.bendpoints.length;r++){var o=this.newNode(null);o.setRect(new Point(0,0),new Dimension(1,1)),n.add(o);var s=this.newEdge(null);this.graphManager.add(s,i,o),e.add(o),i=o}return s=this.newEdge(null),this.graphManager.add(s,i,t.target),this.edgeToDummyNodes.set(t,e),t.isInterGraph()?this.graphManager.remove(t):n.remove(t),e},g.prototype.createBendpointsFromDummyNodes=function(){var t=[];t=t.concat(this.graphManager.getAllEdges()),t=[].concat(n(this.edgeToDummyNodes.keys())).concat(t);for(var e=0;e<t.length;e++){var i=t[e];if(i.bendpoints.length>0){for(var r=this.edgeToDummyNodes.get(i),o=0;o<r.length;o++){var s=r[o],a=new l(s.getCenterX(),s.getCenterY()),h=i.bendpoints.get(o);h.x=a.x,h.y=a.y,s.getOwner().remove(s)}this.graphManager.add(i,i.source,i.target)}}},g.transform=function(t,e,i,n){if(null!=i&&null!=n){var r=e;return t<=50?r-=(e-e/i)/50*(50-t):r+=(e*n-e)/50*(t-50),r}var o,s;return t<=50?(o=9*e/500,s=e/10):(o=9*e/50,s=-8*e),o*t+s},g.findCenterOfTree=function(t){var e=[];e=e.concat(t);var i=[],n=new Map,r=!1,o=null;1!=e.length&&2!=e.length||(r=!0,o=e[0]);for(var s=0;s<e.length;s++){var a=(c=e[s]).getNeighborsList().size;n.set(c,c.getNeighborsList().size),1==a&&i.push(c)}var h=[];for(h=h.concat(i);!r;){var l=[];for(l=l.concat(h),h=[],s=0;s<e.length;s++){var c=e[s],d=e.indexOf(c);d>=0&&e.splice(d,1),c.getNeighborsList().forEach(function(t){if(i.indexOf(t)<0){var e=n.get(t)-1;1==e&&h.push(t),n.set(t,e)}})}i=i.concat(h),1!=e.length&&2!=e.length||(r=!0,o=e[0])}return o},g.prototype.setGraphManager=function(t){this.graphManager=t},t.exports=g},function(t,e,i){"use strict";function n(){}n.seed=1,n.x=0,n.nextDouble=function(){return n.x=1e4*Math.sin(n.seed++),n.x-Math.floor(n.x)},t.exports=n},function(t,e,i){"use strict";var n=i(5);function r(t,e){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}r.prototype.getWorldOrgX=function(){return this.lworldOrgX},r.prototype.setWorldOrgX=function(t){this.lworldOrgX=t},r.prototype.getWorldOrgY=function(){return this.lworldOrgY},r.prototype.setWorldOrgY=function(t){this.lworldOrgY=t},r.prototype.getWorldExtX=function(){return this.lworldExtX},r.prototype.setWorldExtX=function(t){this.lworldExtX=t},r.prototype.getWorldExtY=function(){return this.lworldExtY},r.prototype.setWorldExtY=function(t){this.lworldExtY=t},r.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},r.prototype.setDeviceOrgX=function(t){this.ldeviceOrgX=t},r.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},r.prototype.setDeviceOrgY=function(t){this.ldeviceOrgY=t},r.prototype.getDeviceExtX=function(){return this.ldeviceExtX},r.prototype.setDeviceExtX=function(t){this.ldeviceExtX=t},r.prototype.getDeviceExtY=function(){return this.ldeviceExtY},r.prototype.setDeviceExtY=function(t){this.ldeviceExtY=t},r.prototype.transformX=function(t){var e=0,i=this.lworldExtX;return 0!=i&&(e=this.ldeviceOrgX+(t-this.lworldOrgX)*this.ldeviceExtX/i),e},r.prototype.transformY=function(t){var e=0,i=this.lworldExtY;return 0!=i&&(e=this.ldeviceOrgY+(t-this.lworldOrgY)*this.ldeviceExtY/i),e},r.prototype.inverseTransformX=function(t){var e=0,i=this.ldeviceExtX;return 0!=i&&(e=this.lworldOrgX+(t-this.ldeviceOrgX)*this.lworldExtX/i),e},r.prototype.inverseTransformY=function(t){var e=0,i=this.ldeviceExtY;return 0!=i&&(e=this.lworldOrgY+(t-this.ldeviceOrgY)*this.lworldExtY/i),e},r.prototype.inverseTransformPoint=function(t){return new n(this.inverseTransformX(t.x),this.inverseTransformY(t.y))},t.exports=r},function(t,e,i){"use strict";var n=i(15),r=i(4),o=i(0),s=i(8),a=i(9);function h(){n.call(this),this.useSmartIdealEdgeLengthCalculation=r.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=r.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=r.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=r.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.displacementThresholdPerNode=3*r.DEFAULT_EDGE_LENGTH/100,this.coolingFactor=r.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.initialCoolingFactor=r.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.totalDisplacement=0,this.oldTotalDisplacement=0,this.maxIterations=r.MAX_ITERATIONS}for(var l in h.prototype=Object.create(n.prototype),n)h[l]=n[l];h.prototype.initParameters=function(){n.prototype.initParameters.call(this,arguments),this.totalIterations=0,this.notAnimatedIterations=0,this.useFRGridVariant=r.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION,this.grid=[]},h.prototype.calcIdealEdgeLengths=function(){for(var t,e,i,n,s,a,h,l=this.getGraphManager().getAllEdges(),c=0;c<l.length;c++)e=(t=l[c]).idealLength,t.isInterGraph&&(n=t.getSource(),s=t.getTarget(),a=t.getSourceInLca().getEstimatedSize(),h=t.getTargetInLca().getEstimatedSize(),this.useSmartIdealEdgeLengthCalculation&&(t.idealLength+=a+h-2*o.SIMPLE_NODE_SIZE),i=t.getLca().getInclusionTreeDepth(),t.idealLength+=e*r.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR*(n.getInclusionTreeDepth()+s.getInclusionTreeDepth()-2*i))},h.prototype.initSpringEmbedder=function(){var t=this.getAllNodes().length;this.incremental?(t>r.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*r.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(t-r.ADAPTATION_LOWER_NODE_LIMIT)/(r.ADAPTATION_UPPER_NODE_LIMIT-r.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-r.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=r.MAX_NODE_DISPLACEMENT_INCREMENTAL):(t>r.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(r.COOLING_ADAPTATION_FACTOR,1-(t-r.ADAPTATION_LOWER_NODE_LIMIT)/(r.ADAPTATION_UPPER_NODE_LIMIT-r.ADAPTATION_LOWER_NODE_LIMIT)*(1-r.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=r.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(5*this.getAllNodes().length,this.maxIterations),this.displacementThresholdPerNode=3*r.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var t,e=this.getAllEdges(),i=0;i<e.length;i++)t=e[i],this.calcSpringForce(t,t.idealLength)},h.prototype.calcRepulsionForces=function(){var t,e,i,n,o,s=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],h=this.getAllNodes();if(this.useFRGridVariant)for(this.totalIterations%r.GRID_CALCULATION_CHECK_PERIOD==1&&s&&this.updateGrid(),o=new Set,t=0;t<h.length;t++)i=h[t],this.calculateRepulsionForceOfANode(i,o,s,a),o.add(i);else for(t=0;t<h.length;t++)for(i=h[t],e=t+1;e<h.length;e++)n=h[e],i.getOwner()==n.getOwner()&&this.calcRepulsionForce(i,n)},h.prototype.calcGravitationalForces=function(){for(var t,e=this.getAllNodesToApplyGravitation(),i=0;i<e.length;i++)t=e[i],this.calcGravitationalForce(t)},h.prototype.moveNodes=function(){for(var t=this.getAllNodes(),e=0;e<t.length;e++)t[e].move()},h.prototype.calcSpringForce=function(t,e){var i,n,r,o,s=t.getSource(),a=t.getTarget();if(this.uniformLeafNodeSizes&&null==s.getChild()&&null==a.getChild())t.updateLengthSimple();else if(t.updateLength(),t.isOverlapingSourceAndTarget)return;0!=(i=t.getLength())&&(r=(n=t.edgeElasticity*(i-e))*(t.lengthX/i),o=n*(t.lengthY/i),s.springForceX+=r,s.springForceY+=o,a.springForceX-=r,a.springForceY-=o)},h.prototype.calcRepulsionForce=function(t,e){var i,n,o,h,l,c,d,g=t.getRect(),u=e.getRect(),f=new Array(2),p=new Array(4);if(g.intersects(u)){s.calcSeparationAmount(g,u,f,r.DEFAULT_EDGE_LENGTH/2),c=2*f[0],d=2*f[1];var v=t.noOfChildren*e.noOfChildren/(t.noOfChildren+e.noOfChildren);t.repulsionForceX-=v*c,t.repulsionForceY-=v*d,e.repulsionForceX+=v*c,e.repulsionForceY+=v*d}else this.uniformLeafNodeSizes&&null==t.getChild()&&null==e.getChild()?(i=u.getCenterX()-g.getCenterX(),n=u.getCenterY()-g.getCenterY()):(s.getIntersection(g,u,p),i=p[2]-p[0],n=p[3]-p[1]),Math.abs(i)<r.MIN_REPULSION_DIST&&(i=a.sign(i)*r.MIN_REPULSION_DIST),Math.abs(n)<r.MIN_REPULSION_DIST&&(n=a.sign(n)*r.MIN_REPULSION_DIST),o=i*i+n*n,h=Math.sqrt(o),c=(l=(t.nodeRepulsion/2+e.nodeRepulsion/2)*t.noOfChildren*e.noOfChildren/o)*i/h,d=l*n/h,t.repulsionForceX-=c,t.repulsionForceY-=d,e.repulsionForceX+=c,e.repulsionForceY+=d},h.prototype.calcGravitationalForce=function(t){var e,i,n,r,o,s,a,h;i=((e=t.getOwner()).getRight()+e.getLeft())/2,n=(e.getTop()+e.getBottom())/2,r=t.getCenterX()-i,o=t.getCenterY()-n,s=Math.abs(r)+t.getWidth()/2,a=Math.abs(o)+t.getHeight()/2,t.getOwner()==this.graphManager.getRoot()?(s>(h=e.getEstimatedSize()*this.gravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*r,t.gravitationForceY=-this.gravityConstant*o):(s>(h=e.getEstimatedSize()*this.compoundGravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*r*this.compoundGravityConstant,t.gravitationForceY=-this.gravityConstant*o*this.compoundGravityConstant)},h.prototype.isConverged=function(){var t,e=!1;return this.totalIterations>this.maxIterations/3&&(e=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),t=this.totalDisplacement<this.totalDisplacementThreshold,this.oldTotalDisplacement=this.totalDisplacement,t||e},h.prototype.animate=function(){this.animationDuringLayout&&!this.isSubLayout&&(this.notAnimatedIterations==this.animationPeriod?(this.update(),this.notAnimatedIterations=0):this.notAnimatedIterations++)},h.prototype.calcNoOfChildrenForAllNodes=function(){for(var t,e=this.graphManager.getAllNodes(),i=0;i<e.length;i++)(t=e[i]).noOfChildren=t.getNoOfChildren()},h.prototype.calcGrid=function(t){var e,i;e=parseInt(Math.ceil((t.getRight()-t.getLeft())/this.repulsionRange)),i=parseInt(Math.ceil((t.getBottom()-t.getTop())/this.repulsionRange));for(var n=new Array(e),r=0;r<e;r++)n[r]=new Array(i);for(r=0;r<e;r++)for(var o=0;o<i;o++)n[r][o]=new Array;return n},h.prototype.addNodeToGrid=function(t,e,i){var n,r,o,s;n=parseInt(Math.floor((t.getRect().x-e)/this.repulsionRange)),r=parseInt(Math.floor((t.getRect().width+t.getRect().x-e)/this.repulsionRange)),o=parseInt(Math.floor((t.getRect().y-i)/this.repulsionRange)),s=parseInt(Math.floor((t.getRect().height+t.getRect().y-i)/this.repulsionRange));for(var a=n;a<=r;a++)for(var h=o;h<=s;h++)this.grid[a][h].push(t),t.setGridCoordinates(n,r,o,s)},h.prototype.updateGrid=function(){var t,e,i=this.getAllNodes();for(this.grid=this.calcGrid(this.graphManager.getRoot()),t=0;t<i.length;t++)e=i[t],this.addNodeToGrid(e,this.graphManager.getRoot().getLeft(),this.graphManager.getRoot().getTop())},h.prototype.calculateRepulsionForceOfANode=function(t,e,i,n){if(this.totalIterations%r.GRID_CALCULATION_CHECK_PERIOD==1&&i||n){var o,s=new Set;t.surrounding=new Array;for(var a=this.grid,h=t.startX-1;h<t.finishX+2;h++)for(var l=t.startY-1;l<t.finishY+2;l++)if(!(h<0||l<0||h>=a.length||l>=a[0].length))for(var c=0;c<a[h][l].length;c++)if(o=a[h][l][c],t.getOwner()==o.getOwner()&&t!=o&&!e.has(o)&&!s.has(o)){var d=Math.abs(t.getCenterX()-o.getCenterX())-(t.getWidth()/2+o.getWidth()/2),g=Math.abs(t.getCenterY()-o.getCenterY())-(t.getHeight()/2+o.getHeight()/2);d<=this.repulsionRange&&g<=this.repulsionRange&&s.add(o)}t.surrounding=[].concat(function(t){if(Array.isArray(t)){for(var e=0,i=Array(t.length);e<t.length;e++)i[e]=t[e];return i}return Array.from(t)}(s))}for(h=0;h<t.surrounding.length;h++)this.calcRepulsionForce(t,t.surrounding[h])},h.prototype.calcRepulsionRange=function(){return 0},t.exports=h},function(t,e,i){"use strict";var n=i(1),r=i(4);function o(t,e,i){n.call(this,t,e,i),this.idealLength=r.DEFAULT_EDGE_LENGTH,this.edgeElasticity=r.DEFAULT_SPRING_STRENGTH}for(var s in o.prototype=Object.create(n.prototype),n)o[s]=n[s];t.exports=o},function(t,e,i){"use strict";var n=i(3),r=i(4);function o(t,e,i,o){n.call(this,t,e,i,o),this.nodeRepulsion=r.DEFAULT_REPULSION_STRENGTH,this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0,this.startX=0,this.finishX=0,this.startY=0,this.finishY=0,this.surrounding=[]}for(var s in o.prototype=Object.create(n.prototype),n)o[s]=n[s];o.prototype.setGridCoordinates=function(t,e,i,n){this.startX=t,this.finishX=e,this.startY=i,this.finishY=n},t.exports=o},function(t,e,i){"use strict";function n(t,e){this.width=0,this.height=0,null!==t&&null!==e&&(this.height=e,this.width=t)}n.prototype.getWidth=function(){return this.width},n.prototype.setWidth=function(t){this.width=t},n.prototype.getHeight=function(){return this.height},n.prototype.setHeight=function(t){this.height=t},t.exports=n},function(t,e,i){"use strict";var n=i(14);function r(){this.map={},this.keys=[]}r.prototype.put=function(t,e){var i=n.createID(t);this.contains(i)||(this.map[i]=e,this.keys.push(t))},r.prototype.contains=function(t){return n.createID(t),null!=this.map[t]},r.prototype.get=function(t){var e=n.createID(t);return this.map[e]},r.prototype.keySet=function(){return this.keys},t.exports=r},function(t,e,i){"use strict";var n=i(14);function r(){this.set={}}r.prototype.add=function(t){var e=n.createID(t);this.contains(e)||(this.set[e]=t)},r.prototype.remove=function(t){delete this.set[n.createID(t)]},r.prototype.clear=function(){this.set={}},r.prototype.contains=function(t){return this.set[n.createID(t)]==t},r.prototype.isEmpty=function(){return 0===this.size()},r.prototype.size=function(){return Object.keys(this.set).length},r.prototype.addAllTo=function(t){for(var e=Object.keys(this.set),i=e.length,n=0;n<i;n++)t.push(this.set[e[n]])},r.prototype.size=function(){return Object.keys(this.set).length},r.prototype.addAll=function(t){for(var e=t.length,i=0;i<e;i++){var n=t[i];this.add(n)}},t.exports=r},function(t,e,i){"use strict";function n(){}n.multMat=function(t,e){for(var i=[],n=0;n<t.length;n++){i[n]=[];for(var r=0;r<e[0].length;r++){i[n][r]=0;for(var o=0;o<t[0].length;o++)i[n][r]+=t[n][o]*e[o][r]}}return i},n.transpose=function(t){for(var e=[],i=0;i<t[0].length;i++){e[i]=[];for(var n=0;n<t.length;n++)e[i][n]=t[n][i]}return e},n.multCons=function(t,e){for(var i=[],n=0;n<t.length;n++)i[n]=t[n]*e;return i},n.minusOp=function(t,e){for(var i=[],n=0;n<t.length;n++)i[n]=t[n]-e[n];return i},n.dotProduct=function(t,e){for(var i=0,n=0;n<t.length;n++)i+=t[n]*e[n];return i},n.mag=function(t){return Math.sqrt(this.dotProduct(t,t))},n.normalize=function(t){for(var e=[],i=this.mag(t),n=0;n<t.length;n++)e[n]=t[n]/i;return e},n.multGamma=function(t){for(var e=[],i=0,n=0;n<t.length;n++)i+=t[n];i*=-1/t.length;for(var r=0;r<t.length;r++)e[r]=i+t[r];return e},n.multL=function(t,e,i){for(var n=[],r=[],o=[],s=0;s<e[0].length;s++){for(var a=0,h=0;h<e.length;h++)a+=-.5*e[h][s]*t[h];r[s]=a}for(var l=0;l<i.length;l++){for(var c=0,d=0;d<i.length;d++)c+=i[l][d]*r[d];o[l]=c}for(var g=0;g<e.length;g++){for(var u=0,f=0;f<e[0].length;f++)u+=e[g][f]*o[f];n[g]=u}return n},t.exports=n},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=i(11),o=function(){function t(e,i){!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),null===i&&void 0===i||(this.compareFunction=this._defaultCompareFunction);var n=void 0;n=e instanceof r?e.size():e.length,this._quicksort(e,0,n-1)}return n(t,[{key:"_quicksort",value:function(t,e,i){if(e<i){var n=this._partition(t,e,i);this._quicksort(t,e,n),this._quicksort(t,n+1,i)}}},{key:"_partition",value:function(t,e,i){for(var n=this._get(t,e),r=e,o=i;;){for(;this.compareFunction(n,this._get(t,o));)o--;for(;this.compareFunction(this._get(t,r),n);)r++;if(!(r<o))return o;this._swap(t,r,o),r++,o--}}},{key:"_get",value:function(t,e){return t instanceof r?t.get_object_at(e):t[e]}},{key:"_set",value:function(t,e,i){t instanceof r?t.set_object_at(e,i):t[e]=i}},{key:"_swap",value:function(t,e,i){var n=this._get(t,e);this._set(t,e,this._get(t,i)),this._set(t,i,n)}},{key:"_defaultCompareFunction",value:function(t,e){return e>t}}]),t}();t.exports=o},function(t,e,i){"use strict";function n(){}n.svd=function(t){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=t.length,this.n=t[0].length;var e=Math.min(this.m,this.n);this.s=function(t){for(var e=[];t-- >0;)e.push(0);return e}(Math.min(this.m+1,this.n)),this.U=function t(e){if(0==e.length)return 0;for(var i=[],n=0;n<e[0];n++)i.push(t(e.slice(1)));return i}([this.m,e]),this.V=function(t){return function t(e){if(0==e.length)return 0;for(var i=[],n=0;n<e[0];n++)i.push(t(e.slice(1)));return i}(t)}([this.n,this.n]);for(var i=function(t){for(var e=[];t-- >0;)e.push(0);return e}(this.n),r=function(t){for(var e=[];t-- >0;)e.push(0);return e}(this.m),o=Math.min(this.m-1,this.n),s=Math.max(0,Math.min(this.n-2,this.m)),a=0;a<Math.max(o,s);a++){if(a<o){this.s[a]=0;for(var h=a;h<this.m;h++)this.s[a]=n.hypot(this.s[a],t[h][a]);if(0!==this.s[a]){t[a][a]<0&&(this.s[a]=-this.s[a]);for(var l=a;l<this.m;l++)t[l][a]/=this.s[a];t[a][a]+=1}this.s[a]=-this.s[a]}for(var c=a+1;c<this.n;c++){if(function(t,e){return t&&e}(a<o,0!==this.s[a])){for(var d=0,g=a;g<this.m;g++)d+=t[g][a]*t[g][c];d=-d/t[a][a];for(var u=a;u<this.m;u++)t[u][c]+=d*t[u][a]}i[c]=t[a][c]}if(function(t,e){return e}(0,a<o))for(var f=a;f<this.m;f++)this.U[f][a]=t[f][a];if(a<s){i[a]=0;for(var p=a+1;p<this.n;p++)i[a]=n.hypot(i[a],i[p]);if(0!==i[a]){i[a+1]<0&&(i[a]=-i[a]);for(var v=a+1;v<this.n;v++)i[v]/=i[a];i[a+1]+=1}if(i[a]=-i[a],function(t,e){return t&&e}(a+1<this.m,0!==i[a])){for(var y=a+1;y<this.m;y++)r[y]=0;for(var m=a+1;m<this.n;m++)for(var E=a+1;E<this.m;E++)r[E]+=i[m]*t[E][m];for(var N=a+1;N<this.n;N++)for(var T=-i[N]/i[a+1],A=a+1;A<this.m;A++)t[A][N]+=T*r[A]}for(var w=a+1;w<this.n;w++)this.V[w][a]=i[w]}}var L=Math.min(this.n,this.m+1);o<this.n&&(this.s[o]=t[o][o]),this.m<L&&(this.s[L-1]=0),s+1<L&&(i[s]=t[s][L-1]),i[L-1]=0;for(var I=o;I<e;I++){for(var C=0;C<this.m;C++)this.U[C][I]=0;this.U[I][I]=1}for(var _=o-1;_>=0;_--)if(0!==this.s[_]){for(var M=_+1;M<e;M++){for(var x=0,O=_;O<this.m;O++)x+=this.U[O][_]*this.U[O][M];x=-x/this.U[_][_];for(var D=_;D<this.m;D++)this.U[D][M]+=x*this.U[D][_]}for(var R=_;R<this.m;R++)this.U[R][_]=-this.U[R][_];this.U[_][_]=1+this.U[_][_];for(var b=0;b<_-1;b++)this.U[b][_]=0}else{for(var G=0;G<this.m;G++)this.U[G][_]=0;this.U[_][_]=1}for(var F=this.n-1;F>=0;F--){if(function(t,e){return t&&e}(F<s,0!==i[F]))for(var S=F+1;S<e;S++){for(var P=0,U=F+1;U<this.n;U++)P+=this.V[U][F]*this.V[U][S];P=-P/this.V[F+1][F];for(var Y=F+1;Y<this.n;Y++)this.V[Y][S]+=P*this.V[Y][F]}for(var k=0;k<this.n;k++)this.V[k][F]=0;this.V[F][F]=1}for(var H=L-1,X=Math.pow(2,-52),z=Math.pow(2,-966);L>0;){var V=void 0,B=void 0;for(V=L-2;V>=-1&&-1!==V;V--)if(Math.abs(i[V])<=z+X*(Math.abs(this.s[V])+Math.abs(this.s[V+1]))){i[V]=0;break}if(V===L-2)B=4;else{var W=void 0;for(W=L-1;W>=V&&W!==V;W--){var j=(W!==L?Math.abs(i[W]):0)+(W!==V+1?Math.abs(i[W-1]):0);if(Math.abs(this.s[W])<=z+X*j){this.s[W]=0;break}}W===V?B=3:W===L-1?B=1:(B=2,V=W)}switch(V++,B){case 1:var $=i[L-2];i[L-2]=0;for(var q=L-2;q>=V;q--){var K=n.hypot(this.s[q],$),Z=this.s[q]/K,Q=$/K;this.s[q]=K,q!==V&&($=-Q*i[q-1],i[q-1]=Z*i[q-1]);for(var J=0;J<this.n;J++)K=Z*this.V[J][q]+Q*this.V[J][L-1],this.V[J][L-1]=-Q*this.V[J][q]+Z*this.V[J][L-1],this.V[J][q]=K}break;case 2:var tt=i[V-1];i[V-1]=0;for(var et=V;et<L;et++){var it=n.hypot(this.s[et],tt),nt=this.s[et]/it,rt=tt/it;this.s[et]=it,tt=-rt*i[et],i[et]=nt*i[et];for(var ot=0;ot<this.m;ot++)it=nt*this.U[ot][et]+rt*this.U[ot][V-1],this.U[ot][V-1]=-rt*this.U[ot][et]+nt*this.U[ot][V-1],this.U[ot][et]=it}break;case 3:var st=Math.max(Math.max(Math.max(Math.max(Math.abs(this.s[L-1]),Math.abs(this.s[L-2])),Math.abs(i[L-2])),Math.abs(this.s[V])),Math.abs(i[V])),at=this.s[L-1]/st,ht=this.s[L-2]/st,lt=i[L-2]/st,ct=this.s[V]/st,dt=i[V]/st,gt=((ht+at)*(ht-at)+lt*lt)/2,ut=at*lt*(at*lt),ft=0;(function(t,e){return t||e})(0!==gt,0!==ut)&&(ft=Math.sqrt(gt*gt+ut),gt<0&&(ft=-ft),ft=ut/(gt+ft));for(var pt=(ct+at)*(ct-at)+ft,vt=ct*dt,yt=V;yt<L-1;yt++){var mt=n.hypot(pt,vt),Et=pt/mt,Nt=vt/mt;yt!==V&&(i[yt-1]=mt),pt=Et*this.s[yt]+Nt*i[yt],i[yt]=Et*i[yt]-Nt*this.s[yt],vt=Nt*this.s[yt+1],this.s[yt+1]=Et*this.s[yt+1];for(var Tt=0;Tt<this.n;Tt++)mt=Et*this.V[Tt][yt]+Nt*this.V[Tt][yt+1],this.V[Tt][yt+1]=-Nt*this.V[Tt][yt]+Et*this.V[Tt][yt+1],this.V[Tt][yt]=mt;if(Et=pt/(mt=n.hypot(pt,vt)),Nt=vt/mt,this.s[yt]=mt,pt=Et*i[yt]+Nt*this.s[yt+1],this.s[yt+1]=-Nt*i[yt]+Et*this.s[yt+1],vt=Nt*i[yt+1],i[yt+1]=Et*i[yt+1],yt<this.m-1)for(var At=0;At<this.m;At++)mt=Et*this.U[At][yt]+Nt*this.U[At][yt+1],this.U[At][yt+1]=-Nt*this.U[At][yt]+Et*this.U[At][yt+1],this.U[At][yt]=mt}i[L-2]=pt;break;case 4:if(this.s[V]<=0){this.s[V]=this.s[V]<0?-this.s[V]:0;for(var wt=0;wt<=H;wt++)this.V[wt][V]=-this.V[wt][V]}for(;V<H&&!(this.s[V]>=this.s[V+1]);){var Lt=this.s[V];if(this.s[V]=this.s[V+1],this.s[V+1]=Lt,V<this.n-1)for(var It=0;It<this.n;It++)Lt=this.V[It][V+1],this.V[It][V+1]=this.V[It][V],this.V[It][V]=Lt;if(V<this.m-1)for(var Ct=0;Ct<this.m;Ct++)Lt=this.U[Ct][V+1],this.U[Ct][V+1]=this.U[Ct][V],this.U[Ct][V]=Lt;V++}L--}}return{U:this.U,V:this.V,S:this.s}},n.hypot=function(t,e){var i=void 0;return Math.abs(t)>Math.abs(e)?(i=e/t,i=Math.abs(t)*Math.sqrt(1+i*i)):0!=e?(i=t/e,i=Math.abs(e)*Math.sqrt(1+i*i)):i=0,i},t.exports=n},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i=0;i<e.length;i++){var n=e[i];n.enumerable=n.enumerable||!1,n.configurable=!0,"value"in n&&(n.writable=!0),Object.defineProperty(t,n.key,n)}}return function(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}}(),r=function(){function t(e,i){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:-1,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sequence1=e,this.sequence2=i,this.match_score=n,this.mismatch_penalty=r,this.gap_penalty=o,this.iMax=e.length+1,this.jMax=i.length+1,this.grid=new Array(this.iMax);for(var s=0;s<this.iMax;s++){this.grid[s]=new Array(this.jMax);for(var a=0;a<this.jMax;a++)this.grid[s][a]=0}this.tracebackGrid=new Array(this.iMax);for(var h=0;h<this.iMax;h++){this.tracebackGrid[h]=new Array(this.jMax);for(var l=0;l<this.jMax;l++)this.tracebackGrid[h][l]=[null,null,null]}this.alignments=[],this.score=-1,this.computeGrids()}return n(t,[{key:"getScore",value:function(){return this.score}},{key:"getAlignments",value:function(){return this.alignments}},{key:"computeGrids",value:function(){for(var t=1;t<this.jMax;t++)this.grid[0][t]=this.grid[0][t-1]+this.gap_penalty,this.tracebackGrid[0][t]=[!1,!1,!0];for(var e=1;e<this.iMax;e++)this.grid[e][0]=this.grid[e-1][0]+this.gap_penalty,this.tracebackGrid[e][0]=[!1,!0,!1];for(var i=1;i<this.iMax;i++)for(var n=1;n<this.jMax;n++){var r=[this.sequence1[i-1]===this.sequence2[n-1]?this.grid[i-1][n-1]+this.match_score:this.grid[i-1][n-1]+this.mismatch_penalty,this.grid[i-1][n]+this.gap_penalty,this.grid[i][n-1]+this.gap_penalty],o=this.arrayAllMaxIndexes(r);this.grid[i][n]=r[o[0]],this.tracebackGrid[i][n]=[o.includes(0),o.includes(1),o.includes(2)]}this.score=this.grid[this.iMax-1][this.jMax-1]}},{key:"alignmentTraceback",value:function(){var t=[];for(t.push({pos:[this.sequence1.length,this.sequence2.length],seq1:"",seq2:""});t[0];){var e=t[0],i=this.tracebackGrid[e.pos[0]][e.pos[1]];i[0]&&t.push({pos:[e.pos[0]-1,e.pos[1]-1],seq1:this.sequence1[e.pos[0]-1]+e.seq1,seq2:this.sequence2[e.pos[1]-1]+e.seq2}),i[1]&&t.push({pos:[e.pos[0]-1,e.pos[1]],seq1:this.sequence1[e.pos[0]-1]+e.seq1,seq2:"-"+e.seq2}),i[2]&&t.push({pos:[e.pos[0],e.pos[1]-1],seq1:"-"+e.seq1,seq2:this.sequence2[e.pos[1]-1]+e.seq2}),0===e.pos[0]&&0===e.pos[1]&&this.alignments.push({sequence1:e.seq1,sequence2:e.seq2}),t.shift()}return this.alignments}},{key:"getAllIndexes",value:function(t,e){for(var i=[],n=-1;-1!==(n=t.indexOf(e,n+1));)i.push(n);return i}},{key:"arrayAllMaxIndexes",value:function(t){return this.getAllIndexes(t,Math.max.apply(null,t))}}]),t}();t.exports=r},function(t,e,i){"use strict";var n=function(){};n.FDLayout=i(18),n.FDLayoutConstants=i(4),n.FDLayoutEdge=i(19),n.FDLayoutNode=i(20),n.DimensionD=i(21),n.HashMap=i(22),n.HashSet=i(23),n.IGeometry=i(8),n.IMath=i(9),n.Integer=i(10),n.Point=i(12),n.PointD=i(5),n.RandomSeed=i(16),n.RectangleD=i(13),n.Transform=i(17),n.UniqueIDGeneretor=i(14),n.Quicksort=i(25),n.LinkedList=i(11),n.LGraphObject=i(2),n.LGraph=i(6),n.LEdge=i(1),n.LGraphManager=i(7),n.LNode=i(3),n.Layout=i(15),n.LayoutConstants=i(0),n.NeedlemanWunsch=i(27),n.Matrix=i(24),n.SVD=i(26),t.exports=n},function(t,e,i){"use strict";function n(){this.listeners=[]}var r=n.prototype;r.addListener=function(t,e){this.listeners.push({event:t,callback:e})},r.removeListener=function(t,e){for(var i=this.listeners.length;i>=0;i--){var n=this.listeners[i];n.event===t&&n.callback===e&&this.listeners.splice(i,1)}},r.emit=function(t,e){for(var i=0;i<this.listeners.length;i++){var n=this.listeners[i];t===n.event&&n.callback(e)}},t.exports=n}])},t.exports=e()},43346:(t,e,i)=>{"use strict";i.d(e,{diagram:()=>ut});var n=i(63727),r=i(45059),o=i(98645),s=i(9420),a=i(47765),h=i(97485),l=i(99339),c=i(79219),d=i(7406),g=i(3170),u={L:"left",R:"right",T:"top",B:"bottom"},f={L:(0,h.K2)(t=>`${t},${t/2} 0,${t} 0,0`,"L"),R:(0,h.K2)(t=>`0,${t/2} ${t},0 ${t},${t}`,"R"),T:(0,h.K2)(t=>`0,0 ${t},0 ${t/2},${t}`,"T"),B:(0,h.K2)(t=>`${t/2},0 ${t},${t} 0,${t}`,"B")},p={L:(0,h.K2)((t,e)=>t-e+2,"L"),R:(0,h.K2)((t,e)=>t-2,"R"),T:(0,h.K2)((t,e)=>t-e+2,"T"),B:(0,h.K2)((t,e)=>t-2,"B")},v=(0,h.K2)(function(t){return m(t)?"L"===t?"R":"L":"T"===t?"B":"T"},"getOppositeArchitectureDirection"),y=(0,h.K2)(function(t){return"L"===t||"R"===t||"T"===t||"B"===t},"isArchitectureDirection"),m=(0,h.K2)(function(t){return"L"===t||"R"===t},"isArchitectureDirectionX"),E=(0,h.K2)(function(t){return"T"===t||"B"===t},"isArchitectureDirectionY"),N=(0,h.K2)(function(t,e){const i=m(t)&&E(e),n=E(t)&&m(e);return i||n},"isArchitectureDirectionXY"),T=(0,h.K2)(function(t){const e=t[0],i=t[1],n=m(e)&&E(i),r=E(e)&&m(i);return n||r},"isArchitecturePairXY"),A=(0,h.K2)(function(t){return"LL"!==t&&"RR"!==t&&"TT"!==t&&"BB"!==t},"isValidArchitectureDirectionPair"),w=(0,h.K2)(function(t,e){const i=`${t}${e}`;return A(i)?i:void 0},"getArchitectureDirectionPair"),L=(0,h.K2)(function([t,e],i){const n=i[0],r=i[1];return m(n)?E(r)?[t+("L"===n?-1:1),e+("T"===r?1:-1)]:[t+("L"===n?-1:1),e]:m(r)?[t+("L"===r?1:-1),e+("T"===n?1:-1)]:[t,e+("T"===n?1:-1)]},"shiftPositionByArchitectureDirectionPair"),I=(0,h.K2)(function(t){return"LT"===t||"TL"===t?[1,1]:"BL"===t||"LB"===t?[1,-1]:"BR"===t||"RB"===t?[-1,-1]:[-1,1]},"getArchitectureDirectionXYFactors"),C=(0,h.K2)(function(t,e){return N(t,e)?"bend":m(t)?"horizontal":"vertical"},"getArchitectureDirectionAlignment"),_=(0,h.K2)(function(t){return"service"===t.type},"isArchitectureService"),M=(0,h.K2)(function(t){return"junction"===t.type},"isArchitectureJunction"),x=(0,h.K2)(t=>t.data(),"edgeData"),O=(0,h.K2)(t=>t.data(),"nodeData"),D=h.UI.architecture,R=new o.m(()=>({nodes:{},groups:{},edges:[],registeredIds:{},config:D,dataStructures:void 0,elements:{}})),b=(0,h.K2)(()=>{R.reset(),(0,h.IU)()},"clear"),G=(0,h.K2)(function({id:t,icon:e,in:i,title:n,iconText:r}){if(void 0!==R.records.registeredIds[t])throw new Error(`The service id [${t}] is already in use by another ${R.records.registeredIds[t]}`);if(void 0!==i){if(t===i)throw new Error(`The service [${t}] cannot be placed within itself`);if(void 0===R.records.registeredIds[i])throw new Error(`The service [${t}]'s parent does not exist. Please make sure the parent is created before this service`);if("node"===R.records.registeredIds[i])throw new Error(`The service [${t}]'s parent is not a group`)}R.records.registeredIds[t]="node",R.records.nodes[t]={id:t,type:"service",icon:e,iconText:r,title:n,edges:[],in:i}},"addService"),F=(0,h.K2)(()=>Object.values(R.records.nodes).filter(_),"getServices"),S=(0,h.K2)(function({id:t,in:e}){R.records.registeredIds[t]="node",R.records.nodes[t]={id:t,type:"junction",edges:[],in:e}},"addJunction"),P=(0,h.K2)(()=>Object.values(R.records.nodes).filter(M),"getJunctions"),U=(0,h.K2)(()=>Object.values(R.records.nodes),"getNodes"),Y=(0,h.K2)(t=>R.records.nodes[t],"getNode"),k=(0,h.K2)(function({id:t,icon:e,in:i,title:n}){if(void 0!==R.records.registeredIds[t])throw new Error(`The group id [${t}] is already in use by another ${R.records.registeredIds[t]}`);if(void 0!==i){if(t===i)throw new Error(`The group [${t}] cannot be placed within itself`);if(void 0===R.records.registeredIds[i])throw new Error(`The group [${t}]'s parent does not exist. Please make sure the parent is created before this group`);if("node"===R.records.registeredIds[i])throw new Error(`The group [${t}]'s parent is not a group`)}R.records.registeredIds[t]="group",R.records.groups[t]={id:t,icon:e,title:n,in:i}},"addGroup"),H=(0,h.K2)(()=>Object.values(R.records.groups),"getGroups"),X=(0,h.K2)(function({lhsId:t,rhsId:e,lhsDir:i,rhsDir:n,lhsInto:r,rhsInto:o,lhsGroup:s,rhsGroup:a,title:h}){if(!y(i))throw new Error(`Invalid direction given for left hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${i}`);if(!y(n))throw new Error(`Invalid direction given for right hand side of edge ${t}--${e}. Expected (L,R,T,B) got ${n}`);if(void 0===R.records.nodes[t]&&void 0===R.records.groups[t])throw new Error(`The left-hand id [${t}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(void 0===R.records.nodes[e]&&void 0===R.records.groups[t])throw new Error(`The right-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);const l=R.records.nodes[t].in,c=R.records.nodes[e].in;if(s&&l&&c&&l==c)throw new Error(`The left-hand id [${t}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(a&&l&&c&&l==c)throw new Error(`The right-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);const d={lhsId:t,lhsDir:i,lhsInto:r,lhsGroup:s,rhsId:e,rhsDir:n,rhsInto:o,rhsGroup:a,title:h};R.records.edges.push(d),R.records.nodes[t]&&R.records.nodes[e]&&(R.records.nodes[t].edges.push(R.records.edges[R.records.edges.length-1]),R.records.nodes[e].edges.push(R.records.edges[R.records.edges.length-1]))},"addEdge"),z=(0,h.K2)(()=>R.records.edges,"getEdges"),V=(0,h.K2)(()=>{if(void 0===R.records.dataStructures){const t={},e=Object.entries(R.records.nodes).reduce((e,[i,n])=>(e[i]=n.edges.reduce((e,n)=>{const r=Y(n.lhsId)?.in,o=Y(n.rhsId)?.in;if(r&&o&&r!==o){const e=C(n.lhsDir,n.rhsDir);"bend"!==e&&(t[r]??={},t[r][o]=e,t[o]??={},t[o][r]=e)}if(n.lhsId===i){const t=w(n.lhsDir,n.rhsDir);t&&(e[t]=n.rhsId)}else{const t=w(n.rhsDir,n.lhsDir);t&&(e[t]=n.lhsId)}return e},{}),e),{}),i=Object.keys(e)[0],n={[i]:1},r=Object.keys(e).reduce((t,e)=>e===i?t:{...t,[e]:1},{}),o=(0,h.K2)(t=>{const i={[t]:[0,0]},o=[t];for(;o.length>0;){const t=o.shift();if(t){n[t]=1,delete r[t];const s=e[t],[a,h]=i[t];Object.entries(s).forEach(([t,e])=>{n[e]||(i[e]=L([a,h],t),o.push(e))})}}return i},"BFS"),s=[o(i)];for(;Object.keys(r).length>0;)s.push(o(Object.keys(r)[0]));R.records.dataStructures={adjList:e,spatialMaps:s,groupAlignments:t}}return R.records.dataStructures},"getDataStructures"),B=(0,h.K2)((t,e)=>{R.records.elements[t]=e},"setElementForId"),W=(0,h.K2)(t=>R.records.elements[t],"getElementById"),j=(0,h.K2)(()=>(0,s.$t)({...D,...(0,h.zj)().architecture}),"getConfig"),$={clear:b,setDiagramTitle:h.ke,getDiagramTitle:h.ab,setAccTitle:h.SV,getAccTitle:h.iN,setAccDescription:h.EI,getAccDescription:h.m7,getConfig:j,addService:G,getServices:F,addJunction:S,getJunctions:P,getNodes:U,getNode:Y,addGroup:k,getGroups:H,addEdge:X,getEdges:z,setElementForId:B,getElementById:W,getDataStructures:V};function q(t){return j()[t]}(0,h.K2)(q,"getConfigField");var K=(0,h.K2)((t,e)=>{(0,r.S)(t,e),t.groups.map(e.addGroup),t.services.map(t=>e.addService({...t,type:"service"})),t.junctions.map(t=>e.addJunction({...t,type:"junction"})),t.edges.map(e.addEdge)},"populateDb"),Z={parse:(0,h.K2)(async t=>{const e=await(0,l.qg)("architecture",t);h.Rm.debug(e),K(e,$)},"parse")},Q=(0,h.K2)(t=>`\n .edge {\n stroke-width: ${t.archEdgeWidth};\n stroke: ${t.archEdgeColor};\n fill: none;\n }\n\n .arrow {\n fill: ${t.archEdgeArrowColor};\n }\n\n .node-bkg {\n fill: none;\n stroke: ${t.archGroupBorderColor};\n stroke-width: ${t.archGroupBorderWidth};\n stroke-dasharray: 8;\n }\n .node-icon-text {\n display: flex; \n align-items: center;\n }\n \n .node-icon-text > div {\n color: #fff;\n margin: 1px;\n height: fit-content;\n text-align: center;\n overflow: hidden;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n }\n`,"getStyles"),J=(0,h.K2)(t=>`<g><rect width="80" height="80" style="fill: #087ebf; stroke-width: 0px;"/>${t}</g>`,"wrapIcon"),tt={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:J('<path id="b" data-name="4" d="m20,57.86c0,3.94,8.95,7.14,20,7.14s20-3.2,20-7.14" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><path id="c" data-name="3" d="m20,45.95c0,3.94,8.95,7.14,20,7.14s20-3.2,20-7.14" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><path id="d" data-name="2" d="m20,34.05c0,3.94,8.95,7.14,20,7.14s20-3.2,20-7.14" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><ellipse id="e" data-name="1" cx="40" cy="22.14" rx="20" ry="7.14" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="20" y1="57.86" x2="20" y2="22.14" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="60" y1="57.86" x2="60" y2="22.14" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/>')},server:{body:J('<rect x="17.5" y="17.5" width="45" height="45" rx="2" ry="2" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="17.5" y1="32.5" x2="62.5" y2="32.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="17.5" y1="47.5" x2="62.5" y2="47.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><g><path d="m56.25,25c0,.27-.45.5-1,.5h-10.5c-.55,0-1-.23-1-.5s.45-.5,1-.5h10.5c.55,0,1,.23,1,.5Z" style="fill: #fff; stroke-width: 0px;"/><path d="m56.25,25c0,.27-.45.5-1,.5h-10.5c-.55,0-1-.23-1-.5s.45-.5,1-.5h10.5c.55,0,1,.23,1,.5Z" style="fill: none; stroke: #fff; stroke-miterlimit: 10;"/></g><g><path d="m56.25,40c0,.27-.45.5-1,.5h-10.5c-.55,0-1-.23-1-.5s.45-.5,1-.5h10.5c.55,0,1,.23,1,.5Z" style="fill: #fff; stroke-width: 0px;"/><path d="m56.25,40c0,.27-.45.5-1,.5h-10.5c-.55,0-1-.23-1-.5s.45-.5,1-.5h10.5c.55,0,1,.23,1,.5Z" style="fill: none; stroke: #fff; stroke-miterlimit: 10;"/></g><g><path d="m56.25,55c0,.27-.45.5-1,.5h-10.5c-.55,0-1-.23-1-.5s.45-.5,1-.5h10.5c.55,0,1,.23,1,.5Z" style="fill: #fff; stroke-width: 0px;"/><path d="m56.25,55c0,.27-.45.5-1,.5h-10.5c-.55,0-1-.23-1-.5s.45-.5,1-.5h10.5c.55,0,1,.23,1,.5Z" style="fill: none; stroke: #fff; stroke-miterlimit: 10;"/></g><g><circle cx="32.5" cy="25" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/><circle cx="27.5" cy="25" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/><circle cx="22.5" cy="25" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/></g><g><circle cx="32.5" cy="40" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/><circle cx="27.5" cy="40" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/><circle cx="22.5" cy="40" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/></g><g><circle cx="32.5" cy="55" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/><circle cx="27.5" cy="55" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/><circle cx="22.5" cy="55" r=".75" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10;"/></g>')},disk:{body:J('<rect x="20" y="15" width="40" height="50" rx="1" ry="1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><ellipse cx="24" cy="19.17" rx=".8" ry=".83" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><ellipse cx="56" cy="19.17" rx=".8" ry=".83" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><ellipse cx="24" cy="60.83" rx=".8" ry=".83" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><ellipse cx="56" cy="60.83" rx=".8" ry=".83" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><ellipse cx="40" cy="33.75" rx="14" ry="14.58" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><ellipse cx="40" cy="33.75" rx="4" ry="4.17" style="fill: #fff; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><path d="m37.51,42.52l-4.83,13.22c-.26.71-1.1,1.02-1.76.64l-4.18-2.42c-.66-.38-.81-1.26-.33-1.84l9.01-10.8c.88-1.05,2.56-.08,2.09,1.2Z" style="fill: #fff; stroke-width: 0px;"/>')},internet:{body:J('<circle cx="40" cy="40" r="22.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="40" y1="17.5" x2="40" y2="62.5" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="17.5" y1="40" x2="62.5" y2="40" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><path d="m39.99,17.51c-15.28,11.1-15.28,33.88,0,44.98" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><path d="m40.01,17.51c15.28,11.1,15.28,33.88,0,44.98" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="19.75" y1="30.1" x2="60.25" y2="30.1" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/><line x1="19.75" y1="49.9" x2="60.25" y2="49.9" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/>')},cloud:{body:J('<path d="m65,47.5c0,2.76-2.24,5-5,5H20c-2.76,0-5-2.24-5-5,0-1.87,1.03-3.51,2.56-4.36-.04-.21-.06-.42-.06-.64,0-2.6,2.48-4.74,5.65-4.97,1.65-4.51,6.34-7.76,11.85-7.76.86,0,1.69.08,2.5.23,2.09-1.57,4.69-2.5,7.5-2.5,6.1,0,11.19,4.38,12.28,10.17,2.14.56,3.72,2.51,3.72,4.83,0,.03,0,.07-.01.1,2.29.46,4.01,2.48,4.01,4.9Z" style="fill: none; stroke: #fff; stroke-miterlimit: 10; stroke-width: 2px;"/>')},unknown:n.Gc,blank:{body:J("")}}},et=(0,h.K2)(async function(t,e){const i=q("padding"),r=q("iconSize"),o=r/2,s=r/6,a=s/2;await Promise.all(e.edges().map(async e=>{const{source:r,sourceDir:l,sourceArrow:c,sourceGroup:d,target:g,targetDir:u,targetArrow:v,targetGroup:y,label:A}=x(e);let{x:L,y:C}=e[0].sourceEndpoint();const{x:_,y:M}=e[0].midpoint();let{x:O,y:D}=e[0].targetEndpoint();const R=i+4;if(d&&(m(l)?L+="L"===l?-R:R:C+="T"===l?-R:R+18),y&&(m(u)?O+="L"===u?-R:R:D+="T"===u?-R:R+18),d||"junction"!==$.getNode(r)?.type||(m(l)?L+="L"===l?o:-o:C+="T"===l?o:-o),y||"junction"!==$.getNode(g)?.type||(m(u)?O+="L"===u?o:-o:D+="T"===u?o:-o),e[0]._private.rscratch){const e=t.insert("g");if(e.insert("path").attr("d",`M ${L},${C} L ${_},${M} L${O},${D} `).attr("class","edge"),c){const t=m(l)?p[l](L,s):L-a,i=E(l)?p[l](C,s):C-a;e.insert("polygon").attr("points",f[l](s)).attr("transform",`translate(${t},${i})`).attr("class","arrow")}if(v){const t=m(u)?p[u](O,s):O-a,i=E(u)?p[u](D,s):D-a;e.insert("polygon").attr("points",f[u](s)).attr("transform",`translate(${t},${i})`).attr("class","arrow")}if(A){const t=N(l,u)?"XY":m(l)?"X":"Y";let i=0;i="X"===t?Math.abs(L-O):"Y"===t?Math.abs(C-D)/1.5:Math.abs(L-O)/2;const r=e.append("g");if(await(0,n.GZ)(r,A,{useHtmlLabels:!1,width:i,classes:"architecture-service-label"},(0,h.D7)()),r.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),"X"===t)r.attr("transform","translate("+_+", "+M+")");else if("Y"===t)r.attr("transform","translate("+_+", "+M+") rotate(-90)");else if("XY"===t){const t=w(l,u);if(t&&T(t)){const e=r.node().getBoundingClientRect(),[i,n]=I(t);r.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*i*n*45})`);const o=r.node().getBoundingClientRect();r.attr("transform",`\n translate(${_}, ${M-e.height/2})\n translate(${i*o.width/2}, ${n*o.height/2})\n rotate(${-1*i*n*45}, 0, ${e.height/2})\n `)}}}}}))},"drawEdges"),it=(0,h.K2)(async function(t,e){const i=.75*q("padding"),r=q("fontSize"),o=q("iconSize")/2;await Promise.all(e.nodes().map(async e=>{const s=O(e);if("group"===s.type){const{h:a,w:l,x1:c,y1:d}=e.boundingBox();t.append("rect").attr("x",c+o).attr("y",d+o).attr("width",l).attr("height",a).attr("class","node-bkg");const g=t.append("g");let u=c,f=d;if(s.icon){const t=g.append("g");t.html(`<g>${await(0,n.WY)(s.icon,{height:i,width:i,fallbackPrefix:tt.prefix})}</g>`),t.attr("transform","translate("+(u+o+1)+", "+(f+o+1)+")"),u+=i,f+=r/2-1-2}if(s.label){const t=g.append("g");await(0,n.GZ)(t,s.label,{useHtmlLabels:!1,width:l,classes:"architecture-service-label"},(0,h.D7)()),t.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),t.attr("transform","translate("+(u+o+4)+", "+(f+o+2)+")")}}}))},"drawGroups"),nt=(0,h.K2)(async function(t,e,i){for(const r of i){const i=e.append("g"),o=q("iconSize");if(r.title){const t=i.append("g");await(0,n.GZ)(t,r.title,{useHtmlLabels:!1,width:1.5*o,classes:"architecture-service-label"},(0,h.D7)()),t.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),t.attr("transform","translate("+o/2+", "+o+")")}const s=i.append("g");if(r.icon)s.html(`<g>${await(0,n.WY)(r.icon,{height:o,width:o,fallbackPrefix:tt.prefix})}</g>`);else if(r.iconText){s.html(`<g>${await(0,n.WY)("blank",{height:o,width:o,fallbackPrefix:tt.prefix})}</g>`);const t=s.append("g").append("foreignObject").attr("width",o).attr("height",o).append("div").attr("class","node-icon-text").attr("style",`height: ${o}px;`).append("div").html(r.iconText),e=parseInt(window.getComputedStyle(t.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;t.attr("style",`-webkit-line-clamp: ${Math.floor((o-2)/e)};`)}else s.append("path").attr("class","node-bkg").attr("id","node-"+r.id).attr("d",`M0 ${o} v${-o} q0,-5 5,-5 h${o} q5,0 5,5 v${o} H0 Z`);i.attr("class","architecture-service");const{width:a,height:l}=i._groups[0][0].getBBox();r.width=a,r.height=l,t.setElementForId(r.id,i)}return 0},"drawServices"),rt=(0,h.K2)(function(t,e,i){i.forEach(i=>{const n=e.append("g"),r=q("iconSize");n.append("g").append("rect").attr("id","node-"+i.id).attr("fill-opacity","0").attr("width",r).attr("height",r),n.attr("class","architecture-junction");const{width:o,height:s}=n._groups[0][0].getBBox();n.width=o,n.height=s,t.setElementForId(i.id,n)})},"drawJunctions");function ot(t,e){t.forEach(t=>{e.add({group:"nodes",data:{type:"service",id:t.id,icon:t.icon,label:t.title,parent:t.in,width:q("iconSize"),height:q("iconSize")},classes:"node-service"})})}function st(t,e){t.forEach(t=>{e.add({group:"nodes",data:{type:"junction",id:t.id,parent:t.in,width:q("iconSize"),height:q("iconSize")},classes:"node-junction"})})}function at(t,e){e.nodes().map(e=>{const i=O(e);if("group"===i.type)return;i.x=e.position().x,i.y=e.position().y;t.getElementById(i.id).attr("transform","translate("+(i.x||0)+","+(i.y||0)+")")})}function ht(t,e){t.forEach(t=>{e.add({group:"nodes",data:{type:"group",id:t.id,icon:t.icon,label:t.title,parent:t.in},classes:"node-group"})})}function lt(t,e){t.forEach(t=>{const{lhsId:i,rhsId:n,lhsInto:r,lhsGroup:o,rhsInto:s,lhsDir:a,rhsDir:h,rhsGroup:l,title:c}=t,d=N(t.lhsDir,t.rhsDir)?"segments":"straight",g={id:`${i}-${n}`,label:c,source:i,sourceDir:a,sourceArrow:r,sourceGroup:o,sourceEndpoint:"L"===a?"0 50%":"R"===a?"100% 50%":"T"===a?"50% 0":"50% 100%",target:n,targetDir:h,targetArrow:s,targetGroup:l,targetEndpoint:"L"===h?"0 50%":"R"===h?"100% 50%":"T"===h?"50% 0":"50% 100%"};e.add({group:"edges",data:g,classes:d})})}function ct(t,e,i){const n=(0,h.K2)((t,e)=>Object.entries(t).reduce((t,[n,r])=>{let o=0;const s=Object.entries(r);if(1===s.length)return t[n]=s[0][1],t;for(let a=0;a<s.length-1;a++)for(let r=a+1;r<s.length;r++){const[h,l]=s[a],[c,d]=s[r],g=i[h]?.[c];if(g===e)t[n]??=[],t[n]=[...t[n],...l,...d];else if("default"===h||"default"===c)t[n]??=[],t[n]=[...t[n],...l,...d];else{t[`${n}-${o++}`]=l;t[`${n}-${o++}`]=d}}return t},{}),"flattenAlignments"),r=e.map(e=>{const i={},r={};return Object.entries(e).forEach(([e,[n,o]])=>{const s=t.getNode(e)?.in??"default";i[o]??={},i[o][s]??=[],i[o][s].push(e),r[n]??={},r[n][s]??=[],r[n][s].push(e)}),{horiz:Object.values(n(i,"horizontal")).filter(t=>t.length>1),vert:Object.values(n(r,"vertical")).filter(t=>t.length>1)}}),[o,s]=r.reduce(([t,e],{horiz:i,vert:n})=>[[...t,...i],[...e,...n]],[[],[]]);return{horizontal:o,vertical:s}}function dt(t){const e=[],i=(0,h.K2)(t=>`${t[0]},${t[1]}`,"posToStr"),n=(0,h.K2)(t=>t.split(",").map(t=>parseInt(t)),"strToPos");return t.forEach(t=>{const r=Object.fromEntries(Object.entries(t).map(([t,e])=>[i(e),t])),o=[i([0,0])],s={},a={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;o.length>0;){const t=o.shift();if(t){s[t]=1;const h=r[t];if(h){const l=n(t);Object.entries(a).forEach(([t,n])=>{const a=i([l[0]+n[0],l[1]+n[1]]),c=r[a];c&&!s[a]&&(o.push(a),e.push({[u[t]]:c,[u[v(t)]]:h,gap:1.5*q("iconSize")}))})}}}}),e}function gt(t,e,i,n,r,{spatialMaps:o,groupAlignments:s}){return new Promise(a=>{const l=(0,g.Ltv)("body").append("div").attr("id","cy").attr("style","display:none"),d=(0,c.A)({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"straight",label:"data(label)","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"edge.segments",style:{"curve-style":"segments","segment-weights":"0","segment-distances":[.5],"edge-distances":"endpoints","source-endpoint":"data(sourceEndpoint)","target-endpoint":"data(targetEndpoint)"}},{selector:"node",style:{"compound-sizing-wrt-labels":"include"}},{selector:"node[label]",style:{"text-valign":"bottom","text-halign":"center","font-size":`${q("fontSize")}px`}},{selector:".node-service",style:{label:"data(label)",width:"data(width)",height:"data(height)"}},{selector:".node-junction",style:{width:"data(width)",height:"data(height)"}},{selector:".node-group",style:{padding:`${q("padding")}px`}}]});l.remove(),ht(i,d),ot(t,d),st(e,d),lt(n,d);const u=ct(r,o,s),f=dt(o),p=d.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(t){const[e,i]=t.connectedNodes(),{parent:n}=O(e),{parent:r}=O(i);return n===r?1.5*q("iconSize"):.5*q("iconSize")},edgeElasticity(t){const[e,i]=t.connectedNodes(),{parent:n}=O(e),{parent:r}=O(i);return n===r?.45:.001},alignmentConstraint:u,relativePlacementConstraint:f});p.one("layoutstop",()=>{function t(t,e,i,n){let r,o;const{x:s,y:a}=t,{x:h,y:l}=e;o=(n-a+(s-i)*(a-l)/(s-h))/Math.sqrt(1+Math.pow((a-l)/(s-h),2)),r=Math.sqrt(Math.pow(n-a,2)+Math.pow(i-s,2)-Math.pow(o,2));r/=Math.sqrt(Math.pow(h-s,2)+Math.pow(l-a,2));let c=(h-s)*(n-a)-(l-a)*(i-s);switch(!0){case c>=0:c=1;break;case c<0:c=-1}let d=(h-s)*(i-s)+(l-a)*(n-a);switch(!0){case d>=0:d=1;break;case d<0:d=-1}return o=Math.abs(o)*c,r*=d,{distances:o,weights:r}}(0,h.K2)(t,"getSegmentWeights"),d.startBatch();for(const e of Object.values(d.edges()))if(e.data?.()){const{x:i,y:n}=e.source().position(),{x:r,y:o}=e.target().position();if(i!==r&&n!==o){const i=e.sourceEndpoint(),n=e.targetEndpoint(),{sourceDir:r}=x(e),[o,s]=E(r)?[i.x,n.y]:[n.x,i.y],{weights:a,distances:h}=t(i,n,o,s);e.style("segment-distances",h),e.style("segment-weights",a)}}d.endBatch(),p.run()}),p.run(),d.ready(t=>{h.Rm.info("Ready",t),a(d)})})}(0,n.pC)([{name:tt.prefix,icons:tt}]),c.A.use(d),(0,h.K2)(ot,"addServices"),(0,h.K2)(st,"addJunctions"),(0,h.K2)(at,"positionNodes"),(0,h.K2)(ht,"addGroups"),(0,h.K2)(lt,"addEdges"),(0,h.K2)(ct,"getAlignments"),(0,h.K2)(dt,"getRelativeConstraints"),(0,h.K2)(gt,"layoutArchitecture");var ut={parser:Z,db:$,renderer:{draw:(0,h.K2)(async(t,e,i,n)=>{const r=n.db,o=r.getServices(),s=r.getJunctions(),l=r.getGroups(),c=r.getEdges(),d=r.getDataStructures(),g=(0,a.D)(e),u=g.append("g");u.attr("class","architecture-edges");const f=g.append("g");f.attr("class","architecture-services");const p=g.append("g");p.attr("class","architecture-groups"),await nt(r,f,o),rt(r,f,s);const v=await gt(o,s,l,c,r,d);await et(u,v),await it(p,v),at(r,v),(0,h.ot)(void 0,g,q("padding"),q("useMaxWidth"))},"draw")},styles:Q}},45059:(t,e,i)=>{"use strict";function n(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}i.d(e,{S:()=>n}),(0,i(97485).K2)(n,"populateCommonDb")},57601:function(t,e,i){var n;n=function(t){return(()=>{"use strict";var e={45:(t,e,i)=>{var n={};n.layoutBase=i(551),n.CoSEConstants=i(806),n.CoSEEdge=i(767),n.CoSEGraph=i(880),n.CoSEGraphManager=i(578),n.CoSELayout=i(765),n.CoSENode=i(991),n.ConstraintHandler=i(902),t.exports=n},806:(t,e,i)=>{var n=i(551).FDLayoutConstants;function r(){}for(var o in n)r[o]=n[o];r.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,r.DEFAULT_RADIAL_SEPARATION=n.DEFAULT_EDGE_LENGTH,r.DEFAULT_COMPONENT_SEPERATION=60,r.TILE=!0,r.TILING_PADDING_VERTICAL=10,r.TILING_PADDING_HORIZONTAL=10,r.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,r.ENFORCE_CONSTRAINTS=!0,r.APPLY_LAYOUT=!0,r.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,r.TREE_REDUCTION_ON_INCREMENTAL=!0,r.PURE_INCREMENTAL=r.DEFAULT_INCREMENTAL,t.exports=r},767:(t,e,i)=>{var n=i(551).FDLayoutEdge;function r(t,e,i){n.call(this,t,e,i)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},880:(t,e,i)=>{var n=i(551).LGraph;function r(t,e,i){n.call(this,t,e,i)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},578:(t,e,i)=>{var n=i(551).LGraphManager;function r(t){n.call(this,t)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},765:(t,e,i)=>{var n=i(551).FDLayout,r=i(578),o=i(880),s=i(991),a=i(767),h=i(806),l=i(902),c=i(551).FDLayoutConstants,d=i(551).LayoutConstants,g=i(551).Point,u=i(551).PointD,f=i(551).DimensionD,p=i(551).Layout,v=i(551).Integer,y=i(551).IGeometry,m=i(551).LGraph,E=i(551).Transform,N=i(551).LinkedList;function T(){n.call(this),this.toBeTiled={},this.constraints={}}for(var A in T.prototype=Object.create(n.prototype),n)T[A]=n[A];T.prototype.newGraphManager=function(){var t=new r(this);return this.graphManager=t,t},T.prototype.newGraph=function(t){return new o(null,this.graphManager,t)},T.prototype.newNode=function(t){return new s(this.graphManager,t)},T.prototype.newEdge=function(t){return new a(null,null,t)},T.prototype.initParameters=function(){n.prototype.initParameters.call(this,arguments),this.isSubLayout||(h.DEFAULT_EDGE_LENGTH<10?this.idealEdgeLength=10:this.idealEdgeLength=h.DEFAULT_EDGE_LENGTH,this.useSmartIdealEdgeLengthCalculation=h.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=c.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=c.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=c.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=c.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},T.prototype.initSpringEmbedder=function(){n.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/c.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},T.prototype.layout=function(){return d.DEFAULT_CREATE_BENDS_AS_NEEDED&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},T.prototype.classicLayout=function(){if(this.nodesWithGravity=this.calculateNodesToApplyGravitationTo(),this.graphManager.setAllNodesToApplyGravitation(this.nodesWithGravity),this.calcNoOfChildrenForAllNodes(),this.graphManager.calcLowestCommonAncestors(),this.graphManager.calcInclusionTreeDepths(),this.graphManager.getRoot().calcEstimatedSize(),this.calcIdealEdgeLengths(),this.incremental)h.TREE_REDUCTION_ON_INCREMENTAL&&(this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation(),e=new Set(this.getAllNodes()),i=this.nodesWithGravity.filter(function(t){return e.has(t)}),this.graphManager.setAllNodesToApplyGravitation(i));else{var t=this.getFlatForest();if(t.length>0)this.positionNodesRadially(t);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var e=new Set(this.getAllNodes()),i=this.nodesWithGravity.filter(function(t){return e.has(t)});this.graphManager.setAllNodesToApplyGravitation(i),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(l.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),h.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}if(this.totalIterations%c.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged()){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}this.coolingCycle++,0==this.layoutQuality?this.coolingAdjuster=this.coolingCycle:1==this.layoutQuality&&(this.coolingAdjuster=this.coolingCycle/3),this.coolingFactor=Math.max(this.initialCoolingFactor-Math.pow(this.coolingCycle,Math.log(100*(this.initialCoolingFactor-this.finalTemperature))/Math.log(this.maxCoolingCycle))/100*this.coolingAdjuster,this.finalTemperature),this.animationPeriod=Math.ceil(this.initialAnimationPeriod*Math.sqrt(this.coolingFactor))}if(this.isTreeGrowing){if(this.growTreeIterations%10==0)if(this.prunedNodesAll.length>0){this.graphManager.updateBounds(),this.updateGrid(),this.growTree(this.prunedNodesAll),this.graphManager.resetAllNodesToApplyGravitation();var t=new Set(this.getAllNodes()),e=this.nodesWithGravity.filter(function(e){return t.has(e)});this.graphManager.setAllNodesToApplyGravitation(e),this.graphManager.updateBounds(),this.updateGrid(),h.PURE_INCREMENTAL?this.coolingFactor=c.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=c.DEFAULT_COOLING_FACTOR_INCREMENTAL}else this.isTreeGrowing=!1,this.isGrowthFinished=!0;this.growTreeIterations++}if(this.isGrowthFinished){if(this.isConverged())return!0;this.afterGrowthIterations%10==0&&(this.graphManager.updateBounds(),this.updateGrid()),h.PURE_INCREMENTAL?this.coolingFactor=c.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=c.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var i=!this.isTreeGrowing&&!this.isGrowthFinished,n=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(i,n),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var t=this.graphManager.getAllNodes(),e={},i=0;i<t.length;i++){var n=t[i].rect,r=t[i].id;e[r]={id:r,x:n.getCenterX(),y:n.getCenterY(),w:n.width,h:n.height}}return e},T.prototype.runSpringEmbedder=function(){this.initialAnimationPeriod=25,this.animationPeriod=this.initialAnimationPeriod;var t=!1;if("during"===c.ANIMATE)this.emit("layoutstarted");else{for(;!t;)t=this.tick();this.graphManager.updateBounds()}},T.prototype.moveNodes=function(){for(var t=this.getAllNodes(),e=0;e<t.length;e++)t[e].calculateDisplacement();for(Object.keys(this.constraints).length>0&&this.updateDisplacements(),e=0;e<t.length;e++)t[e].move()},T.prototype.initConstraintVariables=function(){var t=this;this.idToNodeMap=new Map,this.fixedNodeSet=new Set;for(var e=this.graphManager.getAllNodes(),i=0;i<e.length;i++){var n=e[i];this.idToNodeMap.set(n.id,n)}var r=function e(i){for(var n,r=i.getChild().getNodes(),o=0,s=0;s<r.length;s++)null==(n=r[s]).getChild()?t.fixedNodeSet.has(n.id)&&(o+=100):o+=e(n);return o};if(this.constraints.fixedNodeConstraint)for(this.constraints.fixedNodeConstraint.forEach(function(e){t.fixedNodeSet.add(e.nodeId)}),e=this.graphManager.getAllNodes(),i=0;i<e.length;i++)if(null!=(n=e[i]).getChild()){var o=r(n);o>0&&(n.fixedNodeWeight=o)}if(this.constraints.relativePlacementConstraint){var s=new Map,a=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach(function(e){t.fixedNodesOnHorizontal.add(e),t.fixedNodesOnVertical.add(e)}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical){var l=this.constraints.alignmentConstraint.vertical;for(i=0;i<l.length;i++)this.dummyToNodeForVerticalAlignment.set("dummy"+i,[]),l[i].forEach(function(e){s.set(e,"dummy"+i),t.dummyToNodeForVerticalAlignment.get("dummy"+i).push(e),t.fixedNodeSet.has(e)&&t.fixedNodesOnHorizontal.add("dummy"+i)})}if(this.constraints.alignmentConstraint.horizontal){var c=this.constraints.alignmentConstraint.horizontal;for(i=0;i<c.length;i++)this.dummyToNodeForHorizontalAlignment.set("dummy"+i,[]),c[i].forEach(function(e){a.set(e,"dummy"+i),t.dummyToNodeForHorizontalAlignment.get("dummy"+i).push(e),t.fixedNodeSet.has(e)&&t.fixedNodesOnVertical.add("dummy"+i)})}}if(h.RELAX_MOVEMENT_ON_CONSTRAINTS)this.shuffle=function(t){var e,i,n;for(n=t.length-1;n>=2*t.length/3;n--)e=Math.floor(Math.random()*(n+1)),i=t[n],t[n]=t[e],t[e]=i;return t},this.nodesInRelativeHorizontal=[],this.nodesInRelativeVertical=[],this.nodeToRelativeConstraintMapHorizontal=new Map,this.nodeToRelativeConstraintMapVertical=new Map,this.nodeToTempPositionMapHorizontal=new Map,this.nodeToTempPositionMapVertical=new Map,this.constraints.relativePlacementConstraint.forEach(function(e){if(e.left){var i=s.has(e.left)?s.get(e.left):e.left,n=s.has(e.right)?s.get(e.right):e.right;t.nodesInRelativeHorizontal.includes(i)||(t.nodesInRelativeHorizontal.push(i),t.nodeToRelativeConstraintMapHorizontal.set(i,[]),t.dummyToNodeForVerticalAlignment.has(i)?t.nodeToTempPositionMapHorizontal.set(i,t.idToNodeMap.get(t.dummyToNodeForVerticalAlignment.get(i)[0]).getCenterX()):t.nodeToTempPositionMapHorizontal.set(i,t.idToNodeMap.get(i).getCenterX())),t.nodesInRelativeHorizontal.includes(n)||(t.nodesInRelativeHorizontal.push(n),t.nodeToRelativeConstraintMapHorizontal.set(n,[]),t.dummyToNodeForVerticalAlignment.has(n)?t.nodeToTempPositionMapHorizontal.set(n,t.idToNodeMap.get(t.dummyToNodeForVerticalAlignment.get(n)[0]).getCenterX()):t.nodeToTempPositionMapHorizontal.set(n,t.idToNodeMap.get(n).getCenterX())),t.nodeToRelativeConstraintMapHorizontal.get(i).push({right:n,gap:e.gap}),t.nodeToRelativeConstraintMapHorizontal.get(n).push({left:i,gap:e.gap})}else{var r=a.has(e.top)?a.get(e.top):e.top,o=a.has(e.bottom)?a.get(e.bottom):e.bottom;t.nodesInRelativeVertical.includes(r)||(t.nodesInRelativeVertical.push(r),t.nodeToRelativeConstraintMapVertical.set(r,[]),t.dummyToNodeForHorizontalAlignment.has(r)?t.nodeToTempPositionMapVertical.set(r,t.idToNodeMap.get(t.dummyToNodeForHorizontalAlignment.get(r)[0]).getCenterY()):t.nodeToTempPositionMapVertical.set(r,t.idToNodeMap.get(r).getCenterY())),t.nodesInRelativeVertical.includes(o)||(t.nodesInRelativeVertical.push(o),t.nodeToRelativeConstraintMapVertical.set(o,[]),t.dummyToNodeForHorizontalAlignment.has(o)?t.nodeToTempPositionMapVertical.set(o,t.idToNodeMap.get(t.dummyToNodeForHorizontalAlignment.get(o)[0]).getCenterY()):t.nodeToTempPositionMapVertical.set(o,t.idToNodeMap.get(o).getCenterY())),t.nodeToRelativeConstraintMapVertical.get(r).push({bottom:o,gap:e.gap}),t.nodeToRelativeConstraintMapVertical.get(o).push({top:r,gap:e.gap})}});else{var d=new Map,g=new Map;this.constraints.relativePlacementConstraint.forEach(function(t){if(t.left){var e=s.has(t.left)?s.get(t.left):t.left,i=s.has(t.right)?s.get(t.right):t.right;d.has(e)?d.get(e).push(i):d.set(e,[i]),d.has(i)?d.get(i).push(e):d.set(i,[e])}else{var n=a.has(t.top)?a.get(t.top):t.top,r=a.has(t.bottom)?a.get(t.bottom):t.bottom;g.has(n)?g.get(n).push(r):g.set(n,[r]),g.has(r)?g.get(r).push(n):g.set(r,[n])}});var u=function(t,e){var i=[],n=[],r=new N,o=new Set,s=0;return t.forEach(function(a,h){if(!o.has(h)){i[s]=[],n[s]=!1;var l=h;for(r.push(l),o.add(l),i[s].push(l);0!=r.length;)l=r.shift(),e.has(l)&&(n[s]=!0),t.get(l).forEach(function(t){o.has(t)||(r.push(t),o.add(t),i[s].push(t))});s++}}),{components:i,isFixed:n}},f=u(d,t.fixedNodesOnHorizontal);this.componentsOnHorizontal=f.components,this.fixedComponentsOnHorizontal=f.isFixed;var p=u(g,t.fixedNodesOnVertical);this.componentsOnVertical=p.components,this.fixedComponentsOnVertical=p.isFixed}}},T.prototype.updateDisplacements=function(){var t=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach(function(e){var i=t.idToNodeMap.get(e.nodeId);i.displacementX=0,i.displacementY=0}),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var e=this.constraints.alignmentConstraint.vertical,i=0;i<e.length;i++){for(var n=0,r=0;r<e[i].length;r++){if(this.fixedNodeSet.has(e[i][r])){n=0;break}n+=this.idToNodeMap.get(e[i][r]).displacementX}var o=n/e[i].length;for(r=0;r<e[i].length;r++)this.idToNodeMap.get(e[i][r]).displacementX=o}if(this.constraints.alignmentConstraint.horizontal){var s=this.constraints.alignmentConstraint.horizontal;for(i=0;i<s.length;i++){var a=0;for(r=0;r<s[i].length;r++){if(this.fixedNodeSet.has(s[i][r])){a=0;break}a+=this.idToNodeMap.get(s[i][r]).displacementY}var l=a/s[i].length;for(r=0;r<s[i].length;r++)this.idToNodeMap.get(s[i][r]).displacementY=l}}}if(this.constraints.relativePlacementConstraint)if(h.RELAX_MOVEMENT_ON_CONSTRAINTS)this.totalIterations%10==0&&(this.shuffle(this.nodesInRelativeHorizontal),this.shuffle(this.nodesInRelativeVertical)),this.nodesInRelativeHorizontal.forEach(function(e){if(!t.fixedNodesOnHorizontal.has(e)){var i=0;i=t.dummyToNodeForVerticalAlignment.has(e)?t.idToNodeMap.get(t.dummyToNodeForVerticalAlignment.get(e)[0]).displacementX:t.idToNodeMap.get(e).displacementX,t.nodeToRelativeConstraintMapHorizontal.get(e).forEach(function(n){var r;n.right?(r=t.nodeToTempPositionMapHorizontal.get(n.right)-t.nodeToTempPositionMapHorizontal.get(e)-i)<n.gap&&(i-=n.gap-r):(r=t.nodeToTempPositionMapHorizontal.get(e)-t.nodeToTempPositionMapHorizontal.get(n.left)+i)<n.gap&&(i+=n.gap-r)}),t.nodeToTempPositionMapHorizontal.set(e,t.nodeToTempPositionMapHorizontal.get(e)+i),t.dummyToNodeForVerticalAlignment.has(e)?t.dummyToNodeForVerticalAlignment.get(e).forEach(function(e){t.idToNodeMap.get(e).displacementX=i}):t.idToNodeMap.get(e).displacementX=i}}),this.nodesInRelativeVertical.forEach(function(e){if(!t.fixedNodesOnHorizontal.has(e)){var i=0;i=t.dummyToNodeForHorizontalAlignment.has(e)?t.idToNodeMap.get(t.dummyToNodeForHorizontalAlignment.get(e)[0]).displacementY:t.idToNodeMap.get(e).displacementY,t.nodeToRelativeConstraintMapVertical.get(e).forEach(function(n){var r;n.bottom?(r=t.nodeToTempPositionMapVertical.get(n.bottom)-t.nodeToTempPositionMapVertical.get(e)-i)<n.gap&&(i-=n.gap-r):(r=t.nodeToTempPositionMapVertical.get(e)-t.nodeToTempPositionMapVertical.get(n.top)+i)<n.gap&&(i+=n.gap-r)}),t.nodeToTempPositionMapVertical.set(e,t.nodeToTempPositionMapVertical.get(e)+i),t.dummyToNodeForHorizontalAlignment.has(e)?t.dummyToNodeForHorizontalAlignment.get(e).forEach(function(e){t.idToNodeMap.get(e).displacementY=i}):t.idToNodeMap.get(e).displacementY=i}});else{for(i=0;i<this.componentsOnHorizontal.length;i++){var c=this.componentsOnHorizontal[i];if(this.fixedComponentsOnHorizontal[i])for(r=0;r<c.length;r++)this.dummyToNodeForVerticalAlignment.has(c[r])?this.dummyToNodeForVerticalAlignment.get(c[r]).forEach(function(e){t.idToNodeMap.get(e).displacementX=0}):this.idToNodeMap.get(c[r]).displacementX=0;else{var d=0,g=0;for(r=0;r<c.length;r++)this.dummyToNodeForVerticalAlignment.has(c[r])?(d+=(f=this.dummyToNodeForVerticalAlignment.get(c[r])).length*this.idToNodeMap.get(f[0]).displacementX,g+=f.length):(d+=this.idToNodeMap.get(c[r]).displacementX,g++);var u=d/g;for(r=0;r<c.length;r++)this.dummyToNodeForVerticalAlignment.has(c[r])?this.dummyToNodeForVerticalAlignment.get(c[r]).forEach(function(e){t.idToNodeMap.get(e).displacementX=u}):this.idToNodeMap.get(c[r]).displacementX=u}}for(i=0;i<this.componentsOnVertical.length;i++)if(c=this.componentsOnVertical[i],this.fixedComponentsOnVertical[i])for(r=0;r<c.length;r++)this.dummyToNodeForHorizontalAlignment.has(c[r])?this.dummyToNodeForHorizontalAlignment.get(c[r]).forEach(function(e){t.idToNodeMap.get(e).displacementY=0}):this.idToNodeMap.get(c[r]).displacementY=0;else{for(d=0,g=0,r=0;r<c.length;r++){var f;this.dummyToNodeForHorizontalAlignment.has(c[r])?(d+=(f=this.dummyToNodeForHorizontalAlignment.get(c[r])).length*this.idToNodeMap.get(f[0]).displacementY,g+=f.length):(d+=this.idToNodeMap.get(c[r]).displacementY,g++)}for(u=d/g,r=0;r<c.length;r++)this.dummyToNodeForHorizontalAlignment.has(c[r])?this.dummyToNodeForHorizontalAlignment.get(c[r]).forEach(function(e){t.idToNodeMap.get(e).displacementY=u}):this.idToNodeMap.get(c[r]).displacementY=u}}},T.prototype.calculateNodesToApplyGravitationTo=function(){var t,e,i=[],n=this.graphManager.getGraphs(),r=n.length;for(e=0;e<r;e++)(t=n[e]).updateConnected(),t.isConnected||(i=i.concat(t.getNodes()));return i},T.prototype.createBendpoints=function(){var t=[];t=t.concat(this.graphManager.getAllEdges());var e,i=new Set;for(e=0;e<t.length;e++){var n=t[e];if(!i.has(n)){var r=n.getSource(),o=n.getTarget();if(r==o)n.getBendpoints().push(new u),n.getBendpoints().push(new u),this.createDummyNodesForBendpoints(n),i.add(n);else{var s=[];if(s=(s=s.concat(r.getEdgeListToNode(o))).concat(o.getEdgeListToNode(r)),!i.has(s[0])){var a;if(s.length>1)for(a=0;a<s.length;a++){var h=s[a];h.getBendpoints().push(new u),this.createDummyNodesForBendpoints(h)}s.forEach(function(t){i.add(t)})}}}if(i.size==t.length)break}},T.prototype.positionNodesRadially=function(t){for(var e=new g(0,0),i=Math.ceil(Math.sqrt(t.length)),n=0,r=0,o=0,s=new u(0,0),a=0;a<t.length;a++){a%i==0&&(o=0,r=n,0!=a&&(r+=h.DEFAULT_COMPONENT_SEPERATION),n=0);var l=t[a],c=p.findCenterOfTree(l);e.x=o,e.y=r,(s=T.radialLayout(l,c,e)).y>n&&(n=Math.floor(s.y)),o=Math.floor(s.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new u(d.WORLD_CENTER_X-s.x/2,d.WORLD_CENTER_Y-s.y/2))},T.radialLayout=function(t,e,i){var n=Math.max(this.maxDiagonalInTree(t),h.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(e,null,0,359,0,n);var r=m.calculateBounds(t),o=new E;o.setDeviceOrgX(r.getMinX()),o.setDeviceOrgY(r.getMinY()),o.setWorldOrgX(i.x),o.setWorldOrgY(i.y);for(var s=0;s<t.length;s++)t[s].transform(o);var a=new u(r.getMaxX(),r.getMaxY());return o.inverseTransformPoint(a)},T.branchRadialLayout=function(t,e,i,n,r,o){var s=(n-i+1)/2;s<0&&(s+=180);var a=(s+i)%360*y.TWO_PI/360,h=(Math.cos(a),r*Math.cos(a)),l=r*Math.sin(a);t.setCenter(h,l);var c=[],d=(c=c.concat(t.getEdges())).length;null!=e&&d--;for(var g,u=0,f=c.length,p=t.getEdgesBetween(e);p.length>1;){var v=p[0];p.splice(0,1);var m=c.indexOf(v);m>=0&&c.splice(m,1),f--,d--}g=null!=e?(c.indexOf(p[0])+1)%f:0;for(var E=Math.abs(n-i)/d,N=g;u!=d;N=++N%f){var A=c[N].getOtherEnd(t);if(A!=e){var w=(i+u*E)%360,L=(w+E)%360;T.branchRadialLayout(A,t,w,L,r+o,o),u++}}},T.maxDiagonalInTree=function(t){for(var e=v.MIN_VALUE,i=0;i<t.length;i++){var n=t[i].getDiagonal();n>e&&(e=n)}return e},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var t=this,e={};this.memberGroups={},this.idToDummyNode={};for(var i=[],n=this.graphManager.getAllNodes(),r=0;r<n.length;r++){var o=(a=n[r]).getParent();0!==this.getNodeDegreeWithChildren(a)||null!=o.id&&this.getToBeTiled(o)||i.push(a)}for(r=0;r<i.length;r++){var a,h=(a=i[r]).getParent().id;void 0===e[h]&&(e[h]=[]),e[h]=e[h].concat(a)}Object.keys(e).forEach(function(i){if(e[i].length>1){var n="DummyCompound_"+i;t.memberGroups[n]=e[i];var r=e[i][0].getParent(),o=new s(t.graphManager);o.id=n,o.paddingLeft=r.paddingLeft||0,o.paddingRight=r.paddingRight||0,o.paddingBottom=r.paddingBottom||0,o.paddingTop=r.paddingTop||0,t.idToDummyNode[n]=o;var a=t.getGraphManager().add(t.newGraph(),o),h=r.getChild();h.add(o);for(var l=0;l<e[i].length;l++){var c=e[i][l];h.remove(c),a.add(c)}}})},T.prototype.clearCompounds=function(){var t={},e={};this.performDFSOnCompounds();for(var i=0;i<this.compoundOrder.length;i++)e[this.compoundOrder[i].id]=this.compoundOrder[i],t[this.compoundOrder[i].id]=[].concat(this.compoundOrder[i].getChild().getNodes()),this.graphManager.remove(this.compoundOrder[i].getChild()),this.compoundOrder[i].child=null;this.graphManager.resetAllNodes(),this.tileCompoundMembers(t,e)},T.prototype.clearZeroDegreeMembers=function(){var t=this,e=this.tiledZeroDegreePack=[];Object.keys(this.memberGroups).forEach(function(i){var n=t.idToDummyNode[i];if(e[i]=t.tileNodes(t.memberGroups[i],n.paddingLeft+n.paddingRight),n.rect.width=e[i].width,n.rect.height=e[i].height,n.setCenter(e[i].centerX,e[i].centerY),n.labelMarginLeft=0,n.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var r=n.rect.width,o=n.rect.height;n.labelWidth&&("left"==n.labelPosHorizontal?(n.rect.x-=n.labelWidth,n.setWidth(r+n.labelWidth),n.labelMarginLeft=n.labelWidth):"center"==n.labelPosHorizontal&&n.labelWidth>r?(n.rect.x-=(n.labelWidth-r)/2,n.setWidth(n.labelWidth),n.labelMarginLeft=(n.labelWidth-r)/2):"right"==n.labelPosHorizontal&&n.setWidth(r+n.labelWidth)),n.labelHeight&&("top"==n.labelPosVertical?(n.rect.y-=n.labelHeight,n.setHeight(o+n.labelHeight),n.labelMarginTop=n.labelHeight):"center"==n.labelPosVertical&&n.labelHeight>o?(n.rect.y-=(n.labelHeight-o)/2,n.setHeight(n.labelHeight),n.labelMarginTop=(n.labelHeight-o)/2):"bottom"==n.labelPosVertical&&n.setHeight(o+n.labelHeight))}})},T.prototype.repopulateCompounds=function(){for(var t=this.compoundOrder.length-1;t>=0;t--){var e=this.compoundOrder[t],i=e.id,n=e.paddingLeft,r=e.paddingTop,o=e.labelMarginLeft,s=e.labelMarginTop;this.adjustLocations(this.tiledMemberPack[i],e.rect.x,e.rect.y,n,r,o,s)}},T.prototype.repopulateZeroDegreeMembers=function(){var t=this,e=this.tiledZeroDegreePack;Object.keys(e).forEach(function(i){var n=t.idToDummyNode[i],r=n.paddingLeft,o=n.paddingTop,s=n.labelMarginLeft,a=n.labelMarginTop;t.adjustLocations(e[i],n.rect.x,n.rect.y,r,o,s,a)})},T.prototype.getToBeTiled=function(t){var e=t.id;if(null!=this.toBeTiled[e])return this.toBeTiled[e];var i=t.getChild();if(null==i)return this.toBeTiled[e]=!1,!1;for(var n=i.getNodes(),r=0;r<n.length;r++){var o=n[r];if(this.getNodeDegree(o)>0)return this.toBeTiled[e]=!1,!1;if(null!=o.getChild()){if(!this.getToBeTiled(o))return this.toBeTiled[e]=!1,!1}else this.toBeTiled[o.id]=!1}return this.toBeTiled[e]=!0,!0},T.prototype.getNodeDegree=function(t){t.id;for(var e=t.getEdges(),i=0,n=0;n<e.length;n++){var r=e[n];r.getSource().id!==r.getTarget().id&&(i+=1)}return i},T.prototype.getNodeDegreeWithChildren=function(t){var e=this.getNodeDegree(t);if(null==t.getChild())return e;for(var i=t.getChild().getNodes(),n=0;n<i.length;n++){var r=i[n];e+=this.getNodeDegreeWithChildren(r)}return e},T.prototype.performDFSOnCompounds=function(){this.compoundOrder=[],this.fillCompexOrderByDFS(this.graphManager.getRoot().getNodes())},T.prototype.fillCompexOrderByDFS=function(t){for(var e=0;e<t.length;e++){var i=t[e];null!=i.getChild()&&this.fillCompexOrderByDFS(i.getChild().getNodes()),this.getToBeTiled(i)&&this.compoundOrder.push(i)}},T.prototype.adjustLocations=function(t,e,i,n,r,o,s){i+=r+s;for(var a=e+=n+o,h=0;h<t.rows.length;h++){var l=t.rows[h];e=a;for(var c=0,d=0;d<l.length;d++){var g=l[d];g.rect.x=e,g.rect.y=i,e+=g.rect.width+t.horizontalPadding,g.rect.height>c&&(c=g.rect.height)}i+=c+t.verticalPadding}},T.prototype.tileCompoundMembers=function(t,e){var i=this;this.tiledMemberPack=[],Object.keys(t).forEach(function(n){var r=e[n];if(i.tiledMemberPack[n]=i.tileNodes(t[n],r.paddingLeft+r.paddingRight),r.rect.width=i.tiledMemberPack[n].width,r.rect.height=i.tiledMemberPack[n].height,r.setCenter(i.tiledMemberPack[n].centerX,i.tiledMemberPack[n].centerY),r.labelMarginLeft=0,r.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var o=r.rect.width,s=r.rect.height;r.labelWidth&&("left"==r.labelPosHorizontal?(r.rect.x-=r.labelWidth,r.setWidth(o+r.labelWidth),r.labelMarginLeft=r.labelWidth):"center"==r.labelPosHorizontal&&r.labelWidth>o?(r.rect.x-=(r.labelWidth-o)/2,r.setWidth(r.labelWidth),r.labelMarginLeft=(r.labelWidth-o)/2):"right"==r.labelPosHorizontal&&r.setWidth(o+r.labelWidth)),r.labelHeight&&("top"==r.labelPosVertical?(r.rect.y-=r.labelHeight,r.setHeight(s+r.labelHeight),r.labelMarginTop=r.labelHeight):"center"==r.labelPosVertical&&r.labelHeight>s?(r.rect.y-=(r.labelHeight-s)/2,r.setHeight(r.labelHeight),r.labelMarginTop=(r.labelHeight-s)/2):"bottom"==r.labelPosVertical&&r.setHeight(s+r.labelHeight))}})},T.prototype.tileNodes=function(t,e){var i=this.tileNodesByFavoringDim(t,e,!0),n=this.tileNodesByFavoringDim(t,e,!1),r=this.getOrgRatio(i);return this.getOrgRatio(n)<r?n:i},T.prototype.getOrgRatio=function(t){var e=t.width/t.height;return e<1&&(e=1/e),e},T.prototype.calcIdealRowWidth=function(t,e){var i=h.TILING_PADDING_VERTICAL,n=h.TILING_PADDING_HORIZONTAL,r=t.length,o=0,s=0,a=0;t.forEach(function(t){o+=t.getWidth(),s+=t.getHeight(),t.getWidth()>a&&(a=t.getWidth())});var l,c=o/r,d=s/r,g=Math.pow(i-n,2)+4*(c+n)*(d+i)*r,u=(n-i+Math.sqrt(g))/(2*(c+n));e?(l=Math.ceil(u))==u&&l++:l=Math.floor(u);var f=l*(c+n)-n;return a>f&&(f=a),f+=2*n},T.prototype.tileNodesByFavoringDim=function(t,e,i){var n=h.TILING_PADDING_VERTICAL,r=h.TILING_PADDING_HORIZONTAL,o=h.TILING_COMPARE_BY,s={rows:[],rowWidth:[],rowHeight:[],width:0,height:e,verticalPadding:n,horizontalPadding:r,centerX:0,centerY:0};o&&(s.idealRowWidth=this.calcIdealRowWidth(t,i));var a=function(t){return t.rect.width*t.rect.height},l=function(t,e){return a(e)-a(t)};t.sort(function(t,e){var i=l;return s.idealRowWidth?(i=o)(t.id,e.id):i(t,e)});for(var c=0,d=0,g=0;g<t.length;g++)c+=(u=t[g]).getCenterX(),d+=u.getCenterY();for(s.centerX=c/t.length,s.centerY=d/t.length,g=0;g<t.length;g++){var u=t[g];if(0==s.rows.length)this.insertNodeToRow(s,u,0,e);else if(this.canAddHorizontal(s,u.rect.width,u.rect.height)){var f=s.rows.length-1;s.idealRowWidth||(f=this.getShortestRowIndex(s)),this.insertNodeToRow(s,u,f,e)}else this.insertNodeToRow(s,u,s.rows.length,e);this.shiftToLastRow(s)}return s},T.prototype.insertNodeToRow=function(t,e,i,n){var r=n;i==t.rows.length&&(t.rows.push([]),t.rowWidth.push(r),t.rowHeight.push(0));var o=t.rowWidth[i]+e.rect.width;t.rows[i].length>0&&(o+=t.horizontalPadding),t.rowWidth[i]=o,t.width<o&&(t.width=o);var s=e.rect.height;i>0&&(s+=t.verticalPadding);var a=0;s>t.rowHeight[i]&&(a=t.rowHeight[i],t.rowHeight[i]=s,a=t.rowHeight[i]-a),t.height+=a,t.rows[i].push(e)},T.prototype.getShortestRowIndex=function(t){for(var e=-1,i=Number.MAX_VALUE,n=0;n<t.rows.length;n++)t.rowWidth[n]<i&&(e=n,i=t.rowWidth[n]);return e},T.prototype.getLongestRowIndex=function(t){for(var e=-1,i=Number.MIN_VALUE,n=0;n<t.rows.length;n++)t.rowWidth[n]>i&&(e=n,i=t.rowWidth[n]);return e},T.prototype.canAddHorizontal=function(t,e,i){if(t.idealRowWidth){var n=t.rows.length-1;return t.rowWidth[n]+e+t.horizontalPadding<=t.idealRowWidth}var r=this.getShortestRowIndex(t);if(r<0)return!0;var o=t.rowWidth[r];if(o+t.horizontalPadding+e<=t.width)return!0;var s,a,h=0;return t.rowHeight[r]<i&&r>0&&(h=i+t.verticalPadding-t.rowHeight[r]),s=t.width-o>=e+t.horizontalPadding?(t.height+h)/(o+e+t.horizontalPadding):(t.height+h)/t.width,h=i+t.verticalPadding,(a=t.width<e?(t.height+h)/e:(t.height+h)/t.width)<1&&(a=1/a),s<1&&(s=1/s),s<a},T.prototype.shiftToLastRow=function(t){var e=this.getLongestRowIndex(t),i=t.rowWidth.length-1,n=t.rows[e],r=n[n.length-1],o=r.width+t.horizontalPadding;if(t.width-t.rowWidth[i]>o&&e!=i){n.splice(-1,1),t.rows[i].push(r),t.rowWidth[e]=t.rowWidth[e]-o,t.rowWidth[i]=t.rowWidth[i]+o,t.width=t.rowWidth[instance.getLongestRowIndex(t)];for(var s=Number.MIN_VALUE,a=0;a<n.length;a++)n[a].height>s&&(s=n[a].height);e>0&&(s+=t.verticalPadding);var h=t.rowHeight[e]+t.rowHeight[i];t.rowHeight[e]=s,t.rowHeight[i]<r.height+t.verticalPadding&&(t.rowHeight[i]=r.height+t.verticalPadding);var l=t.rowHeight[e]+t.rowHeight[i];t.height+=l-h,this.shiftToLastRow(t)}},T.prototype.tilingPreLayout=function(){h.TILE&&(this.groupZeroDegreeMembers(),this.clearCompounds(),this.clearZeroDegreeMembers())},T.prototype.tilingPostLayout=function(){h.TILE&&(this.repopulateZeroDegreeMembers(),this.repopulateCompounds())},T.prototype.reduceTrees=function(){for(var t,e=[],i=!0;i;){var n=this.graphManager.getAllNodes(),r=[];i=!1;for(var o=0;o<n.length;o++)if(1==(t=n[o]).getEdges().length&&!t.getEdges()[0].isInterGraph&&null==t.getChild()){if(h.PURE_INCREMENTAL){var s=t.getEdges()[0].getOtherEnd(t),a=new f(t.getCenterX()-s.getCenterX(),t.getCenterY()-s.getCenterY());r.push([t,t.getEdges()[0],t.getOwner(),a])}else r.push([t,t.getEdges()[0],t.getOwner()]);i=!0}if(1==i){for(var l=[],c=0;c<r.length;c++)1==r[c][0].getEdges().length&&(l.push(r[c]),r[c][0].getOwner().remove(r[c][0]));e.push(l),this.graphManager.resetAllNodes(),this.graphManager.resetAllEdges()}}this.prunedNodesAll=e},T.prototype.growTree=function(t){for(var e,i=t[t.length-1],n=0;n<i.length;n++)e=i[n],this.findPlaceforPrunedNode(e),e[2].add(e[0]),e[2].add(e[1],e[1].source,e[1].target);t.splice(t.length-1,1),this.graphManager.resetAllNodes(),this.graphManager.resetAllEdges()},T.prototype.findPlaceforPrunedNode=function(t){var e,i,n=t[0];if(i=n==t[1].source?t[1].target:t[1].source,h.PURE_INCREMENTAL)n.setCenter(i.getCenterX()+t[3].getWidth(),i.getCenterY()+t[3].getHeight());else{var r=i.startX,o=i.finishX,s=i.startY,a=i.finishY,l=[0,0,0,0];if(s>0)for(var d=r;d<=o;d++)l[0]+=this.grid[d][s-1].length+this.grid[d][s].length-1;if(o<this.grid.length-1)for(d=s;d<=a;d++)l[1]+=this.grid[o+1][d].length+this.grid[o][d].length-1;if(a<this.grid[0].length-1)for(d=r;d<=o;d++)l[2]+=this.grid[d][a+1].length+this.grid[d][a].length-1;if(r>0)for(d=s;d<=a;d++)l[3]+=this.grid[r-1][d].length+this.grid[r][d].length-1;for(var g,u,f=v.MAX_VALUE,p=0;p<l.length;p++)l[p]<f?(f=l[p],g=1,u=p):l[p]==f&&g++;if(3==g&&0==f)0==l[0]&&0==l[1]&&0==l[2]?e=1:0==l[0]&&0==l[1]&&0==l[3]?e=0:0==l[0]&&0==l[2]&&0==l[3]?e=3:0==l[1]&&0==l[2]&&0==l[3]&&(e=2);else if(2==g&&0==f){var y=Math.floor(2*Math.random());e=0==l[0]&&0==l[1]?0==y?0:1:0==l[0]&&0==l[2]?0==y?0:2:0==l[0]&&0==l[3]?0==y?0:3:0==l[1]&&0==l[2]?0==y?1:2:0==l[1]&&0==l[3]?0==y?1:3:0==y?2:3}else e=4==g&&0==f?y=Math.floor(4*Math.random()):u;0==e?n.setCenter(i.getCenterX(),i.getCenterY()-i.getHeight()/2-c.DEFAULT_EDGE_LENGTH-n.getHeight()/2):1==e?n.setCenter(i.getCenterX()+i.getWidth()/2+c.DEFAULT_EDGE_LENGTH+n.getWidth()/2,i.getCenterY()):2==e?n.setCenter(i.getCenterX(),i.getCenterY()+i.getHeight()/2+c.DEFAULT_EDGE_LENGTH+n.getHeight()/2):n.setCenter(i.getCenterX()-i.getWidth()/2-c.DEFAULT_EDGE_LENGTH-n.getWidth()/2,i.getCenterY())}},t.exports=T},991:(t,e,i)=>{var n=i(551).FDLayoutNode,r=i(551).IMath;function o(t,e,i,r){n.call(this,t,e,i,r)}for(var s in o.prototype=Object.create(n.prototype),n)o[s]=n[s];o.prototype.calculateDisplacement=function(){var t=this.graphManager.getLayout();null!=this.getChild()&&this.fixedNodeWeight?(this.displacementX+=t.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=t.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=t.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=t.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementX=t.coolingFactor*t.maxNodeDisplacement*r.sign(this.displacementX)),Math.abs(this.displacementY)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementY=t.coolingFactor*t.maxNodeDisplacement*r.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},o.prototype.propogateDisplacementToChildren=function(t,e){for(var i,n=this.getChild().getNodes(),r=0;r<n.length;r++)null==(i=n[r]).getChild()?(i.displacementX+=t,i.displacementY+=e):i.propogateDisplacementToChildren(t,e)},o.prototype.move=function(){var t=this.graphManager.getLayout();null!=this.child&&0!=this.child.getNodes().length||(this.moveBy(this.displacementX,this.displacementY),t.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY)),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},o.prototype.setPred1=function(t){this.pred1=t},o.prototype.getPred1=function(){return pred1},o.prototype.getPred2=function(){return pred2},o.prototype.setNext=function(t){this.next=t},o.prototype.getNext=function(){return next},o.prototype.setProcessed=function(t){this.processed=t},o.prototype.isProcessed=function(){return processed},t.exports=o},902:(t,e,i)=>{function n(t){if(Array.isArray(t)){for(var e=0,i=Array(t.length);e<t.length;e++)i[e]=t[e];return i}return Array.from(t)}var r=i(806),o=i(551).LinkedList,s=i(551).Matrix,a=i(551).SVD;function h(){}h.handleConstraints=function(t){var e={};e.fixedNodeConstraint=t.constraints.fixedNodeConstraint,e.alignmentConstraint=t.constraints.alignmentConstraint,e.relativePlacementConstraint=t.constraints.relativePlacementConstraint;for(var i=new Map,h=new Map,l=[],c=[],d=t.getAllNodes(),g=0,u=0;u<d.length;u++){var f=d[u];null==f.getChild()&&(h.set(f.id,g++),l.push(f.getCenterX()),c.push(f.getCenterY()),i.set(f.id,f))}e.relativePlacementConstraint&&e.relativePlacementConstraint.forEach(function(t){t.gap||0==t.gap||(t.left?t.gap=r.DEFAULT_EDGE_LENGTH+i.get(t.left).getWidth()/2+i.get(t.right).getWidth()/2:t.gap=r.DEFAULT_EDGE_LENGTH+i.get(t.top).getHeight()/2+i.get(t.bottom).getHeight()/2)});var p=function(t){var e=0,i=0;return t.forEach(function(t){e+=l[h.get(t)],i+=c[h.get(t)]}),{x:e/t.size,y:i/t.size}},v=function(t,e,i,r,s){var a=new Map;t.forEach(function(t,e){a.set(e,0)}),t.forEach(function(t,e){t.forEach(function(t){a.set(t.id,a.get(t.id)+1)})});var d=new Map,g=new Map,u=new o;a.forEach(function(t,n){0==t?(u.push(n),i||("horizontal"==e?d.set(n,h.has(n)?l[h.get(n)]:r.get(n)):d.set(n,h.has(n)?c[h.get(n)]:r.get(n)))):d.set(n,Number.NEGATIVE_INFINITY),i&&g.set(n,new Set([n]))}),i&&s.forEach(function(t){var n=[];if(t.forEach(function(t){i.has(t)&&n.push(t)}),n.length>0){var o=0;n.forEach(function(t){"horizontal"==e?(d.set(t,h.has(t)?l[h.get(t)]:r.get(t)),o+=d.get(t)):(d.set(t,h.has(t)?c[h.get(t)]:r.get(t)),o+=d.get(t))}),o/=n.length,t.forEach(function(t){i.has(t)||d.set(t,o)})}else{var s=0;t.forEach(function(t){s+="horizontal"==e?h.has(t)?l[h.get(t)]:r.get(t):h.has(t)?c[h.get(t)]:r.get(t)}),s/=t.length,t.forEach(function(t){d.set(t,s)})}});for(var f=function(){var n=u.shift();t.get(n).forEach(function(t){if(d.get(t.id)<d.get(n)+t.gap)if(i&&i.has(t.id)){var o=void 0;if(o="horizontal"==e?h.has(t.id)?l[h.get(t.id)]:r.get(t.id):h.has(t.id)?c[h.get(t.id)]:r.get(t.id),d.set(t.id,o),o<d.get(n)+t.gap){var s=d.get(n)+t.gap-o;g.get(n).forEach(function(t){d.set(t,d.get(t)-s)})}}else d.set(t.id,d.get(n)+t.gap);a.set(t.id,a.get(t.id)-1),0==a.get(t.id)&&u.push(t.id),i&&g.set(t.id,function(t,e){var i=new Set(t),n=!0,r=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done);n=!0){var h=s.value;i.add(h)}}catch(l){r=!0,o=l}finally{try{!n&&a.return&&a.return()}finally{if(r)throw o}}return i}(g.get(n),g.get(t.id)))})};0!=u.length;)f();if(i){var p=new Set;t.forEach(function(t,e){0==t.length&&p.add(e)});var v=[];g.forEach(function(t,e){if(p.has(e)){var r=!1,o=!0,s=!1,a=void 0;try{for(var h,l=t[Symbol.iterator]();!(o=(h=l.next()).done);o=!0){var c=h.value;i.has(c)&&(r=!0)}}catch(u){s=!0,a=u}finally{try{!o&&l.return&&l.return()}finally{if(s)throw a}}if(!r){var d=!1,g=void 0;v.forEach(function(e,i){e.has([].concat(n(t))[0])&&(d=!0,g=i)}),d?t.forEach(function(t){v[g].add(t)}):v.push(new Set(t))}}}),v.forEach(function(t,i){var n=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY,s=Number.NEGATIVE_INFINITY,a=Number.NEGATIVE_INFINITY,g=!0,u=!1,f=void 0;try{for(var p,v=t[Symbol.iterator]();!(g=(p=v.next()).done);g=!0){var y=p.value,m=void 0;m="horizontal"==e?h.has(y)?l[h.get(y)]:r.get(y):h.has(y)?c[h.get(y)]:r.get(y);var E=d.get(y);m<n&&(n=m),m>s&&(s=m),E<o&&(o=E),E>a&&(a=E)}}catch(_){u=!0,f=_}finally{try{!g&&v.return&&v.return()}finally{if(u)throw f}}var N=(n+s)/2-(o+a)/2,T=!0,A=!1,w=void 0;try{for(var L,I=t[Symbol.iterator]();!(T=(L=I.next()).done);T=!0){var C=L.value;d.set(C,d.get(C)+N)}}catch(_){A=!0,w=_}finally{try{!T&&I.return&&I.return()}finally{if(A)throw w}}})}return d},y=function(t){var e=0,i=0,n=0,r=0;if(t.forEach(function(t){t.left?l[h.get(t.left)]-l[h.get(t.right)]>=0?e++:i++:c[h.get(t.top)]-c[h.get(t.bottom)]>=0?n++:r++}),e>i&&n>r)for(var o=0;o<h.size;o++)l[o]=-1*l[o],c[o]=-1*c[o];else if(e>i)for(var s=0;s<h.size;s++)l[s]=-1*l[s];else if(n>r)for(var a=0;a<h.size;a++)c[a]=-1*c[a]},m=function(t){var e=[],i=new o,n=new Set,r=0;return t.forEach(function(o,s){if(!n.has(s)){e[r]=[];var a=s;for(i.push(a),n.add(a),e[r].push(a);0!=i.length;)a=i.shift(),t.get(a).forEach(function(t){n.has(t.id)||(i.push(t.id),n.add(t.id),e[r].push(t.id))});r++}}),e},E=function(t){var e=new Map;return t.forEach(function(t,i){e.set(i,[])}),t.forEach(function(t,i){t.forEach(function(t){e.get(i).push(t),e.get(t.id).push({id:i,gap:t.gap,direction:t.direction})})}),e},N=function(t){var e=new Map;return t.forEach(function(t,i){e.set(i,[])}),t.forEach(function(t,i){t.forEach(function(t){e.get(t.id).push({id:i,gap:t.gap,direction:t.direction})})}),e},T=[],A=[],w=!1,L=!1,I=new Set,C=new Map,_=new Map,M=[];if(e.fixedNodeConstraint&&e.fixedNodeConstraint.forEach(function(t){I.add(t.nodeId)}),e.relativePlacementConstraint&&(e.relativePlacementConstraint.forEach(function(t){t.left?(C.has(t.left)?C.get(t.left).push({id:t.right,gap:t.gap,direction:"horizontal"}):C.set(t.left,[{id:t.right,gap:t.gap,direction:"horizontal"}]),C.has(t.right)||C.set(t.right,[])):(C.has(t.top)?C.get(t.top).push({id:t.bottom,gap:t.gap,direction:"vertical"}):C.set(t.top,[{id:t.bottom,gap:t.gap,direction:"vertical"}]),C.has(t.bottom)||C.set(t.bottom,[]))}),_=E(C),M=m(_)),r.TRANSFORM_ON_CONSTRAINT_HANDLING){if(e.fixedNodeConstraint&&e.fixedNodeConstraint.length>1)e.fixedNodeConstraint.forEach(function(t,e){T[e]=[t.position.x,t.position.y],A[e]=[l[h.get(t.nodeId)],c[h.get(t.nodeId)]]}),w=!0;else if(e.alignmentConstraint)!function(){var t=0;if(e.alignmentConstraint.vertical){for(var i=e.alignmentConstraint.vertical,r=function(e){var r=new Set;i[e].forEach(function(t){r.add(t)});var o=new Set([].concat(n(r)).filter(function(t){return I.has(t)})),s=void 0;s=o.size>0?l[h.get(o.values().next().value)]:p(r).x,i[e].forEach(function(e){T[t]=[s,c[h.get(e)]],A[t]=[l[h.get(e)],c[h.get(e)]],t++})},o=0;o<i.length;o++)r(o);w=!0}if(e.alignmentConstraint.horizontal){for(var s=e.alignmentConstraint.horizontal,a=function(e){var i=new Set;s[e].forEach(function(t){i.add(t)});var r=new Set([].concat(n(i)).filter(function(t){return I.has(t)})),o=void 0;o=r.size>0?l[h.get(r.values().next().value)]:p(i).y,s[e].forEach(function(e){T[t]=[l[h.get(e)],o],A[t]=[l[h.get(e)],c[h.get(e)]],t++})},d=0;d<s.length;d++)a(d);w=!0}e.relativePlacementConstraint&&(L=!0)}();else if(e.relativePlacementConstraint){for(var x=0,O=0,D=0;D<M.length;D++)M[D].length>x&&(x=M[D].length,O=D);if(x<_.size/2)y(e.relativePlacementConstraint),w=!1,L=!1;else{var R=new Map,b=new Map,G=[];M[O].forEach(function(t){C.get(t).forEach(function(e){"horizontal"==e.direction?(R.has(t)?R.get(t).push(e):R.set(t,[e]),R.has(e.id)||R.set(e.id,[]),G.push({left:t,right:e.id})):(b.has(t)?b.get(t).push(e):b.set(t,[e]),b.has(e.id)||b.set(e.id,[]),G.push({top:t,bottom:e.id}))})}),y(G),L=!1;var F=v(R,"horizontal"),S=v(b,"vertical");M[O].forEach(function(t,e){A[e]=[l[h.get(t)],c[h.get(t)]],T[e]=[],F.has(t)?T[e][0]=F.get(t):T[e][0]=l[h.get(t)],S.has(t)?T[e][1]=S.get(t):T[e][1]=c[h.get(t)]}),w=!0}}if(w){for(var P,U=s.transpose(T),Y=s.transpose(A),k=0;k<U.length;k++)U[k]=s.multGamma(U[k]),Y[k]=s.multGamma(Y[k]);var H=s.multMat(U,s.transpose(Y)),X=a.svd(H);P=s.multMat(X.V,s.transpose(X.U));for(var z=0;z<h.size;z++){var V=[l[z],c[z]],B=[P[0][0],P[1][0]],W=[P[0][1],P[1][1]];l[z]=s.dotProduct(V,B),c[z]=s.dotProduct(V,W)}L&&y(e.relativePlacementConstraint)}}if(r.ENFORCE_CONSTRAINTS){if(e.fixedNodeConstraint&&e.fixedNodeConstraint.length>0){var j={x:0,y:0};e.fixedNodeConstraint.forEach(function(t,e){var i,n,r={x:l[h.get(t.nodeId)],y:c[h.get(t.nodeId)]},o=t.position,s=(n=r,{x:(i=o).x-n.x,y:i.y-n.y});j.x+=s.x,j.y+=s.y}),j.x/=e.fixedNodeConstraint.length,j.y/=e.fixedNodeConstraint.length,l.forEach(function(t,e){l[e]+=j.x}),c.forEach(function(t,e){c[e]+=j.y}),e.fixedNodeConstraint.forEach(function(t){l[h.get(t.nodeId)]=t.position.x,c[h.get(t.nodeId)]=t.position.y})}if(e.alignmentConstraint){if(e.alignmentConstraint.vertical)for(var $=e.alignmentConstraint.vertical,q=function(t){var e=new Set;$[t].forEach(function(t){e.add(t)});var i=new Set([].concat(n(e)).filter(function(t){return I.has(t)})),r=void 0;r=i.size>0?l[h.get(i.values().next().value)]:p(e).x,e.forEach(function(t){I.has(t)||(l[h.get(t)]=r)})},K=0;K<$.length;K++)q(K);if(e.alignmentConstraint.horizontal)for(var Z=e.alignmentConstraint.horizontal,Q=function(t){var e=new Set;Z[t].forEach(function(t){e.add(t)});var i=new Set([].concat(n(e)).filter(function(t){return I.has(t)})),r=void 0;r=i.size>0?c[h.get(i.values().next().value)]:p(e).y,e.forEach(function(t){I.has(t)||(c[h.get(t)]=r)})},J=0;J<Z.length;J++)Q(J)}e.relativePlacementConstraint&&function(){var t=new Map,i=new Map,n=new Map,r=new Map,o=new Map,s=new Map,a=new Set,d=new Set;if(I.forEach(function(t){a.add(t),d.add(t)}),e.alignmentConstraint){if(e.alignmentConstraint.vertical)for(var g=e.alignmentConstraint.vertical,u=function(e){n.set("dummy"+e,[]),g[e].forEach(function(i){t.set(i,"dummy"+e),n.get("dummy"+e).push(i),I.has(i)&&a.add("dummy"+e)}),o.set("dummy"+e,l[h.get(g[e][0])])},f=0;f<g.length;f++)u(f);if(e.alignmentConstraint.horizontal)for(var p=e.alignmentConstraint.horizontal,y=function(t){r.set("dummy"+t,[]),p[t].forEach(function(e){i.set(e,"dummy"+t),r.get("dummy"+t).push(e),I.has(e)&&d.add("dummy"+t)}),s.set("dummy"+t,c[h.get(p[t][0])])},T=0;T<p.length;T++)y(T)}var A=new Map,w=new Map,L=function(e){C.get(e).forEach(function(n){var r=void 0,o=void 0;"horizontal"==n.direction?(r=t.get(e)?t.get(e):e,o=t.get(n.id)?{id:t.get(n.id),gap:n.gap,direction:n.direction}:n,A.has(r)?A.get(r).push(o):A.set(r,[o]),A.has(o.id)||A.set(o.id,[])):(r=i.get(e)?i.get(e):e,o=i.get(n.id)?{id:i.get(n.id),gap:n.gap,direction:n.direction}:n,w.has(r)?w.get(r).push(o):w.set(r,[o]),w.has(o.id)||w.set(o.id,[]))})},_=!0,M=!1,x=void 0;try{for(var O,D=C.keys()[Symbol.iterator]();!(_=(O=D.next()).done);_=!0)L(O.value)}catch(tt){M=!0,x=tt}finally{try{!_&&D.return&&D.return()}finally{if(M)throw x}}var R=E(A),b=E(w),G=m(R),F=m(b),S=N(A),P=N(w),U=[],Y=[];G.forEach(function(t,e){U[e]=[],t.forEach(function(t){0==S.get(t).length&&U[e].push(t)})}),F.forEach(function(t,e){Y[e]=[],t.forEach(function(t){0==P.get(t).length&&Y[e].push(t)})});var k=v(A,"horizontal",a,o,U),H=v(w,"vertical",d,s,Y),X=function(t){n.get(t)?n.get(t).forEach(function(e){l[h.get(e)]=k.get(t)}):l[h.get(t)]=k.get(t)},z=!0,V=!1,B=void 0;try{for(var W,j=k.keys()[Symbol.iterator]();!(z=(W=j.next()).done);z=!0)X(W.value)}catch(tt){V=!0,B=tt}finally{try{!z&&j.return&&j.return()}finally{if(V)throw B}}var $=function(t){r.get(t)?r.get(t).forEach(function(e){c[h.get(e)]=H.get(t)}):c[h.get(t)]=H.get(t)},q=!0,K=!1,Z=void 0;try{for(var Q,J=H.keys()[Symbol.iterator]();!(q=(Q=J.next()).done);q=!0)$(Q.value)}catch(tt){K=!0,Z=tt}finally{try{!q&&J.return&&J.return()}finally{if(K)throw Z}}}()}for(var tt=0;tt<d.length;tt++){var et=d[tt];null==et.getChild()&&et.setCenter(l[h.get(et.id)],c[h.get(et.id)])}},t.exports=h},551:e=>{e.exports=t}},i={},n=function t(n){var r=i[n];if(void 0!==r)return r.exports;var o=i[n]={exports:{}};return e[n](o,o.exports,t),o.exports}(45);return n})()},t.exports=n(i(22318))},98645:(t,e,i)=>{"use strict";i.d(e,{m:()=>r});var n=i(97485),r=class{constructor(t){this.init=t,this.records=this.init()}static{(0,n.K2)(this,"ImperativeState")}reset(){this.records=this.init()}}}}]); \ No newline at end of file diff --git a/assets/js/341c85ac.bf75e08d.js b/assets/js/341c85ac.bf75e08d.js new file mode 100644 index 0000000000..b6df2db805 --- /dev/null +++ b/assets/js/341c85ac.bf75e08d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9479],{22281:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.12.1/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/inherited_dependency.md","tags":[],"version":"0.12.1","frontMatter":{"id":"inherited_dependency","slug":"/rules/inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.1/rules/must_be_api"},"next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/redundant_dependency"}}');var s=d(23420),i=d(65404);const o={id:"inherited_dependency",slug:"/rules/inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},c=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleB"}),", and ",(0,s.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,s.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,s.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,s.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,s.jsx)(n.code,{children:":moduleA"})," -> ",(0,s.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>o,x:()=>c});var t=d(36672);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/341f4c6e.7089d269.js b/assets/js/341f4c6e.7089d269.js new file mode 100644 index 0000000000..82df28fc3d --- /dev/null +++ b/assets/js/341f4c6e.7089d269.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5143],{65404:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var t=o(36672);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}},84633:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.12.2/rules/compiler/use_anvil_factory_generation.md","sourceDirName":"rules/compiler","slug":"/rules/use_anvil_factory_generation","permalink":"/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/compiler/use_anvil_factory_generation.md","tags":[],"version":"0.12.2","frontMatter":{"id":"use_anvil_factory_generation","slug":"/rules/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","sidebar_label":"Could Use Anvil Factory Generation"},"sidebar":"Docs","previous":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.2/rules/project_depth"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor"}}');var r=o(23420),i=o(65404);const s={id:"use_anvil_factory_generation",slug:"/rules/use_anvil_factory_generation",title:"Could Use Anvil Factory Generation",sidebar_label:"Could Use Anvil Factory Generation"},a=void 0,l={},c=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or\nSubcomponents, and it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/3471.8c232dc7.js b/assets/js/3471.8c232dc7.js new file mode 100644 index 0000000000..d6e4939012 --- /dev/null +++ b/assets/js/3471.8c232dc7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3471],{63471:(e,t,n)=>{n.r(t),n.d(t,{default:()=>h});n(36672);var i=n(53499),o=n(6617),s=n(64381),r=n(86417),a=n(23420);function h(){const e=(0,i.T)({id:"theme.NotFound.title",message:"Page Not Found"});return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(o.be,{title:e}),(0,a.jsx)(s.A,{children:(0,a.jsx)(r.A,{})})]})}},86417:(e,t,n)=>{n.d(t,{A:()=>a});n(36672);var i=n(13526),o=n(53499),s=n(33555),r=n(23420);function a({className:e}){return(0,r.jsx)("main",{className:(0,i.A)("container margin-vert--xl",e),children:(0,r.jsx)("div",{className:"row",children:(0,r.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,r.jsx)(s.A,{as:"h1",className:"hero__title",children:(0,r.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,r.jsx)("p",{children:(0,r.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/35179155.c63741dd.js b/assets/js/35179155.c63741dd.js new file mode 100644 index 0000000000..be2521e501 --- /dev/null +++ b/assets/js/35179155.c63741dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4151],{57534:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.12.4/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/inherited_dependency.md","tags":[],"version":"0.12.4","frontMatter":{"id":"inherited_dependency","slug":"/rules/inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.4/rules/must_be_api"},"next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/redundant_dependency"}}');var s=d(23420),i=d(65404);const o={id:"inherited_dependency",slug:"/rules/inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},c=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleB"}),", and ",(0,s.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,s.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,s.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,s.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,s.jsx)(n.code,{children:":moduleA"})," -> ",(0,s.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>o,x:()=>c});var t=d(36672);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/368eb302.357b41fd.js b/assets/js/368eb302.357b41fd.js new file mode 100644 index 0000000000..5fbac0cae5 --- /dev/null +++ b/assets/js/368eb302.357b41fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3914],{65404:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>i});var s=l(36672);const r={},t=s.createContext(r);function d(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(t.Provider,{value:n},e.children)}},75305:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","source":"@site/versioned_docs/version-0.12.2/rules/project_depth.md","sourceDirName":"rules","slug":"/rules/project_depth","permalink":"/ModuleCheck/docs/0.12.2/rules/project_depth","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/project_depth.md","tags":[],"version":"0.12.2","frontMatter":{"id":"project_depth","slug":"/rules/project_depth","title":"Project Depth","sidebar_label":"Project Depth"},"sidebar":"Docs","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/overshot_dependency"},"next":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation"}}');var r=l(23420),t=l(65404);const d={id:"project_depth",slug:"/rules/project_depth",title:"Project Depth",sidebar_label:"Project Depth"},i=void 0,c={},o=[{value:"Dependencies and Build Concurrency",id:"dependencies-and-build-concurrency",level:3},{value:"Depth",id:"depth",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",mermaid:"mermaid",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"TL;DR - Low depth values mean faster builds and better all-around scalability."}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["It's often useful to think of module dependencies as a directed tree\nor ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Directed_acyclic_graph",children:"directed acyclic graph"}),". If a module is a\nnode, then each module dependency is a child node, and the dependencies of those dependencies are\ngrand-child nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["This is especially useful when thinking about ",(0,r.jsx)(n.strong,{children:"build performance"}),", because the parent-child\nrelationship is clear: ",(0,r.jsx)(n.em,{children:"child nodes must build before parent nodes"}),"."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(:app):::depth2\n\n screen1(:screen-1):::depth1\n screen2(:screen-2):::depth1\n\n lib1(:lib-1):::depth0\n lib2(:lib-2):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n\n screen1 --\x3e lib1\n screen1 --\x3e lib2\n screen2 --\x3e lib2"}),"\n",(0,r.jsx)(n.p,{children:"In the above example,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," must be built before ",(0,r.jsx)(n.code,{children:":screen-1"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-2"})," must be build before ",(0,r.jsx)(n.code,{children:":screen-2"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":screen-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," must be built before ",(0,r.jsx)(n.code,{children:":app"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build\nbefore their parents."}),"\n",(0,r.jsx)(n.h3,{id:"dependencies-and-build-concurrency",children:"Dependencies and Build Concurrency"}),"\n",(0,r.jsx)(n.p,{children:"Individual module builds are always done single-threaded, but multiple modules may build in parallel\nso long as no module in the set depends upon another module in that set. In the above graph,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":scren-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The maximum number of parallel module builds is determined by the structure of the dependency graph\nand the number of available processor cores on the machine which is performing the build."}),"\n",(0,r.jsx)(n.h3,{id:"depth",children:"Depth"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Depth"})," refers to the maximum number of edges between a module and each of its leaf nodes in the\nproject dependency graph."]}),"\n",(0,r.jsx)(n.p,{children:"Low depth values indicate a shallow or flat project structure with loose (or no) coupling between\nmodules. In a full build, these projects scale well with hardware upgrades because they're able to\nbuild all those independent modules in parallel."}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n subgraph sg [A shallow graph]\n direction TB\n\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 2):::depth2\n\n screen1(depth: 1):::depth1\n screen2(depth: 1):::depth1\n screen3(depth: 1):::depth1\n screen4(depth: 1):::depth1\n\n lib1(depth: 0):::depth0\n lib2(depth: 0):::depth0\n lib3(depth: 0):::depth0\n lib4(depth: 0):::depth0\n lib5(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e lib1\n screen1 --\x3e lib4\n\n screen2 --\x3e lib1\n screen2 --\x3e lib3\n screen2 --\x3e lib4\n\n screen3 --\x3e lib2\n screen3 --\x3e lib3\n screen3 --\x3e lib4\n\n screen4 --\x3e lib3\n screen4 --\x3e lib5\n\n end\n\n style sg opacity:0.0\n"}),"\n",(0,r.jsxs)(n.p,{children:['On the other hand, "deep" projects do not offer many opportunities for parallelization. They have\nproject dependencies which must be built ',(0,r.jsx)(n.em,{children:"sequentially"}),". They also perform poorly in incremental\nbuilds, because a single change to even a mid-level module invalidates cached builds for half of the\nproject."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n style sg opacity:0.0\n subgraph sg [A deep graph]\n direction TB\n\n classDef depth6 fill:#800,stroke:#000,color:#FFF\n classDef depth5 fill:#A50,stroke:#000,color:#FFF\n classDef depth4 fill:#C0B,stroke:#000,color:#000\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 6):::depth6\n\n screen1(depth: 5):::depth5\n screen2(depth: 5):::depth5\n\n screen3(depth: 4):::depth4\n screen4(depth: 4):::depth4\n\n lib1(depth: 3):::depth3\n lib2(depth: 3):::depth3\n\n lib3(depth: 2):::depth2\n lib4(depth: 2):::depth2\n\n lib5(depth: 1):::depth1\n\n lib6(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e screen3\n screen1 --\x3e screen4\n\n screen2 --\x3e screen4\n\n screen3 --\x3e lib1\n screen3 --\x3e lib2\n\n screen4 --\x3e lib1\n screen4 --\x3e lib4\n\n lib1 --\x3e lib3\n lib1 --\x3e lib4\n\n lib2 --\x3e lib3\n\n lib3 --\x3e lib5\n lib4 --\x3e lib5\n\n lib5 --\x3e lib6\n\n end\n"})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/388f1aef.4435dd88.js b/assets/js/388f1aef.4435dd88.js new file mode 100644 index 0000000000..79b6413489 --- /dev/null +++ b/assets/js/388f1aef.4435dd88.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4955],{28859:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.12.5/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/inherited_dependency.md","tags":[],"version":"0.12.5","frontMatter":{"id":"inherited_dependency","slug":"/rules/inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/rules/must_be_api"},"next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/rules/redundant_dependency"}}');var s=d(23420),i=d(65404);const o={id:"inherited_dependency",slug:"/rules/inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},c=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleB"}),", and ",(0,s.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,s.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,s.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,s.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,s.jsx)(n.code,{children:":moduleA"})," -> ",(0,s.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>o,x:()=>c});var t=d(36672);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3abc021e.2ffb79a9.js b/assets/js/3abc021e.2ffb79a9.js new file mode 100644 index 0000000000..7babfc2db1 --- /dev/null +++ b/assets/js/3abc021e.2ffb79a9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6966],{7357:(e,n,r)=>{r.d(n,{A:()=>l});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var s=r(23420);function l({children:e,hidden:n,className:r}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},51302:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"Dependencies","source":"@site/versioned_docs/version-0.12.1/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.12.1/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/quickstart.mdx","tags":[],"version":"0.12.1","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.1/configuration"}}');var a=r(23420),s=r(65404),l=r(83796),o=r(7357);const c={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},i=void 0,u={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven("https://oss.sonatype.org/content/repositories/snapshots/")\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.12.1"\n}\n'})})]}),(0,a.jsxs)(o.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven {\n url "https://oss.sonatype.org/content/repositories/snapshots"\n }\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.12.1'\n}\n"})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,a.jsx)(n.p,{children:"all checks"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,a.jsx)(n.p,{children:"all checks with auto-correct"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"check sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,a.jsx)(n.p,{children:"apply sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"report depths of each module"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckDepths\n"})}),"\n",(0,a.jsx)(n.p,{children:"generate (module-only) dependency graphs"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckGraphs\n"})}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.1/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>o});var t=r(36672);const a={},s=t.createContext(a);function l(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(s.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(36672),a=r(13526),s=r(58797),l=r(85291),o=r(52245),c=r(32342),i=r(45223),u=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,i.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,s=h(e),[l,c]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s})),[i,d]=g({queryString:r,groupId:a}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{b&&c(b)},[b]);return{selectedValue:l,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);c(e),d(e),f(e)},[d,f,s]),tabValues:s}}var f=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:t,tabValues:l}){const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),i=e=>{const n=e.currentTarget,a=o.indexOf(n),s=l[a].value;s!==r&&(c(n),t(s))},u=e=>{let n=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:u,onClick:i,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/3e41c308.24bd886f.js b/assets/js/3e41c308.24bd886f.js new file mode 100644 index 0000000000..78a498dbcf --- /dev/null +++ b/assets/js/3e41c308.24bd886f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8596],{35212:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","source":"@site/versioned_docs/version-0.11.0/rules/kapt/unused_kapt_plugin.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/kapt/unused_kapt_plugin.md","tags":[],"version":"0.11.0","frontMatter":{"id":"unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers"}}');var o=n(23420),u=n(65404);const r={id:"unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,a={},p=[];function c(e){const t={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(t.p,{children:["If there are no ",(0,o.jsx)(t.code,{children:"kapt"}),"/",(0,o.jsx)(t.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in applying\nthe ",(0,o.jsx)(t.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function l(e={}){const{wrapper:t}={...(0,u.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var s=n(36672);const o={},u=s.createContext(o);function r(e){const t=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3e68fbe7.9af0cab4.js b/assets/js/3e68fbe7.9af0cab4.js new file mode 100644 index 0000000000..7e64b4faa5 --- /dev/null +++ b/assets/js/3e68fbe7.9af0cab4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5241],{62027:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>d,toc:()=>i});const d=JSON.parse('{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.12.2/rules/unused_dependency.md","sourceDirName":"rules","slug":"/rules/unused_dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/unused_dependency.md","tags":[],"version":"0.12.2","frontMatter":{"id":"unused_dependency","slug":"/rules/unused_dependency","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.2/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.2/rules/must_be_api"}}');var t=s(23420),u=s(65404);const o={id:"unused_dependency",slug:"/rules/unused_dependency",title:"Unused Dependency",sidebar_label:"Unused Dependency"},c=void 0,r={},i=[];function l(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,t.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var d=s(36672);const t={},u=d.createContext(t);function o(e){const n=d.useContext(u);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),d.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/3fb0a163.cf9203ef.js b/assets/js/3fb0a163.cf9203ef.js new file mode 100644 index 0000000000..8f474d9d14 --- /dev/null +++ b/assets/js/3fb0a163.cf9203ef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9805],{7357:(e,t,n)=>{n.d(t,{A:()=>o});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var s=n(23420);function o({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},65404:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>u});var r=n(36672);const a={},s=r.createContext(a);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:t},e.children)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),s=n(58797),o=n(85291),u=n(52245),l=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function f(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,n])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,s=f(e),[o,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),g=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,u.A)(()=>{g&&l(g)},[g]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var b=n(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var y=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:o}){const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,s.a_)(),i=e=>{const t=e.currentTarget,a=u.indexOf(t),s=o[a].value;s!==n&&(l(t),r(s))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:o.map(({value:e,label:t,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{u.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,y.jsx)(v,{...t,...e}),(0,y.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,y.jsx)(j,{...e,children:d(e.children)},String(t))}},98273:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.12.2/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.12.2/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/configuration.mdx","tags":[],"version":"0.12.2","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.12.2/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.2/suppressing-findings"}}');var a=n(23420),s=n(65404),o=n(83796),u=n(7357);const l={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function f(e){const t={code:"code",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(o.A,{children:[(0,a.jsx)(u.A,{value:"Kotlin",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'plugins {\n id("com.rickbusarow.module-check") version "0.12.2"\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalCodeGenerators = listOf(\n modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n name = "My Processor",\n generatorMavenCoordinates = "my-project.codegen:processor",\n annotationNames = listOf(\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(u.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'plugins {\n id \'com.rickbusarow.module-check\' version \'0.12.2\'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = [\':test:core-jvm\', \':test:core-android\']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [\':app\']\n\n additionalCodeGenerators = [\n new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n \'My Processor\',\n \'my-project.codegen:processor\',\n [\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n it.enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n it.outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n\n}\n'})})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(f,{...e})}):f(e)}}}]); \ No newline at end of file diff --git a/assets/js/400cc4b7.f8b9ca7c.js b/assets/js/400cc4b7.f8b9ca7c.js new file mode 100644 index 0000000000..35d0c1ee67 --- /dev/null +++ b/assets/js/400cc4b7.f8b9ca7c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1472],{32652:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","source":"@site/versioned_docs/version-0.12.3/rules/compiler/unused_kapt_plugin.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/compiler/unused_kapt_plugin.md","tags":[],"version":"0.12.3","frontMatter":{"id":"unused_kapt_plugin","slug":"/rules/unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers"}}');var o=t(23420),u=t(65404);const r={id:"unused_kapt_plugin",slug:"/rules/unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,l={},c=[];function p(e){const n={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(n.p,{children:["If there are no ",(0,o.jsx)(n.code,{children:"kapt"}),"/",(0,o.jsx)(n.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in\napplying the ",(0,o.jsx)(n.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function d(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>i});var s=t(36672);const o={},u=s.createContext(o);function r(e){const n=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4047.e935efab.js b/assets/js/4047.e935efab.js new file mode 100644 index 0000000000..6b0aa962b7 --- /dev/null +++ b/assets/js/4047.e935efab.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4047],{64047:(e,c,k)=>{k.r(c)}}]); \ No newline at end of file diff --git a/assets/js/4047c50f.c0b206fe.js b/assets/js/4047c50f.c0b206fe.js new file mode 100644 index 0000000000..ab7f90c462 --- /dev/null +++ b/assets/js/4047c50f.c0b206fe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9514],{65404:(e,n,o)=>{o.d(n,{R:()=>d,x:()=>r});var t=o(36672);const s={},i=t.createContext(s);function d(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:d(e.components),t.createElement(i.Provider,{value:n},e.children)}},72275:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>d,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","source":"@site/versioned_docs/version-0.12.0/rules/android/unused_kotlin_android_extensions.md","sourceDirName":"rules/android","slug":"/rules/android/unused_kotlin_android_extensions","permalink":"/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/android/unused_kotlin_android_extensions.md","tags":[],"version":"0.12.0","frontMatter":{"id":"unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","sidebar_label":"Unused Kotlin Android Extensions"},"sidebar":"Docs","previous":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding"}}');var s=o(23420),i=o(65404);const d={id:"unused_kotlin_android_extensions",title:"Unused Kotlin Android Extensions",sidebar_label:"Unused Kotlin Android Extensions"},r=void 0,u={},a=[];function l(e){const n={p:"p",...(0,i.R)(),...e.components};return(0,s.jsx)(n.p,{children:"Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any\nsynthetic imports or deprecated @Parcelize annotation"})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/4078.053eb54c.js b/assets/js/4078.053eb54c.js new file mode 100644 index 0000000000..51400ed3e0 --- /dev/null +++ b/assets/js/4078.053eb54c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4078],{4078:(t,e,n)=>{n.d(e,{diagram:()=>J});var i=n(41041),s=n(11047),r=n(97485),a=n(3170),o=function(){var t=(0,r.K2)(function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},"o"),e=[6,8,10,11,12,14,16,17,18],n=[1,9],i=[1,10],s=[1,11],a=[1,12],o=[1,13],l=[1,14],c={trace:(0,r.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,journey:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,title:11,acc_title:12,acc_title_value:13,acc_descr:14,acc_descr_value:15,acc_descr_multiline_value:16,section:17,taskName:18,taskData:19,$accept:0,$end:1},terminals_:{2:"error",4:"journey",6:"EOF",8:"SPACE",10:"NEWLINE",11:"title",12:"acc_title",13:"acc_title_value",14:"acc_descr",15:"acc_descr_value",16:"acc_descr_multiline_value",17:"section",18:"taskName",19:"taskData"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,2]],performAction:(0,r.K2)(function(t,e,n,i,s,r,a){var o=r.length-1;switch(s){case 1:return r[o-1];case 2:case 6:case 7:this.$=[];break;case 3:r[o-1].push(r[o]),this.$=r[o-1];break;case 4:case 5:this.$=r[o];break;case 8:i.setDiagramTitle(r[o].substr(6)),this.$=r[o].substr(6);break;case 9:this.$=r[o].trim(),i.setAccTitle(this.$);break;case 10:case 11:this.$=r[o].trim(),i.setAccDescription(this.$);break;case 12:i.addSection(r[o].substr(8)),this.$=r[o].substr(8);break;case 13:i.addTask(r[o-1],r[o]),this.$="task"}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:n,12:i,14:s,16:a,17:o,18:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:15,11:n,12:i,14:s,16:a,17:o,18:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,16]},{15:[1,17]},t(e,[2,11]),t(e,[2,12]),{19:[1,18]},t(e,[2,4]),t(e,[2,9]),t(e,[2,10]),t(e,[2,13])],defaultActions:{},parseError:(0,r.K2)(function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},"parseError"),parse:(0,r.K2)(function(t){var e=this,n=[0],i=[],s=[null],a=[],o=this.table,l="",c=0,h=0,u=0,y=a.slice.call(arguments,1),p=Object.create(this.lexer),d={yy:{}};for(var f in this.yy)Object.prototype.hasOwnProperty.call(this.yy,f)&&(d.yy[f]=this.yy[f]);p.setInput(t,d.yy),d.yy.lexer=p,d.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var g=p.yylloc;a.push(g);var x=p.options&&p.options.ranges;function m(){var t;return"number"!=typeof(t=i.pop()||p.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,r.K2)(function(t){n.length=n.length-2*t,s.length=s.length-t,a.length=a.length-t},"popStack"),(0,r.K2)(m,"lex");for(var k,b,_,w,v,K,$,T,M,S={};;){if(_=n[n.length-1],this.defaultActions[_]?w=this.defaultActions[_]:(null==k&&(k=m()),w=o[_]&&o[_][k]),void 0===w||!w.length||!w[0]){var C="";for(K in M=[],o[_])this.terminals_[K]&&K>2&&M.push("'"+this.terminals_[K]+"'");C=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+M.join(", ")+", got '"+(this.terminals_[k]||k)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==k?"end of input":"'"+(this.terminals_[k]||k)+"'"),this.parseError(C,{text:p.match,token:this.terminals_[k]||k,line:p.yylineno,loc:g,expected:M})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+_+", token: "+k);switch(w[0]){case 1:n.push(k),s.push(p.yytext),a.push(p.yylloc),n.push(w[1]),k=null,b?(k=b,b=null):(h=p.yyleng,l=p.yytext,c=p.yylineno,g=p.yylloc,u>0&&u--);break;case 2:if($=this.productions_[w[1]][1],S.$=s[s.length-$],S._$={first_line:a[a.length-($||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-($||1)].first_column,last_column:a[a.length-1].last_column},x&&(S._$.range=[a[a.length-($||1)].range[0],a[a.length-1].range[1]]),void 0!==(v=this.performAction.apply(S,[l,h,c,d.yy,w[1],s,a].concat(y))))return v;$&&(n=n.slice(0,-1*$*2),s=s.slice(0,-1*$),a=a.slice(0,-1*$)),n.push(this.productions_[w[1]][0]),s.push(S.$),a.push(S._$),T=o[n[n.length-2]][n[n.length-1]],n.push(T);break;case 3:return!0}}return!0},"parse")},h=function(){return{EOF:1,parseError:(0,r.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,r.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,r.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,r.K2)(function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,r.K2)(function(){return this._more=!0,this},"more"),reject:(0,r.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,r.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,r.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,r.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,r.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,r.K2)(function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1},"test_match"),next:(0,r.K2)(function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;r<s.length;r++)if((n=this._input.match(this.rules[s[r]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,r.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,r.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,r.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,r.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,r.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,r.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,r.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,r.K2)(function(t,e,n,i){switch(n){case 0:case 1:case 3:case 4:break;case 2:return 10;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),14;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 18;case 16:return 19;case 17:return":";case 18:return 6;case 19:return"INVALID"}},"anonymous"),rules:[/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:journey\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18,19],inclusive:!0}}}}();function u(){this.yy={}}return c.lexer=h,(0,r.K2)(u,"Parser"),u.prototype=c,c.Parser=u,new u}();o.parser=o;var l=o,c="",h=[],u=[],y=[],p=(0,r.K2)(function(){h.length=0,u.length=0,c="",y.length=0,(0,r.IU)()},"clear"),d=(0,r.K2)(function(t){c=t,h.push(t)},"addSection"),f=(0,r.K2)(function(){return h},"getSections"),g=(0,r.K2)(function(){let t=b();let e=0;for(;!t&&e<100;)t=b(),e++;return u.push(...y),u},"getTasks"),x=(0,r.K2)(function(){const t=[];u.forEach(e=>{e.people&&t.push(...e.people)});return[...new Set(t)].sort()},"updateActors"),m=(0,r.K2)(function(t,e){const n=e.substr(1).split(":");let i=0,s=[];1===n.length?(i=Number(n[0]),s=[]):(i=Number(n[0]),s=n[1].split(","));const r=s.map(t=>t.trim()),a={section:c,type:c,people:r,task:t,score:i};y.push(a)},"addTask"),k=(0,r.K2)(function(t){const e={section:c,type:c,description:t,task:t,classes:[]};u.push(e)},"addTaskOrg"),b=(0,r.K2)(function(){const t=(0,r.K2)(function(t){return y[t].processed},"compileTask");let e=!0;for(const[n,i]of y.entries())t(n),e=e&&i.processed;return e},"compileTasks"),_=(0,r.K2)(function(){return x()},"getActors"),w={getConfig:(0,r.K2)(()=>(0,r.D7)().journey,"getConfig"),clear:p,setDiagramTitle:r.ke,getDiagramTitle:r.ab,setAccTitle:r.SV,getAccTitle:r.iN,setAccDescription:r.EI,getAccDescription:r.m7,addSection:d,getSections:f,getTasks:g,addTask:m,addTaskOrg:k,getActors:_},v=(0,r.K2)(t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.textColor};\n }\n .mouth {\n stroke: #666;\n }\n\n line {\n stroke: ${t.textColor}\n }\n\n .legend {\n fill: ${t.textColor};\n font-family: ${t.fontFamily};\n }\n\n .label text {\n fill: #333;\n }\n .label {\n color: ${t.textColor}\n }\n\n .face {\n ${t.faceColor?`fill: ${t.faceColor}`:"fill: #FFF8DC"};\n stroke: #999;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 1.5px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n }\n text-align: center;\n }\n\n .cluster rect {\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .task-type-0, .section-type-0 {\n ${t.fillType0?`fill: ${t.fillType0}`:""};\n }\n .task-type-1, .section-type-1 {\n ${t.fillType0?`fill: ${t.fillType1}`:""};\n }\n .task-type-2, .section-type-2 {\n ${t.fillType0?`fill: ${t.fillType2}`:""};\n }\n .task-type-3, .section-type-3 {\n ${t.fillType0?`fill: ${t.fillType3}`:""};\n }\n .task-type-4, .section-type-4 {\n ${t.fillType0?`fill: ${t.fillType4}`:""};\n }\n .task-type-5, .section-type-5 {\n ${t.fillType0?`fill: ${t.fillType5}`:""};\n }\n .task-type-6, .section-type-6 {\n ${t.fillType0?`fill: ${t.fillType6}`:""};\n }\n .task-type-7, .section-type-7 {\n ${t.fillType0?`fill: ${t.fillType7}`:""};\n }\n\n .actor-0 {\n ${t.actor0?`fill: ${t.actor0}`:""};\n }\n .actor-1 {\n ${t.actor1?`fill: ${t.actor1}`:""};\n }\n .actor-2 {\n ${t.actor2?`fill: ${t.actor2}`:""};\n }\n .actor-3 {\n ${t.actor3?`fill: ${t.actor3}`:""};\n }\n .actor-4 {\n ${t.actor4?`fill: ${t.actor4}`:""};\n }\n .actor-5 {\n ${t.actor5?`fill: ${t.actor5}`:""};\n }\n ${(0,s.o)()}\n`,"getStyles"),K=(0,r.K2)(function(t,e){return(0,i.tk)(t,e)},"drawRect"),$=(0,r.K2)(function(t,e){const n=15,i=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",n).attr("stroke-width",2).attr("overflow","visible"),s=t.append("g");function o(t){const i=(0,a.JLW)().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}function l(t){const i=(0,a.JLW)().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}function c(t){t.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return s.append("circle").attr("cx",e.cx-5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),s.append("circle").attr("cx",e.cx+5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),(0,r.K2)(o,"smile"),(0,r.K2)(l,"sad"),(0,r.K2)(c,"ambivalent"),e.score>3?o(s):e.score<3?l(s):c(s),i},"drawFace"),T=(0,r.K2)(function(t,e){const n=t.append("circle");return n.attr("cx",e.cx),n.attr("cy",e.cy),n.attr("class","actor-"+e.pos),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("r",e.r),void 0!==n.class&&n.attr("class",n.class),void 0!==e.title&&n.append("title").text(e.title),n},"drawCircle"),M=(0,r.K2)(function(t,e){return(0,i.m)(t,e)},"drawText"),S=(0,r.K2)(function(t,e){function n(t,e,n,i,s){return t+","+e+" "+(t+n)+","+e+" "+(t+n)+","+(e+i-s)+" "+(t+n-1.2*s)+","+(e+i)+" "+t+","+(e+i)}(0,r.K2)(n,"genPoints");const i=t.append("polygon");i.attr("points",n(e.x,e.y,50,20,7)),i.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,M(t,e)},"drawLabel"),C=(0,r.K2)(function(t,e,n){const s=t.append("g"),r=(0,i.PB)();r.x=e.x,r.y=e.y,r.fill=e.fill,r.width=n.width*e.taskCount+n.diagramMarginX*(e.taskCount-1),r.height=n.height,r.class="journey-section section-type-"+e.num,r.rx=3,r.ry=3,K(s,r),A(n)(e.text,s,r.x,r.y,r.width,r.height,{class:"journey-section section-type-"+e.num},n,e.colour)},"drawSection"),E=-1,I=(0,r.K2)(function(t,e,n){const s=e.x+n.width/2,r=t.append("g");E++;r.append("line").attr("id","task"+E).attr("x1",s).attr("y1",e.y).attr("x2",s).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),$(r,{cx:s,cy:300+30*(5-e.score),score:e.score});const a=(0,i.PB)();a.x=e.x,a.y=e.y,a.fill=e.fill,a.width=n.width,a.height=n.height,a.class="task task-type-"+e.num,a.rx=3,a.ry=3,K(r,a);let o=e.x+14;e.people.forEach(t=>{const n=e.actors[t].color,i={cx:o,cy:e.y,r:7,fill:n,stroke:"#000",title:t,pos:e.actors[t].position};T(r,i),o+=10}),A(n)(e.task,r,a.x,a.y,a.width,a.height,{class:"task"},n,e.colour)},"drawTask"),P=(0,r.K2)(function(t,e){(0,i.lC)(t,e)},"drawBackgroundRect"),A=function(){function t(t,e,n,s,r,a,o,l){i(e.append("text").attr("x",n+r/2).attr("y",s+a/2+5).style("font-color",l).style("text-anchor","middle").text(t),o)}function e(t,e,n,s,r,a,o,l,c){const{taskFontSize:h,taskFontFamily:u}=l,y=t.split(/<br\s*\/?>/gi);for(let p=0;p<y.length;p++){const t=p*h-h*(y.length-1)/2,l=e.append("text").attr("x",n+r/2).attr("y",s).attr("fill",c).style("text-anchor","middle").style("font-size",h).style("font-family",u);l.append("tspan").attr("x",n+r/2).attr("dy",t).text(y[p]),l.attr("y",s+a/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),i(l,o)}}function n(t,n,s,r,a,o,l,c){const h=n.append("switch"),u=h.append("foreignObject").attr("x",s).attr("y",r).attr("width",a).attr("height",o).attr("position","fixed").append("xhtml:div").style("display","table").style("height","100%").style("width","100%");u.append("div").attr("class","label").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,s,r,a,o,l,c),i(u,l)}function i(t,e){for(const n in e)n in e&&t.attr(n,e[n])}return(0,r.K2)(t,"byText"),(0,r.K2)(e,"byTspan"),(0,r.K2)(n,"byFo"),(0,r.K2)(i,"_setTextAttrs"),function(i){return"fo"===i.textPlacement?n:"old"===i.textPlacement?t:e}}(),j={drawRect:K,drawCircle:T,drawSection:C,drawText:M,drawLabel:S,drawTask:I,drawBackgroundRect:P,initGraphics:(0,r.K2)(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",5).attr("refY",2).attr("markerWidth",6).attr("markerHeight",4).attr("orient","auto").append("path").attr("d","M 0,0 V 4 L6,2 Z")},"initGraphics")},B=(0,r.K2)(function(t){Object.keys(t).forEach(function(e){V[e]=t[e]})},"setConf"),F={},L=0;function D(t){const e=(0,r.D7)().journey,n=e.maxLabelWidth;L=0;let i=60;Object.keys(F).forEach(s=>{const r=F[s].color,a={cx:20,cy:i,r:7,fill:r,stroke:"#000",pos:F[s].position};j.drawCircle(t,a);let o=t.append("text").attr("visibility","hidden").text(s);const l=o.node().getBoundingClientRect().width;o.remove();let c=[];if(l<=n)c=[s];else{const e=s.split(" ");let i="";o=t.append("text").attr("visibility","hidden"),e.forEach(t=>{const e=i?`${i} ${t}`:t;o.text(e);if(o.node().getBoundingClientRect().width>n){if(i&&c.push(i),i=t,o.text(t),o.node().getBoundingClientRect().width>n){let e="";for(const i of t)e+=i,o.text(e+"-"),o.node().getBoundingClientRect().width>n&&(c.push(e.slice(0,-1)+"-"),e=i);i=e}}else i=e}),i&&c.push(i),o.remove()}c.forEach((n,s)=>{const r={x:40,y:i+7+20*s,fill:"#666",text:n,textMargin:e.boxTextMargin??5},a=j.drawText(t,r).node().getBoundingClientRect().width;a>L&&a>e.leftMargin-a&&(L=a)}),i+=Math.max(20,20*c.length)})}(0,r.K2)(D,"drawActorLegend");var V=(0,r.D7)().journey,R=0,O=(0,r.K2)(function(t,e,n,i){const s=(0,r.D7)(),o=s.journey.titleColor,l=s.journey.titleFontSize,c=s.journey.titleFontFamily,h=s.securityLevel;let u;"sandbox"===h&&(u=(0,a.Ltv)("#i"+e));const y="sandbox"===h?(0,a.Ltv)(u.nodes()[0].contentDocument.body):(0,a.Ltv)("body");N.init();const p=y.select("#"+e);j.initGraphics(p);const d=i.db.getTasks(),f=i.db.getDiagramTitle(),g=i.db.getActors();for(const r in F)delete F[r];let x=0;g.forEach(t=>{F[t]={color:V.actorColours[x%V.actorColours.length],position:x},x++}),D(p),R=V.leftMargin+L,N.insert(0,0,R,50*Object.keys(F).length),Y(p,d,0);const m=N.getBounds();f&&p.append("text").text(f).attr("x",R).attr("font-size",l).attr("font-weight","bold").attr("y",25).attr("fill",o).attr("font-family",c);const k=m.stopy-m.starty+2*V.diagramMarginY,b=R+m.stopx+2*V.diagramMarginX;(0,r.a$)(p,k,b,V.useMaxWidth),p.append("line").attr("x1",R).attr("y1",4*V.height).attr("x2",b-R-4).attr("y2",4*V.height).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)");const _=f?70:0;p.attr("viewBox",`${m.startx} -25 ${b} ${k+_}`),p.attr("preserveAspectRatio","xMinYMin meet"),p.attr("height",k+_+25)},"draw"),N={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],init:(0,r.K2)(function(){this.sequenceItems=[],this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0},"init"),updateVal:(0,r.K2)(function(t,e,n,i){void 0===t[e]?t[e]=n:t[e]=i(n,t[e])},"updateVal"),updateBounds:(0,r.K2)(function(t,e,n,i){const s=(0,r.D7)().journey,a=this;let o=0;function l(l){return(0,r.K2)(function(r){o++;const c=a.sequenceItems.length-o+1;a.updateVal(r,"starty",e-c*s.boxMargin,Math.min),a.updateVal(r,"stopy",i+c*s.boxMargin,Math.max),a.updateVal(N.data,"startx",t-c*s.boxMargin,Math.min),a.updateVal(N.data,"stopx",n+c*s.boxMargin,Math.max),"activation"!==l&&(a.updateVal(r,"startx",t-c*s.boxMargin,Math.min),a.updateVal(r,"stopx",n+c*s.boxMargin,Math.max),a.updateVal(N.data,"starty",e-c*s.boxMargin,Math.min),a.updateVal(N.data,"stopy",i+c*s.boxMargin,Math.max))},"updateItemBounds")}(0,r.K2)(l,"updateFn"),this.sequenceItems.forEach(l())},"updateBounds"),insert:(0,r.K2)(function(t,e,n,i){const s=Math.min(t,n),r=Math.max(t,n),a=Math.min(e,i),o=Math.max(e,i);this.updateVal(N.data,"startx",s,Math.min),this.updateVal(N.data,"starty",a,Math.min),this.updateVal(N.data,"stopx",r,Math.max),this.updateVal(N.data,"stopy",o,Math.max),this.updateBounds(s,a,r,o)},"insert"),bumpVerticalPos:(0,r.K2)(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=this.verticalPos},"bumpVerticalPos"),getVerticalPos:(0,r.K2)(function(){return this.verticalPos},"getVerticalPos"),getBounds:(0,r.K2)(function(){return this.data},"getBounds")},z=V.sectionFills,W=V.sectionColours,Y=(0,r.K2)(function(t,e,n){const i=(0,r.D7)().journey;let s="";const a=n+(2*i.height+i.diagramMarginY);let o=0,l="#CCC",c="black",h=0;for(const[r,u]of e.entries()){if(s!==u.section){l=z[o%z.length],h=o%z.length,c=W[o%W.length];let n=0;const a=u.section;for(let t=r;t<e.length&&e[t].section==a;t++)n+=1;const y={x:r*i.taskMargin+r*i.width+R,y:50,text:u.section,fill:l,num:h,colour:c,taskCount:n};j.drawSection(t,y,i),s=u.section,o++}const n=u.people.reduce((t,e)=>(F[e]&&(t[e]=F[e]),t),{});u.x=r*i.taskMargin+r*i.width+R,u.y=a,u.width=i.diagramMarginX,u.height=i.diagramMarginY,u.colour=c,u.fill=l,u.num=h,u.actors=n,j.drawTask(t,u,i),N.insert(u.x,u.y,u.x+u.width+i.taskMargin,450)}},"drawTasks"),q={setConf:B,draw:O},J={parser:l,db:w,renderer:q,styles:v,init:(0,r.K2)(t=>{q.setConf(t.journey),w.clear()},"init")}},11047:(t,e,n)=>{n.d(e,{o:()=>i});var i=(0,n(97485).K2)(()=>"\n /* Font Awesome icon styling - consolidated */\n .label-icon {\n display: inline-block;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n \n .node .label-icon path {\n fill: currentColor;\n stroke: revert;\n stroke-width: revert;\n }\n","getIconStyles")},41041:(t,e,n)=>{n.d(e,{CP:()=>c,HT:()=>u,PB:()=>h,aC:()=>l,lC:()=>a,m:()=>o,tk:()=>r});var i=n(97485),s=n(41407),r=(0,i.K2)((t,e)=>{const n=t.append("rect");if(n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),e.name&&n.attr("name",e.name),e.rx&&n.attr("rx",e.rx),e.ry&&n.attr("ry",e.ry),void 0!==e.attrs)for(const i in e.attrs)n.attr(i,e.attrs[i]);return e.class&&n.attr("class",e.class),n},"drawRect"),a=(0,i.K2)((t,e)=>{const n={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};r(t,n).lower()},"drawBackgroundRect"),o=(0,i.K2)((t,e)=>{const n=e.text.replace(i.H1," "),s=t.append("text");s.attr("x",e.x),s.attr("y",e.y),s.attr("class","legend"),s.style("text-anchor",e.anchor),e.class&&s.attr("class",e.class);const r=s.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.text(n),s},"drawText"),l=(0,i.K2)((t,e,n,i)=>{const r=t.append("image");r.attr("x",e),r.attr("y",n);const a=(0,s.J)(i);r.attr("xlink:href",a)},"drawImage"),c=(0,i.K2)((t,e,n,i)=>{const r=t.append("use");r.attr("x",e),r.attr("y",n);const a=(0,s.J)(i);r.attr("xlink:href",`#${a}`)},"drawEmbeddedImage"),h=(0,i.K2)(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),u=(0,i.K2)(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")}}]); \ No newline at end of file diff --git a/assets/js/411bcc8b.06632b9e.js b/assets/js/411bcc8b.06632b9e.js new file mode 100644 index 0000000000..2612f912ca --- /dev/null +++ b/assets/js/411bcc8b.06632b9e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[91],{5170:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.12.4/rules/compiler/use_anvil_factory_generation.md","sourceDirName":"rules/compiler","slug":"/rules/use_anvil_factory_generation","permalink":"/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/compiler/use_anvil_factory_generation.md","tags":[],"version":"0.12.4","frontMatter":{"id":"use_anvil_factory_generation","slug":"/rules/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","sidebar_label":"Could Use Anvil Factory Generation"},"sidebar":"Docs","previous":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.4/rules/project_depth"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor"}}');var r=o(23420),i=o(65404);const s={id:"use_anvil_factory_generation",slug:"/rules/use_anvil_factory_generation",title:"Could Use Anvil Factory Generation",sidebar_label:"Could Use Anvil Factory Generation"},a=void 0,l={},c=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or\nSubcomponents, and it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},65404:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var t=o(36672);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/41b23040.971baa32.js b/assets/js/41b23040.971baa32.js new file mode 100644 index 0000000000..3646ac5e71 --- /dev/null +++ b/assets/js/41b23040.971baa32.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7559],{41563:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"current","label":"Next","banner":"unreleased","badge":true,"noIndex":false,"className":"docs-version-current","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/next/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/next/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/next/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/next/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/next/rules/unused_dependency","docId":"rules/unused_dependency","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/next/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/next/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/next/rules/redundant_dependency","docId":"rules/redundant_dependency","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/next/rules/overshot_dependency","docId":"rules/overshot_dependency","unlisted":false},{"type":"link","label":"Project Depth","href":"/ModuleCheck/docs/next/rules/project_depth","docId":"rules/project_depth","unlisted":false},{"type":"category","label":"Compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory Generation","href":"/ModuleCheck/docs/next/rules/use_anvil_factory_generation","docId":"rules/compiler/use_anvil_factory_generation","unlisted":false},{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/next/rules/unused_kapt_processor","docId":"rules/compiler/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/next/rules/unused_kapt_plugin","docId":"rules/compiler/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/next/rules/custom_kapt_matchers","docId":"rules/compiler/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/next/rules/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/next/rules/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/next/rules/disable_android_resources","docId":"rules/android/disable_android_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/next/rules/disable_view_binding","docId":"rules/android/disable_view_binding","unlisted":false},{"type":"link","label":"Unused Kotlin Android Extensions","href":"/ModuleCheck/docs/next/rules/unused_kotlin_android_extensions","docId":"rules/android/unused_kotlin_android_extensions","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"Dependencies","sidebar":"Docs"},"rules/android/disable_android_resources":{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_view_binding":{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/android/unused_kotlin_android_extensions":{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","sidebar":"Docs"},"rules/compiler/custom_kapt_matchers":{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/compiler/unused_kapt_plugin":{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","sidebar":"Docs"},"rules/compiler/unused_kapt_processor":{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/compiler/use_anvil_factory_generation":{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/overshot_dependency":{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","sidebar":"Docs"},"rules/project_depth":{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","sidebar":"Docs"},"rules/redundant_dependency":{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused_dependency":{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/41bca987.cbb68b80.js b/assets/js/41bca987.cbb68b80.js new file mode 100644 index 0000000000..96a4d0aeea --- /dev/null +++ b/assets/js/41bca987.cbb68b80.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5706],{65404:(e,n,d)=>{d.d(n,{R:()=>s,x:()=>i});var t=d(36672);const o={},c=t.createContext(o);function s(e){const n=t.useContext(c);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:s(e.components),t.createElement(c.Provider,{value:n},e.children)}},83252:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>i,default:()=>a,frontMatter:()=>s,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.12.0/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/inherited_dependency.md","tags":[],"version":"0.12.0","frontMatter":{"id":"inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.0/rules/must_be_api"},"next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/redundant_dependency"}}');var o=d(23420),c=d(65404);const s={id:"inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},i=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,c.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleB"}),", and ",(0,o.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,o.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,o.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,o.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,o.jsx)(n.code,{children:":moduleA"})," -> ",(0,o.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/4326.ada317d4.js b/assets/js/4326.ada317d4.js new file mode 100644 index 0000000000..5e4128d94a --- /dev/null +++ b/assets/js/4326.ada317d4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4326],{3602:(e,n,t)=>{t.d(n,{A:()=>c});var r=t(76095),o=t(42849),i=t(22859);const u=function(e){return function(n,t,u){var a=Object(n);if(!(0,o.A)(n)){var s=(0,r.A)(t,3);n=(0,i.A)(n),t=function(e){return s(a[e],e,a)}}var d=e(n,t,u);return d>-1?a[s?n[d]:d]:void 0}};var a=t(46482),s=t(81066),d=Math.max;const c=u(function(e,n,t){var o=null==e?0:e.length;if(!o)return-1;var i=null==t?0:(0,s.A)(t);return i<0&&(i=d(o+i,0)),(0,a.A)(e,(0,r.A)(n,3),i)})},5237:(e,n,t)=>{t.d(n,{A:()=>d});var r=t(34713),o=t(16957),i=t(16599),u=t(96920),a=Object.prototype,s=a.hasOwnProperty;const d=(0,r.A)(function(e,n){e=Object(e);var t=-1,r=n.length,d=r>2?n[2]:void 0;for(d&&(0,i.A)(n[0],n[1],d)&&(r=1);++t<r;)for(var c=n[t],h=(0,u.A)(c),f=-1,v=h.length;++f<v;){var l=h[f],g=e[l];(void 0===g||(0,o.A)(g,a[l])&&!s.call(e,l))&&(e[l]=c[l])}return e})},13884:(e,n,t)=>{t.d(n,{A:()=>o});var r=t(13027);const o=function(e,n,t){for(var o=-1,i=e.length;++o<i;){var u=e[o],a=n(u);if(null!=a&&(void 0===s?a==a&&!(0,r.A)(a):t(a,s)))var s=a,d=u}return d}},19641:(e,n,t)=>{t.d(n,{T:()=>w});var r=t(48203),o=t(41863),i=t(22859),u=t(89949),a=t(90570),s=t(83129),d=t(60707),c=t(49759),h=t(34713),f=t(80171),v=t(33998);const l=(0,h.A)(function(e){return(0,f.A)((0,c.A)(e,1,v.A,!0))});var g=t(6064),p=t(96800),A="\0";class w{constructor(e={}){this._isDirected=!Object.prototype.hasOwnProperty.call(e,"directed")||e.directed,this._isMultigraph=!!Object.prototype.hasOwnProperty.call(e,"multigraph")&&e.multigraph,this._isCompound=!!Object.prototype.hasOwnProperty.call(e,"compound")&&e.compound,this._label=void 0,this._defaultNodeLabelFn=r.A(void 0),this._defaultEdgeLabelFn=r.A(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[A]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return o.A(e)||(e=r.A(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return i.A(this._nodes)}sources(){var e=this;return u.A(this.nodes(),function(n){return a.A(e._in[n])})}sinks(){var e=this;return u.A(this.nodes(),function(n){return a.A(e._out[n])})}setNodes(e,n){var t=arguments,r=this;return s.A(e,function(e){t.length>1?r.setNode(e,n):r.setNode(e)}),this}setNode(e,n){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=n),this):(this._nodes[e]=arguments.length>1?n:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=A,this._children[e]={},this._children[A][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var n=e=>this.removeEdge(this._edgeObjs[e]);delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],s.A(this.children(e),e=>{this.setParent(e)}),delete this._children[e]),s.A(i.A(this._in[e]),n),delete this._in[e],delete this._preds[e],s.A(i.A(this._out[e]),n),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,n){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(d.A(n))n=A;else{for(var t=n+="";!d.A(t);t=this.parent(t))if(t===e)throw new Error("Setting "+n+" as parent of "+e+" would create a cycle");this.setNode(n)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=n,this._children[n][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var n=this._parent[e];if(n!==A)return n}}children(e){if(d.A(e)&&(e=A),this._isCompound){var n=this._children[e];if(n)return i.A(n)}else{if(e===A)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var n=this._preds[e];if(n)return i.A(n)}successors(e){var n=this._sucs[e];if(n)return i.A(n)}neighbors(e){var n=this.predecessors(e);if(n)return l(n,this.successors(e))}isLeaf(e){return 0===(this.isDirected()?this.successors(e):this.neighbors(e)).length}filterNodes(e){var n=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});n.setGraph(this.graph());var t=this;s.A(this._nodes,function(t,r){e(r)&&n.setNode(r,t)}),s.A(this._edgeObjs,function(e){n.hasNode(e.v)&&n.hasNode(e.w)&&n.setEdge(e,t.edge(e))});var r={};function o(e){var i=t.parent(e);return void 0===i||n.hasNode(i)?(r[e]=i,i):i in r?r[i]:o(i)}return this._isCompound&&s.A(n.nodes(),function(e){n.setParent(e,o(e))}),n}setDefaultEdgeLabel(e){return o.A(e)||(e=r.A(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return g.A(this._edgeObjs)}setPath(e,n){var t=this,r=arguments;return p.A(e,function(e,o){return r.length>1?t.setEdge(e,o,n):t.setEdge(e,o),o}),this}setEdge(){var e,n,t,r,o=!1,i=arguments[0];"object"==typeof i&&null!==i&&"v"in i?(e=i.v,n=i.w,t=i.name,2===arguments.length&&(r=arguments[1],o=!0)):(e=i,n=arguments[1],t=arguments[3],arguments.length>2&&(r=arguments[2],o=!0)),e=""+e,n=""+n,d.A(t)||(t=""+t);var u=y(this._isDirected,e,n,t);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,u))return o&&(this._edgeLabels[u]=r),this;if(!d.A(t)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(n),this._edgeLabels[u]=o?r:this._defaultEdgeLabelFn(e,n,t);var a=function(e,n,t,r){var o=""+n,i=""+t;if(!e&&o>i){var u=o;o=i,i=u}var a={v:o,w:i};r&&(a.name=r);return a}(this._isDirected,e,n,t);return e=a.v,n=a.w,Object.freeze(a),this._edgeObjs[u]=a,b(this._preds[n],e),b(this._sucs[e],n),this._in[n][u]=a,this._out[e][u]=a,this._edgeCount++,this}edge(e,n,t){var r=1===arguments.length?_(this._isDirected,arguments[0]):y(this._isDirected,e,n,t);return this._edgeLabels[r]}hasEdge(e,n,t){var r=1===arguments.length?_(this._isDirected,arguments[0]):y(this._isDirected,e,n,t);return Object.prototype.hasOwnProperty.call(this._edgeLabels,r)}removeEdge(e,n,t){var r=1===arguments.length?_(this._isDirected,arguments[0]):y(this._isDirected,e,n,t),o=this._edgeObjs[r];return o&&(e=o.v,n=o.w,delete this._edgeLabels[r],delete this._edgeObjs[r],m(this._preds[n],e),m(this._sucs[e],n),delete this._in[n][r],delete this._out[e][r],this._edgeCount--),this}inEdges(e,n){var t=this._in[e];if(t){var r=g.A(t);return n?u.A(r,function(e){return e.v===n}):r}}outEdges(e,n){var t=this._out[e];if(t){var r=g.A(t);return n?u.A(r,function(e){return e.w===n}):r}}nodeEdges(e,n){var t=this.inEdges(e,n);if(t)return t.concat(this.outEdges(e,n))}}function b(e,n){e[n]?e[n]++:e[n]=1}function m(e,n){--e[n]||delete e[n]}function y(e,n,t,r){var o=""+n,i=""+t;if(!e&&o>i){var u=o;o=i,i=u}return o+"\x01"+i+"\x01"+(d.A(r)?"\0":r)}function _(e,n){return y(e,n.v,n.w,n.name)}w.prototype._nodeCount=0,w.prototype._edgeCount=0},22675:(e,n,t)=>{t.d(n,{A:()=>u});var r=t(13884),o=t(23855),i=t(56117);const u=function(e){return e&&e.length?(0,r.A)(e,i.A,o.A):void 0}},23855:(e,n,t)=>{t.d(n,{A:()=>r});const r=function(e,n){return e<n}},31361:(e,n,t)=>{t.d(n,{A:()=>i});var r=t(44753),o=t(42849);const i=function(e,n){var t=-1,i=(0,o.A)(e)?Array(e.length):[];return(0,r.A)(e,function(e,r,o){i[++t]=n(e,r,o)}),i}},48663:(e,n,t)=>{t.d(n,{A:()=>r});const r=function(e){var n=null==e?0:e.length;return n?e[n-1]:void 0}},50586:(e,n,t)=>{t.d(n,{A:()=>u});var r=t(80565),o=t(95526),i=t(97427);const u=function(e){return"string"==typeof e||!(0,o.A)(e)&&(0,i.A)(e)&&"[object String]"==(0,r.A)(e)}},52540:(e,n,t)=>{t.d(n,{A:()=>u});var r=Object.prototype.hasOwnProperty;const o=function(e,n){return null!=e&&r.call(e,n)};var i=t(96923);const u=function(e,n){return null!=e&&(0,i.A)(e,n,o)}},57420:(e,n,t)=>{t.d(n,{T:()=>r.T});var r=t(19641)},60129:(e,n,t)=>{t.d(n,{A:()=>o});var r=t(49759);const o=function(e){return(null==e?0:e.length)?(0,r.A)(e,1):[]}},71159:(e,n,t)=>{t.d(n,{A:()=>c});var r=t(80499),o=t(63406),i=t(60870),u=t(31408),a=t(49084),s=t(31528);const d=function(e,n,t,r){if(!(0,a.A)(e))return e;for(var d=-1,c=(n=(0,i.A)(n,e)).length,h=c-1,f=e;null!=f&&++d<c;){var v=(0,s.A)(n[d]),l=t;if("__proto__"===v||"constructor"===v||"prototype"===v)return e;if(d!=h){var g=f[v];void 0===(l=r?r(g,v,f):void 0)&&(l=(0,a.A)(g)?g:(0,u.A)(n[d+1])?[]:{})}(0,o.A)(f,v,l),f=f[v]}return e};const c=function(e,n,t){for(var o=-1,u=n.length,a={};++o<u;){var s=n[o],c=(0,r.A)(e,s);t(c,s)&&d(a,(0,i.A)(s,e),c)}return a}},72185:(e,n,t)=>{t.d(n,{A:()=>a});var r=t(22663),o=t(76095),i=t(31361),u=t(95526);const a=function(e,n){return((0,u.A)(e)?r.A:i.A)(e,(0,o.A)(n,3))}},74326:(e,n,t)=>{t.d(n,{Zp:()=>Rn});var r=t(83129),o=t(53261),i=0;const u=function(e){var n=++i;return(0,o.A)(e)+n};var a=t(48203),s=t(60129),d=t(72185),c=Math.ceil,h=Math.max;const f=function(e,n,t,r){for(var o=-1,i=h(c((n-e)/(t||1)),0),u=Array(i);i--;)u[r?i:++o]=e,e+=t;return u};var v=t(16599),l=t(97001);const g=function(e){return function(n,t,r){return r&&"number"!=typeof r&&(0,v.A)(n,t,r)&&(t=r=void 0),n=(0,l.A)(n),void 0===t?(t=n,n=0):t=(0,l.A)(t),r=void 0===r?n<t?1:-1:(0,l.A)(r),f(n,t,r,e)}}();var p=t(57420);class A{constructor(){var e={};e._next=e._prev=e,this._sentinel=e}dequeue(){var e=this._sentinel,n=e._prev;if(n!==e)return w(n),n}enqueue(e){var n=this._sentinel;e._prev&&e._next&&w(e),e._next=n._next,n._next._prev=e,n._next=e,e._prev=n}toString(){for(var e=[],n=this._sentinel,t=n._prev;t!==n;)e.push(JSON.stringify(t,b)),t=t._prev;return"["+e.join(", ")+"]"}}function w(e){e._prev._next=e._next,e._next._prev=e._prev,delete e._next,delete e._prev}function b(e,n){if("_next"!==e&&"_prev"!==e)return n}var m=a.A(1);function y(e,n){if(e.nodeCount()<=1)return[];var t=function(e,n){var t=new p.T,o=0,i=0;r.A(e.nodes(),function(e){t.setNode(e,{v:e,in:0,out:0})}),r.A(e.edges(),function(e){var r=t.edge(e.v,e.w)||0,u=n(e),a=r+u;t.setEdge(e.v,e.w,a),i=Math.max(i,t.node(e.v).out+=u),o=Math.max(o,t.node(e.w).in+=u)});var u=g(i+o+3).map(function(){return new A}),a=o+1;return r.A(t.nodes(),function(e){E(u,a,t.node(e))}),{graph:t,buckets:u,zeroIdx:a}}(e,n||m),o=function(e,n,t){var r,o=[],i=n[n.length-1],u=n[0];for(;e.nodeCount();){for(;r=u.dequeue();)_(e,n,t,r);for(;r=i.dequeue();)_(e,n,t,r);if(e.nodeCount())for(var a=n.length-2;a>0;--a)if(r=n[a].dequeue()){o=o.concat(_(e,n,t,r,!0));break}}return o}(t.graph,t.buckets,t.zeroIdx);return s.A(d.A(o,function(n){return e.outEdges(n.v,n.w)}))}function _(e,n,t,o,i){var u=i?[]:void 0;return r.A(e.inEdges(o.v),function(r){var o=e.edge(r),a=e.node(r.v);i&&u.push({v:r.v,w:r.w}),a.out-=o,E(n,t,a)}),r.A(e.outEdges(o.v),function(r){var o=e.edge(r),i=r.w,u=e.node(i);u.in-=o,E(n,t,u)}),e.removeNode(o.v),u}function E(e,n,t){t.out?t.in?e[t.out-t.in+n].enqueue(t):e[e.length-1].enqueue(t):e[0].enqueue(t)}function x(e){var n="greedy"===e.graph().acyclicer?y(e,function(e){return function(n){return e.edge(n).weight}}(e)):function(e){var n=[],t={},o={};function i(u){Object.prototype.hasOwnProperty.call(o,u)||(o[u]=!0,t[u]=!0,r.A(e.outEdges(u),function(e){Object.prototype.hasOwnProperty.call(t,e.w)?n.push(e):i(e.w)}),delete t[u])}return r.A(e.nodes(),i),n}(e);r.A(n,function(n){var t=e.edge(n);e.removeEdge(n),t.forwardName=n.name,t.reversed=!0,e.setEdge(n.w,n.v,t,u("rev"))})}var k=t(75856),O=t(71159),N=t(85973);const P=function(e,n){return(0,O.A)(e,n,function(n,t){return(0,N.A)(e,t)})};var j=t(71398),C=t(22470);const I=function(e){return(0,C.A)((0,j.A)(e,void 0,s.A),e+"")}(function(e,n){return null==e?{}:P(e,n)});var L=t(5237),T=t(13884);const M=function(e,n){return e>n};var R=t(56117);const F=function(e){return e&&e.length?(0,T.A)(e,R.A,M):void 0};var D=t(48663),S=t(35745),G=t(94578),V=t(76095);const B=function(e,n){var t={};return n=(0,V.A)(n,3),(0,G.A)(e,function(e,r,o){(0,S.A)(t,r,n(e,r,o))}),t};var q=t(60707),Y=t(22675),z=t(52540),$=t(57454);const J=function(){return $.A.Date.now()};function Z(e,n,t,r){var o;do{o=u(r)}while(e.hasNode(o));return t.dummy=n,e.setNode(o,t),o}function H(e){var n=new p.T({multigraph:e.isMultigraph()}).setGraph(e.graph());return r.A(e.nodes(),function(t){e.children(t).length||n.setNode(t,e.node(t))}),r.A(e.edges(),function(t){n.setEdge(t,e.edge(t))}),n}function K(e,n){var t,r,o=e.x,i=e.y,u=n.x-o,a=n.y-i,s=e.width/2,d=e.height/2;if(!u&&!a)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(a)*s>Math.abs(u)*d?(a<0&&(d=-d),t=d*u/a,r=d):(u<0&&(s=-s),t=s,r=s*a/u),{x:o+t,y:i+r}}function Q(e){var n=d.A(g(W(e)+1),function(){return[]});return r.A(e.nodes(),function(t){var r=e.node(t),o=r.rank;q.A(o)||(n[o][r.order]=t)}),n}function U(e,n,t,r){var o={width:0,height:0};return arguments.length>=4&&(o.rank=t,o.order=r),Z(e,"border",o,n)}function W(e){return F(d.A(e.nodes(),function(n){var t=e.node(n).rank;if(!q.A(t))return t}))}function X(e,n){var t=J();try{return n()}finally{console.log(e+" time: "+(J()-t)+"ms")}}function ee(e,n){return n()}function ne(e,n,t,r,o,i){var u={width:0,height:0,rank:i,borderType:n},a=o[n][i-1],s=Z(e,"border",u,t);o[n][i]=s,e.setParent(s,r),a&&e.setEdge(a,s,{weight:1})}function te(e){var n=e.graph().rankdir.toLowerCase();"bt"!==n&&"rl"!==n||function(e){r.A(e.nodes(),function(n){ie(e.node(n))}),r.A(e.edges(),function(n){var t=e.edge(n);r.A(t.points,ie),Object.prototype.hasOwnProperty.call(t,"y")&&ie(t)})}(e),"lr"!==n&&"rl"!==n||(!function(e){r.A(e.nodes(),function(n){ue(e.node(n))}),r.A(e.edges(),function(n){var t=e.edge(n);r.A(t.points,ue),Object.prototype.hasOwnProperty.call(t,"x")&&ue(t)})}(e),re(e))}function re(e){r.A(e.nodes(),function(n){oe(e.node(n))}),r.A(e.edges(),function(n){oe(e.edge(n))})}function oe(e){var n=e.width;e.width=e.height,e.height=n}function ie(e){e.y=-e.y}function ue(e){var n=e.x;e.x=e.y,e.y=n}function ae(e){e.graph().dummyChains=[],r.A(e.edges(),function(n){!function(e,n){var t=n.v,r=e.node(t).rank,o=n.w,i=e.node(o).rank,u=n.name,a=e.edge(n),s=a.labelRank;if(i===r+1)return;e.removeEdge(n);var d,c,h=void 0;for(c=0,++r;r<i;++c,++r)a.points=[],d=Z(e,"edge",h={width:0,height:0,edgeLabel:a,edgeObj:n,rank:r},"_d"),r===s&&(h.width=a.width,h.height=a.height,h.dummy="edge-label",h.labelpos=a.labelpos),e.setEdge(t,d,{weight:a.weight},u),0===c&&e.graph().dummyChains.push(d),t=d;e.setEdge(t,o,{weight:a.weight},u)}(e,n)})}var se=t(23855);const de=function(e,n){return e&&e.length?(0,T.A)(e,(0,V.A)(n,2),se.A):void 0};function ce(e){var n={};r.A(e.sources(),function t(r){var o=e.node(r);if(Object.prototype.hasOwnProperty.call(n,r))return o.rank;n[r]=!0;var i=Y.A(d.A(e.outEdges(r),function(n){return t(n.w)-e.edge(n).minlen}));return i!==Number.POSITIVE_INFINITY&&null!=i||(i=0),o.rank=i})}function he(e,n){return e.node(n.w).rank-e.node(n.v).rank-e.edge(n).minlen}function fe(e){var n,t,r=new p.T({directed:!1}),o=e.nodes()[0],i=e.nodeCount();for(r.setNode(o,{});ve(r,e)<i;)n=le(r,e),t=r.hasNode(n.v)?he(e,n):-he(e,n),ge(r,e,t);return r}function ve(e,n){return r.A(e.nodes(),function t(o){r.A(n.nodeEdges(o),function(r){var i=r.v,u=o===i?r.w:i;e.hasNode(u)||he(n,r)||(e.setNode(u,{}),e.setEdge(o,u,{}),t(u))})}),e.nodeCount()}function le(e,n){return de(n.edges(),function(t){if(e.hasNode(t.v)!==e.hasNode(t.w))return he(n,t)})}function ge(e,n,t){r.A(e.nodes(),function(e){n.node(e).rank+=t})}var pe=t(3602),Ae=t(89949);a.A(1);a.A(1);t(84738),t(44254),t(42849),t(50586);(0,t(43818).A)("length");RegExp("[\\u200d\\ud800-\\udfff\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff\\ufe0e\\ufe0f]");var we="\\ud800-\\udfff",be="["+we+"]",me="[\\u0300-\\u036f\\ufe20-\\ufe2f\\u20d0-\\u20ff]",ye="\\ud83c[\\udffb-\\udfff]",_e="[^"+we+"]",Ee="(?:\\ud83c[\\udde6-\\uddff]){2}",xe="[\\ud800-\\udbff][\\udc00-\\udfff]",ke="(?:"+me+"|"+ye+")"+"?",Oe="[\\ufe0e\\ufe0f]?",Ne=Oe+ke+("(?:\\u200d(?:"+[_e,Ee,xe].join("|")+")"+Oe+ke+")*"),Pe="(?:"+[_e+me+"?",me,Ee,xe,be].join("|")+")";RegExp(ye+"(?="+ye+")|"+Pe+Ne,"g");function je(){}je.prototype=new Error;var Ce=t(95526);function Ie(e,n,t){Ce.A(n)||(n=[n]);var o=(e.isDirected()?e.successors:e.neighbors).bind(e),i=[],u={};return r.A(n,function(n){if(!e.hasNode(n))throw new Error("Graph does not have node: "+n);Le(e,n,"post"===t,u,o,i)}),i}function Le(e,n,t,o,i,u){Object.prototype.hasOwnProperty.call(o,n)||(o[n]=!0,t||u.push(n),r.A(i(n),function(n){Le(e,n,t,o,i,u)}),t&&u.push(n))}t(19641);function Te(e){e=function(e){var n=(new p.T).setGraph(e.graph());return r.A(e.nodes(),function(t){n.setNode(t,e.node(t))}),r.A(e.edges(),function(t){var r=n.edge(t.v,t.w)||{weight:0,minlen:1},o=e.edge(t);n.setEdge(t.v,t.w,{weight:r.weight+o.weight,minlen:Math.max(r.minlen,o.minlen)})}),n}(e),ce(e);var n,t=fe(e);for(Fe(t),Me(t,e);n=Se(t);)Ve(t,e,n,Ge(t,e,n))}function Me(e,n){var t=function(e,n){return Ie(e,n,"post")}(e,e.nodes());t=t.slice(0,t.length-1),r.A(t,function(t){!function(e,n,t){var r=e.node(t),o=r.parent;e.edge(t,o).cutvalue=Re(e,n,t)}(e,n,t)})}function Re(e,n,t){var o=e.node(t).parent,i=!0,u=n.edge(t,o),a=0;return u||(i=!1,u=n.edge(o,t)),a=u.weight,r.A(n.nodeEdges(t),function(r){var u,s,d=r.v===t,c=d?r.w:r.v;if(c!==o){var h=d===i,f=n.edge(r).weight;if(a+=h?f:-f,u=t,s=c,e.hasEdge(u,s)){var v=e.edge(t,c).cutvalue;a+=h?-v:v}}}),a}function Fe(e,n){arguments.length<2&&(n=e.nodes()[0]),De(e,{},1,n)}function De(e,n,t,o,i){var u=t,a=e.node(o);return n[o]=!0,r.A(e.neighbors(o),function(r){Object.prototype.hasOwnProperty.call(n,r)||(t=De(e,n,t,r,o))}),a.low=u,a.lim=t++,i?a.parent=i:delete a.parent,t}function Se(e){return pe.A(e.edges(),function(n){return e.edge(n).cutvalue<0})}function Ge(e,n,t){var r=t.v,o=t.w;n.hasEdge(r,o)||(r=t.w,o=t.v);var i=e.node(r),u=e.node(o),a=i,s=!1;i.lim>u.lim&&(a=u,s=!0);var d=Ae.A(n.edges(),function(n){return s===Be(e,e.node(n.v),a)&&s!==Be(e,e.node(n.w),a)});return de(d,function(e){return he(n,e)})}function Ve(e,n,t,o){var i=t.v,u=t.w;e.removeEdge(i,u),e.setEdge(o.v,o.w,{}),Fe(e),Me(e,n),function(e,n){var t=pe.A(e.nodes(),function(e){return!n.node(e).parent}),o=function(e,n){return Ie(e,n,"pre")}(e,t);o=o.slice(1),r.A(o,function(t){var r=e.node(t).parent,o=n.edge(t,r),i=!1;o||(o=n.edge(r,t),i=!0),n.node(t).rank=n.node(r).rank+(i?o.minlen:-o.minlen)})}(e,n)}function Be(e,n,t){return t.low<=n.lim&&n.lim<=t.lim}function qe(e){switch(e.graph().ranker){case"network-simplex":default:ze(e);break;case"tight-tree":!function(e){ce(e),fe(e)}(e);break;case"longest-path":Ye(e)}}Te.initLowLimValues=Fe,Te.initCutValues=Me,Te.calcCutValue=Re,Te.leaveEdge=Se,Te.enterEdge=Ge,Te.exchangeEdges=Ve;var Ye=ce;function ze(e){Te(e)}var $e=t(6064),Je=t(96800);function Ze(e){var n=Z(e,"root",{},"_root"),t=function(e){var n={};function t(o,i){var u=e.children(o);u&&u.length&&r.A(u,function(e){t(e,i+1)}),n[o]=i}return r.A(e.children(),function(e){t(e,1)}),n}(e),o=F($e.A(t))-1,i=2*o+1;e.graph().nestingRoot=n,r.A(e.edges(),function(n){e.edge(n).minlen*=i});var u=function(e){return Je.A(e.edges(),function(n,t){return n+e.edge(t).weight},0)}(e)+1;r.A(e.children(),function(r){He(e,n,i,u,o,t,r)}),e.graph().nodeRankFactor=i}function He(e,n,t,o,i,u,a){var s=e.children(a);if(s.length){var d=U(e,"_bt"),c=U(e,"_bb"),h=e.node(a);e.setParent(d,a),h.borderTop=d,e.setParent(c,a),h.borderBottom=c,r.A(s,function(r){He(e,n,t,o,i,u,r);var s=e.node(r),h=s.borderTop?s.borderTop:r,f=s.borderBottom?s.borderBottom:r,v=s.borderTop?o:2*o,l=h!==f?1:i-u[a]+1;e.setEdge(d,h,{weight:v,minlen:l,nestingEdge:!0}),e.setEdge(f,c,{weight:v,minlen:l,nestingEdge:!0})}),e.parent(a)||e.setEdge(n,d,{weight:0,minlen:i+u[a]})}else a!==n&&e.setEdge(n,a,{weight:0,minlen:t})}var Ke=t(98020);const Qe=function(e){return(0,Ke.A)(e,5)};function Ue(e,n,t){var o=function(e){var n;for(;e.hasNode(n=u("_root")););return n}(e),i=new p.T({compound:!0}).setGraph({root:o}).setDefaultNodeLabel(function(n){return e.node(n)});return r.A(e.nodes(),function(u){var a=e.node(u),s=e.parent(u);(a.rank===n||a.minRank<=n&&n<=a.maxRank)&&(i.setNode(u),i.setParent(u,s||o),r.A(e[t](u),function(n){var t=n.v===u?n.w:n.v,r=i.edge(t,u),o=q.A(r)?0:r.weight;i.setEdge(t,u,{weight:e.edge(n).weight+o})}),Object.prototype.hasOwnProperty.call(a,"minRank")&&i.setNode(u,{borderLeft:a.borderLeft[n],borderRight:a.borderRight[n]}))}),i}var We=t(63406);const Xe=function(e,n,t){for(var r=-1,o=e.length,i=n.length,u={};++r<o;){var a=r<i?n[r]:void 0;t(u,e[r],a)}return u};const en=function(e,n){return Xe(e||[],n||[],We.A)};var nn=t(49759),tn=t(22663),rn=t(80499),on=t(31361);const un=function(e,n){var t=e.length;for(e.sort(n);t--;)e[t]=e[t].value;return e};var an=t(5220),sn=t(13027);const dn=function(e,n){if(e!==n){var t=void 0!==e,r=null===e,o=e==e,i=(0,sn.A)(e),u=void 0!==n,a=null===n,s=n==n,d=(0,sn.A)(n);if(!a&&!d&&!i&&e>n||i&&u&&s&&!a&&!d||r&&u&&s||!t&&s||!o)return 1;if(!r&&!i&&!d&&e<n||d&&t&&o&&!r&&!i||a&&t&&o||!u&&o||!s)return-1}return 0};const cn=function(e,n,t){for(var r=-1,o=e.criteria,i=n.criteria,u=o.length,a=t.length;++r<u;){var s=dn(o[r],i[r]);if(s)return r>=a?s:s*("desc"==t[r]?-1:1)}return e.index-n.index};const hn=function(e,n,t){n=n.length?(0,tn.A)(n,function(e){return(0,Ce.A)(e)?function(n){return(0,rn.A)(n,1===e.length?e[0]:e)}:e}):[R.A];var r=-1;n=(0,tn.A)(n,(0,an.A)(V.A));var o=(0,on.A)(e,function(e,t,o){return{criteria:(0,tn.A)(n,function(n){return n(e)}),index:++r,value:e}});return un(o,function(e,n){return cn(e,n,t)})};const fn=(0,t(34713).A)(function(e,n){if(null==e)return[];var t=n.length;return t>1&&(0,v.A)(e,n[0],n[1])?n=[]:t>2&&(0,v.A)(n[0],n[1],n[2])&&(n=[n[0]]),hn(e,(0,nn.A)(n,1),[])});function vn(e,n){for(var t=0,r=1;r<n.length;++r)t+=ln(e,n[r-1],n[r]);return t}function ln(e,n,t){for(var o=en(t,d.A(t,function(e,n){return n})),i=s.A(d.A(n,function(n){return fn(d.A(e.outEdges(n),function(n){return{pos:o[n.w],weight:e.edge(n).weight}}),"pos")})),u=1;u<t.length;)u<<=1;var a=2*u-1;u-=1;var c=d.A(new Array(a),function(){return 0}),h=0;return r.A(i.forEach(function(e){var n=e.pos+u;c[n]+=e.weight;for(var t=0;n>0;)n%2&&(t+=c[n+1]),c[n=n-1>>1]+=e.weight;h+=e.weight*t})),h}function gn(e,n){var t={};return r.A(e,function(e,n){var r=t[e.v]={indegree:0,in:[],out:[],vs:[e.v],i:n};q.A(e.barycenter)||(r.barycenter=e.barycenter,r.weight=e.weight)}),r.A(n.edges(),function(e){var n=t[e.v],r=t[e.w];q.A(n)||q.A(r)||(r.indegree++,n.out.push(t[e.w]))}),function(e){var n=[];function t(e){return function(n){n.merged||(q.A(n.barycenter)||q.A(e.barycenter)||n.barycenter>=e.barycenter)&&function(e,n){var t=0,r=0;e.weight&&(t+=e.barycenter*e.weight,r+=e.weight);n.weight&&(t+=n.barycenter*n.weight,r+=n.weight);e.vs=n.vs.concat(e.vs),e.barycenter=t/r,e.weight=r,e.i=Math.min(n.i,e.i),n.merged=!0}(e,n)}}function o(n){return function(t){t.in.push(n),0===--t.indegree&&e.push(t)}}for(;e.length;){var i=e.pop();n.push(i),r.A(i.in.reverse(),t(i)),r.A(i.out,o(i))}return d.A(Ae.A(n,function(e){return!e.merged}),function(e){return I(e,["vs","i","barycenter","weight"])})}(Ae.A(t,function(e){return!e.indegree}))}function pn(e,n){var t,o=function(e,n){var t={lhs:[],rhs:[]};return r.A(e,function(e){n(e)?t.lhs.push(e):t.rhs.push(e)}),t}(e,function(e){return Object.prototype.hasOwnProperty.call(e,"barycenter")}),i=o.lhs,u=fn(o.rhs,function(e){return-e.i}),a=[],d=0,c=0,h=0;i.sort((t=!!n,function(e,n){return e.barycenter<n.barycenter?-1:e.barycenter>n.barycenter?1:t?n.i-e.i:e.i-n.i})),h=An(a,u,h),r.A(i,function(e){h+=e.vs.length,a.push(e.vs),d+=e.barycenter*e.weight,c+=e.weight,h=An(a,u,h)});var f={vs:s.A(a)};return c&&(f.barycenter=d/c,f.weight=c),f}function An(e,n,t){for(var r;n.length&&(r=D.A(n)).i<=t;)n.pop(),e.push(r.vs),t++;return t}function wn(e,n,t,o){var i=e.children(n),u=e.node(n),a=u?u.borderLeft:void 0,c=u?u.borderRight:void 0,h={};a&&(i=Ae.A(i,function(e){return e!==a&&e!==c}));var f=function(e,n){return d.A(n,function(n){var t=e.inEdges(n);if(t.length){var r=Je.A(t,function(n,t){var r=e.edge(t),o=e.node(t.v);return{sum:n.sum+r.weight*o.order,weight:n.weight+r.weight}},{sum:0,weight:0});return{v:n,barycenter:r.sum/r.weight,weight:r.weight}}return{v:n}})}(e,i);r.A(f,function(n){if(e.children(n.v).length){var r=wn(e,n.v,t,o);h[n.v]=r,Object.prototype.hasOwnProperty.call(r,"barycenter")&&(i=n,u=r,q.A(i.barycenter)?(i.barycenter=u.barycenter,i.weight=u.weight):(i.barycenter=(i.barycenter*i.weight+u.barycenter*u.weight)/(i.weight+u.weight),i.weight+=u.weight))}var i,u});var v=gn(f,t);!function(e,n){r.A(e,function(e){e.vs=s.A(e.vs.map(function(e){return n[e]?n[e].vs:e}))})}(v,h);var l=pn(v,o);if(a&&(l.vs=s.A([a,l.vs,c]),e.predecessors(a).length)){var g=e.node(e.predecessors(a)[0]),p=e.node(e.predecessors(c)[0]);Object.prototype.hasOwnProperty.call(l,"barycenter")||(l.barycenter=0,l.weight=0),l.barycenter=(l.barycenter*l.weight+g.order+p.order)/(l.weight+2),l.weight+=2}return l}function bn(e){var n=W(e),t=mn(e,g(1,n+1),"inEdges"),o=mn(e,g(n-1,-1,-1),"outEdges"),i=function(e){var n={},t=Ae.A(e.nodes(),function(n){return!e.children(n).length}),o=F(d.A(t,function(n){return e.node(n).rank})),i=d.A(g(o+1),function(){return[]}),u=fn(t,function(n){return e.node(n).rank});return r.A(u,function t(o){if(!z.A(n,o)){n[o]=!0;var u=e.node(o);i[u.rank].push(o),r.A(e.successors(o),t)}}),i}(e);_n(e,i);for(var u,a=Number.POSITIVE_INFINITY,s=0,c=0;c<4;++s,++c){yn(s%2?t:o,s%4>=2);var h=vn(e,i=Q(e));h<a&&(c=0,u=Qe(i),a=h)}_n(e,u)}function mn(e,n,t){return d.A(n,function(n){return Ue(e,n,t)})}function yn(e,n){var t=new p.T;r.A(e,function(e){var o=e.graph().root,i=wn(e,o,t,n);r.A(i.vs,function(n,t){e.node(n).order=t}),function(e,n,t){var o,i={};r.A(t,function(t){for(var r,u,a=e.parent(t);a;){if((r=e.parent(a))?(u=i[r],i[r]=a):(u=o,o=a),u&&u!==a)return void n.setEdge(u,a);a=r}})}(e,t,i.vs)})}function _n(e,n){r.A(n,function(n){r.A(n,function(n,t){e.node(n).order=t})})}function En(e){var n=function(e){var n={},t=0;function o(i){var u=t;r.A(e.children(i),o),n[i]={low:u,lim:t++}}return r.A(e.children(),o),n}(e);r.A(e.graph().dummyChains,function(t){for(var r=e.node(t),o=r.edgeObj,i=function(e,n,t,r){var o,i,u=[],a=[],s=Math.min(n[t].low,n[r].low),d=Math.max(n[t].lim,n[r].lim);o=t;do{o=e.parent(o),u.push(o)}while(o&&(n[o].low>s||d>n[o].lim));i=o,o=r;for(;(o=e.parent(o))!==i;)a.push(o);return{path:u.concat(a.reverse()),lca:i}}(e,n,o.v,o.w),u=i.path,a=i.lca,s=0,d=u[s],c=!0;t!==o.w;){if(r=e.node(t),c){for(;(d=u[s])!==a&&e.node(d).maxRank<r.rank;)s++;d===a&&(c=!1)}if(!c){for(;s<u.length-1&&e.node(d=u[s+1]).minRank<=r.rank;)s++;d=u[s]}e.setParent(t,d),t=e.successors(t)[0]}})}var xn=t(86413);const kn=function(e,n){return e&&(0,G.A)(e,(0,xn.A)(n))};var On=t(88749),Nn=t(96920);const Pn=function(e,n){return null==e?e:(0,On.A)(e,(0,xn.A)(n),Nn.A)};function jn(e,n){var t={};return Je.A(n,function(n,o){var i=0,u=0,a=n.length,s=D.A(o);return r.A(o,function(n,d){var c=function(e,n){if(e.node(n).dummy)return pe.A(e.predecessors(n),function(n){return e.node(n).dummy})}(e,n),h=c?e.node(c).order:a;(c||n===s)&&(r.A(o.slice(u,d+1),function(n){r.A(e.predecessors(n),function(r){var o=e.node(r),u=o.order;!(u<i||h<u)||o.dummy&&e.node(n).dummy||Cn(t,r,n)})}),u=d+1,i=h)}),o}),t}function Cn(e,n,t){if(n>t){var r=n;n=t,t=r}var o=e[n];o||(e[n]=o={}),o[t]=!0}function In(e,n,t){if(n>t){var r=n;n=t,t=r}return!!e[n]&&Object.prototype.hasOwnProperty.call(e[n],t)}function Ln(e,n,t,o,i){var u={},a=function(e,n,t,o){var i=new p.T,u=e.graph(),a=function(e,n,t){return function(r,o,i){var u,a=r.node(o),s=r.node(i),d=0;if(d+=a.width/2,Object.prototype.hasOwnProperty.call(a,"labelpos"))switch(a.labelpos.toLowerCase()){case"l":u=-a.width/2;break;case"r":u=a.width/2}if(u&&(d+=t?u:-u),u=0,d+=(a.dummy?n:e)/2,d+=(s.dummy?n:e)/2,d+=s.width/2,Object.prototype.hasOwnProperty.call(s,"labelpos"))switch(s.labelpos.toLowerCase()){case"l":u=s.width/2;break;case"r":u=-s.width/2}return u&&(d+=t?u:-u),u=0,d}}(u.nodesep,u.edgesep,o);return r.A(n,function(n){var o;r.A(n,function(n){var r=t[n];if(i.setNode(r),o){var u=t[o],s=i.edge(u,r);i.setEdge(u,r,Math.max(a(e,n,o),s||0))}o=n})}),i}(e,n,t,i),s=i?"borderLeft":"borderRight";function d(e,n){for(var t=a.nodes(),r=t.pop(),o={};r;)o[r]?e(r):(o[r]=!0,t.push(r),t=t.concat(n(r))),r=t.pop()}return d(function(e){u[e]=a.inEdges(e).reduce(function(e,n){return Math.max(e,u[n.v]+a.edge(n))},0)},a.predecessors.bind(a)),d(function(n){var t=a.outEdges(n).reduce(function(e,n){return Math.min(e,u[n.w]-a.edge(n))},Number.POSITIVE_INFINITY),r=e.node(n);t!==Number.POSITIVE_INFINITY&&r.borderType!==s&&(u[n]=Math.max(u[n],t))},a.successors.bind(a)),r.A(o,function(e){u[e]=u[t[e]]}),u}function Tn(e){var n,t=Q(e),o=k.A(jn(e,t),function(e,n){var t={};function o(n,o,i,u,a){var s;r.A(g(o,i),function(o){s=n[o],e.node(s).dummy&&r.A(e.predecessors(s),function(n){var r=e.node(n);r.dummy&&(r.order<u||r.order>a)&&Cn(t,n,s)})})}return Je.A(n,function(n,t){var i,u=-1,a=0;return r.A(t,function(r,s){if("border"===e.node(r).dummy){var d=e.predecessors(r);d.length&&(i=e.node(d[0]).order,o(t,a,s,u,i),a=s,u=i)}o(t,a,t.length,i,n.length)}),t}),t}(e,t)),i={};r.A(["u","d"],function(u){n="u"===u?t:$e.A(t).reverse(),r.A(["l","r"],function(t){"r"===t&&(n=d.A(n,function(e){return $e.A(e).reverse()}));var a=("u"===u?e.predecessors:e.successors).bind(e),s=function(e,n,t,o){var i={},u={},a={};return r.A(n,function(e){r.A(e,function(e,n){i[e]=e,u[e]=e,a[e]=n})}),r.A(n,function(e){var n=-1;r.A(e,function(e){var r=o(e);if(r.length){r=fn(r,function(e){return a[e]});for(var s=(r.length-1)/2,d=Math.floor(s),c=Math.ceil(s);d<=c;++d){var h=r[d];u[e]===e&&n<a[h]&&!In(t,e,h)&&(u[h]=e,u[e]=i[e]=i[h],n=a[h])}}})}),{root:i,align:u}}(0,n,o,a),c=Ln(e,n,s.root,s.align,"r"===t);"r"===t&&(c=B(c,function(e){return-e})),i[u+t]=c})});var u=function(e,n){return de($e.A(n),function(n){var t=Number.NEGATIVE_INFINITY,r=Number.POSITIVE_INFINITY;return Pn(n,function(n,o){var i=function(e,n){return e.node(n).width}(e,o)/2;t=Math.max(n+i,t),r=Math.min(n-i,r)}),t-r})}(e,i);return function(e,n){var t=$e.A(n),o=Y.A(t),i=F(t);r.A(["u","d"],function(t){r.A(["l","r"],function(r){var u,a=t+r,s=e[a];if(s!==n){var d=$e.A(s);(u="l"===r?o-Y.A(d):i-F(d))&&(e[a]=B(s,function(e){return e+u}))}})})}(i,u),function(e,n){return B(e.ul,function(t,r){if(n)return e[n.toLowerCase()][r];var o=fn(d.A(e,r));return(o[1]+o[2])/2})}(i,e.graph().align)}function Mn(e){(function(e){var n=Q(e),t=e.graph().ranksep,o=0;r.A(n,function(n){var i=F(d.A(n,function(n){return e.node(n).height}));r.A(n,function(n){e.node(n).y=o+i/2}),o+=i+t})})(e=H(e)),kn(Tn(e),function(n,t){e.node(t).x=n})}function Rn(e,n){var t=n&&n.debugTiming?X:ee;t("layout",()=>{var n=t(" buildLayoutGraph",()=>function(e){var n=new p.T({multigraph:!0,compound:!0}),t=$n(e.graph());return n.setGraph(k.A({},Dn,zn(t,Fn),I(t,Sn))),r.A(e.nodes(),function(t){var r=$n(e.node(t));n.setNode(t,L.A(zn(r,Gn),Vn)),n.setParent(t,e.parent(t))}),r.A(e.edges(),function(t){var r=$n(e.edge(t));n.setEdge(t,k.A({},qn,zn(r,Bn),I(r,Yn)))}),n}(e));t(" runLayout",()=>function(e,n){n(" makeSpaceForEdgeLabels",()=>function(e){var n=e.graph();n.ranksep/=2,r.A(e.edges(),function(t){var r=e.edge(t);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===n.rankdir||"BT"===n.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)})}(e)),n(" removeSelfEdges",()=>function(e){r.A(e.edges(),function(n){if(n.v===n.w){var t=e.node(n.v);t.selfEdges||(t.selfEdges=[]),t.selfEdges.push({e:n,label:e.edge(n)}),e.removeEdge(n)}})}(e)),n(" acyclic",()=>x(e)),n(" nestingGraph.run",()=>Ze(e)),n(" rank",()=>qe(H(e))),n(" injectEdgeLabelProxies",()=>function(e){r.A(e.edges(),function(n){var t=e.edge(n);if(t.width&&t.height){var r=e.node(n.v),o={rank:(e.node(n.w).rank-r.rank)/2+r.rank,e:n};Z(e,"edge-proxy",o,"_ep")}})}(e)),n(" removeEmptyRanks",()=>function(e){var n=Y.A(d.A(e.nodes(),function(n){return e.node(n).rank})),t=[];r.A(e.nodes(),function(r){var o=e.node(r).rank-n;t[o]||(t[o]=[]),t[o].push(r)});var o=0,i=e.graph().nodeRankFactor;r.A(t,function(n,t){q.A(n)&&t%i!==0?--o:o&&r.A(n,function(n){e.node(n).rank+=o})})}(e)),n(" nestingGraph.cleanup",()=>function(e){var n=e.graph();e.removeNode(n.nestingRoot),delete n.nestingRoot,r.A(e.edges(),function(n){e.edge(n).nestingEdge&&e.removeEdge(n)})}(e)),n(" normalizeRanks",()=>function(e){var n=Y.A(d.A(e.nodes(),function(n){return e.node(n).rank}));r.A(e.nodes(),function(t){var r=e.node(t);z.A(r,"rank")&&(r.rank-=n)})}(e)),n(" assignRankMinMax",()=>function(e){var n=0;r.A(e.nodes(),function(t){var r=e.node(t);r.borderTop&&(r.minRank=e.node(r.borderTop).rank,r.maxRank=e.node(r.borderBottom).rank,n=F(n,r.maxRank))}),e.graph().maxRank=n}(e)),n(" removeEdgeLabelProxies",()=>function(e){r.A(e.nodes(),function(n){var t=e.node(n);"edge-proxy"===t.dummy&&(e.edge(t.e).labelRank=t.rank,e.removeNode(n))})}(e)),n(" normalize.run",()=>ae(e)),n(" parentDummyChains",()=>En(e)),n(" addBorderSegments",()=>function(e){r.A(e.children(),function n(t){var o=e.children(t),i=e.node(t);if(o.length&&r.A(o,n),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var u=i.minRank,a=i.maxRank+1;u<a;++u)ne(e,"borderLeft","_bl",t,i,u),ne(e,"borderRight","_br",t,i,u)}})}(e)),n(" order",()=>bn(e)),n(" insertSelfEdges",()=>function(e){var n=Q(e);r.A(n,function(n){var t=0;r.A(n,function(n,o){var i=e.node(n);i.order=o+t,r.A(i.selfEdges,function(n){Z(e,"selfedge",{width:n.label.width,height:n.label.height,rank:i.rank,order:o+ ++t,e:n.e,label:n.label},"_se")}),delete i.selfEdges})})}(e)),n(" adjustCoordinateSystem",()=>function(e){var n=e.graph().rankdir.toLowerCase();"lr"!==n&&"rl"!==n||re(e)}(e)),n(" position",()=>Mn(e)),n(" positionSelfEdges",()=>function(e){r.A(e.nodes(),function(n){var t=e.node(n);if("selfedge"===t.dummy){var r=e.node(t.e.v),o=r.x+r.width/2,i=r.y,u=t.x-o,a=r.height/2;e.setEdge(t.e,t.label),e.removeNode(n),t.label.points=[{x:o+2*u/3,y:i-a},{x:o+5*u/6,y:i-a},{x:o+u,y:i},{x:o+5*u/6,y:i+a},{x:o+2*u/3,y:i+a}],t.label.x=t.x,t.label.y=t.y}})}(e)),n(" removeBorderNodes",()=>function(e){r.A(e.nodes(),function(n){if(e.children(n).length){var t=e.node(n),r=e.node(t.borderTop),o=e.node(t.borderBottom),i=e.node(D.A(t.borderLeft)),u=e.node(D.A(t.borderRight));t.width=Math.abs(u.x-i.x),t.height=Math.abs(o.y-r.y),t.x=i.x+t.width/2,t.y=r.y+t.height/2}}),r.A(e.nodes(),function(n){"border"===e.node(n).dummy&&e.removeNode(n)})}(e)),n(" normalize.undo",()=>function(e){r.A(e.graph().dummyChains,function(n){var t,r=e.node(n),o=r.edgeLabel;for(e.setEdge(r.edgeObj,o);r.dummy;)t=e.successors(n)[0],e.removeNode(n),o.points.push({x:r.x,y:r.y}),"edge-label"===r.dummy&&(o.x=r.x,o.y=r.y,o.width=r.width,o.height=r.height),n=t,r=e.node(n)})}(e)),n(" fixupEdgeLabelCoords",()=>function(e){r.A(e.edges(),function(n){var t=e.edge(n);if(Object.prototype.hasOwnProperty.call(t,"x"))switch("l"!==t.labelpos&&"r"!==t.labelpos||(t.width-=t.labeloffset),t.labelpos){case"l":t.x-=t.width/2+t.labeloffset;break;case"r":t.x+=t.width/2+t.labeloffset}})}(e)),n(" undoCoordinateSystem",()=>te(e)),n(" translateGraph",()=>function(e){var n=Number.POSITIVE_INFINITY,t=0,o=Number.POSITIVE_INFINITY,i=0,u=e.graph(),a=u.marginx||0,s=u.marginy||0;function d(e){var r=e.x,u=e.y,a=e.width,s=e.height;n=Math.min(n,r-a/2),t=Math.max(t,r+a/2),o=Math.min(o,u-s/2),i=Math.max(i,u+s/2)}r.A(e.nodes(),function(n){d(e.node(n))}),r.A(e.edges(),function(n){var t=e.edge(n);Object.prototype.hasOwnProperty.call(t,"x")&&d(t)}),n-=a,o-=s,r.A(e.nodes(),function(t){var r=e.node(t);r.x-=n,r.y-=o}),r.A(e.edges(),function(t){var i=e.edge(t);r.A(i.points,function(e){e.x-=n,e.y-=o}),Object.prototype.hasOwnProperty.call(i,"x")&&(i.x-=n),Object.prototype.hasOwnProperty.call(i,"y")&&(i.y-=o)}),u.width=t-n+a,u.height=i-o+s}(e)),n(" assignNodeIntersects",()=>function(e){r.A(e.edges(),function(n){var t,r,o=e.edge(n),i=e.node(n.v),u=e.node(n.w);o.points?(t=o.points[0],r=o.points[o.points.length-1]):(o.points=[],t=u,r=i),o.points.unshift(K(i,t)),o.points.push(K(u,r))})}(e)),n(" reversePoints",()=>function(e){r.A(e.edges(),function(n){var t=e.edge(n);t.reversed&&t.points.reverse()})}(e)),n(" acyclic.undo",()=>function(e){r.A(e.edges(),function(n){var t=e.edge(n);if(t.reversed){e.removeEdge(n);var r=t.forwardName;delete t.reversed,delete t.forwardName,e.setEdge(n.w,n.v,t,r)}})}(e))}(n,t)),t(" updateInputGraph",()=>function(e,n){r.A(e.nodes(),function(t){var r=e.node(t),o=n.node(t);r&&(r.x=o.x,r.y=o.y,n.children(t).length&&(r.width=o.width,r.height=o.height))}),r.A(e.edges(),function(t){var r=e.edge(t),o=n.edge(t);r.points=o.points,Object.prototype.hasOwnProperty.call(o,"x")&&(r.x=o.x,r.y=o.y)}),e.graph().width=n.graph().width,e.graph().height=n.graph().height}(e,n))})}var Fn=["nodesep","edgesep","ranksep","marginx","marginy"],Dn={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},Sn=["acyclicer","ranker","rankdir","align"],Gn=["width","height"],Vn={width:0,height:0},Bn=["minlen","weight","width","height","labeloffset"],qn={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},Yn=["labelpos"];function zn(e,n){return B(I(e,n),Number)}function $n(e){var n={};return r.A(e,function(e,t){n[t.toLowerCase()]=e}),n}},81066:(e,n,t)=>{t.d(n,{A:()=>o});var r=t(97001);const o=function(e){var n=(0,r.A)(e),t=n%1;return n==n?t?n-t:n:0}},97001:(e,n,t)=>{t.d(n,{A:()=>g});var r=/\s/;const o=function(e){for(var n=e.length;n--&&r.test(e.charAt(n)););return n};var i=/^\s+/;const u=function(e){return e?e.slice(0,o(e)+1).replace(i,""):e};var a=t(49084),s=t(13027),d=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,h=/^0o[0-7]+$/i,f=parseInt;const v=function(e){if("number"==typeof e)return e;if((0,s.A)(e))return NaN;if((0,a.A)(e)){var n="function"==typeof e.valueOf?e.valueOf():e;e=(0,a.A)(n)?n+"":n}if("string"!=typeof e)return 0===e?e:+e;e=u(e);var t=c.test(e);return t||h.test(e)?f(e.slice(2),t?2:8):d.test(e)?NaN:+e};var l=1/0;const g=function(e){return e?(e=v(e))===l||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}}}]); \ No newline at end of file diff --git a/assets/js/4329fc3c.6bc2d8bb.js b/assets/js/4329fc3c.6bc2d8bb.js new file mode 100644 index 0000000000..9b946aab65 --- /dev/null +++ b/assets/js/4329fc3c.6bc2d8bb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[12],{42071:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.12.5/rules/compiler/custom_kapt_matchers.md","sourceDirName":"rules/compiler","slug":"/rules/custom_kapt_matchers","permalink":"/ModuleCheck/docs/rules/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/compiler/custom_kapt_matchers.md","tags":[],"version":"0.12.5","frontMatter":{"id":"custom_kapt_matchers","slug":"/rules/custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/rules/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/rules/sort_dependencies"}}');var n=s(23420),r=s(65404);const c={id:"custom_kapt_matchers",slug:"/rules/custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},a=void 0,i={},l=[];function u(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,n.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},65404:(e,t,s)=>{s.d(t,{R:()=>c,x:()=>a});var o=s(36672);const n={},r=o.createContext(n);function c(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),o.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4359cab8.86206a90.js b/assets/js/4359cab8.86206a90.js new file mode 100644 index 0000000000..34b3c2a1c3 --- /dev/null +++ b/assets/js/4359cab8.86206a90.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3508],{51186:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.11.0/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_dependencies","permalink":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/sorting/sort_dependencies.md","tags":[],"version":"0.11.0","frontMatter":{"id":"sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins"}}');var o=n(23420),r=n(65404);const i={id:"sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l()}},65404:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(36672);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/444a5a58.da06fd79.js b/assets/js/444a5a58.da06fd79.js new file mode 100644 index 0000000000..f42bdb2eff --- /dev/null +++ b/assets/js/444a5a58.da06fd79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8327],{65404:(e,n,t)=>{t.d(n,{R:()=>l,x:()=>r});var i=t(36672);const d={},s=i.createContext(d);function l(e){const n=i.useContext(s);return i.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:l(e.components),i.createElement(s.Provider,{value:n},e.children)}},78381:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>a,frontMatter:()=>l,metadata:()=>i,toc:()=>o});const i=JSON.parse('{"type":"mdx","permalink":"/ModuleCheck/migrations","source":"@site/src/pages/migrations.md","description":"0.12.0 to 0.12.1","frontMatter":{},"unlisted":false}');var d=t(23420),s=t(65404);const l={},r=void 0,c={},o=[{value:"0.12.0 to 0.12.1",id:"0120-to-0121",level:2},{value:"Standardized Finding names",id:"standardized-finding-names",level:3},{value:"CodeGeneratorBinding",id:"code-generator-binding",level:3}];function h(e){const n={code:"code",h2:"h2",h3:"h3",li:"li",ol:"ol",p:"p",table:"table",tbody:"tbody",td:"td",th:"th",thead:"thead",tr:"tr",ul:"ul",...(0,s.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.h2,{id:"0120-to-0121",children:"0.12.0 to 0.12.1"}),"\n",(0,d.jsx)(n.h3,{id:"standardized-finding-names",children:"Standardized Finding names"}),"\n",(0,d.jsxs)(n.p,{children:["The names of all findings have been updated/standardized. Any declarations which were suppressing\na finding with the old ID (via ",(0,d.jsx)(n.code,{children:'@Suppress("someFinding")'})," or ",(0,d.jsx)(n.code,{children:"//suppress=someFinding"}),") will still\nwork, but they should be updated to use the new names."]}),"\n",(0,d.jsxs)(n.table,{children:[(0,d.jsx)(n.thead,{children:(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.th,{style:{textAlign:"left"},children:"old name"}),(0,d.jsx)(n.th,{style:{textAlign:"left"},children:"new name"})]})}),(0,d.jsxs)(n.tbody,{children:[(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"depth"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"project-depth"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"disableAndroidResources"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"disable-android-resources"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"disableViewBinding"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"disable-view-binding"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"inheritedDependency"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"inherited-dependency"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"mustBeApi"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"must-be-api"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"overshot"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"overshot-dependency"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"redundant"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"redundant-dependency"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unsortedDependencies"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"sort-dependencies"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unsortedPlugins"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"sort-plugins"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"useAnvilFactories"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"use-anvil-factory-generation"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unused"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unused-dependency"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unusedKaptProcessor"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unused-kapt-processor"})]}),(0,d.jsxs)(n.tr,{children:[(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unusedKotlinAndroidExtensions"}),(0,d.jsx)(n.td,{style:{textAlign:"left"},children:"unused-kotlin-android-extensions"})]})]})]}),"\n",(0,d.jsx)(n.h3,{id:"code-generator-binding",children:"CodeGeneratorBinding"}),"\n",(0,d.jsxs)(n.p,{children:["The ",(0,d.jsx)(n.code,{children:"KaptMatcher"})," class has been deprecated in favor of ",(0,d.jsx)(n.code,{children:"modulecheck.config.CodeGeneratorBinding"}),".\nThis new sealed class has four concrete implementations which can define just about any code\ngeneration tool:"]}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsxs)(n.li,{children:[(0,d.jsx)(n.code,{children:"modulecheck.config.CodeGeneratorBinding.AnnotationProcessor"}),"\n",(0,d.jsxs)(n.ul,{children:["\n",(0,d.jsx)(n.li,{children:"Note that this class is a model for Kotlin KAPT as well as a standard Java annotation processor."}),"\n"]}),"\n"]}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.code,{children:"modulecheck.config.CodeGeneratorBinding.KspExtension"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.code,{children:"modulecheck.config.CodeGeneratorBinding.AnvilExtension"})}),"\n",(0,d.jsx)(n.li,{children:(0,d.jsx)(n.code,{children:"modulecheck.config.CodeGeneratorBinding.KotlinCompilerPlugin"})}),"\n"]}),"\n",(0,d.jsxs)(n.p,{children:["To migrate from ",(0,d.jsx)(n.code,{children:"KaptMatcher"}),":"]}),"\n",(0,d.jsxs)(n.ol,{children:["\n",(0,d.jsxs)(n.li,{children:["Change references of ",(0,d.jsx)(n.code,{children:"modulecheck.api.KaptMatcher"}),",\nto ",(0,d.jsx)(n.code,{children:"modulecheck.config.CodeGeneratorBinding.AnnotationProcessor"}),"."]}),"\n",(0,d.jsxs)(n.li,{children:["Replace the regex-styled ",(0,d.jsx)(n.code,{children:"annotationImports"})," arguments with explicit fully-qualified names.\nFor instance, replace ",(0,d.jsx)(n.code,{children:'"com\\\\.example\\\\.MyAnnotation"'}),", with ",(0,d.jsx)(n.code,{children:'"com.example.MyAnnotation"'}),"."]}),"\n"]})]})}function a(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/4577221a.09a7f265.js b/assets/js/4577221a.09a7f265.js new file mode 100644 index 0000000000..174e0a4de6 --- /dev/null +++ b/assets/js/4577221a.09a7f265.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[334],{2073:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/docs/rules/compiler/unused_kapt_processor.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_processor","permalink":"/ModuleCheck/docs/next/rules/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/compiler/unused_kapt_processor.md","tags":[],"version":"current","frontMatter":{"id":"unused_kapt_processor","slug":"/rules/unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/next/rules/use_anvil_factory_generation"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/next/rules/unused_kapt_plugin"}}');var t=s(23420),r=s(65404);const i={id:"unused_kapt_processor",slug:"/rules/unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,c={},d=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(36672);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46d462fa.286c2600.js b/assets/js/46d462fa.286c2600.js new file mode 100644 index 0000000000..e958df6692 --- /dev/null +++ b/assets/js/46d462fa.286c2600.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1270],{41182:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>s,default:()=>a,frontMatter:()=>i,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.11.3/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.11.3/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/inherited_dependency.md","tags":[],"version":"0.11.3","frontMatter":{"id":"inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.3/rules/must_be_api"},"next":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory"}}');var o=d(23420),c=d(65404);const i={id:"inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},s=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,c.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleB"}),", and ",(0,o.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,o.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,o.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,o.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,o.jsx)(n.code,{children:":moduleA"})," -> ",(0,o.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>i,x:()=>s});var t=d(36672);const o={},c=t.createContext(o);function i(e){const n=t.useContext(c);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/46e9ac31.4fad4321.js b/assets/js/46e9ac31.4fad4321.js new file mode 100644 index 0000000000..102ed4d7e9 --- /dev/null +++ b/assets/js/46e9ac31.4fad4321.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4003],{7357:(e,n,r)=>{r.d(n,{A:()=>s});r(36672);var a=r(13526);const l={tabItem:"tabItem_qogc"};var t=r(23420);function s({children:e,hidden:n,className:r}){return(0,t.jsx)("div",{role:"tabpanel",className:(0,a.A)(l.tabItem,r),hidden:n,children:e})}},52084:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","source":"@site/versioned_docs/version-0.11.2/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.11.2/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/quickstart.mdx","tags":[],"version":"0.11.2","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.2/configuration"}}');var l=r(23420),t=r(65404),s=r(83796),o=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},u=void 0,c={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.admonition,{type:"note",children:(0,l.jsx)(n.p,{children:"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin."})}),"\n",(0,l.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:"// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.11.2"\n}\n'})})]}),(0,l.jsxs)(o.A,{value:"Groovy",children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.11.2'\n}\n"})})]})]}),"\n",(0,l.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,l.jsx)(n.p,{children:"all checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,l.jsx)(n.p,{children:"kapt checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckKapt\n"})}),"\n",(0,l.jsx)(n.p,{children:"sorts"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,l.jsx)(n.p,{children:"unused"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gardlew moduleCheckUnused\n"})}),"\n",(0,l.jsx)(n.p,{children:"redundant"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckRedundant\n"})}),"\n",(0,l.jsx)(n.p,{children:"overshot"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckOvershot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,l.jsxs)(n.p,{children:["See ",(0,l.jsx)(n.a,{href:"/ModuleCheck/docs/0.11.2/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nconfigure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,l.jsx)(n.p,{children:"--or--"}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,l.jsx)(o.A,{value:"Groovy",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:'// top-level build.gradle\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var a=r(36672);const l={},t=a.createContext(l);function s(e){const n=a.useContext(t);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(t.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>w});var a=r(36672),l=r(13526),t=r(58797),s=r(85291),o=r(52245),i=r(32342),u=r(45223),c=r(1771);function d(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:a}})=>({value:e,label:n,attributes:r,default:a}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),l=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(l),(0,a.useCallback)(e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})},[l,r])]}function f(e){const{defaultValue:n,queryString:r=!1,groupId:l}=e,t=h(e),[s,i]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t})),[u,d]=g({queryString:r,groupId:l}),[f,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,l]=(0,c.Dv)(n);return[r,(0,a.useCallback)(e=>{n&&l.set(e)},[n,l])]}({groupId:l}),v=(()=>{const e=u??f;return p({value:e,tabValues:t})?e:null})();(0,o.A)(()=>{v&&i(v)},[v]);return{selectedValue:s,selectValue:(0,a.useCallback)(e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),m(e)},[d,m,t]),tabValues:t}}var m=r(64407);const v={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var b=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:a,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,t.a_)(),u=e=>{const n=e.currentTarget,l=o.indexOf(n),t=s[l].value;t!==r&&(i(n),a(t))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,b.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...a,className:(0,l.A)("tabs__item",v.tabItem,a?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const t=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=t.find(e=>e.props.value===r);return e?(0,a.cloneElement)(e,{className:(0,l.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:t.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=f(e);return(0,b.jsxs)("div",{className:(0,l.A)("tabs-container",v.tabList),children:[(0,b.jsx)(x,{...n,...e}),(0,b.jsx)(k,{...n,...e})]})}function w(e){const n=(0,m.A)();return(0,b.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/47da9d80.8ece4d5e.js b/assets/js/47da9d80.8ece4d5e.js new file mode 100644 index 0000000000..ddb17b6f11 --- /dev/null +++ b/assets/js/47da9d80.8ece4d5e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6314],{65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}},71285:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.12.5/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/must_be_api.md","tags":[],"version":"0.12.5","frontMatter":{"id":"must_be_api","slug":"/rules/must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/rules/unused_dependency"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",slug:"/rules/must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/4852.cf62decd.js b/assets/js/4852.cf62decd.js new file mode 100644 index 0000000000..8c5888e365 --- /dev/null +++ b/assets/js/4852.cf62decd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4852],{64852:(e,c,h)=>{h.d(c,{createGitGraphServices:()=>k.b});var k=h(50249);h(60349)}}]); \ No newline at end of file diff --git a/assets/js/485c5e01.604a9153.js b/assets/js/485c5e01.604a9153.js new file mode 100644 index 0000000000..b9416d665e --- /dev/null +++ b/assets/js/485c5e01.604a9153.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4276],{25636:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.12.3/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/inherited_dependency.md","tags":[],"version":"0.12.3","frontMatter":{"id":"inherited_dependency","slug":"/rules/inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.3/rules/must_be_api"},"next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/redundant_dependency"}}');var s=d(23420),i=d(65404);const o={id:"inherited_dependency",slug:"/rules/inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},c=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleB"}),", and ",(0,s.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,s.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,s.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,s.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,s.jsx)(n.code,{children:":moduleA"})," -> ",(0,s.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>o,x:()=>c});var t=d(36672);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/487ca811.0e457977.js b/assets/js/487ca811.0e457977.js new file mode 100644 index 0000000000..9bc7ba4448 --- /dev/null +++ b/assets/js/487ca811.0e457977.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8720],{51082:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.12.4/rules/compiler/unused_kapt_processor.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/compiler/unused_kapt_processor.md","tags":[],"version":"0.12.4","frontMatter":{"id":"unused_kapt_processor","slug":"/rules/unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin"}}');var t=s(23420),r=s(65404);const i={id:"unused_kapt_processor",slug:"/rules/unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,c={},d=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(36672);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4c8a85bd.a9c6182b.js b/assets/js/4c8a85bd.a9c6182b.js new file mode 100644 index 0000000000..d717c9efac --- /dev/null +++ b/assets/js/4c8a85bd.a9c6182b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7286],{4787:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>a,frontMatter:()=>u,metadata:()=>t,toc:()=>i});const t=JSON.parse('{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.11.3/rules/unused.md","sourceDirName":"rules","slug":"/rules/unused","permalink":"/ModuleCheck/docs/0.11.3/rules/unused","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/unused.md","tags":[],"version":"0.11.3","frontMatter":{"id":"unused","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.11.3/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.3/rules/must_be_api"}}');var d=s(23420),o=s(65404);const u={id:"unused",title:"Unused Dependency",sidebar_label:"Unused Dependency"},r=void 0,c={},i=[];function l(e){const n={p:"p",...(0,o.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,d.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>u,x:()=>r});var t=s(36672);const d={},o=t.createContext(d);function u(e){const n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:u(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/4e8e2262.aa0f58c7.js b/assets/js/4e8e2262.aa0f58c7.js new file mode 100644 index 0000000000..bdabce403f --- /dev/null +++ b/assets/js/4e8e2262.aa0f58c7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9055],{64276:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>t,metadata:()=>d,toc:()=>l});const d=JSON.parse('{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.12.0/rules/android/disable_viewbinding.md","sourceDirName":"rules/android","slug":"/rules/android/disable_viewbinding","permalink":"/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/android/disable_viewbinding.md","tags":[],"version":"0.12.0","frontMatter":{"id":"disable_viewbinding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.0/rules/android/disable_resources"},"next":{"title":"Unused Kotlin Android Extensions","permalink":"/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensions"}}');var s=i(23420),o=i(65404);const t={id:"disable_viewbinding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,a={},l=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>r});var d=i(36672);const s={},o=d.createContext(s);function t(e){const n=d.useContext(o);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),d.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5019.b953ab3c.js b/assets/js/5019.b953ab3c.js new file mode 100644 index 0000000000..0d34637107 --- /dev/null +++ b/assets/js/5019.b953ab3c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5019],{45019:(t,e,a)=>{a.d(e,{diagram:()=>m});var r=a(45059),o=a(9420),n=a(47765),l=a(97485),i=a(99339),s={packet:[]},c=structuredClone(s),d=l.UI.packet,b=(0,l.K2)(()=>{const t=(0,o.$t)({...d,...(0,l.zj)().packet});return t.showBits&&(t.paddingY+=10),t},"getConfig"),k=(0,l.K2)(()=>c.packet,"getPacket"),p={pushWord:(0,l.K2)(t=>{t.length>0&&c.packet.push(t)},"pushWord"),getPacket:k,getConfig:b,clear:(0,l.K2)(()=>{(0,l.IU)(),c=structuredClone(s)},"clear"),setAccTitle:l.SV,getAccTitle:l.iN,setDiagramTitle:l.ke,getDiagramTitle:l.ab,getAccDescription:l.m7,setAccDescription:l.EI},h=(0,l.K2)(t=>{(0,r.S)(t,p);let e=-1,a=[],o=1;const{bitsPerRow:n}=p.getConfig();for(let{start:r,end:i,bits:s,label:c}of t.blocks){if(void 0!==r&&void 0!==i&&i<r)throw new Error(`Packet block ${r} - ${i} is invalid. End must be greater than start.`);if(r??=e+1,r!==e+1)throw new Error(`Packet block ${r} - ${i??r} is not contiguous. It should start from ${e+1}.`);if(0===s)throw new Error(`Packet block ${r} is invalid. Cannot have a zero bit field.`);for(i??=r+(s??1)-1,s??=i-r+1,e=i,l.Rm.debug(`Packet block ${r} - ${e} with label ${c}`);a.length<=n+1&&p.getPacket().length<1e4;){const[t,e]=g({start:r,end:i,bits:s,label:c},o,n);if(a.push(t),t.end+1===o*n&&(p.pushWord(a),a=[],o++),!e)break;({start:r,end:i,bits:s,label:c}=e)}}p.pushWord(a)},"populate"),g=(0,l.K2)((t,e,a)=>{if(void 0===t.start)throw new Error("start should have been set during first phase");if(void 0===t.end)throw new Error("end should have been set during first phase");if(t.start>t.end)throw new Error(`Block start ${t.start} is greater than block end ${t.end}.`);if(t.end+1<=e*a)return[t,void 0];const r=e*a-1,o=e*a;return[{start:t.start,end:r,label:t.label,bits:r-t.start},{start:o,end:t.end,label:t.label,bits:t.end-o}]},"getNextFittingBlock"),f={parse:(0,l.K2)(async t=>{const e=await(0,i.qg)("packet",t);l.Rm.debug(e),h(e)},"parse")},u=(0,l.K2)((t,e,a,r)=>{const o=r.db,i=o.getConfig(),{rowHeight:s,paddingY:c,bitWidth:d,bitsPerRow:b}=i,k=o.getPacket(),p=o.getDiagramTitle(),h=s+c,g=h*(k.length+1)-(p?0:s),f=d*b+2,u=(0,n.D)(e);u.attr("viewbox",`0 0 ${f} ${g}`),(0,l.a$)(u,g,f,i.useMaxWidth);for(const[n,l]of k.entries())w(u,l,n,i);u.append("text").text(p).attr("x",f/2).attr("y",g-h/2).attr("dominant-baseline","middle").attr("text-anchor","middle").attr("class","packetTitle")},"draw"),w=(0,l.K2)((t,e,a,{rowHeight:r,paddingX:o,paddingY:n,bitWidth:l,bitsPerRow:i,showBits:s})=>{const c=t.append("g"),d=a*(r+n)+n;for(const b of e){const t=b.start%i*l+1,e=(b.end-b.start+1)*l-o;if(c.append("rect").attr("x",t).attr("y",d).attr("width",e).attr("height",r).attr("class","packetBlock"),c.append("text").attr("x",t+e/2).attr("y",d+r/2).attr("class","packetLabel").attr("dominant-baseline","middle").attr("text-anchor","middle").text(b.label),!s)continue;const a=b.end===b.start,n=d-2;c.append("text").attr("x",t+(a?e/2:0)).attr("y",n).attr("class","packetByte start").attr("dominant-baseline","auto").attr("text-anchor",a?"middle":"start").text(b.start),a||c.append("text").attr("x",t+e).attr("y",n).attr("class","packetByte end").attr("dominant-baseline","auto").attr("text-anchor","end").text(b.end)}},"drawWord"),$={byteFontSize:"10px",startByteColor:"black",endByteColor:"black",labelColor:"black",labelFontSize:"12px",titleColor:"black",titleFontSize:"14px",blockStrokeColor:"black",blockStrokeWidth:"1",blockFillColor:"#efefef"},m={parser:f,db:p,renderer:{draw:u},styles:(0,l.K2)(({packet:t}={})=>{const e=(0,o.$t)($,t);return`\n\t.packetByte {\n\t\tfont-size: ${e.byteFontSize};\n\t}\n\t.packetByte.start {\n\t\tfill: ${e.startByteColor};\n\t}\n\t.packetByte.end {\n\t\tfill: ${e.endByteColor};\n\t}\n\t.packetLabel {\n\t\tfill: ${e.labelColor};\n\t\tfont-size: ${e.labelFontSize};\n\t}\n\t.packetTitle {\n\t\tfill: ${e.titleColor};\n\t\tfont-size: ${e.titleFontSize};\n\t}\n\t.packetBlock {\n\t\tstroke: ${e.blockStrokeColor};\n\t\tstroke-width: ${e.blockStrokeWidth};\n\t\tfill: ${e.blockFillColor};\n\t}\n\t`},"styles")}},45059:(t,e,a)=>{function r(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}a.d(e,{S:()=>r}),(0,a(97485).K2)(r,"populateCommonDb")}}]); \ No newline at end of file diff --git a/assets/js/50b1f033.c59eb4a5.js b/assets/js/50b1f033.c59eb4a5.js new file mode 100644 index 0000000000..7f0d8396db --- /dev/null +++ b/assets/js/50b1f033.c59eb4a5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8179],{62961:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.12.0/rules/kapt/unused_kapt_processor.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/kapt/unused_kapt_processor.md","tags":[],"version":"0.12.0","frontMatter":{"id":"unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin"}}');var t=s(23420),i=s(65404);const r={id:"unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,d={},c=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var o=s(36672);const t={},i=o.createContext(t);function r(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/50cf1f78.f7d589c0.js b/assets/js/50cf1f78.f7d589c0.js new file mode 100644 index 0000000000..c8a8a35e8d --- /dev/null +++ b/assets/js/50cf1f78.f7d589c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3715],{65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var s=t(36672);const o={},d=s.createContext(o);function r(e){const n=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(d.Provider,{value:n},e.children)}},69327:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>a,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","source":"@site/versioned_docs/version-0.12.2/rules/overshot_dependency.md","sourceDirName":"rules","slug":"/rules/overshot_dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/overshot_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/overshot_dependency.md","tags":[],"version":"0.12.2","frontMatter":{"id":"overshot_dependency","slug":"/rules/overshot_dependency","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Docs","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/redundant_dependency"},"next":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.2/rules/project_depth"}}');var o=t(23420),d=t(65404);const r={id:"overshot_dependency",slug:"/rules/overshot_dependency",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},c=void 0,i={},l=[];function u(e){const n={code:"code",em:"em",p:"p",pre:"pre",strong:"strong",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"Finds project dependencies which aren't used by the declaring configuration, but are used by a\ndependent, downstream configuration."}),"\n",(0,o.jsxs)(n.p,{children:["For instance, assume that ",(0,o.jsx)(n.code,{children:":moduleB"})," declares an ",(0,o.jsx)(n.code,{children:"implementation"})," dependency upon ",(0,o.jsx)(n.code,{children:":moduleA"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n implementation(project(":moduleA"))\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:":moduleB"})," doesn't actually use ",(0,o.jsx)(n.code,{children:":moduleA"})," in its ",(0,o.jsx)(n.code,{children:"main"})," source, but it ",(0,o.jsx)(n.em,{children:"does"})," use it in ",(0,o.jsx)(n.code,{children:"test"}),"\nsource, it's an ",(0,o.jsx)(n.strong,{children:"overshot dependency"}),". The declaration should be changed to\nuse ",(0,o.jsx)(n.code,{children:"testImplementation"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n testImplementation(project(":moduleA"))\n}\n'})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/5110.ae209bcb.js b/assets/js/5110.ae209bcb.js new file mode 100644 index 0000000000..19d28517c4 --- /dev/null +++ b/assets/js/5110.ae209bcb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5110],{5110:(e,t,a)=>{a.d(t,{diagram:()=>k});var i=a(45059),n=a(9420),l=a(47765),r=a(97485),s=a(99339),o=a(3170),c=r.UI.pie,p={sections:new Map,showData:!1,config:c},d=p.sections,u=p.showData,g=structuredClone(c),h=(0,r.K2)(()=>structuredClone(g),"getConfig"),m=(0,r.K2)(()=>{d=new Map,u=p.showData,(0,r.IU)()},"clear"),f=(0,r.K2)(({label:e,value:t})=>{d.has(e)||(d.set(e,t),r.Rm.debug(`added new section: ${e}, with value: ${t}`))},"addSection"),S=(0,r.K2)(()=>d,"getSections"),x=(0,r.K2)(e=>{u=e},"setShowData"),w=(0,r.K2)(()=>u,"getShowData"),D={getConfig:h,clear:m,setDiagramTitle:r.ke,getDiagramTitle:r.ab,setAccTitle:r.SV,getAccTitle:r.iN,setAccDescription:r.EI,getAccDescription:r.m7,addSection:f,getSections:S,setShowData:x,getShowData:w},T=(0,r.K2)((e,t)=>{(0,i.S)(e,t),t.setShowData(e.showData),e.sections.map(t.addSection)},"populateDb"),$={parse:(0,r.K2)(async e=>{const t=await(0,s.qg)("pie",e);r.Rm.debug(t),T(t,D)},"parse")},y=(0,r.K2)(e=>`\n .pieCircle{\n stroke: ${e.pieStrokeColor};\n stroke-width : ${e.pieStrokeWidth};\n opacity : ${e.pieOpacity};\n }\n .pieOuterCircle{\n stroke: ${e.pieOuterStrokeColor};\n stroke-width: ${e.pieOuterStrokeWidth};\n fill: none;\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${e.pieTitleTextSize};\n fill: ${e.pieTitleTextColor};\n font-family: ${e.fontFamily};\n }\n .slice {\n font-family: ${e.fontFamily};\n fill: ${e.pieSectionTextColor};\n font-size:${e.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${e.pieLegendTextColor};\n font-family: ${e.fontFamily};\n font-size: ${e.pieLegendTextSize};\n }\n`,"getStyles"),C=(0,r.K2)(e=>{const t=[...e.entries()].map(e=>({label:e[0],value:e[1]})).sort((e,t)=>t.value-e.value);return(0,o.rLf)().value(e=>e.value)(t)},"createPieArcs"),k={parser:$,db:D,renderer:{draw:(0,r.K2)((e,t,a,i)=>{r.Rm.debug("rendering pie chart\n"+e);const s=i.db,c=(0,r.D7)(),p=(0,n.$t)(s.getConfig(),c.pie),d=18,u=450,g=u,h=(0,l.D)(t),m=h.append("g");m.attr("transform","translate(225,225)");const{themeVariables:f}=c;let[S]=(0,n.I5)(f.pieOuterStrokeWidth);S??=2;const x=p.textPosition,w=Math.min(g,u)/2-40,D=(0,o.JLW)().innerRadius(0).outerRadius(w),T=(0,o.JLW)().innerRadius(w*x).outerRadius(w*x);m.append("circle").attr("cx",0).attr("cy",0).attr("r",w+S/2).attr("class","pieOuterCircle");const $=s.getSections(),y=C($),k=[f.pie1,f.pie2,f.pie3,f.pie4,f.pie5,f.pie6,f.pie7,f.pie8,f.pie9,f.pie10,f.pie11,f.pie12],b=(0,o.UMr)(k);m.selectAll("mySlices").data(y).enter().append("path").attr("d",D).attr("fill",e=>b(e.data.label)).attr("class","pieCircle");let K=0;$.forEach(e=>{K+=e}),m.selectAll("mySlices").data(y).enter().append("text").text(e=>(e.data.value/K*100).toFixed(0)+"%").attr("transform",e=>"translate("+T.centroid(e)+")").style("text-anchor","middle").attr("class","slice"),m.append("text").text(s.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");const v=m.selectAll(".legend").data(b.domain()).enter().append("g").attr("class","legend").attr("transform",(e,t)=>"translate(216,"+(22*t-22*b.domain().length/2)+")");v.append("rect").attr("width",d).attr("height",d).style("fill",b).style("stroke",b),v.data(y).append("text").attr("x",22).attr("y",14).text(e=>{const{label:t,value:a}=e.data;return s.getShowData()?`${t} [${a}]`:t});const A=512+Math.max(...v.selectAll("text").nodes().map(e=>e?.getBoundingClientRect().width??0));h.attr("viewBox",`0 0 ${A} 450`),(0,r.a$)(h,u,A,p.useMaxWidth)},"draw")},styles:y}},45059:(e,t,a)=>{function i(e,t){e.accDescr&&t.setAccDescription?.(e.accDescr),e.accTitle&&t.setAccTitle?.(e.accTitle),e.title&&t.setDiagramTitle?.(e.title)}a.d(t,{S:()=>i}),(0,a(97485).K2)(i,"populateCommonDb")}}]); \ No newline at end of file diff --git a/assets/js/518ccc20.56ca2fa5.js b/assets/js/518ccc20.56ca2fa5.js new file mode 100644 index 0000000000..4f9126fe3f --- /dev/null +++ b/assets/js/518ccc20.56ca2fa5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[610],{7357:(e,t,n)=>{n.d(t,{A:()=>o});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var s=n(23420);function o({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},65404:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>l});var r=n(36672);const a={},s=r.createContext(a);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:t},e.children)}},82270:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>f,frontMatter:()=>u,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.12.0/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.12.0/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/configuration.mdx","tags":[],"version":"0.12.0","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.12.0/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.0/suppressing-findings"}}');var a=n(23420),s=n(65404),o=n(83796),l=n(7357);const u={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function p(e){const t={code:"code",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(o.A,{children:[(0,a.jsx)(l.A,{value:"Kotlin",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'plugins {\n id("com.rickbusarow.module-check") version "0.12.0"\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalKaptMatchers = listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n depths {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(l.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'plugins {\n id \'com.rickbusarow.module-check\' version \'0.12.0\'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = [\':test:core-jvm\', \':test:core-android\']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [\':app\']\n\n additionalKaptMatchers = [\n new modulecheck.api.KaptMatcher(\n \'MyProcessor\',\n \'my-project.codegen:processor\',\n [\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n depths {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n it.enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n it.outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n\n}\n'})})})]})}function f(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),s=n(58797),o=n(85291),l=n(52245),u=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,n])}function f({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,u.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,s=p(e),[o,u]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!f({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),g=(()=>{const e=i??m;return f({value:e,tabValues:s})?e:null})();(0,l.A)(()=>{g&&u(g)},[g]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!f({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);u(e),d(e),b(e)},[d,b,s]),tabValues:s}}var b=n(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var y=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:o}){const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,s.a_)(),i=e=>{const t=e.currentTarget,a=l.indexOf(t),s=o[a].value;s!==n&&(u(t),r(s))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:o.map(({value:e,label:t,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{l.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,y.jsx)(v,{...t,...e}),(0,y.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,y.jsx)(j,{...e,children:d(e.children)},String(t))}}}]); \ No newline at end of file diff --git a/assets/js/51d6008a.50a9f7f0.js b/assets/js/51d6008a.50a9f7f0.js new file mode 100644 index 0000000000..f277746513 --- /dev/null +++ b/assets/js/51d6008a.50a9f7f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2090],{64426:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>d,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","source":"@site/docs/rules/android/unused_kotlin_android_extensions.md","sourceDirName":"rules/android","slug":"/rules/unused_kotlin_android_extensions","permalink":"/ModuleCheck/docs/next/rules/unused_kotlin_android_extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/android/unused_kotlin_android_extensions.md","tags":[],"version":"current","frontMatter":{"id":"unused_kotlin_android_extensions","slug":"/rules/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","sidebar_label":"Unused Kotlin Android Extensions"},"sidebar":"Docs","previous":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/next/rules/disable_view_binding"}}');var o=t(23420),i=t(65404);const d={id:"unused_kotlin_android_extensions",slug:"/rules/unused_kotlin_android_extensions",title:"Unused Kotlin Android Extensions",sidebar_label:"Unused Kotlin Android Extensions"},r=void 0,u={},l=[];function a(n){const e={p:"p",...(0,i.R)(),...n.components};return(0,o.jsx)(e.p,{children:"Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any\nsynthetic imports or deprecated @Parcelize annotation"})}function c(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,o.jsx)(e,{...n,children:(0,o.jsx)(a,{...n})}):a(n)}},65404:(n,e,t)=>{t.d(e,{R:()=>d,x:()=>r});var s=t(36672);const o={},i=s.createContext(o);function d(n){const e=s.useContext(i);return s.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function r(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(o):n.components||o:d(n.components),s.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/521dad97.82033bc9.js b/assets/js/521dad97.82033bc9.js new file mode 100644 index 0000000000..a07ccec5e4 --- /dev/null +++ b/assets/js/521dad97.82033bc9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9290],{65404:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(36672);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}},96090:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.12.0/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_dependencies","permalink":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/sorting/sort_dependencies.md","tags":[],"version":"0.12.0","frontMatter":{"id":"sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins"}}');var o=n(23420),r=n(65404);const i={id:"sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l()}}}]); \ No newline at end of file diff --git a/assets/js/53b10fcd.34a45138.js b/assets/js/53b10fcd.34a45138.js new file mode 100644 index 0000000000..84536ffe3b --- /dev/null +++ b/assets/js/53b10fcd.34a45138.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2271],{33836:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.11.1","label":"0.11.1","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.11.1","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.11.1/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.11.1/configuration","docId":"configuration","unlisted":false},{"collapsed":false,"type":"category","label":"Rules","items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.11.1/rules/unused","docId":"rules/unused","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.11.1/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.11.1/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"collapsed":false,"type":"category","label":"compiler","items":[{"type":"link","label":"Could Use Anvil Factory","href":"/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory","docId":"rules/compiler/could_use_anvil_factory","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Kapt","items":[{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor","docId":"rules/kapt/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin","docId":"rules/kapt/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers","docId":"rules/kapt/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Sorting","items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Android","items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.11.1/rules/android/disable_resources","docId":"rules/android/disable_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.11.1/rules/android/disable_viewbinding","docId":"rules/android/disable_viewbinding","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","sidebar":"Docs"},"rules/android/disable_resources":{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_viewbinding":{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/compiler/could_use_anvil_factory":{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/kapt/custom_kapt_matchers":{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/kapt/unused_kapt_plugin":{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","sidebar":"Docs"},"rules/kapt/unused_kapt_processor":{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused":{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/5493.c30074b0.js b/assets/js/5493.c30074b0.js new file mode 100644 index 0000000000..3f7597773b --- /dev/null +++ b/assets/js/5493.c30074b0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5493],{41041:(t,e,a)=>{a.d(e,{CP:()=>l,HT:()=>d,PB:()=>h,aC:()=>c,lC:()=>n,m:()=>o,tk:()=>i});var s=a(97485),r=a(41407),i=(0,s.K2)((t,e)=>{const a=t.append("rect");if(a.attr("x",e.x),a.attr("y",e.y),a.attr("fill",e.fill),a.attr("stroke",e.stroke),a.attr("width",e.width),a.attr("height",e.height),e.name&&a.attr("name",e.name),e.rx&&a.attr("rx",e.rx),e.ry&&a.attr("ry",e.ry),void 0!==e.attrs)for(const s in e.attrs)a.attr(s,e.attrs[s]);return e.class&&a.attr("class",e.class),a},"drawRect"),n=(0,s.K2)((t,e)=>{const a={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};i(t,a).lower()},"drawBackgroundRect"),o=(0,s.K2)((t,e)=>{const a=e.text.replace(s.H1," "),r=t.append("text");r.attr("x",e.x),r.attr("y",e.y),r.attr("class","legend"),r.style("text-anchor",e.anchor),e.class&&r.attr("class",e.class);const i=r.append("tspan");return i.attr("x",e.x+2*e.textMargin),i.text(a),r},"drawText"),c=(0,s.K2)((t,e,a,s)=>{const i=t.append("image");i.attr("x",e),i.attr("y",a);const n=(0,r.J)(s);i.attr("xlink:href",n)},"drawImage"),l=(0,s.K2)((t,e,a,s)=>{const i=t.append("use");i.attr("x",e),i.attr("y",a);const n=(0,r.J)(s);i.attr("xlink:href",`#${n}`)},"drawEmbeddedImage"),h=(0,s.K2)(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),d=(0,s.K2)(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")},65493:(t,e,a)=>{a.d(e,{diagram:()=>mt});var s=a(41041),r=a(98645),i=a(9420),n=a(97485),o=a(3170),c=a(41407),l=function(){var t=(0,n.K2)(function(t,e,a,s){for(a=a||{},s=t.length;s--;a[t[s]]=e);return a},"o"),e=[1,2],a=[1,3],s=[1,4],r=[2,4],i=[1,9],o=[1,11],c=[1,13],l=[1,14],h=[1,16],d=[1,17],p=[1,18],g=[1,24],u=[1,25],x=[1,26],y=[1,27],m=[1,28],b=[1,29],T=[1,30],E=[1,31],f=[1,32],w=[1,33],I=[1,34],L=[1,35],P=[1,36],_=[1,37],k=[1,38],A=[1,39],N=[1,41],v=[1,42],M=[1,43],D=[1,44],O=[1,45],S=[1,46],R=[1,4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,48,49,50,52,53,54,59,60,61,62,70],Y=[4,5,16,50,52,53],K=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],C=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,49,50,52,53,54,59,60,61,62,70],B=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,48,50,52,53,54,59,60,61,62,70],$=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,47,50,52,53,54,59,60,61,62,70],V=[68,69,70],F=[1,122],W={trace:(0,n.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SPACE:4,NEWLINE:5,SD:6,document:7,line:8,statement:9,box_section:10,box_line:11,participant_statement:12,create:13,box:14,restOfLine:15,end:16,signal:17,autonumber:18,NUM:19,off:20,activate:21,actor:22,deactivate:23,note_statement:24,links_statement:25,link_statement:26,properties_statement:27,details_statement:28,title:29,legacy_title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,loop:36,rect:37,opt:38,alt:39,else_sections:40,par:41,par_sections:42,par_over:43,critical:44,option_sections:45,break:46,option:47,and:48,else:49,participant:50,AS:51,participant_actor:52,destroy:53,note:54,placement:55,text2:56,over:57,actor_pair:58,links:59,link:60,properties:61,details:62,spaceList:63,",":64,left_of:65,right_of:66,signaltype:67,"+":68,"-":69,ACTOR:70,SOLID_OPEN_ARROW:71,DOTTED_OPEN_ARROW:72,SOLID_ARROW:73,BIDIRECTIONAL_SOLID_ARROW:74,DOTTED_ARROW:75,BIDIRECTIONAL_DOTTED_ARROW:76,SOLID_CROSS:77,DOTTED_CROSS:78,SOLID_POINT:79,DOTTED_POINT:80,TXT:81,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NEWLINE",6:"SD",13:"create",14:"box",15:"restOfLine",16:"end",18:"autonumber",19:"NUM",20:"off",21:"activate",23:"deactivate",29:"title",30:"legacy_title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"loop",37:"rect",38:"opt",39:"alt",41:"par",43:"par_over",44:"critical",46:"break",47:"option",48:"and",49:"else",50:"participant",51:"AS",52:"participant_actor",53:"destroy",54:"note",57:"over",59:"links",60:"link",61:"properties",62:"details",64:",",65:"left_of",66:"right_of",68:"+",69:"-",70:"ACTOR",71:"SOLID_OPEN_ARROW",72:"DOTTED_OPEN_ARROW",73:"SOLID_ARROW",74:"BIDIRECTIONAL_SOLID_ARROW",75:"DOTTED_ARROW",76:"BIDIRECTIONAL_DOTTED_ARROW",77:"SOLID_CROSS",78:"DOTTED_CROSS",79:"SOLID_POINT",80:"DOTTED_POINT",81:"TXT"},productions_:[0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[10,0],[10,2],[11,2],[11,1],[11,1],[9,1],[9,2],[9,4],[9,2],[9,4],[9,3],[9,3],[9,2],[9,3],[9,3],[9,2],[9,2],[9,2],[9,2],[9,2],[9,1],[9,1],[9,2],[9,2],[9,1],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[9,4],[45,1],[45,4],[42,1],[42,4],[40,1],[40,4],[12,5],[12,3],[12,5],[12,3],[12,3],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[63,2],[63,1],[58,3],[58,1],[55,1],[55,1],[17,5],[17,5],[17,4],[22,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[56,1]],performAction:(0,n.K2)(function(t,e,a,s,r,i,n){var o=i.length-1;switch(r){case 3:return s.apply(i[o]),i[o];case 4:case 9:case 8:case 13:this.$=[];break;case 5:case 10:i[o-1].push(i[o]),this.$=i[o-1];break;case 6:case 7:case 11:case 12:case 62:this.$=i[o];break;case 15:i[o].type="createParticipant",this.$=i[o];break;case 16:i[o-1].unshift({type:"boxStart",boxData:s.parseBoxData(i[o-2])}),i[o-1].push({type:"boxEnd",boxText:i[o-2]}),this.$=i[o-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(i[o-2]),sequenceIndexStep:Number(i[o-1]),sequenceVisible:!0,signalType:s.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(i[o-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:s.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:s.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:s.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:s.LINETYPE.ACTIVE_START,actor:i[o-1].actor};break;case 23:this.$={type:"activeEnd",signalType:s.LINETYPE.ACTIVE_END,actor:i[o-1].actor};break;case 29:s.setDiagramTitle(i[o].substring(6)),this.$=i[o].substring(6);break;case 30:s.setDiagramTitle(i[o].substring(7)),this.$=i[o].substring(7);break;case 31:this.$=i[o].trim(),s.setAccTitle(this.$);break;case 32:case 33:this.$=i[o].trim(),s.setAccDescription(this.$);break;case 34:i[o-1].unshift({type:"loopStart",loopText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.LOOP_START}),i[o-1].push({type:"loopEnd",loopText:i[o-2],signalType:s.LINETYPE.LOOP_END}),this.$=i[o-1];break;case 35:i[o-1].unshift({type:"rectStart",color:s.parseMessage(i[o-2]),signalType:s.LINETYPE.RECT_START}),i[o-1].push({type:"rectEnd",color:s.parseMessage(i[o-2]),signalType:s.LINETYPE.RECT_END}),this.$=i[o-1];break;case 36:i[o-1].unshift({type:"optStart",optText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.OPT_START}),i[o-1].push({type:"optEnd",optText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.OPT_END}),this.$=i[o-1];break;case 37:i[o-1].unshift({type:"altStart",altText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.ALT_START}),i[o-1].push({type:"altEnd",signalType:s.LINETYPE.ALT_END}),this.$=i[o-1];break;case 38:i[o-1].unshift({type:"parStart",parText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.PAR_START}),i[o-1].push({type:"parEnd",signalType:s.LINETYPE.PAR_END}),this.$=i[o-1];break;case 39:i[o-1].unshift({type:"parStart",parText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.PAR_OVER_START}),i[o-1].push({type:"parEnd",signalType:s.LINETYPE.PAR_END}),this.$=i[o-1];break;case 40:i[o-1].unshift({type:"criticalStart",criticalText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.CRITICAL_START}),i[o-1].push({type:"criticalEnd",signalType:s.LINETYPE.CRITICAL_END}),this.$=i[o-1];break;case 41:i[o-1].unshift({type:"breakStart",breakText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.BREAK_START}),i[o-1].push({type:"breakEnd",optText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.BREAK_END}),this.$=i[o-1];break;case 43:this.$=i[o-3].concat([{type:"option",optionText:s.parseMessage(i[o-1]),signalType:s.LINETYPE.CRITICAL_OPTION},i[o]]);break;case 45:this.$=i[o-3].concat([{type:"and",parText:s.parseMessage(i[o-1]),signalType:s.LINETYPE.PAR_AND},i[o]]);break;case 47:this.$=i[o-3].concat([{type:"else",altText:s.parseMessage(i[o-1]),signalType:s.LINETYPE.ALT_ELSE},i[o]]);break;case 48:i[o-3].draw="participant",i[o-3].type="addParticipant",i[o-3].description=s.parseMessage(i[o-1]),this.$=i[o-3];break;case 49:i[o-1].draw="participant",i[o-1].type="addParticipant",this.$=i[o-1];break;case 50:i[o-3].draw="actor",i[o-3].type="addParticipant",i[o-3].description=s.parseMessage(i[o-1]),this.$=i[o-3];break;case 51:i[o-1].draw="actor",i[o-1].type="addParticipant",this.$=i[o-1];break;case 52:i[o-1].type="destroyParticipant",this.$=i[o-1];break;case 53:this.$=[i[o-1],{type:"addNote",placement:i[o-2],actor:i[o-1].actor,text:i[o]}];break;case 54:i[o-2]=[].concat(i[o-1],i[o-1]).slice(0,2),i[o-2][0]=i[o-2][0].actor,i[o-2][1]=i[o-2][1].actor,this.$=[i[o-1],{type:"addNote",placement:s.PLACEMENT.OVER,actor:i[o-2].slice(0,2),text:i[o]}];break;case 55:this.$=[i[o-1],{type:"addLinks",actor:i[o-1].actor,text:i[o]}];break;case 56:this.$=[i[o-1],{type:"addALink",actor:i[o-1].actor,text:i[o]}];break;case 57:this.$=[i[o-1],{type:"addProperties",actor:i[o-1].actor,text:i[o]}];break;case 58:this.$=[i[o-1],{type:"addDetails",actor:i[o-1].actor,text:i[o]}];break;case 61:this.$=[i[o-2],i[o]];break;case 63:this.$=s.PLACEMENT.LEFTOF;break;case 64:this.$=s.PLACEMENT.RIGHTOF;break;case 65:this.$=[i[o-4],i[o-1],{type:"addMessage",from:i[o-4].actor,to:i[o-1].actor,signalType:i[o-3],msg:i[o],activate:!0},{type:"activeStart",signalType:s.LINETYPE.ACTIVE_START,actor:i[o-1].actor}];break;case 66:this.$=[i[o-4],i[o-1],{type:"addMessage",from:i[o-4].actor,to:i[o-1].actor,signalType:i[o-3],msg:i[o]},{type:"activeEnd",signalType:s.LINETYPE.ACTIVE_END,actor:i[o-4].actor}];break;case 67:this.$=[i[o-3],i[o-1],{type:"addMessage",from:i[o-3].actor,to:i[o-1].actor,signalType:i[o-2],msg:i[o]}];break;case 68:this.$={type:"addParticipant",actor:i[o]};break;case 69:this.$=s.LINETYPE.SOLID_OPEN;break;case 70:this.$=s.LINETYPE.DOTTED_OPEN;break;case 71:this.$=s.LINETYPE.SOLID;break;case 72:this.$=s.LINETYPE.BIDIRECTIONAL_SOLID;break;case 73:this.$=s.LINETYPE.DOTTED;break;case 74:this.$=s.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 75:this.$=s.LINETYPE.SOLID_CROSS;break;case 76:this.$=s.LINETYPE.DOTTED_CROSS;break;case 77:this.$=s.LINETYPE.SOLID_POINT;break;case 78:this.$=s.LINETYPE.DOTTED_POINT;break;case 79:this.$=s.parseMessage(i[o].trim().substring(1))}},"anonymous"),table:[{3:1,4:e,5:a,6:s},{1:[3]},{3:5,4:e,5:a,6:s},{3:6,4:e,5:a,6:s},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],r,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:i,5:o,8:8,9:10,12:12,13:c,14:l,17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},t(R,[2,5]),{9:47,12:12,13:c,14:l,17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},t(R,[2,7]),t(R,[2,8]),t(R,[2,14]),{12:48,50:_,52:k,53:A},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,70:S},{22:55,70:S},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(R,[2,29]),t(R,[2,30]),{32:[1,61]},{34:[1,62]},t(R,[2,33]),{15:[1,63]},{15:[1,64]},{15:[1,65]},{15:[1,66]},{15:[1,67]},{15:[1,68]},{15:[1,69]},{15:[1,70]},{22:71,70:S},{22:72,70:S},{22:73,70:S},{67:74,71:[1,75],72:[1,76],73:[1,77],74:[1,78],75:[1,79],76:[1,80],77:[1,81],78:[1,82],79:[1,83],80:[1,84]},{55:85,57:[1,86],65:[1,87],66:[1,88]},{22:89,70:S},{22:90,70:S},{22:91,70:S},{22:92,70:S},t([5,51,64,71,72,73,74,75,76,77,78,79,80,81],[2,68]),t(R,[2,6]),t(R,[2,15]),t(Y,[2,9],{10:93}),t(R,[2,17]),{5:[1,95],19:[1,94]},{5:[1,96]},t(R,[2,21]),{5:[1,97]},{5:[1,98]},t(R,[2,24]),t(R,[2,25]),t(R,[2,26]),t(R,[2,27]),t(R,[2,28]),t(R,[2,31]),t(R,[2,32]),t(K,r,{7:99}),t(K,r,{7:100}),t(K,r,{7:101}),t(C,r,{40:102,7:103}),t(B,r,{42:104,7:105}),t(B,r,{7:105,42:106}),t($,r,{45:107,7:108}),t(K,r,{7:109}),{5:[1,111],51:[1,110]},{5:[1,113],51:[1,112]},{5:[1,114]},{22:117,68:[1,115],69:[1,116],70:S},t(V,[2,69]),t(V,[2,70]),t(V,[2,71]),t(V,[2,72]),t(V,[2,73]),t(V,[2,74]),t(V,[2,75]),t(V,[2,76]),t(V,[2,77]),t(V,[2,78]),{22:118,70:S},{22:120,58:119,70:S},{70:[2,63]},{70:[2,64]},{56:121,81:F},{56:123,81:F},{56:124,81:F},{56:125,81:F},{4:[1,128],5:[1,130],11:127,12:129,16:[1,126],50:_,52:k,53:A},{5:[1,131]},t(R,[2,19]),t(R,[2,20]),t(R,[2,22]),t(R,[2,23]),{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,132],17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,133],17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,134],17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},{16:[1,135]},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[2,46],17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,49:[1,136],50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},{16:[1,137]},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[2,44],17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,48:[1,138],50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},{16:[1,139]},{16:[1,140]},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[2,42],17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,47:[1,141],50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,142],17:15,18:h,21:d,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:A,54:N,59:v,60:M,61:D,62:O,70:S},{15:[1,143]},t(R,[2,49]),{15:[1,144]},t(R,[2,51]),t(R,[2,52]),{22:145,70:S},{22:146,70:S},{56:147,81:F},{56:148,81:F},{56:149,81:F},{64:[1,150],81:[2,62]},{5:[2,55]},{5:[2,79]},{5:[2,56]},{5:[2,57]},{5:[2,58]},t(R,[2,16]),t(Y,[2,10]),{12:151,50:_,52:k,53:A},t(Y,[2,12]),t(Y,[2,13]),t(R,[2,18]),t(R,[2,34]),t(R,[2,35]),t(R,[2,36]),t(R,[2,37]),{15:[1,152]},t(R,[2,38]),{15:[1,153]},t(R,[2,39]),t(R,[2,40]),{15:[1,154]},t(R,[2,41]),{5:[1,155]},{5:[1,156]},{56:157,81:F},{56:158,81:F},{5:[2,67]},{5:[2,53]},{5:[2,54]},{22:159,70:S},t(Y,[2,11]),t(C,r,{7:103,40:160}),t(B,r,{7:105,42:161}),t($,r,{7:108,45:162}),t(R,[2,48]),t(R,[2,50]),{5:[2,65]},{5:[2,66]},{81:[2,61]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],87:[2,63],88:[2,64],121:[2,55],122:[2,79],123:[2,56],124:[2,57],125:[2,58],147:[2,67],148:[2,53],149:[2,54],157:[2,65],158:[2,66],159:[2,61],160:[2,47],161:[2,45],162:[2,43]},parseError:(0,n.K2)(function(t,e){if(!e.recoverable){var a=new Error(t);throw a.hash=e,a}this.trace(t)},"parseError"),parse:(0,n.K2)(function(t){var e=this,a=[0],s=[],r=[null],i=[],o=this.table,c="",l=0,h=0,d=0,p=i.slice.call(arguments,1),g=Object.create(this.lexer),u={yy:{}};for(var x in this.yy)Object.prototype.hasOwnProperty.call(this.yy,x)&&(u.yy[x]=this.yy[x]);g.setInput(t,u.yy),u.yy.lexer=g,u.yy.parser=this,void 0===g.yylloc&&(g.yylloc={});var y=g.yylloc;i.push(y);var m=g.options&&g.options.ranges;function b(){var t;return"number"!=typeof(t=s.pop()||g.lex()||1)&&(t instanceof Array&&(t=(s=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof u.yy.parseError?this.parseError=u.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,n.K2)(function(t){a.length=a.length-2*t,r.length=r.length-t,i.length=i.length-t},"popStack"),(0,n.K2)(b,"lex");for(var T,E,f,w,I,L,P,_,k,A={};;){if(f=a[a.length-1],this.defaultActions[f]?w=this.defaultActions[f]:(null==T&&(T=b()),w=o[f]&&o[f][T]),void 0===w||!w.length||!w[0]){var N="";for(L in k=[],o[f])this.terminals_[L]&&L>2&&k.push("'"+this.terminals_[L]+"'");N=g.showPosition?"Parse error on line "+(l+1)+":\n"+g.showPosition()+"\nExpecting "+k.join(", ")+", got '"+(this.terminals_[T]||T)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==T?"end of input":"'"+(this.terminals_[T]||T)+"'"),this.parseError(N,{text:g.match,token:this.terminals_[T]||T,line:g.yylineno,loc:y,expected:k})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+f+", token: "+T);switch(w[0]){case 1:a.push(T),r.push(g.yytext),i.push(g.yylloc),a.push(w[1]),T=null,E?(T=E,E=null):(h=g.yyleng,c=g.yytext,l=g.yylineno,y=g.yylloc,d>0&&d--);break;case 2:if(P=this.productions_[w[1]][1],A.$=r[r.length-P],A._$={first_line:i[i.length-(P||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(P||1)].first_column,last_column:i[i.length-1].last_column},m&&(A._$.range=[i[i.length-(P||1)].range[0],i[i.length-1].range[1]]),void 0!==(I=this.performAction.apply(A,[c,h,l,u.yy,w[1],r,i].concat(p))))return I;P&&(a=a.slice(0,-1*P*2),r=r.slice(0,-1*P),i=i.slice(0,-1*P)),a.push(this.productions_[w[1]][0]),r.push(A.$),i.push(A._$),_=o[a[a.length-2]][a[a.length-1]],a.push(_);break;case 3:return!0}}return!0},"parse")},q=function(){return{EOF:1,parseError:(0,n.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,n.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,n.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,n.K2)(function(t){var e=t.length,a=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var s=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),a.length-1&&(this.yylineno-=a.length-1);var r=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:a?(a.length===s.length?this.yylloc.first_column:0)+s[s.length-a.length].length-a[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,n.K2)(function(){return this._more=!0,this},"more"),reject:(0,n.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,n.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,n.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,n.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,n.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,n.K2)(function(t,e){var a,s,r;if(this.options.backtrack_lexer&&(r={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(r.yylloc.range=this.yylloc.range.slice(0))),(s=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],a=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a)return a;if(this._backtrack){for(var i in r)this[i]=r[i];return!1}return!1},"test_match"),next:(0,n.K2)(function(){if(this.done)return this.EOF;var t,e,a,s;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),i=0;i<r.length;i++)if((a=this._input.match(this.rules[r[i]]))&&(!e||a[0].length>e[0].length)){if(e=a,s=i,this.options.backtrack_lexer){if(!1!==(t=this.test_match(a,r[i])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[s]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,n.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,n.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,n.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,n.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,n.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,n.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,n.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,n.K2)(function(t,e,a,s){switch(a){case 0:case 51:case 67:return 5;case 1:case 2:case 3:case 4:case 5:break;case 6:return 19;case 7:return this.begin("LINE"),14;case 8:return this.begin("ID"),50;case 9:return this.begin("ID"),52;case 10:return 13;case 11:return this.begin("ID"),53;case 12:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),70;case 13:return this.popState(),this.popState(),this.begin("LINE"),51;case 14:return this.popState(),this.popState(),5;case 15:return this.begin("LINE"),36;case 16:return this.begin("LINE"),37;case 17:return this.begin("LINE"),38;case 18:return this.begin("LINE"),39;case 19:return this.begin("LINE"),49;case 20:return this.begin("LINE"),41;case 21:return this.begin("LINE"),43;case 22:return this.begin("LINE"),48;case 23:return this.begin("LINE"),44;case 24:return this.begin("LINE"),47;case 25:return this.begin("LINE"),46;case 26:return this.popState(),15;case 27:return 16;case 28:return 65;case 29:return 66;case 30:return 59;case 31:return 60;case 32:return 61;case 33:return 62;case 34:return 57;case 35:return 54;case 36:return this.begin("ID"),21;case 37:return this.begin("ID"),23;case 38:return 29;case 39:return 30;case 40:return this.begin("acc_title"),31;case 41:return this.popState(),"acc_title_value";case 42:return this.begin("acc_descr"),33;case 43:return this.popState(),"acc_descr_value";case 44:this.begin("acc_descr_multiline");break;case 45:this.popState();break;case 46:return"acc_descr_multiline_value";case 47:return 6;case 48:return 18;case 49:return 20;case 50:return 64;case 52:return e.yytext=e.yytext.trim(),70;case 53:return 73;case 54:return 74;case 55:return 75;case 56:return 76;case 57:return 71;case 58:return 72;case 59:return 77;case 60:return 78;case 61:return 79;case 62:return 80;case 63:case 64:return 81;case 65:return 68;case 66:return 69;case 68:return"INVALID"}},"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \n]+))/i,/^(?:box\b)/i,/^(?:participant\b)/i,/^(?:actor\b)/i,/^(?:create\b)/i,/^(?:destroy\b)/i,/^(?:[^\<->\->:\n,;]+?([\-]*[^\<->\->:\n,;]+?)*?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:par_over\b)/i,/^(?:and\b)/i,/^(?:critical\b)/i,/^(?:option\b)/i,/^(?:break\b)/i,/^(?:(?:[:]?(?:no)?wrap)?[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:links\b)/i,/^(?:link\b)/i,/^(?:properties\b)/i,/^(?:details\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:title:\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:sequenceDiagram\b)/i,/^(?:autonumber\b)/i,/^(?:off\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\<->\->:\n,;]+((?!(-x|--x|-\)|--\)))[\-]*[^\+\<->\->:\n,;]+)*)/i,/^(?:->>)/i,/^(?:<<->>)/i,/^(?:-->>)/i,/^(?:<<-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?:-[\)])/i,/^(?:--[\)])/i,/^(?::(?:(?:no)?wrap)?[^#\n;]*)/i,/^(?::)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[45,46],inclusive:!1},acc_descr:{rules:[43],inclusive:!1},acc_title:{rules:[41],inclusive:!1},ID:{rules:[2,3,12],inclusive:!1},ALIAS:{rules:[2,3,13,14],inclusive:!1},LINE:{rules:[2,3,26],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39,40,42,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68],inclusive:!0}}}}();function z(){this.yy={}}return W.lexer=q,(0,n.K2)(z,"Parser"),z.prototype=W,W.Parser=z,new z}();l.parser=l;var h=l,d={SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25,AUTONUMBER:26,CRITICAL_START:27,CRITICAL_OPTION:28,CRITICAL_END:29,BREAK_START:30,BREAK_END:31,PAR_OVER_START:32,BIDIRECTIONAL_SOLID:33,BIDIRECTIONAL_DOTTED:34},p={FILLED:0,OPEN:1},g={LEFTOF:0,RIGHTOF:1,OVER:2},u=class{constructor(){this.state=new r.m(()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0})),this.setAccTitle=n.SV,this.setAccDescription=n.EI,this.setDiagramTitle=n.ke,this.getAccTitle=n.iN,this.getAccDescription=n.m7,this.getDiagramTitle=n.ab,this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap((0,n.D7)().wrap),this.LINETYPE=d,this.ARROWTYPE=p,this.PLACEMENT=g}static{(0,n.K2)(this,"SequenceDB")}addBox(t){this.state.records.boxes.push({name:t.text,wrap:t.wrap??this.autoWrap(),fill:t.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(t,e,a,s){let r=this.state.records.currentBox;const i=this.state.records.actors.get(t);if(i){if(this.state.records.currentBox&&i.box&&this.state.records.currentBox!==i.box)throw new Error(`A same participant should only be defined in one Box: ${i.name} can't be in '${i.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(r=i.box?i.box:this.state.records.currentBox,i.box=r,i&&e===i.name&&null==a)return}if(null==a?.text&&(a={text:e,type:s}),null!=s&&null!=a.text||(a={text:e,type:s}),this.state.records.actors.set(t,{box:r,name:e,description:a.text,wrap:a.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:s??"participant"}),this.state.records.prevActor){const e=this.state.records.actors.get(this.state.records.prevActor);e&&(e.nextActor=t)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(t),this.state.records.prevActor=t}activationCount(t){let e,a=0;if(!t)return 0;for(e=0;e<this.state.records.messages.length;e++)this.state.records.messages[e].type===this.LINETYPE.ACTIVE_START&&this.state.records.messages[e].from===t&&a++,this.state.records.messages[e].type===this.LINETYPE.ACTIVE_END&&this.state.records.messages[e].from===t&&a--;return a}addMessage(t,e,a,s){this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:t,to:e,message:a.text,wrap:a.wrap??this.autoWrap(),answer:s})}addSignal(t,e,a,s,r=!1){if(s===this.LINETYPE.ACTIVE_END){if(this.activationCount(t??"")<1){const e=new Error("Trying to inactivate an inactive participant ("+t+")");throw e.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},e}}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:t,to:e,message:a?.text??"",wrap:a?.wrap??this.autoWrap(),type:s,activate:r}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some(t=>t.name)}getMessages(){return this.state.records.messages}getBoxes(){return this.state.records.boxes}getActors(){return this.state.records.actors}getCreatedActors(){return this.state.records.createdActors}getDestroyedActors(){return this.state.records.destroyedActors}getActor(t){return this.state.records.actors.get(t)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(t){this.state.records.wrapEnabled=t}extractWrap(t){if(void 0===t)return{};t=t.trim();const e=null!==/^:?wrap:/.exec(t)||null===/^:?nowrap:/.exec(t)&&void 0;return{cleanedText:(void 0===e?t:t.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:e}}autoWrap(){return void 0!==this.state.records.wrapEnabled?this.state.records.wrapEnabled:(0,n.D7)().sequence?.wrap??!1}clear(){this.state.reset(),(0,n.IU)()}parseMessage(t){const e=t.trim(),{wrap:a,cleanedText:s}=this.extractWrap(e),r={text:s,wrap:a};return n.Rm.debug(`parseMessage: ${JSON.stringify(r)}`),r}parseBoxData(t){const e=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(t);let a=e?.[1]?e[1].trim():"transparent",s=e?.[2]?e[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",a)||(a="transparent",s=t.trim());else{const e=(new Option).style;e.color=a,e.color!==a&&(a="transparent",s=t.trim())}const{wrap:r,cleanedText:i}=this.extractWrap(s);return{text:i?(0,n.jZ)(i,(0,n.D7)()):void 0,color:a,wrap:r}}addNote(t,e,a){const s={actor:t,placement:e,message:a.text,wrap:a.wrap??this.autoWrap()},r=[].concat(t,t);this.state.records.notes.push(s),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:r[0],to:r[1],message:a.text,wrap:a.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:e})}addLinks(t,e){const a=this.getActor(t);try{let t=(0,n.jZ)(e.text,(0,n.D7)());t=t.replace(/=/g,"="),t=t.replace(/&/g,"&");const s=JSON.parse(t);this.insertLinks(a,s)}catch(s){n.Rm.error("error while parsing actor link text",s)}}addALink(t,e){const a=this.getActor(t);try{const t={};let s=(0,n.jZ)(e.text,(0,n.D7)());const r=s.indexOf("@");s=s.replace(/=/g,"="),s=s.replace(/&/g,"&");const i=s.slice(0,r-1).trim(),o=s.slice(r+1).trim();t[i]=o,this.insertLinks(a,t)}catch(s){n.Rm.error("error while parsing actor link text",s)}}insertLinks(t,e){if(null==t.links)t.links=e;else for(const a in e)t.links[a]=e[a]}addProperties(t,e){const a=this.getActor(t);try{const t=(0,n.jZ)(e.text,(0,n.D7)()),s=JSON.parse(t);this.insertProperties(a,s)}catch(s){n.Rm.error("error while parsing actor properties text",s)}}insertProperties(t,e){if(null==t.properties)t.properties=e;else for(const a in e)t.properties[a]=e[a]}boxEnd(){this.state.records.currentBox=void 0}addDetails(t,e){const a=this.getActor(t),s=document.getElementById(e.text);try{const t=s.innerHTML,e=JSON.parse(t);e.properties&&this.insertProperties(a,e.properties),e.links&&this.insertLinks(a,e.links)}catch(r){n.Rm.error("error while parsing actor details text",r)}}getActorProperty(t,e){if(void 0!==t?.properties)return t.properties[e]}apply(t){if(Array.isArray(t))t.forEach(t=>{this.apply(t)});else switch(t.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":this.addActor(t.actor,t.actor,t.description,t.draw);break;case"createParticipant":if(this.state.records.actors.has(t.actor))throw new Error("It is not possible to have actors with the same id, even if one is destroyed before the next is created. Use 'AS' aliases to simulate the behavior");this.state.records.lastCreated=t.actor,this.addActor(t.actor,t.actor,t.description,t.draw),this.state.records.createdActors.set(t.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=t.actor,this.state.records.destroyedActors.set(t.actor,this.state.records.messages.length);break;case"activeStart":case"activeEnd":this.addSignal(t.actor,void 0,void 0,t.signalType);break;case"addNote":this.addNote(t.actor,t.placement,t.text);break;case"addLinks":this.addLinks(t.actor,t.text);break;case"addALink":this.addALink(t.actor,t.text);break;case"addProperties":this.addProperties(t.actor,t.text);break;case"addDetails":this.addDetails(t.actor,t.text);break;case"addMessage":if(this.state.records.lastCreated){if(t.to!==this.state.records.lastCreated)throw new Error("The created participant "+this.state.records.lastCreated.name+" does not have an associated creating message after its declaration. Please check the sequence diagram.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(t.to!==this.state.records.lastDestroyed&&t.from!==this.state.records.lastDestroyed)throw new Error("The destroyed participant "+this.state.records.lastDestroyed.name+" does not have an associated destroying message after its declaration. Please check the sequence diagram.");this.state.records.lastDestroyed=void 0}this.addSignal(t.from,t.to,t.msg,t.signalType,t.activate);break;case"boxStart":this.addBox(t.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":case"rectEnd":case"optEnd":case"altEnd":case"parEnd":case"criticalEnd":case"breakEnd":this.addSignal(void 0,void 0,void 0,t.signalType);break;case"rectStart":this.addSignal(void 0,void 0,t.color,t.signalType);break;case"optStart":this.addSignal(void 0,void 0,t.optText,t.signalType);break;case"altStart":case"else":this.addSignal(void 0,void 0,t.altText,t.signalType);break;case"setAccTitle":(0,n.SV)(t.text);break;case"parStart":case"and":this.addSignal(void 0,void 0,t.parText,t.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,t.criticalText,t.signalType);break;case"option":this.addSignal(void 0,void 0,t.optionText,t.signalType);break;case"breakStart":this.addSignal(void 0,void 0,t.breakText,t.signalType)}}getConfig(){return(0,n.D7)().sequence}},x=(0,n.K2)(t=>`.actor {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${t.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${t.actorLineColor};\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${t.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${t.signalColor};\n }\n\n #arrowhead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .sequenceNumber {\n fill: ${t.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${t.signalColor};\n }\n\n #crosshead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .messageText {\n fill: ${t.signalTextColor};\n stroke: none;\n }\n\n .labelBox {\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${t.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${t.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${t.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation1 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation2 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .actorPopupMenu {\n position: absolute;\n }\n\n .actorPopupMenuPanel {\n position: absolute;\n fill: ${t.actorBkg};\n box-shadow: 0px 8px 16px 0px rgba(0,0,0,0.2);\n filter: drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));\n}\n .actor-man line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n .actor-man circle, line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n stroke-width: 2px;\n }\n`,"getStyles"),y="actor-top",m="actor-bottom",b="actor-man",T=(0,n.K2)(function(t,e){return(0,s.tk)(t,e)},"drawRect"),E=(0,n.K2)(function(t,e,a,s,r){if(void 0===e.links||null===e.links||0===Object.keys(e.links).length)return{height:0,width:0};const i=e.links,n=e.actorCnt,o=e.rectData;var l="none";r&&(l="block !important");const h=t.append("g");h.attr("id","actor"+n+"_popup"),h.attr("class","actorPopupMenu"),h.attr("display",l);var d="";void 0!==o.class&&(d=" "+o.class);let p=o.width>a?o.width:a;const g=h.append("rect");if(g.attr("class","actorPopupMenuPanel"+d),g.attr("x",o.x),g.attr("y",o.height),g.attr("fill",o.fill),g.attr("stroke",o.stroke),g.attr("width",p),g.attr("height",o.height),g.attr("rx",o.rx),g.attr("ry",o.ry),null!=i){var u=20;for(let t in i){var x=h.append("a"),y=(0,c.J)(i[t]);x.attr("xlink:href",y),x.attr("target","_blank"),z(s)(t,x,o.x+10,o.height+u,p,20,{class:"actor"},s),u+=30}}return g.attr("height",u),{height:o.height+u,width:p}},"drawPopup"),f=(0,n.K2)(function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"},"popupMenuToggle"),w=(0,n.K2)(async function(t,e,a=null){let s=t.append("foreignObject");const r=await(0,n.VJ)(e.text,(0,n.zj)()),i=s.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(r).node().getBoundingClientRect();if(s.attr("height",Math.round(i.height)).attr("width",Math.round(i.width)),"noteText"===e.class){const a=t.node().firstChild;a.setAttribute("height",i.height+2*e.textMargin);const r=a.getBBox();s.attr("x",Math.round(r.x+r.width/2-i.width/2)).attr("y",Math.round(r.y+r.height/2-i.height/2))}else if(a){let{startx:t,stopx:r,starty:n}=a;if(t>r){const e=t;t=r,r=e}s.attr("x",Math.round(t+Math.abs(t-r)/2-i.width/2)),"loopText"===e.class?s.attr("y",Math.round(n)):s.attr("y",Math.round(n-i.height))}return[s]},"drawKatex"),I=(0,n.K2)(function(t,e){let a=0,s=0;const r=e.text.split(n.Y2.lineBreakRegex),[o,c]=(0,i.I5)(e.fontSize);let l=[],h=0,d=(0,n.K2)(()=>e.y,"yfunc");if(void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0)switch(e.valign){case"top":case"start":d=(0,n.K2)(()=>Math.round(e.y+e.textMargin),"yfunc");break;case"middle":case"center":d=(0,n.K2)(()=>Math.round(e.y+(a+s+e.textMargin)/2),"yfunc");break;case"bottom":case"end":d=(0,n.K2)(()=>Math.round(e.y+(a+s+2*e.textMargin)-e.textMargin),"yfunc")}if(void 0!==e.anchor&&void 0!==e.textMargin&&void 0!==e.width)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle"}for(let[n,p]of r.entries()){void 0!==e.textMargin&&0===e.textMargin&&void 0!==o&&(h=n*o);const r=t.append("text");r.attr("x",e.x),r.attr("y",d()),void 0!==e.anchor&&r.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),void 0!==e.fontFamily&&r.style("font-family",e.fontFamily),void 0!==c&&r.style("font-size",c),void 0!==e.fontWeight&&r.style("font-weight",e.fontWeight),void 0!==e.fill&&r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class),void 0!==e.dy?r.attr("dy",e.dy):0!==h&&r.attr("dy",h);const g=p||i.pe;if(e.tspan){const t=r.append("tspan");t.attr("x",e.x),void 0!==e.fill&&t.attr("fill",e.fill),t.text(g)}else r.text(g);void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0&&(s+=(r._groups||r)[0][0].getBBox().height,a=s),l.push(r)}return l},"drawText"),L=(0,n.K2)(function(t,e){function a(t,e,a,s,r){return t+","+e+" "+(t+a)+","+e+" "+(t+a)+","+(e+s-r)+" "+(t+a-1.2*r)+","+(e+s)+" "+t+","+(e+s)}(0,n.K2)(a,"genPoints");const s=t.append("polygon");return s.attr("points",a(e.x,e.y,e.width,e.height,7)),s.attr("class","labelBox"),e.y=e.y+e.height/2,I(t,e),s},"drawLabel"),P=-1,_=(0,n.K2)((t,e,a,s)=>{t.select&&a.forEach(a=>{const r=e.get(a),i=t.select("#actor"+r.actorCnt);!s.mirrorActors&&r.stopy?i.attr("y2",r.stopy+r.height/2):s.mirrorActors&&i.attr("y2",r.stopy)})},"fixLifeLineHeights"),k=(0,n.K2)(function(t,e,a,r){const i=r?e.stopy:e.starty,o=e.x+e.width/2,c=i+e.height,l=t.append("g").lower();var h=l;r||(P++,Object.keys(e.links||{}).length&&!a.forceMenus&&h.attr("onclick",f(`actor${P}_popup`)).attr("cursor","pointer"),h.append("line").attr("id","actor"+P).attr("x1",o).attr("y1",c).attr("x2",o).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),h=l.append("g"),e.actorCnt=P,null!=e.links&&h.attr("id","root-"+P));const d=(0,s.PB)();var p="actor";e.properties?.class?p=e.properties.class:d.fill="#eaeaea",p+=r?` ${m}`:` ${y}`,d.x=e.x,d.y=i,d.width=e.width,d.height=e.height,d.class=p,d.rx=3,d.ry=3,d.name=e.name;const g=T(h,d);if(e.rectData=d,e.properties?.icon){const t=e.properties.icon.trim();"@"===t.charAt(0)?(0,s.CP)(h,d.x+d.width-20,d.y+10,t.substr(1)):(0,s.aC)(h,d.x+d.width-20,d.y+10,t)}q(a,(0,n.Wi)(e.description))(e.description,h,d.x,d.y,d.width,d.height,{class:"actor actor-box"},a);let u=e.height;if(g.node){const t=g.node().getBBox();e.height=t.height,u=t.height}return u},"drawActorTypeParticipant"),A=(0,n.K2)(function(t,e,a,r){const i=r?e.stopy:e.starty,o=e.x+e.width/2,c=i+80,l=t.append("g").lower();r||(P++,l.append("line").attr("id","actor"+P).attr("x1",o).attr("y1",c).attr("x2",o).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=P);const h=t.append("g");let d=b;d+=r?` ${m}`:` ${y}`,h.attr("class",d),h.attr("name",e.name);const p=(0,s.PB)();p.x=e.x,p.y=i,p.fill="#eaeaea",p.width=e.width,p.height=e.height,p.class="actor",p.rx=3,p.ry=3,h.append("line").attr("id","actor-man-torso"+P).attr("x1",o).attr("y1",i+25).attr("x2",o).attr("y2",i+45),h.append("line").attr("id","actor-man-arms"+P).attr("x1",o-18).attr("y1",i+33).attr("x2",o+18).attr("y2",i+33),h.append("line").attr("x1",o-18).attr("y1",i+60).attr("x2",o).attr("y2",i+45),h.append("line").attr("x1",o).attr("y1",i+45).attr("x2",o+18-2).attr("y2",i+60);const g=h.append("circle");g.attr("cx",e.x+e.width/2),g.attr("cy",i+10),g.attr("r",15),g.attr("width",e.width),g.attr("height",e.height);const u=h.node().getBBox();return e.height=u.height,q(a,(0,n.Wi)(e.description))(e.description,h,p.x,p.y+35,p.width,p.height,{class:`actor ${b}`},a),e.height},"drawActorTypeActor"),N=(0,n.K2)(async function(t,e,a,s){switch(e.type){case"actor":return await A(t,e,a,s);case"participant":return await k(t,e,a,s)}},"drawActor"),v=(0,n.K2)(function(t,e,a){const s=t.append("g");S(s,e),e.name&&q(a)(e.name,s,e.x,e.y+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},a),s.lower()},"drawBox"),M=(0,n.K2)(function(t){return t.append("g")},"anchorElement"),D=(0,n.K2)(function(t,e,a,r,i){const n=(0,s.PB)(),o=e.anchored;n.x=e.startx,n.y=e.starty,n.class="activation"+i%3,n.width=e.stopx-e.startx,n.height=a-e.starty,T(o,n)},"drawActivation"),O=(0,n.K2)(async function(t,e,a,r){const{boxMargin:i,boxTextMargin:o,labelBoxHeight:c,labelBoxWidth:l,messageFontFamily:h,messageFontSize:d,messageFontWeight:p}=r,g=t.append("g"),u=(0,n.K2)(function(t,e,a,s){return g.append("line").attr("x1",t).attr("y1",e).attr("x2",a).attr("y2",s).attr("class","loopLine")},"drawLoopLine");u(e.startx,e.starty,e.stopx,e.starty),u(e.stopx,e.starty,e.stopx,e.stopy),u(e.startx,e.stopy,e.stopx,e.stopy),u(e.startx,e.starty,e.startx,e.stopy),void 0!==e.sections&&e.sections.forEach(function(t){u(e.startx,t.y,e.stopx,t.y).style("stroke-dasharray","3, 3")});let x=(0,s.HT)();x.text=a,x.x=e.startx,x.y=e.starty,x.fontFamily=h,x.fontSize=d,x.fontWeight=p,x.anchor="middle",x.valign="middle",x.tspan=!1,x.width=l||50,x.height=c||20,x.textMargin=o,x.class="labelText",L(g,x),x=F(),x.text=e.title,x.x=e.startx+l/2+(e.stopx-e.startx)/2,x.y=e.starty+i+o,x.anchor="middle",x.valign="middle",x.textMargin=o,x.class="loopText",x.fontFamily=h,x.fontSize=d,x.fontWeight=p,x.wrap=!0;let y=(0,n.Wi)(x.text)?await w(g,x,e):I(g,x);if(void 0!==e.sectionTitles)for(const[s,m]of Object.entries(e.sectionTitles))if(m.message){x.text=m.message,x.x=e.startx+(e.stopx-e.startx)/2,x.y=e.sections[s].y+i+o,x.class="loopText",x.anchor="middle",x.valign="middle",x.tspan=!1,x.fontFamily=h,x.fontSize=d,x.fontWeight=p,x.wrap=e.wrap,(0,n.Wi)(x.text)?(e.starty=e.sections[s].y,await w(g,x,e)):I(g,x);let t=Math.round(y.map(t=>(t._groups||t)[0][0].getBBox().height).reduce((t,e)=>t+e));e.sections[s].height+=t-(i+o)}return e.height=Math.round(e.stopy-e.starty),g},"drawLoop"),S=(0,n.K2)(function(t,e){(0,s.lC)(t,e)},"drawBackgroundRect"),R=(0,n.K2)(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),Y=(0,n.K2)(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),K=(0,n.K2)(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),C=(0,n.K2)(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",7.9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto-start-reverse").append("path").attr("d","M -1 0 L 10 5 L 0 10 z")},"insertArrowHead"),B=(0,n.K2)(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",15.5).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),$=(0,n.K2)(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertSequenceNumber"),V=(0,n.K2)(function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1pt").attr("d","M 1,2 L 6,7 M 6,2 L 1,7")},"insertArrowCrossHead"),F=(0,n.K2)(function(){return{x:0,y:0,fill:void 0,anchor:void 0,style:"#666",width:void 0,height:void 0,textMargin:0,rx:0,ry:0,tspan:!0,valign:void 0}},"getTextObj"),W=(0,n.K2)(function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}},"getNoteRect"),q=function(){function t(t,e,a,s,i,n,o){r(e.append("text").attr("x",a+i/2).attr("y",s+n/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,a,s,o,c,l,h){const{actorFontSize:d,actorFontFamily:p,actorFontWeight:g}=h,[u,x]=(0,i.I5)(d),y=t.split(n.Y2.lineBreakRegex);for(let i=0;i<y.length;i++){const t=i*u-u*(y.length-1)/2,n=e.append("text").attr("x",a+o/2).attr("y",s).style("text-anchor","middle").style("font-size",x).style("font-weight",g).style("font-family",p);n.append("tspan").attr("x",a+o/2).attr("dy",t).text(y[i]),n.attr("y",s+c/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),r(n,l)}}function a(t,a,s,i,n,o,c,l){const h=a.append("switch"),d=h.append("foreignObject").attr("x",s).attr("y",i).attr("width",n).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");d.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,s,i,n,o,c,l),r(d,c)}async function s(t,a,s,i,o,c,l,h){const d=await(0,n.Dl)(t,(0,n.zj)()),p=a.append("switch"),g=p.append("foreignObject").attr("x",s+o/2-d.width/2).attr("y",i+c/2-d.height/2).attr("width",d.width).attr("height",d.height).append("xhtml:div").style("height","100%").style("width","100%");g.append("div").style("text-align","center").style("vertical-align","middle").html(await(0,n.VJ)(t,(0,n.zj)())),e(t,p,s,i,o,c,l,h),r(g,l)}function r(t,e){for(const a in e)e.hasOwnProperty(a)&&t.attr(a,e[a])}return(0,n.K2)(t,"byText"),(0,n.K2)(e,"byTspan"),(0,n.K2)(a,"byFo"),(0,n.K2)(s,"byKatex"),(0,n.K2)(r,"_setTextAttrs"),function(r,i=!1){return i?s:"fo"===r.textPlacement?a:"old"===r.textPlacement?t:e}}(),z=function(){function t(t,e,a,r,i,n,o){s(e.append("text").attr("x",a).attr("y",r).style("text-anchor","start").text(t),o)}function e(t,e,a,r,i,o,c,l){const{actorFontSize:h,actorFontFamily:d,actorFontWeight:p}=l,g=t.split(n.Y2.lineBreakRegex);for(let n=0;n<g.length;n++){const t=n*h-h*(g.length-1)/2,i=e.append("text").attr("x",a).attr("y",r).style("text-anchor","start").style("font-size",h).style("font-weight",p).style("font-family",d);i.append("tspan").attr("x",a).attr("dy",t).text(g[n]),i.attr("y",r+o/2).attr("dominant-baseline","central").attr("alignment-baseline","central"),s(i,c)}}function a(t,a,r,i,n,o,c,l){const h=a.append("switch"),d=h.append("foreignObject").attr("x",r).attr("y",i).attr("width",n).attr("height",o).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");d.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,r,i,0,o,c,l),s(d,c)}function s(t,e){for(const a in e)e.hasOwnProperty(a)&&t.attr(a,e[a])}return(0,n.K2)(t,"byText"),(0,n.K2)(e,"byTspan"),(0,n.K2)(a,"byFo"),(0,n.K2)(s,"_setTextAttrs"),function(s){return"fo"===s.textPlacement?a:"old"===s.textPlacement?t:e}}(),H={drawRect:T,drawText:I,drawLabel:L,drawActor:N,drawBox:v,drawPopup:E,anchorElement:M,drawActivation:D,drawLoop:O,drawBackgroundRect:S,insertArrowHead:C,insertArrowFilledHead:B,insertSequenceNumber:$,insertArrowCrossHead:V,insertDatabaseIcon:R,insertComputerIcon:Y,insertClockIcon:K,getTextObj:F,getNoteRect:W,fixLifeLineHeights:_,sanitizeUrl:c.J},j={},U={data:{startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},verticalPos:0,sequenceItems:[],activations:[],models:{getHeight:(0,n.K2)(function(){return Math.max.apply(null,0===this.actors.length?[0]:this.actors.map(t=>t.height||0))+(0===this.loops.length?0:this.loops.map(t=>t.height||0).reduce((t,e)=>t+e))+(0===this.messages.length?0:this.messages.map(t=>t.height||0).reduce((t,e)=>t+e))+(0===this.notes.length?0:this.notes.map(t=>t.height||0).reduce((t,e)=>t+e))},"getHeight"),clear:(0,n.K2)(function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]},"clear"),addBox:(0,n.K2)(function(t){this.boxes.push(t)},"addBox"),addActor:(0,n.K2)(function(t){this.actors.push(t)},"addActor"),addLoop:(0,n.K2)(function(t){this.loops.push(t)},"addLoop"),addMessage:(0,n.K2)(function(t){this.messages.push(t)},"addMessage"),addNote:(0,n.K2)(function(t){this.notes.push(t)},"addNote"),lastActor:(0,n.K2)(function(){return this.actors[this.actors.length-1]},"lastActor"),lastLoop:(0,n.K2)(function(){return this.loops[this.loops.length-1]},"lastLoop"),lastMessage:(0,n.K2)(function(){return this.messages[this.messages.length-1]},"lastMessage"),lastNote:(0,n.K2)(function(){return this.notes[this.notes.length-1]},"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:(0,n.K2)(function(){this.sequenceItems=[],this.activations=[],this.models.clear(),this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0},this.verticalPos=0,rt((0,n.D7)())},"init"),updateVal:(0,n.K2)(function(t,e,a,s){void 0===t[e]?t[e]=a:t[e]=s(a,t[e])},"updateVal"),updateBounds:(0,n.K2)(function(t,e,a,s){const r=this;let i=0;function o(o){return(0,n.K2)(function(n){i++;const c=r.sequenceItems.length-i+1;r.updateVal(n,"starty",e-c*j.boxMargin,Math.min),r.updateVal(n,"stopy",s+c*j.boxMargin,Math.max),r.updateVal(U.data,"startx",t-c*j.boxMargin,Math.min),r.updateVal(U.data,"stopx",a+c*j.boxMargin,Math.max),"activation"!==o&&(r.updateVal(n,"startx",t-c*j.boxMargin,Math.min),r.updateVal(n,"stopx",a+c*j.boxMargin,Math.max),r.updateVal(U.data,"starty",e-c*j.boxMargin,Math.min),r.updateVal(U.data,"stopy",s+c*j.boxMargin,Math.max))},"updateItemBounds")}(0,n.K2)(o,"updateFn"),this.sequenceItems.forEach(o()),this.activations.forEach(o("activation"))},"updateBounds"),insert:(0,n.K2)(function(t,e,a,s){const r=n.Y2.getMin(t,a),i=n.Y2.getMax(t,a),o=n.Y2.getMin(e,s),c=n.Y2.getMax(e,s);this.updateVal(U.data,"startx",r,Math.min),this.updateVal(U.data,"starty",o,Math.min),this.updateVal(U.data,"stopx",i,Math.max),this.updateVal(U.data,"stopy",c,Math.max),this.updateBounds(r,o,i,c)},"insert"),newActivation:(0,n.K2)(function(t,e,a){const s=a.get(t.from),r=it(t.from).length||0,i=s.x+s.width/2+(r-1)*j.activationWidth/2;this.activations.push({startx:i,starty:this.verticalPos+2,stopx:i+j.activationWidth,stopy:void 0,actor:t.from,anchored:H.anchorElement(e)})},"newActivation"),endActivation:(0,n.K2)(function(t){const e=this.activations.map(function(t){return t.actor}).lastIndexOf(t.from);return this.activations.splice(e,1)[0]},"endActivation"),createLoop:(0,n.K2)(function(t={message:void 0,wrap:!1,width:void 0},e){return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}},"createLoop"),newLoop:(0,n.K2)(function(t={message:void 0,wrap:!1,width:void 0},e){this.sequenceItems.push(this.createLoop(t,e))},"newLoop"),endLoop:(0,n.K2)(function(){return this.sequenceItems.pop()},"endLoop"),isLoopOverlap:(0,n.K2)(function(){return!!this.sequenceItems.length&&this.sequenceItems[this.sequenceItems.length-1].overlap},"isLoopOverlap"),addSectionToLoop:(0,n.K2)(function(t){const e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:U.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)},"addSectionToLoop"),saveVerticalPos:(0,n.K2)(function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)},"saveVerticalPos"),resetVerticalPos:(0,n.K2)(function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)},"resetVerticalPos"),bumpVerticalPos:(0,n.K2)(function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=n.Y2.getMax(this.data.stopy,this.verticalPos)},"bumpVerticalPos"),getVerticalPos:(0,n.K2)(function(){return this.verticalPos},"getVerticalPos"),getBounds:(0,n.K2)(function(){return{bounds:this.data,models:this.models}},"getBounds")},X=(0,n.K2)(async function(t,e){U.bumpVerticalPos(j.boxMargin),e.height=j.boxMargin,e.starty=U.getVerticalPos();const a=(0,s.PB)();a.x=e.startx,a.y=e.starty,a.width=e.width||j.width,a.class="note";const r=t.append("g"),i=H.drawRect(r,a),o=(0,s.HT)();o.x=e.startx,o.y=e.starty,o.width=a.width,o.dy="1em",o.text=e.message,o.class="noteText",o.fontFamily=j.noteFontFamily,o.fontSize=j.noteFontSize,o.fontWeight=j.noteFontWeight,o.anchor=j.noteAlign,o.textMargin=j.noteMargin,o.valign="center";const c=(0,n.Wi)(o.text)?await w(r,o):I(r,o),l=Math.round(c.map(t=>(t._groups||t)[0][0].getBBox().height).reduce((t,e)=>t+e));i.attr("height",l+2*j.noteMargin),e.height+=l+2*j.noteMargin,U.bumpVerticalPos(l+2*j.noteMargin),e.stopy=e.starty+l+2*j.noteMargin,e.stopx=e.startx+a.width,U.insert(e.startx,e.starty,e.stopx,e.stopy),U.models.addNote(e)},"drawNote"),J=(0,n.K2)(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont"),G=(0,n.K2)(t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight}),"noteFont"),Z=(0,n.K2)(t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight}),"actorFont");async function Q(t,e){U.bumpVerticalPos(10);const{startx:a,stopx:s,message:r}=e,o=n.Y2.splitBreaks(r).length,c=(0,n.Wi)(r),l=c?await(0,n.Dl)(r,(0,n.D7)()):i._K.calculateTextDimensions(r,J(j));if(!c){const t=l.height/o;e.height+=t,U.bumpVerticalPos(t)}let h,d=l.height-10;const p=l.width;if(a===s){h=U.getVerticalPos()+d,j.rightAngles||(d+=j.boxMargin,h=U.getVerticalPos()+d),d+=30;const t=n.Y2.getMax(p/2,j.width/2);U.insert(a-t,U.getVerticalPos()-10+d,s+t,U.getVerticalPos()+30+d)}else d+=j.boxMargin,h=U.getVerticalPos()+d,U.insert(a,h-10,s,h);return U.bumpVerticalPos(d),e.height+=d,e.stopy=e.starty+e.height,U.insert(e.fromBounds,e.starty,e.toBounds,e.stopy),h}(0,n.K2)(Q,"boundMessage");var tt=(0,n.K2)(async function(t,e,a,r){const{startx:o,stopx:c,starty:l,message:h,type:d,sequenceIndex:p,sequenceVisible:g}=e,u=i._K.calculateTextDimensions(h,J(j)),x=(0,s.HT)();x.x=o,x.y=l+10,x.width=c-o,x.class="messageText",x.dy="1em",x.text=h,x.fontFamily=j.messageFontFamily,x.fontSize=j.messageFontSize,x.fontWeight=j.messageFontWeight,x.anchor=j.messageAlign,x.valign="center",x.textMargin=j.wrapPadding,x.tspan=!1,(0,n.Wi)(x.text)?await w(t,x,{startx:o,stopx:c,starty:a}):I(t,x);const y=u.width;let m;o===c?m=j.rightAngles?t.append("path").attr("d",`M ${o},${a} H ${o+n.Y2.getMax(j.width/2,y/2)} V ${a+25} H ${o}`):t.append("path").attr("d","M "+o+","+a+" C "+(o+60)+","+(a-10)+" "+(o+60)+","+(a+30)+" "+o+","+(a+20)):(m=t.append("line"),m.attr("x1",o),m.attr("y1",a),m.attr("x2",c),m.attr("y2",a)),d===r.db.LINETYPE.DOTTED||d===r.db.LINETYPE.DOTTED_CROSS||d===r.db.LINETYPE.DOTTED_POINT||d===r.db.LINETYPE.DOTTED_OPEN||d===r.db.LINETYPE.BIDIRECTIONAL_DOTTED?(m.style("stroke-dasharray","3, 3"),m.attr("class","messageLine1")):m.attr("class","messageLine0");let b="";j.arrowMarkerAbsolute&&(b=(0,n.ID)(!0)),m.attr("stroke-width",2),m.attr("stroke","none"),m.style("fill","none"),d!==r.db.LINETYPE.SOLID&&d!==r.db.LINETYPE.DOTTED||m.attr("marker-end","url("+b+"#arrowhead)"),d!==r.db.LINETYPE.BIDIRECTIONAL_SOLID&&d!==r.db.LINETYPE.BIDIRECTIONAL_DOTTED||(m.attr("marker-start","url("+b+"#arrowhead)"),m.attr("marker-end","url("+b+"#arrowhead)")),d!==r.db.LINETYPE.SOLID_POINT&&d!==r.db.LINETYPE.DOTTED_POINT||m.attr("marker-end","url("+b+"#filled-head)"),d!==r.db.LINETYPE.SOLID_CROSS&&d!==r.db.LINETYPE.DOTTED_CROSS||m.attr("marker-end","url("+b+"#crosshead)"),(g||j.showSequenceNumbers)&&(m.attr("marker-start","url("+b+"#sequencenumber)"),t.append("text").attr("x",o).attr("y",a+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(p))},"drawMessage"),et=(0,n.K2)(function(t,e,a,s,r,i,o){let c,l=0,h=0,d=0;for(const p of s){const t=e.get(p),s=t.box;c&&c!=s&&(o||U.models.addBox(c),h+=j.boxMargin+c.margin),s&&s!=c&&(o||(s.x=l+h,s.y=r),h+=s.margin),t.width=t.width||j.width,t.height=n.Y2.getMax(t.height||j.height,j.height),t.margin=t.margin||j.actorMargin,d=n.Y2.getMax(d,t.height),a.get(t.name)&&(h+=t.width/2),t.x=l+h,t.starty=U.getVerticalPos(),U.insert(t.x,r,t.x+t.width,t.height),l+=t.width+h,t.box&&(t.box.width=l+s.margin-t.box.x),h=t.margin,c=t.box,U.models.addActor(t)}c&&!o&&U.models.addBox(c),U.bumpVerticalPos(d)},"addActorRenderingData"),at=(0,n.K2)(async function(t,e,a,s){if(s){let s=0;U.bumpVerticalPos(2*j.boxMargin);for(const r of a){const a=e.get(r);a.stopy||(a.stopy=U.getVerticalPos());const i=await H.drawActor(t,a,j,!0);s=n.Y2.getMax(s,i)}U.bumpVerticalPos(s+j.boxMargin)}else for(const r of a){const a=e.get(r);await H.drawActor(t,a,j,!1)}},"drawActors"),st=(0,n.K2)(function(t,e,a,s){let r=0,i=0;for(const n of a){const a=e.get(n),o=dt(a),c=H.drawPopup(t,a,o,j,j.forceMenus,s);c.height>r&&(r=c.height),c.width+a.x>i&&(i=c.width+a.x)}return{maxHeight:r,maxWidth:i}},"drawActorsPopup"),rt=(0,n.K2)(function(t){(0,n.hH)(j,t),t.fontFamily&&(j.actorFontFamily=j.noteFontFamily=j.messageFontFamily=t.fontFamily),t.fontSize&&(j.actorFontSize=j.noteFontSize=j.messageFontSize=t.fontSize),t.fontWeight&&(j.actorFontWeight=j.noteFontWeight=j.messageFontWeight=t.fontWeight)},"setConf"),it=(0,n.K2)(function(t){return U.activations.filter(function(e){return e.actor===t})},"actorActivations"),nt=(0,n.K2)(function(t,e){const a=e.get(t),s=it(t);return[s.reduce(function(t,e){return n.Y2.getMin(t,e.startx)},a.x+a.width/2-1),s.reduce(function(t,e){return n.Y2.getMax(t,e.stopx)},a.x+a.width/2+1)]},"activationBounds");function ot(t,e,a,s,r){U.bumpVerticalPos(a);let o=s;if(e.id&&e.message&&t[e.id]){const a=t[e.id].width,r=J(j);e.message=i._K.wrapLabel(`[${e.message}]`,a-2*j.wrapPadding,r),e.width=a,e.wrap=!0;const c=i._K.calculateTextDimensions(e.message,r),l=n.Y2.getMax(c.height,j.labelBoxHeight);o=s+l,n.Rm.debug(`${l} - ${e.message}`)}r(e),U.bumpVerticalPos(o)}function ct(t,e,a,s,r,i,o){function c(a,s){a.x<r.get(t.from).x?(U.insert(e.stopx-s,e.starty,e.startx,e.stopy+a.height/2+j.noteMargin),e.stopx=e.stopx+s):(U.insert(e.startx,e.starty,e.stopx+s,e.stopy+a.height/2+j.noteMargin),e.stopx=e.stopx-s)}function l(a,s){a.x<r.get(t.to).x?(U.insert(e.startx-s,e.starty,e.stopx,e.stopy+a.height/2+j.noteMargin),e.startx=e.startx+s):(U.insert(e.stopx,e.starty,e.startx+s,e.stopy+a.height/2+j.noteMargin),e.startx=e.startx-s)}if((0,n.K2)(c,"receiverAdjustment"),(0,n.K2)(l,"senderAdjustment"),i.get(t.to)==s){const e=r.get(t.to);c(e,"actor"==e.type?21:e.width/2+3),e.starty=a-e.height/2,U.bumpVerticalPos(e.height/2)}else if(o.get(t.from)==s){const e=r.get(t.from);if(j.mirrorActors){l(e,"actor"==e.type?18:e.width/2)}e.stopy=a-e.height/2,U.bumpVerticalPos(e.height/2)}else if(o.get(t.to)==s){const e=r.get(t.to);if(j.mirrorActors){c(e,"actor"==e.type?21:e.width/2+3)}e.stopy=a-e.height/2,U.bumpVerticalPos(e.height/2)}}(0,n.K2)(ot,"adjustLoopHeightForWrap"),(0,n.K2)(ct,"adjustCreatedDestroyedData");var lt=(0,n.K2)(async function(t,e,a,s){const{securityLevel:r,sequence:i}=(0,n.D7)();let c;j=i,"sandbox"===r&&(c=(0,o.Ltv)("#i"+e));const l="sandbox"===r?(0,o.Ltv)(c.nodes()[0].contentDocument.body):(0,o.Ltv)("body"),h="sandbox"===r?c.nodes()[0].contentDocument:document;U.init(),n.Rm.debug(s.db);const d="sandbox"===r?l.select(`[id="${e}"]`):(0,o.Ltv)(`[id="${e}"]`),p=s.db.getActors(),g=s.db.getCreatedActors(),u=s.db.getDestroyedActors(),x=s.db.getBoxes();let y=s.db.getActorKeys();const m=s.db.getMessages(),b=s.db.getDiagramTitle(),T=s.db.hasAtLeastOneBox(),E=s.db.hasAtLeastOneBoxWithTitle(),f=await ht(p,m,s);if(j.height=await pt(p,f,x),H.insertComputerIcon(d),H.insertDatabaseIcon(d),H.insertClockIcon(d),T&&(U.bumpVerticalPos(j.boxMargin),E&&U.bumpVerticalPos(x[0].textMaxHeight)),!0===j.hideUnusedParticipants){const t=new Set;m.forEach(e=>{t.add(e.from),t.add(e.to)}),y=y.filter(e=>t.has(e))}et(d,p,g,y,0,m,!1);const w=await xt(m,p,f,s);function I(t,e){const a=U.endActivation(t);a.starty+18>e&&(a.starty=e-6,e+=12),H.drawActivation(d,a,e,j,it(t.from).length),U.insert(a.startx,e-10,a.stopx,e)}H.insertArrowHead(d),H.insertArrowCrossHead(d),H.insertArrowFilledHead(d),H.insertSequenceNumber(d),(0,n.K2)(I,"activeEnd");let L=1,P=1;const k=[],A=[];let N=0;for(const o of m){let t,e,a;switch(o.type){case s.db.LINETYPE.NOTE:U.resetVerticalPos(),e=o.noteModel,await X(d,e);break;case s.db.LINETYPE.ACTIVE_START:U.newActivation(o,d,p);break;case s.db.LINETYPE.ACTIVE_END:I(o,U.getVerticalPos());break;case s.db.LINETYPE.LOOP_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,t=>U.newLoop(t));break;case s.db.LINETYPE.LOOP_END:t=U.endLoop(),await H.drawLoop(d,t,"loop",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.RECT_START:ot(w,o,j.boxMargin,j.boxMargin,t=>U.newLoop(void 0,t.message));break;case s.db.LINETYPE.RECT_END:t=U.endLoop(),A.push(t),U.models.addLoop(t),U.bumpVerticalPos(t.stopy-U.getVerticalPos());break;case s.db.LINETYPE.OPT_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,t=>U.newLoop(t));break;case s.db.LINETYPE.OPT_END:t=U.endLoop(),await H.drawLoop(d,t,"opt",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.ALT_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,t=>U.newLoop(t));break;case s.db.LINETYPE.ALT_ELSE:ot(w,o,j.boxMargin+j.boxTextMargin,j.boxMargin,t=>U.addSectionToLoop(t));break;case s.db.LINETYPE.ALT_END:t=U.endLoop(),await H.drawLoop(d,t,"alt",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.PAR_START:case s.db.LINETYPE.PAR_OVER_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,t=>U.newLoop(t)),U.saveVerticalPos();break;case s.db.LINETYPE.PAR_AND:ot(w,o,j.boxMargin+j.boxTextMargin,j.boxMargin,t=>U.addSectionToLoop(t));break;case s.db.LINETYPE.PAR_END:t=U.endLoop(),await H.drawLoop(d,t,"par",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.AUTONUMBER:L=o.message.start||L,P=o.message.step||P,o.message.visible?s.db.enableSequenceNumbers():s.db.disableSequenceNumbers();break;case s.db.LINETYPE.CRITICAL_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,t=>U.newLoop(t));break;case s.db.LINETYPE.CRITICAL_OPTION:ot(w,o,j.boxMargin+j.boxTextMargin,j.boxMargin,t=>U.addSectionToLoop(t));break;case s.db.LINETYPE.CRITICAL_END:t=U.endLoop(),await H.drawLoop(d,t,"critical",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.BREAK_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,t=>U.newLoop(t));break;case s.db.LINETYPE.BREAK_END:t=U.endLoop(),await H.drawLoop(d,t,"break",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;default:try{a=o.msgModel,a.starty=U.getVerticalPos(),a.sequenceIndex=L,a.sequenceVisible=s.db.showSequenceNumbers();const t=await Q(0,a);ct(o,a,t,N,p,g,u),k.push({messageModel:a,lineStartY:t}),U.models.addMessage(a)}catch(K){n.Rm.error("error while drawing message",K)}}[s.db.LINETYPE.SOLID_OPEN,s.db.LINETYPE.DOTTED_OPEN,s.db.LINETYPE.SOLID,s.db.LINETYPE.DOTTED,s.db.LINETYPE.SOLID_CROSS,s.db.LINETYPE.DOTTED_CROSS,s.db.LINETYPE.SOLID_POINT,s.db.LINETYPE.DOTTED_POINT,s.db.LINETYPE.BIDIRECTIONAL_SOLID,s.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(o.type)&&(L+=P),N++}n.Rm.debug("createdActors",g),n.Rm.debug("destroyedActors",u),await at(d,p,y,!1);for(const n of k)await tt(d,n.messageModel,n.lineStartY,s);j.mirrorActors&&await at(d,p,y,!0),A.forEach(t=>H.drawBackgroundRect(d,t)),_(d,p,y,j);for(const n of U.models.boxes)n.height=U.getVerticalPos()-n.y,U.insert(n.x,n.y,n.x+n.width,n.height),n.startx=n.x,n.starty=n.y,n.stopx=n.startx+n.width,n.stopy=n.starty+n.height,n.stroke="rgb(0,0,0, 0.5)",H.drawBox(d,n,j);T&&U.bumpVerticalPos(j.boxMargin);const v=st(d,p,y,h),{bounds:M}=U.getBounds();void 0===M.startx&&(M.startx=0),void 0===M.starty&&(M.starty=0),void 0===M.stopx&&(M.stopx=0),void 0===M.stopy&&(M.stopy=0);let D=M.stopy-M.starty;D<v.maxHeight&&(D=v.maxHeight);let O=D+2*j.diagramMarginY;j.mirrorActors&&(O=O-j.boxMargin+j.bottomMarginAdj);let S=M.stopx-M.startx;S<v.maxWidth&&(S=v.maxWidth);const R=S+2*j.diagramMarginX;b&&d.append("text").text(b).attr("x",(M.stopx-M.startx)/2-2*j.diagramMarginX).attr("y",-25),(0,n.a$)(d,O,R,j.useMaxWidth);const Y=b?40:0;d.attr("viewBox",M.startx-j.diagramMarginX+" -"+(j.diagramMarginY+Y)+" "+R+" "+(O+Y)),n.Rm.debug("models:",U.models)},"draw");async function ht(t,e,a){const s={};for(const r of e)if(t.get(r.to)&&t.get(r.from)){const e=t.get(r.to);if(r.placement===a.db.PLACEMENT.LEFTOF&&!e.prevActor)continue;if(r.placement===a.db.PLACEMENT.RIGHTOF&&!e.nextActor)continue;const o=void 0!==r.placement,c=!o,l=o?G(j):J(j),h=r.wrap?i._K.wrapLabel(r.message,j.width-2*j.wrapPadding,l):r.message,d=((0,n.Wi)(h)?await(0,n.Dl)(r.message,(0,n.D7)()):i._K.calculateTextDimensions(h,l)).width+2*j.wrapPadding;c&&r.from===e.nextActor?s[r.to]=n.Y2.getMax(s[r.to]||0,d):c&&r.from===e.prevActor?s[r.from]=n.Y2.getMax(s[r.from]||0,d):c&&r.from===r.to?(s[r.from]=n.Y2.getMax(s[r.from]||0,d/2),s[r.to]=n.Y2.getMax(s[r.to]||0,d/2)):r.placement===a.db.PLACEMENT.RIGHTOF?s[r.from]=n.Y2.getMax(s[r.from]||0,d):r.placement===a.db.PLACEMENT.LEFTOF?s[e.prevActor]=n.Y2.getMax(s[e.prevActor]||0,d):r.placement===a.db.PLACEMENT.OVER&&(e.prevActor&&(s[e.prevActor]=n.Y2.getMax(s[e.prevActor]||0,d/2)),e.nextActor&&(s[r.from]=n.Y2.getMax(s[r.from]||0,d/2)))}return n.Rm.debug("maxMessageWidthPerActor:",s),s}(0,n.K2)(ht,"getMaxMessageWidthPerActor");var dt=(0,n.K2)(function(t){let e=0;const a=Z(j);for(const s in t.links){const t=i._K.calculateTextDimensions(s,a).width+2*j.wrapPadding+2*j.boxMargin;e<t&&(e=t)}return e},"getRequiredPopupWidth");async function pt(t,e,a){let s=0;for(const o of t.keys()){const e=t.get(o);e.wrap&&(e.description=i._K.wrapLabel(e.description,j.width-2*j.wrapPadding,Z(j)));const a=(0,n.Wi)(e.description)?await(0,n.Dl)(e.description,(0,n.D7)()):i._K.calculateTextDimensions(e.description,Z(j));e.width=e.wrap?j.width:n.Y2.getMax(j.width,a.width+2*j.wrapPadding),e.height=e.wrap?n.Y2.getMax(a.height,j.height):j.height,s=n.Y2.getMax(s,e.height)}for(const i in e){const a=t.get(i);if(!a)continue;const s=t.get(a.nextActor);if(!s){const t=e[i]+j.actorMargin-a.width/2;a.margin=n.Y2.getMax(t,j.actorMargin);continue}const r=e[i]+j.actorMargin-a.width/2-s.width/2;a.margin=n.Y2.getMax(r,j.actorMargin)}let r=0;return a.forEach(e=>{const a=J(j);let s=e.actorKeys.reduce((e,a)=>e+(t.get(a).width+(t.get(a).margin||0)),0);s-=2*j.boxTextMargin,e.wrap&&(e.name=i._K.wrapLabel(e.name,s-2*j.wrapPadding,a));const o=i._K.calculateTextDimensions(e.name,a);r=n.Y2.getMax(o.height,r);const c=n.Y2.getMax(s,o.width+2*j.wrapPadding);if(e.margin=j.boxTextMargin,s<c){const t=(c-s)/2;e.margin+=t}}),a.forEach(t=>t.textMaxHeight=r),n.Y2.getMax(s,j.height)}(0,n.K2)(pt,"calculateActorMargins");var gt=(0,n.K2)(async function(t,e,a){const s=e.get(t.from),r=e.get(t.to),o=s.x,c=r.x,l=t.wrap&&t.message;let h=(0,n.Wi)(t.message)?await(0,n.Dl)(t.message,(0,n.D7)()):i._K.calculateTextDimensions(l?i._K.wrapLabel(t.message,j.width,G(j)):t.message,G(j));const d={width:l?j.width:n.Y2.getMax(j.width,h.width+2*j.noteMargin),height:0,startx:s.x,stopx:0,starty:0,stopy:0,message:t.message};return t.placement===a.db.PLACEMENT.RIGHTOF?(d.width=l?n.Y2.getMax(j.width,h.width):n.Y2.getMax(s.width/2+r.width/2,h.width+2*j.noteMargin),d.startx=o+(s.width+j.actorMargin)/2):t.placement===a.db.PLACEMENT.LEFTOF?(d.width=l?n.Y2.getMax(j.width,h.width+2*j.noteMargin):n.Y2.getMax(s.width/2+r.width/2,h.width+2*j.noteMargin),d.startx=o-d.width+(s.width-j.actorMargin)/2):t.to===t.from?(h=i._K.calculateTextDimensions(l?i._K.wrapLabel(t.message,n.Y2.getMax(j.width,s.width),G(j)):t.message,G(j)),d.width=l?n.Y2.getMax(j.width,s.width):n.Y2.getMax(s.width,j.width,h.width+2*j.noteMargin),d.startx=o+(s.width-d.width)/2):(d.width=Math.abs(o+s.width/2-(c+r.width/2))+j.actorMargin,d.startx=o<c?o+s.width/2-j.actorMargin/2:c+r.width/2-j.actorMargin/2),l&&(d.message=i._K.wrapLabel(t.message,d.width-2*j.wrapPadding,G(j))),n.Rm.debug(`NM:[${d.startx},${d.stopx},${d.starty},${d.stopy}:${d.width},${d.height}=${t.message}]`),d},"buildNoteModel"),ut=(0,n.K2)(function(t,e,a){if(![a.db.LINETYPE.SOLID_OPEN,a.db.LINETYPE.DOTTED_OPEN,a.db.LINETYPE.SOLID,a.db.LINETYPE.DOTTED,a.db.LINETYPE.SOLID_CROSS,a.db.LINETYPE.DOTTED_CROSS,a.db.LINETYPE.SOLID_POINT,a.db.LINETYPE.DOTTED_POINT,a.db.LINETYPE.BIDIRECTIONAL_SOLID,a.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type))return{};const[s,r]=nt(t.from,e),[o,c]=nt(t.to,e),l=s<=o;let h=l?r:s,d=l?o:c;const p=Math.abs(o-c)>2,g=(0,n.K2)(t=>l?-t:t,"adjustValue");t.from===t.to?d=h:(t.activate&&!p&&(d+=g(j.activationWidth/2-1)),[a.db.LINETYPE.SOLID_OPEN,a.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(d+=g(3)),[a.db.LINETYPE.BIDIRECTIONAL_SOLID,a.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(h-=g(3)));const u=[s,r,o,c],x=Math.abs(h-d);t.wrap&&t.message&&(t.message=i._K.wrapLabel(t.message,n.Y2.getMax(x+2*j.wrapPadding,j.width),J(j)));const y=i._K.calculateTextDimensions(t.message,J(j));return{width:n.Y2.getMax(t.wrap?0:y.width+2*j.wrapPadding,x+2*j.wrapPadding,j.width),height:0,startx:h,stopx:d,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,u),toBounds:Math.max.apply(null,u)}},"buildMessageModel"),xt=(0,n.K2)(async function(t,e,a,s){const r={},i=[];let o,c,l;for(const h of t){switch(h.type){case s.db.LINETYPE.LOOP_START:case s.db.LINETYPE.ALT_START:case s.db.LINETYPE.OPT_START:case s.db.LINETYPE.PAR_START:case s.db.LINETYPE.PAR_OVER_START:case s.db.LINETYPE.CRITICAL_START:case s.db.LINETYPE.BREAK_START:i.push({id:h.id,msg:h.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case s.db.LINETYPE.ALT_ELSE:case s.db.LINETYPE.PAR_AND:case s.db.LINETYPE.CRITICAL_OPTION:h.message&&(o=i.pop(),r[o.id]=o,r[h.id]=o,i.push(o));break;case s.db.LINETYPE.LOOP_END:case s.db.LINETYPE.ALT_END:case s.db.LINETYPE.OPT_END:case s.db.LINETYPE.PAR_END:case s.db.LINETYPE.CRITICAL_END:case s.db.LINETYPE.BREAK_END:o=i.pop(),r[o.id]=o;break;case s.db.LINETYPE.ACTIVE_START:{const t=e.get(h.from?h.from:h.to.actor),a=it(h.from?h.from:h.to.actor).length,s=t.x+t.width/2+(a-1)*j.activationWidth/2,r={startx:s,stopx:s+j.activationWidth,actor:h.from,enabled:!0};U.activations.push(r)}break;case s.db.LINETYPE.ACTIVE_END:{const t=U.activations.map(t=>t.actor).lastIndexOf(h.from);U.activations.splice(t,1).splice(0,1)}}void 0!==h.placement?(c=await gt(h,e,s),h.noteModel=c,i.forEach(t=>{o=t,o.from=n.Y2.getMin(o.from,c.startx),o.to=n.Y2.getMax(o.to,c.startx+c.width),o.width=n.Y2.getMax(o.width,Math.abs(o.from-o.to))-j.labelBoxWidth})):(l=ut(h,e,s),h.msgModel=l,l.startx&&l.stopx&&i.length>0&&i.forEach(t=>{if(o=t,l.startx===l.stopx){const t=e.get(h.from),a=e.get(h.to);o.from=n.Y2.getMin(t.x-l.width/2,t.x-t.width/2,o.from),o.to=n.Y2.getMax(a.x+l.width/2,a.x+t.width/2,o.to),o.width=n.Y2.getMax(o.width,Math.abs(o.to-o.from))-j.labelBoxWidth}else o.from=n.Y2.getMin(l.startx,o.from),o.to=n.Y2.getMax(l.stopx,o.to),o.width=n.Y2.getMax(o.width,l.width)-j.labelBoxWidth}))}return U.activations=[],n.Rm.debug("Loop type widths:",r),r},"calculateLoopBounds"),yt={bounds:U,drawActors:at,drawActorsPopup:st,setConf:rt,draw:lt},mt={parser:h,get db(){return new u},renderer:yt,styles:x,init:(0,n.K2)(t=>{t.sequence||(t.sequence={}),t.wrap&&(t.sequence.wrap=t.wrap,(0,n.XV)({sequence:{wrap:t.wrap}}))},"init")}},98645:(t,e,a)=>{a.d(e,{m:()=>r});var s=a(97485),r=class{constructor(t){this.init=t,this.records=this.init()}static{(0,s.K2)(this,"ImperativeState")}reset(){this.records=this.init()}}}}]); \ No newline at end of file diff --git a/assets/js/54b37c16.bb657828.js b/assets/js/54b37c16.bb657828.js new file mode 100644 index 0000000000..fc85c5a86c --- /dev/null +++ b/assets/js/54b37c16.bb657828.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7978],{7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const s={tabItem:"tabItem_qogc"};var a=t(23420);function i({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},65296:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/versioned_docs/version-0.12.1/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/0.12.1/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/suppressing-findings.mdx","tags":[],"version":"0.12.1","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.1/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.1/ci-workflow"}}');var s=t(23420),a=t(65404),i=t(83796),o=t(7357);const l={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},u=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,s.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,s.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{value:"Kotlin",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("must-be-api") // don\'t switch anything to an api config\ndependencies {\n\n@Suppress("unused-dependency") // don\'t comment out or delete this dependency\nimplementation(project(":unused-lib"))\n\n@Suppress("inherited-dependency") // don\'t add dependencies which are inherited from this library\nimplementation(project(":leaky"))\n}\n'})})}),(0,s.jsx)(o.A,{value:"Groovy",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection must-be-api\ndependencies {\n\n// don\'t comment out or delete this dependency\n//noinspection unused-dependency\nimplementation(project(":unused-lib"))\n\n// don\'t add dependencies which are inherited from this library\n//noinspection inherited-dependency\nimplementation(project(":leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},83796:(e,n,t)=>{t.d(n,{A:()=>x});var r=t(36672),s=t(13526),a=t(58797),i=t(85291),o=t(52245),l=t(32342),u=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,a=p(e),[i,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[u,d]=f({queryString:t,groupId:s}),[m,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=u??m;return h({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&l(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,a]),tabValues:a}}var b=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),u=e=>{const n=e.currentTarget,s=o.indexOf(n),a=i[s].value;a!==t&&(l(n),r(a))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function x(e){const n=(0,b.A)();return(0,v.jsx)(w,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/54f055ef.80b62cae.js b/assets/js/54f055ef.80b62cae.js new file mode 100644 index 0000000000..4d9a37057d --- /dev/null +++ b/assets/js/54f055ef.80b62cae.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6185],{65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const r={},o=n.createContext(r);function i(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:s},e.children)}},79001:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.12.5/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sort_plugins","permalink":"/ModuleCheck/docs/rules/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/sorting/sort_plugins.md","tags":[],"version":"0.12.5","frontMatter":{"id":"sort_plugins","slug":"/rules/sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/rules/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/rules/disable_android_resources"}}');var r=t(23420),o=t(65404);const i={id:"sort_plugins",slug:"/rules/sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d()}}}]); \ No newline at end of file diff --git a/assets/js/5610.cdc986e1.js b/assets/js/5610.cdc986e1.js new file mode 100644 index 0000000000..164732a321 --- /dev/null +++ b/assets/js/5610.cdc986e1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5610],{5610:(e,c,a)=>{a.r(c),a.d(c,{DocSearchModal:()=>h.a1});var h=a(33372)}}]); \ No newline at end of file diff --git a/assets/js/571f3672.aea1a8e4.js b/assets/js/571f3672.aea1a8e4.js new file mode 100644 index 0000000000..d114b0c417 --- /dev/null +++ b/assets/js/571f3672.aea1a8e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8510],{22962:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>d,toc:()=>i});const d=JSON.parse('{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.12.1/rules/unused_dependency.md","sourceDirName":"rules","slug":"/rules/unused_dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/unused_dependency.md","tags":[],"version":"0.12.1","frontMatter":{"id":"unused_dependency","slug":"/rules/unused_dependency","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.1/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.1/rules/must_be_api"}}');var t=s(23420),u=s(65404);const o={id:"unused_dependency",slug:"/rules/unused_dependency",title:"Unused Dependency",sidebar_label:"Unused Dependency"},c=void 0,r={},i=[];function l(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,t.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var d=s(36672);const t={},u=d.createContext(t);function o(e){const n=d.useContext(u);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),d.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5792.cb9c5644.js b/assets/js/5792.cb9c5644.js new file mode 100644 index 0000000000..e1070dd0a6 --- /dev/null +++ b/assets/js/5792.cb9c5644.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5792],{45059:(t,r,e)=>{function n(t,r){t.accDescr&&r.setAccDescription?.(t.accDescr),t.accTitle&&r.setAccTitle?.(t.accTitle),t.title&&r.setDiagramTitle?.(t.title)}e.d(r,{S:()=>n}),(0,e(97485).K2)(n,"populateCommonDb")},75792:(t,r,e)=>{e.d(r,{diagram:()=>ft});var n=e(45059),o=e(98645),a=e(9420),c=e(97485),s=e(99339),i=e(3170),h={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},d=c.UI.gitGraph,m=(0,c.K2)(()=>(0,a.$t)({...d,...(0,c.zj)().gitGraph}),"getConfig"),$=new o.m(()=>{const t=m(),r=t.mainBranchName,e=t.mainBranchOrder;return{mainBranchName:r,commits:new Map,head:null,branchConfig:new Map([[r,{name:r,order:e}]]),branches:new Map([[r,null]]),currBranch:r,direction:"LR",seq:0,options:{}}});function l(){return(0,a.yT)({length:7})}function y(t,r){const e=Object.create(null);return t.reduce((t,n)=>{const o=r(n);return e[o]||(e[o]=!0,t.push(n)),t},[])}(0,c.K2)(l,"getID"),(0,c.K2)(y,"uniqBy");var g=(0,c.K2)(function(t){$.records.direction=t},"setDirection"),p=(0,c.K2)(function(t){c.Rm.debug("options str",t),t=t?.trim(),t=t||"{}";try{$.records.options=JSON.parse(t)}catch(r){c.Rm.error("error while parsing gitGraph options",r.message)}},"setOptions"),x=(0,c.K2)(function(){return $.records.options},"getOptions"),f=(0,c.K2)(function(t){let r=t.msg,e=t.id;const n=t.type;let o=t.tags;c.Rm.info("commit",r,e,n,o),c.Rm.debug("Entering commit:",r,e,n,o);const a=m();e=c.Y2.sanitizeText(e,a),r=c.Y2.sanitizeText(r,a),o=o?.map(t=>c.Y2.sanitizeText(t,a));const s={id:e||$.records.seq+"-"+l(),message:r,seq:$.records.seq++,type:n??h.NORMAL,tags:o??[],parents:null==$.records.head?[]:[$.records.head.id],branch:$.records.currBranch};$.records.head=s,c.Rm.info("main branch",a.mainBranchName),$.records.commits.has(s.id)&&c.Rm.warn(`Commit ID ${s.id} already exists`),$.records.commits.set(s.id,s),$.records.branches.set($.records.currBranch,s.id),c.Rm.debug("in pushCommit "+s.id)},"commit"),u=(0,c.K2)(function(t){let r=t.name;const e=t.order;if(r=c.Y2.sanitizeText(r,m()),$.records.branches.has(r))throw new Error(`Trying to create an existing branch. (Help: Either use a new name if you want create a new branch or try using "checkout ${r}")`);$.records.branches.set(r,null!=$.records.head?$.records.head.id:null),$.records.branchConfig.set(r,{name:r,order:e}),B(r),c.Rm.debug("in createBranch")},"branch"),b=(0,c.K2)(t=>{let r=t.branch,e=t.id;const n=t.type,o=t.tags,a=m();r=c.Y2.sanitizeText(r,a),e&&(e=c.Y2.sanitizeText(e,a));const s=$.records.branches.get($.records.currBranch),i=$.records.branches.get(r),d=s?$.records.commits.get(s):void 0,y=i?$.records.commits.get(i):void 0;if(d&&y&&d.branch===r)throw new Error(`Cannot merge branch '${r}' into itself.`);if($.records.currBranch===r){const t=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:["branch abc"]},t}if(void 0===d||!d){const t=new Error(`Incorrect usage of "merge". Current branch (${$.records.currBranch})has no commits`);throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:["commit"]},t}if(!$.records.branches.has(r)){const t=new Error('Incorrect usage of "merge". Branch to be merged ('+r+") does not exist");throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:[`branch ${r}`]},t}if(void 0===y||!y){const t=new Error('Incorrect usage of "merge". Branch to be merged ('+r+") has no commits");throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:['"commit"']},t}if(d===y){const t=new Error('Incorrect usage of "merge". Both branches have same head');throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:["branch abc"]},t}if(e&&$.records.commits.has(e)){const t=new Error('Incorrect usage of "merge". Commit with id:'+e+" already exists, use different custom id");throw t.hash={text:`merge ${r} ${e} ${n} ${o?.join(" ")}`,token:`merge ${r} ${e} ${n} ${o?.join(" ")}`,expected:[`merge ${r} ${e}_UNIQUE ${n} ${o?.join(" ")}`]},t}const g=i||"",p={id:e||`${$.records.seq}-${l()}`,message:`merged branch ${r} into ${$.records.currBranch}`,seq:$.records.seq++,parents:null==$.records.head?[]:[$.records.head.id,g],branch:$.records.currBranch,type:h.MERGE,customType:n,customId:!!e,tags:o??[]};$.records.head=p,$.records.commits.set(p.id,p),$.records.branches.set($.records.currBranch,p.id),c.Rm.debug($.records.branches),c.Rm.debug("in mergeBranch")},"merge"),w=(0,c.K2)(function(t){let r=t.id,e=t.targetId,n=t.tags,o=t.parent;c.Rm.debug("Entering cherryPick:",r,e,n);const a=m();if(r=c.Y2.sanitizeText(r,a),e=c.Y2.sanitizeText(e,a),n=n?.map(t=>c.Y2.sanitizeText(t,a)),o=c.Y2.sanitizeText(o,a),!r||!$.records.commits.has(r)){const t=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const s=$.records.commits.get(r);if(void 0===s||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(o&&(!Array.isArray(s.parents)||!s.parents.includes(o))){throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.")}const i=s.branch;if(s.type===h.MERGE&&!o){throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.")}if(!e||!$.records.commits.has(e)){if(i===$.records.currBranch){const t=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const t=$.records.branches.get($.records.currBranch);if(void 0===t||!t){const t=new Error(`Incorrect usage of "cherry-pick". Current branch (${$.records.currBranch})has no commits`);throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const a=$.records.commits.get(t);if(void 0===a||!a){const t=new Error(`Incorrect usage of "cherry-pick". Current branch (${$.records.currBranch})has no commits`);throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const d={id:$.records.seq+"-"+l(),message:`cherry-picked ${s?.message} into ${$.records.currBranch}`,seq:$.records.seq++,parents:null==$.records.head?[]:[$.records.head.id,s.id],branch:$.records.currBranch,type:h.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===h.MERGE?`|parent:${o}`:""}`]};$.records.head=d,$.records.commits.set(d.id,d),$.records.branches.set($.records.currBranch,d.id),c.Rm.debug($.records.branches),c.Rm.debug("in cherryPick")}},"cherryPick"),B=(0,c.K2)(function(t){if(t=c.Y2.sanitizeText(t,m()),!$.records.branches.has(t)){const r=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw r.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},r}{$.records.currBranch=t;const r=$.records.branches.get($.records.currBranch);$.records.head=void 0!==r&&r?$.records.commits.get(r)??null:null}},"checkout");function E(t,r,e){const n=t.indexOf(r);-1===n?t.push(e):t.splice(n,1,e)}function k(t){const r=t.reduce((t,r)=>t.seq>r.seq?t:r,t[0]);let e="";t.forEach(function(t){e+=t===r?"\t*":"\t|"});const n=[e,r.id,r.seq];for(const o in $.records.branches)$.records.branches.get(o)===r.id&&n.push(o);if(c.Rm.debug(n.join(" ")),r.parents&&2==r.parents.length&&r.parents[0]&&r.parents[1]){const e=$.records.commits.get(r.parents[0]);E(t,r,e),r.parents[1]&&t.push($.records.commits.get(r.parents[1]))}else{if(0==r.parents.length)return;if(r.parents[0]){const e=$.records.commits.get(r.parents[0]);E(t,r,e)}}k(t=y(t,t=>t.id))}(0,c.K2)(E,"upsert"),(0,c.K2)(k,"prettyPrintCommitHistory");var C=(0,c.K2)(function(){c.Rm.debug($.records.commits);k([R()[0]])},"prettyPrint"),T=(0,c.K2)(function(){$.reset(),(0,c.IU)()},"clear"),L=(0,c.K2)(function(){return[...$.records.branchConfig.values()].map((t,r)=>null!==t.order&&void 0!==t.order?t:{...t,order:parseFloat(`0.${r}`)}).sort((t,r)=>(t.order??0)-(r.order??0)).map(({name:t})=>({name:t}))},"getBranchesAsObjArray"),K=(0,c.K2)(function(){return $.records.branches},"getBranches"),M=(0,c.K2)(function(){return $.records.commits},"getCommits"),R=(0,c.K2)(function(){const t=[...$.records.commits.values()];return t.forEach(function(t){c.Rm.debug(t.id)}),t.sort((t,r)=>t.seq-r.seq),t},"getCommitsArray"),v={commitType:h,getConfig:m,setDirection:g,setOptions:p,getOptions:x,commit:f,branch:u,merge:b,cherryPick:w,checkout:B,prettyPrint:C,clear:T,getBranchesAsObjArray:L,getBranches:K,getCommits:M,getCommitsArray:R,getCurrentBranch:(0,c.K2)(function(){return $.records.currBranch},"getCurrentBranch"),getDirection:(0,c.K2)(function(){return $.records.direction},"getDirection"),getHead:(0,c.K2)(function(){return $.records.head},"getHead"),setAccTitle:c.SV,getAccTitle:c.iN,getAccDescription:c.m7,setAccDescription:c.EI,setDiagramTitle:c.ke,getDiagramTitle:c.ab},P=(0,c.K2)((t,r)=>{(0,n.S)(t,r),t.dir&&r.setDirection(t.dir);for(const e of t.statements)I(e,r)},"populate"),I=(0,c.K2)((t,r)=>{const e={Commit:(0,c.K2)(t=>r.commit(A(t)),"Commit"),Branch:(0,c.K2)(t=>r.branch(G(t)),"Branch"),Merge:(0,c.K2)(t=>r.merge(O(t)),"Merge"),Checkout:(0,c.K2)(t=>r.checkout(q(t)),"Checkout"),CherryPicking:(0,c.K2)(t=>r.cherryPick(z(t)),"CherryPicking")}[t.$type];e?e(t):c.Rm.error(`Unknown statement type: ${t.$type}`)},"parseStatement"),A=(0,c.K2)(t=>({id:t.id,msg:t.message??"",type:void 0!==t.type?h[t.type]:h.NORMAL,tags:t.tags??void 0}),"parseCommit"),G=(0,c.K2)(t=>({name:t.name,order:t.order??0}),"parseBranch"),O=(0,c.K2)(t=>({branch:t.branch,id:t.id??"",type:void 0!==t.type?h[t.type]:void 0,tags:t.tags??void 0}),"parseMerge"),q=(0,c.K2)(t=>t.branch,"parseCheckout"),z=(0,c.K2)(t=>({id:t.id,targetId:"",tags:0===t.tags?.length?void 0:t.tags,parent:t.parent}),"parseCherryPicking"),D={parse:(0,c.K2)(async t=>{const r=await(0,s.qg)("gitGraph",t);c.Rm.debug(r),P(r,v)},"parse")};var H=(0,c.D7)(),S=H?.gitGraph,Y=10,N=40,j=new Map,W=new Map,_=new Map,F=[],U=0,V="LR",J=(0,c.K2)(()=>{j.clear(),W.clear(),_.clear(),U=0,F=[],V="LR"},"clear"),Q=(0,c.K2)(t=>{const r=document.createElementNS("http://www.w3.org/2000/svg","text");return("string"==typeof t?t.split(/\\n|\n|<br\s*\/?>/gi):t).forEach(t=>{const e=document.createElementNS("http://www.w3.org/2000/svg","tspan");e.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),e.setAttribute("dy","1em"),e.setAttribute("x","0"),e.setAttribute("class","row"),e.textContent=t.trim(),r.appendChild(e)}),r},"drawText"),X=(0,c.K2)(t=>{let r,e,n;return"BT"===V?(e=(0,c.K2)((t,r)=>t<=r,"comparisonFunc"),n=1/0):(e=(0,c.K2)((t,r)=>t>=r,"comparisonFunc"),n=0),t.forEach(t=>{const o="TB"===V||"BT"==V?W.get(t)?.y:W.get(t)?.x;void 0!==o&&e(o,n)&&(r=t,n=o)}),r},"findClosestParent"),Z=(0,c.K2)(t=>{let r="",e=1/0;return t.forEach(t=>{const n=W.get(t).y;n<=e&&(r=t,e=n)}),r||void 0},"findClosestParentBT"),tt=(0,c.K2)((t,r,e)=>{let n=e,o=e;const a=[];t.forEach(t=>{const e=r.get(t);if(!e)throw new Error(`Commit not found for key ${t}`);e.parents.length?(n=et(e),o=Math.max(n,o)):a.push(e),nt(e,n)}),n=o,a.forEach(t=>{ot(t,n,e)}),t.forEach(t=>{const e=r.get(t);if(e?.parents.length){const t=Z(e.parents);n=W.get(t).y-N,n<=o&&(o=n);const r=j.get(e.branch).pos,a=n-Y;W.set(e.id,{x:r,y:a})}})},"setParallelBTPos"),rt=(0,c.K2)(t=>{const r=X(t.parents.filter(t=>null!==t));if(!r)throw new Error(`Closest parent not found for commit ${t.id}`);const e=W.get(r)?.y;if(void 0===e)throw new Error(`Closest parent position not found for commit ${t.id}`);return e},"findClosestParentPos"),et=(0,c.K2)(t=>rt(t)+N,"calculateCommitPosition"),nt=(0,c.K2)((t,r)=>{const e=j.get(t.branch);if(!e)throw new Error(`Branch not found for commit ${t.id}`);const n=e.pos,o=r+Y;return W.set(t.id,{x:n,y:o}),{x:n,y:o}},"setCommitPosition"),ot=(0,c.K2)((t,r,e)=>{const n=j.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);const o=r+e,a=n.pos;W.set(t.id,{x:a,y:o})},"setRootPosition"),at=(0,c.K2)((t,r,e,n,o,a)=>{if(a===h.HIGHLIGHT)t.append("rect").attr("x",e.x-10).attr("y",e.y-10).attr("width",20).attr("height",20).attr("class",`commit ${r.id} commit-highlight${o%8} ${n}-outer`),t.append("rect").attr("x",e.x-6).attr("y",e.y-6).attr("width",12).attr("height",12).attr("class",`commit ${r.id} commit${o%8} ${n}-inner`);else if(a===h.CHERRY_PICK)t.append("circle").attr("cx",e.x).attr("cy",e.y).attr("r",10).attr("class",`commit ${r.id} ${n}`),t.append("circle").attr("cx",e.x-3).attr("cy",e.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${r.id} ${n}`),t.append("circle").attr("cx",e.x+3).attr("cy",e.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${r.id} ${n}`),t.append("line").attr("x1",e.x+3).attr("y1",e.y+1).attr("x2",e.x).attr("y2",e.y-5).attr("stroke","#fff").attr("class",`commit ${r.id} ${n}`),t.append("line").attr("x1",e.x-3).attr("y1",e.y+1).attr("x2",e.x).attr("y2",e.y-5).attr("stroke","#fff").attr("class",`commit ${r.id} ${n}`);else{const c=t.append("circle");if(c.attr("cx",e.x),c.attr("cy",e.y),c.attr("r",r.type===h.MERGE?9:10),c.attr("class",`commit ${r.id} commit${o%8}`),a===h.MERGE){const a=t.append("circle");a.attr("cx",e.x),a.attr("cy",e.y),a.attr("r",6),a.attr("class",`commit ${n} ${r.id} commit${o%8}`)}if(a===h.REVERSE){t.append("path").attr("d",`M ${e.x-5},${e.y-5}L${e.x+5},${e.y+5}M${e.x-5},${e.y+5}L${e.x+5},${e.y-5}`).attr("class",`commit ${n} ${r.id} commit${o%8}`)}}},"drawCommitBullet"),ct=(0,c.K2)((t,r,e,n)=>{if(r.type!==h.CHERRY_PICK&&(r.customId&&r.type===h.MERGE||r.type!==h.MERGE)&&S?.showCommitLabel){const o=t.append("g"),a=o.insert("rect").attr("class","commit-label-bkg"),c=o.append("text").attr("x",n).attr("y",e.y+25).attr("class","commit-label").text(r.id),s=c.node()?.getBBox();if(s&&(a.attr("x",e.posWithOffset-s.width/2-2).attr("y",e.y+13.5).attr("width",s.width+4).attr("height",s.height+4),"TB"===V||"BT"===V?(a.attr("x",e.x-(s.width+16+5)).attr("y",e.y-12),c.attr("x",e.x-(s.width+16)).attr("y",e.y+s.height-12)):c.attr("x",e.posWithOffset-s.width/2),S.rotateCommitLabel))if("TB"===V||"BT"===V)c.attr("transform","rotate(-45, "+e.x+", "+e.y+")"),a.attr("transform","rotate(-45, "+e.x+", "+e.y+")");else{const t=-7.5-(s.width+10)/25*9.5,r=10+s.width/25*8.5;o.attr("transform","translate("+t+", "+r+") rotate(-45, "+n+", "+e.y+")")}}},"drawCommitLabel"),st=(0,c.K2)((t,r,e,n)=>{if(r.tags.length>0){let o=0,a=0,c=0;const s=[];for(const n of r.tags.reverse()){const r=t.insert("polygon"),i=t.append("circle"),h=t.append("text").attr("y",e.y-16-o).attr("class","tag-label").text(n),d=h.node()?.getBBox();if(!d)throw new Error("Tag bbox not found");a=Math.max(a,d.width),c=Math.max(c,d.height),h.attr("x",e.posWithOffset-d.width/2),s.push({tag:h,hole:i,rect:r,yOffset:o}),o+=20}for(const{tag:t,hole:r,rect:i,yOffset:h}of s){const o=c/2,s=e.y-19.2-h;if(i.attr("class","tag-label-bkg").attr("points",`\n ${n-a/2-2},${s+2} \n ${n-a/2-2},${s-2}\n ${e.posWithOffset-a/2-4},${s-o-2}\n ${e.posWithOffset+a/2+4},${s-o-2}\n ${e.posWithOffset+a/2+4},${s+o+2}\n ${e.posWithOffset-a/2-4},${s+o+2}`),r.attr("cy",s).attr("cx",n-a/2+2).attr("r",1.5).attr("class","tag-hole"),"TB"===V||"BT"===V){const c=n+h;i.attr("class","tag-label-bkg").attr("points",`\n ${e.x},${c+2}\n ${e.x},${c-2}\n ${e.x+Y},${c-o-2}\n ${e.x+Y+a+4},${c-o-2}\n ${e.x+Y+a+4},${c+o+2}\n ${e.x+Y},${c+o+2}`).attr("transform","translate(12,12) rotate(45, "+e.x+","+n+")"),r.attr("cx",e.x+2).attr("cy",c).attr("transform","translate(12,12) rotate(45, "+e.x+","+n+")"),t.attr("x",e.x+5).attr("y",c+3).attr("transform","translate(14,14) rotate(45, "+e.x+","+n+")")}}}},"drawCommitTags"),it=(0,c.K2)(t=>{switch(t.customType??t.type){case h.NORMAL:return"commit-normal";case h.REVERSE:return"commit-reverse";case h.HIGHLIGHT:return"commit-highlight";case h.MERGE:return"commit-merge";case h.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}},"getCommitClassType"),ht=(0,c.K2)((t,r,e,n)=>{const o={x:0,y:0};if(!(t.parents.length>0)){if("TB"===r)return 30;if("BT"===r){return(n.get(t.id)??o).y-N}return 0}{const e=X(t.parents);if(e){const a=n.get(e)??o;if("TB"===r)return a.y+N;if("BT"===r){return(n.get(t.id)??o).y-N}return a.x+N}}return 0},"calculatePosition"),dt=(0,c.K2)((t,r,e)=>{const n="BT"===V&&e?r:r+Y,o="TB"===V||"BT"===V?n:j.get(t.branch)?.pos,a="TB"===V||"BT"===V?j.get(t.branch)?.pos:n;if(void 0===a||void 0===o)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:o,posWithOffset:n}},"getCommitPosition"),mt=(0,c.K2)((t,r,e)=>{if(!S)throw new Error("GitGraph config not found");const n=t.append("g").attr("class","commit-bullets"),o=t.append("g").attr("class","commit-labels");let a="TB"===V||"BT"===V?30:0;const s=[...r.keys()],i=S?.parallelCommits??!1,h=(0,c.K2)((t,e)=>{const n=r.get(t)?.seq,o=r.get(e)?.seq;return void 0!==n&&void 0!==o?n-o:0},"sortKeys");let d=s.sort(h);"BT"===V&&(i&&tt(d,r,a),d=d.reverse()),d.forEach(t=>{const c=r.get(t);if(!c)throw new Error(`Commit not found for key ${t}`);i&&(a=ht(c,V,a,W));const s=dt(c,a,i);if(e){const t=it(c),r=c.customType??c.type,e=j.get(c.branch)?.index??0;at(n,c,s,t,e,r),ct(o,c,s,a),st(o,c,s,a)}"TB"===V||"BT"===V?W.set(c.id,{x:s.x,y:s.posWithOffset}):W.set(c.id,{x:s.posWithOffset,y:s.y}),a="BT"===V&&i?a+N:a+N+Y,a>U&&(U=a)})},"drawCommits"),$t=(0,c.K2)((t,r,e,n,o)=>{const a=("TB"===V||"BT"===V?e.x<n.x:e.y<n.y)?r.branch:t.branch,s=(0,c.K2)(t=>t.branch===a,"isOnBranchToGetCurve"),i=(0,c.K2)(e=>e.seq>t.seq&&e.seq<r.seq,"isBetweenCommits");return[...o.values()].some(t=>i(t)&&s(t))},"shouldRerouteArrow"),lt=(0,c.K2)((t,r,e=0)=>{const n=t+Math.abs(t-r)/2;if(e>5)return n;if(F.every(t=>Math.abs(t-n)>=10))return F.push(n),n;const o=Math.abs(t-r);return lt(t,r-o/5,e+1)},"findLane"),yt=(0,c.K2)((t,r,e,n)=>{const o=W.get(r.id),a=W.get(e.id);if(void 0===o||void 0===a)throw new Error(`Commit positions not found for commits ${r.id} and ${e.id}`);const c=$t(r,e,o,a,n);let s,i="",d="",m=0,$=0,l=j.get(e.branch)?.index;if(e.type===h.MERGE&&r.id!==e.parents[0]&&(l=j.get(r.branch)?.index),c){i="A 10 10, 0, 0, 0,",d="A 10 10, 0, 0, 1,",m=10,$=10;const t=o.y<a.y?lt(o.y,a.y):lt(a.y,o.y),e=o.x<a.x?lt(o.x,a.x):lt(a.x,o.x);"TB"===V?o.x<a.x?s=`M ${o.x} ${o.y} L ${e-m} ${o.y} ${d} ${e} ${o.y+$} L ${e} ${a.y-m} ${i} ${e+$} ${a.y} L ${a.x} ${a.y}`:(l=j.get(r.branch)?.index,s=`M ${o.x} ${o.y} L ${e+m} ${o.y} ${i} ${e} ${o.y+$} L ${e} ${a.y-m} ${d} ${e-$} ${a.y} L ${a.x} ${a.y}`):"BT"===V?o.x<a.x?s=`M ${o.x} ${o.y} L ${e-m} ${o.y} ${i} ${e} ${o.y-$} L ${e} ${a.y+m} ${d} ${e+$} ${a.y} L ${a.x} ${a.y}`:(l=j.get(r.branch)?.index,s=`M ${o.x} ${o.y} L ${e+m} ${o.y} ${d} ${e} ${o.y-$} L ${e} ${a.y+m} ${i} ${e-$} ${a.y} L ${a.x} ${a.y}`):o.y<a.y?s=`M ${o.x} ${o.y} L ${o.x} ${t-m} ${i} ${o.x+$} ${t} L ${a.x-m} ${t} ${d} ${a.x} ${t+$} L ${a.x} ${a.y}`:(l=j.get(r.branch)?.index,s=`M ${o.x} ${o.y} L ${o.x} ${t+m} ${d} ${o.x+$} ${t} L ${a.x-m} ${t} ${i} ${a.x} ${t-$} L ${a.x} ${a.y}`)}else i="A 20 20, 0, 0, 0,",d="A 20 20, 0, 0, 1,",m=20,$=20,"TB"===V?(o.x<a.x&&(s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${o.x} ${a.y-m} ${i} ${o.x+$} ${a.y} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${a.x-m} ${o.y} ${d} ${a.x} ${o.y+$} L ${a.x} ${a.y}`),o.x>a.x&&(i="A 20 20, 0, 0, 0,",d="A 20 20, 0, 0, 1,",m=20,$=20,s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${o.x} ${a.y-m} ${d} ${o.x-$} ${a.y} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${a.x+m} ${o.y} ${i} ${a.x} ${o.y+$} L ${a.x} ${a.y}`),o.x===a.x&&(s=`M ${o.x} ${o.y} L ${a.x} ${a.y}`)):"BT"===V?(o.x<a.x&&(s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${o.x} ${a.y+m} ${d} ${o.x+$} ${a.y} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${a.x-m} ${o.y} ${i} ${a.x} ${o.y-$} L ${a.x} ${a.y}`),o.x>a.x&&(i="A 20 20, 0, 0, 0,",d="A 20 20, 0, 0, 1,",m=20,$=20,s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${o.x} ${a.y+m} ${i} ${o.x-$} ${a.y} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${a.x-m} ${o.y} ${i} ${a.x} ${o.y-$} L ${a.x} ${a.y}`),o.x===a.x&&(s=`M ${o.x} ${o.y} L ${a.x} ${a.y}`)):(o.y<a.y&&(s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${a.x-m} ${o.y} ${d} ${a.x} ${o.y+$} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${o.x} ${a.y-m} ${i} ${o.x+$} ${a.y} L ${a.x} ${a.y}`),o.y>a.y&&(s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${a.x-m} ${o.y} ${i} ${a.x} ${o.y-$} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${o.x} ${a.y+m} ${d} ${o.x+$} ${a.y} L ${a.x} ${a.y}`),o.y===a.y&&(s=`M ${o.x} ${o.y} L ${a.x} ${a.y}`));if(void 0===s)throw new Error("Line definition not found");t.append("path").attr("d",s).attr("class","arrow arrow"+l%8)},"drawArrow"),gt=(0,c.K2)((t,r)=>{const e=t.append("g").attr("class","commit-arrows");[...r.keys()].forEach(t=>{const n=r.get(t);n.parents&&n.parents.length>0&&n.parents.forEach(t=>{yt(e,r.get(t),n,r)})})},"drawArrows"),pt=(0,c.K2)((t,r)=>{const e=t.append("g");r.forEach((t,r)=>{const n=r%8,o=j.get(t.name)?.pos;if(void 0===o)throw new Error(`Position not found for branch ${t.name}`);const a=e.append("line");a.attr("x1",0),a.attr("y1",o),a.attr("x2",U),a.attr("y2",o),a.attr("class","branch branch"+n),"TB"===V?(a.attr("y1",30),a.attr("x1",o),a.attr("y2",U),a.attr("x2",o)):"BT"===V&&(a.attr("y1",U),a.attr("x1",o),a.attr("y2",30),a.attr("x2",o)),F.push(o);const c=t.name,s=Q(c),i=e.insert("rect"),h=e.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+n);h.node().appendChild(s);const d=s.getBBox();i.attr("class","branchLabelBkg label"+n).attr("rx",4).attr("ry",4).attr("x",-d.width-4-(!0===S?.rotateCommitLabel?30:0)).attr("y",-d.height/2+8).attr("width",d.width+18).attr("height",d.height+4),h.attr("transform","translate("+(-d.width-14-(!0===S?.rotateCommitLabel?30:0))+", "+(o-d.height/2-1)+")"),"TB"===V?(i.attr("x",o-d.width/2-10).attr("y",0),h.attr("transform","translate("+(o-d.width/2-5)+", 0)")):"BT"===V?(i.attr("x",o-d.width/2-10).attr("y",U),h.attr("transform","translate("+(o-d.width/2-5)+", "+U+")")):i.attr("transform","translate(-19, "+(o-d.height/2)+")")})},"drawBranches"),xt=(0,c.K2)(function(t,r,e,n,o){return j.set(t,{pos:r,index:e}),r+=50+(o?40:0)+("TB"===V||"BT"===V?n.width/2:0)},"setBranchPosition");var ft={parser:D,db:v,renderer:{draw:(0,c.K2)(function(t,r,e,n){if(J(),c.Rm.debug("in gitgraph renderer",t+"\n","id:",r,e),!S)throw new Error("GitGraph config not found");const o=S.rotateCommitLabel??!1,s=n.db;_=s.getCommits();const h=s.getBranchesAsObjArray();V=s.getDirection();const d=(0,i.Ltv)(`[id="${r}"]`);let m=0;h.forEach((t,r)=>{const e=Q(t.name),n=d.append("g"),a=n.insert("g").attr("class","branchLabel"),c=a.insert("g").attr("class","label branch-label");c.node()?.appendChild(e);const s=e.getBBox();m=xt(t.name,m,r,s,o),c.remove(),a.remove(),n.remove()}),mt(d,_,!1),S.showBranches&&pt(d,h),gt(d,_),mt(d,_,!0),a._K.insertTitle(d,"gitTitleText",S.titleTopMargin??0,s.getDiagramTitle()),(0,c.mj)(void 0,d,S.diagramPadding,S.useMaxWidth)},"draw")},styles:(0,c.K2)(t=>`\n .commit-id,\n .commit-msg,\n .branch-label {\n fill: lightgrey;\n color: lightgrey;\n font-family: 'trebuchet ms', verdana, arial, sans-serif;\n font-family: var(--mermaid-font-family);\n }\n ${[0,1,2,3,4,5,6,7].map(r=>`\n .branch-label${r} { fill: ${t["gitBranchLabel"+r]}; }\n .commit${r} { stroke: ${t["git"+r]}; fill: ${t["git"+r]}; }\n .commit-highlight${r} { stroke: ${t["gitInv"+r]}; fill: ${t["gitInv"+r]}; }\n .label${r} { fill: ${t["git"+r]}; }\n .arrow${r} { stroke: ${t["git"+r]}; }\n `).join("\n")}\n\n .branch {\n stroke-width: 1;\n stroke: ${t.lineColor};\n stroke-dasharray: 2;\n }\n .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};}\n .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; }\n .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};}\n .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; }\n .tag-hole { fill: ${t.textColor}; }\n\n .commit-merge {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n .commit-reverse {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n stroke-width: 3;\n }\n .commit-highlight-outer {\n }\n .commit-highlight-inner {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n\n .arrow { stroke-width: 8; stroke-linecap: round; fill: none}\n .gitTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n`,"getStyles")}},98645:(t,r,e)=>{e.d(r,{m:()=>o});var n=e(97485),o=class{constructor(t){this.init=t,this.records=this.init()}static{(0,n.K2)(this,"ImperativeState")}reset(){this.records=this.init()}}}}]); \ No newline at end of file diff --git a/assets/js/5932.5b8e5082.js b/assets/js/5932.5b8e5082.js new file mode 100644 index 0000000000..3c180ea6f8 --- /dev/null +++ b/assets/js/5932.5b8e5082.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5932],{11047:(t,e,n)=>{n.d(e,{o:()=>i});var i=(0,n(97485).K2)(()=>"\n /* Font Awesome icon styling - consolidated */\n .label-icon {\n display: inline-block;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n \n .node .label-icon path {\n fill: currentColor;\n stroke: revert;\n stroke-width: revert;\n }\n","getIconStyles")},45932:(t,e,n)=>{n.d(e,{diagram:()=>L});var i=n(11047),s=n(89790),r=n(49636),o=(n(267),n(29951),n(63727),n(9420),n(47765)),a=n(97485),c=n(13212),l=n(58480),h=n(81896),u=function(){var t=(0,a.K2)(function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},"o"),e=[1,4],n=[1,13],i=[1,12],s=[1,15],r=[1,16],o=[1,20],c=[1,19],l=[6,7,8],h=[1,26],u=[1,24],g=[1,25],d=[6,7,11],p=[1,31],y=[6,7,11,24],f=[1,6,13,16,17,20,23],m=[1,35],b=[1,36],k=[1,6,7,11,13,16,17,20,23],_=[1,38],E={trace:(0,a.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mindMap:4,spaceLines:5,SPACELINE:6,NL:7,KANBAN:8,document:9,stop:10,EOF:11,statement:12,SPACELIST:13,node:14,shapeData:15,ICON:16,CLASS:17,nodeWithId:18,nodeWithoutId:19,NODE_DSTART:20,NODE_DESCR:21,NODE_DEND:22,NODE_ID:23,SHAPE_DATA:24,$accept:0,$end:1},terminals_:{2:"error",6:"SPACELINE",7:"NL",8:"KANBAN",11:"EOF",13:"SPACELIST",16:"ICON",17:"CLASS",20:"NODE_DSTART",21:"NODE_DESCR",22:"NODE_DEND",23:"NODE_ID",24:"SHAPE_DATA"},productions_:[0,[3,1],[3,2],[5,1],[5,2],[5,2],[4,2],[4,3],[10,1],[10,1],[10,1],[10,2],[10,2],[9,3],[9,2],[12,3],[12,2],[12,2],[12,2],[12,1],[12,2],[12,1],[12,1],[12,1],[12,1],[14,1],[14,1],[19,3],[18,1],[18,4],[15,2],[15,1]],performAction:(0,a.K2)(function(t,e,n,i,s,r,o){var a=r.length-1;switch(s){case 6:case 7:return i;case 8:i.getLogger().trace("Stop NL ");break;case 9:i.getLogger().trace("Stop EOF ");break;case 11:i.getLogger().trace("Stop NL2 ");break;case 12:i.getLogger().trace("Stop EOF2 ");break;case 15:i.getLogger().info("Node: ",r[a-1].id),i.addNode(r[a-2].length,r[a-1].id,r[a-1].descr,r[a-1].type,r[a]);break;case 16:i.getLogger().info("Node: ",r[a].id),i.addNode(r[a-1].length,r[a].id,r[a].descr,r[a].type);break;case 17:i.getLogger().trace("Icon: ",r[a]),i.decorateNode({icon:r[a]});break;case 18:case 23:i.decorateNode({class:r[a]});break;case 19:i.getLogger().trace("SPACELIST");break;case 20:i.getLogger().trace("Node: ",r[a-1].id),i.addNode(0,r[a-1].id,r[a-1].descr,r[a-1].type,r[a]);break;case 21:i.getLogger().trace("Node: ",r[a].id),i.addNode(0,r[a].id,r[a].descr,r[a].type);break;case 22:i.decorateNode({icon:r[a]});break;case 27:i.getLogger().trace("node found ..",r[a-2]),this.$={id:r[a-1],descr:r[a-1],type:i.getType(r[a-2],r[a])};break;case 28:this.$={id:r[a],descr:r[a],type:0};break;case 29:i.getLogger().trace("node found ..",r[a-3]),this.$={id:r[a-3],descr:r[a-1],type:i.getType(r[a-2],r[a])};break;case 30:this.$=r[a-1]+r[a];break;case 31:this.$=r[a]}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:n,7:[1,10],9:9,12:11,13:i,14:14,16:s,17:r,18:17,19:18,20:o,23:c},t(l,[2,3]),{1:[2,2]},t(l,[2,4]),t(l,[2,5]),{1:[2,6],6:n,12:21,13:i,14:14,16:s,17:r,18:17,19:18,20:o,23:c},{6:n,9:22,12:11,13:i,14:14,16:s,17:r,18:17,19:18,20:o,23:c},{6:h,7:u,10:23,11:g},t(d,[2,24],{18:17,19:18,14:27,16:[1,28],17:[1,29],20:o,23:c}),t(d,[2,19]),t(d,[2,21],{15:30,24:p}),t(d,[2,22]),t(d,[2,23]),t(y,[2,25]),t(y,[2,26]),t(y,[2,28],{20:[1,32]}),{21:[1,33]},{6:h,7:u,10:34,11:g},{1:[2,7],6:n,12:21,13:i,14:14,16:s,17:r,18:17,19:18,20:o,23:c},t(f,[2,14],{7:m,11:b}),t(k,[2,8]),t(k,[2,9]),t(k,[2,10]),t(d,[2,16],{15:37,24:p}),t(d,[2,17]),t(d,[2,18]),t(d,[2,20],{24:_}),t(y,[2,31]),{21:[1,39]},{22:[1,40]},t(f,[2,13],{7:m,11:b}),t(k,[2,11]),t(k,[2,12]),t(d,[2,15],{24:_}),t(y,[2,30]),{22:[1,41]},t(y,[2,27]),t(y,[2,29])],defaultActions:{2:[2,1],6:[2,2]},parseError:(0,a.K2)(function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},"parseError"),parse:(0,a.K2)(function(t){var e=this,n=[0],i=[],s=[null],r=[],o=this.table,c="",l=0,h=0,u=0,g=r.slice.call(arguments,1),d=Object.create(this.lexer),p={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(p.yy[y]=this.yy[y]);d.setInput(t,p.yy),p.yy.lexer=d,p.yy.parser=this,void 0===d.yylloc&&(d.yylloc={});var f=d.yylloc;r.push(f);var m=d.options&&d.options.ranges;function b(){var t;return"number"!=typeof(t=i.pop()||d.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,a.K2)(function(t){n.length=n.length-2*t,s.length=s.length-t,r.length=r.length-t},"popStack"),(0,a.K2)(b,"lex");for(var k,_,E,S,N,x,D,L,I,v={};;){if(E=n[n.length-1],this.defaultActions[E]?S=this.defaultActions[E]:(null==k&&(k=b()),S=o[E]&&o[E][k]),void 0===S||!S.length||!S[0]){var C="";for(x in I=[],o[E])this.terminals_[x]&&x>2&&I.push("'"+this.terminals_[x]+"'");C=d.showPosition?"Parse error on line "+(l+1)+":\n"+d.showPosition()+"\nExpecting "+I.join(", ")+", got '"+(this.terminals_[k]||k)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==k?"end of input":"'"+(this.terminals_[k]||k)+"'"),this.parseError(C,{text:d.match,token:this.terminals_[k]||k,line:d.yylineno,loc:f,expected:I})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+E+", token: "+k);switch(S[0]){case 1:n.push(k),s.push(d.yytext),r.push(d.yylloc),n.push(S[1]),k=null,_?(k=_,_=null):(h=d.yyleng,c=d.yytext,l=d.yylineno,f=d.yylloc,u>0&&u--);break;case 2:if(D=this.productions_[S[1]][1],v.$=s[s.length-D],v._$={first_line:r[r.length-(D||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(D||1)].first_column,last_column:r[r.length-1].last_column},m&&(v._$.range=[r[r.length-(D||1)].range[0],r[r.length-1].range[1]]),void 0!==(N=this.performAction.apply(v,[c,h,l,p.yy,S[1],s,r].concat(g))))return N;D&&(n=n.slice(0,-1*D*2),s=s.slice(0,-1*D),r=r.slice(0,-1*D)),n.push(this.productions_[S[1]][0]),s.push(v.$),r.push(v._$),L=o[n[n.length-2]][n[n.length-1]],n.push(L);break;case 3:return!0}}return!0},"parse")},S=function(){return{EOF:1,parseError:(0,a.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,a.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,a.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,a.K2)(function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,a.K2)(function(){return this._more=!0,this},"more"),reject:(0,a.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,a.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,a.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,a.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,a.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,a.K2)(function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1},"test_match"),next:(0,a.K2)(function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;r<s.length;r++)if((n=this._input.match(this.rules[s[r]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,a.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,a.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,a.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,a.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,a.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,a.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,a.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,a.K2)(function(t,e,n,i){switch(n){case 0:return this.pushState("shapeData"),e.yytext="",24;case 1:return this.pushState("shapeDataStr"),24;case 2:return this.popState(),24;case 3:const n=/\n\s*/g;return e.yytext=e.yytext.replace(n,"<br/>"),24;case 4:return 24;case 5:case 10:case 29:case 32:this.popState();break;case 6:return t.getLogger().trace("Found comment",e.yytext),6;case 7:return 8;case 8:this.begin("CLASS");break;case 9:return this.popState(),17;case 11:t.getLogger().trace("Begin icon"),this.begin("ICON");break;case 12:return t.getLogger().trace("SPACELINE"),6;case 13:return 7;case 14:return 16;case 15:t.getLogger().trace("end icon"),this.popState();break;case 16:return t.getLogger().trace("Exploding node"),this.begin("NODE"),20;case 17:return t.getLogger().trace("Cloud"),this.begin("NODE"),20;case 18:return t.getLogger().trace("Explosion Bang"),this.begin("NODE"),20;case 19:return t.getLogger().trace("Cloud Bang"),this.begin("NODE"),20;case 20:case 21:case 22:case 23:return this.begin("NODE"),20;case 24:return 13;case 25:return 23;case 26:return 11;case 27:this.begin("NSTR2");break;case 28:return"NODE_DESCR";case 30:t.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 31:return t.getLogger().trace("description:",e.yytext),"NODE_DESCR";case 33:return this.popState(),t.getLogger().trace("node end ))"),"NODE_DEND";case 34:return this.popState(),t.getLogger().trace("node end )"),"NODE_DEND";case 35:return this.popState(),t.getLogger().trace("node end ...",e.yytext),"NODE_DEND";case 36:case 39:case 40:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";case 37:case 38:return this.popState(),t.getLogger().trace("node end (-"),"NODE_DEND";case 41:case 42:return t.getLogger().trace("Long description:",e.yytext),21}},"anonymous"),rules:[/^(?:@\{)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^\"]+)/i,/^(?:[^}^"]+)/i,/^(?:\})/i,/^(?:\s*%%.*)/i,/^(?:kanban\b)/i,/^(?::::)/i,/^(?:.+)/i,/^(?:\n)/i,/^(?:::icon\()/i,/^(?:[\s]+[\n])/i,/^(?:[\n]+)/i,/^(?:[^\)]+)/i,/^(?:\))/i,/^(?:-\))/i,/^(?:\(-)/i,/^(?:\)\))/i,/^(?:\))/i,/^(?:\(\()/i,/^(?:\{\{)/i,/^(?:\()/i,/^(?:\[)/i,/^(?:[\s]+)/i,/^(?:[^\(\[\n\)\{\}@]+)/i,/^(?:$)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:[^"]+)/i,/^(?:["])/i,/^(?:[\)]\))/i,/^(?:[\)])/i,/^(?:[\]])/i,/^(?:\}\})/i,/^(?:\(-)/i,/^(?:-\))/i,/^(?:\(\()/i,/^(?:\()/i,/^(?:[^\)\]\(\}]+)/i,/^(?:.+(?!\(\())/i],conditions:{shapeDataEndBracket:{rules:[],inclusive:!1},shapeDataStr:{rules:[2,3],inclusive:!1},shapeData:{rules:[1,4,5],inclusive:!1},CLASS:{rules:[9,10],inclusive:!1},ICON:{rules:[14,15],inclusive:!1},NSTR2:{rules:[28,29],inclusive:!1},NSTR:{rules:[31,32],inclusive:!1},NODE:{rules:[27,30,33,34,35,36,37,38,39,40,41,42],inclusive:!1},INITIAL:{rules:[0,6,7,8,11,12,13,16,17,18,19,20,21,22,23,24,25,26],inclusive:!0}}}}();function N(){this.yy={}}return E.lexer=S,(0,a.K2)(N,"Parser"),N.prototype=E,E.Parser=N,new N}();u.parser=u;var g=u,d=[],p=[],y=0,f={},m=(0,a.K2)(()=>{d=[],p=[],y=0,f={}},"clear"),b=(0,a.K2)(t=>{if(0===d.length)return null;const e=d[0].level;let n=null;for(let i=d.length-1;i>=0;i--)if(d[i].level!==e||n||(n=d[i]),d[i].level<e)throw new Error('Items without section detected, found section ("'+d[i].label+'")');return t===n?.level?null:n},"getSection"),k=(0,a.K2)(function(){return p},"getSections"),_=(0,a.K2)(function(){const t=[],e=k(),n=(0,a.D7)();for(const i of e){const e={id:i.id,label:(0,a.jZ)(i.label??"",n),isGroup:!0,ticket:i.ticket,shape:"kanbanSection",level:i.level,look:n.look};t.push(e);const s=d.filter(t=>t.parentId===i.id);for(const r of s){const e={id:r.id,parentId:i.id,label:(0,a.jZ)(r.label??"",n),isGroup:!1,ticket:r?.ticket,priority:r?.priority,assigned:r?.assigned,icon:r?.icon,shape:"kanbanItem",level:r.level,rx:5,ry:5,cssStyles:["text-align: left"]};t.push(e)}}return{nodes:t,edges:[],other:{},config:(0,a.D7)()}},"getData"),E=(0,a.K2)((t,e,n,i,r)=>{const o=(0,a.D7)();let c=o.mindmap?.padding??a.UI.mindmap.padding;switch(i){case S.ROUNDED_RECT:case S.RECT:case S.HEXAGON:c*=2}const l={id:(0,a.jZ)(e,o)||"kbn"+y++,level:t,label:(0,a.jZ)(n,o),width:o.mindmap?.maxNodeWidth??a.UI.mindmap.maxNodeWidth,padding:c,isGroup:!1};if(void 0!==r){let t;t=r.includes("\n")?r+"\n":"{\n"+r+"\n}";const e=(0,s.H)(t,{schema:s.r});if(e.shape&&(e.shape!==e.shape.toLowerCase()||e.shape.includes("_")))throw new Error(`No such shape: ${e.shape}. Shape names should be lowercase.`);e?.shape&&"kanbanItem"===e.shape&&(l.shape=e?.shape),e?.label&&(l.label=e?.label),e?.icon&&(l.icon=e?.icon.toString()),e?.assigned&&(l.assigned=e?.assigned.toString()),e?.ticket&&(l.ticket=e?.ticket.toString()),e?.priority&&(l.priority=e?.priority)}const h=b(t);h?l.parentId=h.id||"kbn"+y++:p.push(l),d.push(l)},"addNode"),S={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},N={clear:m,addNode:E,getSections:k,getData:_,nodeType:S,getType:(0,a.K2)((t,e)=>{switch(a.Rm.debug("In get type",t,e),t){case"[":return S.RECT;case"(":return")"===e?S.ROUNDED_RECT:S.CLOUD;case"((":return S.CIRCLE;case")":return S.CLOUD;case"))":return S.BANG;case"{{":return S.HEXAGON;default:return S.DEFAULT}},"getType"),setElementForId:(0,a.K2)((t,e)=>{f[t]=e},"setElementForId"),decorateNode:(0,a.K2)(t=>{if(!t)return;const e=(0,a.D7)(),n=d[d.length-1];t.icon&&(n.icon=(0,a.jZ)(t.icon,e)),t.class&&(n.cssClasses=(0,a.jZ)(t.class,e))},"decorateNode"),type2Str:(0,a.K2)(t=>{switch(t){case S.DEFAULT:return"no-border";case S.RECT:return"rect";case S.ROUNDED_RECT:return"rounded-rect";case S.CIRCLE:return"circle";case S.CLOUD:return"cloud";case S.BANG:return"bang";case S.HEXAGON:return"hexgon";default:return"no-border"}},"type2Str"),getLogger:(0,a.K2)(()=>a.Rm,"getLogger"),getElementById:(0,a.K2)(t=>f[t],"getElementById")},x={draw:(0,a.K2)(async(t,e,n,i)=>{a.Rm.debug("Rendering kanban diagram\n"+t);const s=i.db.getData(),c=(0,a.D7)();c.htmlLabels=!1;const l=(0,o.D)(e),h=l.append("g");h.attr("class","sections");const u=l.append("g");u.attr("class","items");const g=s.nodes.filter(t=>t.isGroup);let d=0;const p=[];let y=25;for(const o of g){const t=c?.kanban?.sectionWidth||200;d+=1,o.x=t*d+10*(d-1)/2,o.width=t,o.y=0,o.height=3*t,o.rx=5,o.ry=5,o.cssClasses=o.cssClasses+" section-"+d;const e=await(0,r.U)(h,o);y=Math.max(y,e?.labelBBox?.height),p.push(e)}let f=0;for(const o of g){const t=p[f];f+=1;const e=c?.kanban?.sectionWidth||200,n=3*-e/2+y;let i=n;const a=s.nodes.filter(t=>t.parentId===o.id);for(const s of a){if(s.isGroup)throw new Error("Groups within groups are not allowed in Kanban diagrams");s.x=o.x,s.width=e-15;const t=(await(0,r.on)(u,s,{config:c})).node().getBBox();s.y=i+t.height/2,await(0,r.U_)(s),i=s.y+t.height/2+5}const l=t.cluster.select("rect"),h=Math.max(i-n+30,50)+(y-25);l.attr("height",h)}(0,a.ot)(void 0,l,c.mindmap?.padding??a.UI.kanban.padding,c.mindmap?.useMaxWidth??a.UI.kanban.useMaxWidth)},"draw")},D=(0,a.K2)(t=>{let e="";for(let i=0;i<t.THEME_COLOR_LIMIT;i++)t["lineColor"+i]=t["lineColor"+i]||t["cScaleInv"+i],(0,c.A)(t["lineColor"+i])?t["lineColor"+i]=(0,l.A)(t["lineColor"+i],20):t["lineColor"+i]=(0,h.A)(t["lineColor"+i],20);const n=(0,a.K2)((e,n)=>t.darkMode?(0,h.A)(e,n):(0,l.A)(e,n),"adjuster");for(let i=0;i<t.THEME_COLOR_LIMIT;i++){const s=""+(17-3*i);e+=`\n .section-${i-1} rect, .section-${i-1} path, .section-${i-1} circle, .section-${i-1} polygon, .section-${i-1} path {\n fill: ${n(t["cScale"+i],10)};\n stroke: ${n(t["cScale"+i],10)};\n\n }\n .section-${i-1} text {\n fill: ${t["cScaleLabel"+i]};\n }\n .node-icon-${i-1} {\n font-size: 40px;\n color: ${t["cScaleLabel"+i]};\n }\n .section-edge-${i-1}{\n stroke: ${t["cScale"+i]};\n }\n .edge-depth-${i-1}{\n stroke-width: ${s};\n }\n .section-${i-1} line {\n stroke: ${t["cScaleInv"+i]} ;\n stroke-width: 3;\n }\n\n .disabled, .disabled circle, .disabled text {\n fill: lightgray;\n }\n .disabled text {\n fill: #efefef;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.background};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .kanban-ticket-link {\n fill: ${t.background};\n stroke: ${t.nodeBorder};\n text-decoration: underline;\n }\n `}return e},"genSections"),L={db:N,renderer:x,parser:g,styles:(0,a.K2)(t=>`\n .edge {\n stroke-width: 3;\n }\n ${D(t)}\n .section-root rect, .section-root path, .section-root circle, .section-root polygon {\n fill: ${t.git0};\n }\n .section-root text {\n fill: ${t.gitBranchLabel0};\n }\n .icon-container {\n height:100%;\n display: flex;\n justify-content: center;\n align-items: center;\n }\n .edge {\n fill: none;\n }\n .cluster-label, .label {\n color: ${t.textColor};\n fill: ${t.textColor};\n }\n .kanban-label {\n dy: 1em;\n alignment-baseline: middle;\n text-anchor: middle;\n dominant-baseline: middle;\n text-align: center;\n }\n ${(0,i.o)()}\n`,"getStyles")}}}]); \ No newline at end of file diff --git a/assets/js/5ad15a2f.f4fecb23.js b/assets/js/5ad15a2f.f4fecb23.js new file mode 100644 index 0000000000..5a6ec023f0 --- /dev/null +++ b/assets/js/5ad15a2f.f4fecb23.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7042],{81069:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.11.0","label":"0.11.0","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.11.0","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.11.0/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.11.0/configuration","docId":"configuration","unlisted":false},{"collapsed":false,"type":"category","label":"Rules","items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.11.0/rules/unused","docId":"rules/unused","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.11.0/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.11.0/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"collapsed":false,"type":"category","label":"compiler","items":[{"type":"link","label":"Could Use Anvil Factory","href":"/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory","docId":"rules/compiler/could_use_anvil_factory","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Kapt","items":[{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor","docId":"rules/kapt/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin","docId":"rules/kapt/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers","docId":"rules/kapt/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Sorting","items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"collapsed":false,"type":"category","label":"Android","items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.11.0/rules/android/disable_resources","docId":"rules/android/disable_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.11.0/rules/android/disable_viewbinding","docId":"rules/android/disable_viewbinding","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","sidebar":"Docs"},"rules/android/disable_resources":{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_viewbinding":{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/compiler/could_use_anvil_factory":{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/kapt/custom_kapt_matchers":{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/kapt/unused_kapt_plugin":{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","sidebar":"Docs"},"rules/kapt/unused_kapt_processor":{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused":{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/5b786e91.375d2adb.js b/assets/js/5b786e91.375d2adb.js new file mode 100644 index 0000000000..2c732993b2 --- /dev/null +++ b/assets/js/5b786e91.375d2adb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5802],{14643:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>a,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","source":"@site/versioned_docs/version-0.12.3/rules/overshot_dependency.md","sourceDirName":"rules","slug":"/rules/overshot_dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/overshot_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/overshot_dependency.md","tags":[],"version":"0.12.3","frontMatter":{"id":"overshot_dependency","slug":"/rules/overshot_dependency","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Docs","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/redundant_dependency"},"next":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.3/rules/project_depth"}}');var o=t(23420),d=t(65404);const r={id:"overshot_dependency",slug:"/rules/overshot_dependency",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},c=void 0,i={},l=[];function u(e){const n={code:"code",em:"em",p:"p",pre:"pre",strong:"strong",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"Finds project dependencies which aren't used by the declaring configuration, but are used by a\ndependent, downstream configuration."}),"\n",(0,o.jsxs)(n.p,{children:["For instance, assume that ",(0,o.jsx)(n.code,{children:":moduleB"})," declares an ",(0,o.jsx)(n.code,{children:"implementation"})," dependency upon ",(0,o.jsx)(n.code,{children:":moduleA"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n implementation(project(":moduleA"))\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:":moduleB"})," doesn't actually use ",(0,o.jsx)(n.code,{children:":moduleA"})," in its ",(0,o.jsx)(n.code,{children:"main"})," source, but it ",(0,o.jsx)(n.em,{children:"does"})," use it in ",(0,o.jsx)(n.code,{children:"test"}),"\nsource, it's an ",(0,o.jsx)(n.strong,{children:"overshot dependency"}),". The declaration should be changed to\nuse ",(0,o.jsx)(n.code,{children:"testImplementation"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n testImplementation(project(":moduleA"))\n}\n'})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var s=t(36672);const o={},d=s.createContext(o);function r(e){const n=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(d.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d2d37cd.b28f062f.js b/assets/js/5d2d37cd.b28f062f.js new file mode 100644 index 0000000000..60bcb9db9f --- /dev/null +++ b/assets/js/5d2d37cd.b28f062f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7257],{50913:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.11.1/rules/kapt/custom_kapt_matchers.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/kapt/custom_kapt_matchers.md","tags":[],"version":"0.11.1","frontMatter":{"id":"custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies"}}');var o=s(23420),r=s(65404);const a={id:"custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},c=void 0,i={},u=[];function l(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,o.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>c});var n=s(36672);const o={},r=n.createContext(o);function a(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/5d624d4b.a7c617c0.js b/assets/js/5d624d4b.a7c617c0.js new file mode 100644 index 0000000000..6d72f04503 --- /dev/null +++ b/assets/js/5d624d4b.a7c617c0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7658],{65404:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var s=n(36672);const o={},u=s.createContext(o);function r(e){const t=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:t},e.children)}},81800:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","source":"@site/versioned_docs/version-0.11.3/rules/kapt/unused_kapt_plugin.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/kapt/unused_kapt_plugin.md","tags":[],"version":"0.11.3","frontMatter":{"id":"unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers"}}');var o=n(23420),u=n(65404);const r={id:"unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,a={},p=[];function c(e){const t={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(t.p,{children:["If there are no ",(0,o.jsx)(t.code,{children:"kapt"}),"/",(0,o.jsx)(t.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in applying\nthe ",(0,o.jsx)(t.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function l(e={}){const{wrapper:t}={...(0,u.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/5e95c892.d9451226.js b/assets/js/5e95c892.d9451226.js new file mode 100644 index 0000000000..870cc988f8 --- /dev/null +++ b/assets/js/5e95c892.d9451226.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9647],{81895:(e,c,s)=>{s.r(c),s.d(c,{default:()=>n});s(36672);var r=s(13526),u=s(6617),a=s(84862),l=s(26271),d=s(64381),h=s(23420);function n(e){return(0,h.jsx)(u.e3,{className:(0,r.A)(a.G.wrapper.docsPages),children:(0,h.jsx)(d.A,{children:(0,l.v)(e.route.routes)})})}}}]); \ No newline at end of file diff --git a/assets/js/5f0d7ee4.d029c08e.js b/assets/js/5f0d7ee4.d029c08e.js new file mode 100644 index 0000000000..c999561afc --- /dev/null +++ b/assets/js/5f0d7ee4.d029c08e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[825],{65404:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(36672);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}},65661:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.11.1/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_dependencies","permalink":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/sorting/sort_dependencies.md","tags":[],"version":"0.11.1","frontMatter":{"id":"sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins"}}');var o=n(23420),r=n(65404);const i={id:"sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l()}}}]); \ No newline at end of file diff --git a/assets/js/5fd14b8b.6409dbe4.js b/assets/js/5fd14b8b.6409dbe4.js new file mode 100644 index 0000000000..9a2fd98a32 --- /dev/null +++ b/assets/js/5fd14b8b.6409dbe4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9775],{20961:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.11.2/rules/kapt/custom_kapt_matchers.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/kapt/custom_kapt_matchers.md","tags":[],"version":"0.11.2","frontMatter":{"id":"custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies"}}');var o=s(23420),r=s(65404);const a={id:"custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},c=void 0,i={},u=[];function l(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,o.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>c});var n=s(36672);const o={},r=n.createContext(o);function a(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6007.cad91727.js b/assets/js/6007.cad91727.js new file mode 100644 index 0000000000..7f25d03659 --- /dev/null +++ b/assets/js/6007.cad91727.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6007],{6007:(e,c,k)=>{k.d(c,{createInfoServices:()=>s.v});var s=k(23741);k(60349)}}]); \ No newline at end of file diff --git a/assets/js/6033e994.8a9089ba.js b/assets/js/6033e994.8a9089ba.js new file mode 100644 index 0000000000..1630f82b7f --- /dev/null +++ b/assets/js/6033e994.8a9089ba.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9558],{3457:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>d,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","source":"@site/versioned_docs/version-0.12.5/rules/android/unused_kotlin_android_extensions.md","sourceDirName":"rules/android","slug":"/rules/unused_kotlin_android_extensions","permalink":"/ModuleCheck/docs/rules/unused_kotlin_android_extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/android/unused_kotlin_android_extensions.md","tags":[],"version":"0.12.5","frontMatter":{"id":"unused_kotlin_android_extensions","slug":"/rules/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","sidebar_label":"Unused Kotlin Android Extensions"},"sidebar":"Docs","previous":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/rules/disable_view_binding"}}');var t=s(23420),i=s(65404);const d={id:"unused_kotlin_android_extensions",slug:"/rules/unused_kotlin_android_extensions",title:"Unused Kotlin Android Extensions",sidebar_label:"Unused Kotlin Android Extensions"},r=void 0,u={},l=[];function a(e){const n={p:"p",...(0,i.R)(),...e.components};return(0,t.jsx)(n.p,{children:"Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any\nsynthetic imports or deprecated @Parcelize annotation"})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>r});var o=s(36672);const t={},i=o.createContext(t);function d(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6192.8a9258d0.js b/assets/js/6192.8a9258d0.js new file mode 100644 index 0000000000..6a4f76ff96 --- /dev/null +++ b/assets/js/6192.8a9258d0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6192],{44533:(e,t,s)=>{s.d(t,{P:()=>n});var i=s(97485),n=(0,i.K2)((e,t,s,n)=>{e.attr("class",s);const{width:l,height:c,x:o,y:h}=r(e,t);(0,i.a$)(e,c,l,n);const u=a(o,h,l,c,t);e.attr("viewBox",u),i.Rm.debug(`viewBox configured: ${u} with padding: ${t}`)},"setupViewPortForSVG"),r=(0,i.K2)((e,t)=>{const s=e.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*t,height:s.height+2*t,x:s.x,y:s.y}},"calculateDimensionsWithPadding"),a=(0,i.K2)((e,t,s,i,n)=>`${e-n} ${t-n} ${s} ${i}`,"createViewBox")},66192:(e,t,s)=>{s.d(t,{diagram:()=>d});var i=s(91544),n=s(44533),r=s(80284),a=(s(61923),s(290),s(49636),s(267),s(29951),s(63727),s(9420)),l=s(97485),c=function(){var e=(0,l.K2)(function(e,t,s,i){for(s=s||{},i=e.length;i--;s[e[i]]=t);return s},"o"),t=[1,3],s=[1,4],i=[1,5],n=[1,6],r=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],a=[1,22],c=[2,7],o=[1,26],h=[1,27],u=[1,28],y=[1,29],m=[1,33],d=[1,34],E=[1,35],p=[1,36],R=[1,37],f=[1,38],_=[1,24],g=[1,31],S=[1,32],I=[1,30],b=[1,39],T=[1,40],k=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],N=[1,61],q=[89,90],A=[5,8,9,11,13,21,22,23,24,27,29,41,42,43,44,45,46,54,61,63,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],C=[27,29],v=[1,70],w=[1,71],x=[1,72],L=[1,73],D=[1,74],O=[1,75],$=[1,76],M=[1,83],F=[1,80],K=[1,84],P=[1,85],V=[1,86],U=[1,87],Y=[1,88],B=[1,89],Q=[1,90],H=[1,91],W=[1,92],j=[5,8,9,11,13,21,22,23,24,27,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],G=[63,64],z=[1,101],X=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],J=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,75,76,77,80,81,82,83,84,85,86,87,88,89,90],Z=[1,110],ee=[1,106],te=[1,107],se=[1,108],ie=[1,109],ne=[1,111],re=[1,116],ae=[1,117],le=[1,114],ce=[1,115],oe={trace:(0,l.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,directive:4,NEWLINE:5,RD:6,diagram:7,EOF:8,acc_title:9,acc_title_value:10,acc_descr:11,acc_descr_value:12,acc_descr_multiline_value:13,requirementDef:14,elementDef:15,relationshipDef:16,direction:17,styleStatement:18,classDefStatement:19,classStatement:20,direction_tb:21,direction_bt:22,direction_rl:23,direction_lr:24,requirementType:25,requirementName:26,STRUCT_START:27,requirementBody:28,STYLE_SEPARATOR:29,idList:30,ID:31,COLONSEP:32,id:33,TEXT:34,text:35,RISK:36,riskLevel:37,VERIFYMTHD:38,verifyType:39,STRUCT_STOP:40,REQUIREMENT:41,FUNCTIONAL_REQUIREMENT:42,INTERFACE_REQUIREMENT:43,PERFORMANCE_REQUIREMENT:44,PHYSICAL_REQUIREMENT:45,DESIGN_CONSTRAINT:46,LOW_RISK:47,MED_RISK:48,HIGH_RISK:49,VERIFY_ANALYSIS:50,VERIFY_DEMONSTRATION:51,VERIFY_INSPECTION:52,VERIFY_TEST:53,ELEMENT:54,elementName:55,elementBody:56,TYPE:57,type:58,DOCREF:59,ref:60,END_ARROW_L:61,relationship:62,LINE:63,END_ARROW_R:64,CONTAINS:65,COPIES:66,DERIVES:67,SATISFIES:68,VERIFIES:69,REFINES:70,TRACES:71,CLASSDEF:72,stylesOpt:73,CLASS:74,ALPHA:75,COMMA:76,STYLE:77,style:78,styleComponent:79,NUM:80,COLON:81,UNIT:82,SPACE:83,BRKT:84,PCT:85,MINUS:86,LABEL:87,SEMICOLON:88,unqString:89,qString:90,$accept:0,$end:1},terminals_:{2:"error",5:"NEWLINE",6:"RD",8:"EOF",9:"acc_title",10:"acc_title_value",11:"acc_descr",12:"acc_descr_value",13:"acc_descr_multiline_value",21:"direction_tb",22:"direction_bt",23:"direction_rl",24:"direction_lr",27:"STRUCT_START",29:"STYLE_SEPARATOR",31:"ID",32:"COLONSEP",34:"TEXT",36:"RISK",38:"VERIFYMTHD",40:"STRUCT_STOP",41:"REQUIREMENT",42:"FUNCTIONAL_REQUIREMENT",43:"INTERFACE_REQUIREMENT",44:"PERFORMANCE_REQUIREMENT",45:"PHYSICAL_REQUIREMENT",46:"DESIGN_CONSTRAINT",47:"LOW_RISK",48:"MED_RISK",49:"HIGH_RISK",50:"VERIFY_ANALYSIS",51:"VERIFY_DEMONSTRATION",52:"VERIFY_INSPECTION",53:"VERIFY_TEST",54:"ELEMENT",57:"TYPE",59:"DOCREF",61:"END_ARROW_L",63:"LINE",64:"END_ARROW_R",65:"CONTAINS",66:"COPIES",67:"DERIVES",68:"SATISFIES",69:"VERIFIES",70:"REFINES",71:"TRACES",72:"CLASSDEF",74:"CLASS",75:"ALPHA",76:"COMMA",77:"STYLE",80:"NUM",81:"COLON",82:"UNIT",83:"SPACE",84:"BRKT",85:"PCT",86:"MINUS",87:"LABEL",88:"SEMICOLON",89:"unqString",90:"qString"},productions_:[0,[3,3],[3,2],[3,4],[4,2],[4,2],[4,1],[7,0],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[7,2],[17,1],[17,1],[17,1],[17,1],[14,5],[14,7],[28,5],[28,5],[28,5],[28,5],[28,2],[28,1],[25,1],[25,1],[25,1],[25,1],[25,1],[25,1],[37,1],[37,1],[37,1],[39,1],[39,1],[39,1],[39,1],[15,5],[15,7],[56,5],[56,5],[56,2],[56,1],[16,5],[16,5],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[62,1],[19,3],[20,3],[20,3],[30,1],[30,3],[30,1],[30,3],[18,3],[73,1],[73,3],[78,1],[78,2],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[79,1],[26,1],[26,1],[33,1],[33,1],[35,1],[35,1],[55,1],[55,1],[58,1],[58,1],[60,1],[60,1]],performAction:(0,l.K2)(function(e,t,s,i,n,r,a){var l=r.length-1;switch(n){case 4:this.$=r[l].trim(),i.setAccTitle(this.$);break;case 5:case 6:this.$=r[l].trim(),i.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:i.setDirection("TB");break;case 18:i.setDirection("BT");break;case 19:i.setDirection("RL");break;case 20:i.setDirection("LR");break;case 21:i.addRequirement(r[l-3],r[l-4]);break;case 22:i.addRequirement(r[l-5],r[l-6]),i.setClass([r[l-5]],r[l-3]);break;case 23:i.setNewReqId(r[l-2]);break;case 24:i.setNewReqText(r[l-2]);break;case 25:i.setNewReqRisk(r[l-2]);break;case 26:i.setNewReqVerifyMethod(r[l-2]);break;case 29:this.$=i.RequirementType.REQUIREMENT;break;case 30:this.$=i.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=i.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=i.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=i.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=i.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=i.RiskLevel.LOW_RISK;break;case 36:this.$=i.RiskLevel.MED_RISK;break;case 37:this.$=i.RiskLevel.HIGH_RISK;break;case 38:this.$=i.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=i.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=i.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=i.VerifyType.VERIFY_TEST;break;case 42:i.addElement(r[l-3]);break;case 43:i.addElement(r[l-5]),i.setClass([r[l-5]],r[l-3]);break;case 44:i.setNewElementType(r[l-2]);break;case 45:i.setNewElementDocRef(r[l-2]);break;case 48:i.addRelationship(r[l-2],r[l],r[l-4]);break;case 49:i.addRelationship(r[l-2],r[l-4],r[l]);break;case 50:this.$=i.Relationships.CONTAINS;break;case 51:this.$=i.Relationships.COPIES;break;case 52:this.$=i.Relationships.DERIVES;break;case 53:this.$=i.Relationships.SATISFIES;break;case 54:this.$=i.Relationships.VERIFIES;break;case 55:this.$=i.Relationships.REFINES;break;case 56:this.$=i.Relationships.TRACES;break;case 57:this.$=r[l-2],i.defineClass(r[l-1],r[l]);break;case 58:i.setClass(r[l-1],r[l]);break;case 59:i.setClass([r[l-2]],r[l]);break;case 60:case 62:case 65:this.$=[r[l]];break;case 61:case 63:this.$=r[l-2].concat([r[l]]);break;case 64:this.$=r[l-2],i.setCssStyle(r[l-1],r[l]);break;case 66:r[l-2].push(r[l]),this.$=r[l-2];break;case 68:this.$=r[l-1]+r[l]}},"anonymous"),table:[{3:1,4:2,6:t,9:s,11:i,13:n},{1:[3]},{3:8,4:2,5:[1,7],6:t,9:s,11:i,13:n},{5:[1,9]},{10:[1,10]},{12:[1,11]},e(r,[2,6]),{3:12,4:2,6:t,9:s,11:i,13:n},{1:[2,2]},{4:17,5:a,7:13,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},e(r,[2,4]),e(r,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:a,7:42,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:43,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:44,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:45,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:46,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:47,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:48,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:49,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:a,7:50,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{26:51,89:[1,52],90:[1,53]},{55:54,89:[1,55],90:[1,56]},{29:[1,59],61:[1,57],63:[1,58]},e(k,[2,17]),e(k,[2,18]),e(k,[2,19]),e(k,[2,20]),{30:60,33:62,75:N,89:b,90:T},{30:63,33:62,75:N,89:b,90:T},{30:64,33:62,75:N,89:b,90:T},e(q,[2,29]),e(q,[2,30]),e(q,[2,31]),e(q,[2,32]),e(q,[2,33]),e(q,[2,34]),e(A,[2,81]),e(A,[2,82]),{1:[2,3]},{8:[2,8]},{8:[2,9]},{8:[2,10]},{8:[2,11]},{8:[2,12]},{8:[2,13]},{8:[2,14]},{8:[2,15]},{8:[2,16]},{27:[1,65],29:[1,66]},e(C,[2,79]),e(C,[2,80]),{27:[1,67],29:[1,68]},e(C,[2,85]),e(C,[2,86]),{62:69,65:v,66:w,67:x,68:L,69:D,70:O,71:$},{62:77,65:v,66:w,67:x,68:L,69:D,70:O,71:$},{30:78,33:62,75:N,89:b,90:T},{73:79,75:M,76:F,78:81,79:82,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W},e(j,[2,60]),e(j,[2,62]),{73:93,75:M,76:F,78:81,79:82,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W},{30:94,33:62,75:N,76:F,89:b,90:T},{5:[1,95]},{30:96,33:62,75:N,89:b,90:T},{5:[1,97]},{30:98,33:62,75:N,89:b,90:T},{63:[1,99]},e(G,[2,50]),e(G,[2,51]),e(G,[2,52]),e(G,[2,53]),e(G,[2,54]),e(G,[2,55]),e(G,[2,56]),{64:[1,100]},e(k,[2,59],{76:F}),e(k,[2,64],{76:z}),{33:103,75:[1,102],89:b,90:T},e(X,[2,65],{79:104,75:M,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W}),e(J,[2,67]),e(J,[2,69]),e(J,[2,70]),e(J,[2,71]),e(J,[2,72]),e(J,[2,73]),e(J,[2,74]),e(J,[2,75]),e(J,[2,76]),e(J,[2,77]),e(J,[2,78]),e(k,[2,57],{76:z}),e(k,[2,58],{76:F}),{5:Z,28:105,31:ee,34:te,36:se,38:ie,40:ne},{27:[1,112],76:F},{5:re,40:ae,56:113,57:le,59:ce},{27:[1,118],76:F},{33:119,89:b,90:T},{33:120,89:b,90:T},{75:M,78:121,79:82,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W},e(j,[2,61]),e(j,[2,63]),e(J,[2,68]),e(k,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:Z,28:126,31:ee,34:te,36:se,38:ie,40:ne},e(k,[2,28]),{5:[1,127]},e(k,[2,42]),{32:[1,128]},{32:[1,129]},{5:re,40:ae,56:130,57:le,59:ce},e(k,[2,47]),{5:[1,131]},e(k,[2,48]),e(k,[2,49]),e(X,[2,66],{79:104,75:M,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W}),{33:132,89:b,90:T},{35:133,89:[1,134],90:[1,135]},{37:136,47:[1,137],48:[1,138],49:[1,139]},{39:140,50:[1,141],51:[1,142],52:[1,143],53:[1,144]},e(k,[2,27]),{5:Z,28:145,31:ee,34:te,36:se,38:ie,40:ne},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},e(k,[2,46]),{5:re,40:ae,56:152,57:le,59:ce},{5:[1,153]},{5:[1,154]},{5:[2,83]},{5:[2,84]},{5:[1,155]},{5:[2,35]},{5:[2,36]},{5:[2,37]},{5:[1,156]},{5:[2,38]},{5:[2,39]},{5:[2,40]},{5:[2,41]},e(k,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},e(k,[2,43]),{5:Z,28:159,31:ee,34:te,36:se,38:ie,40:ne},{5:Z,28:160,31:ee,34:te,36:se,38:ie,40:ne},{5:Z,28:161,31:ee,34:te,36:se,38:ie,40:ne},{5:Z,28:162,31:ee,34:te,36:se,38:ie,40:ne},{5:re,40:ae,56:163,57:le,59:ce},{5:re,40:ae,56:164,57:le,59:ce},e(k,[2,23]),e(k,[2,24]),e(k,[2,25]),e(k,[2,26]),e(k,[2,44]),e(k,[2,45])],defaultActions:{8:[2,2],12:[2,1],41:[2,3],42:[2,8],43:[2,9],44:[2,10],45:[2,11],46:[2,12],47:[2,13],48:[2,14],49:[2,15],50:[2,16],134:[2,83],135:[2,84],137:[2,35],138:[2,36],139:[2,37],141:[2,38],142:[2,39],143:[2,40],144:[2,41],147:[2,87],148:[2,88],150:[2,89],151:[2,90]},parseError:(0,l.K2)(function(e,t){if(!t.recoverable){var s=new Error(e);throw s.hash=t,s}this.trace(e)},"parseError"),parse:(0,l.K2)(function(e){var t=this,s=[0],i=[],n=[null],r=[],a=this.table,c="",o=0,h=0,u=0,y=r.slice.call(arguments,1),m=Object.create(this.lexer),d={yy:{}};for(var E in this.yy)Object.prototype.hasOwnProperty.call(this.yy,E)&&(d.yy[E]=this.yy[E]);m.setInput(e,d.yy),d.yy.lexer=m,d.yy.parser=this,void 0===m.yylloc&&(m.yylloc={});var p=m.yylloc;r.push(p);var R=m.options&&m.options.ranges;function f(){var e;return"number"!=typeof(e=i.pop()||m.lex()||1)&&(e instanceof Array&&(e=(i=e).pop()),e=t.symbols_[e]||e),e}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,l.K2)(function(e){s.length=s.length-2*e,n.length=n.length-e,r.length=r.length-e},"popStack"),(0,l.K2)(f,"lex");for(var _,g,S,I,b,T,k,N,q,A={};;){if(S=s[s.length-1],this.defaultActions[S]?I=this.defaultActions[S]:(null==_&&(_=f()),I=a[S]&&a[S][_]),void 0===I||!I.length||!I[0]){var C="";for(T in q=[],a[S])this.terminals_[T]&&T>2&&q.push("'"+this.terminals_[T]+"'");C=m.showPosition?"Parse error on line "+(o+1)+":\n"+m.showPosition()+"\nExpecting "+q.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(o+1)+": Unexpected "+(1==_?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(C,{text:m.match,token:this.terminals_[_]||_,line:m.yylineno,loc:p,expected:q})}if(I[0]instanceof Array&&I.length>1)throw new Error("Parse Error: multiple actions possible at state: "+S+", token: "+_);switch(I[0]){case 1:s.push(_),n.push(m.yytext),r.push(m.yylloc),s.push(I[1]),_=null,g?(_=g,g=null):(h=m.yyleng,c=m.yytext,o=m.yylineno,p=m.yylloc,u>0&&u--);break;case 2:if(k=this.productions_[I[1]][1],A.$=n[n.length-k],A._$={first_line:r[r.length-(k||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(k||1)].first_column,last_column:r[r.length-1].last_column},R&&(A._$.range=[r[r.length-(k||1)].range[0],r[r.length-1].range[1]]),void 0!==(b=this.performAction.apply(A,[c,h,o,d.yy,I[1],n,r].concat(y))))return b;k&&(s=s.slice(0,-1*k*2),n=n.slice(0,-1*k),r=r.slice(0,-1*k)),s.push(this.productions_[I[1]][0]),n.push(A.$),r.push(A._$),N=a[s[s.length-2]][s[s.length-1]],s.push(N);break;case 3:return!0}}return!0},"parse")},he=function(){return{EOF:1,parseError:(0,l.K2)(function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)},"parseError"),setInput:(0,l.K2)(function(e,t){return this.yy=t||this.yy||{},this._input=e,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,l.K2)(function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e},"input"),unput:(0,l.K2)(function(e){var t=e.length,s=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this},"unput"),more:(0,l.K2)(function(){return this._more=!0,this},"more"),reject:(0,l.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,l.K2)(function(e){this.unput(this.match.slice(e))},"less"),pastInput:(0,l.K2)(function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,l.K2)(function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,l.K2)(function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"},"showPosition"),test_match:(0,l.K2)(function(e,t){var s,i,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(e[0].length),this.matched+=e[0],s=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1},"test_match"),next:(0,l.K2)(function(){if(this.done)return this.EOF;var e,t,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;r<n.length;r++)if((s=this._input.match(this.rules[n[r]]))&&(!t||s[0].length>t[0].length)){if(t=s,i=r,this.options.backtrack_lexer){if(!1!==(e=this.test_match(s,n[r])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,n[i]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,l.K2)(function(){var e=this.next();return e||this.lex()},"lex"),begin:(0,l.K2)(function(e){this.conditionStack.push(e)},"begin"),popState:(0,l.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,l.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,l.K2)(function(e){return(e=this.conditionStack.length-1-Math.abs(e||0))>=0?this.conditionStack[e]:"INITIAL"},"topState"),pushState:(0,l.K2)(function(e){this.begin(e)},"pushState"),stateStackSize:(0,l.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,l.K2)(function(e,t,s,i){switch(s){case 0:return"title";case 1:return this.begin("acc_title"),9;case 2:return this.popState(),"acc_title_value";case 3:return this.begin("acc_descr"),11;case 4:return this.popState(),"acc_descr_value";case 5:this.begin("acc_descr_multiline");break;case 6:case 58:case 65:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:case 14:case 15:case 56:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;case 50:case 68:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 57:case 64:this.begin("string");break;case 59:return this.begin("style"),72;case 60:return this.begin("style"),74;case 61:return 61;case 62:return 64;case 63:return 63;case 66:return"qString";case 67:return t.yytext=t.yytext.trim(),89;case 69:return 80;case 70:return 76}},"anonymous"),rules:[/^(?:title\s[^#\n;]+)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:$)/i,/^(?:requirementDiagram\b)/i,/^(?:\{)/i,/^(?:\})/i,/^(?::{3})/i,/^(?::)/i,/^(?:id\b)/i,/^(?:text\b)/i,/^(?:risk\b)/i,/^(?:verifyMethod\b)/i,/^(?:requirement\b)/i,/^(?:functionalRequirement\b)/i,/^(?:interfaceRequirement\b)/i,/^(?:performanceRequirement\b)/i,/^(?:physicalRequirement\b)/i,/^(?:designConstraint\b)/i,/^(?:low\b)/i,/^(?:medium\b)/i,/^(?:high\b)/i,/^(?:analysis\b)/i,/^(?:demonstration\b)/i,/^(?:inspection\b)/i,/^(?:test\b)/i,/^(?:element\b)/i,/^(?:contains\b)/i,/^(?:copies\b)/i,/^(?:derives\b)/i,/^(?:satisfies\b)/i,/^(?:verifies\b)/i,/^(?:refines\b)/i,/^(?:traces\b)/i,/^(?:type\b)/i,/^(?:docref\b)/i,/^(?:style\b)/i,/^(?:\w+)/i,/^(?::)/i,/^(?:;)/i,/^(?:%)/i,/^(?:-)/i,/^(?:#)/i,/^(?: )/i,/^(?:["])/i,/^(?:\n)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:<-)/i,/^(?:->)/i,/^(?:-)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[\w][^:,\r\n\{\<\>\-\=]*)/i,/^(?:\w+)/i,/^(?:[0-9]+)/i,/^(?:,)/i],conditions:{acc_descr_multiline:{rules:[6,7,68,69,70],inclusive:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,59,60,61,62,63,64,67,68,69,70],inclusive:!0}}}}();function ue(){this.yy={}}return oe.lexer=he,(0,l.K2)(ue,"Parser"),ue.prototype=oe,oe.Parser=ue,new ue}();c.parser=c;var o=c,h=class{constructor(){this.relations=[],this.latestRequirement=this.getInitialRequirement(),this.requirements=new Map,this.latestElement=this.getInitialElement(),this.elements=new Map,this.classes=new Map,this.direction="TB",this.RequirementType={REQUIREMENT:"Requirement",FUNCTIONAL_REQUIREMENT:"Functional Requirement",INTERFACE_REQUIREMENT:"Interface Requirement",PERFORMANCE_REQUIREMENT:"Performance Requirement",PHYSICAL_REQUIREMENT:"Physical Requirement",DESIGN_CONSTRAINT:"Design Constraint"},this.RiskLevel={LOW_RISK:"Low",MED_RISK:"Medium",HIGH_RISK:"High"},this.VerifyType={VERIFY_ANALYSIS:"Analysis",VERIFY_DEMONSTRATION:"Demonstration",VERIFY_INSPECTION:"Inspection",VERIFY_TEST:"Test"},this.Relationships={CONTAINS:"contains",COPIES:"copies",DERIVES:"derives",SATISFIES:"satisfies",VERIFIES:"verifies",REFINES:"refines",TRACES:"traces"},this.setAccTitle=l.SV,this.getAccTitle=l.iN,this.setAccDescription=l.EI,this.getAccDescription=l.m7,this.setDiagramTitle=l.ke,this.getDiagramTitle=l.ab,this.getConfig=(0,l.K2)(()=>(0,l.D7)().requirement,"getConfig"),this.clear(),this.setDirection=this.setDirection.bind(this),this.addRequirement=this.addRequirement.bind(this),this.setNewReqId=this.setNewReqId.bind(this),this.setNewReqRisk=this.setNewReqRisk.bind(this),this.setNewReqText=this.setNewReqText.bind(this),this.setNewReqVerifyMethod=this.setNewReqVerifyMethod.bind(this),this.addElement=this.addElement.bind(this),this.setNewElementType=this.setNewElementType.bind(this),this.setNewElementDocRef=this.setNewElementDocRef.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setCssStyle=this.setCssStyle.bind(this),this.setClass=this.setClass.bind(this),this.defineClass=this.defineClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{(0,l.K2)(this,"RequirementDB")}getDirection(){return this.direction}setDirection(e){this.direction=e}resetLatestRequirement(){this.latestRequirement=this.getInitialRequirement()}resetLatestElement(){this.latestElement=this.getInitialElement()}getInitialRequirement(){return{requirementId:"",text:"",risk:"",verifyMethod:"",name:"",type:"",cssStyles:[],classes:["default"]}}getInitialElement(){return{name:"",type:"",docRef:"",cssStyles:[],classes:["default"]}}addRequirement(e,t){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:t,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){void 0!==this.latestRequirement&&(this.latestRequirement.requirementId=e)}setNewReqText(e){void 0!==this.latestRequirement&&(this.latestRequirement.text=e)}setNewReqRisk(e){void 0!==this.latestRequirement&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){void 0!==this.latestRequirement&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),l.Rm.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){void 0!==this.latestElement&&(this.latestElement.type=e)}setNewElementDocRef(e){void 0!==this.latestElement&&(this.latestElement.docRef=e)}addRelationship(e,t,s){this.relations.push({type:e,src:t,dst:s})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,(0,l.IU)()}setCssStyle(e,t){for(const s of e){const e=this.requirements.get(s)??this.elements.get(s);if(!t||!e)return;for(const s of t)s.includes(",")?e.cssStyles.push(...s.split(",")):e.cssStyles.push(s)}}setClass(e,t){for(const s of e){const e=this.requirements.get(s)??this.elements.get(s);if(e)for(const s of t){e.classes.push(s);const t=this.classes.get(s)?.styles;t&&e.cssStyles.push(...t)}}}defineClass(e,t){for(const s of e){let e=this.classes.get(s);void 0===e&&(e={id:s,styles:[],textStyles:[]},this.classes.set(s,e)),t&&t.forEach(function(t){if(/color/.exec(t)){const s=t.replace("fill","bgFill");e.textStyles.push(s)}e.styles.push(t)}),this.requirements.forEach(e=>{e.classes.includes(s)&&e.cssStyles.push(...t.flatMap(e=>e.split(",")))}),this.elements.forEach(e=>{e.classes.includes(s)&&e.cssStyles.push(...t.flatMap(e=>e.split(",")))})}}getClasses(){return this.classes}getData(){const e=(0,l.D7)(),t=[],s=[];for(const i of this.requirements.values()){const s=i;s.id=i.name,s.cssStyles=i.cssStyles,s.cssClasses=i.classes.join(" "),s.shape="requirementBox",s.look=e.look,t.push(s)}for(const i of this.elements.values()){const s=i;s.shape="requirementBox",s.look=e.look,s.id=i.name,s.cssStyles=i.cssStyles,s.cssClasses=i.classes.join(" "),t.push(s)}for(const i of this.relations){let t=0;const n=i.type===this.Relationships.CONTAINS,r={id:`${i.src}-${i.dst}-${t}`,start:this.requirements.get(i.src)?.name??this.elements.get(i.src)?.name,end:this.requirements.get(i.dst)?.name??this.elements.get(i.dst)?.name,label:`<<${i.type}>>`,classes:"relationshipLine",style:["fill:none",n?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:n?"normal":"dashed",arrowTypeStart:n?"requirement_contains":"",arrowTypeEnd:n?"":"requirement_arrow",look:e.look};s.push(r),t++}return{nodes:t,edges:s,other:{},config:e,direction:this.getDirection()}}},u=(0,l.K2)(e=>`\n\n marker {\n fill: ${e.relationColor};\n stroke: ${e.relationColor};\n }\n\n marker.cross {\n stroke: ${e.lineColor};\n }\n\n svg {\n font-family: ${e.fontFamily};\n font-size: ${e.fontSize};\n }\n\n .reqBox {\n fill: ${e.requirementBackground};\n fill-opacity: 1.0;\n stroke: ${e.requirementBorderColor};\n stroke-width: ${e.requirementBorderSize};\n }\n \n .reqTitle, .reqLabel{\n fill: ${e.requirementTextColor};\n }\n .reqLabelBox {\n fill: ${e.relationLabelBackground};\n fill-opacity: 1.0;\n }\n\n .req-title-line {\n stroke: ${e.requirementBorderColor};\n stroke-width: ${e.requirementBorderSize};\n }\n .relationshipLine {\n stroke: ${e.relationColor};\n stroke-width: 1;\n }\n .relationshipLabel {\n fill: ${e.relationLabelColor};\n }\n .divider {\n stroke: ${e.nodeBorder};\n stroke-width: 1;\n }\n .label {\n font-family: ${e.fontFamily};\n color: ${e.nodeTextColor||e.textColor};\n }\n .label text,span {\n fill: ${e.nodeTextColor||e.textColor};\n color: ${e.nodeTextColor||e.textColor};\n }\n .labelBkg {\n background-color: ${e.edgeLabelBackground};\n }\n\n`,"getStyles"),y={};(0,l.VA)(y,{draw:()=>m});var m=(0,l.K2)(async function(e,t,s,c){l.Rm.info("REF0:"),l.Rm.info("Drawing requirement diagram (unified)",t);const{securityLevel:o,state:h,layout:u}=(0,l.D7)(),y=c.db.getData(),m=(0,i.A)(t,o);y.type=c.type,y.layoutAlgorithm=(0,r.q7)(u),y.nodeSpacing=h?.nodeSpacing??50,y.rankSpacing=h?.rankSpacing??50,y.markers=["requirement_contains","requirement_arrow"],y.diagramId=t,await(0,r.XX)(y,m);a._K.insertTitle(m,"requirementDiagramTitleText",h?.titleTopMargin??25,c.db.getDiagramTitle()),(0,n.P)(m,8,"requirementDiagram",h?.useMaxWidth??!0)},"draw"),d={parser:o,get db(){return new h},renderer:y,styles:u}},91544:(e,t,s)=>{s.d(t,{A:()=>r});var i=s(97485),n=s(3170),r=(0,i.K2)((e,t)=>{let s;"sandbox"===t&&(s=(0,n.Ltv)("#i"+e));return("sandbox"===t?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${e}"]`)},"getDiagramElement")}}]); \ No newline at end of file diff --git a/assets/js/627bdb5d.ae8f63fd.js b/assets/js/627bdb5d.ae8f63fd.js new file mode 100644 index 0000000000..a28b24f528 --- /dev/null +++ b/assets/js/627bdb5d.ae8f63fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2817],{65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}},72273:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.11.1/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.11.1/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/must_be_api.md","tags":[],"version":"0.11.1","frontMatter":{"id":"must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.1/rules/unused"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.1/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/62cdf0e0.2cdd70b2.js b/assets/js/62cdf0e0.2cdd70b2.js new file mode 100644 index 0000000000..a5a1e4e475 --- /dev/null +++ b/assets/js/62cdf0e0.2cdd70b2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8439],{20527:(n,e,t)=>{t.r(e),t.d(e,{assets:()=>c,contentTitle:()=>s,default:()=>l,frontMatter:()=>a,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.10.0/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.10.0/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/configuration.mdx","tags":[],"version":"0.10.0","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Basics","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.10.0/"}}');var r=t(23420),i=t(65404);const a={id:"configuration",sidebar_label:"Configuration"},s=void 0,c={},d=[];function u(n){const e={code:"code",pre:"pre",...(0,i.R)(),...n.components};return(0,r.jsx)(e.pre,{children:(0,r.jsx)(e.code,{className:"language-kotlin",children:'plugins {\n id("com.rickbusarow.module-check") version "0.10.0"\n}\n\nmoduleCheck {\n\n checks {\n redundant.set(false)\n disableAndroidResources.set(false)\n disableViewBinding.set(false)\n }\n\n alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))\n ignoreAll.set(setOf(":app_ble"))\n\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "Roomigrant",\n processor = "com.github.RickBusarow.Roomigrant:RoomigrantCompiler",\n annotationImports = listOf(\n "dev\\\\.matrix\\\\.roomigrant\\\\.\\\\*",\n "dev\\\\.matrix\\\\.roomigrant\\\\.GenerateRoomMigrations",\n "dev\\\\.matrix\\\\.roomigrant\\\\.rules\\\\.\\\\*",\n "dev\\\\.matrix\\\\.roomigrant\\\\.rules\\\\.FieldMigrationRule",\n "dev\\\\.matrix\\\\.roomigrant\\\\.rules\\\\.OnMigrationEndRule",\n "dev\\\\.matrix\\\\.roomigrant\\\\.rules\\\\.OnMigrationStartRule"\n )\n ),\n modulecheck.api.KaptMatcher(\n name = "VMInject",\n processor = "my-project.codegen.vminject:processor",\n annotationImports = listOf(\n "vminject\\\\.\\\\*",\n "vminject\\\\.VMInject",\n "vminject\\\\.VMInject\\\\.Source",\n "vminject\\\\.VMInjectParam",\n "vminject\\\\.VMInjectModule"\n )\n )\n )\n )\n}\n'})})}function l(n={}){const{wrapper:e}={...(0,i.R)(),...n.components};return e?(0,r.jsx)(e,{...n,children:(0,r.jsx)(u,{...n})}):u(n)}},65404:(n,e,t)=>{t.d(e,{R:()=>a,x:()=>s});var o=t(36672);const r={},i=o.createContext(r);function a(n){const e=o.useContext(i);return o.useMemo(function(){return"function"==typeof n?n(e):{...e,...n}},[e,n])}function s(n){let e;return e=n.disableParentContext?"function"==typeof n.components?n.components(r):n.components||r:a(n.components),o.createElement(i.Provider,{value:e},n.children)}}}]); \ No newline at end of file diff --git a/assets/js/64018eb5.14ae6d1d.js b/assets/js/64018eb5.14ae6d1d.js new file mode 100644 index 0000000000..99e4c42bf5 --- /dev/null +++ b/assets/js/64018eb5.14ae6d1d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6494],{58994:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>t,metadata:()=>d,toc:()=>l});const d=JSON.parse('{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.11.1/rules/android/disable_viewbinding.md","sourceDirName":"rules/android","slug":"/rules/android/disable_viewbinding","permalink":"/ModuleCheck/docs/0.11.1/rules/android/disable_viewbinding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/android/disable_viewbinding.md","tags":[],"version":"0.11.1","frontMatter":{"id":"disable_viewbinding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.1/rules/android/disable_resources"}}');var s=i(23420),o=i(65404);const t={id:"disable_viewbinding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,a={},l=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>r});var d=i(36672);const s={},o=d.createContext(s);function t(e){const n=d.useContext(o);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),d.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6508.73a823cb.js b/assets/js/6508.73a823cb.js new file mode 100644 index 0000000000..ec89acaf5d --- /dev/null +++ b/assets/js/6508.73a823cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6508],{26508:(e,r,a)=>{a.d(r,{diagram:()=>c});var t=a(84926),n=a(47765),s=a(97485),d=a(99339),i={parse:(0,s.K2)(async e=>{const r=await(0,d.qg)("info",e);s.Rm.debug(r)},"parse")},o={version:t.n.version+""},c={parser:i,db:{getVersion:(0,s.K2)(()=>o.version,"getVersion")},renderer:{draw:(0,s.K2)((e,r,a)=>{s.Rm.debug("rendering info diagram\n"+e);const t=(0,n.D)(r);(0,s.a$)(t,100,400,!0);t.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${a}`)},"draw")}}}}]); \ No newline at end of file diff --git a/assets/js/6518a949.2a328af4.js b/assets/js/6518a949.2a328af4.js new file mode 100644 index 0000000000..3a31b24703 --- /dev/null +++ b/assets/js/6518a949.2a328af4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8904],{87834:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.12.4","label":"0.12.4","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.12.4","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.12.4/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.12.4/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/0.12.4/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/0.12.4/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.12.4/rules/unused_dependency","docId":"rules/unused_dependency","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.12.4/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.12.4/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/0.12.4/rules/redundant_dependency","docId":"rules/redundant_dependency","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/0.12.4/rules/overshot_dependency","docId":"rules/overshot_dependency","unlisted":false},{"type":"link","label":"Project Depth","href":"/ModuleCheck/docs/0.12.4/rules/project_depth","docId":"rules/project_depth","unlisted":false},{"type":"category","label":"Compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory Generation","href":"/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation","docId":"rules/compiler/use_anvil_factory_generation","unlisted":false},{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor","docId":"rules/compiler/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin","docId":"rules/compiler/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers","docId":"rules/compiler/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.12.4/rules/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.12.4/rules/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.12.4/rules/disable_android_resources","docId":"rules/android/disable_android_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.12.4/rules/disable_view_binding","docId":"rules/android/disable_view_binding","unlisted":false},{"type":"link","label":"Unused Kotlin Android Extensions","href":"/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensions","docId":"rules/android/unused_kotlin_android_extensions","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"Dependencies","sidebar":"Docs"},"rules/android/disable_android_resources":{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_view_binding":{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/android/unused_kotlin_android_extensions":{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","sidebar":"Docs"},"rules/compiler/custom_kapt_matchers":{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/compiler/unused_kapt_plugin":{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","sidebar":"Docs"},"rules/compiler/unused_kapt_processor":{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/compiler/use_anvil_factory_generation":{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/overshot_dependency":{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","sidebar":"Docs"},"rules/project_depth":{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","sidebar":"Docs"},"rules/redundant_dependency":{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused_dependency":{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/66e00e19.3dc8d15e.js b/assets/js/66e00e19.3dc8d15e.js new file mode 100644 index 0000000000..4f301f6cff --- /dev/null +++ b/assets/js/66e00e19.3dc8d15e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5939],{24094:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","source":"@site/versioned_docs/version-0.12.5/rules/project_depth.md","sourceDirName":"rules","slug":"/rules/project_depth","permalink":"/ModuleCheck/docs/rules/project_depth","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/project_depth.md","tags":[],"version":"0.12.5","frontMatter":{"id":"project_depth","slug":"/rules/project_depth","title":"Project Depth","sidebar_label":"Project Depth"},"sidebar":"Docs","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/rules/overshot_dependency"},"next":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/rules/use_anvil_factory_generation"}}');var r=l(23420),t=l(65404);const d={id:"project_depth",slug:"/rules/project_depth",title:"Project Depth",sidebar_label:"Project Depth"},i=void 0,c={},o=[{value:"Dependencies and Build Concurrency",id:"dependencies-and-build-concurrency",level:3},{value:"Depth",id:"depth",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",mermaid:"mermaid",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"TL;DR - Low depth values mean faster builds and better all-around scalability."}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["It's often useful to think of module dependencies as a directed tree\nor ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Directed_acyclic_graph",children:"directed acyclic graph"}),". If a module is a\nnode, then each module dependency is a child node, and the dependencies of those dependencies are\ngrand-child nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["This is especially useful when thinking about ",(0,r.jsx)(n.strong,{children:"build performance"}),", because the parent-child\nrelationship is clear: ",(0,r.jsx)(n.em,{children:"child nodes must build before parent nodes"}),"."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(:app):::depth2\n\n screen1(:screen-1):::depth1\n screen2(:screen-2):::depth1\n\n lib1(:lib-1):::depth0\n lib2(:lib-2):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n\n screen1 --\x3e lib1\n screen1 --\x3e lib2\n screen2 --\x3e lib2"}),"\n",(0,r.jsx)(n.p,{children:"In the above example,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," must be built before ",(0,r.jsx)(n.code,{children:":screen-1"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-2"})," must be build before ",(0,r.jsx)(n.code,{children:":screen-2"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":screen-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," must be built before ",(0,r.jsx)(n.code,{children:":app"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build\nbefore their parents."}),"\n",(0,r.jsx)(n.h3,{id:"dependencies-and-build-concurrency",children:"Dependencies and Build Concurrency"}),"\n",(0,r.jsx)(n.p,{children:"Individual module builds are always done single-threaded, but multiple modules may build in parallel\nso long as no module in the set depends upon another module in that set. In the above graph,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":scren-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The maximum number of parallel module builds is determined by the structure of the dependency graph\nand the number of available processor cores on the machine which is performing the build."}),"\n",(0,r.jsx)(n.h3,{id:"depth",children:"Depth"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Depth"})," refers to the maximum number of edges between a module and each of its leaf nodes in the\nproject dependency graph."]}),"\n",(0,r.jsx)(n.p,{children:"Low depth values indicate a shallow or flat project structure with loose (or no) coupling between\nmodules. In a full build, these projects scale well with hardware upgrades because they're able to\nbuild all those independent modules in parallel."}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n subgraph sg [A shallow graph]\n direction TB\n\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 2):::depth2\n\n screen1(depth: 1):::depth1\n screen2(depth: 1):::depth1\n screen3(depth: 1):::depth1\n screen4(depth: 1):::depth1\n\n lib1(depth: 0):::depth0\n lib2(depth: 0):::depth0\n lib3(depth: 0):::depth0\n lib4(depth: 0):::depth0\n lib5(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e lib1\n screen1 --\x3e lib4\n\n screen2 --\x3e lib1\n screen2 --\x3e lib3\n screen2 --\x3e lib4\n\n screen3 --\x3e lib2\n screen3 --\x3e lib3\n screen3 --\x3e lib4\n\n screen4 --\x3e lib3\n screen4 --\x3e lib5\n\n end\n\n style sg opacity:0.0\n"}),"\n",(0,r.jsxs)(n.p,{children:['On the other hand, "deep" projects do not offer many opportunities for parallelization. They have\nproject dependencies which must be built ',(0,r.jsx)(n.em,{children:"sequentially"}),". They also perform poorly in incremental\nbuilds, because a single change to even a mid-level module invalidates cached builds for half of the\nproject."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n style sg opacity:0.0\n subgraph sg [A deep graph]\n direction TB\n\n classDef depth6 fill:#800,stroke:#000,color:#FFF\n classDef depth5 fill:#A50,stroke:#000,color:#FFF\n classDef depth4 fill:#C0B,stroke:#000,color:#000\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 6):::depth6\n\n screen1(depth: 5):::depth5\n screen2(depth: 5):::depth5\n\n screen3(depth: 4):::depth4\n screen4(depth: 4):::depth4\n\n lib1(depth: 3):::depth3\n lib2(depth: 3):::depth3\n\n lib3(depth: 2):::depth2\n lib4(depth: 2):::depth2\n\n lib5(depth: 1):::depth1\n\n lib6(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e screen3\n screen1 --\x3e screen4\n\n screen2 --\x3e screen4\n\n screen3 --\x3e lib1\n screen3 --\x3e lib2\n\n screen4 --\x3e lib1\n screen4 --\x3e lib4\n\n lib1 --\x3e lib3\n lib1 --\x3e lib4\n\n lib2 --\x3e lib3\n\n lib3 --\x3e lib5\n lib4 --\x3e lib5\n\n lib5 --\x3e lib6\n\n end\n"})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},65404:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>i});var s=l(36672);const r={},t=s.createContext(r);function d(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6767.25a30352.js b/assets/js/6767.25a30352.js new file mode 100644 index 0000000000..8f7b87cd5d --- /dev/null +++ b/assets/js/6767.25a30352.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6767],{16767:(t,e,s)=>{s.d(e,{diagram:()=>m});var i=s(91544),n=s(44533),r=s(80284),a=(s(61923),s(290),s(49636),s(267),s(29951),s(63727),s(9420)),c=s(97485),o=s(3170),l=s(80124),h=s(30941),u=function(){var t=(0,c.K2)(function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s},"o"),e=[6,8,10,22,24,26,28,33,34,35,36,37,40,43,44,50],s=[1,10],i=[1,11],n=[1,12],r=[1,13],a=[1,20],o=[1,21],l=[1,22],h=[1,23],u=[1,24],y=[1,19],d=[1,25],p=[1,26],_=[1,18],g=[1,33],b=[1,34],m=[1,35],f=[1,36],E=[1,37],k=[6,8,10,13,15,17,20,21,22,24,26,28,33,34,35,36,37,40,43,44,50,63,64,65,66,67],S=[1,42],O=[1,43],T=[1,52],A=[40,50,68,69],R=[1,63],N=[1,61],I=[1,58],C=[1,62],x=[1,64],v=[6,8,10,13,17,22,24,26,28,33,34,35,36,37,40,41,42,43,44,48,49,50,63,64,65,66,67],D=[63,64,65,66,67],$=[1,81],w=[1,80],K=[1,78],L=[1,79],M=[6,10,42,47],B=[6,10,13,41,42,47,48,49],F=[1,89],P=[1,88],Y=[1,87],G=[19,56],z=[1,98],U=[1,97],Z=[19,56,58,60],j={trace:(0,c.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,ER_DIAGRAM:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NEWLINE:10,entityName:11,relSpec:12,COLON:13,role:14,STYLE_SEPARATOR:15,idList:16,BLOCK_START:17,attributes:18,BLOCK_STOP:19,SQS:20,SQE:21,title:22,title_value:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,direction:29,classDefStatement:30,classStatement:31,styleStatement:32,direction_tb:33,direction_bt:34,direction_rl:35,direction_lr:36,CLASSDEF:37,stylesOpt:38,separator:39,UNICODE_TEXT:40,STYLE_TEXT:41,COMMA:42,CLASS:43,STYLE:44,style:45,styleComponent:46,SEMI:47,NUM:48,BRKT:49,ENTITY_NAME:50,attribute:51,attributeType:52,attributeName:53,attributeKeyTypeList:54,attributeComment:55,ATTRIBUTE_WORD:56,attributeKeyType:57,",":58,ATTRIBUTE_KEY:59,COMMENT:60,cardinality:61,relType:62,ZERO_OR_ONE:63,ZERO_OR_MORE:64,ONE_OR_MORE:65,ONLY_ONE:66,MD_PARENT:67,NON_IDENTIFYING:68,IDENTIFYING:69,WORD:70,$accept:0,$end:1},terminals_:{2:"error",4:"ER_DIAGRAM",6:"EOF",8:"SPACE",10:"NEWLINE",13:"COLON",15:"STYLE_SEPARATOR",17:"BLOCK_START",19:"BLOCK_STOP",20:"SQS",21:"SQE",22:"title",23:"title_value",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"direction_tb",34:"direction_bt",35:"direction_rl",36:"direction_lr",37:"CLASSDEF",40:"UNICODE_TEXT",41:"STYLE_TEXT",42:"COMMA",43:"CLASS",44:"STYLE",47:"SEMI",48:"NUM",49:"BRKT",50:"ENTITY_NAME",56:"ATTRIBUTE_WORD",58:",",59:"ATTRIBUTE_KEY",60:"COMMENT",63:"ZERO_OR_ONE",64:"ZERO_OR_MORE",65:"ONE_OR_MORE",66:"ONLY_ONE",67:"MD_PARENT",68:"NON_IDENTIFYING",69:"IDENTIFYING",70:"WORD"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,5],[9,9],[9,7],[9,7],[9,4],[9,6],[9,3],[9,5],[9,1],[9,3],[9,7],[9,9],[9,6],[9,8],[9,4],[9,6],[9,2],[9,2],[9,2],[9,1],[9,1],[9,1],[9,1],[9,1],[29,1],[29,1],[29,1],[29,1],[30,4],[16,1],[16,1],[16,3],[16,3],[31,3],[32,4],[38,1],[38,3],[45,1],[45,2],[39,1],[39,1],[39,1],[46,1],[46,1],[46,1],[46,1],[11,1],[11,1],[18,1],[18,2],[51,2],[51,3],[51,3],[51,4],[52,1],[53,1],[54,1],[54,3],[57,1],[55,1],[12,3],[61,1],[61,1],[61,1],[61,1],[61,1],[62,1],[62,1],[14,1],[14,1],[14,1]],performAction:(0,c.K2)(function(t,e,s,i,n,r,a){var c=r.length-1;switch(n){case 1:break;case 2:case 6:case 7:this.$=[];break;case 3:r[c-1].push(r[c]),this.$=r[c-1];break;case 4:case 5:case 55:case 78:case 62:case 63:case 66:this.$=r[c];break;case 8:i.addEntity(r[c-4]),i.addEntity(r[c-2]),i.addRelationship(r[c-4],r[c],r[c-2],r[c-3]);break;case 9:i.addEntity(r[c-8]),i.addEntity(r[c-4]),i.addRelationship(r[c-8],r[c],r[c-4],r[c-5]),i.setClass([r[c-8]],r[c-6]),i.setClass([r[c-4]],r[c-2]);break;case 10:i.addEntity(r[c-6]),i.addEntity(r[c-2]),i.addRelationship(r[c-6],r[c],r[c-2],r[c-3]),i.setClass([r[c-6]],r[c-4]);break;case 11:i.addEntity(r[c-6]),i.addEntity(r[c-4]),i.addRelationship(r[c-6],r[c],r[c-4],r[c-5]),i.setClass([r[c-4]],r[c-2]);break;case 12:i.addEntity(r[c-3]),i.addAttributes(r[c-3],r[c-1]);break;case 13:i.addEntity(r[c-5]),i.addAttributes(r[c-5],r[c-1]),i.setClass([r[c-5]],r[c-3]);break;case 14:i.addEntity(r[c-2]);break;case 15:i.addEntity(r[c-4]),i.setClass([r[c-4]],r[c-2]);break;case 16:i.addEntity(r[c]);break;case 17:i.addEntity(r[c-2]),i.setClass([r[c-2]],r[c]);break;case 18:i.addEntity(r[c-6],r[c-4]),i.addAttributes(r[c-6],r[c-1]);break;case 19:i.addEntity(r[c-8],r[c-6]),i.addAttributes(r[c-8],r[c-1]),i.setClass([r[c-8]],r[c-3]);break;case 20:i.addEntity(r[c-5],r[c-3]);break;case 21:i.addEntity(r[c-7],r[c-5]),i.setClass([r[c-7]],r[c-2]);break;case 22:i.addEntity(r[c-3],r[c-1]);break;case 23:i.addEntity(r[c-5],r[c-3]),i.setClass([r[c-5]],r[c]);break;case 24:case 25:this.$=r[c].trim(),i.setAccTitle(this.$);break;case 26:case 27:this.$=r[c].trim(),i.setAccDescription(this.$);break;case 32:i.setDirection("TB");break;case 33:i.setDirection("BT");break;case 34:i.setDirection("RL");break;case 35:i.setDirection("LR");break;case 36:this.$=r[c-3],i.addClass(r[c-2],r[c-1]);break;case 37:case 38:case 56:case 64:case 43:this.$=[r[c]];break;case 39:case 40:this.$=r[c-2].concat([r[c]]);break;case 41:this.$=r[c-2],i.setClass(r[c-1],r[c]);break;case 42:this.$=r[c-3],i.addCssStyles(r[c-2],r[c-1]);break;case 44:case 65:r[c-2].push(r[c]),this.$=r[c-2];break;case 46:this.$=r[c-1]+r[c];break;case 54:case 76:case 77:case 67:this.$=r[c].replace(/"/g,"");break;case 57:r[c].push(r[c-1]),this.$=r[c];break;case 58:this.$={type:r[c-1],name:r[c]};break;case 59:this.$={type:r[c-2],name:r[c-1],keys:r[c]};break;case 60:this.$={type:r[c-2],name:r[c-1],comment:r[c]};break;case 61:this.$={type:r[c-3],name:r[c-2],keys:r[c-1],comment:r[c]};break;case 68:this.$={cardA:r[c],relType:r[c-1],cardB:r[c-2]};break;case 69:this.$=i.Cardinality.ZERO_OR_ONE;break;case 70:this.$=i.Cardinality.ZERO_OR_MORE;break;case 71:this.$=i.Cardinality.ONE_OR_MORE;break;case 72:this.$=i.Cardinality.ONLY_ONE;break;case 73:this.$=i.Cardinality.MD_PARENT;break;case 74:this.$=i.Identification.NON_IDENTIFYING;break;case 75:this.$=i.Identification.IDENTIFYING}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:9,22:s,24:i,26:n,28:r,29:14,30:15,31:16,32:17,33:a,34:o,35:l,36:h,37:u,40:y,43:d,44:p,50:_},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:27,11:9,22:s,24:i,26:n,28:r,29:14,30:15,31:16,32:17,33:a,34:o,35:l,36:h,37:u,40:y,43:d,44:p,50:_},t(e,[2,5]),t(e,[2,6]),t(e,[2,16],{12:28,61:32,15:[1,29],17:[1,30],20:[1,31],63:g,64:b,65:m,66:f,67:E}),{23:[1,38]},{25:[1,39]},{27:[1,40]},t(e,[2,27]),t(e,[2,28]),t(e,[2,29]),t(e,[2,30]),t(e,[2,31]),t(k,[2,54]),t(k,[2,55]),t(e,[2,32]),t(e,[2,33]),t(e,[2,34]),t(e,[2,35]),{16:41,40:S,41:O},{16:44,40:S,41:O},{16:45,40:S,41:O},t(e,[2,4]),{11:46,40:y,50:_},{16:47,40:S,41:O},{18:48,19:[1,49],51:50,52:51,56:T},{11:53,40:y,50:_},{62:54,68:[1,55],69:[1,56]},t(A,[2,69]),t(A,[2,70]),t(A,[2,71]),t(A,[2,72]),t(A,[2,73]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),{13:R,38:57,41:N,42:I,45:59,46:60,48:C,49:x},t(v,[2,37]),t(v,[2,38]),{16:65,40:S,41:O,42:I},{13:R,38:66,41:N,42:I,45:59,46:60,48:C,49:x},{13:[1,67],15:[1,68]},t(e,[2,17],{61:32,12:69,17:[1,70],42:I,63:g,64:b,65:m,66:f,67:E}),{19:[1,71]},t(e,[2,14]),{18:72,19:[2,56],51:50,52:51,56:T},{53:73,56:[1,74]},{56:[2,62]},{21:[1,75]},{61:76,63:g,64:b,65:m,66:f,67:E},t(D,[2,74]),t(D,[2,75]),{6:$,10:w,39:77,42:K,47:L},{40:[1,82],41:[1,83]},t(M,[2,43],{46:84,13:R,41:N,48:C,49:x}),t(B,[2,45]),t(B,[2,50]),t(B,[2,51]),t(B,[2,52]),t(B,[2,53]),t(e,[2,41],{42:I}),{6:$,10:w,39:85,42:K,47:L},{14:86,40:F,50:P,70:Y},{16:90,40:S,41:O},{11:91,40:y,50:_},{18:92,19:[1,93],51:50,52:51,56:T},t(e,[2,12]),{19:[2,57]},t(G,[2,58],{54:94,55:95,57:96,59:z,60:U}),t([19,56,59,60],[2,63]),t(e,[2,22],{15:[1,100],17:[1,99]}),t([40,50],[2,68]),t(e,[2,36]),{13:R,41:N,45:101,46:60,48:C,49:x},t(e,[2,47]),t(e,[2,48]),t(e,[2,49]),t(v,[2,39]),t(v,[2,40]),t(B,[2,46]),t(e,[2,42]),t(e,[2,8]),t(e,[2,76]),t(e,[2,77]),t(e,[2,78]),{13:[1,102],42:I},{13:[1,104],15:[1,103]},{19:[1,105]},t(e,[2,15]),t(G,[2,59],{55:106,58:[1,107],60:U}),t(G,[2,60]),t(Z,[2,64]),t(G,[2,67]),t(Z,[2,66]),{18:108,19:[1,109],51:50,52:51,56:T},{16:110,40:S,41:O},t(M,[2,44],{46:84,13:R,41:N,48:C,49:x}),{14:111,40:F,50:P,70:Y},{16:112,40:S,41:O},{14:113,40:F,50:P,70:Y},t(e,[2,13]),t(G,[2,61]),{57:114,59:z},{19:[1,115]},t(e,[2,20]),t(e,[2,23],{17:[1,116],42:I}),t(e,[2,11]),{13:[1,117],42:I},t(e,[2,10]),t(Z,[2,65]),t(e,[2,18]),{18:118,19:[1,119],51:50,52:51,56:T},{14:120,40:F,50:P,70:Y},{19:[1,121]},t(e,[2,21]),t(e,[2,9]),t(e,[2,19])],defaultActions:{52:[2,62],72:[2,57]},parseError:(0,c.K2)(function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)},"parseError"),parse:(0,c.K2)(function(t){var e=this,s=[0],i=[],n=[null],r=[],a=this.table,o="",l=0,h=0,u=0,y=r.slice.call(arguments,1),d=Object.create(this.lexer),p={yy:{}};for(var _ in this.yy)Object.prototype.hasOwnProperty.call(this.yy,_)&&(p.yy[_]=this.yy[_]);d.setInput(t,p.yy),p.yy.lexer=d,p.yy.parser=this,void 0===d.yylloc&&(d.yylloc={});var g=d.yylloc;r.push(g);var b=d.options&&d.options.ranges;function m(){var t;return"number"!=typeof(t=i.pop()||d.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,c.K2)(function(t){s.length=s.length-2*t,n.length=n.length-t,r.length=r.length-t},"popStack"),(0,c.K2)(m,"lex");for(var f,E,k,S,O,T,A,R,N,I={};;){if(k=s[s.length-1],this.defaultActions[k]?S=this.defaultActions[k]:(null==f&&(f=m()),S=a[k]&&a[k][f]),void 0===S||!S.length||!S[0]){var C="";for(T in N=[],a[k])this.terminals_[T]&&T>2&&N.push("'"+this.terminals_[T]+"'");C=d.showPosition?"Parse error on line "+(l+1)+":\n"+d.showPosition()+"\nExpecting "+N.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(C,{text:d.match,token:this.terminals_[f]||f,line:d.yylineno,loc:g,expected:N})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+f);switch(S[0]){case 1:s.push(f),n.push(d.yytext),r.push(d.yylloc),s.push(S[1]),f=null,E?(f=E,E=null):(h=d.yyleng,o=d.yytext,l=d.yylineno,g=d.yylloc,u>0&&u--);break;case 2:if(A=this.productions_[S[1]][1],I.$=n[n.length-A],I._$={first_line:r[r.length-(A||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(A||1)].first_column,last_column:r[r.length-1].last_column},b&&(I._$.range=[r[r.length-(A||1)].range[0],r[r.length-1].range[1]]),void 0!==(O=this.performAction.apply(I,[o,h,l,p.yy,S[1],n,r].concat(y))))return O;A&&(s=s.slice(0,-1*A*2),n=n.slice(0,-1*A),r=r.slice(0,-1*A)),s.push(this.productions_[S[1]][0]),n.push(I.$),r.push(I._$),R=a[s[s.length-2]][s[s.length-1]],s.push(R);break;case 3:return!0}}return!0},"parse")},W=function(){return{EOF:1,parseError:(0,c.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,c.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,c.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,c.K2)(function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,c.K2)(function(){return this._more=!0,this},"more"),reject:(0,c.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,c.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,c.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,c.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,c.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,c.K2)(function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1},"test_match"),next:(0,c.K2)(function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;r<n.length;r++)if((s=this._input.match(this.rules[n[r]]))&&(!e||s[0].length>e[0].length)){if(e=s,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,c.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,c.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,c.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,c.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,c.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,c.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,c.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,c.K2)(function(t,e,s,i){switch(s){case 0:return this.begin("acc_title"),24;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),26;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return 33;case 8:return 34;case 9:return 35;case 10:return 36;case 11:return 10;case 12:case 23:case 28:case 35:break;case 13:return 8;case 14:return 50;case 15:return 70;case 16:return 4;case 17:return this.begin("block"),17;case 18:case 19:case 38:return 49;case 20:case 37:return 42;case 21:return 15;case 22:case 36:return 13;case 24:return 59;case 25:case 26:return 56;case 27:return 60;case 29:return this.popState(),19;case 30:case 73:return e.yytext[0];case 31:return 20;case 32:return 21;case 33:return this.begin("style"),44;case 34:return this.popState(),10;case 39:return this.begin("style"),37;case 40:return 43;case 41:case 45:case 46:case 59:return 63;case 42:case 43:case 44:case 52:case 54:case 61:return 65;case 47:case 48:case 49:case 50:case 51:case 53:case 60:return 64;case 55:case 56:case 57:case 58:return 66;case 62:return 67;case 63:case 66:case 67:case 68:return 68;case 64:case 65:return 69;case 69:return 41;case 70:return 47;case 71:return 40;case 72:return 48;case 74:return 6}},"anonymous"),rules:[/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:[\s]+)/i,/^(?:"[^"%\r\n\v\b\\]+")/i,/^(?:"[^"]*")/i,/^(?:erDiagram\b)/i,/^(?:\{)/i,/^(?:#)/i,/^(?:#)/i,/^(?:,)/i,/^(?::::)/i,/^(?::)/i,/^(?:\s+)/i,/^(?:\b((?:PK)|(?:FK)|(?:UK))\b)/i,/^(?:([^\s]*)[~].*[~]([^\s]*))/i,/^(?:([\*A-Za-z_\u00C0-\uFFFF][A-Za-z0-9\-\_\[\]\(\)\u00C0-\uFFFF\*]*))/i,/^(?:"[^"]*")/i,/^(?:[\n]+)/i,/^(?:\})/i,/^(?:.)/i,/^(?:\[)/i,/^(?:\])/i,/^(?:style\b)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?::)/i,/^(?:,)/i,/^(?:#)/i,/^(?:classDef\b)/i,/^(?:class\b)/i,/^(?:one or zero\b)/i,/^(?:one or more\b)/i,/^(?:one or many\b)/i,/^(?:1\+)/i,/^(?:\|o\b)/i,/^(?:zero or one\b)/i,/^(?:zero or more\b)/i,/^(?:zero or many\b)/i,/^(?:0\+)/i,/^(?:\}o\b)/i,/^(?:many\(0\))/i,/^(?:many\(1\))/i,/^(?:many\b)/i,/^(?:\}\|)/i,/^(?:one\b)/i,/^(?:only one\b)/i,/^(?:1\b)/i,/^(?:\|\|)/i,/^(?:o\|)/i,/^(?:o\{)/i,/^(?:\|\{)/i,/^(?:\s*u\b)/i,/^(?:\.\.)/i,/^(?:--)/i,/^(?:to\b)/i,/^(?:optionally to\b)/i,/^(?:\.-)/i,/^(?:-\.)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:;)/i,/^(?:([^\x00-\x7F]|\w|-|\*)+)/i,/^(?:[0-9])/i,/^(?:.)/i,/^(?:$)/i],conditions:{style:{rules:[34,35,36,37,38,69,70],inclusive:!1},acc_descr_multiline:{rules:[5,6],inclusive:!1},acc_descr:{rules:[3],inclusive:!1},acc_title:{rules:[1],inclusive:!1},block:{rules:[23,24,25,26,27,28,29,30],inclusive:!1},INITIAL:{rules:[0,2,4,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,31,32,33,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,71,72,73,74],inclusive:!0}}}}();function X(){this.yy={}}return j.lexer=W,(0,c.K2)(X,"Parser"),X.prototype=j,j.Parser=X,new X}();u.parser=u;var y=u,d=class{constructor(){this.entities=new Map,this.relationships=[],this.classes=new Map,this.direction="TB",this.Cardinality={ZERO_OR_ONE:"ZERO_OR_ONE",ZERO_OR_MORE:"ZERO_OR_MORE",ONE_OR_MORE:"ONE_OR_MORE",ONLY_ONE:"ONLY_ONE",MD_PARENT:"MD_PARENT"},this.Identification={NON_IDENTIFYING:"NON_IDENTIFYING",IDENTIFYING:"IDENTIFYING"},this.setAccTitle=c.SV,this.getAccTitle=c.iN,this.setAccDescription=c.EI,this.getAccDescription=c.m7,this.setDiagramTitle=c.ke,this.getDiagramTitle=c.ab,this.getConfig=(0,c.K2)(()=>(0,c.D7)().er,"getConfig"),this.clear(),this.addEntity=this.addEntity.bind(this),this.addAttributes=this.addAttributes.bind(this),this.addRelationship=this.addRelationship.bind(this),this.setDirection=this.setDirection.bind(this),this.addCssStyles=this.addCssStyles.bind(this),this.addClass=this.addClass.bind(this),this.setClass=this.setClass.bind(this),this.setAccTitle=this.setAccTitle.bind(this),this.setAccDescription=this.setAccDescription.bind(this)}static{(0,c.K2)(this,"ErDB")}addEntity(t,e=""){return this.entities.has(t)?!this.entities.get(t)?.alias&&e&&(this.entities.get(t).alias=e,c.Rm.info(`Add alias '${e}' to entity '${t}'`)):(this.entities.set(t,{id:`entity-${t}-${this.entities.size}`,label:t,attributes:[],alias:e,shape:"erBox",look:(0,c.D7)().look??"default",cssClasses:"default",cssStyles:[]}),c.Rm.info("Added new entity :",t)),this.entities.get(t)}getEntity(t){return this.entities.get(t)}getEntities(){return this.entities}getClasses(){return this.classes}addAttributes(t,e){const s=this.addEntity(t);let i;for(i=e.length-1;i>=0;i--)e[i].keys||(e[i].keys=[]),e[i].comment||(e[i].comment=""),s.attributes.push(e[i]),c.Rm.debug("Added attribute ",e[i].name)}addRelationship(t,e,s,i){const n=this.entities.get(t),r=this.entities.get(s);if(!n||!r)return;const a={entityA:n.id,roleA:e,entityB:r.id,relSpec:i};this.relationships.push(a),c.Rm.debug("Added new relationship :",a)}getRelationships(){return this.relationships}getDirection(){return this.direction}setDirection(t){this.direction=t}getCompiledStyles(t){let e=[];for(const s of t){const t=this.classes.get(s);t?.styles&&(e=[...e,...t.styles??[]].map(t=>t.trim())),t?.textStyles&&(e=[...e,...t.textStyles??[]].map(t=>t.trim()))}return e}addCssStyles(t,e){for(const s of t){const t=this.entities.get(s);if(!e||!t)return;for(const s of e)t.cssStyles.push(s)}}addClass(t,e){t.forEach(t=>{let s=this.classes.get(t);void 0===s&&(s={id:t,styles:[],textStyles:[]},this.classes.set(t,s)),e&&e.forEach(function(t){if(/color/.exec(t)){const e=t.replace("fill","bgFill");s.textStyles.push(e)}s.styles.push(t)})})}setClass(t,e){for(const s of t){const t=this.entities.get(s);if(t)for(const s of e)t.cssClasses+=" "+s}}clear(){this.entities=new Map,this.classes=new Map,this.relationships=[],(0,c.IU)()}getData(){const t=[],e=[],s=(0,c.D7)();for(const n of this.entities.keys()){const e=this.entities.get(n);e&&(e.cssCompiledStyles=this.getCompiledStyles(e.cssClasses.split(" ")),t.push(e))}let i=0;for(const n of this.relationships){const t={id:(0,a.rY)(n.entityA,n.entityB,{prefix:"id",counter:i++}),type:"normal",curve:"basis",start:n.entityA,end:n.entityB,label:n.roleA,labelpos:"c",thickness:"normal",classes:"relationshipLine",arrowTypeStart:n.relSpec.cardB.toLowerCase(),arrowTypeEnd:n.relSpec.cardA.toLowerCase(),pattern:"IDENTIFYING"==n.relSpec.relType?"solid":"dashed",look:s.look};e.push(t)}return{nodes:t,edges:e,other:{},config:s,direction:"TB"}}},p={};(0,c.VA)(p,{draw:()=>_});var _=(0,c.K2)(async function(t,e,s,l){c.Rm.info("REF0:"),c.Rm.info("Drawing er diagram (unified)",e);const{securityLevel:h,er:u,layout:y}=(0,c.D7)(),d=l.db.getData(),p=(0,i.A)(e,h);d.type=l.type,d.layoutAlgorithm=(0,r.q7)(y),d.config.flowchart.nodeSpacing=u?.nodeSpacing||140,d.config.flowchart.rankSpacing=u?.rankSpacing||80,d.direction=l.db.getDirection(),d.markers=["only_one","zero_or_one","one_or_more","zero_or_more"],d.diagramId=e,await(0,r.XX)(d,p),"elk"===d.layoutAlgorithm&&p.select(".edges").lower();const _=p.selectAll('[id*="-background"]');Array.from(_).length>0&&_.each(function(){const t=(0,o.Ltv)(this),e=t.attr("id").replace("-background",""),s=p.select(`#${CSS.escape(e)}`);if(!s.empty()){const e=s.attr("transform");t.attr("transform",e)}});a._K.insertTitle(p,"erDiagramTitleText",u?.titleTopMargin??25,l.db.getDiagramTitle()),(0,n.P)(p,8,"erDiagram",u?.useMaxWidth??!0)},"draw"),g=(0,c.K2)((t,e)=>{const s=l.A,i=s(t,"r"),n=s(t,"g"),r=s(t,"b");return h.A(i,n,r,e)},"fade"),b=(0,c.K2)(t=>`\n .entityBox {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n }\n\n .relationshipLabelBox {\n fill: ${t.tertiaryColor};\n opacity: 0.7;\n background-color: ${t.tertiaryColor};\n rect {\n opacity: 0.5;\n }\n }\n\n .labelBkg {\n background-color: ${g(t.tertiaryColor,.5)};\n }\n\n .edgeLabel .label {\n fill: ${t.nodeBorder};\n font-size: 14px;\n }\n\n .label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .edge-pattern-dashed {\n stroke-dasharray: 8,8;\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon\n {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n .relationshipLine {\n stroke: ${t.lineColor};\n stroke-width: 1;\n fill: none;\n }\n\n .marker {\n fill: none !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n }\n`,"getStyles"),m={parser:y,get db(){return new d},renderer:p,styles:b}},44533:(t,e,s)=>{s.d(e,{P:()=>n});var i=s(97485),n=(0,i.K2)((t,e,s,n)=>{t.attr("class",s);const{width:c,height:o,x:l,y:h}=r(t,e);(0,i.a$)(t,o,c,n);const u=a(l,h,c,o,e);t.attr("viewBox",u),i.Rm.debug(`viewBox configured: ${u} with padding: ${e}`)},"setupViewPortForSVG"),r=(0,i.K2)((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}},"calculateDimensionsWithPadding"),a=(0,i.K2)((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`,"createViewBox")},80124:(t,e,s)=>{s.d(e,{A:()=>r});var i=s(46554),n=s(55385);const r=(t,e)=>i.A.lang.round(n.A.parse(t)[e])},91544:(t,e,s)=>{s.d(e,{A:()=>r});var i=s(97485),n=s(3170),r=(0,i.K2)((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)},"getDiagramElement")}}]); \ No newline at end of file diff --git a/assets/js/6bba662b.7a43db97.js b/assets/js/6bba662b.7a43db97.js new file mode 100644 index 0000000000..09c1b5d602 --- /dev/null +++ b/assets/js/6bba662b.7a43db97.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5296],{14954:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","source":"@site/docs/rules/project_depth.md","sourceDirName":"rules","slug":"/rules/project_depth","permalink":"/ModuleCheck/docs/next/rules/project_depth","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/project_depth.md","tags":[],"version":"current","frontMatter":{"id":"project_depth","slug":"/rules/project_depth","title":"Project Depth","sidebar_label":"Project Depth"},"sidebar":"Docs","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/next/rules/overshot_dependency"},"next":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/next/rules/use_anvil_factory_generation"}}');var t=l(23420),r=l(65404);const d={id:"project_depth",slug:"/rules/project_depth",title:"Project Depth",sidebar_label:"Project Depth"},i=void 0,c={},o=[{value:"Dependencies and Build Concurrency",id:"dependencies-and-build-concurrency",level:3},{value:"Depth",id:"depth",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",mermaid:"mermaid",p:"p",strong:"strong",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"TL;DR - Low depth values mean faster builds and better all-around scalability."}),"\n",(0,t.jsx)(n.hr,{}),"\n",(0,t.jsxs)(n.p,{children:["It's often useful to think of module dependencies as a directed tree\nor ",(0,t.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Directed_acyclic_graph",children:"directed acyclic graph"}),". If a module is a\nnode, then each module dependency is a child node, and the dependencies of those dependencies are\ngrand-child nodes."]}),"\n",(0,t.jsxs)(n.p,{children:["This is especially useful when thinking about ",(0,t.jsx)(n.strong,{children:"build performance"}),", because the parent-child\nrelationship is clear: ",(0,t.jsx)(n.em,{children:"child nodes must build before parent nodes"}),"."]}),"\n",(0,t.jsx)(n.mermaid,{value:"flowchart TB\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(:app):::depth2\n\n screen1(:screen-1):::depth1\n screen2(:screen-2):::depth1\n\n lib1(:lib-1):::depth0\n lib2(:lib-2):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n\n screen1 --\x3e lib1\n screen1 --\x3e lib2\n screen2 --\x3e lib2"}),"\n",(0,t.jsx)(n.p,{children:"In the above example,"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:":lib-1"})," and ",(0,t.jsx)(n.code,{children:":lib-2"})," must be built before ",(0,t.jsx)(n.code,{children:":screen-1"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:":lib-2"})," must be build before ",(0,t.jsx)(n.code,{children:":screen-2"}),"."]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:":screen-1"})," and ",(0,t.jsx)(n.code,{children:":screen-2"})," must be built before ",(0,t.jsx)(n.code,{children:":app"}),"."]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build\nbefore their parents."}),"\n",(0,t.jsx)(n.h3,{id:"dependencies-and-build-concurrency",children:"Dependencies and Build Concurrency"}),"\n",(0,t.jsx)(n.p,{children:"Individual module builds are always done single-threaded, but multiple modules may build in parallel\nso long as no module in the set depends upon another module in that set. In the above graph,"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:":lib-1"})," and ",(0,t.jsx)(n.code,{children:":lib-2"})," may build in parallel"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:":lib-1"})," and ",(0,t.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n",(0,t.jsxs)(n.li,{children:[(0,t.jsx)(n.code,{children:":scren-1"})," and ",(0,t.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n"]}),"\n",(0,t.jsx)(n.p,{children:"The maximum number of parallel module builds is determined by the structure of the dependency graph\nand the number of available processor cores on the machine which is performing the build."}),"\n",(0,t.jsx)(n.h3,{id:"depth",children:"Depth"}),"\n",(0,t.jsxs)(n.p,{children:[(0,t.jsx)(n.strong,{children:"Depth"})," refers to the maximum number of edges between a module and each of its leaf nodes in the\nproject dependency graph."]}),"\n",(0,t.jsx)(n.p,{children:"Low depth values indicate a shallow or flat project structure with loose (or no) coupling between\nmodules. In a full build, these projects scale well with hardware upgrades because they're able to\nbuild all those independent modules in parallel."}),"\n",(0,t.jsx)(n.mermaid,{value:"flowchart TB\n\n subgraph sg [A shallow graph]\n direction TB\n\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 2):::depth2\n\n screen1(depth: 1):::depth1\n screen2(depth: 1):::depth1\n screen3(depth: 1):::depth1\n screen4(depth: 1):::depth1\n\n lib1(depth: 0):::depth0\n lib2(depth: 0):::depth0\n lib3(depth: 0):::depth0\n lib4(depth: 0):::depth0\n lib5(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e lib1\n screen1 --\x3e lib4\n\n screen2 --\x3e lib1\n screen2 --\x3e lib3\n screen2 --\x3e lib4\n\n screen3 --\x3e lib2\n screen3 --\x3e lib3\n screen3 --\x3e lib4\n\n screen4 --\x3e lib3\n screen4 --\x3e lib5\n\n end\n\n style sg opacity:0.0\n"}),"\n",(0,t.jsxs)(n.p,{children:['On the other hand, "deep" projects do not offer many opportunities for parallelization. They have\nproject dependencies which must be built ',(0,t.jsx)(n.em,{children:"sequentially"}),". They also perform poorly in incremental\nbuilds, because a single change to even a mid-level module invalidates cached builds for half of the\nproject."]}),"\n",(0,t.jsx)(n.mermaid,{value:"flowchart TB\n\n style sg opacity:0.0\n subgraph sg [A deep graph]\n direction TB\n\n classDef depth6 fill:#800,stroke:#000,color:#FFF\n classDef depth5 fill:#A50,stroke:#000,color:#FFF\n classDef depth4 fill:#C0B,stroke:#000,color:#000\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 6):::depth6\n\n screen1(depth: 5):::depth5\n screen2(depth: 5):::depth5\n\n screen3(depth: 4):::depth4\n screen4(depth: 4):::depth4\n\n lib1(depth: 3):::depth3\n lib2(depth: 3):::depth3\n\n lib3(depth: 2):::depth2\n lib4(depth: 2):::depth2\n\n lib5(depth: 1):::depth1\n\n lib6(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e screen3\n screen1 --\x3e screen4\n\n screen2 --\x3e screen4\n\n screen3 --\x3e lib1\n screen3 --\x3e lib2\n\n screen4 --\x3e lib1\n screen4 --\x3e lib4\n\n lib1 --\x3e lib3\n lib1 --\x3e lib4\n\n lib2 --\x3e lib3\n\n lib3 --\x3e lib5\n lib4 --\x3e lib5\n\n lib5 --\x3e lib6\n\n end\n"})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(h,{...e})}):h(e)}},65404:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>i});var s=l(36672);const t={},r=s.createContext(t);function d(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),s.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e6115bc.9c665f96.js b/assets/js/6e6115bc.9c665f96.js new file mode 100644 index 0000000000..cdcb5975b8 --- /dev/null +++ b/assets/js/6e6115bc.9c665f96.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[744],{54972:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.12.5/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/ci_workflow.md","tags":[],"version":"0.12.5","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/rules/unused_dependency"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheckAuto):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew moduleCheckAuto --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/6e873df7.fec0e1cb.js b/assets/js/6e873df7.fec0e1cb.js new file mode 100644 index 0000000000..e4e29cf60f --- /dev/null +++ b/assets/js/6e873df7.fec0e1cb.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3127],{31358:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/docs/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sort_plugins","permalink":"/ModuleCheck/docs/next/rules/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/sorting/sort_plugins.md","tags":[],"version":"current","frontMatter":{"id":"sort_plugins","slug":"/rules/sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/next/rules/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/next/rules/disable_android_resources"}}');var r=s(23420),o=s(65404);const i={id:"sort_plugins",slug:"/rules/sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(d,{...e})}):d()}},65404:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>l});var n=s(36672);const r={},o=n.createContext(r);function i(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/70335a48.f86179a4.js b/assets/js/70335a48.f86179a4.js new file mode 100644 index 0000000000..429ecd03a5 --- /dev/null +++ b/assets/js/70335a48.f86179a4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4738],{65404:(e,n,t)=>{t.d(n,{R:()=>d,x:()=>o});var s=t(36672);const u={},r=s.createContext(u);function d(e){const n=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(u):e.components||u:d(e.components),s.createElement(r.Provider,{value:n},e.children)}},87431:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>o,default:()=>a,frontMatter:()=>d,metadata:()=>s,toc:()=>i});const s=JSON.parse('{"id":"rules/unused","title":"Unused Dependency","description":"","source":"@site/versioned_docs/version-0.10.0/rules/unused.md","sourceDirName":"rules","slug":"/rules/unused","permalink":"/ModuleCheck/docs/0.10.0/rules/unused","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/unused.md","tags":[],"version":"0.10.0","frontMatter":{"id":"unused","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Rules","next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.10.0/rules/redundant"}}');var u=t(23420),r=t(65404);const d={id:"unused",title:"Unused Dependency",sidebar_label:"Unused Dependency"},o=void 0,c={},i=[];function l(e){return(0,u.jsx)(u.Fragment,{})}function a(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,u.jsx)(n,{...e,children:(0,u.jsx)(l,{...e})}):l()}}}]); \ No newline at end of file diff --git a/assets/js/71174ce3.4f3ede8c.js b/assets/js/71174ce3.4f3ede8c.js new file mode 100644 index 0000000000..de0a13346a --- /dev/null +++ b/assets/js/71174ce3.4f3ede8c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1792],{59847:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>a,frontMatter:()=>u,metadata:()=>t,toc:()=>i});const t=JSON.parse('{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.12.0/rules/unused.md","sourceDirName":"rules","slug":"/rules/unused","permalink":"/ModuleCheck/docs/0.12.0/rules/unused","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/unused.md","tags":[],"version":"0.12.0","frontMatter":{"id":"unused","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.0/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.0/rules/must_be_api"}}');var d=s(23420),o=s(65404);const u={id:"unused",title:"Unused Dependency",sidebar_label:"Unused Dependency"},r=void 0,c={},i=[];function l(e){const n={p:"p",...(0,o.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,d.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>u,x:()=>r});var t=s(36672);const d={},o=t.createContext(d);function u(e){const n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:u(e.components),t.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/713.2d51f591.js b/assets/js/713.2d51f591.js new file mode 100644 index 0000000000..27454b0118 --- /dev/null +++ b/assets/js/713.2d51f591.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[713],{11047:(t,e,r)=>{r.d(e,{o:()=>a});var a=(0,r(97485).K2)(()=>"\n /* Font Awesome icon styling - consolidated */\n .label-icon {\n display: inline-block;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n \n .node .label-icon path {\n fill: currentColor;\n stroke: revert;\n stroke-width: revert;\n }\n","getIconStyles")},19641:(t,e,r)=>{r.d(e,{T:()=>f});var a=r(48203),s=r(41863),i=r(22859),n=r(89949),o=r(90570),l=r(83129),c=r(60707),d=r(49759),h=r(34713),g=r(80171),u=r(33998);const p=(0,h.A)(function(t){return(0,g.A)((0,d.A)(t,1,u.A,!0))});var y=r(6064),b=r(96800),x="\0";class f{constructor(t={}){this._isDirected=!Object.prototype.hasOwnProperty.call(t,"directed")||t.directed,this._isMultigraph=!!Object.prototype.hasOwnProperty.call(t,"multigraph")&&t.multigraph,this._isCompound=!!Object.prototype.hasOwnProperty.call(t,"compound")&&t.compound,this._label=void 0,this._defaultNodeLabelFn=a.A(void 0),this._defaultEdgeLabelFn=a.A(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[x]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(t){return this._label=t,this}graph(){return this._label}setDefaultNodeLabel(t){return s.A(t)||(t=a.A(t)),this._defaultNodeLabelFn=t,this}nodeCount(){return this._nodeCount}nodes(){return i.A(this._nodes)}sources(){var t=this;return n.A(this.nodes(),function(e){return o.A(t._in[e])})}sinks(){var t=this;return n.A(this.nodes(),function(e){return o.A(t._out[e])})}setNodes(t,e){var r=arguments,a=this;return l.A(t,function(t){r.length>1?a.setNode(t,e):a.setNode(t)}),this}setNode(t,e){return Object.prototype.hasOwnProperty.call(this._nodes,t)?(arguments.length>1&&(this._nodes[t]=e),this):(this._nodes[t]=arguments.length>1?e:this._defaultNodeLabelFn(t),this._isCompound&&(this._parent[t]=x,this._children[t]={},this._children[x][t]=!0),this._in[t]={},this._preds[t]={},this._out[t]={},this._sucs[t]={},++this._nodeCount,this)}node(t){return this._nodes[t]}hasNode(t){return Object.prototype.hasOwnProperty.call(this._nodes,t)}removeNode(t){if(Object.prototype.hasOwnProperty.call(this._nodes,t)){var e=t=>this.removeEdge(this._edgeObjs[t]);delete this._nodes[t],this._isCompound&&(this._removeFromParentsChildList(t),delete this._parent[t],l.A(this.children(t),t=>{this.setParent(t)}),delete this._children[t]),l.A(i.A(this._in[t]),e),delete this._in[t],delete this._preds[t],l.A(i.A(this._out[t]),e),delete this._out[t],delete this._sucs[t],--this._nodeCount}return this}setParent(t,e){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(c.A(e))e=x;else{for(var r=e+="";!c.A(r);r=this.parent(r))if(r===t)throw new Error("Setting "+e+" as parent of "+t+" would create a cycle");this.setNode(e)}return this.setNode(t),this._removeFromParentsChildList(t),this._parent[t]=e,this._children[e][t]=!0,this}_removeFromParentsChildList(t){delete this._children[this._parent[t]][t]}parent(t){if(this._isCompound){var e=this._parent[t];if(e!==x)return e}}children(t){if(c.A(t)&&(t=x),this._isCompound){var e=this._children[t];if(e)return i.A(e)}else{if(t===x)return this.nodes();if(this.hasNode(t))return[]}}predecessors(t){var e=this._preds[t];if(e)return i.A(e)}successors(t){var e=this._sucs[t];if(e)return i.A(e)}neighbors(t){var e=this.predecessors(t);if(e)return p(e,this.successors(t))}isLeaf(t){return 0===(this.isDirected()?this.successors(t):this.neighbors(t)).length}filterNodes(t){var e=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});e.setGraph(this.graph());var r=this;l.A(this._nodes,function(r,a){t(a)&&e.setNode(a,r)}),l.A(this._edgeObjs,function(t){e.hasNode(t.v)&&e.hasNode(t.w)&&e.setEdge(t,r.edge(t))});var a={};function s(t){var i=r.parent(t);return void 0===i||e.hasNode(i)?(a[t]=i,i):i in a?a[i]:s(i)}return this._isCompound&&l.A(e.nodes(),function(t){e.setParent(t,s(t))}),e}setDefaultEdgeLabel(t){return s.A(t)||(t=a.A(t)),this._defaultEdgeLabelFn=t,this}edgeCount(){return this._edgeCount}edges(){return y.A(this._edgeObjs)}setPath(t,e){var r=this,a=arguments;return b.A(t,function(t,s){return a.length>1?r.setEdge(t,s,e):r.setEdge(t,s),s}),this}setEdge(){var t,e,r,a,s=!1,i=arguments[0];"object"==typeof i&&null!==i&&"v"in i?(t=i.v,e=i.w,r=i.name,2===arguments.length&&(a=arguments[1],s=!0)):(t=i,e=arguments[1],r=arguments[3],arguments.length>2&&(a=arguments[2],s=!0)),t=""+t,e=""+e,c.A(r)||(r=""+r);var n=_(this._isDirected,t,e,r);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,n))return s&&(this._edgeLabels[n]=a),this;if(!c.A(r)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(t),this.setNode(e),this._edgeLabels[n]=s?a:this._defaultEdgeLabelFn(t,e,r);var o=function(t,e,r,a){var s=""+e,i=""+r;if(!t&&s>i){var n=s;s=i,i=n}var o={v:s,w:i};a&&(o.name=a);return o}(this._isDirected,t,e,r);return t=o.v,e=o.w,Object.freeze(o),this._edgeObjs[n]=o,m(this._preds[e],t),m(this._sucs[t],e),this._in[e][n]=o,this._out[t][n]=o,this._edgeCount++,this}edge(t,e,r){var a=1===arguments.length?L(this._isDirected,arguments[0]):_(this._isDirected,t,e,r);return this._edgeLabels[a]}hasEdge(t,e,r){var a=1===arguments.length?L(this._isDirected,arguments[0]):_(this._isDirected,t,e,r);return Object.prototype.hasOwnProperty.call(this._edgeLabels,a)}removeEdge(t,e,r){var a=1===arguments.length?L(this._isDirected,arguments[0]):_(this._isDirected,t,e,r),s=this._edgeObjs[a];return s&&(t=s.v,e=s.w,delete this._edgeLabels[a],delete this._edgeObjs[a],w(this._preds[e],t),w(this._sucs[t],e),delete this._in[e][a],delete this._out[t][a],this._edgeCount--),this}inEdges(t,e){var r=this._in[t];if(r){var a=y.A(r);return e?n.A(a,function(t){return t.v===e}):a}}outEdges(t,e){var r=this._out[t];if(r){var a=y.A(r);return e?n.A(a,function(t){return t.w===e}):a}}nodeEdges(t,e){var r=this.inEdges(t,e);if(r)return r.concat(this.outEdges(t,e))}}function m(t,e){t[e]?t[e]++:t[e]=1}function w(t,e){--t[e]||delete t[e]}function _(t,e,r,a){var s=""+e,i=""+r;if(!t&&s>i){var n=s;s=i,i=n}return s+"\x01"+i+"\x01"+(c.A(a)?"\0":a)}function L(t,e){return _(t,e.v,e.w,e.name)}f.prototype._nodeCount=0,f.prototype._edgeCount=0},30713:(t,e,r)=>{r.d(e,{diagram:()=>me});var a=r(11047),s=r(290),i=r(267),n=r(63727),o=r(9420),l=r(97485),c=r(64350),d=r(80124),h=r(30941),g=r(3170),u=r(57420),p=function(){var t=(0,l.K2)(function(t,e,r,a){for(r=r||{},a=t.length;a--;r[t[a]]=e);return r},"o"),e=[1,7],r=[1,13],a=[1,14],s=[1,15],i=[1,19],n=[1,16],o=[1,17],c=[1,18],d=[8,30],h=[8,21,28,29,30,31,32,40,44,47],g=[1,23],u=[1,24],p=[8,15,16,21,28,29,30,31,32,40,44,47],y=[8,15,16,21,27,28,29,30,31,32,40,44,47],b=[1,49],x={trace:(0,l.K2)(function(){},"trace"),yy:{},symbols_:{error:2,spaceLines:3,SPACELINE:4,NL:5,separator:6,SPACE:7,EOF:8,start:9,BLOCK_DIAGRAM_KEY:10,document:11,stop:12,statement:13,link:14,LINK:15,START_LINK:16,LINK_LABEL:17,STR:18,nodeStatement:19,columnsStatement:20,SPACE_BLOCK:21,blockStatement:22,classDefStatement:23,cssClassStatement:24,styleStatement:25,node:26,SIZE:27,COLUMNS:28,"id-block":29,end:30,block:31,NODE_ID:32,nodeShapeNLabel:33,dirList:34,DIR:35,NODE_DSTART:36,NODE_DEND:37,BLOCK_ARROW_START:38,BLOCK_ARROW_END:39,classDef:40,CLASSDEF_ID:41,CLASSDEF_STYLEOPTS:42,DEFAULT:43,class:44,CLASSENTITY_IDS:45,STYLECLASS:46,style:47,STYLE_ENTITY_IDS:48,STYLE_DEFINITION_DATA:49,$accept:0,$end:1},terminals_:{2:"error",4:"SPACELINE",5:"NL",7:"SPACE",8:"EOF",10:"BLOCK_DIAGRAM_KEY",15:"LINK",16:"START_LINK",17:"LINK_LABEL",18:"STR",21:"SPACE_BLOCK",27:"SIZE",28:"COLUMNS",29:"id-block",30:"end",31:"block",32:"NODE_ID",35:"DIR",36:"NODE_DSTART",37:"NODE_DEND",38:"BLOCK_ARROW_START",39:"BLOCK_ARROW_END",40:"classDef",41:"CLASSDEF_ID",42:"CLASSDEF_STYLEOPTS",43:"DEFAULT",44:"class",45:"CLASSENTITY_IDS",46:"STYLECLASS",47:"style",48:"STYLE_ENTITY_IDS",49:"STYLE_DEFINITION_DATA"},productions_:[0,[3,1],[3,2],[3,2],[6,1],[6,1],[6,1],[9,3],[12,1],[12,1],[12,2],[12,2],[11,1],[11,2],[14,1],[14,4],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[13,1],[19,3],[19,2],[19,1],[20,1],[22,4],[22,3],[26,1],[26,2],[34,1],[34,2],[33,3],[33,4],[23,3],[23,3],[24,3],[25,3]],performAction:(0,l.K2)(function(t,e,r,a,s,i,n){var o=i.length-1;switch(s){case 4:a.getLogger().debug("Rule: separator (NL) ");break;case 5:a.getLogger().debug("Rule: separator (Space) ");break;case 6:a.getLogger().debug("Rule: separator (EOF) ");break;case 7:a.getLogger().debug("Rule: hierarchy: ",i[o-1]),a.setHierarchy(i[o-1]);break;case 8:a.getLogger().debug("Stop NL ");break;case 9:a.getLogger().debug("Stop EOF ");break;case 10:a.getLogger().debug("Stop NL2 ");break;case 11:a.getLogger().debug("Stop EOF2 ");break;case 12:a.getLogger().debug("Rule: statement: ",i[o]),"number"==typeof i[o].length?this.$=i[o]:this.$=[i[o]];break;case 13:a.getLogger().debug("Rule: statement #2: ",i[o-1]),this.$=[i[o-1]].concat(i[o]);break;case 14:a.getLogger().debug("Rule: link: ",i[o],t),this.$={edgeTypeStr:i[o],label:""};break;case 15:a.getLogger().debug("Rule: LABEL link: ",i[o-3],i[o-1],i[o]),this.$={edgeTypeStr:i[o],label:i[o-1]};break;case 18:const e=parseInt(i[o]),r=a.generateId();this.$={id:r,type:"space",label:"",width:e,children:[]};break;case 23:a.getLogger().debug("Rule: (nodeStatement link node) ",i[o-2],i[o-1],i[o]," typestr: ",i[o-1].edgeTypeStr);const s=a.edgeStrToEdgeData(i[o-1].edgeTypeStr);this.$=[{id:i[o-2].id,label:i[o-2].label,type:i[o-2].type,directions:i[o-2].directions},{id:i[o-2].id+"-"+i[o].id,start:i[o-2].id,end:i[o].id,label:i[o-1].label,type:"edge",directions:i[o].directions,arrowTypeEnd:s,arrowTypeStart:"arrow_open"},{id:i[o].id,label:i[o].label,type:a.typeStr2Type(i[o].typeStr),directions:i[o].directions}];break;case 24:a.getLogger().debug("Rule: nodeStatement (abc88 node size) ",i[o-1],i[o]),this.$={id:i[o-1].id,label:i[o-1].label,type:a.typeStr2Type(i[o-1].typeStr),directions:i[o-1].directions,widthInColumns:parseInt(i[o],10)};break;case 25:a.getLogger().debug("Rule: nodeStatement (node) ",i[o]),this.$={id:i[o].id,label:i[o].label,type:a.typeStr2Type(i[o].typeStr),directions:i[o].directions,widthInColumns:1};break;case 26:a.getLogger().debug("APA123",this?this:"na"),a.getLogger().debug("COLUMNS: ",i[o]),this.$={type:"column-setting",columns:"auto"===i[o]?-1:parseInt(i[o])};break;case 27:a.getLogger().debug("Rule: id-block statement : ",i[o-2],i[o-1]);a.generateId();this.$={...i[o-2],type:"composite",children:i[o-1]};break;case 28:a.getLogger().debug("Rule: blockStatement : ",i[o-2],i[o-1],i[o]);const n=a.generateId();this.$={id:n,type:"composite",label:"",children:i[o-1]};break;case 29:a.getLogger().debug("Rule: node (NODE_ID separator): ",i[o]),this.$={id:i[o]};break;case 30:a.getLogger().debug("Rule: node (NODE_ID nodeShapeNLabel separator): ",i[o-1],i[o]),this.$={id:i[o-1],label:i[o].label,typeStr:i[o].typeStr,directions:i[o].directions};break;case 31:a.getLogger().debug("Rule: dirList: ",i[o]),this.$=[i[o]];break;case 32:a.getLogger().debug("Rule: dirList: ",i[o-1],i[o]),this.$=[i[o-1]].concat(i[o]);break;case 33:a.getLogger().debug("Rule: nodeShapeNLabel: ",i[o-2],i[o-1],i[o]),this.$={typeStr:i[o-2]+i[o],label:i[o-1]};break;case 34:a.getLogger().debug("Rule: BLOCK_ARROW nodeShapeNLabel: ",i[o-3],i[o-2]," #3:",i[o-1],i[o]),this.$={typeStr:i[o-3]+i[o],label:i[o-2],directions:i[o-1]};break;case 35:case 36:this.$={type:"classDef",id:i[o-1].trim(),css:i[o].trim()};break;case 37:this.$={type:"applyClass",id:i[o-1].trim(),styleClass:i[o].trim()};break;case 38:this.$={type:"applyStyles",id:i[o-1].trim(),stylesStr:i[o].trim()}}},"anonymous"),table:[{9:1,10:[1,2]},{1:[3]},{11:3,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:a,31:s,32:i,40:n,44:o,47:c},{8:[1,20]},t(d,[2,12],{13:4,19:5,20:6,22:8,23:9,24:10,25:11,26:12,11:21,21:e,28:r,29:a,31:s,32:i,40:n,44:o,47:c}),t(h,[2,16],{14:22,15:g,16:u}),t(h,[2,17]),t(h,[2,18]),t(h,[2,19]),t(h,[2,20]),t(h,[2,21]),t(h,[2,22]),t(p,[2,25],{27:[1,25]}),t(h,[2,26]),{19:26,26:12,32:i},{11:27,13:4,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:a,31:s,32:i,40:n,44:o,47:c},{41:[1,28],43:[1,29]},{45:[1,30]},{48:[1,31]},t(y,[2,29],{33:32,36:[1,33],38:[1,34]}),{1:[2,7]},t(d,[2,13]),{26:35,32:i},{32:[2,14]},{17:[1,36]},t(p,[2,24]),{11:37,13:4,14:22,15:g,16:u,19:5,20:6,21:e,22:8,23:9,24:10,25:11,26:12,28:r,29:a,31:s,32:i,40:n,44:o,47:c},{30:[1,38]},{42:[1,39]},{42:[1,40]},{46:[1,41]},{49:[1,42]},t(y,[2,30]),{18:[1,43]},{18:[1,44]},t(p,[2,23]),{18:[1,45]},{30:[1,46]},t(h,[2,28]),t(h,[2,35]),t(h,[2,36]),t(h,[2,37]),t(h,[2,38]),{37:[1,47]},{34:48,35:b},{15:[1,50]},t(h,[2,27]),t(y,[2,33]),{39:[1,51]},{34:52,35:b,39:[2,31]},{32:[2,15]},t(y,[2,34]),{39:[2,32]}],defaultActions:{20:[2,7],23:[2,14],50:[2,15],52:[2,32]},parseError:(0,l.K2)(function(t,e){if(!e.recoverable){var r=new Error(t);throw r.hash=e,r}this.trace(t)},"parseError"),parse:(0,l.K2)(function(t){var e=this,r=[0],a=[],s=[null],i=[],n=this.table,o="",c=0,d=0,h=0,g=i.slice.call(arguments,1),u=Object.create(this.lexer),p={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(p.yy[y]=this.yy[y]);u.setInput(t,p.yy),p.yy.lexer=u,p.yy.parser=this,void 0===u.yylloc&&(u.yylloc={});var b=u.yylloc;i.push(b);var x=u.options&&u.options.ranges;function f(){var t;return"number"!=typeof(t=a.pop()||u.lex()||1)&&(t instanceof Array&&(t=(a=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,l.K2)(function(t){r.length=r.length-2*t,s.length=s.length-t,i.length=i.length-t},"popStack"),(0,l.K2)(f,"lex");for(var m,w,_,L,k,S,v,E,D,C={};;){if(_=r[r.length-1],this.defaultActions[_]?L=this.defaultActions[_]:(null==m&&(m=f()),L=n[_]&&n[_][m]),void 0===L||!L.length||!L[0]){var R="";for(S in D=[],n[_])this.terminals_[S]&&S>2&&D.push("'"+this.terminals_[S]+"'");R=u.showPosition?"Parse error on line "+(c+1)+":\n"+u.showPosition()+"\nExpecting "+D.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(R,{text:u.match,token:this.terminals_[m]||m,line:u.yylineno,loc:b,expected:D})}if(L[0]instanceof Array&&L.length>1)throw new Error("Parse Error: multiple actions possible at state: "+_+", token: "+m);switch(L[0]){case 1:r.push(m),s.push(u.yytext),i.push(u.yylloc),r.push(L[1]),m=null,w?(m=w,w=null):(d=u.yyleng,o=u.yytext,c=u.yylineno,b=u.yylloc,h>0&&h--);break;case 2:if(v=this.productions_[L[1]][1],C.$=s[s.length-v],C._$={first_line:i[i.length-(v||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(v||1)].first_column,last_column:i[i.length-1].last_column},x&&(C._$.range=[i[i.length-(v||1)].range[0],i[i.length-1].range[1]]),void 0!==(k=this.performAction.apply(C,[o,d,c,p.yy,L[1],s,i].concat(g))))return k;v&&(r=r.slice(0,-1*v*2),s=s.slice(0,-1*v),i=i.slice(0,-1*v)),r.push(this.productions_[L[1]][0]),s.push(C.$),i.push(C._$),E=n[r[r.length-2]][r[r.length-1]],r.push(E);break;case 3:return!0}}return!0},"parse")},f=function(){return{EOF:1,parseError:(0,l.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,l.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,l.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,l.K2)(function(t){var e=t.length,r=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var a=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),r.length-1&&(this.yylineno-=r.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:r?(r.length===a.length?this.yylloc.first_column:0)+a[a.length-r.length].length-r[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,l.K2)(function(){return this._more=!0,this},"more"),reject:(0,l.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,l.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,l.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,l.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,l.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,l.K2)(function(t,e){var r,a,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(a=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],r=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),r)return r;if(this._backtrack){for(var i in s)this[i]=s[i];return!1}return!1},"test_match"),next:(0,l.K2)(function(){if(this.done)return this.EOF;var t,e,r,a;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),i=0;i<s.length;i++)if((r=this._input.match(this.rules[s[i]]))&&(!e||r[0].length>e[0].length)){if(e=r,a=i,this.options.backtrack_lexer){if(!1!==(t=this.test_match(r,s[i])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[a]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,l.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,l.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,l.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,l.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,l.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,l.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,l.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:(0,l.K2)(function(t,e,r,a){switch(r){case 0:return 10;case 1:return t.getLogger().debug("Found space-block"),31;case 2:return t.getLogger().debug("Found nl-block"),31;case 3:return t.getLogger().debug("Found space-block"),29;case 4:t.getLogger().debug(".",e.yytext);break;case 5:t.getLogger().debug("_",e.yytext);break;case 6:return 5;case 7:return e.yytext=-1,28;case 8:return e.yytext=e.yytext.replace(/columns\s+/,""),t.getLogger().debug("COLUMNS (LEX)",e.yytext),28;case 9:case 77:case 78:case 100:this.pushState("md_string");break;case 10:return"MD_STR";case 11:case 35:case 80:this.popState();break;case 12:this.pushState("string");break;case 13:t.getLogger().debug("LEX: POPPING STR:",e.yytext),this.popState();break;case 14:return t.getLogger().debug("LEX: STR end:",e.yytext),"STR";case 15:return e.yytext=e.yytext.replace(/space\:/,""),t.getLogger().debug("SPACE NUM (LEX)",e.yytext),21;case 16:return e.yytext="1",t.getLogger().debug("COLUMNS (LEX)",e.yytext),21;case 17:return 43;case 18:return"LINKSTYLE";case 19:return"INTERPOLATE";case 20:return this.pushState("CLASSDEF"),40;case 21:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 22:return this.popState(),this.pushState("CLASSDEFID"),41;case 23:return this.popState(),42;case 24:return this.pushState("CLASS"),44;case 25:return this.popState(),this.pushState("CLASS_STYLE"),45;case 26:return this.popState(),46;case 27:return this.pushState("STYLE_STMNT"),47;case 28:return this.popState(),this.pushState("STYLE_DEFINITION"),48;case 29:return this.popState(),49;case 30:return this.pushState("acc_title"),"acc_title";case 31:return this.popState(),"acc_title_value";case 32:return this.pushState("acc_descr"),"acc_descr";case 33:return this.popState(),"acc_descr_value";case 34:this.pushState("acc_descr_multiline");break;case 36:return"acc_descr_multiline_value";case 37:return 30;case 38:case 39:case 41:case 42:case 45:return this.popState(),t.getLogger().debug("Lex: (("),"NODE_DEND";case 40:return this.popState(),t.getLogger().debug("Lex: ))"),"NODE_DEND";case 43:return this.popState(),t.getLogger().debug("Lex: (-"),"NODE_DEND";case 44:return this.popState(),t.getLogger().debug("Lex: -)"),"NODE_DEND";case 46:return this.popState(),t.getLogger().debug("Lex: ]]"),"NODE_DEND";case 47:return this.popState(),t.getLogger().debug("Lex: ("),"NODE_DEND";case 48:return this.popState(),t.getLogger().debug("Lex: ])"),"NODE_DEND";case 49:case 50:return this.popState(),t.getLogger().debug("Lex: /]"),"NODE_DEND";case 51:return this.popState(),t.getLogger().debug("Lex: )]"),"NODE_DEND";case 52:return this.popState(),t.getLogger().debug("Lex: )"),"NODE_DEND";case 53:return this.popState(),t.getLogger().debug("Lex: ]>"),"NODE_DEND";case 54:return this.popState(),t.getLogger().debug("Lex: ]"),"NODE_DEND";case 55:return t.getLogger().debug("Lexa: -)"),this.pushState("NODE"),36;case 56:return t.getLogger().debug("Lexa: (-"),this.pushState("NODE"),36;case 57:return t.getLogger().debug("Lexa: ))"),this.pushState("NODE"),36;case 58:case 60:case 61:case 62:case 65:return t.getLogger().debug("Lexa: )"),this.pushState("NODE"),36;case 59:return t.getLogger().debug("Lex: ((("),this.pushState("NODE"),36;case 63:return t.getLogger().debug("Lexc: >"),this.pushState("NODE"),36;case 64:return t.getLogger().debug("Lexa: (["),this.pushState("NODE"),36;case 66:case 67:case 68:case 69:case 70:case 71:case 72:return this.pushState("NODE"),36;case 73:return t.getLogger().debug("Lexa: ["),this.pushState("NODE"),36;case 74:return this.pushState("BLOCK_ARROW"),t.getLogger().debug("LEX ARR START"),38;case 75:return t.getLogger().debug("Lex: NODE_ID",e.yytext),32;case 76:return t.getLogger().debug("Lex: EOF",e.yytext),8;case 79:return"NODE_DESCR";case 81:t.getLogger().debug("Lex: Starting string"),this.pushState("string");break;case 82:t.getLogger().debug("LEX ARR: Starting string"),this.pushState("string");break;case 83:return t.getLogger().debug("LEX: NODE_DESCR:",e.yytext),"NODE_DESCR";case 84:t.getLogger().debug("LEX POPPING"),this.popState();break;case 85:t.getLogger().debug("Lex: =>BAE"),this.pushState("ARROW_DIR");break;case 86:return e.yytext=e.yytext.replace(/^,\s*/,""),t.getLogger().debug("Lex (right): dir:",e.yytext),"DIR";case 87:return e.yytext=e.yytext.replace(/^,\s*/,""),t.getLogger().debug("Lex (left):",e.yytext),"DIR";case 88:return e.yytext=e.yytext.replace(/^,\s*/,""),t.getLogger().debug("Lex (x):",e.yytext),"DIR";case 89:return e.yytext=e.yytext.replace(/^,\s*/,""),t.getLogger().debug("Lex (y):",e.yytext),"DIR";case 90:return e.yytext=e.yytext.replace(/^,\s*/,""),t.getLogger().debug("Lex (up):",e.yytext),"DIR";case 91:return e.yytext=e.yytext.replace(/^,\s*/,""),t.getLogger().debug("Lex (down):",e.yytext),"DIR";case 92:return e.yytext="]>",t.getLogger().debug("Lex (ARROW_DIR end):",e.yytext),this.popState(),this.popState(),"BLOCK_ARROW_END";case 93:return t.getLogger().debug("Lex: LINK","#"+e.yytext+"#"),15;case 94:case 95:case 96:return t.getLogger().debug("Lex: LINK",e.yytext),15;case 97:case 98:case 99:return t.getLogger().debug("Lex: START_LINK",e.yytext),this.pushState("LLABEL"),16;case 101:return t.getLogger().debug("Lex: Starting string"),this.pushState("string"),"LINK_LABEL";case 102:return this.popState(),t.getLogger().debug("Lex: LINK","#"+e.yytext+"#"),15;case 103:case 104:return this.popState(),t.getLogger().debug("Lex: LINK",e.yytext),15;case 105:return t.getLogger().debug("Lex: COLON",e.yytext),e.yytext=e.yytext.slice(1),27}},"anonymous"),rules:[/^(?:block-beta\b)/,/^(?:block\s+)/,/^(?:block\n+)/,/^(?:block:)/,/^(?:[\s]+)/,/^(?:[\n]+)/,/^(?:((\u000D\u000A)|(\u000A)))/,/^(?:columns\s+auto\b)/,/^(?:columns\s+[\d]+)/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:space[:]\d+)/,/^(?:space\b)/,/^(?:default\b)/,/^(?:linkStyle\b)/,/^(?:interpolate\b)/,/^(?:classDef\s+)/,/^(?:DEFAULT\s+)/,/^(?:\w+\s+)/,/^(?:[^\n]*)/,/^(?:class\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:style\s+)/,/^(?:(\w+)+((,\s*\w+)*))/,/^(?:[^\n]*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:end\b\s*)/,/^(?:\(\(\()/,/^(?:\)\)\))/,/^(?:[\)]\))/,/^(?:\}\})/,/^(?:\})/,/^(?:\(-)/,/^(?:-\))/,/^(?:\(\()/,/^(?:\]\])/,/^(?:\()/,/^(?:\]\))/,/^(?:\\\])/,/^(?:\/\])/,/^(?:\)\])/,/^(?:[\)])/,/^(?:\]>)/,/^(?:[\]])/,/^(?:-\))/,/^(?:\(-)/,/^(?:\)\))/,/^(?:\))/,/^(?:\(\(\()/,/^(?:\(\()/,/^(?:\{\{)/,/^(?:\{)/,/^(?:>)/,/^(?:\(\[)/,/^(?:\()/,/^(?:\[\[)/,/^(?:\[\|)/,/^(?:\[\()/,/^(?:\)\)\))/,/^(?:\[\\)/,/^(?:\[\/)/,/^(?:\[\\)/,/^(?:\[)/,/^(?:<\[)/,/^(?:[^\(\[\n\-\)\{\}\s\<\>:]+)/,/^(?:$)/,/^(?:["][`])/,/^(?:["][`])/,/^(?:[^`"]+)/,/^(?:[`]["])/,/^(?:["])/,/^(?:["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:\]>\s*\()/,/^(?:,?\s*right\s*)/,/^(?:,?\s*left\s*)/,/^(?:,?\s*x\s*)/,/^(?:,?\s*y\s*)/,/^(?:,?\s*up\s*)/,/^(?:,?\s*down\s*)/,/^(?:\)\s*)/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?:\s*~~[\~]+\s*)/,/^(?:\s*[xo<]?--\s*)/,/^(?:\s*[xo<]?==\s*)/,/^(?:\s*[xo<]?-\.\s*)/,/^(?:["][`])/,/^(?:["])/,/^(?:\s*[xo<]?--+[-xo>]\s*)/,/^(?:\s*[xo<]?==+[=xo>]\s*)/,/^(?:\s*[xo<]?-?\.+-[xo>]?\s*)/,/^(?::\d+)/],conditions:{STYLE_DEFINITION:{rules:[29],inclusive:!1},STYLE_STMNT:{rules:[28],inclusive:!1},CLASSDEFID:{rules:[23],inclusive:!1},CLASSDEF:{rules:[21,22],inclusive:!1},CLASS_STYLE:{rules:[26],inclusive:!1},CLASS:{rules:[25],inclusive:!1},LLABEL:{rules:[100,101,102,103,104],inclusive:!1},ARROW_DIR:{rules:[86,87,88,89,90,91,92],inclusive:!1},BLOCK_ARROW:{rules:[77,82,85],inclusive:!1},NODE:{rules:[38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,78,81],inclusive:!1},md_string:{rules:[10,11,79,80],inclusive:!1},space:{rules:[],inclusive:!1},string:{rules:[13,14,83,84],inclusive:!1},acc_descr_multiline:{rules:[35,36],inclusive:!1},acc_descr:{rules:[33],inclusive:!1},acc_title:{rules:[31],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,9,12,15,16,17,18,19,20,24,27,30,32,34,37,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,93,94,95,96,97,98,99,105],inclusive:!0}}}}();function m(){this.yy={}}return x.lexer=f,(0,l.K2)(m,"Parser"),m.prototype=x,x.Parser=m,new m}();p.parser=p;var y=p,b=new Map,x=[],f=new Map,m="color",w="fill",_=(0,l.D7)(),L=new Map,k=(0,l.K2)(t=>l.Y2.sanitizeText(t,_),"sanitizeText"),S=(0,l.K2)(function(t,e=""){let r=L.get(t);r||(r={id:t,styles:[],textStyles:[]},L.set(t,r)),null!=e&&e.split(",").forEach(t=>{const e=t.replace(/([^;]*);/,"$1").trim();if(RegExp(m).exec(t)){const t=e.replace(w,"bgFill").replace(m,w);r.textStyles.push(t)}r.styles.push(e)})},"addStyleClass"),v=(0,l.K2)(function(t,e=""){const r=b.get(t);null!=e&&(r.styles=e.split(","))},"addStyle2Node"),E=(0,l.K2)(function(t,e){t.split(",").forEach(function(t){let r=b.get(t);if(void 0===r){const e=t.trim();r={id:e,type:"na",children:[]},b.set(e,r)}r.classes||(r.classes=[]),r.classes.push(e)})},"setCssClass"),D=(0,l.K2)((t,e)=>{const r=t.flat(),a=[];for(const s of r)if(s.label&&(s.label=k(s.label)),"classDef"!==s.type)if("applyClass"!==s.type)if("applyStyles"!==s.type)if("column-setting"===s.type)e.columns=s.columns??-1;else if("edge"===s.type){const t=(f.get(s.id)??0)+1;f.set(s.id,t),s.id=t+"-"+s.id,x.push(s)}else{s.label||("composite"===s.type?s.label="":s.label=s.id);const t=b.get(s.id);if(void 0===t?b.set(s.id,s):("na"!==s.type&&(t.type=s.type),s.label!==s.id&&(t.label=s.label)),s.children&&D(s.children,s),"space"===s.type){const t=s.width??1;for(let e=0;e<t;e++){const t=(0,c.A)(s);t.id=t.id+"-"+e,b.set(t.id,t),a.push(t)}}else void 0===t&&a.push(s)}else s?.stylesStr&&v(s.id,s?.stylesStr);else E(s.id,s?.styleClass??"");else S(s.id,s.css);e.children=a},"populateBlockDatabase"),C=[],R={id:"root",type:"composite",children:[],columns:-1},K=(0,l.K2)(()=>{l.Rm.debug("Clear called"),(0,l.IU)(),R={id:"root",type:"composite",children:[],columns:-1},b=new Map([["root",R]]),C=[],L=new Map,x=[],f=new Map},"clear");function N(t){switch(l.Rm.debug("typeStr2Type",t),t){case"[]":return"square";case"()":return l.Rm.debug("we have a round"),"round";case"(())":return"circle";case">]":return"rect_left_inv_arrow";case"{}":return"diamond";case"{{}}":return"hexagon";case"([])":return"stadium";case"[[]]":return"subroutine";case"[()]":return"cylinder";case"((()))":return"doublecircle";case"[//]":return"lean_right";case"[\\\\]":return"lean_left";case"[/\\]":return"trapezoid";case"[\\/]":return"inv_trapezoid";case"<[]>":return"block_arrow";default:return"na"}}function $(t){return l.Rm.debug("typeStr2Type",t),"=="===t?"thick":"normal"}function T(t){switch(t.trim()){case"--x":return"arrow_cross";case"--o":return"arrow_circle";default:return"arrow_point"}}(0,l.K2)(N,"typeStr2Type"),(0,l.K2)($,"edgeTypeStr2Type"),(0,l.K2)(T,"edgeStrToEdgeData");var A=0,I=(0,l.K2)(()=>(A++,"id-"+Math.random().toString(36).substr(2,12)+"-"+A),"generateId"),O=(0,l.K2)(t=>{R.children=t,D(t,R),C=R.children},"setHierarchy"),B=(0,l.K2)(t=>{const e=b.get(t);return e?e.columns?e.columns:e.children?e.children.length:-1:-1},"getColumns"),z=(0,l.K2)(()=>[...b.values()],"getBlocksFlat"),M=(0,l.K2)(()=>C||[],"getBlocks"),P=(0,l.K2)(()=>x,"getEdges"),Y=(0,l.K2)(t=>b.get(t),"getBlock"),F=(0,l.K2)(t=>{b.set(t.id,t)},"setBlock"),j=(0,l.K2)(()=>console,"getLogger"),W=(0,l.K2)(function(){return L},"getClasses"),X={getConfig:(0,l.K2)(()=>(0,l.zj)().block,"getConfig"),typeStr2Type:N,edgeTypeStr2Type:$,edgeStrToEdgeData:T,getLogger:j,getBlocksFlat:z,getBlocks:M,getEdges:P,setHierarchy:O,getBlock:Y,setBlock:F,getColumns:B,getClasses:W,clear:K,generateId:I},H=(0,l.K2)((t,e)=>{const r=d.A,a=r(t,"r"),s=r(t,"g"),i=r(t,"b");return h.A(a,s,i,e)},"fade"),U=(0,l.K2)(t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n .cluster-label text {\n fill: ${t.titleColor};\n }\n .cluster-label span,p {\n color: ${t.titleColor};\n }\n\n\n\n .label text,span,p {\n fill: ${t.nodeTextColor||t.textColor};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n .flowchart-label text {\n text-anchor: middle;\n }\n // .flowchart-label .text-outer-tspan {\n // text-anchor: middle;\n // }\n // .flowchart-label .text-inner-tspan {\n // text-anchor: start;\n // }\n\n .node .label {\n text-align: center;\n }\n .node.clickable {\n cursor: pointer;\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n\n /* For html labels only */\n .labelBkg {\n background-color: ${H(t.edgeLabelBackground,.5)};\n // background-color:\n }\n\n .node .cluster {\n // fill: ${H(t.mainBkg,.5)};\n fill: ${H(t.clusterBkg,.5)};\n stroke: ${H(t.clusterBorder,.2)};\n box-shadow: rgba(50, 50, 93, 0.25) 0px 13px 27px -5px, rgba(0, 0, 0, 0.3) 0px 8px 16px -8px;\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n .cluster span,p {\n color: ${t.titleColor};\n }\n /* .cluster div {\n color: ${t.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.border2};\n border-radius: 2px;\n pointer-events: none;\n z-index: 100;\n }\n\n .flowchartTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n }\n ${(0,a.o)()}\n`,"getStyles"),Z=(0,l.K2)((t,e,r,a)=>{e.forEach(e=>{q[e](t,r,a)})},"insertMarkers"),q={extension:(0,l.K2)((t,e,r)=>{l.Rm.trace("Making markers for ",r),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionStart").attr("class","marker extension "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 1,7 L18,13 V 1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-extensionEnd").attr("class","marker extension "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 1,1 V 13 L18,7 Z")},"extension"),composition:(0,l.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionStart").attr("class","marker composition "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-compositionEnd").attr("class","marker composition "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"composition"),aggregation:(0,l.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationStart").attr("class","marker aggregation "+e).attr("refX",18).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-aggregationEnd").attr("class","marker aggregation "+e).attr("refX",1).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L1,7 L9,1 Z")},"aggregation"),dependency:(0,l.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyStart").attr("class","marker dependency "+e).attr("refX",6).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("path").attr("d","M 5,7 L9,13 L1,7 L9,1 Z"),t.append("defs").append("marker").attr("id",r+"_"+e+"-dependencyEnd").attr("class","marker dependency "+e).attr("refX",13).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"dependency"),lollipop:(0,l.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopStart").attr("class","marker lollipop "+e).attr("refX",13).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6),t.append("defs").append("marker").attr("id",r+"_"+e+"-lollipopEnd").attr("class","marker lollipop "+e).attr("refX",1).attr("refY",7).attr("markerWidth",190).attr("markerHeight",240).attr("orient","auto").append("circle").attr("stroke","black").attr("fill","transparent").attr("cx",7).attr("cy",7).attr("r",6)},"lollipop"),point:(0,l.K2)((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-pointEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",6).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-pointStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",4.5).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 5 L 10 10 L 10 0 z").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"point"),circle:(0,l.K2)((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-circleEnd").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",11).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-circleStart").attr("class","marker "+e).attr("viewBox","0 0 10 10").attr("refX",-1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("circle").attr("cx","5").attr("cy","5").attr("r","5").attr("class","arrowMarkerPath").style("stroke-width",1).style("stroke-dasharray","1,0")},"circle"),cross:(0,l.K2)((t,e,r)=>{t.append("marker").attr("id",r+"_"+e+"-crossEnd").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",12).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0"),t.append("marker").attr("id",r+"_"+e+"-crossStart").attr("class","marker cross "+e).attr("viewBox","0 0 11 11").attr("refX",-1).attr("refY",5.2).attr("markerUnits","userSpaceOnUse").attr("markerWidth",11).attr("markerHeight",11).attr("orient","auto").append("path").attr("d","M 1,1 l 9,9 M 10,1 l -9,9").attr("class","arrowMarkerPath").style("stroke-width",2).style("stroke-dasharray","1,0")},"cross"),barb:(0,l.K2)((t,e,r)=>{t.append("defs").append("marker").attr("id",r+"_"+e+"-barbEnd").attr("refX",19).attr("refY",7).attr("markerWidth",20).attr("markerHeight",14).attr("markerUnits","strokeWidth").attr("orient","auto").append("path").attr("d","M 19,7 L9,13 L14,7 L9,1 Z")},"barb")},G=Z,J=(0,l.D7)()?.block?.padding??8;function V(t,e){if(0===t||!Number.isInteger(t))throw new Error("Columns must be an integer !== 0.");if(e<0||!Number.isInteger(e))throw new Error("Position must be a non-negative integer."+e);if(t<0)return{px:e,py:0};if(1===t)return{px:0,py:e};return{px:e%t,py:Math.floor(e/t)}}(0,l.K2)(V,"calculateBlockPosition");var Q=(0,l.K2)(t=>{let e=0,r=0;for(const a of t.children){const{width:s,height:i,x:n,y:o}=a.size??{width:0,height:0,x:0,y:0};l.Rm.debug("getMaxChildSize abc95 child:",a.id,"width:",s,"height:",i,"x:",n,"y:",o,a.type),"space"!==a.type&&(s>e&&(e=s/(t.widthInColumns??1)),i>r&&(r=i))}return{width:e,height:r}},"getMaxChildSize");function tt(t,e,r=0,a=0){l.Rm.debug("setBlockSizes abc95 (start)",t.id,t?.size?.x,"block width =",t?.size,"siblingWidth",r),t?.size?.width||(t.size={width:r,height:a,x:0,y:0});let s=0,i=0;if(t.children?.length>0){for(const r of t.children)tt(r,e);const n=Q(t);s=n.width,i=n.height,l.Rm.debug("setBlockSizes abc95 maxWidth of",t.id,":s children is ",s,i);for(const e of t.children)e.size&&(l.Rm.debug(`abc95 Setting size of children of ${t.id} id=${e.id} ${s} ${i} ${JSON.stringify(e.size)}`),e.size.width=s*(e.widthInColumns??1)+J*((e.widthInColumns??1)-1),e.size.height=i,e.size.x=0,e.size.y=0,l.Rm.debug(`abc95 updating size of ${t.id} children child:${e.id} maxWidth:${s} maxHeight:${i}`));for(const r of t.children)tt(r,e,s,i);const o=t.columns??-1;let c=0;for(const e of t.children)c+=e.widthInColumns??1;let d=t.children.length;o>0&&o<c&&(d=o);const h=Math.ceil(c/d);let g=d*(s+J)+J,u=h*(i+J)+J;if(g<r){l.Rm.debug(`Detected to small sibling: abc95 ${t.id} siblingWidth ${r} siblingHeight ${a} width ${g}`),g=r,u=a;const e=(r-d*J-J)/d,n=(a-h*J-J)/h;l.Rm.debug("Size indata abc88",t.id,"childWidth",e,"maxWidth",s),l.Rm.debug("Size indata abc88",t.id,"childHeight",n,"maxHeight",i),l.Rm.debug("Size indata abc88 xSize",d,"padding",J);for(const r of t.children)r.size&&(r.size.width=e,r.size.height=n,r.size.x=0,r.size.y=0)}if(l.Rm.debug(`abc95 (finale calc) ${t.id} xSize ${d} ySize ${h} columns ${o}${t.children.length} width=${Math.max(g,t.size?.width||0)}`),g<(t?.size?.width||0)){g=t?.size?.width||0;const e=o>0?Math.min(t.children.length,o):t.children.length;if(e>0){const r=(g-e*J-J)/e;l.Rm.debug("abc95 (growing to fit) width",t.id,g,t.size?.width,r);for(const e of t.children)e.size&&(e.size.width=r)}}t.size={width:g,height:u,x:0,y:0}}l.Rm.debug("setBlockSizes abc94 (done)",t.id,t?.size?.x,t?.size?.width,t?.size?.y,t?.size?.height)}function et(t,e){l.Rm.debug(`abc85 layout blocks (=>layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`);const r=t.columns??-1;if(l.Rm.debug("layoutBlocks columns abc95",t.id,"=>",r,t),t.children&&t.children.length>0){const a=t?.children[0]?.size?.width??0,s=t.children.length*a+(t.children.length-1)*J;l.Rm.debug("widthOfChildren 88",s,"posX");let i=0;l.Rm.debug("abc91 block?.size?.x",t.id,t?.size?.x);let n=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-J,o=0;for(const c of t.children){const a=t;if(!c.size)continue;const{width:s,height:d}=c.size,{px:h,py:g}=V(r,i);if(g!=o&&(o=g,n=t?.size?.x?t?.size?.x+(-t?.size?.width/2||0):-J,l.Rm.debug("New row in layout for block",t.id," and child ",c.id,o)),l.Rm.debug(`abc89 layout blocks (child) id: ${c.id} Pos: ${i} (px, py) ${h},${g} (${a?.size?.x},${a?.size?.y}) parent: ${a.id} width: ${s}${J}`),a.size){const t=s/2;c.size.x=n+J+t,l.Rm.debug(`abc91 layout blocks (calc) px, pyid:${c.id} startingPos=X${n} new startingPosX${c.size.x} ${t} padding=${J} width=${s} halfWidth=${t} => x:${c.size.x} y:${c.size.y} ${c.widthInColumns} (width * (child?.w || 1)) / 2 ${s*(c?.widthInColumns??1)/2}`),n=c.size.x+t,c.size.y=a.size.y-a.size.height/2+g*(d+J)+d/2+J,l.Rm.debug(`abc88 layout blocks (calc) px, pyid:${c.id}startingPosX${n}${J}${t}=>x:${c.size.x}y:${c.size.y}${c.widthInColumns}(width * (child?.w || 1)) / 2${s*(c?.widthInColumns??1)/2}`)}c.children&&et(c,e),i+=c?.widthInColumns??1,l.Rm.debug("abc88 columnsPos",c,i)}}l.Rm.debug(`layout blocks (<==layoutBlocks) ${t.id} x: ${t?.size?.x} y: ${t?.size?.y} width: ${t?.size?.width}`)}function rt(t,{minX:e,minY:r,maxX:a,maxY:s}={minX:0,minY:0,maxX:0,maxY:0}){if(t.size&&"root"!==t.id){const{x:i,y:n,width:o,height:l}=t.size;i-o/2<e&&(e=i-o/2),n-l/2<r&&(r=n-l/2),i+o/2>a&&(a=i+o/2),n+l/2>s&&(s=n+l/2)}if(t.children)for(const i of t.children)({minX:e,minY:r,maxX:a,maxY:s}=rt(i,{minX:e,minY:r,maxX:a,maxY:s}));return{minX:e,minY:r,maxX:a,maxY:s}}function at(t){const e=t.getBlock("root");if(!e)return;tt(e,t,0,0),et(e,t),l.Rm.debug("getBlocks",JSON.stringify(e,null,2));const{minX:r,minY:a,maxX:s,maxY:i}=rt(e);return{x:r,y:a,width:s-r,height:i-a}}function st(t,e){e&&t.attr("style",e)}function it(t){const e=(0,g.Ltv)(document.createElementNS("http://www.w3.org/2000/svg","foreignObject")),r=e.append("xhtml:div"),a=t.label,s=t.isNode?"nodeLabel":"edgeLabel",i=r.append("span");return i.html(a),st(i,t.labelStyle),i.attr("class",s),st(r,t.labelStyle),r.style("display","inline-block"),r.style("white-space","nowrap"),r.attr("xmlns","http://www.w3.org/1999/xhtml"),e.node()}(0,l.K2)(tt,"setBlockSizes"),(0,l.K2)(et,"layoutBlocks"),(0,l.K2)(rt,"findBounds"),(0,l.K2)(at,"layout"),(0,l.K2)(st,"applyStyle"),(0,l.K2)(it,"addHtmlLabel");var nt=(0,l.K2)(async(t,e,r,a)=>{let s=t||"";if("object"==typeof s&&(s=s[0]),(0,l._3)((0,l.D7)().flowchart.htmlLabels)){s=s.replace(/\\n|\n/g,"<br />"),l.Rm.debug("vertexText"+s);return it({isNode:a,label:await(0,n.hE)((0,o.Sm)(s)),labelStyle:e.replace("fill:","color:")})}{const t=document.createElementNS("http://www.w3.org/2000/svg","text");t.setAttribute("style",e.replace("color:","fill:"));let a=[];a="string"==typeof s?s.split(/\\n|\n|<br\s*\/?>/gi):Array.isArray(s)?s:[];for(const e of a){const a=document.createElementNS("http://www.w3.org/2000/svg","tspan");a.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),a.setAttribute("dy","1em"),a.setAttribute("x","0"),r?a.setAttribute("class","title-row"):a.setAttribute("class","row"),a.textContent=e.trim(),t.appendChild(a)}return t}},"createLabel"),ot=(0,l.K2)((t,e,r,a,s)=>{e.arrowTypeStart&&ct(t,"start",e.arrowTypeStart,r,a,s),e.arrowTypeEnd&&ct(t,"end",e.arrowTypeEnd,r,a,s)},"addEdgeMarkers"),lt={arrow_cross:"cross",arrow_point:"point",arrow_barb:"barb",arrow_circle:"circle",aggregation:"aggregation",extension:"extension",composition:"composition",dependency:"dependency",lollipop:"lollipop"},ct=(0,l.K2)((t,e,r,a,s,i)=>{const n=lt[r];if(!n)return void l.Rm.warn(`Unknown arrow type: ${r}`);const o="start"===e?"Start":"End";t.attr(`marker-${e}`,`url(${a}#${s}_${i}-${n}${o})`)},"addEdgeMarker"),dt={},ht={},gt=(0,l.K2)(async(t,e)=>{const r=(0,l.D7)(),a=(0,l._3)(r.flowchart.htmlLabels),s="markdown"===e.labelType?(0,n.GZ)(t,e.label,{style:e.labelStyle,useHtmlLabels:a,addSvgBackground:!0},r):await nt(e.label,e.labelStyle),i=t.insert("g").attr("class","edgeLabel"),o=i.insert("g").attr("class","label");o.node().appendChild(s);let c,d=s.getBBox();if(a){const t=s.children[0],e=(0,g.Ltv)(s);d=t.getBoundingClientRect(),e.attr("width",d.width),e.attr("height",d.height)}if(o.attr("transform","translate("+-d.width/2+", "+-d.height/2+")"),dt[e.id]=i,e.width=d.width,e.height=d.height,e.startLabelLeft){const r=await nt(e.startLabelLeft,e.labelStyle),a=t.insert("g").attr("class","edgeTerminals"),s=a.insert("g").attr("class","inner");c=s.node().appendChild(r);const i=r.getBBox();s.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"),ht[e.id]||(ht[e.id]={}),ht[e.id].startLeft=a,ut(c,e.startLabelLeft)}if(e.startLabelRight){const r=await nt(e.startLabelRight,e.labelStyle),a=t.insert("g").attr("class","edgeTerminals"),s=a.insert("g").attr("class","inner");c=a.node().appendChild(r),s.node().appendChild(r);const i=r.getBBox();s.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"),ht[e.id]||(ht[e.id]={}),ht[e.id].startRight=a,ut(c,e.startLabelRight)}if(e.endLabelLeft){const r=await nt(e.endLabelLeft,e.labelStyle),a=t.insert("g").attr("class","edgeTerminals"),s=a.insert("g").attr("class","inner");c=s.node().appendChild(r);const i=r.getBBox();s.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"),a.node().appendChild(r),ht[e.id]||(ht[e.id]={}),ht[e.id].endLeft=a,ut(c,e.endLabelLeft)}if(e.endLabelRight){const r=await nt(e.endLabelRight,e.labelStyle),a=t.insert("g").attr("class","edgeTerminals"),s=a.insert("g").attr("class","inner");c=s.node().appendChild(r);const i=r.getBBox();s.attr("transform","translate("+-i.width/2+", "+-i.height/2+")"),a.node().appendChild(r),ht[e.id]||(ht[e.id]={}),ht[e.id].endRight=a,ut(c,e.endLabelRight)}return s},"insertEdgeLabel");function ut(t,e){(0,l.D7)().flowchart.htmlLabels&&t&&(t.style.width=9*e.length+"px",t.style.height="12px")}(0,l.K2)(ut,"setTerminalWidth");var pt=(0,l.K2)((t,e)=>{l.Rm.debug("Moving label abc88 ",t.id,t.label,dt[t.id],e);let r=e.updatedPath?e.updatedPath:e.originalPath;const a=(0,l.D7)(),{subGraphTitleTotalMargin:s}=(0,i.O)(a);if(t.label){const a=dt[t.id];let i=t.x,n=t.y;if(r){const a=o._K.calcLabelPosition(r);l.Rm.debug("Moving label "+t.label+" from (",i,",",n,") to (",a.x,",",a.y,") abc88"),e.updatedPath&&(i=a.x,n=a.y)}a.attr("transform",`translate(${i}, ${n+s/2})`)}if(t.startLabelLeft){const e=ht[t.id].startLeft;let a=t.x,s=t.y;if(r){const e=o._K.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_left",r);a=e.x,s=e.y}e.attr("transform",`translate(${a}, ${s})`)}if(t.startLabelRight){const e=ht[t.id].startRight;let a=t.x,s=t.y;if(r){const e=o._K.calcTerminalLabelPosition(t.arrowTypeStart?10:0,"start_right",r);a=e.x,s=e.y}e.attr("transform",`translate(${a}, ${s})`)}if(t.endLabelLeft){const e=ht[t.id].endLeft;let a=t.x,s=t.y;if(r){const e=o._K.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_left",r);a=e.x,s=e.y}e.attr("transform",`translate(${a}, ${s})`)}if(t.endLabelRight){const e=ht[t.id].endRight;let a=t.x,s=t.y;if(r){const e=o._K.calcTerminalLabelPosition(t.arrowTypeEnd?10:0,"end_right",r);a=e.x,s=e.y}e.attr("transform",`translate(${a}, ${s})`)}},"positionEdgeLabel"),yt=(0,l.K2)((t,e)=>{const r=t.x,a=t.y,s=Math.abs(e.x-r),i=Math.abs(e.y-a),n=t.width/2,o=t.height/2;return s>=n||i>=o},"outsideNode"),bt=(0,l.K2)((t,e,r)=>{l.Rm.debug(`intersection calc abc89:\n outsidePoint: ${JSON.stringify(e)}\n insidePoint : ${JSON.stringify(r)}\n node : x:${t.x} y:${t.y} w:${t.width} h:${t.height}`);const a=t.x,s=t.y,i=Math.abs(a-r.x),n=t.width/2;let o=r.x<e.x?n-i:n+i;const c=t.height/2,d=Math.abs(e.y-r.y),h=Math.abs(e.x-r.x);if(Math.abs(s-e.y)*n>Math.abs(a-e.x)*c){let t=r.y<e.y?e.y-c-s:s-c-e.y;o=h*t/d;const a={x:r.x<e.x?r.x+o:r.x-h+o,y:r.y<e.y?r.y+d-t:r.y-d+t};return 0===o&&(a.x=e.x,a.y=e.y),0===h&&(a.x=e.x),0===d&&(a.y=e.y),l.Rm.debug(`abc89 topp/bott calc, Q ${d}, q ${t}, R ${h}, r ${o}`,a),a}{o=r.x<e.x?e.x-n-a:a-n-e.x;let t=d*o/h,s=r.x<e.x?r.x+h-o:r.x-h+o,i=r.y<e.y?r.y+t:r.y-t;return l.Rm.debug(`sides calc abc89, Q ${d}, q ${t}, R ${h}, r ${o}`,{_x:s,_y:i}),0===o&&(s=e.x,i=e.y),0===h&&(s=e.x),0===d&&(i=e.y),{x:s,y:i}}},"intersection"),xt=(0,l.K2)((t,e)=>{l.Rm.debug("abc88 cutPathAtIntersect",t,e);let r=[],a=t[0],s=!1;return t.forEach(t=>{if(yt(e,t)||s)a=t,s||r.push(t);else{const i=bt(e,a,t);let n=!1;r.forEach(t=>{n=n||t.x===i.x&&t.y===i.y}),r.some(t=>t.x===i.x&&t.y===i.y)||r.push(i),s=!0}}),r},"cutPathAtIntersect"),ft=(0,l.K2)(function(t,e,r,a,i,n,o){let c=r.points;l.Rm.debug("abc88 InsertEdge: edge=",r,"e=",e);let d=!1;const h=n.node(e.v);var u=n.node(e.w);u?.intersect&&h?.intersect&&(c=c.slice(1,r.points.length-1),c.unshift(h.intersect(c[0])),c.push(u.intersect(c[c.length-1]))),r.toCluster&&(l.Rm.debug("to cluster abc88",a[r.toCluster]),c=xt(r.points,a[r.toCluster].node),d=!0),r.fromCluster&&(l.Rm.debug("from cluster abc88",a[r.fromCluster]),c=xt(c.reverse(),a[r.fromCluster].node).reverse(),d=!0);const p=c.filter(t=>!Number.isNaN(t.y));let y=g.qrM;!r.curve||"graph"!==i&&"flowchart"!==i||(y=r.curve);const{x:b,y:x}=(0,s.R)(r),f=(0,g.n8j)().x(b).y(x).curve(y);let m;switch(r.thickness){case"normal":m="edge-thickness-normal";break;case"thick":case"invisible":m="edge-thickness-thick";break;default:m=""}switch(r.pattern){case"solid":m+=" edge-pattern-solid";break;case"dotted":m+=" edge-pattern-dotted";break;case"dashed":m+=" edge-pattern-dashed"}const w=t.append("path").attr("d",f(p)).attr("id",r.id).attr("class"," "+m+(r.classes?" "+r.classes:"")).attr("style",r.style);let _="";((0,l.D7)().flowchart.arrowMarkerAbsolute||(0,l.D7)().state.arrowMarkerAbsolute)&&(_=(0,l.ID)(!0)),ot(w,r,_,o,i);let L={};return d&&(L.updatedPath=c),L.originalPath=r.points,L},"insertEdge"),mt=(0,l.K2)(t=>{const e=new Set;for(const r of t)switch(r){case"x":e.add("right"),e.add("left");break;case"y":e.add("up"),e.add("down");break;default:e.add(r)}return e},"expandAndDeduplicateDirections"),wt=(0,l.K2)((t,e,r)=>{const a=mt(t),s=e.height+2*r.padding,i=s/2,n=e.width+2*i+r.padding,o=r.padding/2;return a.has("right")&&a.has("left")&&a.has("up")&&a.has("down")?[{x:0,y:0},{x:i,y:0},{x:n/2,y:2*o},{x:n-i,y:0},{x:n,y:0},{x:n,y:-s/3},{x:n+2*o,y:-s/2},{x:n,y:-2*s/3},{x:n,y:-s},{x:n-i,y:-s},{x:n/2,y:-s-2*o},{x:i,y:-s},{x:0,y:-s},{x:0,y:-2*s/3},{x:-2*o,y:-s/2},{x:0,y:-s/3}]:a.has("right")&&a.has("left")&&a.has("up")?[{x:i,y:0},{x:n-i,y:0},{x:n,y:-s/2},{x:n-i,y:-s},{x:i,y:-s},{x:0,y:-s/2}]:a.has("right")&&a.has("left")&&a.has("down")?[{x:0,y:0},{x:i,y:-s},{x:n-i,y:-s},{x:n,y:0}]:a.has("right")&&a.has("up")&&a.has("down")?[{x:0,y:0},{x:n,y:-i},{x:n,y:-s+i},{x:0,y:-s}]:a.has("left")&&a.has("up")&&a.has("down")?[{x:n,y:0},{x:0,y:-i},{x:0,y:-s+i},{x:n,y:-s}]:a.has("right")&&a.has("left")?[{x:i,y:0},{x:i,y:-o},{x:n-i,y:-o},{x:n-i,y:0},{x:n,y:-s/2},{x:n-i,y:-s},{x:n-i,y:-s+o},{x:i,y:-s+o},{x:i,y:-s},{x:0,y:-s/2}]:a.has("up")&&a.has("down")?[{x:n/2,y:0},{x:0,y:-o},{x:i,y:-o},{x:i,y:-s+o},{x:0,y:-s+o},{x:n/2,y:-s},{x:n,y:-s+o},{x:n-i,y:-s+o},{x:n-i,y:-o},{x:n,y:-o}]:a.has("right")&&a.has("up")?[{x:0,y:0},{x:n,y:-i},{x:0,y:-s}]:a.has("right")&&a.has("down")?[{x:0,y:0},{x:n,y:0},{x:0,y:-s}]:a.has("left")&&a.has("up")?[{x:n,y:0},{x:0,y:-i},{x:n,y:-s}]:a.has("left")&&a.has("down")?[{x:n,y:0},{x:0,y:0},{x:n,y:-s}]:a.has("right")?[{x:i,y:-o},{x:i,y:-o},{x:n-i,y:-o},{x:n-i,y:0},{x:n,y:-s/2},{x:n-i,y:-s},{x:n-i,y:-s+o},{x:i,y:-s+o},{x:i,y:-s+o}]:a.has("left")?[{x:i,y:0},{x:i,y:-o},{x:n-i,y:-o},{x:n-i,y:-s+o},{x:i,y:-s+o},{x:i,y:-s},{x:0,y:-s/2}]:a.has("up")?[{x:i,y:-o},{x:i,y:-s+o},{x:0,y:-s+o},{x:n/2,y:-s},{x:n,y:-s+o},{x:n-i,y:-s+o},{x:n-i,y:-o}]:a.has("down")?[{x:n/2,y:0},{x:0,y:-o},{x:i,y:-o},{x:i,y:-s+o},{x:n-i,y:-s+o},{x:n-i,y:-o},{x:n,y:-o}]:[{x:0,y:0}]},"getArrowPoints");function _t(t,e){return t.intersect(e)}(0,l.K2)(_t,"intersectNode");var Lt=_t;function kt(t,e,r,a){var s=t.x,i=t.y,n=s-a.x,o=i-a.y,l=Math.sqrt(e*e*o*o+r*r*n*n),c=Math.abs(e*r*n/l);a.x<s&&(c=-c);var d=Math.abs(e*r*o/l);return a.y<i&&(d=-d),{x:s+c,y:i+d}}(0,l.K2)(kt,"intersectEllipse");var St=kt;function vt(t,e,r){return St(t,e,e,r)}(0,l.K2)(vt,"intersectCircle");var Et=vt;function Dt(t,e,r,a){var s,i,n,o,l,c,d,h,g,u,p,y,b;if(s=e.y-t.y,n=t.x-e.x,l=e.x*t.y-t.x*e.y,g=s*r.x+n*r.y+l,u=s*a.x+n*a.y+l,!(0!==g&&0!==u&&Ct(g,u)||(i=a.y-r.y,o=r.x-a.x,c=a.x*r.y-r.x*a.y,d=i*t.x+o*t.y+c,h=i*e.x+o*e.y+c,0!==d&&0!==h&&Ct(d,h)||0===(p=s*o-i*n))))return y=Math.abs(p/2),{x:(b=n*c-o*l)<0?(b-y)/p:(b+y)/p,y:(b=i*l-s*c)<0?(b-y)/p:(b+y)/p}}function Ct(t,e){return t*e>0}(0,l.K2)(Dt,"intersectLine"),(0,l.K2)(Ct,"sameSign");var Rt=Dt,Kt=Nt;function Nt(t,e,r){var a=t.x,s=t.y,i=[],n=Number.POSITIVE_INFINITY,o=Number.POSITIVE_INFINITY;"function"==typeof e.forEach?e.forEach(function(t){n=Math.min(n,t.x),o=Math.min(o,t.y)}):(n=Math.min(n,e.x),o=Math.min(o,e.y));for(var l=a-t.width/2-n,c=s-t.height/2-o,d=0;d<e.length;d++){var h=e[d],g=e[d<e.length-1?d+1:0],u=Rt(t,r,{x:l+h.x,y:c+h.y},{x:l+g.x,y:c+g.y});u&&i.push(u)}return i.length?(i.length>1&&i.sort(function(t,e){var a=t.x-r.x,s=t.y-r.y,i=Math.sqrt(a*a+s*s),n=e.x-r.x,o=e.y-r.y,l=Math.sqrt(n*n+o*o);return i<l?-1:i===l?0:1}),i[0]):t}(0,l.K2)(Nt,"intersectPolygon");var $t={node:Lt,circle:Et,ellipse:St,polygon:Kt,rect:(0,l.K2)((t,e)=>{var r,a,s=t.x,i=t.y,n=e.x-s,o=e.y-i,l=t.width/2,c=t.height/2;return Math.abs(o)*l>Math.abs(n)*c?(o<0&&(c=-c),r=0===o?0:c*n/o,a=c):(n<0&&(l=-l),r=l,a=0===n?0:l*o/n),{x:s+r,y:i+a}},"intersectRect")},Tt=(0,l.K2)(async(t,e,r,a)=>{const s=(0,l.D7)();let i;const c=e.useHtmlLabels||(0,l._3)(s.flowchart.htmlLabels);i=r||"node default";const d=t.insert("g").attr("class",i).attr("id",e.domId||e.id),h=d.insert("g").attr("class","label").attr("style",e.labelStyle);let u;u=void 0===e.labelText?"":"string"==typeof e.labelText?e.labelText:e.labelText[0];const p=h.node();let y;y="markdown"===e.labelType?(0,n.GZ)(h,(0,l.jZ)((0,o.Sm)(u),s),{useHtmlLabels:c,width:e.width||s.flowchart.wrappingWidth,classes:"markdown-node-label"},s):p.appendChild(await nt((0,l.jZ)((0,o.Sm)(u),s),e.labelStyle,!1,a));let b=y.getBBox();const x=e.padding/2;if((0,l._3)(s.flowchart.htmlLabels)){const t=y.children[0],e=(0,g.Ltv)(y),r=t.getElementsByTagName("img");if(r){const t=""===u.replace(/<img[^>]*>/g,"").trim();await Promise.all([...r].map(e=>new Promise(r=>{function a(){if(e.style.display="flex",e.style.flexDirection="column",t){const t=s.fontSize?s.fontSize:window.getComputedStyle(document.body).fontSize,r=5,a=parseInt(t,10)*r+"px";e.style.minWidth=a,e.style.maxWidth=a}else e.style.width="100%";r(e)}(0,l.K2)(a,"setupImage"),setTimeout(()=>{e.complete&&a()}),e.addEventListener("error",a),e.addEventListener("load",a)})))}b=t.getBoundingClientRect(),e.attr("width",b.width),e.attr("height",b.height)}return c?h.attr("transform","translate("+-b.width/2+", "+-b.height/2+")"):h.attr("transform","translate(0, "+-b.height/2+")"),e.centerLabel&&h.attr("transform","translate("+-b.width/2+", "+-b.height/2+")"),h.insert("rect",":first-child"),{shapeSvg:d,bbox:b,halfPadding:x,label:h}},"labelHelper"),At=(0,l.K2)((t,e)=>{const r=e.node().getBBox();t.width=r.width,t.height=r.height},"updateNodeBounds");function It(t,e,r,a){return t.insert("polygon",":first-child").attr("points",a.map(function(t){return t.x+","+t.y}).join(" ")).attr("class","label-container").attr("transform","translate("+-e/2+","+r/2+")")}(0,l.K2)(It,"insertPolygonShape");var Ot=(0,l.K2)(async(t,e)=>{e.useHtmlLabels||(0,l.D7)().flowchart.htmlLabels||(e.centerLabel=!0);const{shapeSvg:r,bbox:a,halfPadding:s}=await Tt(t,e,"node "+e.classes,!0);l.Rm.info("Classes = ",e.classes);const i=r.insert("rect",":first-child");return i.attr("rx",e.rx).attr("ry",e.ry).attr("x",-a.width/2-s).attr("y",-a.height/2-s).attr("width",a.width+e.padding).attr("height",a.height+e.padding),At(e,i),e.intersect=function(t){return $t.rect(e,t)},r},"note"),Bt=(0,l.K2)(t=>t?" "+t:"","formatClass"),zt=(0,l.K2)((t,e)=>`${e||"node default"}${Bt(t.classes)} ${Bt(t.class)}`,"getClassesFromNode"),Mt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding+(a.height+e.padding),i=[{x:s/2,y:0},{x:s,y:-s/2},{x:s/2,y:-s},{x:0,y:-s/2}];l.Rm.info("Question main (Circle)");const n=It(r,s,s,i);return n.attr("style",e.style),At(e,n),e.intersect=function(t){return l.Rm.warn("Intersect called"),$t.polygon(e,i,t)},r},"question"),Pt=(0,l.K2)((t,e)=>{const r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a=[{x:0,y:14},{x:14,y:0},{x:0,y:-14},{x:-14,y:0}];return r.insert("polygon",":first-child").attr("points",a.map(function(t){return t.x+","+t.y}).join(" ")).attr("class","state-start").attr("r",7).attr("width",28).attr("height",28),e.width=28,e.height=28,e.intersect=function(t){return $t.circle(e,14,t)},r},"choice"),Yt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.height+e.padding,i=s/4,n=a.width+2*i+e.padding,o=[{x:i,y:0},{x:n-i,y:0},{x:n,y:-s/2},{x:n-i,y:-s},{x:i,y:-s},{x:0,y:-s/2}],l=It(r,n,s,o);return l.attr("style",e.style),At(e,l),e.intersect=function(t){return $t.polygon(e,o,t)},r},"hexagon"),Ft=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,void 0,!0),s=a.height+2*e.padding,i=s/2,n=a.width+2*i+e.padding,o=wt(e.directions,a,e),l=It(r,n,s,o);return l.attr("style",e.style),At(e,l),e.intersect=function(t){return $t.polygon(e,o,t)},r},"block_arrow"),jt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding,i=a.height+e.padding,n=[{x:-i/2,y:0},{x:s,y:0},{x:s,y:-i},{x:-i/2,y:-i},{x:0,y:-i/2}];return It(r,s,i,n).attr("style",e.style),e.width=s+i,e.height=i,e.intersect=function(t){return $t.polygon(e,n,t)},r},"rect_left_inv_arrow"),Wt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e),!0),s=a.width+e.padding,i=a.height+e.padding,n=[{x:-2*i/6,y:0},{x:s-i/6,y:0},{x:s+2*i/6,y:-i},{x:i/6,y:-i}],o=It(r,s,i,n);return o.attr("style",e.style),At(e,o),e.intersect=function(t){return $t.polygon(e,n,t)},r},"lean_right"),Xt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding,i=a.height+e.padding,n=[{x:2*i/6,y:0},{x:s+i/6,y:0},{x:s-2*i/6,y:-i},{x:-i/6,y:-i}],o=It(r,s,i,n);return o.attr("style",e.style),At(e,o),e.intersect=function(t){return $t.polygon(e,n,t)},r},"lean_left"),Ht=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding,i=a.height+e.padding,n=[{x:-2*i/6,y:0},{x:s+2*i/6,y:0},{x:s-i/6,y:-i},{x:i/6,y:-i}],o=It(r,s,i,n);return o.attr("style",e.style),At(e,o),e.intersect=function(t){return $t.polygon(e,n,t)},r},"trapezoid"),Ut=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding,i=a.height+e.padding,n=[{x:i/6,y:0},{x:s-i/6,y:0},{x:s+2*i/6,y:-i},{x:-2*i/6,y:-i}],o=It(r,s,i,n);return o.attr("style",e.style),At(e,o),e.intersect=function(t){return $t.polygon(e,n,t)},r},"inv_trapezoid"),Zt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding,i=a.height+e.padding,n=[{x:0,y:0},{x:s+i/2,y:0},{x:s,y:-i/2},{x:s+i/2,y:-i},{x:0,y:-i}],o=It(r,s,i,n);return o.attr("style",e.style),At(e,o),e.intersect=function(t){return $t.polygon(e,n,t)},r},"rect_right_inv_arrow"),qt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding,i=s/2,n=i/(2.5+s/50),o=a.height+n+e.padding,l="M 0,"+n+" a "+i+","+n+" 0,0,0 "+s+" 0 a "+i+","+n+" 0,0,0 "+-s+" 0 l 0,"+o+" a "+i+","+n+" 0,0,0 "+s+" 0 l 0,"+-o,c=r.attr("label-offset-y",n).insert("path",":first-child").attr("style",e.style).attr("d",l).attr("transform","translate("+-s/2+","+-(o/2+n)+")");return At(e,c),e.intersect=function(t){const r=$t.rect(e,t),a=r.x-e.x;if(0!=i&&(Math.abs(a)<e.width/2||Math.abs(a)==e.width/2&&Math.abs(r.y-e.y)>e.height/2-n)){let s=n*n*(1-a*a/(i*i));0!=s&&(s=Math.sqrt(s)),s=n-s,t.y-e.y>0&&(s=-s),r.y+=s}return r},r},"cylinder"),Gt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a,halfPadding:s}=await Tt(t,e,"node "+e.classes+" "+e.class,!0),i=r.insert("rect",":first-child"),n=e.positioned?e.width:a.width+e.padding,o=e.positioned?e.height:a.height+e.padding,c=e.positioned?-n/2:-a.width/2-s,d=e.positioned?-o/2:-a.height/2-s;if(i.attr("class","basic label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",c).attr("y",d).attr("width",n).attr("height",o),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(Qt(i,e.props.borders,n,o),t.delete("borders")),t.forEach(t=>{l.Rm.warn(`Unknown node property ${t}`)})}return At(e,i),e.intersect=function(t){return $t.rect(e,t)},r},"rect"),Jt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a,halfPadding:s}=await Tt(t,e,"node "+e.classes,!0),i=r.insert("rect",":first-child"),n=e.positioned?e.width:a.width+e.padding,o=e.positioned?e.height:a.height+e.padding,c=e.positioned?-n/2:-a.width/2-s,d=e.positioned?-o/2:-a.height/2-s;if(i.attr("class","basic cluster composite label-container").attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("x",c).attr("y",d).attr("width",n).attr("height",o),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(Qt(i,e.props.borders,n,o),t.delete("borders")),t.forEach(t=>{l.Rm.warn(`Unknown node property ${t}`)})}return At(e,i),e.intersect=function(t){return $t.rect(e,t)},r},"composite"),Vt=(0,l.K2)(async(t,e)=>{const{shapeSvg:r}=await Tt(t,e,"label",!0);l.Rm.trace("Classes = ",e.class);const a=r.insert("rect",":first-child");if(a.attr("width",0).attr("height",0),r.attr("class","label edgeLabel"),e.props){const t=new Set(Object.keys(e.props));e.props.borders&&(Qt(a,e.props.borders,0,0),t.delete("borders")),t.forEach(t=>{l.Rm.warn(`Unknown node property ${t}`)})}return At(e,a),e.intersect=function(t){return $t.rect(e,t)},r},"labelRect");function Qt(t,e,r,a){const s=[],i=(0,l.K2)(t=>{s.push(t,0)},"addBorder"),n=(0,l.K2)(t=>{s.push(0,t)},"skipBorder");e.includes("t")?(l.Rm.debug("add top border"),i(r)):n(r),e.includes("r")?(l.Rm.debug("add right border"),i(a)):n(a),e.includes("b")?(l.Rm.debug("add bottom border"),i(r)):n(r),e.includes("l")?(l.Rm.debug("add left border"),i(a)):n(a),t.attr("stroke-dasharray",s.join(" "))}(0,l.K2)(Qt,"applyNodePropertyBorders");var te=(0,l.K2)(async(t,e)=>{let r;r=e.classes?"node "+e.classes:"node default";const a=t.insert("g").attr("class",r).attr("id",e.domId||e.id),s=a.insert("rect",":first-child"),i=a.insert("line"),n=a.insert("g").attr("class","label"),o=e.labelText.flat?e.labelText.flat():e.labelText;let c="";c="object"==typeof o?o[0]:o,l.Rm.info("Label text abc79",c,o,"object"==typeof o);const d=n.node().appendChild(await nt(c,e.labelStyle,!0,!0));let h={width:0,height:0};if((0,l._3)((0,l.D7)().flowchart.htmlLabels)){const t=d.children[0],e=(0,g.Ltv)(d);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}l.Rm.info("Text 2",o);const u=o.slice(1,o.length);let p=d.getBBox();const y=n.node().appendChild(await nt(u.join?u.join("<br/>"):u,e.labelStyle,!0,!0));if((0,l._3)((0,l.D7)().flowchart.htmlLabels)){const t=y.children[0],e=(0,g.Ltv)(y);h=t.getBoundingClientRect(),e.attr("width",h.width),e.attr("height",h.height)}const b=e.padding/2;return(0,g.Ltv)(y).attr("transform","translate( "+(h.width>p.width?0:(p.width-h.width)/2)+", "+(p.height+b+5)+")"),(0,g.Ltv)(d).attr("transform","translate( "+(h.width<p.width?0:-(p.width-h.width)/2)+", 0)"),h=n.node().getBBox(),n.attr("transform","translate("+-h.width/2+", "+(-h.height/2-b+3)+")"),s.attr("class","outer title-state").attr("x",-h.width/2-b).attr("y",-h.height/2-b).attr("width",h.width+e.padding).attr("height",h.height+e.padding),i.attr("class","divider").attr("x1",-h.width/2-b).attr("x2",h.width/2+b).attr("y1",-h.height/2-b+p.height+b).attr("y2",-h.height/2-b+p.height+b),At(e,s),e.intersect=function(t){return $t.rect(e,t)},a},"rectWithTitle"),ee=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.height+e.padding,i=a.width+s/4+e.padding,n=r.insert("rect",":first-child").attr("style",e.style).attr("rx",s/2).attr("ry",s/2).attr("x",-i/2).attr("y",-s/2).attr("width",i).attr("height",s);return At(e,n),e.intersect=function(t){return $t.rect(e,t)},r},"stadium"),re=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a,halfPadding:s}=await Tt(t,e,zt(e,void 0),!0),i=r.insert("circle",":first-child");return i.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",a.width/2+s).attr("width",a.width+e.padding).attr("height",a.height+e.padding),l.Rm.info("Circle main"),At(e,i),e.intersect=function(t){return l.Rm.info("Circle intersect",e,a.width/2+s,t),$t.circle(e,a.width/2+s,t)},r},"circle"),ae=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a,halfPadding:s}=await Tt(t,e,zt(e,void 0),!0),i=r.insert("g",":first-child"),n=i.insert("circle"),o=i.insert("circle");return i.attr("class",e.class),n.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",a.width/2+s+5).attr("width",a.width+e.padding+10).attr("height",a.height+e.padding+10),o.attr("style",e.style).attr("rx",e.rx).attr("ry",e.ry).attr("r",a.width/2+s).attr("width",a.width+e.padding).attr("height",a.height+e.padding),l.Rm.info("DoubleCircle main"),At(e,n),e.intersect=function(t){return l.Rm.info("DoubleCircle intersect",e,a.width/2+s+5,t),$t.circle(e,a.width/2+s+5,t)},r},"doublecircle"),se=(0,l.K2)(async(t,e)=>{const{shapeSvg:r,bbox:a}=await Tt(t,e,zt(e,void 0),!0),s=a.width+e.padding,i=a.height+e.padding,n=[{x:0,y:0},{x:s,y:0},{x:s,y:-i},{x:0,y:-i},{x:0,y:0},{x:-8,y:0},{x:s+8,y:0},{x:s+8,y:-i},{x:-8,y:-i},{x:-8,y:0}],o=It(r,s,i,n);return o.attr("style",e.style),At(e,o),e.intersect=function(t){return $t.polygon(e,n,t)},r},"subroutine"),ie=(0,l.K2)((t,e)=>{const r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a=r.insert("circle",":first-child");return a.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),At(e,a),e.intersect=function(t){return $t.circle(e,7,t)},r},"start"),ne=(0,l.K2)((t,e,r)=>{const a=t.insert("g").attr("class","node default").attr("id",e.domId||e.id);let s=70,i=10;"LR"===r&&(s=10,i=70);const n=a.append("rect").attr("x",-1*s/2).attr("y",-1*i/2).attr("width",s).attr("height",i).attr("class","fork-join");return At(e,n),e.height=e.height+e.padding/2,e.width=e.width+e.padding/2,e.intersect=function(t){return $t.rect(e,t)},a},"forkJoin"),oe={rhombus:Mt,composite:Jt,question:Mt,rect:Gt,labelRect:Vt,rectWithTitle:te,choice:Pt,circle:re,doublecircle:ae,stadium:ee,hexagon:Yt,block_arrow:Ft,rect_left_inv_arrow:jt,lean_right:Wt,lean_left:Xt,trapezoid:Ht,inv_trapezoid:Ut,rect_right_inv_arrow:Zt,cylinder:qt,start:ie,end:(0,l.K2)((t,e)=>{const r=t.insert("g").attr("class","node default").attr("id",e.domId||e.id),a=r.insert("circle",":first-child"),s=r.insert("circle",":first-child");return s.attr("class","state-start").attr("r",7).attr("width",14).attr("height",14),a.attr("class","state-end").attr("r",5).attr("width",10).attr("height",10),At(e,s),e.intersect=function(t){return $t.circle(e,7,t)},r},"end"),note:Ot,subroutine:se,fork:ne,join:ne,class_box:(0,l.K2)(async(t,e)=>{const r=e.padding/2;let a;a=e.classes?"node "+e.classes:"node default";const s=t.insert("g").attr("class",a).attr("id",e.domId||e.id),i=s.insert("rect",":first-child"),n=s.insert("line"),o=s.insert("line");let c=0,d=4;const h=s.insert("g").attr("class","label");let u=0;const p=e.classData.annotations?.[0],y=e.classData.annotations[0]?"\xab"+e.classData.annotations[0]+"\xbb":"",b=h.node().appendChild(await nt(y,e.labelStyle,!0,!0));let x=b.getBBox();if((0,l._3)((0,l.D7)().flowchart.htmlLabels)){const t=b.children[0],e=(0,g.Ltv)(b);x=t.getBoundingClientRect(),e.attr("width",x.width),e.attr("height",x.height)}e.classData.annotations[0]&&(d+=x.height+4,c+=x.width);let f=e.classData.label;void 0!==e.classData.type&&""!==e.classData.type&&((0,l.D7)().flowchart.htmlLabels?f+="<"+e.classData.type+">":f+="<"+e.classData.type+">");const m=h.node().appendChild(await nt(f,e.labelStyle,!0,!0));(0,g.Ltv)(m).attr("class","classTitle");let w=m.getBBox();if((0,l._3)((0,l.D7)().flowchart.htmlLabels)){const t=m.children[0],e=(0,g.Ltv)(m);w=t.getBoundingClientRect(),e.attr("width",w.width),e.attr("height",w.height)}d+=w.height+4,w.width>c&&(c=w.width);const _=[];e.classData.members.forEach(async t=>{const r=t.getDisplayDetails();let a=r.displayText;(0,l.D7)().flowchart.htmlLabels&&(a=a.replace(/</g,"<").replace(/>/g,">"));const s=h.node().appendChild(await nt(a,r.cssStyle?r.cssStyle:e.labelStyle,!0,!0));let i=s.getBBox();if((0,l._3)((0,l.D7)().flowchart.htmlLabels)){const t=s.children[0],e=(0,g.Ltv)(s);i=t.getBoundingClientRect(),e.attr("width",i.width),e.attr("height",i.height)}i.width>c&&(c=i.width),d+=i.height+4,_.push(s)}),d+=8;const L=[];if(e.classData.methods.forEach(async t=>{const r=t.getDisplayDetails();let a=r.displayText;(0,l.D7)().flowchart.htmlLabels&&(a=a.replace(/</g,"<").replace(/>/g,">"));const s=h.node().appendChild(await nt(a,r.cssStyle?r.cssStyle:e.labelStyle,!0,!0));let i=s.getBBox();if((0,l._3)((0,l.D7)().flowchart.htmlLabels)){const t=s.children[0],e=(0,g.Ltv)(s);i=t.getBoundingClientRect(),e.attr("width",i.width),e.attr("height",i.height)}i.width>c&&(c=i.width),d+=i.height+4,L.push(s)}),d+=8,p){let t=(c-x.width)/2;(0,g.Ltv)(b).attr("transform","translate( "+(-1*c/2+t)+", "+-1*d/2+")"),u=x.height+4}let k=(c-w.width)/2;return(0,g.Ltv)(m).attr("transform","translate( "+(-1*c/2+k)+", "+(-1*d/2+u)+")"),u+=w.height+4,n.attr("class","divider").attr("x1",-c/2-r).attr("x2",c/2+r).attr("y1",-d/2-r+8+u).attr("y2",-d/2-r+8+u),u+=8,_.forEach(t=>{(0,g.Ltv)(t).attr("transform","translate( "+-c/2+", "+(-1*d/2+u+4)+")");const e=t?.getBBox();u+=(e?.height??0)+4}),u+=8,o.attr("class","divider").attr("x1",-c/2-r).attr("x2",c/2+r).attr("y1",-d/2-r+8+u).attr("y2",-d/2-r+8+u),u+=8,L.forEach(t=>{(0,g.Ltv)(t).attr("transform","translate( "+-c/2+", "+(-1*d/2+u)+")");const e=t?.getBBox();u+=(e?.height??0)+4}),i.attr("style",e.style).attr("class","outer title-state").attr("x",-c/2-r).attr("y",-d/2-r).attr("width",c+e.padding).attr("height",d+e.padding),At(e,i),e.intersect=function(t){return $t.rect(e,t)},s},"class_box")},le={},ce=(0,l.K2)(async(t,e,r)=>{let a,s;if(e.link){let i;"sandbox"===(0,l.D7)().securityLevel?i="_top":e.linkTarget&&(i=e.linkTarget||"_blank"),a=t.insert("svg:a").attr("xlink:href",e.link).attr("target",i),s=await oe[e.shape](a,e,r)}else s=await oe[e.shape](t,e,r),a=s;return e.tooltip&&s.attr("title",e.tooltip),e.class&&s.attr("class","node default "+e.class),le[e.id]=a,e.haveCallback&&le[e.id].attr("class",le[e.id].attr("class")+" clickable"),a},"insertNode"),de=(0,l.K2)(t=>{const e=le[t.id];l.Rm.trace("Transforming node",t.diff,t,"translate("+(t.x-t.width/2-5)+", "+t.width/2+")");const r=t.diff||0;return t.clusterNode?e.attr("transform","translate("+(t.x+r-t.width/2)+", "+(t.y-t.height/2-8)+")"):e.attr("transform","translate("+t.x+", "+t.y+")"),r},"positionNode");function he(t,e,r=!1){const a=t;let s="default";(a?.classes?.length||0)>0&&(s=(a?.classes??[]).join(" ")),s+=" flowchart-label";let i,n=0,c="";switch(a.type){case"round":n=5,c="rect";break;case"composite":n=0,c="composite",i=0;break;case"square":case"group":default:c="rect";break;case"diamond":c="question";break;case"hexagon":c="hexagon";break;case"block_arrow":c="block_arrow";break;case"odd":case"rect_left_inv_arrow":c="rect_left_inv_arrow";break;case"lean_right":c="lean_right";break;case"lean_left":c="lean_left";break;case"trapezoid":c="trapezoid";break;case"inv_trapezoid":c="inv_trapezoid";break;case"circle":c="circle";break;case"ellipse":c="ellipse";break;case"stadium":c="stadium";break;case"subroutine":c="subroutine";break;case"cylinder":c="cylinder";break;case"doublecircle":c="doublecircle"}const d=(0,o.sM)(a?.styles??[]),h=a.label,g=a.size??{width:0,height:0,x:0,y:0};return{labelStyle:d.labelStyle,shape:c,labelText:h,rx:n,ry:n,class:s,style:d.style,id:a.id,directions:a.directions,width:g.width,height:g.height,x:g.x,y:g.y,positioned:r,intersect:void 0,type:a.type,padding:i??(0,l.zj)()?.block?.padding??0}}async function ge(t,e,r){const a=he(e,0,!1);if("group"===a.type)return;const s=(0,l.zj)(),i=await ce(t,a,{config:s}),n=i.node().getBBox(),o=r.getBlock(a.id);o.size={width:n.width,height:n.height,x:0,y:0,node:i},r.setBlock(o),i.remove()}async function ue(t,e,r){const a=he(e,0,!0);if("space"!==r.getBlock(a.id).type){const r=(0,l.zj)();await ce(t,a,{config:r}),e.intersect=a?.intersect,de(a)}}async function pe(t,e,r,a){for(const s of e)await a(t,s,r),s.children&&await pe(t,s.children,r,a)}async function ye(t,e,r){await pe(t,e,r,ge)}async function be(t,e,r){await pe(t,e,r,ue)}async function xe(t,e,r,a,s){const i=new u.T({multigraph:!0,compound:!0});i.setGraph({rankdir:"TB",nodesep:10,ranksep:10,marginx:8,marginy:8});for(const n of r)n.size&&i.setNode(n.id,{width:n.size.width,height:n.size.height,intersect:n.intersect});for(const n of e)if(n.start&&n.end){const e=a.getBlock(n.start),r=a.getBlock(n.end);if(e?.size&&r?.size){const a=e.size,o=r.size,l=[{x:a.x,y:a.y},{x:a.x+(o.x-a.x)/2,y:a.y+(o.y-a.y)/2},{x:o.x,y:o.y}];ft(t,{v:n.start,w:n.end,name:n.id},{...n,arrowTypeEnd:n.arrowTypeEnd,arrowTypeStart:n.arrowTypeStart,points:l,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"},void 0,"block",i,s),n.label&&(await gt(t,{...n,label:n.label,labelStyle:"stroke: #333; stroke-width: 1.5px;fill:none;",arrowTypeEnd:n.arrowTypeEnd,arrowTypeStart:n.arrowTypeStart,points:l,classes:"edge-thickness-normal edge-pattern-solid flowchart-link LS-a1 LE-b1"}),pt({...n,x:l[1].x,y:l[1].y},{originalPath:l}))}}}(0,l.K2)(he,"getNodeFromBlock"),(0,l.K2)(ge,"calculateBlockSize"),(0,l.K2)(ue,"insertBlockPositioned"),(0,l.K2)(pe,"performOperations"),(0,l.K2)(ye,"calculateBlockSizes"),(0,l.K2)(be,"insertBlocks"),(0,l.K2)(xe,"insertEdges");var fe=(0,l.K2)(function(t,e){return e.db.getClasses()},"getClasses"),me={parser:y,db:X,renderer:{draw:(0,l.K2)(async function(t,e,r,a){const{securityLevel:s,block:i}=(0,l.zj)(),n=a.db;let o;"sandbox"===s&&(o=(0,g.Ltv)("#i"+e));const c="sandbox"===s?(0,g.Ltv)(o.nodes()[0].contentDocument.body):(0,g.Ltv)("body"),d="sandbox"===s?c.select(`[id="${e}"]`):(0,g.Ltv)(`[id="${e}"]`);G(d,["point","circle","cross"],a.type,e);const h=n.getBlocks(),u=n.getBlocksFlat(),p=n.getEdges(),y=d.insert("g").attr("class","block");await ye(y,h,n);const b=at(n);if(await be(y,h,n),await xe(y,p,u,n,e),b){const t=b,e=Math.max(1,Math.round(t.width/t.height*.125)),r=t.height+e+10,a=t.width+10,{useMaxWidth:s}=i;(0,l.a$)(d,r,a,!!s),l.Rm.debug("Here Bounds",b,t),d.attr("viewBox",`${t.x-5} ${t.y-5} ${t.width+10} ${t.height+10}`)}},"draw"),getClasses:fe},styles:U}},57420:(t,e,r)=>{r.d(e,{T:()=>a.T});var a=r(19641)},64350:(t,e,r)=>{r.d(e,{A:()=>s});var a=r(98020);const s=function(t){return(0,a.A)(t,4)}},80124:(t,e,r)=>{r.d(e,{A:()=>i});var a=r(46554),s=r(55385);const i=(t,e)=>a.A.lang.round(s.A.parse(t)[e])}}]); \ No newline at end of file diff --git a/assets/js/7133.0d4b51b1.js b/assets/js/7133.0d4b51b1.js new file mode 100644 index 0000000000..254923f886 --- /dev/null +++ b/assets/js/7133.0d4b51b1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7133],{94276:(t,e,i)=>{i.d(e,{diagram:()=>v});var a=i(97485),n=i(3170),s=function(){var t=(0,a.K2)(function(t,e,i,a){for(i=i||{},a=t.length;a--;i[t[a]]=e);return i},"o"),e=[1,3],i=[1,4],n=[1,5],s=[1,6],r=[1,7],o=[1,4,5,10,12,13,14,18,25,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],l=[1,4,5,10,12,13,14,18,25,28,35,37,39,41,42,48,50,51,52,53,54,55,56,57,60,61,63,64,65,66,67],h=[55,56,57],c=[2,36],d=[1,37],u=[1,36],x=[1,38],g=[1,35],f=[1,43],p=[1,41],y=[1,14],T=[1,23],m=[1,18],q=[1,19],A=[1,20],_=[1,21],b=[1,22],S=[1,24],k=[1,25],F=[1,26],P=[1,27],C=[1,28],L=[1,29],v=[1,32],I=[1,33],E=[1,34],D=[1,39],z=[1,40],w=[1,42],K=[1,44],U=[1,62],N=[1,61],R=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],B=[1,65],W=[1,66],$=[1,67],Q=[1,68],O=[1,69],X=[1,70],H=[1,71],M=[1,72],Y=[1,73],j=[1,74],G=[1,75],V=[1,76],Z=[4,5,6,7,8,9,10,11,12,13,14,15,18],J=[1,90],tt=[1,91],et=[1,92],it=[1,99],at=[1,93],nt=[1,96],st=[1,94],rt=[1,95],ot=[1,97],lt=[1,98],ht=[1,102],ct=[10,55,56,57],dt=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],ut={trace:(0,a.K2)(function(){},"trace"),yy:{},symbols_:{error:2,idStringToken:3,ALPHA:4,NUM:5,NODE_STRING:6,DOWN:7,MINUS:8,DEFAULT:9,COMMA:10,COLON:11,AMP:12,BRKT:13,MULT:14,UNICODE_TEXT:15,styleComponent:16,UNIT:17,SPACE:18,STYLE:19,PCT:20,idString:21,style:22,stylesOpt:23,classDefStatement:24,CLASSDEF:25,start:26,eol:27,QUADRANT:28,document:29,line:30,statement:31,axisDetails:32,quadrantDetails:33,points:34,title:35,title_value:36,acc_title:37,acc_title_value:38,acc_descr:39,acc_descr_value:40,acc_descr_multiline_value:41,section:42,text:43,point_start:44,point_x:45,point_y:46,class_name:47,"X-AXIS":48,"AXIS-TEXT-DELIMITER":49,"Y-AXIS":50,QUADRANT_1:51,QUADRANT_2:52,QUADRANT_3:53,QUADRANT_4:54,NEWLINE:55,SEMI:56,EOF:57,alphaNumToken:58,textNoTagsToken:59,STR:60,MD_STR:61,alphaNum:62,PUNCTUATION:63,PLUS:64,EQUALS:65,DOT:66,UNDERSCORE:67,$accept:0,$end:1},terminals_:{2:"error",4:"ALPHA",5:"NUM",6:"NODE_STRING",7:"DOWN",8:"MINUS",9:"DEFAULT",10:"COMMA",11:"COLON",12:"AMP",13:"BRKT",14:"MULT",15:"UNICODE_TEXT",17:"UNIT",18:"SPACE",19:"STYLE",20:"PCT",25:"CLASSDEF",28:"QUADRANT",35:"title",36:"title_value",37:"acc_title",38:"acc_title_value",39:"acc_descr",40:"acc_descr_value",41:"acc_descr_multiline_value",42:"section",44:"point_start",45:"point_x",46:"point_y",47:"class_name",48:"X-AXIS",49:"AXIS-TEXT-DELIMITER",50:"Y-AXIS",51:"QUADRANT_1",52:"QUADRANT_2",53:"QUADRANT_3",54:"QUADRANT_4",55:"NEWLINE",56:"SEMI",57:"EOF",60:"STR",61:"MD_STR",63:"PUNCTUATION",64:"PLUS",65:"EQUALS",66:"DOT",67:"UNDERSCORE"},productions_:[0,[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[3,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[16,1],[21,1],[21,2],[22,1],[22,2],[23,1],[23,3],[24,5],[26,2],[26,2],[26,2],[29,0],[29,2],[30,2],[31,0],[31,1],[31,2],[31,1],[31,1],[31,1],[31,2],[31,2],[31,2],[31,1],[31,1],[34,4],[34,5],[34,5],[34,6],[32,4],[32,3],[32,2],[32,4],[32,3],[32,2],[33,2],[33,2],[33,2],[33,2],[27,1],[27,1],[27,1],[43,1],[43,2],[43,1],[43,1],[62,1],[62,2],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[58,1],[59,1],[59,1],[59,1]],performAction:(0,a.K2)(function(t,e,i,a,n,s,r){var o=s.length-1;switch(n){case 23:case 68:this.$=s[o];break;case 24:case 69:this.$=s[o-1]+""+s[o];break;case 26:this.$=s[o-1]+s[o];break;case 27:this.$=[s[o].trim()];break;case 28:s[o-2].push(s[o].trim()),this.$=s[o-2];break;case 29:this.$=s[o-4],a.addClass(s[o-2],s[o]);break;case 37:this.$=[];break;case 42:this.$=s[o].trim(),a.setDiagramTitle(this.$);break;case 43:this.$=s[o].trim(),a.setAccTitle(this.$);break;case 44:case 45:this.$=s[o].trim(),a.setAccDescription(this.$);break;case 46:a.addSection(s[o].substr(8)),this.$=s[o].substr(8);break;case 47:a.addPoint(s[o-3],"",s[o-1],s[o],[]);break;case 48:a.addPoint(s[o-4],s[o-3],s[o-1],s[o],[]);break;case 49:a.addPoint(s[o-4],"",s[o-2],s[o-1],s[o]);break;case 50:a.addPoint(s[o-5],s[o-4],s[o-2],s[o-1],s[o]);break;case 51:a.setXAxisLeftText(s[o-2]),a.setXAxisRightText(s[o]);break;case 52:s[o-1].text+=" \u27f6 ",a.setXAxisLeftText(s[o-1]);break;case 53:a.setXAxisLeftText(s[o]);break;case 54:a.setYAxisBottomText(s[o-2]),a.setYAxisTopText(s[o]);break;case 55:s[o-1].text+=" \u27f6 ",a.setYAxisBottomText(s[o-1]);break;case 56:a.setYAxisBottomText(s[o]);break;case 57:a.setQuadrant1Text(s[o]);break;case 58:a.setQuadrant2Text(s[o]);break;case 59:a.setQuadrant3Text(s[o]);break;case 60:a.setQuadrant4Text(s[o]);break;case 64:case 66:this.$={text:s[o],type:"text"};break;case 65:this.$={text:s[o-1].text+""+s[o],type:s[o-1].type};break;case 67:this.$={text:s[o],type:"markdown"}}},"anonymous"),table:[{18:e,26:1,27:2,28:i,55:n,56:s,57:r},{1:[3]},{18:e,26:8,27:2,28:i,55:n,56:s,57:r},{18:e,26:9,27:2,28:i,55:n,56:s,57:r},t(o,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(h,c,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:d,5:u,10:x,12:g,13:f,14:p,18:y,25:T,35:m,37:q,39:A,41:_,42:b,48:S,50:k,51:F,52:P,53:C,54:L,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(o,[2,34]),{27:45,55:n,56:s,57:r},t(h,[2,37]),t(h,c,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:d,5:u,10:x,12:g,13:f,14:p,18:y,25:T,35:m,37:q,39:A,41:_,42:b,48:S,50:k,51:F,52:P,53:C,54:L,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(h,[2,39]),t(h,[2,40]),t(h,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(h,[2,45]),t(h,[2,46]),{18:[1,50]},{4:d,5:u,10:x,12:g,13:f,14:p,43:51,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:52,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:53,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:54,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:55,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:g,13:f,14:p,43:56,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,44:[1,57],47:[1,58],58:60,59:59,63:E,64:D,65:z,66:w,67:K},t(R,[2,64]),t(R,[2,66]),t(R,[2,67]),t(R,[2,70]),t(R,[2,71]),t(R,[2,72]),t(R,[2,73]),t(R,[2,74]),t(R,[2,75]),t(R,[2,76]),t(R,[2,77]),t(R,[2,78]),t(R,[2,79]),t(R,[2,80]),t(o,[2,35]),t(h,[2,38]),t(h,[2,42]),t(h,[2,43]),t(h,[2,44]),{3:64,4:B,5:W,6:$,7:Q,8:O,9:X,10:H,11:M,12:Y,13:j,14:G,15:V,21:63},t(h,[2,53],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,49:[1,77],63:E,64:D,65:z,66:w,67:K}),t(h,[2,56],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,49:[1,78],63:E,64:D,65:z,66:w,67:K}),t(h,[2,57],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,58],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,59],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,60],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),{45:[1,79]},{44:[1,80]},t(R,[2,65]),t(R,[2,81]),t(R,[2,82]),t(R,[2,83]),{3:82,4:B,5:W,6:$,7:Q,8:O,9:X,10:H,11:M,12:Y,13:j,14:G,15:V,18:[1,81]},t(Z,[2,23]),t(Z,[2,1]),t(Z,[2,2]),t(Z,[2,3]),t(Z,[2,4]),t(Z,[2,5]),t(Z,[2,6]),t(Z,[2,7]),t(Z,[2,8]),t(Z,[2,9]),t(Z,[2,10]),t(Z,[2,11]),t(Z,[2,12]),t(h,[2,52],{58:31,43:83,4:d,5:u,10:x,12:g,13:f,14:p,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(h,[2,55],{58:31,43:84,4:d,5:u,10:x,12:g,13:f,14:p,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),{46:[1,85]},{45:[1,86]},{4:J,5:tt,6:et,8:it,11:at,13:nt,16:89,17:st,18:rt,19:ot,20:lt,22:88,23:87},t(Z,[2,24]),t(h,[2,51],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,54],{59:59,58:60,4:d,5:u,8:U,10:x,12:g,13:f,14:p,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,47],{22:88,16:89,23:100,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),{46:[1,101]},t(h,[2,29],{10:ht}),t(ct,[2,27],{16:103,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),t(dt,[2,25]),t(dt,[2,13]),t(dt,[2,14]),t(dt,[2,15]),t(dt,[2,16]),t(dt,[2,17]),t(dt,[2,18]),t(dt,[2,19]),t(dt,[2,20]),t(dt,[2,21]),t(dt,[2,22]),t(h,[2,49],{10:ht}),t(h,[2,48],{22:88,16:89,23:104,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),{4:J,5:tt,6:et,8:it,11:at,13:nt,16:89,17:st,18:rt,19:ot,20:lt,22:105},t(dt,[2,26]),t(h,[2,50],{10:ht}),t(ct,[2,28],{16:103,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt})],defaultActions:{8:[2,30],9:[2,31]},parseError:(0,a.K2)(function(t,e){if(!e.recoverable){var i=new Error(t);throw i.hash=e,i}this.trace(t)},"parseError"),parse:(0,a.K2)(function(t){var e=this,i=[0],n=[],s=[null],r=[],o=this.table,l="",h=0,c=0,d=0,u=r.slice.call(arguments,1),x=Object.create(this.lexer),g={yy:{}};for(var f in this.yy)Object.prototype.hasOwnProperty.call(this.yy,f)&&(g.yy[f]=this.yy[f]);x.setInput(t,g.yy),g.yy.lexer=x,g.yy.parser=this,void 0===x.yylloc&&(x.yylloc={});var p=x.yylloc;r.push(p);var y=x.options&&x.options.ranges;function T(){var t;return"number"!=typeof(t=n.pop()||x.lex()||1)&&(t instanceof Array&&(t=(n=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,a.K2)(function(t){i.length=i.length-2*t,s.length=s.length-t,r.length=r.length-t},"popStack"),(0,a.K2)(T,"lex");for(var m,q,A,_,b,S,k,F,P,C={};;){if(A=i[i.length-1],this.defaultActions[A]?_=this.defaultActions[A]:(null==m&&(m=T()),_=o[A]&&o[A][m]),void 0===_||!_.length||!_[0]){var L="";for(S in P=[],o[A])this.terminals_[S]&&S>2&&P.push("'"+this.terminals_[S]+"'");L=x.showPosition?"Parse error on line "+(h+1)+":\n"+x.showPosition()+"\nExpecting "+P.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(h+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(L,{text:x.match,token:this.terminals_[m]||m,line:x.yylineno,loc:p,expected:P})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+A+", token: "+m);switch(_[0]){case 1:i.push(m),s.push(x.yytext),r.push(x.yylloc),i.push(_[1]),m=null,q?(m=q,q=null):(c=x.yyleng,l=x.yytext,h=x.yylineno,p=x.yylloc,d>0&&d--);break;case 2:if(k=this.productions_[_[1]][1],C.$=s[s.length-k],C._$={first_line:r[r.length-(k||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(k||1)].first_column,last_column:r[r.length-1].last_column},y&&(C._$.range=[r[r.length-(k||1)].range[0],r[r.length-1].range[1]]),void 0!==(b=this.performAction.apply(C,[l,c,h,g.yy,_[1],s,r].concat(u))))return b;k&&(i=i.slice(0,-1*k*2),s=s.slice(0,-1*k),r=r.slice(0,-1*k)),i.push(this.productions_[_[1]][0]),s.push(C.$),r.push(C._$),F=o[i[i.length-2]][i[i.length-1]],i.push(F);break;case 3:return!0}}return!0},"parse")},xt=function(){return{EOF:1,parseError:(0,a.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,a.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,a.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,a.K2)(function(t){var e=t.length,i=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var a=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),i.length-1&&(this.yylineno-=i.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:i?(i.length===a.length?this.yylloc.first_column:0)+a[a.length-i.length].length-i[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,a.K2)(function(){return this._more=!0,this},"more"),reject:(0,a.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,a.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,a.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,a.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,a.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,a.K2)(function(t,e){var i,a,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(a=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],i=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return i;if(this._backtrack){for(var s in n)this[s]=n[s];return!1}return!1},"test_match"),next:(0,a.K2)(function(){if(this.done)return this.EOF;var t,e,i,a;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),s=0;s<n.length;s++)if((i=this._input.match(this.rules[n[s]]))&&(!e||i[0].length>e[0].length)){if(e=i,a=s,this.options.backtrack_lexer){if(!1!==(t=this.test_match(i,n[s])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[a]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,a.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,a.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,a.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,a.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,a.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,a.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,a.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,a.K2)(function(t,e,i,a){switch(i){case 0:case 1:case 3:break;case 2:return 55;case 4:return this.begin("title"),35;case 5:return this.popState(),"title_value";case 6:return this.begin("acc_title"),37;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),39;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 23:case 25:case 31:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 24:this.begin("string");break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;case 29:return this.begin("point_start"),44;case 30:return this.begin("point_x"),45;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}},"anonymous"),rules:[/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n\r]+)/i,/^(?:%%[^\n]*)/i,/^(?:title\b)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?: *x-axis *)/i,/^(?: *y-axis *)/i,/^(?: *--+> *)/i,/^(?: *quadrant-1 *)/i,/^(?: *quadrant-2 *)/i,/^(?: *quadrant-3 *)/i,/^(?: *quadrant-4 *)/i,/^(?:classDef\b)/i,/^(?:["][`])/i,/^(?:[^`"]+)/i,/^(?:[`]["])/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?::::)/i,/^(?:^\w+)/i,/^(?:\s*:\s*\[\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?:\s*\] *)/i,/^(?:\s*,\s*)/i,/^(?:(1)|(0(.\d+)?))/i,/^(?: *quadrantChart *)/i,/^(?:[A-Za-z]+)/i,/^(?::)/i,/^(?:\+)/i,/^(?:,)/i,/^(?:=)/i,/^(?:=)/i,/^(?:\*)/i,/^(?:#)/i,/^(?:[\_])/i,/^(?:\.)/i,/^(?:&)/i,/^(?:-)/i,/^(?:[0-9]+)/i,/^(?:\s)/i,/^(?:;)/i,/^(?:[!"#$%&'*+,-.`?\\_/])/i,/^(?:$)/i],conditions:{class_name:{rules:[28],inclusive:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,6,8,10,13,14,15,16,17,18,19,20,21,24,27,29,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],inclusive:!0}}}}();function gt(){this.yy={}}return ut.lexer=xt,(0,a.K2)(gt,"Parser"),gt.prototype=ut,ut.Parser=gt,new gt}();s.parser=s;var r=s,o=(0,a.P$)(),l=class{constructor(){this.classes=new Map,this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static{(0,a.K2)(this,"QuadrantBuilder")}getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:a.UI.quadrantChart?.chartWidth||500,chartWidth:a.UI.quadrantChart?.chartHeight||500,titlePadding:a.UI.quadrantChart?.titlePadding||10,titleFontSize:a.UI.quadrantChart?.titleFontSize||20,quadrantPadding:a.UI.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:a.UI.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:a.UI.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:a.UI.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:a.UI.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:a.UI.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:a.UI.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:a.UI.quadrantChart?.pointTextPadding||5,pointLabelFontSize:a.UI.quadrantChart?.pointLabelFontSize||12,pointRadius:a.UI.quadrantChart?.pointRadius||5,xAxisPosition:a.UI.quadrantChart?.xAxisPosition||"top",yAxisPosition:a.UI.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:a.UI.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:a.UI.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:o.quadrant1Fill,quadrant2Fill:o.quadrant2Fill,quadrant3Fill:o.quadrant3Fill,quadrant4Fill:o.quadrant4Fill,quadrant1TextFill:o.quadrant1TextFill,quadrant2TextFill:o.quadrant2TextFill,quadrant3TextFill:o.quadrant3TextFill,quadrant4TextFill:o.quadrant4TextFill,quadrantPointFill:o.quadrantPointFill,quadrantPointTextFill:o.quadrantPointTextFill,quadrantXAxisTextFill:o.quadrantXAxisTextFill,quadrantYAxisTextFill:o.quadrantYAxisTextFill,quadrantTitleFill:o.quadrantTitleFill,quadrantInternalBorderStrokeFill:o.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:o.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,a.Rm.info("clear called")}setData(t){this.data={...this.data,...t}}addPoints(t){this.data.points=[...t,...this.data.points]}addClass(t,e){this.classes.set(t,e)}setConfig(t){a.Rm.trace("setConfig called with: ",t),this.config={...this.config,...t}}setThemeConfig(t){a.Rm.trace("setThemeConfig called with: ",t),this.themeConfig={...this.themeConfig,...t}}calculateSpace(t,e,i,a){const n=2*this.config.xAxisLabelPadding+this.config.xAxisLabelFontSize,s={top:"top"===t&&e?n:0,bottom:"bottom"===t&&e?n:0},r=2*this.config.yAxisLabelPadding+this.config.yAxisLabelFontSize,o={left:"left"===this.config.yAxisPosition&&i?r:0,right:"right"===this.config.yAxisPosition&&i?r:0},l=this.config.titleFontSize+2*this.config.titlePadding,h={top:a?l:0},c=this.config.quadrantPadding+o.left,d=this.config.quadrantPadding+s.top+h.top,u=this.config.chartWidth-2*this.config.quadrantPadding-o.left-o.right,x=this.config.chartHeight-2*this.config.quadrantPadding-s.top-s.bottom-h.top;return{xAxisSpace:s,yAxisSpace:o,titleSpace:h,quadrantSpace:{quadrantLeft:c,quadrantTop:d,quadrantWidth:u,quadrantHalfWidth:u/2,quadrantHeight:x,quadrantHalfHeight:x/2}}}getAxisLabels(t,e,i,a){const{quadrantSpace:n,titleSpace:s}=a,{quadrantHalfHeight:r,quadrantHeight:o,quadrantLeft:l,quadrantHalfWidth:h,quadrantTop:c,quadrantWidth:d}=n,u=Boolean(this.data.xAxisRightText),x=Boolean(this.data.yAxisTopText),g=[];return this.data.xAxisLeftText&&e&&g.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+(u?h/2:0),y:"top"===t?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+c+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:u?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&e&&g.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+h+(u?h/2:0),y:"top"===t?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+c+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:u?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&i&&g.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:"left"===this.config.yAxisPosition?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+d+this.config.quadrantPadding,y:c+o-(x?r/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:x?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&i&&g.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:"left"===this.config.yAxisPosition?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+d+this.config.quadrantPadding,y:c+r-(x?r/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:x?"center":"left",horizontalPos:"top",rotation:-90}),g}getQuadrants(t){const{quadrantSpace:e}=t,{quadrantHalfHeight:i,quadrantLeft:a,quadrantHalfWidth:n,quadrantTop:s}=e,r=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a+n,y:s,width:n,height:i,fill:this.themeConfig.quadrant1Fill},{text:{text:this.data.quadrant2Text,fill:this.themeConfig.quadrant2TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a,y:s,width:n,height:i,fill:this.themeConfig.quadrant2Fill},{text:{text:this.data.quadrant3Text,fill:this.themeConfig.quadrant3TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a,y:s+i,width:n,height:i,fill:this.themeConfig.quadrant3Fill},{text:{text:this.data.quadrant4Text,fill:this.themeConfig.quadrant4TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a+n,y:s+i,width:n,height:i,fill:this.themeConfig.quadrant4Fill}];for(const o of r)o.text.x=o.x+o.width/2,0===this.data.points.length?(o.text.y=o.y+o.height/2,o.text.horizontalPos="middle"):(o.text.y=o.y+this.config.quadrantTextTopPadding,o.text.horizontalPos="top");return r}getQuadrantPoints(t){const{quadrantSpace:e}=t,{quadrantHeight:i,quadrantLeft:a,quadrantTop:s,quadrantWidth:r}=e,o=(0,n.m4Y)().domain([0,1]).range([a,r+a]),l=(0,n.m4Y)().domain([0,1]).range([i+s,s]);return this.data.points.map(t=>{const e=this.classes.get(t.className);e&&(t={...e,...t});return{x:o(t.x),y:l(t.y),fill:t.color??this.themeConfig.quadrantPointFill,radius:t.radius??this.config.pointRadius,text:{text:t.text,fill:this.themeConfig.quadrantPointTextFill,x:o(t.x),y:l(t.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:t.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:t.strokeWidth??"0px"}})}getBorders(t){const e=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:i}=t,{quadrantHalfHeight:a,quadrantHeight:n,quadrantLeft:s,quadrantHalfWidth:r,quadrantTop:o,quadrantWidth:l}=i;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-e,y1:o,x2:s+l+e,y2:o},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+l,y1:o+e,x2:s+l,y2:o+n-e},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-e,y1:o+n,x2:s+l+e,y2:o+n},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:o+e,x2:s,y2:o+n-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:o+e,x2:s+r,y2:o+n-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+e,y1:o+a,x2:s+l-e,y2:o+a}]}getTitle(t){if(t)return{text:this.data.titleText,fill:this.themeConfig.quadrantTitleFill,fontSize:this.config.titleFontSize,horizontalPos:"top",verticalPos:"center",rotation:0,y:this.config.titlePadding,x:this.config.chartWidth/2}}build(){const t=this.config.showXAxis&&!(!this.data.xAxisLeftText&&!this.data.xAxisRightText),e=this.config.showYAxis&&!(!this.data.yAxisTopText&&!this.data.yAxisBottomText),i=this.config.showTitle&&!!this.data.titleText,a=this.data.points.length>0?"bottom":this.config.xAxisPosition,n=this.calculateSpace(a,t,e,i);return{points:this.getQuadrantPoints(n),quadrants:this.getQuadrants(n),axisLabels:this.getAxisLabels(a,t,e,n),borderLines:this.getBorders(n),title:this.getTitle(i)}}},h=class extends Error{static{(0,a.K2)(this,"InvalidStyleError")}constructor(t,e,i){super(`value for ${t} ${e} is invalid, please use a valid ${i}`),this.name="InvalidStyleError"}};function c(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function d(t){return!/^\d+$/.test(t)}function u(t){return!/^\d+px$/.test(t)}(0,a.K2)(c,"validateHexCode"),(0,a.K2)(d,"validateNumber"),(0,a.K2)(u,"validateSizeInPixels");var x=(0,a.D7)();function g(t){return(0,a.jZ)(t.trim(),x)}(0,a.K2)(g,"textSanitizer");var f=new l;function p(t){f.setData({quadrant1Text:g(t.text)})}function y(t){f.setData({quadrant2Text:g(t.text)})}function T(t){f.setData({quadrant3Text:g(t.text)})}function m(t){f.setData({quadrant4Text:g(t.text)})}function q(t){f.setData({xAxisLeftText:g(t.text)})}function A(t){f.setData({xAxisRightText:g(t.text)})}function _(t){f.setData({yAxisTopText:g(t.text)})}function b(t){f.setData({yAxisBottomText:g(t.text)})}function S(t){const e={};for(const i of t){const[t,a]=i.trim().split(/\s*:\s*/);if("radius"===t){if(d(a))throw new h(t,a,"number");e.radius=parseInt(a)}else if("color"===t){if(c(a))throw new h(t,a,"hex code");e.color=a}else if("stroke-color"===t){if(c(a))throw new h(t,a,"hex code");e.strokeColor=a}else{if("stroke-width"!==t)throw new Error(`style named ${t} is not supported.`);if(u(a))throw new h(t,a,"number of pixels (eg. 10px)");e.strokeWidth=a}}return e}function k(t,e,i,a,n){const s=S(n);f.addPoints([{x:i,y:a,text:g(t.text),className:e,...s}])}function F(t,e){f.addClass(t,S(e))}function P(t){f.setConfig({chartWidth:t})}function C(t){f.setConfig({chartHeight:t})}function L(){const t=(0,a.D7)(),{themeVariables:e,quadrantChart:i}=t;return i&&f.setConfig(i),f.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),f.setData({titleText:(0,a.ab)()}),f.build()}(0,a.K2)(p,"setQuadrant1Text"),(0,a.K2)(y,"setQuadrant2Text"),(0,a.K2)(T,"setQuadrant3Text"),(0,a.K2)(m,"setQuadrant4Text"),(0,a.K2)(q,"setXAxisLeftText"),(0,a.K2)(A,"setXAxisRightText"),(0,a.K2)(_,"setYAxisTopText"),(0,a.K2)(b,"setYAxisBottomText"),(0,a.K2)(S,"parseStyles"),(0,a.K2)(k,"addPoint"),(0,a.K2)(F,"addClass"),(0,a.K2)(P,"setWidth"),(0,a.K2)(C,"setHeight"),(0,a.K2)(L,"getQuadrantData");var v={parser:r,db:{setWidth:P,setHeight:C,setQuadrant1Text:p,setQuadrant2Text:y,setQuadrant3Text:T,setQuadrant4Text:m,setXAxisLeftText:q,setXAxisRightText:A,setYAxisTopText:_,setYAxisBottomText:b,parseStyles:S,addPoint:k,addClass:F,getQuadrantData:L,clear:(0,a.K2)(function(){f.clear(),(0,a.IU)()},"clear"),setAccTitle:a.SV,getAccTitle:a.iN,setDiagramTitle:a.ke,getDiagramTitle:a.ab,getAccDescription:a.m7,setAccDescription:a.EI},renderer:{draw:(0,a.K2)((t,e,i,s)=>{function r(t){return"top"===t?"hanging":"middle"}function o(t){return"left"===t?"start":"middle"}function l(t){return`translate(${t.x}, ${t.y}) rotate(${t.rotation||0})`}(0,a.K2)(r,"getDominantBaseLine"),(0,a.K2)(o,"getTextAnchor"),(0,a.K2)(l,"getTransformation");const h=(0,a.D7)();a.Rm.debug("Rendering quadrant chart\n"+t);const c=h.securityLevel;let d;"sandbox"===c&&(d=(0,n.Ltv)("#i"+e));const u=("sandbox"===c?(0,n.Ltv)(d.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${e}"]`),x=u.append("g").attr("class","main"),g=h.quadrantChart?.chartWidth??500,f=h.quadrantChart?.chartHeight??500;(0,a.a$)(u,f,g,h.quadrantChart?.useMaxWidth??!0),u.attr("viewBox","0 0 "+g+" "+f),s.db.setHeight(f),s.db.setWidth(g);const p=s.db.getQuadrantData(),y=x.append("g").attr("class","quadrants"),T=x.append("g").attr("class","border"),m=x.append("g").attr("class","data-points"),q=x.append("g").attr("class","labels"),A=x.append("g").attr("class","title");p.title&&A.append("text").attr("x",0).attr("y",0).attr("fill",p.title.fill).attr("font-size",p.title.fontSize).attr("dominant-baseline",r(p.title.horizontalPos)).attr("text-anchor",o(p.title.verticalPos)).attr("transform",l(p.title)).text(p.title.text),p.borderLines&&T.selectAll("line").data(p.borderLines).enter().append("line").attr("x1",t=>t.x1).attr("y1",t=>t.y1).attr("x2",t=>t.x2).attr("y2",t=>t.y2).style("stroke",t=>t.strokeFill).style("stroke-width",t=>t.strokeWidth);const _=y.selectAll("g.quadrant").data(p.quadrants).enter().append("g").attr("class","quadrant");_.append("rect").attr("x",t=>t.x).attr("y",t=>t.y).attr("width",t=>t.width).attr("height",t=>t.height).attr("fill",t=>t.fill),_.append("text").attr("x",0).attr("y",0).attr("fill",t=>t.text.fill).attr("font-size",t=>t.text.fontSize).attr("dominant-baseline",t=>r(t.text.horizontalPos)).attr("text-anchor",t=>o(t.text.verticalPos)).attr("transform",t=>l(t.text)).text(t=>t.text.text);q.selectAll("g.label").data(p.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text(t=>t.text).attr("fill",t=>t.fill).attr("font-size",t=>t.fontSize).attr("dominant-baseline",t=>r(t.horizontalPos)).attr("text-anchor",t=>o(t.verticalPos)).attr("transform",t=>l(t));const b=m.selectAll("g.data-point").data(p.points).enter().append("g").attr("class","data-point");b.append("circle").attr("cx",t=>t.x).attr("cy",t=>t.y).attr("r",t=>t.radius).attr("fill",t=>t.fill).attr("stroke",t=>t.strokeColor).attr("stroke-width",t=>t.strokeWidth),b.append("text").attr("x",0).attr("y",0).text(t=>t.text.text).attr("fill",t=>t.text.fill).attr("font-size",t=>t.text.fontSize).attr("dominant-baseline",t=>r(t.text.horizontalPos)).attr("text-anchor",t=>o(t.text.verticalPos)).attr("transform",t=>l(t.text))},"draw")},styles:(0,a.K2)(()=>"","styles")}}}]); \ No newline at end of file diff --git a/assets/js/7136df27.1082e2aa.js b/assets/js/7136df27.1082e2aa.js new file mode 100644 index 0000000000..a82c7f3bc9 --- /dev/null +++ b/assets/js/7136df27.1082e2aa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4167],{7519:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>a,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"rules/depths","title":"Depths","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","source":"@site/versioned_docs/version-0.12.0/rules/depths.md","sourceDirName":"rules","slug":"/rules/depths","permalink":"/ModuleCheck/docs/0.12.0/rules/depths","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/depths.md","tags":[],"version":"0.12.0","frontMatter":{"id":"depths","title":"Depths","sidebar_label":"Depths"},"sidebar":"Docs","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/overshot_dependency"},"next":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory"}}');var r=l(23420),t=l(65404);const d={id:"depths",title:"Depths",sidebar_label:"Depths"},i=void 0,c={},o=[{value:"Dependencies and Build Concurrency",id:"dependencies-and-build-concurrency",level:3},{value:"Depth",id:"depth",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",mermaid:"mermaid",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"TL;DR - Low depth values mean faster builds and better all-around scalability."}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["It's often useful to think of module dependencies as a directed tree\nor ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Directed_acyclic_graph",children:"directed acyclic graph"}),". If a module is a\nnode, then each module dependency is a child node, and the dependencies of those dependencies are\ngrand-child nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["This is especially useful when thinking about ",(0,r.jsx)(n.strong,{children:"build performance"}),", because the parent-child\nrelationship is clear: ",(0,r.jsx)(n.em,{children:"child nodes must build before parent nodes"}),"."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(:app):::depth2\n\n screen1(:screen-1):::depth1\n screen2(:screen-2):::depth1\n\n lib1(:lib-1):::depth0\n lib2(:lib-2):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n\n screen1 --\x3e lib1\n screen1 --\x3e lib2\n screen2 --\x3e lib2"}),"\n",(0,r.jsx)(n.p,{children:"In the above example,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," must be built before ",(0,r.jsx)(n.code,{children:":screen-1"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-2"})," must be build before ",(0,r.jsx)(n.code,{children:":screen-2"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":screen-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," must be built before ",(0,r.jsx)(n.code,{children:":app"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build\nbefore their parents."}),"\n",(0,r.jsx)(n.h3,{id:"dependencies-and-build-concurrency",children:"Dependencies and Build Concurrency"}),"\n",(0,r.jsx)(n.p,{children:"Individual module builds are always done single-threaded, but multiple modules may build in parallel\nso long as no module in the set depends upon another module in that set. In the above graph,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":scren-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The maximum number of parallel module builds is determined by the structure of the dependency graph\nand the number of available processor cores on the machine which is performing the build."}),"\n",(0,r.jsx)(n.h3,{id:"depth",children:"Depth"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Depth"})," refers to the maximum number of edges between a module and each of its leaf nodes in the\nproject dependency graph."]}),"\n",(0,r.jsx)(n.p,{children:"Low depth values indicate a shallow or flat project structure with loose (or no) coupling between\nmodules. In a full build, these projects scale well with hardware upgrades because they're able to\nbuild all those independent modules in parallel."}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n subgraph sg [A shallow graph]\n direction TB\n\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 2):::depth2\n\n screen1(depth: 1):::depth1\n screen2(depth: 1):::depth1\n screen3(depth: 1):::depth1\n screen4(depth: 1):::depth1\n\n lib1(depth: 0):::depth0\n lib2(depth: 0):::depth0\n lib3(depth: 0):::depth0\n lib4(depth: 0):::depth0\n lib5(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e lib1\n screen1 --\x3e lib4\n\n screen2 --\x3e lib1\n screen2 --\x3e lib3\n screen2 --\x3e lib4\n\n screen3 --\x3e lib2\n screen3 --\x3e lib3\n screen3 --\x3e lib4\n\n screen4 --\x3e lib3\n screen4 --\x3e lib5\n\n end\n\n style sg opacity:0.0\n"}),"\n",(0,r.jsxs)(n.p,{children:['On the other hand, "deep" projects do not offer many opportunities for parallelization. They have\nproject dependencies which must be built ',(0,r.jsx)(n.em,{children:"sequentially"}),". They also perform poorly in incremental\nbuilds, because a single change to even a mid-level module invalidates cached builds for half of the\nproject."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n style sg opacity:0.0\n subgraph sg [A deep graph]\n direction TB\n\n classDef depth6 fill:#800,stroke:#000,color:#FFF\n classDef depth5 fill:#A50,stroke:#000,color:#FFF\n classDef depth4 fill:#C0B,stroke:#000,color:#000\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 6):::depth6\n\n screen1(depth: 5):::depth5\n screen2(depth: 5):::depth5\n\n screen3(depth: 4):::depth4\n screen4(depth: 4):::depth4\n\n lib1(depth: 3):::depth3\n lib2(depth: 3):::depth3\n\n lib3(depth: 2):::depth2\n lib4(depth: 2):::depth2\n\n lib5(depth: 1):::depth1\n\n lib6(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e screen3\n screen1 --\x3e screen4\n\n screen2 --\x3e screen4\n\n screen3 --\x3e lib1\n screen3 --\x3e lib2\n\n screen4 --\x3e lib1\n screen4 --\x3e lib4\n\n lib1 --\x3e lib3\n lib1 --\x3e lib4\n\n lib2 --\x3e lib3\n\n lib3 --\x3e lib5\n lib4 --\x3e lib5\n\n lib5 --\x3e lib6\n\n end\n"})]})}function a(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},65404:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>i});var s=l(36672);const r={},t=s.createContext(r);function d(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/71eb5ef4.a76ebaef.js b/assets/js/71eb5ef4.a76ebaef.js new file mode 100644 index 0000000000..4bf35c0571 --- /dev/null +++ b/assets/js/71eb5ef4.a76ebaef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7842],{47394:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>l,contentTitle:()=>i,default:()=>a,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","source":"@site/docs/rules/compiler/unused_kapt_plugin.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_plugin","permalink":"/ModuleCheck/docs/next/rules/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/compiler/unused_kapt_plugin.md","tags":[],"version":"current","frontMatter":{"id":"unused_kapt_plugin","slug":"/rules/unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/next/rules/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/next/rules/custom_kapt_matchers"}}');var u=n(23420),o=n(65404);const r={id:"unused_kapt_plugin",slug:"/rules/unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,l={},c=[];function p(e){const t={code:"code",p:"p",...(0,o.R)(),...e.components};return(0,u.jsxs)(t.p,{children:["If there are no ",(0,u.jsx)(t.code,{children:"kapt"}),"/",(0,u.jsx)(t.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in\napplying the ",(0,u.jsx)(t.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,u.jsx)(t,{...e,children:(0,u.jsx)(p,{...e})}):p(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var s=n(36672);const u={},o=s.createContext(u);function r(e){const t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(u):e.components||u:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/724ecf1a.9bf4f373.js b/assets/js/724ecf1a.9bf4f373.js new file mode 100644 index 0000000000..e1da9630f6 --- /dev/null +++ b/assets/js/724ecf1a.9bf4f373.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2492],{25456:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>a,frontMatter:()=>i,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/docs/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/next/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/inherited_dependency.md","tags":[],"version":"current","frontMatter":{"id":"inherited_dependency","slug":"/rules/inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/next/rules/must_be_api"},"next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/next/rules/redundant_dependency"}}');var c=d(23420),s=d(65404);const i={id:"inherited_dependency",slug:"/rules/inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},o=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,s.R)(),...e.components};return(0,c.jsxs)(c.Fragment,{children:[(0,c.jsxs)(n.p,{children:["Assume that ",(0,c.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,c.jsx)(n.code,{children:":moduleB"}),", and ",(0,c.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,c.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,c.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,c.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,c.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,c.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,c.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,c.jsx)(n.code,{children:":moduleA"})," -> ",(0,c.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,c.jsx)(n,{...e,children:(0,c.jsx)(u,{...e})}):u(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>i,x:()=>o});var t=d(36672);const c={},s=t.createContext(c);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(c):e.components||c:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7273998d.6460f2be.js b/assets/js/7273998d.6460f2be.js new file mode 100644 index 0000000000..bbe7558dfa --- /dev/null +++ b/assets/js/7273998d.6460f2be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6360],{29035:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>o,default:()=>a,frontMatter:()=>c,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/docs/rules/unused_dependency.md","sourceDirName":"rules","slug":"/rules/unused_dependency","permalink":"/ModuleCheck/docs/next/rules/unused_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/unused_dependency.md","tags":[],"version":"current","frontMatter":{"id":"unused_dependency","slug":"/rules/unused_dependency","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/next/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/next/rules/must_be_api"}}');var t=d(23420),u=d(65404);const c={id:"unused_dependency",slug:"/rules/unused_dependency",title:"Unused Dependency",sidebar_label:"Unused Dependency"},o=void 0,r={},l=[];function i(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,t.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(i,{...e})}):i(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>c,x:()=>o});var s=d(36672);const t={},u=s.createContext(t);function c(e){const n=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:c(e.components),s.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7306.a7783f4e.js b/assets/js/7306.a7783f4e.js new file mode 100644 index 0000000000..29986742ac --- /dev/null +++ b/assets/js/7306.a7783f4e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7306],{57306:(e,c,k)=>{k.d(c,{createTreemapServices:()=>s.d});var s=k(73311);k(60349)}}]); \ No newline at end of file diff --git a/assets/js/7339.4592535c.js b/assets/js/7339.4592535c.js new file mode 100644 index 0000000000..99255e441f --- /dev/null +++ b/assets/js/7339.4592535c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7339],{37339:(t,e,a)=>{a.d(e,{diagram:()=>Nt});var n=a(41041),i=a(9420),r=a(97485),s=a(3170),l=a(41407),o=function(){var t=(0,r.K2)(function(t,e,a,n){for(a=a||{},n=t.length;n--;a[t[n]]=e);return a},"o"),e=[1,24],a=[1,25],n=[1,26],i=[1,27],s=[1,28],l=[1,63],o=[1,64],h=[1,65],d=[1,66],u=[1,67],p=[1,68],y=[1,69],g=[1,29],f=[1,30],b=[1,31],x=[1,32],m=[1,33],_=[1,34],E=[1,35],S=[1,36],A=[1,37],C=[1,38],w=[1,39],k=[1,40],O=[1,41],T=[1,42],v=[1,43],R=[1,44],D=[1,45],N=[1,46],P=[1,47],B=[1,48],I=[1,50],M=[1,51],j=[1,52],K=[1,53],L=[1,54],Y=[1,55],U=[1,56],F=[1,57],X=[1,58],z=[1,59],W=[1,60],Q=[14,42],$=[14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],H=[12,14,34,36,37,38,39,40,41,42,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],q=[1,82],V=[1,83],G=[1,84],J=[1,85],Z=[12,14,42],tt=[12,14,33,42],et=[12,14,33,42,76,77,79,80],at=[12,33],nt=[34,36,37,38,39,40,41,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74],it={trace:(0,r.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,direction:5,direction_tb:6,direction_bt:7,direction_rl:8,direction_lr:9,graphConfig:10,C4_CONTEXT:11,NEWLINE:12,statements:13,EOF:14,C4_CONTAINER:15,C4_COMPONENT:16,C4_DYNAMIC:17,C4_DEPLOYMENT:18,otherStatements:19,diagramStatements:20,otherStatement:21,title:22,accDescription:23,acc_title:24,acc_title_value:25,acc_descr:26,acc_descr_value:27,acc_descr_multiline_value:28,boundaryStatement:29,boundaryStartStatement:30,boundaryStopStatement:31,boundaryStart:32,LBRACE:33,ENTERPRISE_BOUNDARY:34,attributes:35,SYSTEM_BOUNDARY:36,BOUNDARY:37,CONTAINER_BOUNDARY:38,NODE:39,NODE_L:40,NODE_R:41,RBRACE:42,diagramStatement:43,PERSON:44,PERSON_EXT:45,SYSTEM:46,SYSTEM_DB:47,SYSTEM_QUEUE:48,SYSTEM_EXT:49,SYSTEM_EXT_DB:50,SYSTEM_EXT_QUEUE:51,CONTAINER:52,CONTAINER_DB:53,CONTAINER_QUEUE:54,CONTAINER_EXT:55,CONTAINER_EXT_DB:56,CONTAINER_EXT_QUEUE:57,COMPONENT:58,COMPONENT_DB:59,COMPONENT_QUEUE:60,COMPONENT_EXT:61,COMPONENT_EXT_DB:62,COMPONENT_EXT_QUEUE:63,REL:64,BIREL:65,REL_U:66,REL_D:67,REL_L:68,REL_R:69,REL_B:70,REL_INDEX:71,UPDATE_EL_STYLE:72,UPDATE_REL_STYLE:73,UPDATE_LAYOUT_CONFIG:74,attribute:75,STR:76,STR_KEY:77,STR_VALUE:78,ATTRIBUTE:79,ATTRIBUTE_EMPTY:80,$accept:0,$end:1},terminals_:{2:"error",6:"direction_tb",7:"direction_bt",8:"direction_rl",9:"direction_lr",11:"C4_CONTEXT",12:"NEWLINE",14:"EOF",15:"C4_CONTAINER",16:"C4_COMPONENT",17:"C4_DYNAMIC",18:"C4_DEPLOYMENT",22:"title",23:"accDescription",24:"acc_title",25:"acc_title_value",26:"acc_descr",27:"acc_descr_value",28:"acc_descr_multiline_value",33:"LBRACE",34:"ENTERPRISE_BOUNDARY",36:"SYSTEM_BOUNDARY",37:"BOUNDARY",38:"CONTAINER_BOUNDARY",39:"NODE",40:"NODE_L",41:"NODE_R",42:"RBRACE",44:"PERSON",45:"PERSON_EXT",46:"SYSTEM",47:"SYSTEM_DB",48:"SYSTEM_QUEUE",49:"SYSTEM_EXT",50:"SYSTEM_EXT_DB",51:"SYSTEM_EXT_QUEUE",52:"CONTAINER",53:"CONTAINER_DB",54:"CONTAINER_QUEUE",55:"CONTAINER_EXT",56:"CONTAINER_EXT_DB",57:"CONTAINER_EXT_QUEUE",58:"COMPONENT",59:"COMPONENT_DB",60:"COMPONENT_QUEUE",61:"COMPONENT_EXT",62:"COMPONENT_EXT_DB",63:"COMPONENT_EXT_QUEUE",64:"REL",65:"BIREL",66:"REL_U",67:"REL_D",68:"REL_L",69:"REL_R",70:"REL_B",71:"REL_INDEX",72:"UPDATE_EL_STYLE",73:"UPDATE_REL_STYLE",74:"UPDATE_LAYOUT_CONFIG",76:"STR",77:"STR_KEY",78:"STR_VALUE",79:"ATTRIBUTE",80:"ATTRIBUTE_EMPTY"},productions_:[0,[3,1],[3,1],[5,1],[5,1],[5,1],[5,1],[4,1],[10,4],[10,4],[10,4],[10,4],[10,4],[13,1],[13,1],[13,2],[19,1],[19,2],[19,3],[21,1],[21,1],[21,2],[21,2],[21,1],[29,3],[30,3],[30,3],[30,4],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[32,2],[31,1],[20,1],[20,2],[20,3],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,1],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[43,2],[35,1],[35,2],[75,1],[75,2],[75,1],[75,1]],performAction:(0,r.K2)(function(t,e,a,n,i,r,s){var l=r.length-1;switch(i){case 3:n.setDirection("TB");break;case 4:n.setDirection("BT");break;case 5:n.setDirection("RL");break;case 6:n.setDirection("LR");break;case 8:case 9:case 10:case 11:case 12:n.setC4Type(r[l-3]);break;case 19:n.setTitle(r[l].substring(6)),this.$=r[l].substring(6);break;case 20:n.setAccDescription(r[l].substring(15)),this.$=r[l].substring(15);break;case 21:this.$=r[l].trim(),n.setTitle(this.$);break;case 22:case 23:this.$=r[l].trim(),n.setAccDescription(this.$);break;case 28:r[l].splice(2,0,"ENTERPRISE"),n.addPersonOrSystemBoundary(...r[l]),this.$=r[l];break;case 29:r[l].splice(2,0,"SYSTEM"),n.addPersonOrSystemBoundary(...r[l]),this.$=r[l];break;case 30:n.addPersonOrSystemBoundary(...r[l]),this.$=r[l];break;case 31:r[l].splice(2,0,"CONTAINER"),n.addContainerBoundary(...r[l]),this.$=r[l];break;case 32:n.addDeploymentNode("node",...r[l]),this.$=r[l];break;case 33:n.addDeploymentNode("nodeL",...r[l]),this.$=r[l];break;case 34:n.addDeploymentNode("nodeR",...r[l]),this.$=r[l];break;case 35:n.popBoundaryParseStack();break;case 39:n.addPersonOrSystem("person",...r[l]),this.$=r[l];break;case 40:n.addPersonOrSystem("external_person",...r[l]),this.$=r[l];break;case 41:n.addPersonOrSystem("system",...r[l]),this.$=r[l];break;case 42:n.addPersonOrSystem("system_db",...r[l]),this.$=r[l];break;case 43:n.addPersonOrSystem("system_queue",...r[l]),this.$=r[l];break;case 44:n.addPersonOrSystem("external_system",...r[l]),this.$=r[l];break;case 45:n.addPersonOrSystem("external_system_db",...r[l]),this.$=r[l];break;case 46:n.addPersonOrSystem("external_system_queue",...r[l]),this.$=r[l];break;case 47:n.addContainer("container",...r[l]),this.$=r[l];break;case 48:n.addContainer("container_db",...r[l]),this.$=r[l];break;case 49:n.addContainer("container_queue",...r[l]),this.$=r[l];break;case 50:n.addContainer("external_container",...r[l]),this.$=r[l];break;case 51:n.addContainer("external_container_db",...r[l]),this.$=r[l];break;case 52:n.addContainer("external_container_queue",...r[l]),this.$=r[l];break;case 53:n.addComponent("component",...r[l]),this.$=r[l];break;case 54:n.addComponent("component_db",...r[l]),this.$=r[l];break;case 55:n.addComponent("component_queue",...r[l]),this.$=r[l];break;case 56:n.addComponent("external_component",...r[l]),this.$=r[l];break;case 57:n.addComponent("external_component_db",...r[l]),this.$=r[l];break;case 58:n.addComponent("external_component_queue",...r[l]),this.$=r[l];break;case 60:n.addRel("rel",...r[l]),this.$=r[l];break;case 61:n.addRel("birel",...r[l]),this.$=r[l];break;case 62:n.addRel("rel_u",...r[l]),this.$=r[l];break;case 63:n.addRel("rel_d",...r[l]),this.$=r[l];break;case 64:n.addRel("rel_l",...r[l]),this.$=r[l];break;case 65:n.addRel("rel_r",...r[l]),this.$=r[l];break;case 66:n.addRel("rel_b",...r[l]),this.$=r[l];break;case 67:r[l].splice(0,1),n.addRel("rel",...r[l]),this.$=r[l];break;case 68:n.updateElStyle("update_el_style",...r[l]),this.$=r[l];break;case 69:n.updateRelStyle("update_rel_style",...r[l]),this.$=r[l];break;case 70:n.updateLayoutConfig("update_layout_config",...r[l]),this.$=r[l];break;case 71:this.$=[r[l]];break;case 72:r[l].unshift(r[l-1]),this.$=r[l];break;case 73:case 75:this.$=r[l].trim();break;case 74:let t={};t[r[l-1].trim()]=r[l].trim(),this.$=t;break;case 76:this.$=""}},"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],7:[1,6],8:[1,7],9:[1,8],10:4,11:[1,9],15:[1,10],16:[1,11],17:[1,12],18:[1,13]},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,7]},{1:[2,3]},{1:[2,4]},{1:[2,5]},{1:[2,6]},{12:[1,14]},{12:[1,15]},{12:[1,16]},{12:[1,17]},{12:[1,18]},{13:19,19:20,20:21,21:22,22:e,23:a,24:n,26:i,28:s,29:49,30:61,32:62,34:l,36:o,37:h,38:d,39:u,40:p,41:y,43:23,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W},{13:70,19:20,20:21,21:22,22:e,23:a,24:n,26:i,28:s,29:49,30:61,32:62,34:l,36:o,37:h,38:d,39:u,40:p,41:y,43:23,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W},{13:71,19:20,20:21,21:22,22:e,23:a,24:n,26:i,28:s,29:49,30:61,32:62,34:l,36:o,37:h,38:d,39:u,40:p,41:y,43:23,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W},{13:72,19:20,20:21,21:22,22:e,23:a,24:n,26:i,28:s,29:49,30:61,32:62,34:l,36:o,37:h,38:d,39:u,40:p,41:y,43:23,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W},{13:73,19:20,20:21,21:22,22:e,23:a,24:n,26:i,28:s,29:49,30:61,32:62,34:l,36:o,37:h,38:d,39:u,40:p,41:y,43:23,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W},{14:[1,74]},t(Q,[2,13],{43:23,29:49,30:61,32:62,20:75,34:l,36:o,37:h,38:d,39:u,40:p,41:y,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W}),t(Q,[2,14]),t($,[2,16],{12:[1,76]}),t(Q,[2,36],{12:[1,77]}),t(H,[2,19]),t(H,[2,20]),{25:[1,78]},{27:[1,79]},t(H,[2,23]),{35:80,75:81,76:q,77:V,79:G,80:J},{35:86,75:81,76:q,77:V,79:G,80:J},{35:87,75:81,76:q,77:V,79:G,80:J},{35:88,75:81,76:q,77:V,79:G,80:J},{35:89,75:81,76:q,77:V,79:G,80:J},{35:90,75:81,76:q,77:V,79:G,80:J},{35:91,75:81,76:q,77:V,79:G,80:J},{35:92,75:81,76:q,77:V,79:G,80:J},{35:93,75:81,76:q,77:V,79:G,80:J},{35:94,75:81,76:q,77:V,79:G,80:J},{35:95,75:81,76:q,77:V,79:G,80:J},{35:96,75:81,76:q,77:V,79:G,80:J},{35:97,75:81,76:q,77:V,79:G,80:J},{35:98,75:81,76:q,77:V,79:G,80:J},{35:99,75:81,76:q,77:V,79:G,80:J},{35:100,75:81,76:q,77:V,79:G,80:J},{35:101,75:81,76:q,77:V,79:G,80:J},{35:102,75:81,76:q,77:V,79:G,80:J},{35:103,75:81,76:q,77:V,79:G,80:J},{35:104,75:81,76:q,77:V,79:G,80:J},t(Z,[2,59]),{35:105,75:81,76:q,77:V,79:G,80:J},{35:106,75:81,76:q,77:V,79:G,80:J},{35:107,75:81,76:q,77:V,79:G,80:J},{35:108,75:81,76:q,77:V,79:G,80:J},{35:109,75:81,76:q,77:V,79:G,80:J},{35:110,75:81,76:q,77:V,79:G,80:J},{35:111,75:81,76:q,77:V,79:G,80:J},{35:112,75:81,76:q,77:V,79:G,80:J},{35:113,75:81,76:q,77:V,79:G,80:J},{35:114,75:81,76:q,77:V,79:G,80:J},{35:115,75:81,76:q,77:V,79:G,80:J},{20:116,29:49,30:61,32:62,34:l,36:o,37:h,38:d,39:u,40:p,41:y,43:23,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W},{12:[1,118],33:[1,117]},{35:119,75:81,76:q,77:V,79:G,80:J},{35:120,75:81,76:q,77:V,79:G,80:J},{35:121,75:81,76:q,77:V,79:G,80:J},{35:122,75:81,76:q,77:V,79:G,80:J},{35:123,75:81,76:q,77:V,79:G,80:J},{35:124,75:81,76:q,77:V,79:G,80:J},{35:125,75:81,76:q,77:V,79:G,80:J},{14:[1,126]},{14:[1,127]},{14:[1,128]},{14:[1,129]},{1:[2,8]},t(Q,[2,15]),t($,[2,17],{21:22,19:130,22:e,23:a,24:n,26:i,28:s}),t(Q,[2,37],{19:20,20:21,21:22,43:23,29:49,30:61,32:62,13:131,22:e,23:a,24:n,26:i,28:s,34:l,36:o,37:h,38:d,39:u,40:p,41:y,44:g,45:f,46:b,47:x,48:m,49:_,50:E,51:S,52:A,53:C,54:w,55:k,56:O,57:T,58:v,59:R,60:D,61:N,62:P,63:B,64:I,65:M,66:j,67:K,68:L,69:Y,70:U,71:F,72:X,73:z,74:W}),t(H,[2,21]),t(H,[2,22]),t(Z,[2,39]),t(tt,[2,71],{75:81,35:132,76:q,77:V,79:G,80:J}),t(et,[2,73]),{78:[1,133]},t(et,[2,75]),t(et,[2,76]),t(Z,[2,40]),t(Z,[2,41]),t(Z,[2,42]),t(Z,[2,43]),t(Z,[2,44]),t(Z,[2,45]),t(Z,[2,46]),t(Z,[2,47]),t(Z,[2,48]),t(Z,[2,49]),t(Z,[2,50]),t(Z,[2,51]),t(Z,[2,52]),t(Z,[2,53]),t(Z,[2,54]),t(Z,[2,55]),t(Z,[2,56]),t(Z,[2,57]),t(Z,[2,58]),t(Z,[2,60]),t(Z,[2,61]),t(Z,[2,62]),t(Z,[2,63]),t(Z,[2,64]),t(Z,[2,65]),t(Z,[2,66]),t(Z,[2,67]),t(Z,[2,68]),t(Z,[2,69]),t(Z,[2,70]),{31:134,42:[1,135]},{12:[1,136]},{33:[1,137]},t(at,[2,28]),t(at,[2,29]),t(at,[2,30]),t(at,[2,31]),t(at,[2,32]),t(at,[2,33]),t(at,[2,34]),{1:[2,9]},{1:[2,10]},{1:[2,11]},{1:[2,12]},t($,[2,18]),t(Q,[2,38]),t(tt,[2,72]),t(et,[2,74]),t(Z,[2,24]),t(Z,[2,35]),t(nt,[2,25]),t(nt,[2,26],{12:[1,138]}),t(nt,[2,27])],defaultActions:{2:[2,1],3:[2,2],4:[2,7],5:[2,3],6:[2,4],7:[2,5],8:[2,6],74:[2,8],126:[2,9],127:[2,10],128:[2,11],129:[2,12]},parseError:(0,r.K2)(function(t,e){if(!e.recoverable){var a=new Error(t);throw a.hash=e,a}this.trace(t)},"parseError"),parse:(0,r.K2)(function(t){var e=this,a=[0],n=[],i=[null],s=[],l=this.table,o="",c=0,h=0,d=0,u=s.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var f=p.yylloc;s.push(f);var b=p.options&&p.options.ranges;function x(){var t;return"number"!=typeof(t=n.pop()||p.lex()||1)&&(t instanceof Array&&(t=(n=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,r.K2)(function(t){a.length=a.length-2*t,i.length=i.length-t,s.length=s.length-t},"popStack"),(0,r.K2)(x,"lex");for(var m,_,E,S,A,C,w,k,O,T={};;){if(E=a[a.length-1],this.defaultActions[E]?S=this.defaultActions[E]:(null==m&&(m=x()),S=l[E]&&l[E][m]),void 0===S||!S.length||!S[0]){var v="";for(C in O=[],l[E])this.terminals_[C]&&C>2&&O.push("'"+this.terminals_[C]+"'");v=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+O.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(v,{text:p.match,token:this.terminals_[m]||m,line:p.yylineno,loc:f,expected:O})}if(S[0]instanceof Array&&S.length>1)throw new Error("Parse Error: multiple actions possible at state: "+E+", token: "+m);switch(S[0]){case 1:a.push(m),i.push(p.yytext),s.push(p.yylloc),a.push(S[1]),m=null,_?(m=_,_=null):(h=p.yyleng,o=p.yytext,c=p.yylineno,f=p.yylloc,d>0&&d--);break;case 2:if(w=this.productions_[S[1]][1],T.$=i[i.length-w],T._$={first_line:s[s.length-(w||1)].first_line,last_line:s[s.length-1].last_line,first_column:s[s.length-(w||1)].first_column,last_column:s[s.length-1].last_column},b&&(T._$.range=[s[s.length-(w||1)].range[0],s[s.length-1].range[1]]),void 0!==(A=this.performAction.apply(T,[o,h,c,y.yy,S[1],i,s].concat(u))))return A;w&&(a=a.slice(0,-1*w*2),i=i.slice(0,-1*w),s=s.slice(0,-1*w)),a.push(this.productions_[S[1]][0]),i.push(T.$),s.push(T._$),k=l[a[a.length-2]][a[a.length-1]],a.push(k);break;case 3:return!0}}return!0},"parse")},rt=function(){return{EOF:1,parseError:(0,r.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,r.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,r.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,r.K2)(function(t){var e=t.length,a=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var n=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),a.length-1&&(this.yylineno-=a.length-1);var i=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:a?(a.length===n.length?this.yylloc.first_column:0)+n[n.length-a.length].length-a[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[i[0],i[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,r.K2)(function(){return this._more=!0,this},"more"),reject:(0,r.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,r.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,r.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,r.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,r.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,r.K2)(function(t,e){var a,n,i;if(this.options.backtrack_lexer&&(i={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(i.yylloc.range=this.yylloc.range.slice(0))),(n=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=n.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:n?n[n.length-1].length-n[n.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],a=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a)return a;if(this._backtrack){for(var r in i)this[r]=i[r];return!1}return!1},"test_match"),next:(0,r.K2)(function(){if(this.done)return this.EOF;var t,e,a,n;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var i=this._currentRules(),r=0;r<i.length;r++)if((a=this._input.match(this.rules[i[r]]))&&(!e||a[0].length>e[0].length)){if(e=a,n=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(a,i[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,i[n]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,r.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,r.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,r.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,r.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,r.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,r.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,r.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:(0,r.K2)(function(t,e,a,n){switch(a){case 0:return 6;case 1:return 7;case 2:return 8;case 3:return 9;case 4:return 22;case 5:return 23;case 6:return this.begin("acc_title"),24;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),26;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 73:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:case 16:case 70:break;case 14:c;break;case 15:return 12;case 17:return 11;case 18:return 15;case 19:return 16;case 20:return 17;case 21:return 18;case 22:return this.begin("person_ext"),45;case 23:return this.begin("person"),44;case 24:return this.begin("system_ext_queue"),51;case 25:return this.begin("system_ext_db"),50;case 26:return this.begin("system_ext"),49;case 27:return this.begin("system_queue"),48;case 28:return this.begin("system_db"),47;case 29:return this.begin("system"),46;case 30:return this.begin("boundary"),37;case 31:return this.begin("enterprise_boundary"),34;case 32:return this.begin("system_boundary"),36;case 33:return this.begin("container_ext_queue"),57;case 34:return this.begin("container_ext_db"),56;case 35:return this.begin("container_ext"),55;case 36:return this.begin("container_queue"),54;case 37:return this.begin("container_db"),53;case 38:return this.begin("container"),52;case 39:return this.begin("container_boundary"),38;case 40:return this.begin("component_ext_queue"),63;case 41:return this.begin("component_ext_db"),62;case 42:return this.begin("component_ext"),61;case 43:return this.begin("component_queue"),60;case 44:return this.begin("component_db"),59;case 45:return this.begin("component"),58;case 46:case 47:return this.begin("node"),39;case 48:return this.begin("node_l"),40;case 49:return this.begin("node_r"),41;case 50:return this.begin("rel"),64;case 51:return this.begin("birel"),65;case 52:case 53:return this.begin("rel_u"),66;case 54:case 55:return this.begin("rel_d"),67;case 56:case 57:return this.begin("rel_l"),68;case 58:case 59:return this.begin("rel_r"),69;case 60:return this.begin("rel_b"),70;case 61:return this.begin("rel_index"),71;case 62:return this.begin("update_el_style"),72;case 63:return this.begin("update_rel_style"),73;case 64:return this.begin("update_layout_config"),74;case 65:return"EOF_IN_STRUCT";case 66:return this.begin("attribute"),"ATTRIBUTE_EMPTY";case 67:this.begin("attribute");break;case 68:case 79:this.popState(),this.popState();break;case 69:case 71:return 80;case 72:this.begin("string");break;case 74:case 80:return"STR";case 75:this.begin("string_kv");break;case 76:return this.begin("string_kv_key"),"STR_KEY";case 77:this.popState(),this.begin("string_kv_value");break;case 78:return"STR_VALUE";case 81:return"LBRACE";case 82:return"RBRACE";case 83:return"SPACE";case 84:return"EOL";case 85:return 14}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:title\s[^#\n;]+)/,/^(?:accDescription\s[^#\n;]+)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:C4Context\b)/,/^(?:C4Container\b)/,/^(?:C4Component\b)/,/^(?:C4Dynamic\b)/,/^(?:C4Deployment\b)/,/^(?:Person_Ext\b)/,/^(?:Person\b)/,/^(?:SystemQueue_Ext\b)/,/^(?:SystemDb_Ext\b)/,/^(?:System_Ext\b)/,/^(?:SystemQueue\b)/,/^(?:SystemDb\b)/,/^(?:System\b)/,/^(?:Boundary\b)/,/^(?:Enterprise_Boundary\b)/,/^(?:System_Boundary\b)/,/^(?:ContainerQueue_Ext\b)/,/^(?:ContainerDb_Ext\b)/,/^(?:Container_Ext\b)/,/^(?:ContainerQueue\b)/,/^(?:ContainerDb\b)/,/^(?:Container\b)/,/^(?:Container_Boundary\b)/,/^(?:ComponentQueue_Ext\b)/,/^(?:ComponentDb_Ext\b)/,/^(?:Component_Ext\b)/,/^(?:ComponentQueue\b)/,/^(?:ComponentDb\b)/,/^(?:Component\b)/,/^(?:Deployment_Node\b)/,/^(?:Node\b)/,/^(?:Node_L\b)/,/^(?:Node_R\b)/,/^(?:Rel\b)/,/^(?:BiRel\b)/,/^(?:Rel_Up\b)/,/^(?:Rel_U\b)/,/^(?:Rel_Down\b)/,/^(?:Rel_D\b)/,/^(?:Rel_Left\b)/,/^(?:Rel_L\b)/,/^(?:Rel_Right\b)/,/^(?:Rel_R\b)/,/^(?:Rel_Back\b)/,/^(?:RelIndex\b)/,/^(?:UpdateElementStyle\b)/,/^(?:UpdateRelStyle\b)/,/^(?:UpdateLayoutConfig\b)/,/^(?:$)/,/^(?:[(][ ]*[,])/,/^(?:[(])/,/^(?:[)])/,/^(?:,,)/,/^(?:,)/,/^(?:[ ]*["]["])/,/^(?:[ ]*["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:[ ]*[\$])/,/^(?:[^=]*)/,/^(?:[=][ ]*["])/,/^(?:[^"]+)/,/^(?:["])/,/^(?:[^,]+)/,/^(?:\{)/,/^(?:\})/,/^(?:[\s]+)/,/^(?:[\n\r]+)/,/^(?:$)/],conditions:{acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},string_kv_value:{rules:[78,79],inclusive:!1},string_kv_key:{rules:[77],inclusive:!1},string_kv:{rules:[76],inclusive:!1},string:{rules:[73,74],inclusive:!1},attribute:{rules:[68,69,70,71,72,75,80],inclusive:!1},update_layout_config:{rules:[65,66,67,68],inclusive:!1},update_rel_style:{rules:[65,66,67,68],inclusive:!1},update_el_style:{rules:[65,66,67,68],inclusive:!1},rel_b:{rules:[65,66,67,68],inclusive:!1},rel_r:{rules:[65,66,67,68],inclusive:!1},rel_l:{rules:[65,66,67,68],inclusive:!1},rel_d:{rules:[65,66,67,68],inclusive:!1},rel_u:{rules:[65,66,67,68],inclusive:!1},rel_bi:{rules:[],inclusive:!1},rel:{rules:[65,66,67,68],inclusive:!1},node_r:{rules:[65,66,67,68],inclusive:!1},node_l:{rules:[65,66,67,68],inclusive:!1},node:{rules:[65,66,67,68],inclusive:!1},index:{rules:[],inclusive:!1},rel_index:{rules:[65,66,67,68],inclusive:!1},component_ext_queue:{rules:[],inclusive:!1},component_ext_db:{rules:[65,66,67,68],inclusive:!1},component_ext:{rules:[65,66,67,68],inclusive:!1},component_queue:{rules:[65,66,67,68],inclusive:!1},component_db:{rules:[65,66,67,68],inclusive:!1},component:{rules:[65,66,67,68],inclusive:!1},container_boundary:{rules:[65,66,67,68],inclusive:!1},container_ext_queue:{rules:[65,66,67,68],inclusive:!1},container_ext_db:{rules:[65,66,67,68],inclusive:!1},container_ext:{rules:[65,66,67,68],inclusive:!1},container_queue:{rules:[65,66,67,68],inclusive:!1},container_db:{rules:[65,66,67,68],inclusive:!1},container:{rules:[65,66,67,68],inclusive:!1},birel:{rules:[65,66,67,68],inclusive:!1},system_boundary:{rules:[65,66,67,68],inclusive:!1},enterprise_boundary:{rules:[65,66,67,68],inclusive:!1},boundary:{rules:[65,66,67,68],inclusive:!1},system_ext_queue:{rules:[65,66,67,68],inclusive:!1},system_ext_db:{rules:[65,66,67,68],inclusive:!1},system_ext:{rules:[65,66,67,68],inclusive:!1},system_queue:{rules:[65,66,67,68],inclusive:!1},system_db:{rules:[65,66,67,68],inclusive:!1},system:{rules:[65,66,67,68],inclusive:!1},person_ext:{rules:[65,66,67,68],inclusive:!1},person:{rules:[65,66,67,68],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,81,82,83,84,85],inclusive:!0}}}}();function st(){this.yy={}}return it.lexer=rt,(0,r.K2)(st,"Parser"),st.prototype=it,it.Parser=st,new st}();o.parser=o;var h,d=o,u=[],p=[""],y="global",g="",f=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],b=[],x="",m=!1,_=4,E=2,S=(0,r.K2)(function(){return h},"getC4Type"),A=(0,r.K2)(function(t){let e=(0,r.jZ)(t,(0,r.D7)());h=e},"setC4Type"),C=(0,r.K2)(function(t,e,a,n,i,r,s,l,o){if(null==t||null==e||null==a||null==n)return;let c={};const h=b.find(t=>t.from===e&&t.to===a);if(h?c=h:b.push(c),c.type=t,c.from=e,c.to=a,c.label={text:n},null==i)c.techn={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];c[t]={text:e}}else c.techn={text:i};if(null==r)c.descr={text:""};else if("object"==typeof r){let[t,e]=Object.entries(r)[0];c[t]={text:e}}else c.descr={text:r};if("object"==typeof s){let[t,e]=Object.entries(s)[0];c[t]=e}else c.sprite=s;if("object"==typeof l){let[t,e]=Object.entries(l)[0];c[t]=e}else c.tags=l;if("object"==typeof o){let[t,e]=Object.entries(o)[0];c[t]=e}else c.link=o;c.wrap=$()},"addRel"),w=(0,r.K2)(function(t,e,a,n,i,r,s){if(null===e||null===a)return;let l={};const o=u.find(t=>t.alias===e);if(o&&e===o.alias?l=o:(l.alias=e,u.push(l)),l.label=null==a?{text:""}:{text:a},null==n)l.descr={text:""};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];l[t]={text:e}}else l.descr={text:n};if("object"==typeof i){let[t,e]=Object.entries(i)[0];l[t]=e}else l.sprite=i;if("object"==typeof r){let[t,e]=Object.entries(r)[0];l[t]=e}else l.tags=r;if("object"==typeof s){let[t,e]=Object.entries(s)[0];l[t]=e}else l.link=s;l.typeC4Shape={text:t},l.parentBoundary=y,l.wrap=$()},"addPersonOrSystem"),k=(0,r.K2)(function(t,e,a,n,i,r,s,l){if(null===e||null===a)return;let o={};const c=u.find(t=>t.alias===e);if(c&&e===c.alias?o=c:(o.alias=e,u.push(o)),o.label=null==a?{text:""}:{text:a},null==n)o.techn={text:""};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];o[t]={text:e}}else o.techn={text:n};if(null==i)o.descr={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]={text:e}}else o.descr={text:i};if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.sprite=r;if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=e}else o.tags=s;if("object"==typeof l){let[t,e]=Object.entries(l)[0];o[t]=e}else o.link=l;o.wrap=$(),o.typeC4Shape={text:t},o.parentBoundary=y},"addContainer"),O=(0,r.K2)(function(t,e,a,n,i,r,s,l){if(null===e||null===a)return;let o={};const c=u.find(t=>t.alias===e);if(c&&e===c.alias?o=c:(o.alias=e,u.push(o)),o.label=null==a?{text:""}:{text:a},null==n)o.techn={text:""};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];o[t]={text:e}}else o.techn={text:n};if(null==i)o.descr={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]={text:e}}else o.descr={text:i};if("object"==typeof r){let[t,e]=Object.entries(r)[0];o[t]=e}else o.sprite=r;if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=e}else o.tags=s;if("object"==typeof l){let[t,e]=Object.entries(l)[0];o[t]=e}else o.link=l;o.wrap=$(),o.typeC4Shape={text:t},o.parentBoundary=y},"addComponent"),T=(0,r.K2)(function(t,e,a,n,i){if(null===t||null===e)return;let r={};const s=f.find(e=>e.alias===t);if(s&&t===s.alias?r=s:(r.alias=t,f.push(r)),r.label=null==e?{text:""}:{text:e},null==a)r.type={text:"system"};else if("object"==typeof a){let[t,e]=Object.entries(a)[0];r[t]={text:e}}else r.type={text:a};if("object"==typeof n){let[t,e]=Object.entries(n)[0];r[t]=e}else r.tags=n;if("object"==typeof i){let[t,e]=Object.entries(i)[0];r[t]=e}else r.link=i;r.parentBoundary=y,r.wrap=$(),g=y,y=t,p.push(g)},"addPersonOrSystemBoundary"),v=(0,r.K2)(function(t,e,a,n,i){if(null===t||null===e)return;let r={};const s=f.find(e=>e.alias===t);if(s&&t===s.alias?r=s:(r.alias=t,f.push(r)),r.label=null==e?{text:""}:{text:e},null==a)r.type={text:"container"};else if("object"==typeof a){let[t,e]=Object.entries(a)[0];r[t]={text:e}}else r.type={text:a};if("object"==typeof n){let[t,e]=Object.entries(n)[0];r[t]=e}else r.tags=n;if("object"==typeof i){let[t,e]=Object.entries(i)[0];r[t]=e}else r.link=i;r.parentBoundary=y,r.wrap=$(),g=y,y=t,p.push(g)},"addContainerBoundary"),R=(0,r.K2)(function(t,e,a,n,i,r,s,l){if(null===e||null===a)return;let o={};const c=f.find(t=>t.alias===e);if(c&&e===c.alias?o=c:(o.alias=e,f.push(o)),o.label=null==a?{text:""}:{text:a},null==n)o.type={text:"node"};else if("object"==typeof n){let[t,e]=Object.entries(n)[0];o[t]={text:e}}else o.type={text:n};if(null==i)o.descr={text:""};else if("object"==typeof i){let[t,e]=Object.entries(i)[0];o[t]={text:e}}else o.descr={text:i};if("object"==typeof s){let[t,e]=Object.entries(s)[0];o[t]=e}else o.tags=s;if("object"==typeof l){let[t,e]=Object.entries(l)[0];o[t]=e}else o.link=l;o.nodeType=t,o.parentBoundary=y,o.wrap=$(),g=y,y=e,p.push(g)},"addDeploymentNode"),D=(0,r.K2)(function(){y=g,p.pop(),g=p.pop(),p.push(g)},"popBoundaryParseStack"),N=(0,r.K2)(function(t,e,a,n,i,r,s,l,o,c,h){let d=u.find(t=>t.alias===e);if(void 0!==d||(d=f.find(t=>t.alias===e),void 0!==d)){if(null!=a)if("object"==typeof a){let[t,e]=Object.entries(a)[0];d[t]=e}else d.bgColor=a;if(null!=n)if("object"==typeof n){let[t,e]=Object.entries(n)[0];d[t]=e}else d.fontColor=n;if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];d[t]=e}else d.borderColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];d[t]=e}else d.shadowing=r;if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];d[t]=e}else d.shape=s;if(null!=l)if("object"==typeof l){let[t,e]=Object.entries(l)[0];d[t]=e}else d.sprite=l;if(null!=o)if("object"==typeof o){let[t,e]=Object.entries(o)[0];d[t]=e}else d.techn=o;if(null!=c)if("object"==typeof c){let[t,e]=Object.entries(c)[0];d[t]=e}else d.legendText=c;if(null!=h)if("object"==typeof h){let[t,e]=Object.entries(h)[0];d[t]=e}else d.legendSprite=h}},"updateElStyle"),P=(0,r.K2)(function(t,e,a,n,i,r,s){const l=b.find(t=>t.from===e&&t.to===a);if(void 0!==l){if(null!=n)if("object"==typeof n){let[t,e]=Object.entries(n)[0];l[t]=e}else l.textColor=n;if(null!=i)if("object"==typeof i){let[t,e]=Object.entries(i)[0];l[t]=e}else l.lineColor=i;if(null!=r)if("object"==typeof r){let[t,e]=Object.entries(r)[0];l[t]=parseInt(e)}else l.offsetX=parseInt(r);if(null!=s)if("object"==typeof s){let[t,e]=Object.entries(s)[0];l[t]=parseInt(e)}else l.offsetY=parseInt(s)}},"updateRelStyle"),B=(0,r.K2)(function(t,e,a){let n=_,i=E;if("object"==typeof e){const t=Object.values(e)[0];n=parseInt(t)}else n=parseInt(e);if("object"==typeof a){const t=Object.values(a)[0];i=parseInt(t)}else i=parseInt(a);n>=1&&(_=n),i>=1&&(E=i)},"updateLayoutConfig"),I=(0,r.K2)(function(){return _},"getC4ShapeInRow"),M=(0,r.K2)(function(){return E},"getC4BoundaryInRow"),j=(0,r.K2)(function(){return y},"getCurrentBoundaryParse"),K=(0,r.K2)(function(){return g},"getParentBoundaryParse"),L=(0,r.K2)(function(t){return null==t?u:u.filter(e=>e.parentBoundary===t)},"getC4ShapeArray"),Y=(0,r.K2)(function(t){return u.find(e=>e.alias===t)},"getC4Shape"),U=(0,r.K2)(function(t){return Object.keys(L(t))},"getC4ShapeKeys"),F=(0,r.K2)(function(t){return null==t?f:f.filter(e=>e.parentBoundary===t)},"getBoundaries"),X=F,z=(0,r.K2)(function(){return b},"getRels"),W=(0,r.K2)(function(){return x},"getTitle"),Q=(0,r.K2)(function(t){m=t},"setWrap"),$=(0,r.K2)(function(){return m},"autoWrap"),H=(0,r.K2)(function(){u=[],f=[{alias:"global",label:{text:"global"},type:{text:"global"},tags:null,link:null,parentBoundary:""}],g="",y="global",p=[""],b=[],p=[""],x="",m=!1,_=4,E=2},"clear"),q=(0,r.K2)(function(t){let e=(0,r.jZ)(t,(0,r.D7)());x=e},"setTitle"),V={addPersonOrSystem:w,addPersonOrSystemBoundary:T,addContainer:k,addContainerBoundary:v,addComponent:O,addDeploymentNode:R,popBoundaryParseStack:D,addRel:C,updateElStyle:N,updateRelStyle:P,updateLayoutConfig:B,autoWrap:$,setWrap:Q,getC4ShapeArray:L,getC4Shape:Y,getC4ShapeKeys:U,getBoundaries:F,getBoundarys:X,getCurrentBoundaryParse:j,getParentBoundaryParse:K,getRels:z,getTitle:W,getC4Type:S,getC4ShapeInRow:I,getC4BoundaryInRow:M,setAccTitle:r.SV,getAccTitle:r.iN,getAccDescription:r.m7,setAccDescription:r.EI,getConfig:(0,r.K2)(()=>(0,r.D7)().c4,"getConfig"),clear:H,LINETYPE:{SOLID:0,DOTTED:1,NOTE:2,SOLID_CROSS:3,DOTTED_CROSS:4,SOLID_OPEN:5,DOTTED_OPEN:6,LOOP_START:10,LOOP_END:11,ALT_START:12,ALT_ELSE:13,ALT_END:14,OPT_START:15,OPT_END:16,ACTIVE_START:17,ACTIVE_END:18,PAR_START:19,PAR_AND:20,PAR_END:21,RECT_START:22,RECT_END:23,SOLID_POINT:24,DOTTED_POINT:25},ARROWTYPE:{FILLED:0,OPEN:1},PLACEMENT:{LEFTOF:0,RIGHTOF:1,OVER:2},setTitle:q,setC4Type:A},G=(0,r.K2)(function(t,e){return(0,n.tk)(t,e)},"drawRect"),J=(0,r.K2)(function(t,e,a,n,i,r){const s=t.append("image");s.attr("width",e),s.attr("height",a),s.attr("x",n),s.attr("y",i);let o=r.startsWith("data:image/png;base64")?r:(0,l.J)(r);s.attr("xlink:href",o)},"drawImage"),Z=(0,r.K2)((t,e,a)=>{const n=t.append("g");let i=0;for(let r of e){let t=r.textColor?r.textColor:"#444444",e=r.lineColor?r.lineColor:"#444444",s=r.offsetX?parseInt(r.offsetX):0,l=r.offsetY?parseInt(r.offsetY):0,o="";if(0===i){let t=n.append("line");t.attr("x1",r.startPoint.x),t.attr("y1",r.startPoint.y),t.attr("x2",r.endPoint.x),t.attr("y2",r.endPoint.y),t.attr("stroke-width","1"),t.attr("stroke",e),t.style("fill","none"),"rel_b"!==r.type&&t.attr("marker-end","url("+o+"#arrowhead)"),"birel"!==r.type&&"rel_b"!==r.type||t.attr("marker-start","url("+o+"#arrowend)"),i=-1}else{let t=n.append("path");t.attr("fill","none").attr("stroke-width","1").attr("stroke",e).attr("d","Mstartx,starty Qcontrolx,controly stopx,stopy ".replaceAll("startx",r.startPoint.x).replaceAll("starty",r.startPoint.y).replaceAll("controlx",r.startPoint.x+(r.endPoint.x-r.startPoint.x)/2-(r.endPoint.x-r.startPoint.x)/4).replaceAll("controly",r.startPoint.y+(r.endPoint.y-r.startPoint.y)/2).replaceAll("stopx",r.endPoint.x).replaceAll("stopy",r.endPoint.y)),"rel_b"!==r.type&&t.attr("marker-end","url("+o+"#arrowhead)"),"birel"!==r.type&&"rel_b"!==r.type||t.attr("marker-start","url("+o+"#arrowend)")}let c=a.messageFont();dt(a)(r.label.text,n,Math.min(r.startPoint.x,r.endPoint.x)+Math.abs(r.endPoint.x-r.startPoint.x)/2+s,Math.min(r.startPoint.y,r.endPoint.y)+Math.abs(r.endPoint.y-r.startPoint.y)/2+l,r.label.width,r.label.height,{fill:t},c),r.techn&&""!==r.techn.text&&(c=a.messageFont(),dt(a)("["+r.techn.text+"]",n,Math.min(r.startPoint.x,r.endPoint.x)+Math.abs(r.endPoint.x-r.startPoint.x)/2+s,Math.min(r.startPoint.y,r.endPoint.y)+Math.abs(r.endPoint.y-r.startPoint.y)/2+a.messageFontSize+5+l,Math.max(r.label.width,r.techn.width),r.techn.height,{fill:t,"font-style":"italic"},c))}},"drawRels"),tt=(0,r.K2)(function(t,e,a){const n=t.append("g");let i=e.bgColor?e.bgColor:"none",r=e.borderColor?e.borderColor:"#444444",s=e.fontColor?e.fontColor:"black",l={"stroke-width":1,"stroke-dasharray":"7.0,7.0"};e.nodeType&&(l={"stroke-width":1});let o={x:e.x,y:e.y,fill:i,stroke:r,width:e.width,height:e.height,rx:2.5,ry:2.5,attrs:l};G(n,o);let c=a.boundaryFont();c.fontWeight="bold",c.fontSize=c.fontSize+2,c.fontColor=s,dt(a)(e.label.text,n,e.x,e.y+e.label.Y,e.width,e.height,{fill:"#444444"},c),e.type&&""!==e.type.text&&(c=a.boundaryFont(),c.fontColor=s,dt(a)(e.type.text,n,e.x,e.y+e.type.Y,e.width,e.height,{fill:"#444444"},c)),e.descr&&""!==e.descr.text&&(c=a.boundaryFont(),c.fontSize=c.fontSize-2,c.fontColor=s,dt(a)(e.descr.text,n,e.x,e.y+e.descr.Y,e.width,e.height,{fill:"#444444"},c))},"drawBoundary"),et=(0,r.K2)(function(t,e,a){let i=e.bgColor?e.bgColor:a[e.typeC4Shape.text+"_bg_color"],r=e.borderColor?e.borderColor:a[e.typeC4Shape.text+"_border_color"],s=e.fontColor?e.fontColor:"#FFFFFF",l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";switch(e.typeC4Shape.text){case"person":l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAACD0lEQVR4Xu2YoU4EMRCGT+4j8Ai8AhaH4QHgAUjQuFMECUgMIUgwJAgMhgQsAYUiJCiQIBBY+EITsjfTdme6V24v4c8vyGbb+ZjOtN0bNcvjQXmkH83WvYBWto6PLm6v7p7uH1/w2fXD+PBycX1Pv2l3IdDm/vn7x+dXQiAubRzoURa7gRZWd0iGRIiJbOnhnfYBQZNJjNbuyY2eJG8fkDE3bbG4ep6MHUAsgYxmE3nVs6VsBWJSGccsOlFPmLIViMzLOB7pCVO2AtHJMohH7Fh6zqitQK7m0rJvAVYgGcEpe//PLdDz65sM4pF9N7ICcXDKIB5Nv6j7tD0NoSdM2QrU9Gg0ewE1LqBhHR3BBdvj2vapnidjHxD/q6vd7Pvhr31AwcY8eXMTXAKECZZJFXuEq27aLgQK5uLMohCenGGuGewOxSjBvYBqeG6B+Nqiblggdjnc+ZXDy+FNFpFzw76O3UBAROuXh6FoiAcf5g9eTvUgzy0nWg6I8cXHRUpg5bOVBCo+KDpFajOf23GgPme7RSQ+lacIENUgJ6gg1k6HjgOlqnLqip4tEuhv0hNEMXUD0clyXE3p6pZA0S2nnvTlXwLJEZWlb7cTQH1+USgTN4VhAenm/wea1OCAOmqo6fE1WCb9WSKBah+rbUWPWAmE2Rvk0ApiB45eOyNAzU8xcTvj8KvkKEoOaIYeHNA3ZuygAvFMUO0AAAAASUVORK5CYII=";break;case"external_person":l="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAIAAADYYG7QAAAB6ElEQVR4Xu2YLY+EMBCG9+dWr0aj0Wg0Go1Go0+j8Xdv2uTCvv1gpt0ebHKPuhDaeW4605Z9mJvx4AdXUyTUdd08z+u6flmWZRnHsWkafk9DptAwDPu+f0eAYtu2PEaGWuj5fCIZrBAC2eLBAnRCsEkkxmeaJp7iDJ2QMDdHsLg8SxKFEJaAo8lAXnmuOFIhTMpxxKATebo4UiFknuNo4OniSIXQyRxEA3YsnjGCVEjVXD7yLUAqxBGUyPv/Y4W2beMgGuS7kVQIBycH0fD+oi5pezQETxdHKmQKGk1eQEYldK+jw5GxPfZ9z7Mk0Qnhf1W1m3w//EUn5BDmSZsbR44QQLBEqrBHqOrmSKaQAxdnLArCrxZcM7A7ZKs4ioRq8LFC+NpC3WCBJsvpVw5edm9iEXFuyNfxXAgSwfrFQ1c0iNda8AdejvUgnktOtJQQxmcfFzGglc5WVCj7oDgFqU18boeFSs52CUh8LE8BIVQDT1ABrB0HtgSEYlX5doJnCwv9TXocKCaKbnwhdDKPq4lf3SwU3HLq4V/+WYhHVMa/3b4IlfyikAduCkcBc7mQ3/z/Qq/cTuikhkzB12Ae/mcJC9U+Vo8Ej1gWAtgbeGgFsAMHr50BIWOLCbezvhpBFUdY6EJuJ/QDW0XoMX60zZ0AAAAASUVORK5CYII="}const o=t.append("g");o.attr("class","person-man");const c=(0,n.PB)();switch(e.typeC4Shape.text){case"person":case"external_person":case"system":case"external_system":case"container":case"external_container":case"component":case"external_component":c.x=e.x,c.y=e.y,c.fill=i,c.width=e.width,c.height=e.height,c.stroke=r,c.rx=2.5,c.ry=2.5,c.attrs={"stroke-width":.5},G(o,c);break;case"system_db":case"external_system_db":case"container_db":case"external_container_db":case"component_db":case"external_component_db":o.append("path").attr("fill",i).attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc0,-10 half,-10 half,-10c0,0 half,0 half,10l0,heightc0,10 -half,10 -half,10c0,0 -half,0 -half,-10l0,-height".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2).replaceAll("height",e.height)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc0,10 half,10 half,10c0,0 half,0 half,-10".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("half",e.width/2));break;case"system_queue":case"external_system_queue":case"container_queue":case"external_container_queue":case"component_queue":case"external_component_queue":o.append("path").attr("fill",i).attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startylwidth,0c5,0 5,half 5,halfc0,0 0,half -5,halfl-width,0c-5,0 -5,-half -5,-halfc0,0 0,-half 5,-half".replaceAll("startx",e.x).replaceAll("starty",e.y).replaceAll("width",e.width).replaceAll("half",e.height/2)),o.append("path").attr("fill","none").attr("stroke-width","0.5").attr("stroke",r).attr("d","Mstartx,startyc-5,0 -5,half -5,halfc0,half 5,half 5,half".replaceAll("startx",e.x+e.width).replaceAll("starty",e.y).replaceAll("half",e.height/2))}let h=ht(a,e.typeC4Shape.text);switch(o.append("text").attr("fill",s).attr("font-family",h.fontFamily).attr("font-size",h.fontSize-2).attr("font-style","italic").attr("lengthAdjust","spacing").attr("textLength",e.typeC4Shape.width).attr("x",e.x+e.width/2-e.typeC4Shape.width/2).attr("y",e.y+e.typeC4Shape.Y).text("<<"+e.typeC4Shape.text+">>"),e.typeC4Shape.text){case"person":case"external_person":J(o,48,48,e.x+e.width/2-24,e.y+e.image.Y,l)}let d=a[e.typeC4Shape.text+"Font"]();return d.fontWeight="bold",d.fontSize=d.fontSize+2,d.fontColor=s,dt(a)(e.label.text,o,e.x,e.y+e.label.Y,e.width,e.height,{fill:s},d),d=a[e.typeC4Shape.text+"Font"](),d.fontColor=s,e.techn&&""!==e.techn?.text?dt(a)(e.techn.text,o,e.x,e.y+e.techn.Y,e.width,e.height,{fill:s,"font-style":"italic"},d):e.type&&""!==e.type.text&&dt(a)(e.type.text,o,e.x,e.y+e.type.Y,e.width,e.height,{fill:s,"font-style":"italic"},d),e.descr&&""!==e.descr.text&&(d=a.personFont(),d.fontColor=s,dt(a)(e.descr.text,o,e.x,e.y+e.descr.Y,e.width,e.height,{fill:s},d)),e.height},"drawC4Shape"),at=(0,r.K2)(function(t){t.append("defs").append("symbol").attr("id","database").attr("fill-rule","evenodd").attr("clip-rule","evenodd").append("path").attr("transform","scale(.5)").attr("d","M12.258.001l.256.004.255.005.253.008.251.01.249.012.247.015.246.016.242.019.241.02.239.023.236.024.233.027.231.028.229.031.225.032.223.034.22.036.217.038.214.04.211.041.208.043.205.045.201.046.198.048.194.05.191.051.187.053.183.054.18.056.175.057.172.059.168.06.163.061.16.063.155.064.15.066.074.033.073.033.071.034.07.034.069.035.068.035.067.035.066.035.064.036.064.036.062.036.06.036.06.037.058.037.058.037.055.038.055.038.053.038.052.038.051.039.05.039.048.039.047.039.045.04.044.04.043.04.041.04.04.041.039.041.037.041.036.041.034.041.033.042.032.042.03.042.029.042.027.042.026.043.024.043.023.043.021.043.02.043.018.044.017.043.015.044.013.044.012.044.011.045.009.044.007.045.006.045.004.045.002.045.001.045v17l-.001.045-.002.045-.004.045-.006.045-.007.045-.009.044-.011.045-.012.044-.013.044-.015.044-.017.043-.018.044-.02.043-.021.043-.023.043-.024.043-.026.043-.027.042-.029.042-.03.042-.032.042-.033.042-.034.041-.036.041-.037.041-.039.041-.04.041-.041.04-.043.04-.044.04-.045.04-.047.039-.048.039-.05.039-.051.039-.052.038-.053.038-.055.038-.055.038-.058.037-.058.037-.06.037-.06.036-.062.036-.064.036-.064.036-.066.035-.067.035-.068.035-.069.035-.07.034-.071.034-.073.033-.074.033-.15.066-.155.064-.16.063-.163.061-.168.06-.172.059-.175.057-.18.056-.183.054-.187.053-.191.051-.194.05-.198.048-.201.046-.205.045-.208.043-.211.041-.214.04-.217.038-.22.036-.223.034-.225.032-.229.031-.231.028-.233.027-.236.024-.239.023-.241.02-.242.019-.246.016-.247.015-.249.012-.251.01-.253.008-.255.005-.256.004-.258.001-.258-.001-.256-.004-.255-.005-.253-.008-.251-.01-.249-.012-.247-.015-.245-.016-.243-.019-.241-.02-.238-.023-.236-.024-.234-.027-.231-.028-.228-.031-.226-.032-.223-.034-.22-.036-.217-.038-.214-.04-.211-.041-.208-.043-.204-.045-.201-.046-.198-.048-.195-.05-.19-.051-.187-.053-.184-.054-.179-.056-.176-.057-.172-.059-.167-.06-.164-.061-.159-.063-.155-.064-.151-.066-.074-.033-.072-.033-.072-.034-.07-.034-.069-.035-.068-.035-.067-.035-.066-.035-.064-.036-.063-.036-.062-.036-.061-.036-.06-.037-.058-.037-.057-.037-.056-.038-.055-.038-.053-.038-.052-.038-.051-.039-.049-.039-.049-.039-.046-.039-.046-.04-.044-.04-.043-.04-.041-.04-.04-.041-.039-.041-.037-.041-.036-.041-.034-.041-.033-.042-.032-.042-.03-.042-.029-.042-.027-.042-.026-.043-.024-.043-.023-.043-.021-.043-.02-.043-.018-.044-.017-.043-.015-.044-.013-.044-.012-.044-.011-.045-.009-.044-.007-.045-.006-.045-.004-.045-.002-.045-.001-.045v-17l.001-.045.002-.045.004-.045.006-.045.007-.045.009-.044.011-.045.012-.044.013-.044.015-.044.017-.043.018-.044.02-.043.021-.043.023-.043.024-.043.026-.043.027-.042.029-.042.03-.042.032-.042.033-.042.034-.041.036-.041.037-.041.039-.041.04-.041.041-.04.043-.04.044-.04.046-.04.046-.039.049-.039.049-.039.051-.039.052-.038.053-.038.055-.038.056-.038.057-.037.058-.037.06-.037.061-.036.062-.036.063-.036.064-.036.066-.035.067-.035.068-.035.069-.035.07-.034.072-.034.072-.033.074-.033.151-.066.155-.064.159-.063.164-.061.167-.06.172-.059.176-.057.179-.056.184-.054.187-.053.19-.051.195-.05.198-.048.201-.046.204-.045.208-.043.211-.041.214-.04.217-.038.22-.036.223-.034.226-.032.228-.031.231-.028.234-.027.236-.024.238-.023.241-.02.243-.019.245-.016.247-.015.249-.012.251-.01.253-.008.255-.005.256-.004.258-.001.258.001zm-9.258 20.499v.01l.001.021.003.021.004.022.005.021.006.022.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.023.018.024.019.024.021.024.022.025.023.024.024.025.052.049.056.05.061.051.066.051.07.051.075.051.079.052.084.052.088.052.092.052.097.052.102.051.105.052.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.048.144.049.147.047.152.047.155.047.16.045.163.045.167.043.171.043.176.041.178.041.183.039.187.039.19.037.194.035.197.035.202.033.204.031.209.03.212.029.216.027.219.025.222.024.226.021.23.02.233.018.236.016.24.015.243.012.246.01.249.008.253.005.256.004.259.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.021.224-.024.22-.026.216-.027.212-.028.21-.031.205-.031.202-.034.198-.034.194-.036.191-.037.187-.039.183-.04.179-.04.175-.042.172-.043.168-.044.163-.045.16-.046.155-.046.152-.047.148-.048.143-.049.139-.049.136-.05.131-.05.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.053.083-.051.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.05.023-.024.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.023.01-.022.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.127l-.077.055-.08.053-.083.054-.085.053-.087.052-.09.052-.093.051-.095.05-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.045-.118.044-.12.043-.122.042-.124.042-.126.041-.128.04-.13.04-.132.038-.134.038-.135.037-.138.037-.139.035-.142.035-.143.034-.144.033-.147.032-.148.031-.15.03-.151.03-.153.029-.154.027-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.01-.179.008-.179.008-.181.006-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.006-.179-.008-.179-.008-.178-.01-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.027-.153-.029-.151-.03-.15-.03-.148-.031-.146-.032-.145-.033-.143-.034-.141-.035-.14-.035-.137-.037-.136-.037-.134-.038-.132-.038-.13-.04-.128-.04-.126-.041-.124-.042-.122-.042-.12-.044-.117-.043-.116-.045-.113-.045-.112-.046-.109-.047-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.05-.093-.052-.09-.051-.087-.052-.085-.053-.083-.054-.08-.054-.077-.054v4.127zm0-5.654v.011l.001.021.003.021.004.021.005.022.006.022.007.022.009.022.01.022.011.023.012.023.013.023.015.024.016.023.017.024.018.024.019.024.021.024.022.024.023.025.024.024.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.052.11.051.114.051.119.052.123.05.127.051.131.05.135.049.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.044.171.042.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.022.23.02.233.018.236.016.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.012.241-.015.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.048.139-.05.136-.049.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.051.051-.049.023-.025.023-.024.021-.025.02-.024.019-.024.018-.024.017-.024.015-.023.014-.023.013-.024.012-.022.01-.023.01-.023.008-.022.006-.022.006-.022.004-.021.004-.022.001-.021.001-.021v-4.139l-.077.054-.08.054-.083.054-.085.052-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.049-.105.048-.106.047-.109.047-.111.046-.114.045-.115.044-.118.044-.12.044-.122.042-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.035-.143.033-.144.033-.147.033-.148.031-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.025-.161.024-.162.023-.163.022-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.011-.178.009-.179.009-.179.007-.181.007-.182.005-.182.004-.184.003-.184.002h-.37l-.184-.002-.184-.003-.182-.004-.182-.005-.181-.007-.179-.007-.179-.009-.178-.009-.176-.011-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.022-.162-.023-.161-.024-.159-.025-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.031-.146-.033-.145-.033-.143-.033-.141-.035-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.04-.126-.041-.124-.042-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.047-.105-.048-.102-.049-.1-.049-.097-.05-.095-.051-.093-.051-.09-.051-.087-.053-.085-.052-.083-.054-.08-.054-.077-.054v4.139zm0-5.666v.011l.001.02.003.022.004.021.005.022.006.021.007.022.009.023.01.022.011.023.012.023.013.023.015.023.016.024.017.024.018.023.019.024.021.025.022.024.023.024.024.025.052.05.056.05.061.05.066.051.07.051.075.052.079.051.084.052.088.052.092.052.097.052.102.052.105.051.11.052.114.051.119.051.123.051.127.05.131.05.135.05.139.049.144.048.147.048.152.047.155.046.16.045.163.045.167.043.171.043.176.042.178.04.183.04.187.038.19.037.194.036.197.034.202.033.204.032.209.03.212.028.216.027.219.025.222.024.226.021.23.02.233.018.236.017.24.014.243.012.246.01.249.008.253.006.256.003.259.001.26-.001.257-.003.254-.006.25-.008.247-.01.244-.013.241-.014.237-.016.233-.018.231-.02.226-.022.224-.024.22-.025.216-.027.212-.029.21-.03.205-.032.202-.033.198-.035.194-.036.191-.037.187-.039.183-.039.179-.041.175-.042.172-.043.168-.044.163-.045.16-.045.155-.047.152-.047.148-.048.143-.049.139-.049.136-.049.131-.051.126-.05.123-.051.118-.052.114-.051.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.052.07-.051.065-.051.06-.051.056-.05.051-.049.023-.025.023-.025.021-.024.02-.024.019-.024.018-.024.017-.024.015-.023.014-.024.013-.023.012-.023.01-.022.01-.023.008-.022.006-.022.006-.022.004-.022.004-.021.001-.021.001-.021v-4.153l-.077.054-.08.054-.083.053-.085.053-.087.053-.09.051-.093.051-.095.051-.097.05-.1.049-.102.048-.105.048-.106.048-.109.046-.111.046-.114.046-.115.044-.118.044-.12.043-.122.043-.124.042-.126.041-.128.04-.13.039-.132.039-.134.038-.135.037-.138.036-.139.036-.142.034-.143.034-.144.033-.147.032-.148.032-.15.03-.151.03-.153.028-.154.028-.156.027-.158.026-.159.024-.161.024-.162.023-.163.023-.165.021-.166.02-.167.019-.169.018-.169.017-.171.016-.173.015-.173.014-.175.013-.175.012-.177.01-.178.01-.179.009-.179.007-.181.006-.182.006-.182.004-.184.003-.184.001-.185.001-.185-.001-.184-.001-.184-.003-.182-.004-.182-.006-.181-.006-.179-.007-.179-.009-.178-.01-.176-.01-.176-.012-.175-.013-.173-.014-.172-.015-.171-.016-.17-.017-.169-.018-.167-.019-.166-.02-.165-.021-.163-.023-.162-.023-.161-.024-.159-.024-.157-.026-.156-.027-.155-.028-.153-.028-.151-.03-.15-.03-.148-.032-.146-.032-.145-.033-.143-.034-.141-.034-.14-.036-.137-.036-.136-.037-.134-.038-.132-.039-.13-.039-.128-.041-.126-.041-.124-.041-.122-.043-.12-.043-.117-.044-.116-.044-.113-.046-.112-.046-.109-.046-.106-.048-.105-.048-.102-.048-.1-.05-.097-.049-.095-.051-.093-.051-.09-.052-.087-.052-.085-.053-.083-.053-.08-.054-.077-.054v4.153zm8.74-8.179l-.257.004-.254.005-.25.008-.247.011-.244.012-.241.014-.237.016-.233.018-.231.021-.226.022-.224.023-.22.026-.216.027-.212.028-.21.031-.205.032-.202.033-.198.034-.194.036-.191.038-.187.038-.183.04-.179.041-.175.042-.172.043-.168.043-.163.045-.16.046-.155.046-.152.048-.148.048-.143.048-.139.049-.136.05-.131.05-.126.051-.123.051-.118.051-.114.052-.11.052-.106.052-.101.052-.096.052-.092.052-.088.052-.083.052-.079.052-.074.051-.07.052-.065.051-.06.05-.056.05-.051.05-.023.025-.023.024-.021.024-.02.025-.019.024-.018.024-.017.023-.015.024-.014.023-.013.023-.012.023-.01.023-.01.022-.008.022-.006.023-.006.021-.004.022-.004.021-.001.021-.001.021.001.021.001.021.004.021.004.022.006.021.006.023.008.022.01.022.01.023.012.023.013.023.014.023.015.024.017.023.018.024.019.024.02.025.021.024.023.024.023.025.051.05.056.05.06.05.065.051.07.052.074.051.079.052.083.052.088.052.092.052.096.052.101.052.106.052.11.052.114.052.118.051.123.051.126.051.131.05.136.05.139.049.143.048.148.048.152.048.155.046.16.046.163.045.168.043.172.043.175.042.179.041.183.04.187.038.191.038.194.036.198.034.202.033.205.032.21.031.212.028.216.027.22.026.224.023.226.022.231.021.233.018.237.016.241.014.244.012.247.011.25.008.254.005.257.004.26.001.26-.001.257-.004.254-.005.25-.008.247-.011.244-.012.241-.014.237-.016.233-.018.231-.021.226-.022.224-.023.22-.026.216-.027.212-.028.21-.031.205-.032.202-.033.198-.034.194-.036.191-.038.187-.038.183-.04.179-.041.175-.042.172-.043.168-.043.163-.045.16-.046.155-.046.152-.048.148-.048.143-.048.139-.049.136-.05.131-.05.126-.051.123-.051.118-.051.114-.052.11-.052.106-.052.101-.052.096-.052.092-.052.088-.052.083-.052.079-.052.074-.051.07-.052.065-.051.06-.05.056-.05.051-.05.023-.025.023-.024.021-.024.02-.025.019-.024.018-.024.017-.023.015-.024.014-.023.013-.023.012-.023.01-.023.01-.022.008-.022.006-.023.006-.021.004-.022.004-.021.001-.021.001-.021-.001-.021-.001-.021-.004-.021-.004-.022-.006-.021-.006-.023-.008-.022-.01-.022-.01-.023-.012-.023-.013-.023-.014-.023-.015-.024-.017-.023-.018-.024-.019-.024-.02-.025-.021-.024-.023-.024-.023-.025-.051-.05-.056-.05-.06-.05-.065-.051-.07-.052-.074-.051-.079-.052-.083-.052-.088-.052-.092-.052-.096-.052-.101-.052-.106-.052-.11-.052-.114-.052-.118-.051-.123-.051-.126-.051-.131-.05-.136-.05-.139-.049-.143-.048-.148-.048-.152-.048-.155-.046-.16-.046-.163-.045-.168-.043-.172-.043-.175-.042-.179-.041-.183-.04-.187-.038-.191-.038-.194-.036-.198-.034-.202-.033-.205-.032-.21-.031-.212-.028-.216-.027-.22-.026-.224-.023-.226-.022-.231-.021-.233-.018-.237-.016-.241-.014-.244-.012-.247-.011-.25-.008-.254-.005-.257-.004-.26-.001-.26.001z")},"insertDatabaseIcon"),nt=(0,r.K2)(function(t){t.append("defs").append("symbol").attr("id","computer").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M2 2v13h20v-13h-20zm18 11h-16v-9h16v9zm-10.228 6l.466-1h3.524l.467 1h-4.457zm14.228 3h-24l2-6h2.104l-1.33 4h18.45l-1.297-4h2.073l2 6zm-5-10h-14v-7h14v7z")},"insertComputerIcon"),it=(0,r.K2)(function(t){t.append("defs").append("symbol").attr("id","clock").attr("width","24").attr("height","24").append("path").attr("transform","scale(.5)").attr("d","M12 2c5.514 0 10 4.486 10 10s-4.486 10-10 10-10-4.486-10-10 4.486-10 10-10zm0-2c-6.627 0-12 5.373-12 12s5.373 12 12 12 12-5.373 12-12-5.373-12-12-12zm5.848 12.459c.202.038.202.333.001.372-1.907.361-6.045 1.111-6.547 1.111-.719 0-1.301-.582-1.301-1.301 0-.512.77-5.447 1.125-7.445.034-.192.312-.181.343.014l.985 6.238 5.394 1.011z")},"insertClockIcon"),rt=(0,r.K2)(function(t){t.append("defs").append("marker").attr("id","arrowhead").attr("refX",9).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 0 0 L 10 5 L 0 10 z")},"insertArrowHead"),st=(0,r.K2)(function(t){t.append("defs").append("marker").attr("id","arrowend").attr("refX",1).attr("refY",5).attr("markerUnits","userSpaceOnUse").attr("markerWidth",12).attr("markerHeight",12).attr("orient","auto").append("path").attr("d","M 10 0 L 0 5 L 10 10 z")},"insertArrowEnd"),lt=(0,r.K2)(function(t){t.append("defs").append("marker").attr("id","filled-head").attr("refX",18).attr("refY",7).attr("markerWidth",20).attr("markerHeight",28).attr("orient","auto").append("path").attr("d","M 18,7 L9,13 L14,7 L9,1 Z")},"insertArrowFilledHead"),ot=(0,r.K2)(function(t){t.append("defs").append("marker").attr("id","sequencenumber").attr("refX",15).attr("refY",15).attr("markerWidth",60).attr("markerHeight",40).attr("orient","auto").append("circle").attr("cx",15).attr("cy",15).attr("r",6)},"insertDynamicNumber"),ct=(0,r.K2)(function(t){const e=t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",16).attr("refY",4);e.append("path").attr("fill","black").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 9,2 V 6 L16,4 Z"),e.append("path").attr("fill","none").attr("stroke","#000000").style("stroke-dasharray","0, 0").attr("stroke-width","1px").attr("d","M 0,1 L 6,7 M 6,1 L 0,7")},"insertArrowCrossHead"),ht=(0,r.K2)((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"getC4ShapeFont"),dt=function(){function t(t,e,a,i,r,s,l){n(e.append("text").attr("x",a+r/2).attr("y",i+s/2+5).style("text-anchor","middle").text(t),l)}function e(t,e,a,i,s,l,o,c){const{fontSize:h,fontFamily:d,fontWeight:u}=c,p=t.split(r.Y2.lineBreakRegex);for(let r=0;r<p.length;r++){const t=r*h-h*(p.length-1)/2,l=e.append("text").attr("x",a+s/2).attr("y",i).style("text-anchor","middle").attr("dominant-baseline","middle").style("font-size",h).style("font-weight",u).style("font-family",d);l.append("tspan").attr("dy",t).text(p[r]).attr("alignment-baseline","mathematical"),n(l,o)}}function a(t,a,i,r,s,l,o,c){const h=a.append("switch"),d=h.append("foreignObject").attr("x",i).attr("y",r).attr("width",s).attr("height",l).append("xhtml:div").style("display","table").style("height","100%").style("width","100%");d.append("div").style("display","table-cell").style("text-align","center").style("vertical-align","middle").text(t),e(t,h,i,r,s,0,o,c),n(d,o)}function n(t,e){for(const a in e)e.hasOwnProperty(a)&&t.attr(a,e[a])}return(0,r.K2)(t,"byText"),(0,r.K2)(e,"byTspan"),(0,r.K2)(a,"byFo"),(0,r.K2)(n,"_setTextAttrs"),function(n){return"fo"===n.textPlacement?a:"old"===n.textPlacement?t:e}}(),ut={drawRect:G,drawBoundary:tt,drawC4Shape:et,drawRels:Z,drawImage:J,insertArrowHead:rt,insertArrowEnd:st,insertArrowFilledHead:lt,insertDynamicNumber:ot,insertArrowCrossHead:ct,insertDatabaseIcon:at,insertComputerIcon:nt,insertClockIcon:it},pt=0,yt=0,gt=4,ft=2;o.yy=V;var bt={},xt=class{static{(0,r.K2)(this,"Bounds")}constructor(t){this.name="",this.data={},this.data.startx=void 0,this.data.stopx=void 0,this.data.starty=void 0,this.data.stopy=void 0,this.data.widthLimit=void 0,this.nextData={},this.nextData.startx=void 0,this.nextData.stopx=void 0,this.nextData.starty=void 0,this.nextData.stopy=void 0,this.nextData.cnt=0,mt(t.db.getConfig())}setData(t,e,a,n){this.nextData.startx=this.data.startx=t,this.nextData.stopx=this.data.stopx=e,this.nextData.starty=this.data.starty=a,this.nextData.stopy=this.data.stopy=n}updateVal(t,e,a,n){void 0===t[e]?t[e]=a:t[e]=n(a,t[e])}insert(t){this.nextData.cnt=this.nextData.cnt+1;let e=this.nextData.startx===this.nextData.stopx?this.nextData.stopx+t.margin:this.nextData.stopx+2*t.margin,a=e+t.width,n=this.nextData.starty+2*t.margin,i=n+t.height;(e>=this.data.widthLimit||a>=this.data.widthLimit||this.nextData.cnt>gt)&&(e=this.nextData.startx+t.margin+bt.nextLinePaddingX,n=this.nextData.stopy+2*t.margin,this.nextData.stopx=a=e+t.width,this.nextData.starty=this.nextData.stopy,this.nextData.stopy=i=n+t.height,this.nextData.cnt=1),t.x=e,t.y=n,this.updateVal(this.data,"startx",e,Math.min),this.updateVal(this.data,"starty",n,Math.min),this.updateVal(this.data,"stopx",a,Math.max),this.updateVal(this.data,"stopy",i,Math.max),this.updateVal(this.nextData,"startx",e,Math.min),this.updateVal(this.nextData,"starty",n,Math.min),this.updateVal(this.nextData,"stopx",a,Math.max),this.updateVal(this.nextData,"stopy",i,Math.max)}init(t){this.name="",this.data={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,widthLimit:void 0},this.nextData={startx:void 0,stopx:void 0,starty:void 0,stopy:void 0,cnt:0},mt(t.db.getConfig())}bumpLastMargin(t){this.data.stopx+=t,this.data.stopy+=t}},mt=(0,r.K2)(function(t){(0,r.hH)(bt,t),t.fontFamily&&(bt.personFontFamily=bt.systemFontFamily=bt.messageFontFamily=t.fontFamily),t.fontSize&&(bt.personFontSize=bt.systemFontSize=bt.messageFontSize=t.fontSize),t.fontWeight&&(bt.personFontWeight=bt.systemFontWeight=bt.messageFontWeight=t.fontWeight)},"setConf"),_t=(0,r.K2)((t,e)=>({fontFamily:t[e+"FontFamily"],fontSize:t[e+"FontSize"],fontWeight:t[e+"FontWeight"]}),"c4ShapeFont"),Et=(0,r.K2)(t=>({fontFamily:t.boundaryFontFamily,fontSize:t.boundaryFontSize,fontWeight:t.boundaryFontWeight}),"boundaryFont"),St=(0,r.K2)(t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight}),"messageFont");function At(t,e,a,n,s){if(!e[t].width)if(a)e[t].text=(0,i.bH)(e[t].text,s,n),e[t].textLines=e[t].text.split(r.Y2.lineBreakRegex).length,e[t].width=s,e[t].height=(0,i.ru)(e[t].text,n);else{let a=e[t].text.split(r.Y2.lineBreakRegex);e[t].textLines=a.length;let s=0;e[t].height=0,e[t].width=0;for(const r of a)e[t].width=Math.max((0,i.Un)(r,n),e[t].width),s=(0,i.ru)(r,n),e[t].height=e[t].height+s}}(0,r.K2)(At,"calcC4ShapeTextWH");var Ct=(0,r.K2)(function(t,e,a){e.x=a.data.startx,e.y=a.data.starty,e.width=a.data.stopx-a.data.startx,e.height=a.data.stopy-a.data.starty,e.label.y=bt.c4ShapeMargin-35;let n=e.wrap&&bt.wrap,r=Et(bt);r.fontSize=r.fontSize+2,r.fontWeight="bold",At("label",e,n,r,(0,i.Un)(e.label.text,r)),ut.drawBoundary(t,e,bt)},"drawBoundary"),wt=(0,r.K2)(function(t,e,a,n){let r=0;for(const s of n){r=0;const n=a[s];let l=_t(bt,n.typeC4Shape.text);switch(l.fontSize=l.fontSize-2,n.typeC4Shape.width=(0,i.Un)("\xab"+n.typeC4Shape.text+"\xbb",l),n.typeC4Shape.height=l.fontSize+2,n.typeC4Shape.Y=bt.c4ShapePadding,r=n.typeC4Shape.Y+n.typeC4Shape.height-4,n.image={width:0,height:0,Y:0},n.typeC4Shape.text){case"person":case"external_person":n.image.width=48,n.image.height=48,n.image.Y=r,r=n.image.Y+n.image.height}n.sprite&&(n.image.width=48,n.image.height=48,n.image.Y=r,r=n.image.Y+n.image.height);let o=n.wrap&&bt.wrap,c=bt.width-2*bt.c4ShapePadding,h=_t(bt,n.typeC4Shape.text);if(h.fontSize=h.fontSize+2,h.fontWeight="bold",At("label",n,o,h,c),n.label.Y=r+8,r=n.label.Y+n.label.height,n.type&&""!==n.type.text){n.type.text="["+n.type.text+"]",At("type",n,o,_t(bt,n.typeC4Shape.text),c),n.type.Y=r+5,r=n.type.Y+n.type.height}else if(n.techn&&""!==n.techn.text){n.techn.text="["+n.techn.text+"]",At("techn",n,o,_t(bt,n.techn.text),c),n.techn.Y=r+5,r=n.techn.Y+n.techn.height}let d=r,u=n.label.width;if(n.descr&&""!==n.descr.text){At("descr",n,o,_t(bt,n.typeC4Shape.text),c),n.descr.Y=r+20,r=n.descr.Y+n.descr.height,u=Math.max(n.label.width,n.descr.width),d=r-5*n.descr.textLines}u+=bt.c4ShapePadding,n.width=Math.max(n.width||bt.width,u,bt.width),n.height=Math.max(n.height||bt.height,d,bt.height),n.margin=n.margin||bt.c4ShapeMargin,t.insert(n),ut.drawC4Shape(e,n,bt)}t.bumpLastMargin(bt.c4ShapeMargin)},"drawC4ShapeArray"),kt=class{static{(0,r.K2)(this,"Point")}constructor(t,e){this.x=t,this.y=e}},Ot=(0,r.K2)(function(t,e){let a=t.x,n=t.y,i=e.x,r=e.y,s=a+t.width/2,l=n+t.height/2,o=Math.abs(a-i),c=Math.abs(n-r),h=c/o,d=t.height/t.width,u=null;return n==r&&a<i?u=new kt(a+t.width,l):n==r&&a>i?u=new kt(a,l):a==i&&n<r?u=new kt(s,n+t.height):a==i&&n>r&&(u=new kt(s,n)),a>i&&n<r?u=d>=h?new kt(a,l+h*t.width/2):new kt(s-o/c*t.height/2,n+t.height):a<i&&n<r?u=d>=h?new kt(a+t.width,l+h*t.width/2):new kt(s+o/c*t.height/2,n+t.height):a<i&&n>r?u=d>=h?new kt(a+t.width,l-h*t.width/2):new kt(s+t.height/2*o/c,n):a>i&&n>r&&(u=d>=h?new kt(a,l-t.width/2*h):new kt(s-t.height/2*o/c,n)),u},"getIntersectPoint"),Tt=(0,r.K2)(function(t,e){let a={x:0,y:0};a.x=e.x+e.width/2,a.y=e.y+e.height/2;let n=Ot(t,a);return a.x=t.x+t.width/2,a.y=t.y+t.height/2,{startPoint:n,endPoint:Ot(e,a)}},"getIntersectPoints"),vt=(0,r.K2)(function(t,e,a,n){let r=0;for(let s of e){r+=1;let t=s.wrap&&bt.wrap,e=St(bt);"C4Dynamic"===n.db.getC4Type()&&(s.label.text=r+": "+s.label.text);let l=(0,i.Un)(s.label.text,e);At("label",s,t,e,l),s.techn&&""!==s.techn.text&&(l=(0,i.Un)(s.techn.text,e),At("techn",s,t,e,l)),s.descr&&""!==s.descr.text&&(l=(0,i.Un)(s.descr.text,e),At("descr",s,t,e,l));let o=a(s.from),c=a(s.to),h=Tt(o,c);s.startPoint=h.startPoint,s.endPoint=h.endPoint}ut.drawRels(t,e,bt)},"drawRels");function Rt(t,e,a,n,i){let r=new xt(i);r.data.widthLimit=a.data.widthLimit/Math.min(ft,n.length);for(let[s,l]of n.entries()){let n=0;l.image={width:0,height:0,Y:0},l.sprite&&(l.image.width=48,l.image.height=48,l.image.Y=n,n=l.image.Y+l.image.height);let o=l.wrap&&bt.wrap,c=Et(bt);if(c.fontSize=c.fontSize+2,c.fontWeight="bold",At("label",l,o,c,r.data.widthLimit),l.label.Y=n+8,n=l.label.Y+l.label.height,l.type&&""!==l.type.text){l.type.text="["+l.type.text+"]",At("type",l,o,Et(bt),r.data.widthLimit),l.type.Y=n+5,n=l.type.Y+l.type.height}if(l.descr&&""!==l.descr.text){let t=Et(bt);t.fontSize=t.fontSize-2,At("descr",l,o,t,r.data.widthLimit),l.descr.Y=n+20,n=l.descr.Y+l.descr.height}if(0==s||s%ft===0){let t=a.data.startx+bt.diagramMarginX,e=a.data.stopy+bt.diagramMarginY+n;r.setData(t,t,e,e)}else{let t=r.data.stopx!==r.data.startx?r.data.stopx+bt.diagramMarginX:r.data.startx,e=r.data.starty;r.setData(t,t,e,e)}r.name=l.alias;let h=i.db.getC4ShapeArray(l.alias),d=i.db.getC4ShapeKeys(l.alias);d.length>0&&wt(r,t,h,d),e=l.alias;let u=i.db.getBoundaries(e);u.length>0&&Rt(t,e,r,u,i),"global"!==l.alias&&Ct(t,l,r),a.data.stopy=Math.max(r.data.stopy+bt.c4ShapeMargin,a.data.stopy),a.data.stopx=Math.max(r.data.stopx+bt.c4ShapeMargin,a.data.stopx),pt=Math.max(pt,a.data.stopx),yt=Math.max(yt,a.data.stopy)}}(0,r.K2)(Rt,"drawInsideBoundary");var Dt={drawPersonOrSystemArray:wt,drawBoundary:Ct,setConf:mt,draw:(0,r.K2)(function(t,e,a,n){bt=(0,r.D7)().c4;const i=(0,r.D7)().securityLevel;let l;"sandbox"===i&&(l=(0,s.Ltv)("#i"+e));const o="sandbox"===i?(0,s.Ltv)(l.nodes()[0].contentDocument.body):(0,s.Ltv)("body");let c=n.db;n.db.setWrap(bt.wrap),gt=c.getC4ShapeInRow(),ft=c.getC4BoundaryInRow(),r.Rm.debug(`C:${JSON.stringify(bt,null,2)}`);const h="sandbox"===i?o.select(`[id="${e}"]`):(0,s.Ltv)(`[id="${e}"]`);ut.insertComputerIcon(h),ut.insertDatabaseIcon(h),ut.insertClockIcon(h);let d=new xt(n);d.setData(bt.diagramMarginX,bt.diagramMarginX,bt.diagramMarginY,bt.diagramMarginY),d.data.widthLimit=screen.availWidth,pt=bt.diagramMarginX,yt=bt.diagramMarginY;const u=n.db.getTitle();Rt(h,"",d,n.db.getBoundaries(""),n),ut.insertArrowHead(h),ut.insertArrowEnd(h),ut.insertArrowCrossHead(h),ut.insertArrowFilledHead(h),vt(h,n.db.getRels(),n.db.getC4Shape,n),d.data.stopx=pt,d.data.stopy=yt;const p=d.data;let y=p.stopy-p.starty+2*bt.diagramMarginY;const g=p.stopx-p.startx+2*bt.diagramMarginX;u&&h.append("text").text(u).attr("x",(p.stopx-p.startx)/2-4*bt.diagramMarginX).attr("y",p.starty+bt.diagramMarginY),(0,r.a$)(h,y,g,bt.useMaxWidth);const f=u?60:0;h.attr("viewBox",p.startx-bt.diagramMarginX+" -"+(bt.diagramMarginY+f)+" "+g+" "+(y+f)),r.Rm.debug("models:",p)},"draw")},Nt={parser:d,db:V,renderer:Dt,styles:(0,r.K2)(t=>`.person {\n stroke: ${t.personBorder};\n fill: ${t.personBkg};\n }\n`,"getStyles"),init:(0,r.K2)(({c4:t,wrap:e})=>{Dt.setConf(t),V.setWrap(e)},"init")}},41041:(t,e,a)=>{a.d(e,{CP:()=>c,HT:()=>d,PB:()=>h,aC:()=>o,lC:()=>s,m:()=>l,tk:()=>r});var n=a(97485),i=a(41407),r=(0,n.K2)((t,e)=>{const a=t.append("rect");if(a.attr("x",e.x),a.attr("y",e.y),a.attr("fill",e.fill),a.attr("stroke",e.stroke),a.attr("width",e.width),a.attr("height",e.height),e.name&&a.attr("name",e.name),e.rx&&a.attr("rx",e.rx),e.ry&&a.attr("ry",e.ry),void 0!==e.attrs)for(const n in e.attrs)a.attr(n,e.attrs[n]);return e.class&&a.attr("class",e.class),a},"drawRect"),s=(0,n.K2)((t,e)=>{const a={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};r(t,a).lower()},"drawBackgroundRect"),l=(0,n.K2)((t,e)=>{const a=e.text.replace(n.H1," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.attr("class","legend"),i.style("text-anchor",e.anchor),e.class&&i.attr("class",e.class);const r=i.append("tspan");return r.attr("x",e.x+2*e.textMargin),r.text(a),i},"drawText"),o=(0,n.K2)((t,e,a,n)=>{const r=t.append("image");r.attr("x",e),r.attr("y",a);const s=(0,i.J)(n);r.attr("xlink:href",s)},"drawImage"),c=(0,n.K2)((t,e,a,n)=>{const r=t.append("use");r.attr("x",e),r.attr("y",a);const s=(0,i.J)(n);r.attr("xlink:href",`#${s}`)},"drawEmbeddedImage"),h=(0,n.K2)(()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0}),"getNoteRect"),d=(0,n.K2)(()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0}),"getTextObj")}}]); \ No newline at end of file diff --git a/assets/js/74876495.ec4b0cb6.js b/assets/js/74876495.ec4b0cb6.js new file mode 100644 index 0000000000..ee3fc663af --- /dev/null +++ b/assets/js/74876495.ec4b0cb6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6505],{7357:(e,n,r)=>{r.d(n,{A:()=>l});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var s=r(23420);function l({children:e,hidden:n,className:r}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},65404:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>o});var t=r(36672);const a={},s=t.createContext(a);function l(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(s.Provider,{value:n},e.children)}},65552:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"Dependencies","source":"@site/docs/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/next/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/quickstart.mdx","tags":[],"version":"current","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/next/configuration"}}');var a=r(23420),s=r(65404),l=r(83796),o=r(7357);const c={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},i=void 0,u={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven("https://oss.sonatype.org/content/repositories/snapshots/")\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.13.0-SNAPSHOT"\n}\n'})})]}),(0,a.jsxs)(o.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven {\n url "https://oss.sonatype.org/content/repositories/snapshots"\n }\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.13.0-SNAPSHOT'\n}\n"})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,a.jsx)(n.p,{children:"all checks"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,a.jsx)(n.p,{children:"all checks with auto-correct"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"check sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,a.jsx)(n.p,{children:"apply sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"report depths of each module"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckDepths\n"})}),"\n",(0,a.jsx)(n.p,{children:"generate (module-only) dependency graphs"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckGraphs\n"})}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/next/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},83796:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(36672),a=r(13526),s=r(58797),l=r(85291),o=r(52245),c=r(32342),i=r(45223),u=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,i.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,s=h(e),[l,c]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s})),[i,d]=g({queryString:r,groupId:a}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{b&&c(b)},[b]);return{selectedValue:l,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);c(e),d(e),f(e)},[d,f,s]),tabValues:s}}var f=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var x=r(23420);function k({className:e,block:n,selectedValue:r,selectValue:t,tabValues:l}){const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),i=e=>{const n=e.currentTarget,a=o.indexOf(n),s=l[a].value;s!==r&&(c(n),t(s))},u=e=>{let n=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,x.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:t})=>(0,x.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:u,onClick:i,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function v({lazy:e,children:n,selectedValue:r}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,x.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,x.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,x.jsx)(k,{...n,...e}),(0,x.jsx)(v,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,x.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/756.63037093.js b/assets/js/756.63037093.js new file mode 100644 index 0000000000..35b6fd4746 --- /dev/null +++ b/assets/js/756.63037093.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[756],{90756:(t,n,e)=>{e.d(n,{diagram:()=>ot});var i=e(97485),s=e(3170);function r(t,n){let e;if(void 0===n)for(const i of t)null!=i&&(e>i||void 0===e&&i>=i)&&(e=i);else{let i=-1;for(let s of t)null!=(s=n(s,++i,t))&&(e>s||void 0===e&&s>=s)&&(e=s)}return e}function o(t){return t.target.depth}function c(t,n){return t.sourceLinks.length?t.depth:n-1}function l(t,n){let e=0;if(void 0===n)for(let i of t)(i=+i)&&(e+=i);else{let i=-1;for(let s of t)(s=+n(s,++i,t))&&(e+=s)}return e}function a(t,n){let e;if(void 0===n)for(const i of t)null!=i&&(e<i||void 0===e&&i>=i)&&(e=i);else{let i=-1;for(let s of t)null!=(s=n(s,++i,t))&&(e<s||void 0===e&&s>=s)&&(e=s)}return e}function h(t){return function(){return t}}function u(t,n){return y(t.source,n.source)||t.index-n.index}function f(t,n){return y(t.target,n.target)||t.index-n.index}function y(t,n){return t.y0-n.y0}function d(t){return t.value}function p(t){return t.index}function g(t){return t.nodes}function _(t){return t.links}function k(t,n){const e=t.get(n);if(!e)throw new Error("missing: "+n);return e}function x({nodes:t}){for(const n of t){let t=n.y0,e=t;for(const i of n.sourceLinks)i.y0=t+i.width/2,t+=i.width;for(const i of n.targetLinks)i.y1=e+i.width/2,e+=i.width}}function m(){let t,n,e,i=0,s=0,o=1,m=1,v=24,b=8,w=p,L=c,S=g,E=_,K=6;function A(){const c={nodes:S.apply(null,arguments),links:E.apply(null,arguments)};return function({nodes:t,links:n}){for(const[e,s]of t.entries())s.index=e,s.sourceLinks=[],s.targetLinks=[];const i=new Map(t.map((n,e)=>[w(n,e,t),n]));for(const[e,s]of n.entries()){s.index=e;let{source:t,target:n}=s;"object"!=typeof t&&(t=s.source=k(i,t)),"object"!=typeof n&&(n=s.target=k(i,n)),t.sourceLinks.push(s),n.targetLinks.push(s)}if(null!=e)for(const{sourceLinks:s,targetLinks:r}of t)s.sort(e),r.sort(e)}(c),function({nodes:t}){for(const n of t)n.value=void 0===n.fixedValue?Math.max(l(n.sourceLinks,d),l(n.targetLinks,d)):n.fixedValue}(c),function({nodes:t}){const n=t.length;let e=new Set(t),i=new Set,s=0;for(;e.size;){for(const t of e){t.depth=s;for(const{target:n}of t.sourceLinks)i.add(n)}if(++s>n)throw new Error("circular link");e=i,i=new Set}}(c),function({nodes:t}){const n=t.length;let e=new Set(t),i=new Set,s=0;for(;e.size;){for(const t of e){t.height=s;for(const{source:n}of t.targetLinks)i.add(n)}if(++s>n)throw new Error("circular link");e=i,i=new Set}}(c),function(e){const c=function({nodes:t}){const e=a(t,t=>t.depth)+1,s=(o-i-v)/(e-1),r=new Array(e);for(const n of t){const t=Math.max(0,Math.min(e-1,Math.floor(L.call(null,n,e))));n.layer=t,n.x0=i+t*s,n.x1=n.x0+v,r[t]?r[t].push(n):r[t]=[n]}if(n)for(const i of r)i.sort(n);return r}(e);t=Math.min(b,(m-s)/(a(c,t=>t.length)-1)),function(n){const e=r(n,n=>(m-s-(n.length-1)*t)/l(n,d));for(const i of n){let n=s;for(const s of i){s.y0=n,s.y1=n+s.value*e,n=s.y1+t;for(const t of s.sourceLinks)t.width=t.value*e}n=(m-n+t)/(i.length+1);for(let t=0;t<i.length;++t){const e=i[t];e.y0+=n*(t+1),e.y1+=n*(t+1)}C(i)}}(c);for(let t=0;t<K;++t){const n=Math.pow(.99,t),e=Math.max(1-n,(t+1)/K);I(c,n,e),M(c,n,e)}}(c),x(c),c}function M(t,e,i){for(let s=1,r=t.length;s<r;++s){const r=t[s];for(const t of r){let n=0,i=0;for(const{source:e,value:r}of t.targetLinks){let s=r*(t.layer-e.layer);n+=O(e,t)*s,i+=s}if(!(i>0))continue;let s=(n/i-t.y0)*e;t.y0+=s,t.y1+=s,P(t)}void 0===n&&r.sort(y),T(r,i)}}function I(t,e,i){for(let s=t.length-2;s>=0;--s){const r=t[s];for(const t of r){let n=0,i=0;for(const{target:e,value:r}of t.sourceLinks){let s=r*(e.layer-t.layer);n+=$(t,e)*s,i+=s}if(!(i>0))continue;let s=(n/i-t.y0)*e;t.y0+=s,t.y1+=s,P(t)}void 0===n&&r.sort(y),T(r,i)}}function T(n,e){const i=n.length>>1,r=n[i];N(n,r.y0-t,i-1,e),D(n,r.y1+t,i+1,e),N(n,m,n.length-1,e),D(n,s,0,e)}function D(n,e,i,s){for(;i<n.length;++i){const r=n[i],o=(e-r.y0)*s;o>1e-6&&(r.y0+=o,r.y1+=o),e=r.y1+t}}function N(n,e,i,s){for(;i>=0;--i){const r=n[i],o=(r.y1-e)*s;o>1e-6&&(r.y0-=o,r.y1-=o),e=r.y0-t}}function P({sourceLinks:t,targetLinks:n}){if(void 0===e){for(const{source:{sourceLinks:t}}of n)t.sort(f);for(const{target:{targetLinks:n}}of t)n.sort(u)}}function C(t){if(void 0===e)for(const{sourceLinks:n,targetLinks:e}of t)n.sort(f),e.sort(u)}function O(n,e){let i=n.y0-(n.sourceLinks.length-1)*t/2;for(const{target:s,width:r}of n.sourceLinks){if(s===e)break;i+=r+t}for(const{source:t,width:s}of e.targetLinks){if(t===n)break;i-=s}return i}function $(n,e){let i=e.y0-(e.targetLinks.length-1)*t/2;for(const{source:s,width:r}of e.targetLinks){if(s===n)break;i+=r+t}for(const{target:t,width:s}of n.sourceLinks){if(t===e)break;i-=s}return i}return A.update=function(t){return x(t),t},A.nodeId=function(t){return arguments.length?(w="function"==typeof t?t:h(t),A):w},A.nodeAlign=function(t){return arguments.length?(L="function"==typeof t?t:h(t),A):L},A.nodeSort=function(t){return arguments.length?(n=t,A):n},A.nodeWidth=function(t){return arguments.length?(v=+t,A):v},A.nodePadding=function(n){return arguments.length?(b=t=+n,A):b},A.nodes=function(t){return arguments.length?(S="function"==typeof t?t:h(t),A):S},A.links=function(t){return arguments.length?(E="function"==typeof t?t:h(t),A):E},A.linkSort=function(t){return arguments.length?(e=t,A):e},A.size=function(t){return arguments.length?(i=s=0,o=+t[0],m=+t[1],A):[o-i,m-s]},A.extent=function(t){return arguments.length?(i=+t[0][0],o=+t[1][0],s=+t[0][1],m=+t[1][1],A):[[i,s],[o,m]]},A.iterations=function(t){return arguments.length?(K=+t,A):K},A}var v=Math.PI,b=2*v,w=1e-6,L=b-w;function S(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function E(){return new S}S.prototype=E.prototype={constructor:S,moveTo:function(t,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,n){this._+="L"+(this._x1=+t)+","+(this._y1=+n)},quadraticCurveTo:function(t,n,e,i){this._+="Q"+ +t+","+ +n+","+(this._x1=+e)+","+(this._y1=+i)},bezierCurveTo:function(t,n,e,i,s,r){this._+="C"+ +t+","+ +n+","+ +e+","+ +i+","+(this._x1=+s)+","+(this._y1=+r)},arcTo:function(t,n,e,i,s){t=+t,n=+n,e=+e,i=+i,s=+s;var r=this._x1,o=this._y1,c=e-t,l=i-n,a=r-t,h=o-n,u=a*a+h*h;if(s<0)throw new Error("negative radius: "+s);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=n);else if(u>w)if(Math.abs(h*c-l*a)>w&&s){var f=e-r,y=i-o,d=c*c+l*l,p=f*f+y*y,g=Math.sqrt(d),_=Math.sqrt(u),k=s*Math.tan((v-Math.acos((d+u-p)/(2*g*_)))/2),x=k/_,m=k/g;Math.abs(x-1)>w&&(this._+="L"+(t+x*a)+","+(n+x*h)),this._+="A"+s+","+s+",0,0,"+ +(h*f>a*y)+","+(this._x1=t+m*c)+","+(this._y1=n+m*l)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,i,s,r){t=+t,n=+n,r=!!r;var o=(e=+e)*Math.cos(i),c=e*Math.sin(i),l=t+o,a=n+c,h=1^r,u=r?i-s:s-i;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+l+","+a:(Math.abs(this._x1-l)>w||Math.abs(this._y1-a)>w)&&(this._+="L"+l+","+a),e&&(u<0&&(u=u%b+b),u>L?this._+="A"+e+","+e+",0,1,"+h+","+(t-o)+","+(n-c)+"A"+e+","+e+",0,1,"+h+","+(this._x1=l)+","+(this._y1=a):u>w&&(this._+="A"+e+","+e+",0,"+ +(u>=v)+","+h+","+(this._x1=t+e*Math.cos(s))+","+(this._y1=n+e*Math.sin(s))))},rect:function(t,n,e,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +i+"h"+-e+"Z"},toString:function(){return this._}};const K=E;var A=Array.prototype.slice;function M(t){return function(){return t}}function I(t){return t[0]}function T(t){return t[1]}function D(t){return t.source}function N(t){return t.target}function P(t){var n=D,e=N,i=I,s=T,r=null;function o(){var o,c=A.call(arguments),l=n.apply(this,c),a=e.apply(this,c);if(r||(r=o=K()),t(r,+i.apply(this,(c[0]=l,c)),+s.apply(this,c),+i.apply(this,(c[0]=a,c)),+s.apply(this,c)),o)return r=null,o+""||null}return o.source=function(t){return arguments.length?(n=t,o):n},o.target=function(t){return arguments.length?(e=t,o):e},o.x=function(t){return arguments.length?(i="function"==typeof t?t:M(+t),o):i},o.y=function(t){return arguments.length?(s="function"==typeof t?t:M(+t),o):s},o.context=function(t){return arguments.length?(r=null==t?null:t,o):r},o}function C(t,n,e,i,s){t.moveTo(n,e),t.bezierCurveTo(n=(n+i)/2,e,n,s,i,s)}function O(t){return[t.source.x1,t.y0]}function $(t){return[t.target.x0,t.y1]}function j(){return P(C).source(O).target($)}var z=function(){var t=(0,i.K2)(function(t,n,e,i){for(e=e||{},i=t.length;i--;e[t[i]]=n);return e},"o"),n=[1,9],e=[1,10],s=[1,5,10,12],r={trace:(0,i.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,SANKEY:4,NEWLINE:5,csv:6,opt_eof:7,record:8,csv_tail:9,EOF:10,"field[source]":11,COMMA:12,"field[target]":13,"field[value]":14,field:15,escaped:16,non_escaped:17,DQUOTE:18,ESCAPED_TEXT:19,NON_ESCAPED_TEXT:20,$accept:0,$end:1},terminals_:{2:"error",4:"SANKEY",5:"NEWLINE",10:"EOF",11:"field[source]",12:"COMMA",13:"field[target]",14:"field[value]",18:"DQUOTE",19:"ESCAPED_TEXT",20:"NON_ESCAPED_TEXT"},productions_:[0,[3,4],[6,2],[9,2],[9,0],[7,1],[7,0],[8,5],[15,1],[15,1],[16,3],[17,1]],performAction:(0,i.K2)(function(t,n,e,i,s,r,o){var c=r.length-1;switch(s){case 7:const t=i.findOrCreateNode(r[c-4].trim().replaceAll('""','"')),n=i.findOrCreateNode(r[c-2].trim().replaceAll('""','"')),e=parseFloat(r[c].trim());i.addLink(t,n,e);break;case 8:case 9:case 11:this.$=r[c];break;case 10:this.$=r[c-1]}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:n,20:e},{1:[2,6],7:11,10:[1,12]},t(e,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(s,[2,8]),t(s,[2,9]),{19:[1,16]},t(s,[2,11]),{1:[2,1]},{1:[2,5]},t(e,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:n,20:e},{15:18,16:7,17:8,18:n,20:e},{18:[1,19]},t(e,[2,3]),{12:[1,20]},t(s,[2,10]),{15:21,16:7,17:8,18:n,20:e},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:(0,i.K2)(function(t,n){if(!n.recoverable){var e=new Error(t);throw e.hash=n,e}this.trace(t)},"parseError"),parse:(0,i.K2)(function(t){var n=this,e=[0],s=[],r=[null],o=[],c=this.table,l="",a=0,h=0,u=0,f=o.slice.call(arguments,1),y=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);y.setInput(t,d.yy),d.yy.lexer=y,d.yy.parser=this,void 0===y.yylloc&&(y.yylloc={});var g=y.yylloc;o.push(g);var _=y.options&&y.options.ranges;function k(){var t;return"number"!=typeof(t=s.pop()||y.lex()||1)&&(t instanceof Array&&(t=(s=t).pop()),t=n.symbols_[t]||t),t}"function"==typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,i.K2)(function(t){e.length=e.length-2*t,r.length=r.length-t,o.length=o.length-t},"popStack"),(0,i.K2)(k,"lex");for(var x,m,v,b,w,L,S,E,K,A={};;){if(v=e[e.length-1],this.defaultActions[v]?b=this.defaultActions[v]:(null==x&&(x=k()),b=c[v]&&c[v][x]),void 0===b||!b.length||!b[0]){var M="";for(L in K=[],c[v])this.terminals_[L]&&L>2&&K.push("'"+this.terminals_[L]+"'");M=y.showPosition?"Parse error on line "+(a+1)+":\n"+y.showPosition()+"\nExpecting "+K.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(a+1)+": Unexpected "+(1==x?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(M,{text:y.match,token:this.terminals_[x]||x,line:y.yylineno,loc:g,expected:K})}if(b[0]instanceof Array&&b.length>1)throw new Error("Parse Error: multiple actions possible at state: "+v+", token: "+x);switch(b[0]){case 1:e.push(x),r.push(y.yytext),o.push(y.yylloc),e.push(b[1]),x=null,m?(x=m,m=null):(h=y.yyleng,l=y.yytext,a=y.yylineno,g=y.yylloc,u>0&&u--);break;case 2:if(S=this.productions_[b[1]][1],A.$=r[r.length-S],A._$={first_line:o[o.length-(S||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(S||1)].first_column,last_column:o[o.length-1].last_column},_&&(A._$.range=[o[o.length-(S||1)].range[0],o[o.length-1].range[1]]),void 0!==(w=this.performAction.apply(A,[l,h,a,d.yy,b[1],r,o].concat(f))))return w;S&&(e=e.slice(0,-1*S*2),r=r.slice(0,-1*S),o=o.slice(0,-1*S)),e.push(this.productions_[b[1]][0]),r.push(A.$),o.push(A._$),E=c[e[e.length-2]][e[e.length-1]],e.push(E);break;case 3:return!0}}return!0},"parse")},o=function(){return{EOF:1,parseError:(0,i.K2)(function(t,n){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,n)},"parseError"),setInput:(0,i.K2)(function(t,n){return this.yy=n||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,i.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,i.K2)(function(t){var n=t.length,e=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),e.length-1&&(this.yylineno-=e.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:e?(e.length===i.length?this.yylloc.first_column:0)+i[i.length-e.length].length-e[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this},"unput"),more:(0,i.K2)(function(){return this._more=!0,this},"more"),reject:(0,i.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,i.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,i.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,i.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,i.K2)(function(){var t=this.pastInput(),n=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+n+"^"},"showPosition"),test_match:(0,i.K2)(function(t,n){var e,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,n,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e)return e;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1},"test_match"),next:(0,i.K2)(function(){if(this.done)return this.EOF;var t,n,e,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;r<s.length;r++)if((e=this._input.match(this.rules[s[r]]))&&(!n||e[0].length>n[0].length)){if(n=e,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(e,s[r])))return t;if(this._backtrack){n=!1;continue}return!1}if(!this.options.flex)break}return n?!1!==(t=this.test_match(n,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,i.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,i.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,i.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,i.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,i.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,i.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,i.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,i.K2)(function(t,n,e,i){switch(e){case 0:return this.pushState("csv"),4;case 1:return 10;case 2:return 5;case 3:return 12;case 4:return this.pushState("escaped_text"),18;case 5:return 20;case 6:return this.popState("escaped_text"),18;case 7:return 19}},"anonymous"),rules:[/^(?:sankey-beta\b)/i,/^(?:$)/i,/^(?:((\u000D\u000A)|(\u000A)))/i,/^(?:(\u002C))/i,/^(?:(\u0022))/i,/^(?:([\u0020-\u0021\u0023-\u002B\u002D-\u007E])*)/i,/^(?:(\u0022)(?!(\u0022)))/i,/^(?:(([\u0020-\u0021\u0023-\u002B\u002D-\u007E])|(\u002C)|(\u000D)|(\u000A)|(\u0022)(\u0022))*)/i],conditions:{csv:{rules:[1,2,3,4,5,6,7],inclusive:!1},escaped_text:{rules:[6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}}}();function c(){this.yy={}}return r.lexer=o,(0,i.K2)(c,"Parser"),c.prototype=r,r.Parser=c,new c}();z.parser=z;var U=z,F=[],W=[],G=new Map,V=(0,i.K2)(()=>{F=[],W=[],G=new Map,(0,i.IU)()},"clear"),X=class{constructor(t,n,e=0){this.source=t,this.target=n,this.value=e}static{(0,i.K2)(this,"SankeyLink")}},Y=(0,i.K2)((t,n,e)=>{F.push(new X(t,n,e))},"addLink"),q=class{constructor(t){this.ID=t}static{(0,i.K2)(this,"SankeyNode")}},Q=(0,i.K2)(t=>{t=i.Y2.sanitizeText(t,(0,i.D7)());let n=G.get(t);return void 0===n&&(n=new q(t),G.set(t,n),W.push(n)),n},"findOrCreateNode"),R=(0,i.K2)(()=>W,"getNodes"),B=(0,i.K2)(()=>F,"getLinks"),Z=(0,i.K2)(()=>({nodes:W.map(t=>({id:t.ID})),links:F.map(t=>({source:t.source.ID,target:t.target.ID,value:t.value}))}),"getGraph"),H={nodesMap:G,getConfig:(0,i.K2)(()=>(0,i.D7)().sankey,"getConfig"),getNodes:R,getLinks:B,getGraph:Z,addLink:Y,findOrCreateNode:Q,getAccTitle:i.iN,setAccTitle:i.SV,getAccDescription:i.m7,setAccDescription:i.EI,getDiagramTitle:i.ab,setDiagramTitle:i.ke,clear:V},J=class t{static{(0,i.K2)(this,"Uid")}static{this.count=0}static next(n){return new t(n+ ++t.count)}constructor(t){this.id=t,this.href=`#${t}`}toString(){return"url("+this.href+")"}},tt={left:function(t){return t.depth},right:function(t,n){return n-1-t.height},center:function(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?r(t.sourceLinks,o)-1:0},justify:c},nt=(0,i.K2)(function(t,n,e,r){const{securityLevel:o,sankey:c}=(0,i.D7)(),l=i.ME.sankey;let a;"sandbox"===o&&(a=(0,s.Ltv)("#i"+n));const h="sandbox"===o?(0,s.Ltv)(a.nodes()[0].contentDocument.body):(0,s.Ltv)("body"),u="sandbox"===o?h.select(`[id="${n}"]`):(0,s.Ltv)(`[id="${n}"]`),f=c?.width??l.width,y=c?.height??l.width,d=c?.useMaxWidth??l.useMaxWidth,p=c?.nodeAlignment??l.nodeAlignment,g=c?.prefix??l.prefix,_=c?.suffix??l.suffix,k=c?.showValues??l.showValues,x=r.db.getGraph(),v=tt[p];m().nodeId(t=>t.id).nodeWidth(10).nodePadding(10+(k?15:0)).nodeAlign(v).extent([[0,0],[f,y]])(x);const b=(0,s.UMr)(s.zt);u.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",t=>(t.uid=J.next("node-")).id).attr("transform",function(t){return"translate("+t.x0+","+t.y0+")"}).attr("x",t=>t.x0).attr("y",t=>t.y0).append("rect").attr("height",t=>t.y1-t.y0).attr("width",t=>t.x1-t.x0).attr("fill",t=>b(t.id));const w=(0,i.K2)(({id:t,value:n})=>k?`${t}\n${g}${Math.round(100*n)/100}${_}`:t,"getText");u.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",t=>t.x0<f/2?t.x1+6:t.x0-6).attr("y",t=>(t.y1+t.y0)/2).attr("dy",(k?"0":"0.35")+"em").attr("text-anchor",t=>t.x0<f/2?"start":"end").text(w);const L=u.append("g").attr("class","links").attr("fill","none").attr("stroke-opacity",.5).selectAll(".link").data(x.links).join("g").attr("class","link").style("mix-blend-mode","multiply"),S=c?.linkColor??"gradient";if("gradient"===S){const t=L.append("linearGradient").attr("id",t=>(t.uid=J.next("linearGradient-")).id).attr("gradientUnits","userSpaceOnUse").attr("x1",t=>t.source.x1).attr("x2",t=>t.target.x0);t.append("stop").attr("offset","0%").attr("stop-color",t=>b(t.source.id)),t.append("stop").attr("offset","100%").attr("stop-color",t=>b(t.target.id))}let E;switch(S){case"gradient":E=(0,i.K2)(t=>t.uid,"coloring");break;case"source":E=(0,i.K2)(t=>b(t.source.id),"coloring");break;case"target":E=(0,i.K2)(t=>b(t.target.id),"coloring");break;default:E=S}L.append("path").attr("d",j()).attr("stroke",E).attr("stroke-width",t=>Math.max(1,t.width)),(0,i.ot)(void 0,u,0,d)},"draw"),et={draw:nt},it=(0,i.K2)(t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,"\n").trim(),"prepareTextForParsing"),st=(0,i.K2)(t=>`.label {\n font-family: ${t.fontFamily};\n }`,"getStyles"),rt=U.parse.bind(U);U.parse=t=>rt(it(t));var ot={styles:st,parser:U,db:H,renderer:et}}}]); \ No newline at end of file diff --git a/assets/js/75878fc8.b7f50444.js b/assets/js/75878fc8.b7f50444.js new file mode 100644 index 0000000000..bbc526fb8b --- /dev/null +++ b/assets/js/75878fc8.b7f50444.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7399],{11601:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>o,contentTitle:()=>l,default:()=>d,frontMatter:()=>t,metadata:()=>h,toc:()=>c});const h=JSON.parse('{"type":"mdx","permalink":"/ModuleCheck/changelog","source":"@site/src/pages/changelog.md","description":"0.12.5","frontMatter":{},"unlisted":false}');var n=r(23420),i=r(65404);const t={},l=void 0,o={},c=[{value:"0.12.5",id:"0125",level:2},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes",level:4},{value:"Other Changes",id:"other-changes",level:4},{value:"0.12.4",id:"0124",level:2},{value:"0.12.3",id:"0123",level:2},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-1",level:4},{value:"\ud83e\uddf0 Maintenance",id:"-maintenance",level:4},{value:"Contributors",id:"contributors",level:4},{value:"0.12.2",id:"0122",level:2},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-2",level:4},{value:"0.12.1",id:"0121",level:2},{value:"\ud83d\uddd1 Deprecations",id:"-deprecations",level:4},{value:"\ud83d\udca5 Breaking Changes",id:"-breaking-changes",level:4},{value:"\ud83d\ude80 Features",id:"-features",level:4},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-3",level:4},{value:"\ud83e\uddf0 Maintenance",id:"-maintenance-1",level:4},{value:"\u2139\ufe0f Website",id:"\u2139\ufe0f-website",level:4},{value:"Contributors",id:"contributors-1",level:4},{value:"0.12.0",id:"0120",level:2},{value:"\ud83d\udca5 Breaking Changes",id:"-breaking-changes-1",level:4},{value:"\ud83d\udcd0 New Rules",id:"-new-rules",level:4},{value:"\ud83d\ude80 Features",id:"-features-1",level:4},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-4",level:4},{value:"\u2139\ufe0f Website",id:"\u2139\ufe0f-website-1",level:4},{value:"Contributors",id:"contributors-2",level:4},{value:"0.11.3",id:"0113",level:2},{value:"\ud83d\ude80 Features",id:"-features-2",level:4},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-5",level:4},{value:"\ud83e\uddf0 Maintenance",id:"-maintenance-2",level:4},{value:"\u2139\ufe0f Website",id:"\u2139\ufe0f-website-2",level:4},{value:"0.11.2",id:"0112",level:2},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-6",level:4},{value:"0.11.1",id:"0111",level:2},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-7",level:4},{value:"0.11.0 - Groovy auto-correct support",id:"0110---groovy-auto-correct-support",level:2},{value:"\ud83d\udc1b Bug Fixes",id:"-bug-fixes-8",level:4},{value:"0.10.0",id:"0100",level:2}];function u(e){const s={a:"a",code:"code",h2:"h2",h4:"h4",li:"li",p:"p",pre:"pre",strong:"strong",ul:"ul",...(0,i.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(s.h2,{id:"0125",children:"0.12.5"}),"\n",(0,n.jsxs)(s.p,{children:["This is a re-release of ",(0,n.jsx)(s.a,{href:"#0124",children:"0.12.4"}),"."]}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["don't crash if Anvil isn't in the buildScript classpath by @RBusarow\nin ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow/ModuleCheck/pull/944",children:"https://github.com/RBusarow/ModuleCheck/pull/944"})]}),"\n",(0,n.jsxs)(s.li,{children:["ignore suppress/noinspection names which don't fit the FindingName pattern by @RBusarow\nin ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow/ModuleCheck/pull/945",children:"https://github.com/RBusarow/ModuleCheck/pull/945"})]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"other-changes",children:"Other Changes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["GitHub release notes config by @RBusarow in ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow/ModuleCheck/pull/946",children:"https://github.com/RBusarow/ModuleCheck/pull/946"})]}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.strong,{children:"Full Changelog"}),": ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow/ModuleCheck/compare/0.12.3...0.12.5",children:"https://github.com/RBusarow/ModuleCheck/compare/0.12.3...0.12.5"})]}),"\n",(0,n.jsx)(s.h2,{id:"0124",children:"0.12.4"}),"\n",(0,n.jsx)(s.p,{children:"This version was published with stale artifacts. Use 0.12.5 instead."}),"\n",(0,n.jsx)(s.h2,{id:"0123",children:"0.12.3"}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-1",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["fix suppressing findings within the AGP\nDSL (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/712",children:"#712"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["parse the declarations of named companion objects and their\nmembers (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/706",children:"#706"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["treat annotation processor dependencies the same as runtime dependencies for ",(0,n.jsx)(s.code,{children:"McProject.uses()"}),"\nand overshot behavior (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/701",children:"#701"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix false positive for 'unused-dependency' when consuming ",(0,n.jsx)(s.code,{children:"debug"})," source\nfrom ",(0,n.jsx)(s.code,{children:"testImplementation"})," ",(0,n.jsx)(s.a,{href:"https://github.com/tasomaniac",children:"@tasomaniac"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/685",children:"#685"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["revert Kotlin to 1.6.10 to fix build issues in targets using\n1.6.10 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/683",children:"#683"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-maintenance",children:"\ud83e\uddf0 Maintenance"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Update dependency com.vanniktech",":gradle-maven-publish-plugin"," to\nv0.20.0 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/707",children:"#707"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.autonomousapps.dependency-analysis to\nv1.4.0 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/698",children:"#698"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.osacky.doctor to\nv0.8.1 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/699",children:"#699"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update docusaurus monorepo to\nv2.0.0-beta.21 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/691",children:"#691"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update kotlinx-coroutines to v1.6.2 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/695",children:"#695"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.autonomousapps.dependency-analysis to\nv1.3.0 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/696",children:"#696"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.github.ben-manes.caffeine",":caffeine"," to\nv3.1.1 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/694",children:"#694"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["remove CI's ",(0,n.jsx)(s.code,{children:"tests-windows"})," need\nfor ",(0,n.jsx)(s.code,{children:"publish-maven-local"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/693",children:"#693"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["use Caffeine for caching, with ",(0,n.jsx)(s.code,{children:"LazyDeferred"}),"\nloaders ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/692",children:"#692"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dropbox-dependencyGuard to\nv0.3.0 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/690",children:"#690"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["don't sign ",(0,n.jsx)(s.code,{children:"-SNAPSHOT"}),"\nbuilds ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/686",children:"#686"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["disable KtLint's broken ",(0,n.jsx)(s.code,{children:"experimental:type-parameter-list-spacing"}),"\nrule ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/681",children:"#681"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update crazy-max/ghaction-github-pages action to\nv3 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/679",children:"#679"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["update changelog for ",(0,n.jsx)(s.code,{children:"0.12.2"}),"\nrelease ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/680",children:"#680"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.rickbusarow.module-check to\nv0.12.2 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/678",children:"#678"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"contributors",children:"Contributors"}),"\n",(0,n.jsxs)(s.p,{children:[(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," and ",(0,n.jsx)(s.a,{href:"https://github.com/tasomaniac",children:"@tasomaniac"})]}),"\n",(0,n.jsx)(s.h2,{id:"0122",children:"0.12.2"}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-2",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["false positives for unused kapt processors which are defined in\nadditionalKaptMatchers (",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow/ModuleCheck/commit/8c55fd188f15c826ba4b6b28d293f68f49bafcb9",children:"8c55fd1"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"0121",children:"0.12.1"}),"\n",(0,n.jsx)(s.h4,{id:"-deprecations",children:"\ud83d\uddd1 Deprecations"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["The names of all findings have been updated/standardized. Any declarations which were suppressing\na finding with the old ID (via ",(0,n.jsx)(s.code,{children:'@Suppress("someFinding")'})," or ",(0,n.jsx)(s.code,{children:"//suppress=someFinding"}),") will still\nwork, but they should be updated to use the new names.\nSee ",(0,n.jsx)(s.a,{href:"https://rbusarow.github.io/ModuleCheck/migrations#standardized-finding-names",children:"the migrations guide"})]}),"\n",(0,n.jsxs)(s.li,{children:["The method for defining ",(0,n.jsx)(s.code,{children:"additionalKaptMatchers"})," in the Gradle DSL has been deprecated, replaced\nwith the ",(0,n.jsx)(s.code,{children:"additionalCodeGenerators"})," property and ",(0,n.jsx)(s.code,{children:"CodeGeneratorBinding"}),".\nSee ",(0,n.jsx)(s.a,{href:"https://rbusarow.github.io/ModuleCheck/migrations#code-generator-binding",children:"the migrations guide"})]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-breaking-changes",children:"\ud83d\udca5 Breaking Changes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["The base ",(0,n.jsx)(s.code,{children:":moduleCheck"})," task will now automatically hook into the root project's ",(0,n.jsx)(s.code,{children:":check"})," task, if\none\nexists. ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/611",children:"#611"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-features",children:"\ud83d\ude80 Features"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Added support\nfor ",(0,n.jsx)(s.a,{href:"https://sarifweb.azurewebsites.net",children:"Static Analysis Results Interchange Format (SARIF)"}),"\nreport\noutput ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/566",children:"#566"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-3",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["don't find ",(0,n.jsx)(s.code,{children:"must-be-api"})," if the project is already an api dependency\nalso ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/666",children:"#666"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["remove AGP and KGP from the plugin's runtime\nclasspath (",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow/ModuleCheck/commit/079ab9d709add63dbf44ecbd8a534bf279becd47",children:"079ab9d"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix matching to custom\nkaptMatchers ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/658",children:"#658"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["properly use settings to determine which kinds of depth output to\ncreate ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/647",children:"#647"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix relative paths for custom graph report\ndirectory ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/612",children:"#612"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:['use type-safe accessor "path" when adding a dependency with type-safe\nsyntax ',(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/608",children:"#608"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["evaluate suppress/noinspection annotations\neagerly ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/604",children:"#604"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fixes false negative for unused kapt plugin when there are no\nprocessors ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/603",children:"#603"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix Dagger NoSuchMethodError for ",(0,n.jsx)(s.code,{children:"dagger.internal.Preconditions.checkNotNullFromProvides"})," in\nSNAPSHOT ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/570",children:"#570"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-maintenance-1",children:"\ud83e\uddf0 Maintenance"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["add a discrete job in CI for publishing to mavenLocal, then cache\nit ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/668",children:"#668"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["update the build classpath baseline for the snapshot build's new\nrunt\u2026 ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/664",children:"#664"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["use the current SNAPSHOT for plugin\ndogfooding ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/663",children:"#663"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["migrate TestKit tests away from the Specs\nDSLs ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/660",children:"#660"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["hook dependencyGuard into the ",(0,n.jsx)(s.code,{children:"check"}),"\ntask ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/661",children:"#661"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["give Dokka explicit dependency upon KtLint tasks and more broadly\ndis\u2026 ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/659",children:"#659"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dropbox-dependencyGuard to\nv0.2.0 ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/657",children:"#657"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["require comments for public APIs in Detekt, and add\nbaselines ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/656",children:"#656"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add dependency-guard and\nbaselines ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/654",children:"#654"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency prism-react-renderer to\nv1.3.3 ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/653",children:"#653"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.android.tools.build",":gradle"," to\nv7.2.0 ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/620",children:"#620"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update actions/setup-java action to\nv3 ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/652",children:"#652"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.autonomousapps.dependency-analysis to\nv1.2.1 ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/651",children:"#651"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update actions/upload-artifact action to\nv3 ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/629",children:"#629"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update dependency com.gradleup.auto.manifest to\nv2 ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/645",children:"#645"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Update react monorepo to v18 (\nmajor) ",(0,n.jsx)(s.a,{href:"https://github.com/renovate",children:"@renovate"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/646",children:"#646"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["remove github actions\ncaching ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/649",children:"#649"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["remove\ndependabot ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/648",children:"#648"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["create a shared ",(0,n.jsx)(s.code,{children:".gradle"})," cache for TestKit\ntests ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/640",children:"#640"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add the ",(0,n.jsx)(s.code,{children:"artifacts-check"})," convention\nplugin ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/615",children:"#615"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix incorrect/duplicate maven artifact\nids ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/614",children:"#614"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["revert KaptMatcher name\nto ",(0,n.jsx)(s.code,{children:"modulecheck.api.KaptMatcher"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/613",children:"#613"}),")"]}),"\n",(0,n.jsx)(s.li,{}),"\n"]}),"\n",(0,n.jsxs)(s.p,{children:["delete ",(0,n.jsx)(s.code,{children:"ConfiguredModule"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/609",children:"#609"}),")"]}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:['disable the "use tab character" option in IDE\ncodestyle ',(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/607",children:"#607"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["replace ",(0,n.jsx)(s.code,{children:"java-test-fixtures"})," usages with ",(0,n.jsx)(s.code,{children:"-testing"}),"\nmodules ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/605",children:"#605"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump mermaid from 8.14.0 to 9.1.1 in\n/website ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/601",children:"#601"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Dependency block to dependencies\nblock ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/600",children:"#600"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["split\nup ",(0,n.jsx)(s.code,{children:":modulecheck-parsing:gradle"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/599",children:"#599"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump dagger from 2.41 to\n2.42 ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/597",children:"#597"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["rename ",(0,n.jsx)(s.code,{children:"modulecheck.reporting.logging.Logger"}),"\nto ",(0,n.jsx)(s.code,{children:"McLogger"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/593",children:"#593"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["pull ",(0,n.jsx)(s.code,{children:"Finding"})," apis out of ",(0,n.jsx)(s.code,{children:":modulecheck-rules:api"})," and into their\now\u2026 ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/591",children:"#591"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Fix execution optimization for KtLint\nin ",(0,n.jsx)(s.code,{children:":modulecheck-plugin"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/590",children:"#590"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["use the stable version of the plugin in\nCI ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/589",children:"#589"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["suppress Detekt's ComplexMethod for single ",(0,n.jsx)(s.code,{children:"when"}),"\nstatements ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/584",children:"#584"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["pull rules and configs into their own\nmodules ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/583",children:"#583"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump kotest-assertions-core-jvm from 5.2.3 to\n5.3.0 ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/579",children:"#579"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump turbine from 0.7.0 to\n0.8.0 ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/580",children:"#580"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix ",(0,n.jsx)(s.code,{children:"BasePluginTest"}),"'s unused ",(0,n.jsx)(s.code,{children:"stacktrace"}),"\nparameter ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/578",children:"#578"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add Detekt's SARIF reports to\nCI ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/568",children:"#568"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["standardize hermit's definition\nin ",(0,n.jsx)(s.code,{children:"libs.versions.toml"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/567",children:"#567"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["move ",(0,n.jsx)(s.code,{children:"File.createSafely()"})," to production\ncode ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/565",children:"#565"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump dokka-gradle-plugin from 1.6.20 to\n1.6.21 ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/563",children:"#563"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump async from 2.6.3 to 2.6.4 in\n/website ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/543",children:"#543"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump kotlin-reflect from 1.6.20 to\n1.6.21 ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/553",children:"#553"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump mermaid from 8.13.8 to 8.14.0 in\n/website ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/545",children:"#545"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump dokka-gradle-plugin from 1.6.10 to\n1.6.20 ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/544",children:"#544"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump @mdx-js/react from 1.6.22 to 2.1.1 in\n/website ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/546",children:"#546"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump antlr4 from 4.10 to\n4.10.1 ",(0,n.jsx)(s.a,{href:"https://github.com/dependabot",children:"@dependabot"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/550",children:"#550"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"\u2139\ufe0f-website",children:"\u2139\ufe0f Website"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["remove the ",(0,n.jsx)(s.code,{children:"google()"})," repository requirement from\ndocs ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/667",children:"#667"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["594 hook into root project check\ntask ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/611",children:"#611"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["replace ",(0,n.jsx)(s.code,{children:"KaptMatcher"}),"\nwith ",(0,n.jsx)(s.code,{children:"CodeGeneratorBinding"})," ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/610",children:"#610"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["update Docusaurus to\n2.0.0-beta.20 ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/592",children:"#592"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add support for sarif\nreporting ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/566",children:"#566"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["strict rule/finding name\nconventions ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/564",children:"#564"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add ",(0,n.jsx)(s.code,{children:"google()"})," repository to config\ndocs ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/559",children:"#559"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add missing docs for\nrules ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/555",children:"#555"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix\npublishing ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/548",children:"#548"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["release\n0.12.0 ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/547",children:"#547"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"contributors-1",children:"Contributors"}),"\n",(0,n.jsx)(s.p,{children:"@RBusarow"}),"\n",(0,n.jsx)(s.h2,{id:"0120",children:"0.12.0"}),"\n",(0,n.jsx)(s.h4,{id:"-breaking-changes-1",children:"\ud83d\udca5 Breaking Changes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["The ",(0,n.jsx)(s.code,{children:"autoCorrect"})," property in the Gradle settings DSL has been removed. Instead, to perform a\ncheck with auto-correct, add the ",(0,n.jsx)(s.code,{children:"Auto"})," suffix to the task name.","\n",(0,n.jsx)(s.pre,{children:(0,n.jsx)(s.code,{className:"language-bash",children:"# perform all checks and fail if errors are found\n./gradlew moduleCheck\n\n# perform all checks and auto-correct if possible\n./gradlew moduleCheckAuto\n"})}),"\n"]}),"\n",(0,n.jsxs)(s.li,{children:["Tasks are no longer generated for most individual rules. Instead, rules should be toggled via\nthe ",(0,n.jsx)(s.a,{href:"https://rbusarow.github.io/ModuleCheck/docs/next/configuration",children:"Gradle DSL"})," and can be\ninvoked\nthrough ",(0,n.jsx)(s.code,{children:"./gradlew modulecheck"})," or ",(0,n.jsx)(s.code,{children:"./gradlew moduleCheckAuto"}),"."]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-new-rules",children:"\ud83d\udcd0 New Rules"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Add the ",(0,n.jsx)(s.a,{href:"https://rbusarow.github.io/ModuleCheck/docs/rules/project_depth",children:"Depths"}),"\nrule ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/278",children:"#278"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["New\nrule: ",(0,n.jsx)(s.a,{href:"https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kotlin_android_extensions",children:"Unused Android Extensions"})," ",(0,n.jsx)(s.a,{href:"https://github.com/tasomaniac",children:"@tasomaniac"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/440",children:"#440"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-features-1",children:"\ud83d\ude80 Features"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Add support for depths, dotviz dependency graph, checkstyle, and plaintext result\nreporting ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/243",children:"#243"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-4",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Add a test case for false\npositive ",(0,n.jsx)(s.a,{href:"https://github.com/tasomaniac",children:"@tasomaniac"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/419",children:"#419"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Don't call a dependency overshot if it's already declared in that source\nset ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/521",children:"#521"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["don't try to parse ",(0,n.jsx)(s.code,{children:".png"}),"s as\nxml ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/522",children:"#522"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix parsing xml resource declarations when there's a dot in the\nname ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/512",children:"#512"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Fix false positive for ",(0,n.jsx)(s.code,{children:"unusedDependency"})," when a resource from the dependency is used with R from\nthe dependent in a downstream\nproject ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/510",children:"#510"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["better modeling for generated databinding declarations and\nreferences ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/509",children:"#509"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["count layout files and ",(0,n.jsx)(s.code,{children:"@+id/__"})," declarations as part of a module's\ndeclarations ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/499",children:"#499"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Support the alternative usage of kapt\nplugin ",(0,n.jsx)(s.a,{href:"https://github.com/tasomaniac",children:"@tasomaniac"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/481",children:"#481"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add new dependency declarations even if their transitive source can't be\nfound ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/469",children:"#469"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["don't generate BuildConfig if it's ignored in Android\nsettings ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/470",children:"#470"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["force single-threaded GroovyLangParser\naccess ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/463",children:"#463"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix false positive for ",(0,n.jsx)(s.code,{children:"disableViewBinding"})," when used in debug source set of different\nmodule ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/446",children:"#446"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["don't swallow a newline when replacing a dependency with a preceding blank\nline ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/444",children:"#444"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["better handling for detecting complex precompiled configuration\nnames ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/442",children:"#442"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["support multiple android base\npackages ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/411",children:"#411"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["support ",(0,n.jsx)(s.code,{children:".java"})," files without a package\ndeclaration ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/400",children:"#400"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["strip illegal characters from XML before\nparsing ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/376",children:"#376"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix auto-correct when using a non-standard config\nname ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/368",children:"#368"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix false positive for kapt processors in non-kapt\nconfigurations ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/350",children:"#350"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["don't allow projects to inherit\nthemselves ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/343",children:"#343"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["update configuration\ndocs ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/335",children:"#335"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["always create depth and graph reports when running their explicit\ntasks ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/332",children:"#332"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["collect depth info after applying\nchanges ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/331",children:"#331"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["fix testFixtures handling in\nOverShotDependencyFinding ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/297",children:"#297"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["treat testFixtures and the associated main sources like different\nprojects ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/288",children:"#288"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["correctly apply the ",(0,n.jsx)(s.code,{children:"testFixtures(...)"})," wrapper for replaced/added\ndependencies ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/287",children:"#287"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"\u2139\ufe0f-website-1",children:"\u2139\ufe0f Website"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Add documentation for new\nrule ",(0,n.jsx)(s.a,{href:"https://github.com/tasomaniac",children:"@tasomaniac"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/454",children:"#454"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add snapshots badge to README and website\nhome ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/410",children:"#410"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add ",(0,n.jsx)(s.code,{children:"moduleCheckAuto"}),' to main README and call out "next" docs\nversion ',(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/408",children:"#408"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:['correct the tasks listed in the "next" version of the\ndocs ',(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/404",children:"#404"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["update copyright template for\n2022 ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/362",children:"#362"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["update configuration\ndocs ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/335",children:"#335"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add the Depths\nfeature ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/278",children:"#278"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["replace ",(0,n.jsx)(s.code,{children:"autoCorrect"})," with ",(0,n.jsx)(s.code,{children:"-Auto"}),"\nsuffixes ",(0,n.jsx)(s.a,{href:"https://github.com/RBusarow",children:"@RBusarow"})," (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/249",children:"#249"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"contributors-2",children:"Contributors"}),"\n",(0,n.jsx)(s.p,{children:"@RBusarow, @diego-gomez-olvera and @tasomaniac"}),"\n",(0,n.jsx)(s.h2,{id:"0113",children:"0.11.3"}),"\n",(0,n.jsx)(s.h4,{id:"-features-2",children:"\ud83d\ude80 Features"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["support suppressing findings (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/235",children:"#235"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-5",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["support testFixtures (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/232",children:"#232"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"-maintenance-2",children:"\ud83e\uddf0 Maintenance"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Bump kotlinpoet from 1.10.1 to 1.10.2 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/233",children:"#233"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["Bump gradle-plugin from 2.3.6 to 2.3.7 (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/229",children:"#229"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h4,{id:"\u2139\ufe0f-website-2",children:"\u2139\ufe0f Website"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["use titles in docs code snippets (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/237",children:"#237"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["clarify CI workflow docs (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/221",children:"#221"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["add example CI workflow to docs (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/220",children:"#220"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"0112",children:"0.11.2"}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-6",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["support overshot dependencies (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/217",children:"#217"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["sorting fixes (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/215",children:"#215"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"0111",children:"0.11.1"}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-7",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["support constant or enum declarations in Java\nclasses (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/209",children:"#209"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["include generated data/viewbinding objects as\ndeclarations (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/208",children:"#208"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["support closures in dependency\ndeclarations (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/205",children:"#205"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["count resources as R references when used in\nAndroidManifest.xml (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/203",children:"#203"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"0110---groovy-auto-correct-support",children:"0.11.0 - Groovy auto-correct support"}),"\n",(0,n.jsx)(s.h4,{id:"-bug-fixes-8",children:"\ud83d\udc1b Bug Fixes"}),"\n",(0,n.jsxs)(s.ul,{children:["\n",(0,n.jsxs)(s.li,{children:["Support generated manifests (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/197",children:"#197"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:['fix redundant "from: " output (',(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/193",children:"#193"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["support Groovy parsing (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/190",children:"#190"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["capture a finding's log string before it's\nfixed (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/184",children:"#184"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["include class literal expressions when looking for type\nreferences (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/177",children:"#177"}),")"]}),"\n",(0,n.jsxs)(s.li,{children:["check for Android kotlin sources (",(0,n.jsx)(s.a,{href:"https://github.com/rbusarow/ModuleCheck/pull/173",children:"#173"}),")"]}),"\n"]}),"\n",(0,n.jsx)(s.h2,{id:"0100",children:"0.10.0"}),"\n",(0,n.jsx)(s.p,{children:"Initial release"})]})}function d(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>t,x:()=>l});var h=r(36672);const n={},i=h.createContext(n);function t(e){const s=h.useContext(i);return h.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:t(e.components),h.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7720.4384d24b.js b/assets/js/7720.4384d24b.js new file mode 100644 index 0000000000..6768bd5874 --- /dev/null +++ b/assets/js/7720.4384d24b.js @@ -0,0 +1 @@ +(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7720],{21707:function(t){t.exports=function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d/,i=/\d\d/,s=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,a={},o=function(t){return(t=+t)+(t>68?1900:2e3)},c=function(t){return function(e){this[t]=+e}},l=[/[+-]\d\d:?(\d\d)?|Z/,function(t){(this.zone||(this.zone={})).offset=function(t){if(!t)return 0;if("Z"===t)return 0;var e=t.match(/([+-]|\d\d)/g),n=60*e[1]+(+e[2]||0);return 0===n?0:"+"===e[0]?-n:n}(t)}],d=function(t){var e=a[t];return e&&(e.indexOf?e:e.s.concat(e.f))},u=function(t,e){var n,i=a.meridiem;if(i){for(var s=1;s<=24;s+=1)if(t.indexOf(i(s,0,e))>-1){n=s>12;break}}else n=t===(e?"pm":"PM");return n},h={A:[r,function(t){this.afternoon=u(t,!1)}],a:[r,function(t){this.afternoon=u(t,!0)}],Q:[n,function(t){this.month=3*(t-1)+1}],S:[n,function(t){this.milliseconds=100*+t}],SS:[i,function(t){this.milliseconds=10*+t}],SSS:[/\d{3}/,function(t){this.milliseconds=+t}],s:[s,c("seconds")],ss:[s,c("seconds")],m:[s,c("minutes")],mm:[s,c("minutes")],H:[s,c("hours")],h:[s,c("hours")],HH:[s,c("hours")],hh:[s,c("hours")],D:[s,c("day")],DD:[i,c("day")],Do:[r,function(t){var e=a.ordinal,n=t.match(/\d+/);if(this.day=n[0],e)for(var i=1;i<=31;i+=1)e(i).replace(/\[|\]/g,"")===t&&(this.day=i)}],w:[s,c("week")],ww:[i,c("week")],M:[s,c("month")],MM:[i,c("month")],MMM:[r,function(t){var e=d("months"),n=(d("monthsShort")||e.map(function(t){return t.slice(0,3)})).indexOf(t)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[r,function(t){var e=d("months").indexOf(t)+1;if(e<1)throw new Error;this.month=e%12||e}],Y:[/[+-]?\d+/,c("year")],YY:[i,function(t){this.year=o(t)}],YYYY:[/\d{4}/,c("year")],Z:l,ZZ:l};function f(n){var i,s;i=n,s=a&&a.formats;for(var r=(n=i.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,function(e,n,i){var r=i&&i.toUpperCase();return n||s[i]||t[i]||s[r].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,function(t,e,n){return e||n.slice(1)})})).match(e),o=r.length,c=0;c<o;c+=1){var l=r[c],d=h[l],u=d&&d[0],f=d&&d[1];r[c]=f?{regex:u,parser:f}:l.replace(/^\[|\]$/g,"")}return function(t){for(var e={},n=0,i=0;n<o;n+=1){var s=r[n];if("string"==typeof s)i+=s.length;else{var a=s.regex,c=s.parser,l=t.slice(i),d=a.exec(l)[0];c.call(e,d),t=t.replace(d,"")}}return function(t){var e=t.afternoon;if(void 0!==e){var n=t.hours;e?n<12&&(t.hours+=12):12===n&&(t.hours=0),delete t.afternoon}}(e),e}}return function(t,e,n){n.p.customParseFormat=!0,t&&t.parseTwoDigitYear&&(o=t.parseTwoDigitYear);var i=e.prototype,s=i.parse;i.parse=function(t){var e=t.date,i=t.utc,r=t.args;this.$u=i;var o=r[1];if("string"==typeof o){var c=!0===r[2],l=!0===r[3],d=c||l,u=r[2];l&&(u=r[2]),a=this.$locale(),!c&&u&&(a=n.Ls[u]),this.$d=function(t,e,n,i){try{if(["x","X"].indexOf(e)>-1)return new Date(("X"===e?1e3:1)*t);var s=f(e)(t),r=s.year,a=s.month,o=s.day,c=s.hours,l=s.minutes,d=s.seconds,u=s.milliseconds,h=s.zone,y=s.week,k=new Date,m=o||(r||a?1:k.getDate()),p=r||k.getFullYear(),g=0;r&&!a||(g=a>0?a-1:k.getMonth());var b,v=c||0,T=l||0,x=d||0,w=u||0;return h?new Date(Date.UTC(p,g,m,v,T,x,w+60*h.offset*1e3)):n?new Date(Date.UTC(p,g,m,v,T,x,w)):(b=new Date(p,g,m,v,T,x,w),y&&(b=i(b).week(y).toDate()),b)}catch(t){return new Date("")}}(e,o,i,n),this.init(),u&&!0!==u&&(this.$L=this.locale(u).$L),d&&e!=this.format(o)&&(this.$d=new Date("")),a={}}else if(o instanceof Array)for(var h=o.length,y=1;y<=h;y+=1){r[1]=o[y-1];var k=n.apply(this,r);if(k.isValid()){this.$d=k.$d,this.$L=k.$L,this.init();break}y===h&&(this.$d=new Date(""))}else s.call(this,t)}}}()},57720:(t,e,n)=>{"use strict";n.d(e,{diagram:()=>Yt});var i=n(9420),s=n(97485),r=n(41407),a=n(56287),o=n(84527),c=n(21707),l=n(78353),d=n(3170),u=function(){var t=(0,s.K2)(function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n},"o"),e=[6,8,10,12,13,14,15,16,17,18,20,21,22,23,24,25,26,27,28,29,30,31,33,35,36,38,40],n=[1,26],i=[1,27],r=[1,28],a=[1,29],o=[1,30],c=[1,31],l=[1,32],d=[1,33],u=[1,34],h=[1,9],f=[1,10],y=[1,11],k=[1,12],m=[1,13],p=[1,14],g=[1,15],b=[1,16],v=[1,19],T=[1,20],x=[1,21],w=[1,22],_=[1,23],D=[1,25],$=[1,35],C={trace:(0,s.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,gantt:4,document:5,EOF:6,line:7,SPACE:8,statement:9,NL:10,weekday:11,weekday_monday:12,weekday_tuesday:13,weekday_wednesday:14,weekday_thursday:15,weekday_friday:16,weekday_saturday:17,weekday_sunday:18,weekend:19,weekend_friday:20,weekend_saturday:21,dateFormat:22,inclusiveEndDates:23,topAxis:24,axisFormat:25,tickInterval:26,excludes:27,includes:28,todayMarker:29,title:30,acc_title:31,acc_title_value:32,acc_descr:33,acc_descr_value:34,acc_descr_multiline_value:35,section:36,clickStatement:37,taskTxt:38,taskData:39,click:40,callbackname:41,callbackargs:42,href:43,clickStatementDebug:44,$accept:0,$end:1},terminals_:{2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",12:"weekday_monday",13:"weekday_tuesday",14:"weekday_wednesday",15:"weekday_thursday",16:"weekday_friday",17:"weekday_saturday",18:"weekday_sunday",20:"weekend_friday",21:"weekend_saturday",22:"dateFormat",23:"inclusiveEndDates",24:"topAxis",25:"axisFormat",26:"tickInterval",27:"excludes",28:"includes",29:"todayMarker",30:"title",31:"acc_title",32:"acc_title_value",33:"acc_descr",34:"acc_descr_value",35:"acc_descr_multiline_value",36:"section",38:"taskTxt",39:"taskData",40:"click",41:"callbackname",42:"callbackargs",43:"href"},productions_:[0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[11,1],[19,1],[19,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,2],[9,1],[9,1],[9,1],[9,2],[37,2],[37,3],[37,3],[37,4],[37,3],[37,4],[37,2],[44,2],[44,3],[44,3],[44,4],[44,3],[44,4],[44,2]],performAction:(0,s.K2)(function(t,e,n,i,s,r,a){var o=r.length-1;switch(s){case 1:return r[o-1];case 2:case 6:case 7:this.$=[];break;case 3:r[o-1].push(r[o]),this.$=r[o-1];break;case 4:case 5:this.$=r[o];break;case 8:i.setWeekday("monday");break;case 9:i.setWeekday("tuesday");break;case 10:i.setWeekday("wednesday");break;case 11:i.setWeekday("thursday");break;case 12:i.setWeekday("friday");break;case 13:i.setWeekday("saturday");break;case 14:i.setWeekday("sunday");break;case 15:i.setWeekend("friday");break;case 16:i.setWeekend("saturday");break;case 17:i.setDateFormat(r[o].substr(11)),this.$=r[o].substr(11);break;case 18:i.enableInclusiveEndDates(),this.$=r[o].substr(18);break;case 19:i.TopAxis(),this.$=r[o].substr(8);break;case 20:i.setAxisFormat(r[o].substr(11)),this.$=r[o].substr(11);break;case 21:i.setTickInterval(r[o].substr(13)),this.$=r[o].substr(13);break;case 22:i.setExcludes(r[o].substr(9)),this.$=r[o].substr(9);break;case 23:i.setIncludes(r[o].substr(9)),this.$=r[o].substr(9);break;case 24:i.setTodayMarker(r[o].substr(12)),this.$=r[o].substr(12);break;case 27:i.setDiagramTitle(r[o].substr(6)),this.$=r[o].substr(6);break;case 28:this.$=r[o].trim(),i.setAccTitle(this.$);break;case 29:case 30:this.$=r[o].trim(),i.setAccDescription(this.$);break;case 31:i.addSection(r[o].substr(8)),this.$=r[o].substr(8);break;case 33:i.addTask(r[o-1],r[o]),this.$="task";break;case 34:this.$=r[o-1],i.setClickEvent(r[o-1],r[o],null);break;case 35:this.$=r[o-2],i.setClickEvent(r[o-2],r[o-1],r[o]);break;case 36:this.$=r[o-2],i.setClickEvent(r[o-2],r[o-1],null),i.setLink(r[o-2],r[o]);break;case 37:this.$=r[o-3],i.setClickEvent(r[o-3],r[o-2],r[o-1]),i.setLink(r[o-3],r[o]);break;case 38:this.$=r[o-2],i.setClickEvent(r[o-2],r[o],null),i.setLink(r[o-2],r[o-1]);break;case 39:this.$=r[o-3],i.setClickEvent(r[o-3],r[o-1],r[o]),i.setLink(r[o-3],r[o-2]);break;case 40:this.$=r[o-1],i.setLink(r[o-1],r[o]);break;case 41:case 47:this.$=r[o-1]+" "+r[o];break;case 42:case 43:case 45:this.$=r[o-2]+" "+r[o-1]+" "+r[o];break;case 44:case 46:this.$=r[o-3]+" "+r[o-2]+" "+r[o-1]+" "+r[o]}},"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:n,13:i,14:r,15:a,16:o,17:c,18:l,19:18,20:d,21:u,22:h,23:f,24:y,25:k,26:m,27:p,28:g,29:b,30:v,31:T,33:x,35:w,36:_,37:24,38:D,40:$},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:n,13:i,14:r,15:a,16:o,17:c,18:l,19:18,20:d,21:u,22:h,23:f,24:y,25:k,26:m,27:p,28:g,29:b,30:v,31:T,33:x,35:w,36:_,37:24,38:D,40:$},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:(0,s.K2)(function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)},"parseError"),parse:(0,s.K2)(function(t){var e=this,n=[0],i=[],r=[null],a=[],o=this.table,c="",l=0,d=0,u=0,h=a.slice.call(arguments,1),f=Object.create(this.lexer),y={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(y.yy[k]=this.yy[k]);f.setInput(t,y.yy),y.yy.lexer=f,y.yy.parser=this,void 0===f.yylloc&&(f.yylloc={});var m=f.yylloc;a.push(m);var p=f.options&&f.options.ranges;function g(){var t;return"number"!=typeof(t=i.pop()||f.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,s.K2)(function(t){n.length=n.length-2*t,r.length=r.length-t,a.length=a.length-t},"popStack"),(0,s.K2)(g,"lex");for(var b,v,T,x,w,_,D,$,C,S={};;){if(T=n[n.length-1],this.defaultActions[T]?x=this.defaultActions[T]:(null==b&&(b=g()),x=o[T]&&o[T][b]),void 0===x||!x.length||!x[0]){var K="";for(_ in C=[],o[T])this.terminals_[_]&&_>2&&C.push("'"+this.terminals_[_]+"'");K=f.showPosition?"Parse error on line "+(l+1)+":\n"+f.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(K,{text:f.match,token:this.terminals_[b]||b,line:f.yylineno,loc:m,expected:C})}if(x[0]instanceof Array&&x.length>1)throw new Error("Parse Error: multiple actions possible at state: "+T+", token: "+b);switch(x[0]){case 1:n.push(b),r.push(f.yytext),a.push(f.yylloc),n.push(x[1]),b=null,v?(b=v,v=null):(d=f.yyleng,c=f.yytext,l=f.yylineno,m=f.yylloc,u>0&&u--);break;case 2:if(D=this.productions_[x[1]][1],S.$=r[r.length-D],S._$={first_line:a[a.length-(D||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(D||1)].first_column,last_column:a[a.length-1].last_column},p&&(S._$.range=[a[a.length-(D||1)].range[0],a[a.length-1].range[1]]),void 0!==(w=this.performAction.apply(S,[c,d,l,y.yy,x[1],r,a].concat(h))))return w;D&&(n=n.slice(0,-1*D*2),r=r.slice(0,-1*D),a=a.slice(0,-1*D)),n.push(this.productions_[x[1]][0]),r.push(S.$),a.push(S._$),$=o[n[n.length-2]][n[n.length-1]],n.push($);break;case 3:return!0}}return!0},"parse")},S=function(){return{EOF:1,parseError:(0,s.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,s.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,s.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,s.K2)(function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),n.length-1&&(this.yylineno-=n.length-1);var s=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,s.K2)(function(){return this._more=!0,this},"more"),reject:(0,s.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,s.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,s.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,s.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,s.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,s.K2)(function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1},"test_match"),next:(0,s.K2)(function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;r<s.length;r++)if((n=this._input.match(this.rules[s[r]]))&&(!e||n[0].length>e[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,s.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,s.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,s.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,s.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,s.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,s.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,s.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,s.K2)(function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),"open_directive";case 1:return this.begin("acc_title"),31;case 2:return this.popState(),"acc_title_value";case 3:return this.begin("acc_descr"),33;case 4:return this.popState(),"acc_descr_value";case 5:this.begin("acc_descr_multiline");break;case 6:case 15:case 18:case 21:case 24:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:case 9:case 10:case 12:case 13:break;case 11:return 10;case 14:this.begin("href");break;case 16:return 43;case 17:this.begin("callbackname");break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 22:return 42;case 23:this.begin("click");break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}},"anonymous"),rules:[/^(?:%%\{)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:%%(?!\{)*[^\n]*)/i,/^(?:[^\}]%%*[^\n]*)/i,/^(?:%%*[^\n]*[\n]*)/i,/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:topAxis\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:tickInterval\s[^#\n;]+)/i,/^(?:includes\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:todayMarker\s[^\n;]+)/i,/^(?:weekday\s+monday\b)/i,/^(?:weekday\s+tuesday\b)/i,/^(?:weekday\s+wednesday\b)/i,/^(?:weekday\s+thursday\b)/i,/^(?:weekday\s+friday\b)/i,/^(?:weekday\s+saturday\b)/i,/^(?:weekday\s+sunday\b)/i,/^(?:weekend\s+friday\b)/i,/^(?:weekend\s+saturday\b)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^\n]+)/i,/^(?:accDescription\s[^#\n;]+)/i,/^(?:section\s[^\n]+)/i,/^(?:[^:\n]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[6,7],inclusive:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},INITIAL:{rules:[0,1,3,5,8,9,10,11,12,13,14,17,23,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52],inclusive:!0}}}}();function K(){this.yy={}}return C.lexer=S,(0,s.K2)(K,"Parser"),K.prototype=C,C.Parser=K,new K}();u.parser=u;var h=u;a.extend(o),a.extend(c),a.extend(l);var f,y,k={friday:5,saturday:6},m="",p="",g=void 0,b="",v=[],T=[],x=new Map,w=[],_=[],D="",$="",C=["active","done","crit","milestone","vert"],S=[],K=!1,E=!1,M="sunday",A="saturday",L=0,Y=(0,s.K2)(function(){w=[],_=[],D="",S=[],ht=0,f=void 0,y=void 0,mt=[],m="",p="",$="",g=void 0,b="",v=[],T=[],K=!1,E=!1,L=0,x=new Map,(0,s.IU)(),M="sunday",A="saturday"},"clear"),I=(0,s.K2)(function(t){p=t},"setAxisFormat"),F=(0,s.K2)(function(){return p},"getAxisFormat"),W=(0,s.K2)(function(t){g=t},"setTickInterval"),O=(0,s.K2)(function(){return g},"getTickInterval"),P=(0,s.K2)(function(t){b=t},"setTodayMarker"),B=(0,s.K2)(function(){return b},"getTodayMarker"),z=(0,s.K2)(function(t){m=t},"setDateFormat"),G=(0,s.K2)(function(){K=!0},"enableInclusiveEndDates"),N=(0,s.K2)(function(){return K},"endDatesAreInclusive"),H=(0,s.K2)(function(){E=!0},"enableTopAxis"),R=(0,s.K2)(function(){return E},"topAxisEnabled"),j=(0,s.K2)(function(t){$=t},"setDisplayMode"),U=(0,s.K2)(function(){return $},"getDisplayMode"),V=(0,s.K2)(function(){return m},"getDateFormat"),Z=(0,s.K2)(function(t){v=t.toLowerCase().split(/[\s,]+/)},"setIncludes"),X=(0,s.K2)(function(){return v},"getIncludes"),q=(0,s.K2)(function(t){T=t.toLowerCase().split(/[\s,]+/)},"setExcludes"),Q=(0,s.K2)(function(){return T},"getExcludes"),J=(0,s.K2)(function(){return x},"getLinks"),tt=(0,s.K2)(function(t){D=t,w.push(t)},"addSection"),et=(0,s.K2)(function(){return w},"getSections"),nt=(0,s.K2)(function(){let t=Tt();let e=0;for(;!t&&e<10;)t=Tt(),e++;return _=mt},"getTasks"),it=(0,s.K2)(function(t,e,n,i){return!i.includes(t.format(e.trim()))&&(!(!n.includes("weekends")||t.isoWeekday()!==k[A]&&t.isoWeekday()!==k[A]+1)||(!!n.includes(t.format("dddd").toLowerCase())||n.includes(t.format(e.trim()))))},"isInvalidDate"),st=(0,s.K2)(function(t){M=t},"setWeekday"),rt=(0,s.K2)(function(){return M},"getWeekday"),at=(0,s.K2)(function(t){A=t},"setWeekend"),ot=(0,s.K2)(function(t,e,n,i){if(!n.length||t.manualEndTime)return;let s,r;s=t.startTime instanceof Date?a(t.startTime):a(t.startTime,e,!0),s=s.add(1,"d"),r=t.endTime instanceof Date?a(t.endTime):a(t.endTime,e,!0);const[o,c]=ct(s,r,e,n,i);t.endTime=o.toDate(),t.renderEndTime=c},"checkTaskDates"),ct=(0,s.K2)(function(t,e,n,i,s){let r=!1,a=null;for(;t<=e;)r||(a=e.toDate()),r=it(t,n,i,s),r&&(e=e.add(1,"d")),t=t.add(1,"d");return[e,a]},"fixTaskDates"),lt=(0,s.K2)(function(t,e,n){n=n.trim();const i=/^after\s+(?<ids>[\d\w- ]+)/.exec(n);if(null!==i){let t=null;for(const n of i.groups.ids.split(" ")){let e=bt(n);void 0!==e&&(!t||e.endTime>t.endTime)&&(t=e)}if(t)return t.endTime;const e=new Date;return e.setHours(0,0,0,0),e}let r=a(n,e.trim(),!0);if(r.isValid())return r.toDate();{s.Rm.debug("Invalid date:"+n),s.Rm.debug("With date format:"+e.trim());const t=new Date(n);if(void 0===t||isNaN(t.getTime())||t.getFullYear()<-1e4||t.getFullYear()>1e4)throw new Error("Invalid date:"+n);return t}},"getStartDate"),dt=(0,s.K2)(function(t){const e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return null!==e?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]},"parseDuration"),ut=(0,s.K2)(function(t,e,n,i=!1){n=n.trim();const s=/^until\s+(?<ids>[\d\w- ]+)/.exec(n);if(null!==s){let t=null;for(const n of s.groups.ids.split(" ")){let e=bt(n);void 0!==e&&(!t||e.startTime<t.startTime)&&(t=e)}if(t)return t.startTime;const e=new Date;return e.setHours(0,0,0,0),e}let r=a(n,e.trim(),!0);if(r.isValid())return i&&(r=r.add(1,"d")),r.toDate();let o=a(t);const[c,l]=dt(n);if(!Number.isNaN(c)){const t=o.add(c,l);t.isValid()&&(o=t)}return o.toDate()},"getEndDate"),ht=0,ft=(0,s.K2)(function(t){return void 0===t?"task"+(ht+=1):t},"parseId"),yt=(0,s.K2)(function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),s={};Kt(i,s,C);for(let a=0;a<i.length;a++)i[a]=i[a].trim();let r="";switch(i.length){case 1:s.id=ft(),s.startTime=t.endTime,r=i[0];break;case 2:s.id=ft(),s.startTime=lt(void 0,m,i[0]),r=i[1];break;case 3:s.id=ft(i[0]),s.startTime=lt(void 0,m,i[1]),r=i[2]}return r&&(s.endTime=ut(s.startTime,m,r,K),s.manualEndTime=a(r,"YYYY-MM-DD",!0).isValid(),ot(s,m,T,v)),s},"compileData"),kt=(0,s.K2)(function(t,e){let n;n=":"===e.substr(0,1)?e.substr(1,e.length):e;const i=n.split(","),s={};Kt(i,s,C);for(let r=0;r<i.length;r++)i[r]=i[r].trim();switch(i.length){case 1:s.id=ft(),s.startTime={type:"prevTaskEnd",id:t},s.endTime={data:i[0]};break;case 2:s.id=ft(),s.startTime={type:"getStartDate",startData:i[0]},s.endTime={data:i[1]};break;case 3:s.id=ft(i[0]),s.startTime={type:"getStartDate",startData:i[1]},s.endTime={data:i[2]}}return s},"parseData"),mt=[],pt={},gt=(0,s.K2)(function(t,e){const n={section:D,type:D,processed:!1,manualEndTime:!1,renderEndTime:null,raw:{data:e},task:t,classes:[]},i=kt(y,e);n.raw.startTime=i.startTime,n.raw.endTime=i.endTime,n.id=i.id,n.prevTaskId=y,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,n.vert=i.vert,n.order=L,L++;const s=mt.push(n);y=n.id,pt[n.id]=s-1},"addTask"),bt=(0,s.K2)(function(t){const e=pt[t];return mt[e]},"findTaskById"),vt=(0,s.K2)(function(t,e){const n={section:D,type:D,description:t,task:t,classes:[]},i=yt(f,e);n.startTime=i.startTime,n.endTime=i.endTime,n.id=i.id,n.active=i.active,n.done=i.done,n.crit=i.crit,n.milestone=i.milestone,n.vert=i.vert,f=n,_.push(n)},"addTaskOrg"),Tt=(0,s.K2)(function(){const t=(0,s.K2)(function(t){const e=mt[t];let n="";switch(mt[t].raw.startTime.type){case"prevTaskEnd":{const t=bt(e.prevTaskId);e.startTime=t.endTime;break}case"getStartDate":n=lt(void 0,m,mt[t].raw.startTime.startData),n&&(mt[t].startTime=n)}return mt[t].startTime&&(mt[t].endTime=ut(mt[t].startTime,m,mt[t].raw.endTime.data,K),mt[t].endTime&&(mt[t].processed=!0,mt[t].manualEndTime=a(mt[t].raw.endTime.data,"YYYY-MM-DD",!0).isValid(),ot(mt[t],m,T,v))),mt[t].processed},"compileTask");let e=!0;for(const[n,i]of mt.entries())t(n),e=e&&i.processed;return e},"compileTasks"),xt=(0,s.K2)(function(t,e){let n=e;"loose"!==(0,s.D7)().securityLevel&&(n=(0,r.J)(e)),t.split(",").forEach(function(t){void 0!==bt(t)&&(Dt(t,()=>{window.open(n,"_self")}),x.set(t,n))}),wt(t,"clickable")},"setLink"),wt=(0,s.K2)(function(t,e){t.split(",").forEach(function(t){let n=bt(t);void 0!==n&&n.classes.push(e)})},"setClass"),_t=(0,s.K2)(function(t,e,n){if("loose"!==(0,s.D7)().securityLevel)return;if(void 0===e)return;let r=[];if("string"==typeof n){r=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<r.length;t++){let e=r[t].trim();e.startsWith('"')&&e.endsWith('"')&&(e=e.substr(1,e.length-2)),r[t]=e}}0===r.length&&r.push(t),void 0!==bt(t)&&Dt(t,()=>{i._K.runFunc(e,...r)})},"setClickFun"),Dt=(0,s.K2)(function(t,e){S.push(function(){const n=document.querySelector(`[id="${t}"]`);null!==n&&n.addEventListener("click",function(){e()})},function(){const n=document.querySelector(`[id="${t}-text"]`);null!==n&&n.addEventListener("click",function(){e()})})},"pushFun"),$t=(0,s.K2)(function(t,e,n){t.split(",").forEach(function(t){_t(t,e,n)}),wt(t,"clickable")},"setClickEvent"),Ct=(0,s.K2)(function(t){S.forEach(function(e){e(t)})},"bindFunctions"),St={getConfig:(0,s.K2)(()=>(0,s.D7)().gantt,"getConfig"),clear:Y,setDateFormat:z,getDateFormat:V,enableInclusiveEndDates:G,endDatesAreInclusive:N,enableTopAxis:H,topAxisEnabled:R,setAxisFormat:I,getAxisFormat:F,setTickInterval:W,getTickInterval:O,setTodayMarker:P,getTodayMarker:B,setAccTitle:s.SV,getAccTitle:s.iN,setDiagramTitle:s.ke,getDiagramTitle:s.ab,setDisplayMode:j,getDisplayMode:U,setAccDescription:s.EI,getAccDescription:s.m7,addSection:tt,getSections:et,getTasks:nt,addTask:gt,findTaskById:bt,addTaskOrg:vt,setIncludes:Z,getIncludes:X,setExcludes:q,getExcludes:Q,setClickEvent:$t,setLink:xt,getLinks:J,bindFunctions:Ct,parseDuration:dt,isInvalidDate:it,setWeekday:st,getWeekday:rt,setWeekend:at};function Kt(t,e,n){let i=!0;for(;i;)i=!1,n.forEach(function(n){const s=new RegExp("^\\s*"+n+"\\s*$");t[0].match(s)&&(e[n]=!0,t.shift(1),i=!0)})}(0,s.K2)(Kt,"getTaskTags");var Et,Mt=(0,s.K2)(function(){s.Rm.debug("Something is calling, setConf, remove the call")},"setConf"),At={monday:d.ABi,tuesday:d.PGu,wednesday:d.GuW,thursday:d.Mol,friday:d.TUC,saturday:d.rGn,sunday:d.YPH},Lt=(0,s.K2)((t,e)=>{let n=[...t].map(()=>-1/0),i=[...t].sort((t,e)=>t.startTime-e.startTime||t.order-e.order),s=0;for(const r of i)for(let t=0;t<n.length;t++)if(r.startTime>=n[t]){n[t]=r.endTime,r.order=t+e,t>s&&(s=t);break}return s},"getMaxIntersections"),Yt={parser:h,db:St,renderer:{setConf:Mt,draw:(0,s.K2)(function(t,e,n,i){const r=(0,s.D7)().gantt,o=(0,s.D7)().securityLevel;let c;"sandbox"===o&&(c=(0,d.Ltv)("#i"+e));const l="sandbox"===o?(0,d.Ltv)(c.nodes()[0].contentDocument.body):(0,d.Ltv)("body"),u="sandbox"===o?c.nodes()[0].contentDocument:document,h=u.getElementById(e);void 0===(Et=h.parentElement.offsetWidth)&&(Et=1200),void 0!==r.useWidth&&(Et=r.useWidth);const f=i.db.getTasks();let y=[];for(const s of f)y.push(s.type);y=$(y);const k={};let m=2*r.topPadding;if("compact"===i.db.getDisplayMode()||"compact"===r.displayMode){const t={};for(const n of f)void 0===t[n.section]?t[n.section]=[n]:t[n.section].push(n);let e=0;for(const n of Object.keys(t)){const i=Lt(t[n],e)+1;e+=i,m+=i*(r.barHeight+r.barGap),k[n]=i}}else{m+=f.length*(r.barHeight+r.barGap);for(const t of y)k[t]=f.filter(e=>e.type===t).length}h.setAttribute("viewBox","0 0 "+Et+" "+m);const p=l.select(`[id="${e}"]`),g=(0,d.w7C)().domain([(0,d.jkA)(f,function(t){return t.startTime}),(0,d.T9B)(f,function(t){return t.endTime})]).rangeRound([0,Et-r.leftPadding-r.rightPadding]);function b(t,e){const n=t.startTime,i=e.startTime;let s=0;return n>i?s=1:n<i&&(s=-1),s}function v(t,e,n){const s=r.barHeight,a=s+r.barGap,o=r.topPadding,c=r.leftPadding,l=(0,d.m4Y)().domain([0,y.length]).range(["#00B9FA","#F95002"]).interpolate(d.bEH);x(a,o,c,e,n,t,i.db.getExcludes(),i.db.getIncludes()),w(c,o,e,n),T(t,a,o,c,s,l,e),_(a,o),D(c,o,e,n)}function T(t,n,a,o,c,l,u){t.sort((t,e)=>t.vert===e.vert?0:t.vert?1:-1);const h=[...new Set(t.map(t=>t.order))].map(e=>t.find(t=>t.order===e));p.append("g").selectAll("rect").data(h).enter().append("rect").attr("x",0).attr("y",function(t,e){return t.order*n+a-2}).attr("width",function(){return u-r.rightPadding/2}).attr("height",n).attr("class",function(t){for(const[e,n]of y.entries())if(t.type===n)return"section section"+e%r.numberSectionStyles;return"section section0"}).enter();const k=p.append("g").selectAll("rect").data(t).enter(),m=i.db.getLinks();k.append("rect").attr("id",function(t){return t.id}).attr("rx",3).attr("ry",3).attr("x",function(t){return t.milestone?g(t.startTime)+o+.5*(g(t.endTime)-g(t.startTime))-.5*c:g(t.startTime)+o}).attr("y",function(t,e){return e=t.order,t.vert?r.gridLineStartPadding:e*n+a}).attr("width",function(t){return t.milestone?c:t.vert?.08*c:g(t.renderEndTime||t.endTime)-g(t.startTime)}).attr("height",function(t){return t.vert?f.length*(r.barHeight+r.barGap)+2*r.barHeight:c}).attr("transform-origin",function(t,e){return e=t.order,(g(t.startTime)+o+.5*(g(t.endTime)-g(t.startTime))).toString()+"px "+(e*n+a+.5*c).toString()+"px"}).attr("class",function(t){let e="";t.classes.length>0&&(e=t.classes.join(" "));let n=0;for(const[s,a]of y.entries())t.type===a&&(n=s%r.numberSectionStyles);let i="";return t.active?t.crit?i+=" activeCrit":i=" active":t.done?i=t.crit?" doneCrit":" done":t.crit&&(i+=" crit"),0===i.length&&(i=" task"),t.milestone&&(i=" milestone "+i),t.vert&&(i=" vert "+i),i+=n,i+=" "+e,"task"+i}),k.append("text").attr("id",function(t){return t.id+"-text"}).text(function(t){return t.task}).attr("font-size",r.fontSize).attr("x",function(t){let e=g(t.startTime),n=g(t.renderEndTime||t.endTime);if(t.milestone&&(e+=.5*(g(t.endTime)-g(t.startTime))-.5*c,n=e+c),t.vert)return g(t.startTime)+o;const i=this.getBBox().width;return i>n-e?n+i+1.5*r.leftPadding>u?e+o-5:n+o+5:(n-e)/2+e+o}).attr("y",function(t,e){return t.vert?r.gridLineStartPadding+f.length*(r.barHeight+r.barGap)+60:t.order*n+r.barHeight/2+(r.fontSize/2-2)+a}).attr("text-height",c).attr("class",function(t){const e=g(t.startTime);let n=g(t.endTime);t.milestone&&(n=e+c);const i=this.getBBox().width;let s="";t.classes.length>0&&(s=t.classes.join(" "));let a=0;for(const[c,l]of y.entries())t.type===l&&(a=c%r.numberSectionStyles);let o="";return t.active&&(o=t.crit?"activeCritText"+a:"activeText"+a),t.done?o=t.crit?o+" doneCritText"+a:o+" doneText"+a:t.crit&&(o=o+" critText"+a),t.milestone&&(o+=" milestoneText"),t.vert&&(o+=" vertText"),i>n-e?n+i+1.5*r.leftPadding>u?s+" taskTextOutsideLeft taskTextOutside"+a+" "+o:s+" taskTextOutsideRight taskTextOutside"+a+" "+o+" width-"+i:s+" taskText taskText"+a+" "+o+" width-"+i});if("sandbox"===(0,s.D7)().securityLevel){let t;t=(0,d.Ltv)("#i"+e);const n=t.nodes()[0].contentDocument;k.filter(function(t){return m.has(t.id)}).each(function(t){var e=n.querySelector("#"+t.id),i=n.querySelector("#"+t.id+"-text");const s=e.parentNode;var r=n.createElement("a");r.setAttribute("xlink:href",m.get(t.id)),r.setAttribute("target","_top"),s.appendChild(r),r.appendChild(e),r.appendChild(i)})}}function x(t,e,n,o,c,l,d,u){if(0===d.length&&0===u.length)return;let h,f;for(const{startTime:i,endTime:s}of l)(void 0===h||i<h)&&(h=i),(void 0===f||s>f)&&(f=s);if(!h||!f)return;if(a(f).diff(a(h),"year")>5)return void s.Rm.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");const y=i.db.getDateFormat(),k=[];let m=null,b=a(h);for(;b.valueOf()<=f;)i.db.isInvalidDate(b,y,d,u)?m?m.end=b:m={start:b,end:b}:m&&(k.push(m),m=null),b=b.add(1,"d");p.append("g").selectAll("rect").data(k).enter().append("rect").attr("id",function(t){return"exclude-"+t.start.format("YYYY-MM-DD")}).attr("x",function(t){return g(t.start)+n}).attr("y",r.gridLineStartPadding).attr("width",function(t){const e=t.end.add(1,"day");return g(e)-g(t.start)}).attr("height",c-e-r.gridLineStartPadding).attr("transform-origin",function(e,i){return(g(e.start)+n+.5*(g(e.end)-g(e.start))).toString()+"px "+(i*t+.5*c).toString()+"px"}).attr("class","exclude-range")}function w(t,e,n,s){let a=(0,d.l78)(g).tickSize(-s+e+r.gridLineStartPadding).tickFormat((0,d.DCK)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));const o=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(i.db.getTickInterval()||r.tickInterval);if(null!==o){const t=o[1],e=o[2],n=i.db.getWeekday()||r.weekday;switch(e){case"millisecond":a.ticks(d.t6C.every(t));break;case"second":a.ticks(d.ucG.every(t));break;case"minute":a.ticks(d.wXd.every(t));break;case"hour":a.ticks(d.Agd.every(t));break;case"day":a.ticks(d.UAC.every(t));break;case"week":a.ticks(At[n].every(t));break;case"month":a.ticks(d.Ui6.every(t))}}if(p.append("g").attr("class","grid").attr("transform","translate("+t+", "+(s-50)+")").call(a).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),i.db.topAxisEnabled()||r.topAxis){let n=(0,d.tlR)(g).tickSize(-s+e+r.gridLineStartPadding).tickFormat((0,d.DCK)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));if(null!==o){const t=o[1],e=o[2],s=i.db.getWeekday()||r.weekday;switch(e){case"millisecond":n.ticks(d.t6C.every(t));break;case"second":n.ticks(d.ucG.every(t));break;case"minute":n.ticks(d.wXd.every(t));break;case"hour":n.ticks(d.Agd.every(t));break;case"day":n.ticks(d.UAC.every(t));break;case"week":n.ticks(At[s].every(t));break;case"month":n.ticks(d.Ui6.every(t))}}p.append("g").attr("class","grid").attr("transform","translate("+t+", "+e+")").call(n).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}function _(t,e){let n=0;const i=Object.keys(k).map(t=>[t,k[t]]);p.append("g").selectAll("text").data(i).enter().append(function(t){const e=t[0].split(s.Y2.lineBreakRegex),n=-(e.length-1)/2,i=u.createElementNS("http://www.w3.org/2000/svg","text");i.setAttribute("dy",n+"em");for(const[s,r]of e.entries()){const t=u.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttribute("alignment-baseline","central"),t.setAttribute("x","10"),s>0&&t.setAttribute("dy","1em"),t.textContent=r,i.appendChild(t)}return i}).attr("x",10).attr("y",function(s,r){if(!(r>0))return s[1]*t/2+e;for(let a=0;a<r;a++)return n+=i[r-1][1],s[1]*t/2+n*t+e}).attr("font-size",r.sectionFontSize).attr("class",function(t){for(const[e,n]of y.entries())if(t[0]===n)return"sectionTitle sectionTitle"+e%r.numberSectionStyles;return"sectionTitle"})}function D(t,e,n,s){const a=i.db.getTodayMarker();if("off"===a)return;const o=p.append("g").attr("class","today"),c=new Date,l=o.append("line");l.attr("x1",g(c)+t).attr("x2",g(c)+t).attr("y1",r.titleTopMargin).attr("y2",s-r.titleTopMargin).attr("class","today"),""!==a&&l.attr("style",a.replace(/,/g,";"))}function $(t){const e={},n=[];for(let i=0,s=t.length;i<s;++i)Object.prototype.hasOwnProperty.call(e,t[i])||(e[t[i]]=!0,n.push(t[i]));return n}(0,s.K2)(b,"taskCompare"),f.sort(b),v(f,Et,m),(0,s.a$)(p,m,Et,r.useMaxWidth),p.append("text").text(i.db.getDiagramTitle()).attr("x",Et/2).attr("y",r.titleTopMargin).attr("class","titleText"),(0,s.K2)(v,"makeGantt"),(0,s.K2)(T,"drawRects"),(0,s.K2)(x,"drawExcludeDays"),(0,s.K2)(w,"makeGrid"),(0,s.K2)(_,"vertLabels"),(0,s.K2)(D,"drawToday"),(0,s.K2)($,"checkUnique")},"draw")},styles:(0,s.K2)(t=>`\n .mermaid-main-font {\n font-family: ${t.fontFamily};\n }\n\n .exclude-range {\n fill: ${t.excludeBkgColor};\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${t.sectionBkgColor};\n }\n\n .section2 {\n fill: ${t.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${t.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n font-family: ${t.fontFamily};\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${t.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n }\n\n .grid .tick text {\n font-family: ${t.fontFamily};\n fill: ${t.textColor};\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${t.todayLineColor};\n stroke-width: 2px;\n }\n\n\n /* Task styling */\n\n /* Default task */\n\n .task {\n stroke-width: 2;\n }\n\n .taskText {\n text-anchor: middle;\n font-family: ${t.fontFamily};\n }\n\n .taskTextOutsideRight {\n fill: ${t.taskTextDarkColor};\n text-anchor: start;\n font-family: ${t.fontFamily};\n }\n\n .taskTextOutsideLeft {\n fill: ${t.taskTextDarkColor};\n text-anchor: end;\n }\n\n\n /* Special case clickable */\n\n .task.clickable {\n cursor: pointer;\n }\n\n .taskText.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n\n /* Specific task settings for the sections*/\n\n .taskText0,\n .taskText1,\n .taskText2,\n .taskText3 {\n fill: ${t.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${t.taskBkgColor};\n stroke: ${t.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${t.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${t.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${t.activeTaskBkgColor};\n stroke: ${t.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${t.doneTaskBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n cursor: pointer;\n shape-rendering: crispEdges;\n }\n\n .milestone {\n transform: rotate(45deg) scale(0.8,0.8);\n }\n\n .milestoneText {\n font-style: italic;\n }\n .doneCritText0,\n .doneCritText1,\n .doneCritText2,\n .doneCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .vert {\n stroke: ${t.vertLineColor};\n }\n\n .vertText {\n font-size: 15px;\n text-anchor: middle;\n fill: ${t.vertLineColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.titleColor||t.textColor};\n font-family: ${t.fontFamily};\n }\n`,"getStyles")}},78353:function(t){t.exports=function(){"use strict";return function(t,e){var n=e.prototype,i=n.format;n.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return i.bind(this)(t);var s=this.$utils(),r=(t||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,function(t){switch(t){case"Q":return Math.ceil((e.$M+1)/3);case"Do":return n.ordinal(e.$D);case"gggg":return e.weekYear();case"GGGG":return e.isoWeekYear();case"wo":return n.ordinal(e.week(),"W");case"w":case"ww":return s.s(e.week(),"w"===t?1:2,"0");case"W":case"WW":return s.s(e.isoWeek(),"W"===t?1:2,"0");case"k":case"kk":return s.s(String(0===e.$H?24:e.$H),"k"===t?1:2,"0");case"X":return Math.floor(e.$d.getTime()/1e3);case"x":return e.$d.getTime();case"z":return"["+e.offsetName()+"]";case"zzz":return"["+e.offsetName("long")+"]";default:return t}});return i.bind(this)(r)}}}()},84527:function(t){t.exports=function(){"use strict";var t="day";return function(e,n,i){var s=function(e){return e.add(4-e.isoWeekday(),t)},r=n.prototype;r.isoWeekYear=function(){return s(this).year()},r.isoWeek=function(e){if(!this.$utils().u(e))return this.add(7*(e-this.isoWeek()),t);var n,r,a,o=s(this),c=(n=this.isoWeekYear(),a=4-(r=(this.$u?i.utc:i)().year(n).startOf("year")).isoWeekday(),r.isoWeekday()>4&&(a+=7),r.add(a,t));return o.diff(c,"week")+1},r.isoWeekday=function(t){return this.$utils().u(t)?this.day()||7:this.day(this.day()%7?t:t-7)};var a=r.startOf;r.startOf=function(t,e){var n=this.$utils(),i=!!n.u(e)||e;return"isoweek"===n.p(t)?i?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):a.bind(this)(t,e)}}}()}}]); \ No newline at end of file diff --git a/assets/js/7bab4396.e2e91f03.js b/assets/js/7bab4396.e2e91f03.js new file mode 100644 index 0000000000..7727b110d7 --- /dev/null +++ b/assets/js/7bab4396.e2e91f03.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2771],{7357:(e,t,n)=>{n.d(t,{A:()=>o});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var s=n(23420);function o({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},65404:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>u});var r=n(36672);const a={},s=r.createContext(a);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:t},e.children)}},81882:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.11.3/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.11.3/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/configuration.mdx","tags":[],"version":"0.11.3","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.11.3/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.11.3/suppressing-findings"}}');var a=n(23420),s=n(65404),o=n(83796),u=n(7357);const l={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function f(e){const t={code:"code",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(o.A,{children:[(0,a.jsx)(u.A,{value:"Kotlin",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'plugins {\n id("com.rickbusarow.module-check") version "0.11.3"\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalKaptMatchers = listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(u.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:"plugins {\n id 'com.rickbusarow.module-check' version '0.11.3'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they're used\n ignoreUnusedFinding = [':test:core-jvm', ':test:core-android']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [':app']\n\n additionalKaptMatchers = [\n new modulecheck.api.KaptMatcher(\n 'MyProcessor',\n 'my-project.codegen:processor',\n [\n \"myproject\\\\.\\\\*\",\n \"myproject\\\\.MyInject\",\n \"myproject\\\\.MyInject\\\\.Factory\",\n \"myproject\\\\.MyInjectParam\",\n \"myproject\\\\.MyInjectModule\"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = \"${project.buildDir}/reports/modulecheck/checkstyle.xml\"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = \"${project.buildDir}/reports/modulecheck/report.txt\"\n }\n }\n\n}\n"})})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(f,{...e})}):f(e)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),s=n(58797),o=n(85291),u=n(52245),l=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function f(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,n])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,s=f(e),[o,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),y=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,u.A)(()=>{y&&l(y)},[y]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var b=n(64407);const y={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var g=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:o}){const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,s.a_)(),i=e=>{const t=e.currentTarget,a=u.indexOf(t),s=o[a].value;s!==n&&(l(t),r(s))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:o.map(({value:e,label:t,attributes:r})=>(0,g.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{u.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",y.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,g.jsxs)("div",{className:(0,a.A)("tabs-container",y.tabList),children:[(0,g.jsx)(v,{...t,...e}),(0,g.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,g.jsx)(j,{...e,children:d(e.children)},String(t))}}}]); \ No newline at end of file diff --git a/assets/js/7c1e7b42.398858f5.js b/assets/js/7c1e7b42.398858f5.js new file mode 100644 index 0000000000..9882f34e31 --- /dev/null +++ b/assets/js/7c1e7b42.398858f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5682],{20962:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.12.0/rules/android/disable_resources.md","sourceDirName":"rules/android","slug":"/rules/android/disable_resources","permalink":"/ModuleCheck/docs/0.12.0/rules/android/disable_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/android/disable_resources.md","tags":[],"version":"0.12.0","frontMatter":{"id":"disable_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding"}}');var o=r(23420),d=r(65404);const i={id:"disable_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,c={},a=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7cbf6be7.0fd7bef4.js b/assets/js/7cbf6be7.0fd7bef4.js new file mode 100644 index 0000000000..e58a6d793c --- /dev/null +++ b/assets/js/7cbf6be7.0fd7bef4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9065],{29781:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>d,default:()=>l,frontMatter:()=>c,metadata:()=>o,toc:()=>a});const o=JSON.parse('{"id":"mdx","title":"Powered by MDX","description":"I can write Markdown alongside my JSX!","source":"@site/versioned_docs/version-0.10.0/mdx.md","sourceDirName":".","slug":"/mdx","permalink":"/ModuleCheck/docs/0.10.0/mdx","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/mdx.md","tags":[],"version":"0.10.0","frontMatter":{"id":"mdx","title":"Powered by MDX"}}');var r=n(23420),s=n(65404);const c={id:"mdx",title:"Powered by MDX"},d=void 0,i={},a=[];function u(e){const t={em:"em",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,r.jsxs)(t.p,{children:["I can write ",(0,r.jsx)(t.strong,{children:"Markdown"})," alongside my ",(0,r.jsx)(t.em,{children:"JSX"}),"!"]})}function l(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(u,{...e})}):u(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>d});var o=n(36672);const r={},s=o.createContext(r);function c(e){const t=o.useContext(s);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function d(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),o.createElement(s.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/7da24252.97351c6c.js b/assets/js/7da24252.97351c6c.js new file mode 100644 index 0000000000..6c303415c6 --- /dev/null +++ b/assets/js/7da24252.97351c6c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2016],{12577:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.12.2/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sort_dependencies","permalink":"/ModuleCheck/docs/0.12.2/rules/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/sorting/sort_dependencies.md","tags":[],"version":"0.12.2","frontMatter":{"id":"sort_dependencies","slug":"/rules/sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.2/rules/sort_plugins"}}');var r=s(23420),o=s(65404);const i={id:"sort_dependencies",slug:"/rules/sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l()}},65404:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>c});var n=s(36672);const r={},o=n.createContext(r);function i(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8055.07fc3a99.js b/assets/js/8055.07fc3a99.js new file mode 100644 index 0000000000..c7b0b5ca25 --- /dev/null +++ b/assets/js/8055.07fc3a99.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8055],{98055:(e,c,u)=>{u.d(c,{createArchitectureServices:()=>h.S});var h=u(77109);u(60349)}}]); \ No newline at end of file diff --git a/assets/js/8132.e097933d.js b/assets/js/8132.e097933d.js new file mode 100644 index 0000000000..8ee4c69b14 --- /dev/null +++ b/assets/js/8132.e097933d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8132],{98132:(e,c,a)=>{a.d(c,{createRadarServices:()=>k.f});var k=a(46018);a(60349)}}]); \ No newline at end of file diff --git a/assets/js/8479.4afca346.js b/assets/js/8479.4afca346.js new file mode 100644 index 0000000000..1e0b804b3b --- /dev/null +++ b/assets/js/8479.4afca346.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8479],{11047:(t,e,s)=>{s.d(e,{o:()=>i});var i=(0,s(97485).K2)(()=>"\n /* Font Awesome icon styling - consolidated */\n .label-icon {\n display: inline-block;\n height: 1em;\n overflow: visible;\n vertical-align: -0.125em;\n }\n \n .node .label-icon path {\n fill: currentColor;\n stroke: revert;\n stroke-width: revert;\n }\n","getIconStyles")},44533:(t,e,s)=>{s.d(e,{P:()=>n});var i=s(97485),n=(0,i.K2)((t,e,s,n)=>{t.attr("class",s);const{width:u,height:l,x:o,y:c}=a(t,e);(0,i.a$)(t,l,u,n);const h=r(o,c,u,l,e);t.attr("viewBox",h),i.Rm.debug(`viewBox configured: ${h} with padding: ${e}`)},"setupViewPortForSVG"),a=(0,i.K2)((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}},"calculateDimensionsWithPadding"),r=(0,i.K2)((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`,"createViewBox")},78479:(t,e,s)=>{s.d(e,{Lh:()=>E,NM:()=>C,_$:()=>h,tM:()=>g});var i=s(11047),n=s(91544),a=s(44533),r=s(80284),u=s(9420),l=s(97485),o=s(3170),c=function(){var t=(0,l.K2)(function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s},"o"),e=[1,18],s=[1,19],i=[1,20],n=[1,41],a=[1,42],r=[1,26],u=[1,24],o=[1,25],c=[1,32],h=[1,33],d=[1,34],p=[1,45],A=[1,35],y=[1,36],m=[1,37],C=[1,38],g=[1,27],b=[1,28],E=[1,29],k=[1,30],T=[1,31],f=[1,44],D=[1,46],F=[1,43],B=[1,47],_=[1,9],S=[1,8,9],N=[1,58],L=[1,59],$=[1,60],x=[1,61],v=[1,62],I=[1,63],O=[1,64],w=[1,8,9,41],R=[1,76],P=[1,8,9,12,13,22,39,41,44,66,67,68,69,70,71,72,77,79],K=[1,8,9,12,13,17,20,22,39,41,44,48,58,66,67,68,69,70,71,72,77,79,84,99,101,102],M=[13,58,84,99,101,102],G=[13,58,71,72,84,99,101,102],U=[13,58,66,67,68,69,70,84,99,101,102],Y=[1,98],z=[1,115],Q=[1,107],W=[1,113],X=[1,108],j=[1,109],V=[1,110],q=[1,111],H=[1,112],J=[1,114],Z=[22,58,59,80,84,85,86,87,88,89],tt=[1,8,9,39,41,44],et=[1,8,9,22],st=[1,143],it=[1,8,9,59],nt=[1,8,9,22,58,59,80,84,85,86,87,88,89],at={trace:(0,l.K2)(function(){},"trace"),yy:{},symbols_:{error:2,start:3,mermaidDoc:4,statements:5,graphConfig:6,CLASS_DIAGRAM:7,NEWLINE:8,EOF:9,statement:10,classLabel:11,SQS:12,STR:13,SQE:14,namespaceName:15,alphaNumToken:16,DOT:17,className:18,classLiteralName:19,GENERICTYPE:20,relationStatement:21,LABEL:22,namespaceStatement:23,classStatement:24,memberStatement:25,annotationStatement:26,clickStatement:27,styleStatement:28,cssClassStatement:29,noteStatement:30,classDefStatement:31,direction:32,acc_title:33,acc_title_value:34,acc_descr:35,acc_descr_value:36,acc_descr_multiline_value:37,namespaceIdentifier:38,STRUCT_START:39,classStatements:40,STRUCT_STOP:41,NAMESPACE:42,classIdentifier:43,STYLE_SEPARATOR:44,members:45,CLASS:46,ANNOTATION_START:47,ANNOTATION_END:48,MEMBER:49,SEPARATOR:50,relation:51,NOTE_FOR:52,noteText:53,NOTE:54,CLASSDEF:55,classList:56,stylesOpt:57,ALPHA:58,COMMA:59,direction_tb:60,direction_bt:61,direction_rl:62,direction_lr:63,relationType:64,lineType:65,AGGREGATION:66,EXTENSION:67,COMPOSITION:68,DEPENDENCY:69,LOLLIPOP:70,LINE:71,DOTTED_LINE:72,CALLBACK:73,LINK:74,LINK_TARGET:75,CLICK:76,CALLBACK_NAME:77,CALLBACK_ARGS:78,HREF:79,STYLE:80,CSSCLASS:81,style:82,styleComponent:83,NUM:84,COLON:85,UNIT:86,SPACE:87,BRKT:88,PCT:89,commentToken:90,textToken:91,graphCodeTokens:92,textNoTagsToken:93,TAGSTART:94,TAGEND:95,"==":96,"--":97,DEFAULT:98,MINUS:99,keywords:100,UNICODE_TEXT:101,BQUOTE_STR:102,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",17:"DOT",20:"GENERICTYPE",22:"LABEL",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",39:"STRUCT_START",41:"STRUCT_STOP",42:"NAMESPACE",44:"STYLE_SEPARATOR",46:"CLASS",47:"ANNOTATION_START",48:"ANNOTATION_END",49:"MEMBER",50:"SEPARATOR",52:"NOTE_FOR",54:"NOTE",55:"CLASSDEF",58:"ALPHA",59:"COMMA",60:"direction_tb",61:"direction_bt",62:"direction_rl",63:"direction_lr",66:"AGGREGATION",67:"EXTENSION",68:"COMPOSITION",69:"DEPENDENCY",70:"LOLLIPOP",71:"LINE",72:"DOTTED_LINE",73:"CALLBACK",74:"LINK",75:"LINK_TARGET",76:"CLICK",77:"CALLBACK_NAME",78:"CALLBACK_ARGS",79:"HREF",80:"STYLE",81:"CSSCLASS",84:"NUM",85:"COLON",86:"UNIT",87:"SPACE",88:"BRKT",89:"PCT",92:"graphCodeTokens",94:"TAGSTART",95:"TAGEND",96:"==",97:"--",98:"DEFAULT",99:"MINUS",100:"keywords",101:"UNICODE_TEXT",102:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,3],[15,2],[18,1],[18,3],[18,1],[18,2],[18,2],[18,2],[10,1],[10,2],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,1],[10,2],[10,2],[10,1],[23,4],[23,5],[38,2],[40,1],[40,2],[40,3],[24,1],[24,3],[24,4],[24,6],[43,2],[43,3],[26,4],[45,1],[45,2],[25,1],[25,2],[25,1],[25,1],[21,3],[21,4],[21,4],[21,5],[30,3],[30,2],[31,3],[56,1],[56,3],[32,1],[32,1],[32,1],[32,1],[51,3],[51,2],[51,2],[51,1],[64,1],[64,1],[64,1],[64,1],[64,1],[65,1],[65,1],[27,3],[27,4],[27,3],[27,4],[27,4],[27,5],[27,3],[27,4],[27,4],[27,5],[27,4],[27,5],[27,5],[27,6],[28,3],[29,3],[57,1],[57,3],[82,1],[82,2],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[90,1],[90,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[93,1],[93,1],[93,1],[93,1],[16,1],[16,1],[16,1],[16,1],[19,1],[53,1]],performAction:(0,l.K2)(function(t,e,s,i,n,a,r){var u=a.length-1;switch(n){case 8:this.$=a[u-1];break;case 9:case 12:case 14:this.$=a[u];break;case 10:case 13:this.$=a[u-2]+"."+a[u];break;case 11:case 15:case 95:this.$=a[u-1]+a[u];break;case 16:case 17:this.$=a[u-1]+"~"+a[u]+"~";break;case 18:i.addRelation(a[u]);break;case 19:a[u-1].title=i.cleanupLabel(a[u]),i.addRelation(a[u-1]);break;case 30:this.$=a[u].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[u].trim(),i.setAccDescription(this.$);break;case 33:i.addClassesToNamespace(a[u-3],a[u-1]);break;case 34:i.addClassesToNamespace(a[u-4],a[u-1]);break;case 35:this.$=a[u],i.addNamespace(a[u]);break;case 36:case 46:case 59:case 92:this.$=[a[u]];break;case 37:this.$=[a[u-1]];break;case 38:a[u].unshift(a[u-2]),this.$=a[u];break;case 40:i.setCssClass(a[u-2],a[u]);break;case 41:i.addMembers(a[u-3],a[u-1]);break;case 42:i.setCssClass(a[u-5],a[u-3]),i.addMembers(a[u-5],a[u-1]);break;case 43:this.$=a[u],i.addClass(a[u]);break;case 44:this.$=a[u-1],i.addClass(a[u-1]),i.setClassLabel(a[u-1],a[u]);break;case 45:i.addAnnotation(a[u],a[u-2]);break;case 47:a[u].push(a[u-1]),this.$=a[u];break;case 48:case 50:case 51:break;case 49:i.addMember(a[u-1],i.cleanupLabel(a[u]));break;case 52:this.$={id1:a[u-2],id2:a[u],relation:a[u-1],relationTitle1:"none",relationTitle2:"none"};break;case 53:this.$={id1:a[u-3],id2:a[u],relation:a[u-1],relationTitle1:a[u-2],relationTitle2:"none"};break;case 54:this.$={id1:a[u-3],id2:a[u],relation:a[u-2],relationTitle1:"none",relationTitle2:a[u-1]};break;case 55:this.$={id1:a[u-4],id2:a[u],relation:a[u-2],relationTitle1:a[u-3],relationTitle2:a[u-1]};break;case 56:i.addNote(a[u],a[u-1]);break;case 57:i.addNote(a[u]);break;case 58:this.$=a[u-2],i.defineClass(a[u-1],a[u]);break;case 60:this.$=a[u-2].concat([a[u]]);break;case 61:i.setDirection("TB");break;case 62:i.setDirection("BT");break;case 63:i.setDirection("RL");break;case 64:i.setDirection("LR");break;case 65:this.$={type1:a[u-2],type2:a[u],lineType:a[u-1]};break;case 66:this.$={type1:"none",type2:a[u],lineType:a[u-1]};break;case 67:this.$={type1:a[u-1],type2:"none",lineType:a[u]};break;case 68:this.$={type1:"none",type2:"none",lineType:a[u]};break;case 69:this.$=i.relationType.AGGREGATION;break;case 70:this.$=i.relationType.EXTENSION;break;case 71:this.$=i.relationType.COMPOSITION;break;case 72:this.$=i.relationType.DEPENDENCY;break;case 73:this.$=i.relationType.LOLLIPOP;break;case 74:this.$=i.lineType.LINE;break;case 75:this.$=i.lineType.DOTTED_LINE;break;case 76:case 82:this.$=a[u-2],i.setClickEvent(a[u-1],a[u]);break;case 77:case 83:this.$=a[u-3],i.setClickEvent(a[u-2],a[u-1]),i.setTooltip(a[u-2],a[u]);break;case 78:this.$=a[u-2],i.setLink(a[u-1],a[u]);break;case 79:this.$=a[u-3],i.setLink(a[u-2],a[u-1],a[u]);break;case 80:this.$=a[u-3],i.setLink(a[u-2],a[u-1]),i.setTooltip(a[u-2],a[u]);break;case 81:this.$=a[u-4],i.setLink(a[u-3],a[u-2],a[u]),i.setTooltip(a[u-3],a[u-1]);break;case 84:this.$=a[u-3],i.setClickEvent(a[u-2],a[u-1],a[u]);break;case 85:this.$=a[u-4],i.setClickEvent(a[u-3],a[u-2],a[u-1]),i.setTooltip(a[u-3],a[u]);break;case 86:this.$=a[u-3],i.setLink(a[u-2],a[u]);break;case 87:this.$=a[u-4],i.setLink(a[u-3],a[u-1],a[u]);break;case 88:this.$=a[u-4],i.setLink(a[u-3],a[u-1]),i.setTooltip(a[u-3],a[u]);break;case 89:this.$=a[u-5],i.setLink(a[u-4],a[u-2],a[u]),i.setTooltip(a[u-4],a[u-1]);break;case 90:this.$=a[u-2],i.setCssStyle(a[u-1],a[u]);break;case 91:i.setCssClass(a[u-1],a[u]);break;case 93:a[u-2].push(a[u]),this.$=a[u-2]}},"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:s,37:i,38:22,42:n,43:23,46:a,47:r,49:u,50:o,52:c,54:h,55:d,58:p,60:A,61:y,62:m,63:C,73:g,74:b,76:E,80:k,81:T,84:f,99:D,101:F,102:B},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(_,[2,5],{8:[1,48]}),{8:[1,49]},t(S,[2,18],{22:[1,50]}),t(S,[2,20]),t(S,[2,21]),t(S,[2,22]),t(S,[2,23]),t(S,[2,24]),t(S,[2,25]),t(S,[2,26]),t(S,[2,27]),t(S,[2,28]),t(S,[2,29]),{34:[1,51]},{36:[1,52]},t(S,[2,32]),t(S,[2,48],{51:53,64:56,65:57,13:[1,54],22:[1,55],66:N,67:L,68:$,69:x,70:v,71:I,72:O}),{39:[1,65]},t(w,[2,39],{39:[1,67],44:[1,66]}),t(S,[2,50]),t(S,[2,51]),{16:68,58:p,84:f,99:D,101:F},{16:39,18:69,19:40,58:p,84:f,99:D,101:F,102:B},{16:39,18:70,19:40,58:p,84:f,99:D,101:F,102:B},{16:39,18:71,19:40,58:p,84:f,99:D,101:F,102:B},{58:[1,72]},{13:[1,73]},{16:39,18:74,19:40,58:p,84:f,99:D,101:F,102:B},{13:R,53:75},{56:77,58:[1,78]},t(S,[2,61]),t(S,[2,62]),t(S,[2,63]),t(S,[2,64]),t(P,[2,12],{16:39,19:40,18:80,17:[1,79],20:[1,81],58:p,84:f,99:D,101:F,102:B}),t(P,[2,14],{20:[1,82]}),{15:83,16:84,58:p,84:f,99:D,101:F},{16:39,18:85,19:40,58:p,84:f,99:D,101:F,102:B},t(K,[2,118]),t(K,[2,119]),t(K,[2,120]),t(K,[2,121]),t([1,8,9,12,13,20,22,39,41,44,66,67,68,69,70,71,72,77,79],[2,122]),t(_,[2,6],{10:5,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,18:21,38:22,43:23,16:39,19:40,5:86,33:e,35:s,37:i,42:n,46:a,47:r,49:u,50:o,52:c,54:h,55:d,58:p,60:A,61:y,62:m,63:C,73:g,74:b,76:E,80:k,81:T,84:f,99:D,101:F,102:B}),{5:87,10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:s,37:i,38:22,42:n,43:23,46:a,47:r,49:u,50:o,52:c,54:h,55:d,58:p,60:A,61:y,62:m,63:C,73:g,74:b,76:E,80:k,81:T,84:f,99:D,101:F,102:B},t(S,[2,19]),t(S,[2,30]),t(S,[2,31]),{13:[1,89],16:39,18:88,19:40,58:p,84:f,99:D,101:F,102:B},{51:90,64:56,65:57,66:N,67:L,68:$,69:x,70:v,71:I,72:O},t(S,[2,49]),{65:91,71:I,72:O},t(M,[2,68],{64:92,66:N,67:L,68:$,69:x,70:v}),t(G,[2,69]),t(G,[2,70]),t(G,[2,71]),t(G,[2,72]),t(G,[2,73]),t(U,[2,74]),t(U,[2,75]),{8:[1,94],24:95,40:93,43:23,46:a},{16:96,58:p,84:f,99:D,101:F},{45:97,49:Y},{48:[1,99]},{13:[1,100]},{13:[1,101]},{77:[1,102],79:[1,103]},{22:z,57:104,58:Q,80:W,82:105,83:106,84:X,85:j,86:V,87:q,88:H,89:J},{58:[1,116]},{13:R,53:117},t(S,[2,57]),t(S,[2,123]),{22:z,57:118,58:Q,59:[1,119],80:W,82:105,83:106,84:X,85:j,86:V,87:q,88:H,89:J},t(Z,[2,59]),{16:39,18:120,19:40,58:p,84:f,99:D,101:F,102:B},t(P,[2,15]),t(P,[2,16]),t(P,[2,17]),{39:[2,35]},{15:122,16:84,17:[1,121],39:[2,9],58:p,84:f,99:D,101:F},t(tt,[2,43],{11:123,12:[1,124]}),t(_,[2,7]),{9:[1,125]},t(et,[2,52]),{16:39,18:126,19:40,58:p,84:f,99:D,101:F,102:B},{13:[1,128],16:39,18:127,19:40,58:p,84:f,99:D,101:F,102:B},t(M,[2,67],{64:129,66:N,67:L,68:$,69:x,70:v}),t(M,[2,66]),{41:[1,130]},{24:95,40:131,43:23,46:a},{8:[1,132],41:[2,36]},t(w,[2,40],{39:[1,133]}),{41:[1,134]},{41:[2,46],45:135,49:Y},{16:39,18:136,19:40,58:p,84:f,99:D,101:F,102:B},t(S,[2,76],{13:[1,137]}),t(S,[2,78],{13:[1,139],75:[1,138]}),t(S,[2,82],{13:[1,140],78:[1,141]}),{13:[1,142]},t(S,[2,90],{59:st}),t(it,[2,92],{83:144,22:z,58:Q,80:W,84:X,85:j,86:V,87:q,88:H,89:J}),t(nt,[2,94]),t(nt,[2,96]),t(nt,[2,97]),t(nt,[2,98]),t(nt,[2,99]),t(nt,[2,100]),t(nt,[2,101]),t(nt,[2,102]),t(nt,[2,103]),t(nt,[2,104]),t(S,[2,91]),t(S,[2,56]),t(S,[2,58],{59:st}),{58:[1,145]},t(P,[2,13]),{15:146,16:84,58:p,84:f,99:D,101:F},{39:[2,11]},t(tt,[2,44]),{13:[1,147]},{1:[2,4]},t(et,[2,54]),t(et,[2,53]),{16:39,18:148,19:40,58:p,84:f,99:D,101:F,102:B},t(M,[2,65]),t(S,[2,33]),{41:[1,149]},{24:95,40:150,41:[2,37],43:23,46:a},{45:151,49:Y},t(w,[2,41]),{41:[2,47]},t(S,[2,45]),t(S,[2,77]),t(S,[2,79]),t(S,[2,80],{75:[1,152]}),t(S,[2,83]),t(S,[2,84],{13:[1,153]}),t(S,[2,86],{13:[1,155],75:[1,154]}),{22:z,58:Q,80:W,82:156,83:106,84:X,85:j,86:V,87:q,88:H,89:J},t(nt,[2,95]),t(Z,[2,60]),{39:[2,10]},{14:[1,157]},t(et,[2,55]),t(S,[2,34]),{41:[2,38]},{41:[1,158]},t(S,[2,81]),t(S,[2,85]),t(S,[2,87]),t(S,[2,88],{75:[1,159]}),t(it,[2,93],{83:144,22:z,58:Q,80:W,84:X,85:j,86:V,87:q,88:H,89:J}),t(tt,[2,8]),t(w,[2,42]),t(S,[2,89])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,35],122:[2,11],125:[2,4],135:[2,47],146:[2,10],150:[2,38]},parseError:(0,l.K2)(function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)},"parseError"),parse:(0,l.K2)(function(t){var e=this,s=[0],i=[],n=[null],a=[],r=this.table,u="",o=0,c=0,h=0,d=a.slice.call(arguments,1),p=Object.create(this.lexer),A={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(A.yy[y]=this.yy[y]);p.setInput(t,A.yy),A.yy.lexer=p,A.yy.parser=this,void 0===p.yylloc&&(p.yylloc={});var m=p.yylloc;a.push(m);var C=p.options&&p.options.ranges;function g(){var t;return"number"!=typeof(t=i.pop()||p.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"==typeof A.yy.parseError?this.parseError=A.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,l.K2)(function(t){s.length=s.length-2*t,n.length=n.length-t,a.length=a.length-t},"popStack"),(0,l.K2)(g,"lex");for(var b,E,k,T,f,D,F,B,_,S={};;){if(k=s[s.length-1],this.defaultActions[k]?T=this.defaultActions[k]:(null==b&&(b=g()),T=r[k]&&r[k][b]),void 0===T||!T.length||!T[0]){var N="";for(D in _=[],r[k])this.terminals_[D]&&D>2&&_.push("'"+this.terminals_[D]+"'");N=p.showPosition?"Parse error on line "+(o+1)+":\n"+p.showPosition()+"\nExpecting "+_.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(o+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[b]||b,line:p.yylineno,loc:m,expected:_})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+k+", token: "+b);switch(T[0]){case 1:s.push(b),n.push(p.yytext),a.push(p.yylloc),s.push(T[1]),b=null,E?(b=E,E=null):(c=p.yyleng,u=p.yytext,o=p.yylineno,m=p.yylloc,h>0&&h--);break;case 2:if(F=this.productions_[T[1]][1],S.$=n[n.length-F],S._$={first_line:a[a.length-(F||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(F||1)].first_column,last_column:a[a.length-1].last_column},C&&(S._$.range=[a[a.length-(F||1)].range[0],a[a.length-1].range[1]]),void 0!==(f=this.performAction.apply(S,[u,c,o,A.yy,T[1],n,a].concat(d))))return f;F&&(s=s.slice(0,-1*F*2),n=n.slice(0,-1*F),a=a.slice(0,-1*F)),s.push(this.productions_[T[1]][0]),n.push(S.$),a.push(S._$),B=r[s[s.length-2]][s[s.length-1]],s.push(B);break;case 3:return!0}}return!0},"parse")},rt=function(){return{EOF:1,parseError:(0,l.K2)(function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)},"parseError"),setInput:(0,l.K2)(function(t,e){return this.yy=e||this.yy||{},this._input=t,this._more=this._backtrack=this.done=!1,this.yylineno=this.yyleng=0,this.yytext=this.matched=this.match="",this.conditionStack=["INITIAL"],this.yylloc={first_line:1,first_column:0,last_line:1,last_column:0},this.options.ranges&&(this.yylloc.range=[0,0]),this.offset=0,this},"setInput"),input:(0,l.K2)(function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t},"input"),unput:(0,l.K2)(function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=this.match.split(/(?:\r\n?|\n)/g);this.match=this.match.substr(0,this.match.length-1),this.matched=this.matched.substr(0,this.matched.length-1),s.length-1&&(this.yylineno-=s.length-1);var n=this.yylloc.range;return this.yylloc={first_line:this.yylloc.first_line,last_line:this.yylineno+1,first_column:this.yylloc.first_column,last_column:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this},"unput"),more:(0,l.K2)(function(){return this._more=!0,this},"more"),reject:(0,l.K2)(function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):this.parseError("Lexical error on line "+(this.yylineno+1)+". You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"reject"),less:(0,l.K2)(function(t){this.unput(this.match.slice(t))},"less"),pastInput:(0,l.K2)(function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")},"pastInput"),upcomingInput:(0,l.K2)(function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")},"upcomingInput"),showPosition:(0,l.K2)(function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"},"showPosition"),test_match:(0,l.K2)(function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={yylineno:this.yylineno,yylloc:{first_line:this.yylloc.first_line,last_line:this.last_line,first_column:this.yylloc.first_column,last_column:this.yylloc.last_column},yytext:this.yytext,match:this.match,matches:this.matches,matched:this.matched,yyleng:this.yyleng,offset:this.offset,_more:this._more,_input:this._input,yy:this.yy,conditionStack:this.conditionStack.slice(0),done:this.done},this.options.ranges&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,this.yyleng=this.yytext.length,this.options.ranges&&(this.yylloc.range=[this.offset,this.offset+=this.yyleng]),this._more=!1,this._backtrack=!1,this._input=this._input.slice(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var a in n)this[a]=n[a];return!1}return!1},"test_match"),next:(0,l.K2)(function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),a=0;a<n.length;a++)if((s=this._input.match(this.rules[n[a]]))&&(!e||s[0].length>e[0].length)){if(e=s,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})},"next"),lex:(0,l.K2)(function(){var t=this.next();return t||this.lex()},"lex"),begin:(0,l.K2)(function(t){this.conditionStack.push(t)},"begin"),popState:(0,l.K2)(function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]},"popState"),_currentRules:(0,l.K2)(function(){return this.conditionStack.length&&this.conditionStack[this.conditionStack.length-1]?this.conditions[this.conditionStack[this.conditionStack.length-1]].rules:this.conditions.INITIAL.rules},"_currentRules"),topState:(0,l.K2)(function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"},"topState"),pushState:(0,l.K2)(function(t){this.begin(t)},"pushState"),stateStackSize:(0,l.K2)(function(){return this.conditionStack.length},"stateStackSize"),options:{},performAction:(0,l.K2)(function(t,e,s,i){switch(s){case 0:return 60;case 1:return 61;case 2:return 62;case 3:return 63;case 4:case 5:case 14:case 31:case 36:case 40:case 47:break;case 6:return this.begin("acc_title"),33;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),35;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 19:case 22:case 24:case 58:case 61:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:case 35:return 8;case 15:case 16:return 7;case 17:case 37:case 45:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 77;case 23:return 78;case 25:return"STR";case 26:this.begin("string");break;case 27:return 80;case 28:return 55;case 29:return this.begin("namespace"),42;case 30:case 39:return this.popState(),8;case 32:return this.begin("namespace-body"),39;case 33:case 43:return this.popState(),41;case 34:case 44:return"EOF_IN_STRUCT";case 38:return this.begin("class"),46;case 41:return this.popState(),this.popState(),41;case 42:return this.begin("class-body"),39;case 46:return"OPEN_IN_STRUCT";case 48:return"MEMBER";case 49:return 81;case 50:return 73;case 51:return 74;case 52:return 76;case 53:return 52;case 54:return 54;case 55:return 47;case 56:return 48;case 57:return 79;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:case 65:case 66:case 67:return 75;case 68:case 69:return 67;case 70:case 71:return 69;case 72:return 68;case 73:return 66;case 74:return 70;case 75:return 71;case 76:return 72;case 77:return 22;case 78:return 44;case 79:return 99;case 80:return 17;case 81:return"PLUS";case 82:return 85;case 83:return 59;case 84:case 85:return 88;case 86:return 89;case 87:case 88:return"EQUALS";case 89:return 58;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 84;case 94:return 101;case 95:case 96:return 87;case 97:return 9}},"anonymous"),rules:[/^(?:.*direction\s+TB[^\n]*)/,/^(?:.*direction\s+BT[^\n]*)/,/^(?:.*direction\s+RL[^\n]*)/,/^(?:.*direction\s+LR[^\n]*)/,/^(?:%%(?!\{)*[^\n]*(\r?\n?)+)/,/^(?:%%[^\n]*(\r?\n)*)/,/^(?:accTitle\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*:\s*)/,/^(?:(?!\n||)*[^\n]*)/,/^(?:accDescr\s*\{\s*)/,/^(?:[\}])/,/^(?:[^\}]*)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:classDiagram-v2\b)/,/^(?:classDiagram\b)/,/^(?:\[\*\])/,/^(?:call[\s]+)/,/^(?:\([\s]*\))/,/^(?:\()/,/^(?:[^(]*)/,/^(?:\))/,/^(?:[^)]*)/,/^(?:["])/,/^(?:[^"]*)/,/^(?:["])/,/^(?:style\b)/,/^(?:classDef\b)/,/^(?:namespace\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:\[\*\])/,/^(?:class\b)/,/^(?:\s*(\r?\n)+)/,/^(?:\s+)/,/^(?:[}])/,/^(?:[{])/,/^(?:[}])/,/^(?:$)/,/^(?:\[\*\])/,/^(?:[{])/,/^(?:[\n])/,/^(?:[^{}\n]*)/,/^(?:cssClass\b)/,/^(?:callback\b)/,/^(?:link\b)/,/^(?:click\b)/,/^(?:note for\b)/,/^(?:note\b)/,/^(?:<<)/,/^(?:>>)/,/^(?:href\b)/,/^(?:[~])/,/^(?:[^~]*)/,/^(?:~)/,/^(?:[`])/,/^(?:[^`]+)/,/^(?:[`])/,/^(?:_self\b)/,/^(?:_blank\b)/,/^(?:_parent\b)/,/^(?:_top\b)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:\s*\(\))/,/^(?:--)/,/^(?:\.\.)/,/^(?::{1}[^:\n;]+)/,/^(?::{3})/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?::)/,/^(?:,)/,/^(?:#)/,/^(?:#)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:\w+)/,/^(?:\[)/,/^(?:\])/,/^(?:[!"#$%&'*+,-.`?\\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:\s)/,/^(?:$)/],conditions:{"namespace-body":{rules:[26,33,34,35,36,37,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},namespace:{rules:[26,29,30,31,32,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},"class-body":{rules:[26,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},class:{rules:[26,39,40,41,42,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr_multiline:{rules:[11,12,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_descr:{rules:[9,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},acc_title:{rules:[7,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_args:{rules:[22,23,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},callback_name:{rules:[19,20,21,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},href:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},struct:{rules:[26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},generic:{rules:[26,49,50,51,52,53,54,55,56,57,58,59,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},bqstring:{rules:[26,49,50,51,52,53,54,55,56,57,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},string:{rules:[24,25,26,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,86,87,88,89,90,91,92,93,94,95,97],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,8,10,13,14,15,16,17,18,26,27,28,29,38,49,50,51,52,53,54,55,56,57,60,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97],inclusive:!0}}}}();function ut(){this.yy={}}return at.lexer=rt,(0,l.K2)(ut,"Parser"),ut.prototype=at,at.Parser=ut,new ut}();c.parser=c;var h=c,d=["#","+","~","-",""],p=class{static{(0,l.K2)(this,"ClassMember")}constructor(t,e){this.memberType=e,this.visibility="",this.classifier="",this.text="";const s=(0,l.jZ)(t,(0,l.D7)());this.parseMember(s)}getDisplayDetails(){let t=this.visibility+(0,l.QO)(this.id);"method"===this.memberType&&(t+=`(${(0,l.QO)(this.parameters.trim())})`,this.returnType&&(t+=" : "+(0,l.QO)(this.returnType))),t=t.trim();return{displayText:t,cssStyle:this.parseClassifier()}}parseMember(t){let e="";if("method"===this.memberType){const s=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(t);if(s){const t=s[1]?s[1].trim():"";if(d.includes(t)&&(this.visibility=t),this.id=s[2],this.parameters=s[3]?s[3].trim():"",e=s[4]?s[4].trim():"",this.returnType=s[5]?s[5].trim():"",""===e){const t=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(t)&&(e=t,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{const s=t.length,i=t.substring(0,1),n=t.substring(s-1);d.includes(i)&&(this.visibility=i),/[$*]/.exec(n)&&(e=n),this.id=t.substring(""===this.visibility?0:1,""===e?s:s-1)}this.classifier=e,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();const s=`${this.visibility?"\\"+this.visibility:""}${(0,l.QO)(this.id)}${"method"===this.memberType?`(${(0,l.QO)(this.parameters)})${this.returnType?" : "+(0,l.QO)(this.returnType):""}`:""}`;this.text=s.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}},A="classId-",y=0,m=(0,l.K2)(t=>l.Y2.sanitizeText(t,(0,l.D7)()),"sanitizeText"),C=class{constructor(){this.relations=[],this.classes=new Map,this.styleClasses=new Map,this.notes=[],this.interfaces=[],this.namespaces=new Map,this.namespaceCounter=0,this.functions=[],this.lineType={LINE:0,DOTTED_LINE:1},this.relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3,LOLLIPOP:4},this.setupToolTips=(0,l.K2)(t=>{let e=(0,o.Ltv)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,o.Ltv)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,o.Ltv)(t).select("svg").selectAll("g.node").on("mouseover",t=>{const s=(0,o.Ltv)(t.currentTarget);if(null===s.attr("title"))return;const i=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(s.attr("title")).style("left",window.scrollX+i.left+(i.right-i.left)/2+"px").style("top",window.scrollY+i.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"<br/>")),s.classed("hover",!0)}).on("mouseout",t=>{e.transition().duration(500).style("opacity",0);(0,o.Ltv)(t.currentTarget).classed("hover",!1)})},"setupToolTips"),this.direction="TB",this.setAccTitle=l.SV,this.getAccTitle=l.iN,this.setAccDescription=l.EI,this.getAccDescription=l.m7,this.setDiagramTitle=l.ke,this.getDiagramTitle=l.ab,this.getConfig=(0,l.K2)(()=>(0,l.D7)().class,"getConfig"),this.functions.push(this.setupToolTips.bind(this)),this.clear(),this.addRelation=this.addRelation.bind(this),this.addClassesToNamespace=this.addClassesToNamespace.bind(this),this.addNamespace=this.addNamespace.bind(this),this.setCssClass=this.setCssClass.bind(this),this.addMembers=this.addMembers.bind(this),this.addClass=this.addClass.bind(this),this.setClassLabel=this.setClassLabel.bind(this),this.addAnnotation=this.addAnnotation.bind(this),this.addMember=this.addMember.bind(this),this.cleanupLabel=this.cleanupLabel.bind(this),this.addNote=this.addNote.bind(this),this.defineClass=this.defineClass.bind(this),this.setDirection=this.setDirection.bind(this),this.setLink=this.setLink.bind(this),this.bindFunctions=this.bindFunctions.bind(this),this.clear=this.clear.bind(this),this.setTooltip=this.setTooltip.bind(this),this.setClickEvent=this.setClickEvent.bind(this),this.setCssStyle=this.setCssStyle.bind(this)}static{(0,l.K2)(this,"ClassDB")}splitClassNameAndType(t){const e=l.Y2.sanitizeText(t,(0,l.D7)());let s="",i=e;if(e.indexOf("~")>0){const t=e.split("~");i=m(t[0]),s=m(t[1])}return{className:i,type:s}}setClassLabel(t,e){const s=l.Y2.sanitizeText(t,(0,l.D7)());e&&(e=m(e));const{className:i}=this.splitClassNameAndType(s);this.classes.get(i).label=e,this.classes.get(i).text=`${e}${this.classes.get(i).type?`<${this.classes.get(i).type}>`:""}`}addClass(t){const e=l.Y2.sanitizeText(t,(0,l.D7)()),{className:s,type:i}=this.splitClassNameAndType(e);if(this.classes.has(s))return;const n=l.Y2.sanitizeText(s,(0,l.D7)());this.classes.set(n,{id:n,type:i,label:n,text:`${n}${i?`<${i}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:A+n+"-"+y}),y++}addInterface(t,e){const s={id:`interface${this.interfaces.length}`,label:t,classId:e};this.interfaces.push(s)}lookUpDomId(t){const e=l.Y2.sanitizeText(t,(0,l.D7)());if(this.classes.has(e))return this.classes.get(e).domId;throw new Error("Class not found: "+e)}clear(){this.relations=[],this.classes=new Map,this.notes=[],this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",(0,l.IU)()}getClass(t){return this.classes.get(t)}getClasses(){return this.classes}getRelations(){return this.relations}getNotes(){return this.notes}addRelation(t){l.Rm.debug("Adding relation: "+JSON.stringify(t));const e=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];t.relation.type1!==this.relationType.LOLLIPOP||e.includes(t.relation.type2)?t.relation.type2!==this.relationType.LOLLIPOP||e.includes(t.relation.type1)?(this.addClass(t.id1),this.addClass(t.id2)):(this.addClass(t.id1),this.addInterface(t.id2,t.id1),t.id2="interface"+(this.interfaces.length-1)):(this.addClass(t.id2),this.addInterface(t.id1,t.id2),t.id1="interface"+(this.interfaces.length-1)),t.id1=this.splitClassNameAndType(t.id1).className,t.id2=this.splitClassNameAndType(t.id2).className,t.relationTitle1=l.Y2.sanitizeText(t.relationTitle1.trim(),(0,l.D7)()),t.relationTitle2=l.Y2.sanitizeText(t.relationTitle2.trim(),(0,l.D7)()),this.relations.push(t)}addAnnotation(t,e){const s=this.splitClassNameAndType(t).className;this.classes.get(s).annotations.push(e)}addMember(t,e){this.addClass(t);const s=this.splitClassNameAndType(t).className,i=this.classes.get(s);if("string"==typeof e){const t=e.trim();t.startsWith("<<")&&t.endsWith(">>")?i.annotations.push(m(t.substring(2,t.length-2))):t.indexOf(")")>0?i.methods.push(new p(t,"method")):t&&i.members.push(new p(t,"attribute"))}}addMembers(t,e){Array.isArray(e)&&(e.reverse(),e.forEach(e=>this.addMember(t,e)))}addNote(t,e){const s={id:`note${this.notes.length}`,class:e,text:t};this.notes.push(s)}cleanupLabel(t){return t.startsWith(":")&&(t=t.substring(1)),m(t.trim())}setCssClass(t,e){t.split(",").forEach(t=>{let s=t;/\d/.exec(t[0])&&(s=A+s);const i=this.classes.get(s);i&&(i.cssClasses+=" "+e)})}defineClass(t,e){for(const s of t){let t=this.styleClasses.get(s);void 0===t&&(t={id:s,styles:[],textStyles:[]},this.styleClasses.set(s,t)),e&&e.forEach(e=>{if(/color/.exec(e)){const s=e.replace("fill","bgFill");t.textStyles.push(s)}t.styles.push(e)}),this.classes.forEach(t=>{t.cssClasses.includes(s)&&t.styles.push(...e.flatMap(t=>t.split(",")))})}}setTooltip(t,e){t.split(",").forEach(t=>{void 0!==e&&(this.classes.get(t).tooltip=m(e))})}getTooltip(t,e){return e&&this.namespaces.has(e)?this.namespaces.get(e).classes.get(t).tooltip:this.classes.get(t).tooltip}setLink(t,e,s){const i=(0,l.D7)();t.split(",").forEach(t=>{let n=t;/\d/.exec(t[0])&&(n=A+n);const a=this.classes.get(n);a&&(a.link=u._K.formatUrl(e,i),"sandbox"===i.securityLevel?a.linkTarget="_top":a.linkTarget="string"==typeof s?m(s):"_blank")}),this.setCssClass(t,"clickable")}setClickEvent(t,e,s){t.split(",").forEach(t=>{this.setClickFunc(t,e,s),this.classes.get(t).haveCallback=!0}),this.setCssClass(t,"clickable")}setClickFunc(t,e,s){const i=l.Y2.sanitizeText(t,(0,l.D7)());if("loose"!==(0,l.D7)().securityLevel)return;if(void 0===e)return;const n=i;if(this.classes.has(n)){const t=this.lookUpDomId(n);let i=[];if("string"==typeof s){i=s.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t<i.length;t++){let e=i[t].trim();e.startsWith('"')&&e.endsWith('"')&&(e=e.substr(1,e.length-2)),i[t]=e}}0===i.length&&i.push(t),this.functions.push(()=>{const s=document.querySelector(`[id="${t}"]`);null!==s&&s.addEventListener("click",()=>{u._K.runFunc(e,...i)},!1)})}}bindFunctions(t){this.functions.forEach(e=>{e(t)})}getDirection(){return this.direction}setDirection(t){this.direction=t}addNamespace(t){this.namespaces.has(t)||(this.namespaces.set(t,{id:t,classes:new Map,children:{},domId:A+t+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(t){return this.namespaces.get(t)}getNamespaces(){return this.namespaces}addClassesToNamespace(t,e){if(this.namespaces.has(t))for(const s of e){const{className:e}=this.splitClassNameAndType(s);this.classes.get(e).parent=t,this.namespaces.get(t).classes.set(e,this.classes.get(e))}}setCssStyle(t,e){const s=this.classes.get(t);if(e&&s)for(const i of e)i.includes(",")?s.styles.push(...i.split(",")):s.styles.push(i)}getArrowMarker(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}getData(){const t=[],e=[],s=(0,l.D7)();for(const n of this.namespaces.keys()){const e=this.namespaces.get(n);if(e){const i={id:e.id,label:e.id,isGroup:!0,padding:s.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:s.look};t.push(i)}}for(const n of this.classes.keys()){const e=this.classes.get(n);if(e){const i=e;i.parentId=e.parent,i.look=s.look,t.push(i)}}let i=0;for(const n of this.notes){i++;const a={id:n.id,label:n.text,isGroup:!1,shape:"note",padding:s.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${s.themeVariables.noteBkgColor}`,`stroke: ${s.themeVariables.noteBorderColor}`],look:s.look};t.push(a);const r=this.classes.get(n.class)?.id??"";if(r){const t={id:`edgeNote${i}`,start:n.id,end:r,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:s.look};e.push(t)}}for(const n of this.interfaces){const e={id:n.id,label:n.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:s.look};t.push(e)}i=0;for(const n of this.relations){i++;const t={id:(0,u.rY)(n.id1,n.id2,{prefix:"id",counter:i}),start:n.id1,end:n.id2,type:"normal",label:n.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(n.relation.type1),arrowTypeEnd:this.getArrowMarker(n.relation.type2),startLabelRight:"none"===n.relationTitle1?"":n.relationTitle1,endLabelLeft:"none"===n.relationTitle2?"":n.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:n.style||"",pattern:1==n.relation.lineType?"dashed":"solid",look:s.look};e.push(t)}return{nodes:t,edges:e,other:{},config:s,direction:this.getDirection()}}},g=(0,l.K2)(t=>`g.classGroup text {\n fill: ${t.nodeBorder||t.classText};\n stroke: none;\n font-family: ${t.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.nodeLabel, .edgeLabel {\n color: ${t.classText};\n}\n.edgeLabel .label rect {\n fill: ${t.mainBkg};\n}\n.label text {\n fill: ${t.classText};\n}\n\n.labelBkg {\n background: ${t.mainBkg};\n}\n.edgeLabel .label span {\n background: ${t.mainBkg};\n}\n\n.classTitle {\n font-weight: bolder;\n}\n.node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${t.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${t.lineColor};\n stroke-width: 1;\n fill: none;\n}\n\n.dashed-line{\n stroke-dasharray: 3;\n}\n\n.dotted-line{\n stroke-dasharray: 1 2;\n}\n\n#compositionStart, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopStart, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopEnd, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n.edgeTerminals {\n font-size: 11px;\n line-height: initial;\n}\n\n.classTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n ${(0,i.o)()}\n`,"getStyles"),b=(0,l.K2)((t,e="TB")=>{if(!t.doc)return e;let s=e;for(const i of t.doc)"dir"===i.stmt&&(s=i.value);return s},"getDir"),E={getClasses:(0,l.K2)(function(t,e){return e.db.getClasses()},"getClasses"),draw:(0,l.K2)(async function(t,e,s,i){l.Rm.info("REF0:"),l.Rm.info("Drawing class diagram (v3)",e);const{securityLevel:o,state:c,layout:h}=(0,l.D7)(),d=i.db.getData(),p=(0,n.A)(e,o);d.type=i.type,d.layoutAlgorithm=(0,r.q7)(h),d.nodeSpacing=c?.nodeSpacing||50,d.rankSpacing=c?.rankSpacing||50,d.markers=["aggregation","extension","composition","dependency","lollipop"],d.diagramId=e,await(0,r.XX)(d,p);u._K.insertTitle(p,"classDiagramTitleText",c?.titleTopMargin??25,i.db.getDiagramTitle()),(0,a.P)(p,8,"classDiagram",c?.useMaxWidth??!0)},"draw"),getDir:b}},91544:(t,e,s)=>{s.d(e,{A:()=>a});var i=s(97485),n=s(3170),a=(0,i.K2)((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)},"getDiagramElement")}}]); \ No newline at end of file diff --git a/assets/js/84fb41f0.22512b68.js b/assets/js/84fb41f0.22512b68.js new file mode 100644 index 0000000000..d046e760a3 --- /dev/null +++ b/assets/js/84fb41f0.22512b68.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6040],{37080:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>a});const d=JSON.parse('{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.12.2/rules/android/disable_view_binding.md","sourceDirName":"rules/android","slug":"/rules/disable_view_binding","permalink":"/ModuleCheck/docs/0.12.2/rules/disable_view_binding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/android/disable_view_binding.md","tags":[],"version":"0.12.2","frontMatter":{"id":"disable_view_binding","slug":"/rules/disable_view_binding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.2/rules/disable_android_resources"},"next":{"title":"Unused Kotlin Android Extensions","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensions"}}');var s=i(23420),t=i(65404);const o={id:"disable_view_binding",slug:"/rules/disable_view_binding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,l={},a=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var d=i(36672);const s={},t=d.createContext(s);function o(e){const n=d.useContext(t);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),d.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8693.ac6c8a3a.js b/assets/js/8693.ac6c8a3a.js new file mode 100644 index 0000000000..47949a192c --- /dev/null +++ b/assets/js/8693.ac6c8a3a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8693],{64350:(e,n,t)=>{t.d(n,{A:()=>i});var r=t(98020);const i=function(e){return(0,r.A)(e,4)}},98693:(e,n,t)=>{t.r(n),t.d(n,{render:()=>k});var r=t(61923),i=(t(290),t(49636)),a=t(267),o=(t(29951),t(63727),t(9420),t(97485)),d=t(74326),s=t(60707),c=t(64350),g=t(72185);t(19641);function l(e){var n={options:{directed:e.isDirected(),multigraph:e.isMultigraph(),compound:e.isCompound()},nodes:f(e),edges:h(e)};return s.A(e.graph())||(n.value=c.A(e.graph())),n}function f(e){return g.A(e.nodes(),function(n){var t=e.node(n),r=e.parent(n),i={v:n};return s.A(t)||(i.value=t),s.A(r)||(i.parent=r),i})}function h(e){return g.A(e.edges(),function(n){var t=e.edge(n),r={v:n.v,w:n.w};return s.A(n.name)||(r.name=n.name),s.A(t)||(r.value=t),r})}var u=t(57420),p=new Map,m=new Map,w=new Map,R=(0,o.K2)(()=>{m.clear(),w.clear(),p.clear()},"clear"),v=(0,o.K2)((e,n)=>{const t=m.get(n)||[];return o.Rm.trace("In isDescendant",n," ",e," = ",t.includes(e)),t.includes(e)},"isDescendant"),y=(0,o.K2)((e,n)=>{const t=m.get(n)||[];return o.Rm.info("Descendants of ",n," is ",t),o.Rm.info("Edge is ",e),e.v!==n&&e.w!==n&&(t?t.includes(e.v)||v(e.v,n)||v(e.w,n)||t.includes(e.w):(o.Rm.debug("Tilt, ",n,",not in descendants"),!1))},"edgeInCluster"),X=(0,o.K2)((e,n,t,r)=>{o.Rm.warn("Copying children of ",e,"root",r,"data",n.node(e),r);const i=n.children(e)||[];e!==r&&i.push(e),o.Rm.warn("Copying (nodes) clusterId",e,"nodes",i),i.forEach(i=>{if(n.children(i).length>0)X(i,n,t,r);else{const a=n.node(i);o.Rm.info("cp ",i," to ",r," with parent ",e),t.setNode(i,a),r!==n.parent(i)&&(o.Rm.warn("Setting parent",i,n.parent(i)),t.setParent(i,n.parent(i))),e!==r&&i!==e?(o.Rm.debug("Setting parent",i,e),t.setParent(i,e)):(o.Rm.info("In copy ",e,"root",r,"data",n.node(e),r),o.Rm.debug("Not Setting parent for node=",i,"cluster!==rootId",e!==r,"node!==clusterId",i!==e));const d=n.edges(i);o.Rm.debug("Copying Edges",d),d.forEach(i=>{o.Rm.info("Edge",i);const a=n.edge(i.v,i.w,i.name);o.Rm.info("Edge data",a,r);try{y(i,r)?(o.Rm.info("Copying as ",i.v,i.w,a,i.name),t.setEdge(i.v,i.w,a,i.name),o.Rm.info("newGraph edges ",t.edges(),t.edge(t.edges()[0]))):o.Rm.info("Skipping copy of edge ",i.v,"--\x3e",i.w," rootId: ",r," clusterId:",e)}catch(d){o.Rm.error(d)}})}o.Rm.debug("Removing node",i),n.removeNode(i)})},"copy"),b=(0,o.K2)((e,n)=>{const t=n.children(e);let r=[...t];for(const i of t)w.set(i,e),r=[...r,...b(i,n)];return r},"extractDescendants"),E=(0,o.K2)((e,n,t)=>{const r=e.edges().filter(e=>e.v===n||e.w===n),i=e.edges().filter(e=>e.v===t||e.w===t),a=r.map(e=>({v:e.v===n?t:e.v,w:e.w===n?n:e.w})),o=i.map(e=>({v:e.v,w:e.w}));return a.filter(e=>o.some(n=>e.v===n.v&&e.w===n.w))},"findCommonEdges"),N=(0,o.K2)((e,n,t)=>{const r=n.children(e);if(o.Rm.trace("Searching children of id ",e,r),r.length<1)return e;let i;for(const a of r){const e=N(a,n,t),r=E(n,t,e);if(e){if(!(r.length>0))return e;i=e}}return i},"findNonClusterChild"),C=(0,o.K2)(e=>p.has(e)&&p.get(e).externalConnections&&p.has(e)?p.get(e).id:e,"getAnchorId"),S=(0,o.K2)((e,n)=>{if(!e||n>10)o.Rm.debug("Opting out, no graph ");else{o.Rm.debug("Opting in, graph "),e.nodes().forEach(function(n){e.children(n).length>0&&(o.Rm.warn("Cluster identified",n," Replacement id in edges: ",N(n,e,n)),m.set(n,b(n,e)),p.set(n,{id:N(n,e,n),clusterData:e.node(n)}))}),e.nodes().forEach(function(n){const t=e.children(n),r=e.edges();t.length>0?(o.Rm.debug("Cluster identified",n,m),r.forEach(e=>{v(e.v,n)^v(e.w,n)&&(o.Rm.warn("Edge: ",e," leaves cluster ",n),o.Rm.warn("Descendants of XXX ",n,": ",m.get(n)),p.get(n).externalConnections=!0)})):o.Rm.debug("Not a cluster ",n,m)});for(let n of p.keys()){const t=p.get(n).id,r=e.parent(t);r!==n&&p.has(r)&&!p.get(r).externalConnections&&(p.get(n).id=r)}e.edges().forEach(function(n){const t=e.edge(n);o.Rm.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(n)),o.Rm.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(e.edge(n)));let r=n.v,i=n.w;if(o.Rm.warn("Fix XXX",p,"ids:",n.v,n.w,"Translating: ",p.get(n.v)," --- ",p.get(n.w)),p.get(n.v)||p.get(n.w)){if(o.Rm.warn("Fixing and trying - removing XXX",n.v,n.w,n.name),r=C(n.v),i=C(n.w),e.removeEdge(n.v,n.w,n.name),r!==n.v){const i=e.parent(r);p.get(i).externalConnections=!0,t.fromCluster=n.v}if(i!==n.w){const r=e.parent(i);p.get(r).externalConnections=!0,t.toCluster=n.w}o.Rm.warn("Fix Replacing with XXX",r,i,n.name),e.setEdge(r,i,t,n.name)}}),o.Rm.warn("Adjusted Graph",l(e)),x(e,0),o.Rm.trace(p)}},"adjustClustersAndEdges"),x=(0,o.K2)((e,n)=>{if(o.Rm.warn("extractor - ",n,l(e),e.children("D")),n>10)return void o.Rm.error("Bailing out");let t=e.nodes(),r=!1;for(const i of t){const n=e.children(i);r=r||n.length>0}if(r){o.Rm.debug("Nodes = ",t,n);for(const r of t)if(o.Rm.debug("Extracting node",r,p,p.has(r)&&!p.get(r).externalConnections,!e.parent(r),e.node(r),e.children("D")," Depth ",n),p.has(r))if(!p.get(r).externalConnections&&e.children(r)&&e.children(r).length>0){o.Rm.warn("Cluster without external connections, without a parent and with children",r,n);let t="TB"===e.graph().rankdir?"LR":"TB";p.get(r)?.clusterData?.dir&&(t=p.get(r).clusterData.dir,o.Rm.warn("Fixing dir",p.get(r).clusterData.dir,t));const i=new u.T({multigraph:!0,compound:!0}).setGraph({rankdir:t,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}});o.Rm.warn("Old graph before copy",l(e)),X(r,e,i,r),e.setNode(r,{clusterNode:!0,id:r,clusterData:p.get(r).clusterData,label:p.get(r).label,graph:i}),o.Rm.warn("New graph after copy node: (",r,")",l(i)),o.Rm.debug("Old graph after copy",l(e))}else o.Rm.warn("Cluster ** ",r," **not meeting the criteria !externalConnections:",!p.get(r).externalConnections," no parent: ",!e.parent(r)," children ",e.children(r)&&e.children(r).length>0,e.children("D"),n),o.Rm.debug(p);else o.Rm.debug("Not a cluster",r,n);t=e.nodes(),o.Rm.warn("New list of nodes",t);for(const r of t){const t=e.node(r);o.Rm.warn(" Now next level",r,t),t?.clusterNode&&x(t.graph,n+1)}}else o.Rm.debug("Done, no node has children",e.nodes())},"extractor"),I=(0,o.K2)((e,n)=>{if(0===n.length)return[];let t=Object.assign([],n);return n.forEach(n=>{const r=e.children(n),i=I(e,r);t=[...t,...i]}),t},"sorter"),D=(0,o.K2)(e=>I(e,e.children()),"sortNodesByHierarchy"),A=(0,o.K2)(async(e,n,t,s,c,g)=>{o.Rm.warn("Graph in recursive render:XAX",l(n),c);const f=n.graph().rankdir;o.Rm.trace("Dir in recursive render - dir:",f);const h=e.insert("g").attr("class","root");n.nodes()?o.Rm.info("Recursive render XXX",n.nodes()):o.Rm.info("No nodes found for",n),n.edges().length>0&&o.Rm.info("Recursive edges",n.edge(n.edges()[0]));const u=h.insert("g").attr("class","clusters"),m=h.insert("g").attr("class","edgePaths"),w=h.insert("g").attr("class","edgeLabels"),R=h.insert("g").attr("class","nodes");await Promise.all(n.nodes().map(async function(e){const r=n.node(e);if(void 0!==c){const t=JSON.parse(JSON.stringify(c.clusterData));o.Rm.trace("Setting data for parent cluster XXX\n Node.id = ",e,"\n data=",t.height,"\nParent cluster",c.height),n.setNode(c.id,t),n.parent(e)||(o.Rm.trace("Setting parent",e,c.id),n.setParent(e,c.id,t))}if(o.Rm.info("(Insert) Node XXX"+e+": "+JSON.stringify(n.node(e))),r?.clusterNode){o.Rm.info("Cluster identified XBX",e,r.width,n.node(e));const{ranksep:a,nodesep:d}=n.graph();r.graph.setGraph({...r.graph.graph(),ranksep:a+25,nodesep:d});const c=await A(R,r.graph,t,s,n.node(e),g),l=c.elem;(0,i.lC)(r,l),r.diff=c.diff||0,o.Rm.info("New compound node after recursive render XAX",e,"width",r.width,"height",r.height),(0,i.U7)(l,r)}else n.children(e).length>0?(o.Rm.trace("Cluster - the non recursive path XBX",e,r.id,r,r.width,"Graph:",n),o.Rm.trace(N(r.id,n)),p.set(r.id,{id:N(r.id,n),node:r})):(o.Rm.trace("Node - the non recursive path XAX",e,R,n.node(e),f),await(0,i.on)(R,n.node(e),{config:g,dir:f}))}));const v=(0,o.K2)(async()=>{const e=n.edges().map(async function(e){const t=n.edge(e.v,e.w,e.name);o.Rm.info("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(e)),o.Rm.info("Edge "+e.v+" -> "+e.w+": ",e," ",JSON.stringify(n.edge(e))),o.Rm.info("Fix",p,"ids:",e.v,e.w,"Translating: ",p.get(e.v),p.get(e.w)),await(0,r.jP)(w,t)});await Promise.all(e)},"processEdges");await v(),o.Rm.info("Graph before layout:",JSON.stringify(l(n))),o.Rm.info("############################################# XXX"),o.Rm.info("### Layout ### XXX"),o.Rm.info("############################################# XXX"),(0,d.Zp)(n),o.Rm.info("Graph after layout:",JSON.stringify(l(n)));let y=0,{subGraphTitleTotalMargin:X}=(0,a.O)(g);return await Promise.all(D(n).map(async function(e){const t=n.node(e);if(o.Rm.info("Position XBX => "+e+": ("+t.x,","+t.y,") width: ",t.width," height: ",t.height),t?.clusterNode)t.y+=X,o.Rm.info("A tainted cluster node XBX1",e,t.id,t.width,t.height,t.x,t.y,n.parent(e)),p.get(t.id).node=t,(0,i.U_)(t);else if(n.children(e).length>0){o.Rm.info("A pure cluster node XBX1",e,t.id,t.x,t.y,t.width,t.height,n.parent(e)),t.height+=X,n.node(t.parentId);const r=t?.padding/2||0,a=t?.labelBBox?.height||0,d=a-r||0;o.Rm.debug("OffsetY",d,"labelHeight",a,"halfPadding",r),await(0,i.U)(u,t),p.get(t.id).node=t}else{const e=n.node(t.parentId);t.y+=X/2,o.Rm.info("A regular node XBX1 - using the padding",t.id,"parent",t.parentId,t.width,t.height,t.x,t.y,"offsetY",t.offsetY,"parent",e,e?.offsetY,t),(0,i.U_)(t)}})),n.edges().forEach(function(e){const i=n.edge(e);o.Rm.info("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(i),i),i.points.forEach(e=>e.y+=X/2);const a=n.node(e.v);var d=n.node(e.w);const c=(0,r.Jo)(m,i,p,t,a,d,s);(0,r.T_)(i,c)}),n.nodes().forEach(function(e){const t=n.node(e);o.Rm.info(e,t.type,t.diff),t.isGroup&&(y=t.diff)}),o.Rm.warn("Returning from recursive render XAX",h,y),{elem:h,diff:y}},"recursiveRender"),k=(0,o.K2)(async(e,n)=>{const t=new u.T({multigraph:!0,compound:!0}).setGraph({rankdir:e.direction,nodesep:e.config?.nodeSpacing||e.config?.flowchart?.nodeSpacing||e.nodeSpacing,ranksep:e.config?.rankSpacing||e.config?.flowchart?.rankSpacing||e.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel(function(){return{}}),a=n.select("g");(0,r.g0)(a,e.markers,e.type,e.diagramId),(0,i.gh)(),(0,r.IU)(),(0,i.IU)(),R(),e.nodes.forEach(e=>{t.setNode(e.id,{...e}),e.parentId&&t.setParent(e.id,e.parentId)}),o.Rm.debug("Edges:",e.edges),e.edges.forEach(e=>{if(e.start===e.end){const n=e.start,r=n+"---"+n+"---1",i=n+"---"+n+"---2",a=t.node(n);t.setNode(r,{domId:r,id:r,parentId:a.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),t.setParent(r,a.parentId),t.setNode(i,{domId:i,id:i,parentId:a.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),t.setParent(i,a.parentId);const o=structuredClone(e),d=structuredClone(e),s=structuredClone(e);o.label="",o.arrowTypeEnd="none",o.id=n+"-cyclic-special-1",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.id=n+"-cyclic-special-mid",s.label="",a.isGroup&&(o.fromCluster=n,s.toCluster=n),s.id=n+"-cyclic-special-2",s.arrowTypeStart="none",t.setEdge(n,r,o,n+"-cyclic-special-0"),t.setEdge(r,i,d,n+"-cyclic-special-1"),t.setEdge(i,n,s,n+"-cyc<lic-special-2")}else t.setEdge(e.start,e.end,{...e},e.id)}),o.Rm.warn("Graph at first:",JSON.stringify(l(t))),S(t),o.Rm.warn("Graph after XAX:",JSON.stringify(l(t)));const d=(0,o.D7)();await A(a,t,e.type,e.diagramId,void 0,d)},"render")}}]); \ No newline at end of file diff --git a/assets/js/86c82c9a.704cb880.js b/assets/js/86c82c9a.704cb880.js new file mode 100644 index 0000000000..0a981a0599 --- /dev/null +++ b/assets/js/86c82c9a.704cb880.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9603],{18961:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.12.4/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.12.4/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/must_be_api.md","tags":[],"version":"0.12.4","frontMatter":{"id":"must_be_api","slug":"/rules/must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_dependency"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",slug:"/rules/must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/87c27ff4.a0ab0337.js b/assets/js/87c27ff4.a0ab0337.js new file mode 100644 index 0000000000..ab2d562ab0 --- /dev/null +++ b/assets/js/87c27ff4.a0ab0337.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2410],{7357:(e,n,r)=>{r.d(n,{A:()=>s});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var l=r(23420);function s({children:e,hidden:n,className:r}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},65404:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var t=r(36672);const a={},l=t.createContext(a);function s(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(l.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(36672),a=r(13526),l=r(58797),s=r(85291),o=r(52245),i=r(32342),u=r(45223),c=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,l=h(e),[s,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l})),[u,d]=g({queryString:r,groupId:a}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,c.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=u??m;return p({value:e,tabValues:l})?e:null})();(0,o.A)(()=>{b&&i(b)},[b]);return{selectedValue:s,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)},[d,f,l]),tabValues:l}}var f=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:t,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,l.a_)(),u=e=>{const n=e.currentTarget,a=o.indexOf(n),l=s[a].value;l!==r&&(i(n),t(l))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}},85729:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"Dependencies","source":"@site/versioned_docs/version-0.12.0/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.12.0/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/quickstart.mdx","tags":[],"version":"0.12.0","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.0/configuration"}}');var a=r(23420),l=r(65404),s=r(83796),o=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},u=void 0,c={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // used for Android Gradle Plugin internally\n google()\n // Add for SNAPSHOT builds\n maven("https://oss.sonatype.org/content/repositories/snapshots/")\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.12.0"\n}\n'})})]}),(0,a.jsxs)(o.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // used for Android Gradle Plugin internally\n google()\n // Add for SNAPSHOT builds\n maven {\n url "https://oss.sonatype.org/content/repositories/snapshots"\n }\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.12.0'\n}\n"})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,a.jsx)(n.p,{children:"all checks"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,a.jsx)(n.p,{children:"all checks with auto-correct"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"check sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,a.jsx)(n.p,{children:"apply sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"report depths of each module"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckDepths\n"})}),"\n",(0,a.jsx)(n.p,{children:"generate (module-only) dependency graphs"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckGraphs\n"})}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.0/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/896d06c5.7c4b3f7f.js b/assets/js/896d06c5.7c4b3f7f.js new file mode 100644 index 0000000000..b19491017b --- /dev/null +++ b/assets/js/896d06c5.7c4b3f7f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8374],{65404:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>c});var n=s(36672);const r={},o=n.createContext(r);function i(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:t},e.children)}},73033:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.12.4/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sort_dependencies","permalink":"/ModuleCheck/docs/0.12.4/rules/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/sorting/sort_dependencies.md","tags":[],"version":"0.12.4","frontMatter":{"id":"sort_dependencies","slug":"/rules/sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.4/rules/sort_plugins"}}');var r=s(23420),o=s(65404);const i={id:"sort_dependencies",slug:"/rules/sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l()}}}]); \ No newline at end of file diff --git a/assets/js/8998.9e7e5b24.js b/assets/js/8998.9e7e5b24.js new file mode 100644 index 0000000000..434fec153c --- /dev/null +++ b/assets/js/8998.9e7e5b24.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8998],{38998:(e,t,a)=>{a.d(t,{diagram:()=>K});var l=a(44533),s=a(29951),r=a(45059),n=a(98645),o=a(9420),i=a(47765),c=a(97485),d=a(99339),p=a(3170),h={nodes:[],levels:new Map,outerNodes:[],classes:new Map},m=new n.m(()=>structuredClone(h)),y=(0,c.K2)(()=>{const e=c.UI,t=(0,c.zj)();return(0,o.$t)({...e.treemap,...t.treemap??{}})},"getConfig"),f=(0,c.K2)(()=>m.records.nodes,"getNodes"),u=(0,c.K2)((e,t)=>{const a=m.records;a.nodes.push(e),a.levels.set(e,t),0===t&&a.outerNodes.push(e),0!==t||a.root||(a.root=e)},"addNode"),S=(0,c.K2)(()=>({name:"",children:m.records.outerNodes}),"getRoot"),g=(0,c.K2)((e,t)=>{const a=m.records.classes,l=a.get(e)??{id:e,styles:[],textStyles:[]};a.set(e,l);const r=t.replace(/\\,/g,"\xa7\xa7\xa7").replace(/,/g,";").replace(/\xa7\xa7\xa7/g,",").split(";");r&&r.forEach(e=>{(0,s.KX)(e)&&(l?.textStyles?l.textStyles.push(e):l.textStyles=[e]),l?.styles?l.styles.push(e):l.styles=[e]}),a.set(e,l)},"addClass"),x=(0,c.K2)(()=>m.records.classes,"getClasses"),C=(0,c.K2)(e=>m.records.classes.get(e)?.styles??[],"getStylesForClass"),b={getNodes:f,addNode:u,getRoot:S,getConfig:y,clear:(0,c.K2)(()=>{(0,c.IU)(),m.reset()},"clear"),setAccTitle:c.SV,getAccTitle:c.iN,setDiagramTitle:c.ke,getDiagramTitle:c.ab,getAccDescription:c.m7,setAccDescription:c.EI,addClass:g,getClasses:x,getStylesForClass:C};function $(e){if(!e.length)return[];const t=[],a=[];return e.forEach(e=>{const l={name:e.name,children:"Leaf"===e.type?void 0:[]};for(l.classSelector=e?.classSelector,e?.cssCompiledStyles&&(l.cssCompiledStyles=[e.cssCompiledStyles]),"Leaf"===e.type&&void 0!==e.value&&(l.value=e.value);a.length>0&&a[a.length-1].level>=e.level;)a.pop();if(0===a.length)t.push(l);else{const e=a[a.length-1].node;e.children?e.children.push(l):e.children=[l]}"Leaf"!==e.type&&a.push({node:l,level:e.level})}),t}(0,c.K2)($,"buildHierarchy");var v=(0,c.K2)(e=>{(0,r.S)(e,b);const t=[];for(const s of e.TreemapRows??[])"ClassDefStatement"===s.$type&&b.addClass(s.className??"",s.styleText??"");for(const s of e.TreemapRows??[]){const e=s.item;if(!e)continue;const a=s.indent?parseInt(s.indent):0,l=w(e),r=e.classSelector?b.getStylesForClass(e.classSelector):[],n=r.length>0?r.join(";"):void 0,o={level:a,name:l,type:e.$type,value:e.value,classSelector:e.classSelector,cssCompiledStyles:n};t.push(o)}const a=$(t),l=(0,c.K2)((e,t)=>{for(const a of e)b.addNode(a,t),a.children&&a.children.length>0&&l(a.children,t+1)},"addNodesRecursively");l(a,0)},"populate"),w=(0,c.K2)(e=>e.name?String(e.name):"","getItemName"),k=10,L={sectionStrokeColor:"black",sectionStrokeWidth:"1",sectionFillColor:"#efefef",leafStrokeColor:"black",leafStrokeWidth:"1",leafFillColor:"#efefef",labelColor:"black",labelFontSize:"12px",valueFontSize:"10px",valueColor:"black",titleColor:"black",titleFontSize:"14px"},K={parser:{parse:(0,c.K2)(async e=>{try{const t=d.qg,a=await t("treemap",e);c.Rm.debug("Treemap AST:",a),v(a)}catch(t){throw c.Rm.error("Error parsing treemap:",t),t}},"parse")},db:b,renderer:{draw:(0,c.K2)((e,t,a,r)=>{const n=r.db,o=n.getConfig(),d=o.padding??10,h=n.getDiagramTitle(),m=n.getRoot(),{themeVariables:y}=(0,c.zj)();if(!m)return;const f=h?30:0,u=(0,i.D)(t),S=o.nodeWidth?o.nodeWidth*k:960,g=o.nodeHeight?o.nodeHeight*k:500,x=S,C=g+f;let b;u.attr("viewBox",`0 0 ${x} ${C}`),(0,c.a$)(u,C,x,o.useMaxWidth);try{const e=o.valueFormat||",";if("$0,0"===e)b=(0,c.K2)(e=>"$"+(0,p.GPZ)(",")(e),"valueFormat");else if(e.startsWith("$")&&e.includes(",")){const t=/\.\d+/.exec(e),a=t?t[0]:"";b=(0,c.K2)(e=>"$"+(0,p.GPZ)(","+a)(e),"valueFormat")}else if(e.startsWith("$")){const t=e.substring(1);b=(0,c.K2)(e=>"$"+(0,p.GPZ)(t||"")(e),"valueFormat")}else b=(0,p.GPZ)(e)}catch(G){c.Rm.error("Error creating format function:",G),b=(0,p.GPZ)(",")}const $=(0,p.UMr)().range(["transparent",y.cScale0,y.cScale1,y.cScale2,y.cScale3,y.cScale4,y.cScale5,y.cScale6,y.cScale7,y.cScale8,y.cScale9,y.cScale10,y.cScale11]),v=(0,p.UMr)().range(["transparent",y.cScalePeer0,y.cScalePeer1,y.cScalePeer2,y.cScalePeer3,y.cScalePeer4,y.cScalePeer5,y.cScalePeer6,y.cScalePeer7,y.cScalePeer8,y.cScalePeer9,y.cScalePeer10,y.cScalePeer11]),w=(0,p.UMr)().range([y.cScaleLabel0,y.cScaleLabel1,y.cScaleLabel2,y.cScaleLabel3,y.cScaleLabel4,y.cScaleLabel5,y.cScaleLabel6,y.cScaleLabel7,y.cScaleLabel8,y.cScaleLabel9,y.cScaleLabel10,y.cScaleLabel11]);h&&u.append("text").attr("x",x/2).attr("y",f/2).attr("class","treemapTitle").attr("text-anchor","middle").attr("dominant-baseline","middle").text(h);const L=u.append("g").attr("transform",`translate(0, ${f})`).attr("class","treemapContainer"),K=(0,p.Sk5)(m).sum(e=>e.value??0).sort((e,t)=>(t.value??0)-(e.value??0)),P=(0,p.hkb)().size([S,g]).paddingTop(e=>e.children&&e.children.length>0?35:0).paddingInner(d).paddingLeft(e=>e.children&&e.children.length>0?k:0).paddingRight(e=>e.children&&e.children.length>0?k:0).paddingBottom(e=>e.children&&e.children.length>0?k:0).round(!0)(K),T=P.descendants().filter(e=>e.children&&e.children.length>0),z=L.selectAll(".treemapSection").data(T).enter().append("g").attr("class","treemapSection").attr("transform",e=>`translate(${e.x0},${e.y0})`);z.append("rect").attr("width",e=>e.x1-e.x0).attr("height",25).attr("class","treemapSectionHeader").attr("fill","none").attr("fill-opacity",.6).attr("stroke-width",.6).attr("style",e=>0===e.depth?"display: none;":""),z.append("clipPath").attr("id",(e,a)=>`clip-section-${t}-${a}`).append("rect").attr("width",e=>Math.max(0,e.x1-e.x0-12)).attr("height",25),z.append("rect").attr("width",e=>e.x1-e.x0).attr("height",e=>e.y1-e.y0).attr("class",(e,t)=>`treemapSection section${t}`).attr("fill",e=>$(e.data.name)).attr("fill-opacity",.6).attr("stroke",e=>v(e.data.name)).attr("stroke-width",2).attr("stroke-opacity",.4).attr("style",e=>{if(0===e.depth)return"display: none;";const t=(0,s.GX)({cssCompiledStyles:e.data.cssCompiledStyles});return t.nodeStyles+";"+t.borderStyles.join(";")}),z.append("text").attr("class","treemapSectionLabel").attr("x",6).attr("y",12.5).attr("dominant-baseline","middle").text(e=>0===e.depth?"":e.data.name).attr("font-weight","bold").attr("style",e=>{if(0===e.depth)return"display: none;";return"dominant-baseline: middle; font-size: 12px; fill:"+w(e.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"+(0,s.GX)({cssCompiledStyles:e.data.cssCompiledStyles}).labelStyles.replace("color:","fill:")}).each(function(e){if(0===e.depth)return;const t=(0,p.Ltv)(this),a=e.data.name;t.text(a);const l=e.x1-e.x0;let s;if(!1!==o.showValues&&e.value){s=l-10-30-10-6}else{s=l-6-6}const r=Math.max(15,s),n=t.node();if(n.getComputedTextLength()>r){const e="...";let l=a;for(;l.length>0;){if(l=a.substring(0,l.length-1),0===l.length){t.text(e),n.getComputedTextLength()>r&&t.text("");break}if(t.text(l+e),n.getComputedTextLength()<=r)break}}}),!1!==o.showValues&&z.append("text").attr("class","treemapSectionValue").attr("x",e=>e.x1-e.x0-10).attr("y",12.5).attr("text-anchor","end").attr("dominant-baseline","middle").text(e=>e.value?b(e.value):"").attr("font-style","italic").attr("style",e=>{if(0===e.depth)return"display: none;";return"text-anchor: end; dominant-baseline: middle; font-size: 10px; fill:"+w(e.data.name)+"; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"+(0,s.GX)({cssCompiledStyles:e.data.cssCompiledStyles}).labelStyles.replace("color:","fill:")});const M=P.leaves(),F=L.selectAll(".treemapLeafGroup").data(M).enter().append("g").attr("class",(e,t)=>`treemapNode treemapLeafGroup leaf${t}${e.data.classSelector?` ${e.data.classSelector}`:""}x`).attr("transform",e=>`translate(${e.x0},${e.y0})`);F.append("rect").attr("width",e=>e.x1-e.x0).attr("height",e=>e.y1-e.y0).attr("class","treemapLeaf").attr("fill",e=>e.parent?$(e.parent.data.name):$(e.data.name)).attr("style",e=>(0,s.GX)({cssCompiledStyles:e.data.cssCompiledStyles}).nodeStyles).attr("fill-opacity",.3).attr("stroke",e=>e.parent?$(e.parent.data.name):$(e.data.name)).attr("stroke-width",3),F.append("clipPath").attr("id",(e,a)=>`clip-${t}-${a}`).append("rect").attr("width",e=>Math.max(0,e.x1-e.x0-4)).attr("height",e=>Math.max(0,e.y1-e.y0-4));if(F.append("text").attr("class","treemapLabel").attr("x",e=>(e.x1-e.x0)/2).attr("y",e=>(e.y1-e.y0)/2).attr("style",e=>"text-anchor: middle; dominant-baseline: middle; font-size: 38px;fill:"+w(e.data.name)+";"+(0,s.GX)({cssCompiledStyles:e.data.cssCompiledStyles}).labelStyles.replace("color:","fill:")).attr("clip-path",(e,a)=>`url(#clip-${t}-${a})`).text(e=>e.data.name).each(function(e){const t=(0,p.Ltv)(this),a=e.x1-e.x0,l=e.y1-e.y0,s=t.node(),r=a-8,n=l-8;if(r<10||n<10)return void t.style("display","none");let o=parseInt(t.style("font-size"),10);for(;s.getComputedTextLength()>r&&o>8;)o--,t.style("font-size",`${o}px`);let i=Math.max(6,Math.min(28,Math.round(.6*o))),c=o+2+i;for(;c>n&&o>8&&(o--,i=Math.max(6,Math.min(28,Math.round(.6*o))),!(i<6&&8===o));)t.style("font-size",`${o}px`),c=o+2+i;t.style("font-size",`${o}px`),(s.getComputedTextLength()>r||o<8||n<o)&&t.style("display","none")}),!1!==o.showValues){F.append("text").attr("class","treemapValue").attr("x",e=>(e.x1-e.x0)/2).attr("y",function(e){return(e.y1-e.y0)/2}).attr("style",e=>"text-anchor: middle; dominant-baseline: hanging; font-size: 28px;fill:"+w(e.data.name)+";"+(0,s.GX)({cssCompiledStyles:e.data.cssCompiledStyles}).labelStyles.replace("color:","fill:")).attr("clip-path",(e,a)=>`url(#clip-${t}-${a})`).text(e=>e.value?b(e.value):"").each(function(e){const t=(0,p.Ltv)(this),a=this.parentNode;if(!a)return void t.style("display","none");const l=(0,p.Ltv)(a).select(".treemapLabel");if(l.empty()||"none"===l.style("display"))return void t.style("display","none");const s=parseFloat(l.style("font-size")),r=Math.max(6,Math.min(28,Math.round(.6*s)));t.style("font-size",`${r}px`);const n=(e.y1-e.y0)/2+s/2+2;t.attr("y",n);const o=e.x1-e.x0,i=e.y1-e.y0-4,c=o-8;t.node().getComputedTextLength()>c||n+r>i||r<6?t.style("display","none"):t.style("display",null)})}const N=o.diagramPadding??8;(0,l.P)(u,N,"flowchart",o?.useMaxWidth||!1)},"draw"),getClasses:(0,c.K2)(function(e,t){return t.db.getClasses()},"getClasses")},styles:(0,c.K2)(({treemap:e}={})=>{const t=(0,o.$t)(L,e);return`\n .treemapNode.section {\n stroke: ${t.sectionStrokeColor};\n stroke-width: ${t.sectionStrokeWidth};\n fill: ${t.sectionFillColor};\n }\n .treemapNode.leaf {\n stroke: ${t.leafStrokeColor};\n stroke-width: ${t.leafStrokeWidth};\n fill: ${t.leafFillColor};\n }\n .treemapLabel {\n fill: ${t.labelColor};\n font-size: ${t.labelFontSize};\n }\n .treemapValue {\n fill: ${t.valueColor};\n font-size: ${t.valueFontSize};\n }\n .treemapTitle {\n fill: ${t.titleColor};\n font-size: ${t.titleFontSize};\n }\n `},"getStyles")}},44533:(e,t,a)=>{a.d(t,{P:()=>s});var l=a(97485),s=(0,l.K2)((e,t,a,s)=>{e.attr("class",a);const{width:o,height:i,x:c,y:d}=r(e,t);(0,l.a$)(e,i,o,s);const p=n(c,d,o,i,t);e.attr("viewBox",p),l.Rm.debug(`viewBox configured: ${p} with padding: ${t}`)},"setupViewPortForSVG"),r=(0,l.K2)((e,t)=>{const a=e.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:a.width+2*t,height:a.height+2*t,x:a.x,y:a.y}},"calculateDimensionsWithPadding"),n=(0,l.K2)((e,t,a,l,s)=>`${e-s} ${t-s} ${a} ${l}`,"createViewBox")},45059:(e,t,a)=>{function l(e,t){e.accDescr&&t.setAccDescription?.(e.accDescr),e.accTitle&&t.setAccTitle?.(e.accTitle),e.title&&t.setDiagramTitle?.(e.title)}a.d(t,{S:()=>l}),(0,a(97485).K2)(l,"populateCommonDb")},98645:(e,t,a)=>{a.d(t,{m:()=>s});var l=a(97485),s=class{constructor(e){this.init=e,this.records=this.init()}static{(0,l.K2)(this,"ImperativeState")}reset(){this.records=this.init()}}}}]); \ No newline at end of file diff --git a/assets/js/89d14484.675e28e5.js b/assets/js/89d14484.675e28e5.js new file mode 100644 index 0000000000..436f862b12 --- /dev/null +++ b/assets/js/89d14484.675e28e5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[679],{19346:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>a});const d=JSON.parse('{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.12.1/rules/android/disable_view_binding.md","sourceDirName":"rules/android","slug":"/rules/disable_view_binding","permalink":"/ModuleCheck/docs/0.12.1/rules/disable_view_binding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/android/disable_view_binding.md","tags":[],"version":"0.12.1","frontMatter":{"id":"disable_view_binding","slug":"/rules/disable_view_binding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.1/rules/disable_android_resources"},"next":{"title":"Unused Kotlin Android Extensions","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensions"}}');var s=i(23420),t=i(65404);const o={id:"disable_view_binding",slug:"/rules/disable_view_binding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,l={},a=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var d=i(36672);const s={},t=d.createContext(s);function o(e){const n=d.useContext(t);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),d.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8dac98b9.6fa92e78.js b/assets/js/8dac98b9.6fa92e78.js new file mode 100644 index 0000000000..98be8fb020 --- /dev/null +++ b/assets/js/8dac98b9.6fa92e78.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3623],{53605:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>a});const d=JSON.parse('{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.12.5/rules/android/disable_view_binding.md","sourceDirName":"rules/android","slug":"/rules/disable_view_binding","permalink":"/ModuleCheck/docs/rules/disable_view_binding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/android/disable_view_binding.md","tags":[],"version":"0.12.5","frontMatter":{"id":"disable_view_binding","slug":"/rules/disable_view_binding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/rules/disable_android_resources"},"next":{"title":"Unused Kotlin Android Extensions","permalink":"/ModuleCheck/docs/rules/unused_kotlin_android_extensions"}}');var s=i(23420),t=i(65404);const o={id:"disable_view_binding",slug:"/rules/disable_view_binding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,l={},a=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var d=i(36672);const s={},t=d.createContext(s);function o(e){const n=d.useContext(t);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),d.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/8e56f135.7be2c54b.js b/assets/js/8e56f135.7be2c54b.js new file mode 100644 index 0000000000..9e8b7114e2 --- /dev/null +++ b/assets/js/8e56f135.7be2c54b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8028],{45876:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.11.0/rules/compiler/could_use_anvil_factory.md","sourceDirName":"rules/compiler","slug":"/rules/compiler/could_use_anvil_factory","permalink":"/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/compiler/could_use_anvil_factory.md","tags":[],"version":"0.11.0","frontMatter":{"id":"could_use_anvil_factory","title":"Could Use Anvil Factory","sidebar_label":"Could Use Anvil Factory"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.0/rules/inherited_dependency"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor"}}');var r=o(23420),s=o(65404);const i={id:"could_use_anvil_factory",title:"Could Use Anvil Factory",sidebar_label:"Could Use Anvil Factory"},c=void 0,l={},a=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents,\nand it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},65404:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(36672);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9130.d1239283.js b/assets/js/9130.d1239283.js new file mode 100644 index 0000000000..fe3f168603 --- /dev/null +++ b/assets/js/9130.d1239283.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9130],{99130:(e,c,k)=>{k.d(c,{createPacketServices:()=>s.$});var s=k(12345);k(60349)}}]); \ No newline at end of file diff --git a/assets/js/91e5ca6b.1b977b78.js b/assets/js/91e5ca6b.1b977b78.js new file mode 100644 index 0000000000..55016ba29a --- /dev/null +++ b/assets/js/91e5ca6b.1b977b78.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[259],{5613:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>i,default:()=>a,frontMatter:()=>c,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/docs/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sort_dependencies","permalink":"/ModuleCheck/docs/next/rules/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/sorting/sort_dependencies.md","tags":[],"version":"current","frontMatter":{"id":"sort_dependencies","slug":"/rules/sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/next/rules/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/next/rules/sort_plugins"}}');var r=n(23420),o=n(65404);const c={id:"sort_dependencies",slug:"/rules/sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},i=void 0,d={},u=[];function l(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l()}},65404:(e,t,n)=>{n.d(t,{R:()=>c,x:()=>i});var s=n(36672);const r={},o=s.createContext(r);function c(e){const t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:c(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/91ee770c.5b0131e0.js b/assets/js/91ee770c.5b0131e0.js new file mode 100644 index 0000000000..8c7924fe25 --- /dev/null +++ b/assets/js/91ee770c.5b0131e0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7950],{65404:(e,t,s)=>{s.d(t,{R:()=>c,x:()=>a});var o=s(36672);const n={},r=o.createContext(n);function c(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),o.createElement(r.Provider,{value:t},e.children)}},74970:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.12.1/rules/compiler/custom_kapt_matchers.md","sourceDirName":"rules/compiler","slug":"/rules/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/compiler/custom_kapt_matchers.md","tags":[],"version":"0.12.1","frontMatter":{"id":"custom_kapt_matchers","slug":"/rules/custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.1/rules/sort_dependencies"}}');var n=s(23420),r=s(65404);const c={id:"custom_kapt_matchers",slug:"/rules/custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},a=void 0,i={},l=[];function u(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,n.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/92131bac.7edf15d9.js b/assets/js/92131bac.7edf15d9.js new file mode 100644 index 0000000000..08ba9c4e40 --- /dev/null +++ b/assets/js/92131bac.7edf15d9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9583],{30185:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.12.1/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sort_dependencies","permalink":"/ModuleCheck/docs/0.12.1/rules/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/sorting/sort_dependencies.md","tags":[],"version":"0.12.1","frontMatter":{"id":"sort_dependencies","slug":"/rules/sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.1/rules/sort_plugins"}}');var r=s(23420),o=s(65404);const i={id:"sort_dependencies",slug:"/rules/sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l()}},65404:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>c});var n=s(36672);const r={},o=n.createContext(r);function i(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9219.cb8684dc.js b/assets/js/9219.cb8684dc.js new file mode 100644 index 0000000000..6591b80d26 --- /dev/null +++ b/assets/js/9219.cb8684dc.js @@ -0,0 +1,2 @@ +/*! For license information please see 9219.cb8684dc.js.LICENSE.txt */ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9219],{79219:(e,t,n)=>{function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function a(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t,n){return t&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,c(r.key),r)}}(e.prototype,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function o(e,t){var n="undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(!n){if(Array.isArray(e)||(n=h(e))||t){n&&(e=n);var r=0,a=function(){};return{s:a,n:function(){return r>=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw i}}}}function s(e,t,n){return(t=c(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,s=[],l=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return s}}(e,t)||h(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||h(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function d(e){return d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},d(e)}function h(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}n.d(t,{A:()=>Hh});var f="undefined"==typeof window?null:window,p=f?f.navigator:null;f&&f.document;var v,g,y,m,b,x,w,E,k,T,C,P,S,B,D,_,A,M,R,I,N,L,z,O,V,F,j,X,q=d(""),Y=d({}),W=d(function(){}),U="undefined"==typeof HTMLElement?"undefined":d(HTMLElement),H=function(e){return e&&e.instanceString&&G(e.instanceString)?e.instanceString():null},K=function(e){return null!=e&&d(e)==q},G=function(e){return null!=e&&d(e)===W},Z=function(e){return!ee(e)&&(Array.isArray?Array.isArray(e):null!=e&&e instanceof Array)},$=function(e){return null!=e&&d(e)===Y&&!Z(e)&&e.constructor===Object},Q=function(e){return null!=e&&d(e)===d(1)&&!isNaN(e)},J=function(e){return"undefined"===U?void 0:null!=e&&e instanceof HTMLElement},ee=function(e){return te(e)||ne(e)},te=function(e){return"collection"===H(e)&&e._private.single},ne=function(e){return"collection"===H(e)&&!e._private.single},re=function(e){return"core"===H(e)},ae=function(e){return"stylesheet"===H(e)},ie=function(e){return null==e||!(""!==e&&!e.match(/^\s+$/))},oe=function(e){return function(e){return null!=e&&d(e)===Y}(e)&&G(e.then)},se=function(e,t){t||(t=function(){if(1===arguments.length)return arguments[0];if(0===arguments.length)return"undefined";for(var e=[],t=0;t<arguments.length;t++)e.push(arguments[t]);return e.join("$")});var n=function(){var r,a=arguments,i=t.apply(this,a),o=n.cache;return(r=o[i])||(r=o[i]=e.apply(this,a)),r};return n.cache={},n},le=se(function(e){return e.replace(/([A-Z])/g,function(e){return"-"+e.toLowerCase()})}),ue=se(function(e){return e.replace(/(-\w)/g,function(e){return e[1].toUpperCase()})}),ce=se(function(e,t){return e+t[0].toUpperCase()+t.substring(1)},function(e,t){return e+"$"+t}),de=function(e){return ie(e)?e:e.charAt(0).toUpperCase()+e.substring(1)},he=function(e,t){return e.slice(-1*t.length)===t},fe="(?:[-+]?(?:(?:\\d+|\\d*\\.\\d+)(?:[Ee][+-]?\\d+)?))",pe="rgb[a]?\\(("+fe+"[%]?)\\s*,\\s*("+fe+"[%]?)\\s*,\\s*("+fe+"[%]?)(?:\\s*,\\s*("+fe+"))?\\)",ve="rgb[a]?\\((?:"+fe+"[%]?)\\s*,\\s*(?:"+fe+"[%]?)\\s*,\\s*(?:"+fe+"[%]?)(?:\\s*,\\s*(?:"+fe+"))?\\)",ge="hsl[a]?\\(("+fe+")\\s*,\\s*("+fe+"[%])\\s*,\\s*("+fe+"[%])(?:\\s*,\\s*("+fe+"))?\\)",ye="hsl[a]?\\((?:"+fe+")\\s*,\\s*(?:"+fe+"[%])\\s*,\\s*(?:"+fe+"[%])(?:\\s*,\\s*(?:"+fe+"))?\\)",me=function(e,t){return e<t?-1:e>t?1:0},be=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n<t.length;n++){var r=t[n];if(null!=r)for(var a=Object.keys(r),i=0;i<a.length;i++){var o=a[i];e[o]=r[o]}}return e},xe=function(e){return(Z(e)?e:null)||function(e){return we[e.toLowerCase()]}(e)||function(e){if((4===e.length||7===e.length)&&"#"===e[0]){var t,n,r,a=16;return 4===e.length?(t=parseInt(e[1]+e[1],a),n=parseInt(e[2]+e[2],a),r=parseInt(e[3]+e[3],a)):(t=parseInt(e[1]+e[2],a),n=parseInt(e[3]+e[4],a),r=parseInt(e[5]+e[6],a)),[t,n,r]}}(e)||function(e){var t,n=new RegExp("^"+pe+"$").exec(e);if(n){t=[];for(var r=[],a=1;a<=3;a++){var i=n[a];if("%"===i[i.length-1]&&(r[a]=!0),i=parseFloat(i),r[a]&&(i=i/100*255),i<0||i>255)return;t.push(Math.floor(i))}var o=r[1]||r[2]||r[3],s=r[1]&&r[2]&&r[3];if(o&&!s)return;var l=n[4];if(void 0!==l){if((l=parseFloat(l))<0||l>1)return;t.push(l)}}return t}(e)||function(e){var t,n,r,a,i,o,s,l;function u(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var c=new RegExp("^"+ge+"$").exec(e);if(c){if((n=parseInt(c[1]))<0?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,(r=parseFloat(c[2]))<0||r>100)return;if(r/=100,(a=parseFloat(c[3]))<0||a>100)return;if(a/=100,void 0!==(i=c[4])&&((i=parseFloat(i))<0||i>1))return;if(0===r)o=s=l=Math.round(255*a);else{var d=a<.5?a*(1+r):a+r-a*r,h=2*a-d;o=Math.round(255*u(h,d,n+1/3)),s=Math.round(255*u(h,d,n)),l=Math.round(255*u(h,d,n-1/3))}t=[o,s,l,i]}return t}(e)},we={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},Ee=function(e){for(var t=e.map,n=e.keys,r=n.length,a=0;a<r;a++){var i=n[a];if($(i))throw Error("Tried to set map with object key");a<n.length-1?(null==t[i]&&(t[i]={}),t=t[i]):t[i]=e.value}},ke=function(e){for(var t=e.map,n=e.keys,r=n.length,a=0;a<r;a++){var i=n[a];if($(i))throw Error("Tried to get map with object key");if(null==(t=t[i]))return t}return t},Te="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function Ce(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}function Pe(){if(g)return v;return g=1,v=function(e){var t=typeof e;return null!=e&&("object"==t||"function"==t)}}function Se(){if(x)return b;x=1;var e=function(){if(m)return y;m=1;var e="object"==typeof Te&&Te&&Te.Object===Object&&Te;return y=e}(),t="object"==typeof self&&self&&self.Object===Object&&self,n=e||t||Function("return this")();return b=n}function Be(){if(P)return C;P=1;var e=function(){if(T)return k;T=1;var e=/\s/;return k=function(t){for(var n=t.length;n--&&e.test(t.charAt(n)););return n},k}(),t=/^\s+/;return C=function(n){return n?n.slice(0,e(n)+1).replace(t,""):n},C}function De(){if(B)return S;B=1;var e=Se().Symbol;return S=e}function _e(){if(I)return R;I=1;var e=De(),t=function(){if(_)return D;_=1;var e=De(),t=Object.prototype,n=t.hasOwnProperty,r=t.toString,a=e?e.toStringTag:void 0;return D=function(e){var t=n.call(e,a),i=e[a];try{e[a]=void 0;var o=!0}catch(l){}var s=r.call(e);return o&&(t?e[a]=i:delete e[a]),s}}(),n=function(){if(M)return A;M=1;var e=Object.prototype.toString;return A=function(t){return e.call(t)}}(),r=e?e.toStringTag:void 0;return R=function(e){return null==e?void 0===e?"[object Undefined]":"[object Null]":r&&r in Object(e)?t(e):n(e)}}function Ae(){if(O)return z;O=1;var e=_e(),t=L?N:(L=1,N=function(e){return null!=e&&"object"==typeof e});return z=function(n){return"symbol"==typeof n||t(n)&&"[object Symbol]"==e(n)}}var Me=Ce(function(){if(X)return j;X=1;var e=Pe(),t=function(){if(E)return w;E=1;var e=Se();return w=function(){return e.Date.now()}}(),n=function(){if(F)return V;F=1;var e=Be(),t=Pe(),n=Ae(),r=/^[-+]0x[0-9a-f]+$/i,a=/^0b[01]+$/i,i=/^0o[0-7]+$/i,o=parseInt;return V=function(s){if("number"==typeof s)return s;if(n(s))return NaN;if(t(s)){var l="function"==typeof s.valueOf?s.valueOf():s;s=t(l)?l+"":l}if("string"!=typeof s)return 0===s?s:+s;s=e(s);var u=a.test(s);return u||i.test(s)?o(s.slice(2),u?2:8):r.test(s)?NaN:+s}}(),r=Math.max,a=Math.min;return j=function(i,o,s){var l,u,c,d,h,f,p=0,v=!1,g=!1,y=!0;if("function"!=typeof i)throw new TypeError("Expected a function");function m(e){var t=l,n=u;return l=u=void 0,p=e,d=i.apply(n,t)}function b(e){var t=e-f;return void 0===f||t>=o||t<0||g&&e-p>=c}function x(){var e=t();if(b(e))return w(e);h=setTimeout(x,function(e){var t=o-(e-f);return g?a(t,c-(e-p)):t}(e))}function w(e){return h=void 0,y&&l?m(e):(l=u=void 0,d)}function E(){var e=t(),n=b(e);if(l=arguments,u=this,f=e,n){if(void 0===h)return function(e){return p=e,h=setTimeout(x,o),v?m(e):d}(f);if(g)return clearTimeout(h),h=setTimeout(x,o),m(f)}return void 0===h&&(h=setTimeout(x,o)),d}return o=n(o)||0,e(s)&&(v=!!s.leading,c=(g="maxWait"in s)?r(n(s.maxWait)||0,o):c,y="trailing"in s?!!s.trailing:y),E.cancel=function(){void 0!==h&&clearTimeout(h),p=0,l=f=u=h=void 0},E.flush=function(){return void 0===h?d:w(t())},E}}()),Re=f?f.performance:null,Ie=Re&&Re.now?function(){return Re.now()}:function(){return Date.now()},Ne=function(){if(f){if(f.requestAnimationFrame)return function(e){f.requestAnimationFrame(e)};if(f.mozRequestAnimationFrame)return function(e){f.mozRequestAnimationFrame(e)};if(f.webkitRequestAnimationFrame)return function(e){f.webkitRequestAnimationFrame(e)};if(f.msRequestAnimationFrame)return function(e){f.msRequestAnimationFrame(e)}}return function(e){e&&setTimeout(function(){e(Ie())},1e3/60)}}(),Le=function(e){return Ne(e)},ze=Ie,Oe=9261,Ve=5381,Fe=function(e){for(var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Oe;!(t=e.next()).done;)n=65599*n+t.value|0;return n},je=function(e){return 65599*(arguments.length>1&&void 0!==arguments[1]?arguments[1]:Oe)+e|0},Xe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Ve;return(t<<5)+t+e|0},qe=function(e){return 2097152*e[0]+e[1]},Ye=function(e,t){return[je(e[0],t[0]),Xe(e[1],t[1])]},We=function(e,t){var n={value:0,done:!1},r=0,a=e.length;return Fe({next:function(){return r<a?n.value=e[r++]:n.done=!0,n}},t)},Ue=function(e,t){var n={value:0,done:!1},r=0,a=e.length;return Fe({next:function(){return r<a?n.value=e.charCodeAt(r++):n.done=!0,n}},t)},He=function(){return Ke(arguments)},Ke=function(e){for(var t,n=0;n<e.length;n++){var r=e[n];t=0===n?Ue(r):Ue(r,t)}return t},Ge=!0,Ze=null!=console.warn,$e=null!=console.trace,Qe=Number.MAX_SAFE_INTEGER||9007199254740991,Je=function(){return!0},et=function(){return!1},tt=function(){return 0},nt=function(){},rt=function(e){throw new Error(e)},at=function(e){if(void 0===e)return Ge;Ge=!!e},it=function(e){at()&&(Ze?console.warn(e):(console.log(e),$e&&console.trace()))},ot=function(e){return null==e?e:Z(e)?e.slice():$(e)?function(e){return be({},e)}(e):e},st=function(e,t){for(t=e="";e++<36;t+=51*e&52?(15^e?8^Math.random()*(20^e?16:4):4).toString(16):"-");return t},lt={},ut=function(){return lt},ct=function(e){var t=Object.keys(e);return function(n){for(var r={},a=0;a<t.length;a++){var i=t[a],o=null==n?void 0:n[i];r[i]=void 0===o?e[i]:o}return r}},dt=function(e,t,n){for(var r=e.length-1;r>=0;r--)e[r]===t&&e.splice(r,1)},ht=function(e){e.splice(0,e.length)},ft=function(e,t,n){return n&&(t=ce(n,t)),e[t]},pt=function(e,t,n,r){n&&(t=ce(n,t)),e[t]=r},vt="undefined"!=typeof Map?Map:function(){return i(function e(){a(this,e),this._obj={}},[{key:"set",value:function(e,t){return this._obj[e]=t,this}},{key:"delete",value:function(e){return this._obj[e]=void 0,this}},{key:"clear",value:function(){this._obj={}}},{key:"has",value:function(e){return void 0!==this._obj[e]}},{key:"get",value:function(e){return this._obj[e]}}])}(),gt=function(){return i(function e(t){if(a(this,e),this._obj=Object.create(null),this.size=0,null!=t){var n;n=null!=t.instanceString&&t.instanceString()===this.instanceString()?t.toArray():t;for(var r=0;r<n.length;r++)this.add(n[r])}},[{key:"instanceString",value:function(){return"set"}},{key:"add",value:function(e){var t=this._obj;1!==t[e]&&(t[e]=1,this.size++)}},{key:"delete",value:function(e){var t=this._obj;1===t[e]&&(t[e]=0,this.size--)}},{key:"clear",value:function(){this._obj=Object.create(null)}},{key:"has",value:function(e){return 1===this._obj[e]}},{key:"toArray",value:function(){var e=this;return Object.keys(this._obj).filter(function(t){return e.has(t)})}},{key:"forEach",value:function(e,t){return this.toArray().forEach(e,t)}}])}(),yt="undefined"!==("undefined"==typeof Set?"undefined":d(Set))?Set:gt,mt=function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(void 0!==e&&void 0!==t&&re(e)){var r=t.group;if(null==r&&(r=t.data&&null!=t.data.source&&null!=t.data.target?"edges":"nodes"),"nodes"===r||"edges"===r){this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:r,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:void 0===t.selectable||!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:void 0===t.grabbable||!!t.grabbable,pannable:void 0===t.pannable?"edges"===r:!!t.pannable,active:!1,classes:new yt,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(null==a.position.x&&(a.position.x=0),null==a.position.y&&(a.position.y=0),t.renderedPosition){var i=t.renderedPosition,o=e.pan(),s=e.zoom();a.position={x:(i.x-o.x)/s,y:(i.y-o.y)/s}}var l=[];Z(t.classes)?l=t.classes:K(t.classes)&&(l=t.classes.split(/\s+/));for(var u=0,c=l.length;u<c;u++){var d=l[u];d&&""!==d&&a.classes.add(d)}this.createEmitter(),(void 0===n||n)&&this.restore();var h=t.style||t.css;h&&(it("Setting a `style` bypass at element creation should be done only when absolutely necessary. Try to use the stylesheet instead."),this.style(h))}else rt("An element must be of type `nodes` or `edges`; you specified `"+r+"`")}else rt("An element must have a core reference and parameters set")},bt=function(e){return e={bfs:e.bfs||!e.dfs,dfs:e.dfs||!e.bfs},function(t,n,r){var a;$(t)&&!ee(t)&&(t=(a=t).roots||a.root,n=a.visit,r=a.directed),r=2!==arguments.length||G(n)?r:n,n=G(n)?n:function(){};for(var i,o=this._private.cy,s=t=K(t)?this.filter(t):t,l=[],u=[],c={},d={},h={},f=0,p=this.byGroup(),v=p.nodes,g=p.edges,y=0;y<s.length;y++){var m=s[y],b=m.id();m.isNode()&&(l.unshift(m),e.bfs&&(h[b]=!0,u.push(m)),d[b]=0)}for(var x,w=function(){var t=e.bfs?l.shift():l.pop(),a=t.id();if(e.dfs){if(h[a])return 0;h[a]=!0,u.push(t)}var o,s=d[a],p=c[a],y=null!=p?p.source():null,m=null!=p?p.target():null,b=null==p?void 0:t.same(y)?m[0]:y[0];if(!0===(o=n(t,p,b,f++,s)))return i=t,1;if(!1===o)return 1;for(var x=t.connectedEdges().filter(function(e){return(!r||e.source().same(t))&&g.has(e)}),w=0;w<x.length;w++){var E=x[w],k=E.connectedNodes().filter(function(e){return!e.same(t)&&v.has(e)}),T=k.id();0===k.length||h[T]||(k=k[0],l.push(k),e.bfs&&(h[T]=!0,u.push(k)),c[T]=E,d[T]=d[a]+1)}};0!==l.length&&(0===(x=w())||1!==x););for(var E=o.collection(),k=0;k<u.length;k++){var T=u[k],C=c[T.id()];null!=C&&E.push(C),E.push(T)}return{path:o.collection(E),found:o.collection(i)}}},xt={breadthFirstSearch:bt({bfs:!0}),depthFirstSearch:bt({dfs:!0})};xt.bfs=xt.breadthFirstSearch,xt.dfs=xt.depthFirstSearch;var wt,Et,kt,Tt={exports:{}},Ct=Tt.exports;function Pt(){return wt||(wt=1,e=Tt,function(){var t,n,r,a,i,o,s,l,u,c,d,h,f,p,v;r=Math.floor,c=Math.min,n=function(e,t){return e<t?-1:e>t?1:0},u=function(e,t,a,i,o){var s;if(null==a&&(a=0),null==o&&(o=n),a<0)throw new Error("lo must be non-negative");for(null==i&&(i=e.length);a<i;)o(t,e[s=r((a+i)/2)])<0?i=s:a=s+1;return[].splice.apply(e,[a,a-a].concat(t)),t},o=function(e,t,r){return null==r&&(r=n),e.push(t),p(e,0,e.length-1,r)},i=function(e,t){var r,a;return null==t&&(t=n),r=e.pop(),e.length?(a=e[0],e[0]=r,v(e,0,t)):a=r,a},l=function(e,t,r){var a;return null==r&&(r=n),a=e[0],e[0]=t,v(e,0,r),a},s=function(e,t,r){var a;return null==r&&(r=n),e.length&&r(e[0],t)<0&&(t=(a=[e[0],t])[0],e[0]=a[1],v(e,0,r)),t},a=function(e,t){var a,i,o,s,l,u;for(null==t&&(t=n),l=[],i=0,o=(s=function(){u=[];for(var t=0,n=r(e.length/2);0<=n?t<n:t>n;0<=n?t++:t--)u.push(t);return u}.apply(this).reverse()).length;i<o;i++)a=s[i],l.push(v(e,a,t));return l},f=function(e,t,r){var a;if(null==r&&(r=n),-1!==(a=e.indexOf(t)))return p(e,0,a,r),v(e,a,r)},d=function(e,t,r){var i,o,l,u,c;if(null==r&&(r=n),!(o=e.slice(0,t)).length)return o;for(a(o,r),l=0,u=(c=e.slice(t)).length;l<u;l++)i=c[l],s(o,i,r);return o.sort(r).reverse()},h=function(e,t,r){var o,s,l,d,h,f,p,v,g;if(null==r&&(r=n),10*t<=e.length){if(!(l=e.slice(0,t).sort(r)).length)return l;for(s=l[l.length-1],d=0,f=(p=e.slice(t)).length;d<f;d++)r(o=p[d],s)<0&&(u(l,o,0,null,r),l.pop(),s=l[l.length-1]);return l}for(a(e,r),g=[],h=0,v=c(t,e.length);0<=v?h<v:h>v;0<=v?++h:--h)g.push(i(e,r));return g},p=function(e,t,r,a){var i,o,s;for(null==a&&(a=n),i=e[r];r>t&&a(i,o=e[s=r-1>>1])<0;)e[r]=o,r=s;return e[r]=i},v=function(e,t,r){var a,i,o,s,l;for(null==r&&(r=n),i=e.length,l=t,o=e[t],a=2*t+1;a<i;)(s=a+1)<i&&!(r(e[a],e[s])<0)&&(a=s),e[t]=e[a],a=2*(t=a)+1;return e[t]=o,p(e,l,t,r)},t=function(){function e(e){this.cmp=null!=e?e:n,this.nodes=[]}return e.push=o,e.pop=i,e.replace=l,e.pushpop=s,e.heapify=a,e.updateItem=f,e.nlargest=d,e.nsmallest=h,e.prototype.push=function(e){return o(this.nodes,e,this.cmp)},e.prototype.pop=function(){return i(this.nodes,this.cmp)},e.prototype.peek=function(){return this.nodes[0]},e.prototype.contains=function(e){return-1!==this.nodes.indexOf(e)},e.prototype.replace=function(e){return l(this.nodes,e,this.cmp)},e.prototype.pushpop=function(e){return s(this.nodes,e,this.cmp)},e.prototype.heapify=function(){return a(this.nodes,this.cmp)},e.prototype.updateItem=function(e){return f(this.nodes,e,this.cmp)},e.prototype.clear=function(){return this.nodes=[]},e.prototype.empty=function(){return 0===this.nodes.length},e.prototype.size=function(){return this.nodes.length},e.prototype.clone=function(){var t;return(t=new e).nodes=this.nodes.slice(0),t},e.prototype.toArray=function(){return this.nodes.slice(0)},e.prototype.insert=e.prototype.push,e.prototype.top=e.prototype.peek,e.prototype.front=e.prototype.peek,e.prototype.has=e.prototype.contains,e.prototype.copy=e.prototype.clone,e}(),e.exports=t}.call(Ct)),Tt.exports;var e}var St,Bt=Ce(kt?Et:(kt=1,Et=Pt())),Dt=ct({root:null,weight:function(e){return 1},directed:!1}),_t={dijkstra:function(e){if(!$(e)){var t=arguments;e={root:t[0],weight:t[1],directed:t[2]}}var n=Dt(e),r=n.root,a=n.weight,i=n.directed,o=this,s=a,l=K(r)?this.filter(r)[0]:r[0],u={},c={},d={},h=this.byGroup(),f=h.nodes,p=h.edges;p.unmergeBy(function(e){return e.isLoop()});for(var v=function(e){return u[e.id()]},g=function(e,t){u[e.id()]=t,y.updateItem(e)},y=new Bt(function(e,t){return v(e)-v(t)}),m=0;m<f.length;m++){var b=f[m];u[b.id()]=b.same(l)?0:1/0,y.push(b)}for(var x=function(e,t){for(var n,r=(i?e.edgesTo(t):e.edgesWith(t)).intersect(p),a=1/0,o=0;o<r.length;o++){var l=r[o],u=s(l);(u<a||!n)&&(a=u,n=l)}return{edge:n,dist:a}};y.size()>0;){var w=y.pop(),E=v(w),k=w.id();if(d[k]=E,E!==1/0)for(var T=w.neighborhood().intersect(f),C=0;C<T.length;C++){var P=T[C],S=P.id(),B=x(w,P),D=E+B.dist;D<v(P)&&(g(P,D),c[S]={node:w,edge:B.edge})}}return{distanceTo:function(e){var t=K(e)?f.filter(e)[0]:e[0];return d[t.id()]},pathTo:function(e){var t=K(e)?f.filter(e)[0]:e[0],n=[],r=t,a=r.id();if(t.length>0)for(n.unshift(t);c[a];){var i=c[a];n.unshift(i.edge),n.unshift(i.node),a=(r=i.node).id()}return o.spawn(n)}}}},At={kruskal:function(e){e=e||function(e){return 1};for(var t=this.byGroup(),n=t.nodes,r=t.edges,a=n.length,i=new Array(a),o=n,s=function(e){for(var t=0;t<i.length;t++){if(i[t].has(e))return t}},l=0;l<a;l++)i[l]=this.spawn(n[l]);for(var u=r.sort(function(t,n){return e(t)-e(n)}),c=0;c<u.length;c++){var d=u[c],h=d.source()[0],f=d.target()[0],p=s(h),v=s(f),g=i[p],y=i[v];p!==v&&(o.merge(d),g.merge(y),i.splice(v,1))}return o}},Mt=ct({root:null,goal:null,weight:function(e){return 1},heuristic:function(e){return 0},directed:!1}),Rt={aStar:function(e){var t=this.cy(),n=Mt(e),r=n.root,a=n.goal,i=n.heuristic,o=n.directed,s=n.weight;r=t.collection(r)[0],a=t.collection(a)[0];var l,u,c=r.id(),d=a.id(),h={},f={},p={},v=new Bt(function(e,t){return f[e.id()]-f[t.id()]}),g=new yt,y={},m={},b=function(e,t){v.push(e),g.add(t)},x=function(){l=v.pop(),u=l.id(),g.delete(u)},w=function(e){return g.has(e)};b(r,c),h[c]=0,f[c]=i(r);for(var E=0;v.size()>0;){if(x(),E++,u===d){for(var k=[],T=a,C=d,P=m[C];k.unshift(T),null!=P&&k.unshift(P),null!=(T=y[C]);)P=m[C=T.id()];return{found:!0,distance:h[u],path:this.spawn(k),steps:E}}p[u]=!0;for(var S=l._private.edges,B=0;B<S.length;B++){var D=S[B];if(this.hasElementWithId(D.id())&&(!o||D.data("source")===u)){var _=D.source(),A=D.target(),M=_.id()!==u?_:A,R=M.id();if(this.hasElementWithId(R)&&!p[R]){var I=h[u]+s(D);w(R)?I<h[R]&&(h[R]=I,f[R]=I+i(M),y[R]=l,m[R]=D):(h[R]=I,f[R]=I+i(M),b(M,R),y[R]=l,m[R]=D)}}}}return{found:!1,distance:void 0,path:void 0,steps:E}}},It=ct({weight:function(e){return 1},directed:!1}),Nt={floydWarshall:function(e){for(var t=this.cy(),n=It(e),r=n.weight,a=n.directed,i=r,o=this.byGroup(),s=o.nodes,l=o.edges,u=s.length,c=u*u,d=function(e){return s.indexOf(e)},h=function(e){return s[e]},f=new Array(c),p=0;p<c;p++){var v=p%u,g=(p-v)/u;f[p]=g===v?0:1/0}for(var y=new Array(c),m=new Array(c),b=0;b<l.length;b++){var x=l[b],w=x.source()[0],E=x.target()[0];if(w!==E){var k=d(w),T=d(E),C=k*u+T,P=i(x);if(f[C]>P&&(f[C]=P,y[C]=T,m[C]=x),!a){var S=T*u+k;!a&&f[S]>P&&(f[S]=P,y[S]=k,m[S]=x)}}}for(var B=0;B<u;B++)for(var D=0;D<u;D++)for(var _=D*u+B,A=0;A<u;A++){var M=D*u+A,R=B*u+A;f[_]+f[R]<f[M]&&(f[M]=f[_]+f[R],y[M]=y[_])}var I=function(e){return d(function(e){return(K(e)?t.filter(e):e)[0]}(e))},N={distance:function(e,t){var n=I(e),r=I(t);return f[n*u+r]},path:function(e,n){var r=I(e),a=I(n),i=h(r);if(r===a)return i.collection();if(null==y[r*u+a])return t.collection();var o,s=t.collection(),l=r;for(s.merge(i);r!==a;)l=r,r=y[r*u+a],o=m[l*u+r],s.merge(o),s.merge(h(r));return s}};return N}},Lt=ct({weight:function(e){return 1},directed:!1,root:null}),zt={bellmanFord:function(e){var t=this,n=Lt(e),r=n.weight,a=n.directed,i=n.root,o=r,s=this,l=this.cy(),u=this.byGroup(),c=u.edges,d=u.nodes,h=d.length,f=new vt,p=!1,v=[];i=l.collection(i)[0],c.unmergeBy(function(e){return e.isLoop()});for(var g=c.length,y=function(e){var t=f.get(e.id());return t||(t={},f.set(e.id(),t)),t},m=function(e){return(K(e)?l.$(e):e)[0]},b=0;b<h;b++){var x=d[b],w=y(x);x.same(i)?w.dist=0:w.dist=1/0,w.pred=null,w.edge=null}for(var E=!1,k=function(e,t,n,r,a,i){var o=r.dist+i;o<a.dist&&!n.same(r.edge)&&(a.dist=o,a.pred=e,a.edge=n,E=!0)},T=1;T<h;T++){E=!1;for(var C=0;C<g;C++){var P=c[C],S=P.source(),B=P.target(),D=o(P),_=y(S),A=y(B);k(S,0,P,_,A,D),a||k(B,0,P,A,_,D)}if(!E)break}if(E)for(var M=[],R=0;R<g;R++){var I=c[R],N=I.source(),L=I.target(),z=o(I),O=y(N).dist,V=y(L).dist;if(O+z<V||!a&&V+z<O){if(p||(it("Graph contains a negative weight cycle for Bellman-Ford"),p=!0),!1===e.findNegativeWeightCycles)break;var F=[];O+z<V&&F.push(N),!a&&V+z<O&&F.push(L);for(var j=F.length,X=0;X<j;X++){var q=F[X],Y=[q];Y.push(y(q).edge);for(var W=y(q).pred;-1===Y.indexOf(W);)Y.push(W),Y.push(y(W).edge),W=y(W).pred;for(var U=(Y=Y.slice(Y.indexOf(W)))[0].id(),H=0,G=2;G<Y.length;G+=2)Y[G].id()<U&&(U=Y[G].id(),H=G);(Y=Y.slice(H).concat(Y.slice(0,H))).push(Y[0]);var Z=Y.map(function(e){return e.id()}).join(",");-1===M.indexOf(Z)&&(v.push(s.spawn(Y)),M.push(Z))}}}return{distanceTo:function(e){return y(m(e)).dist},pathTo:function(e){for(var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:i,r=[],a=m(e);;){if(null==a)return t.spawn();var o=y(a),l=o.edge,u=o.pred;if(r.unshift(a[0]),a.same(n)&&r.length>0)break;null!=l&&r.unshift(l),a=u}return s.spawn(r)},hasNegativeWeightCycle:p,negativeWeightCycles:v}}},Ot=Math.sqrt(2),Vt=function(e,t,n){0===n.length&&rt("Karger-Stein must be run on a connected (sub)graph");for(var r=n[e],a=r[1],i=r[2],o=t[a],s=t[i],l=n,u=l.length-1;u>=0;u--){var c=l[u],d=c[1],h=c[2];(t[d]===o&&t[h]===s||t[d]===s&&t[h]===o)&&l.splice(u,1)}for(var f=0;f<l.length;f++){var p=l[f];p[1]===s?(l[f]=p.slice(),l[f][1]=o):p[2]===s&&(l[f]=p.slice(),l[f][2]=o)}for(var v=0;v<t.length;v++)t[v]===s&&(t[v]=o);return l},Ft=function(e,t,n,r){for(;n>r;){var a=Math.floor(Math.random()*t.length);t=Vt(a,e,t),n--}return t},jt={kargerStein:function(){var e=this,t=this.byGroup(),n=t.nodes,r=t.edges;r.unmergeBy(function(e){return e.isLoop()});var a=n.length,i=r.length,o=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),s=Math.floor(a/Ot);if(!(a<2)){for(var l=[],u=0;u<i;u++){var c=r[u];l.push([u,n.indexOf(c.source()),n.indexOf(c.target())])}for(var d=1/0,h=[],f=new Array(a),p=new Array(a),v=new Array(a),g=function(e,t){for(var n=0;n<a;n++)t[n]=e[n]},y=0;y<=o;y++){for(var m=0;m<a;m++)p[m]=m;var b=Ft(p,l.slice(),a,s),x=b.slice();g(p,v);var w=Ft(p,b,s,2),E=Ft(v,x,s,2);w.length<=E.length&&w.length<d?(d=w.length,h=w,g(p,f)):E.length<=w.length&&E.length<d&&(d=E.length,h=E,g(v,f))}for(var k=this.spawn(h.map(function(e){return r[e[0]]})),T=this.spawn(),C=this.spawn(),P=f[0],S=0;S<f.length;S++){var B=f[S],D=n[S];B===P?T.merge(D):C.merge(D)}var _=function(t){var n=e.spawn();return t.forEach(function(t){n.merge(t),t.connectedEdges().forEach(function(t){e.contains(t)&&!k.contains(t)&&n.merge(t)})}),n},A=[_(T),_(C)];return{cut:k,components:A,partition1:T,partition2:C}}rt("At least 2 nodes are required for Karger-Stein algorithm")}},Xt=function(e,t,n){return{x:e.x*t+n.x,y:e.y*t+n.y}},qt=function(e,t,n){return{x:(e.x-n.x)/t,y:(e.y-n.y)/t}},Yt=function(e){return{x:e[0],y:e[1]}},Wt=function(e,t){return Math.atan2(t,e)-Math.PI/2},Ut=Math.log2||function(e){return Math.log(e)/Math.log(2)},Ht=function(e){return e>0?1:e<0?-1:0},Kt=function(e,t){return Math.sqrt(Gt(e,t))},Gt=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},Zt=function(e){for(var t=e.length,n=0,r=0;r<t;r++)n+=e[r];for(var a=0;a<t;a++)e[a]=e[a]/n;return e},$t=function(e,t,n,r){return(1-r)*(1-r)*e+2*(1-r)*r*t+r*r*n},Qt=function(e,t,n,r){return{x:$t(e.x,t.x,n.x,r),y:$t(e.y,t.y,n.y,r)}},Jt=function(e,t,n){return Math.max(e,Math.min(n,t))},en=function(e){if(null==e)return{x1:1/0,y1:1/0,x2:-1/0,y2:-1/0,w:0,h:0};if(null!=e.x1&&null!=e.y1){if(null!=e.x2&&null!=e.y2&&e.x2>=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},tn=function(e,t){e.x1=Math.min(e.x1,t.x1),e.x2=Math.max(e.x2,t.x2),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,t.y1),e.y2=Math.max(e.y2,t.y2),e.h=e.y2-e.y1},nn=function(e,t,n){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},rn=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},an=function(e){var t,n,r,a,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0];if(1===i.length)t=n=r=a=i[0];else if(2===i.length)t=r=i[0],a=n=i[1];else if(4===i.length){var o=l(i,4);t=o[0],n=o[1],r=o[2],a=o[3]}return e.x1-=a,e.x2+=n,e.y1-=t,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},on=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},sn=function(e,t){return!(e.x1>t.x2)&&(!(t.x1>e.x2)&&(!(e.x2<t.x1)&&(!(t.x2<e.x1)&&(!(e.y2<t.y1)&&(!(t.y2<e.y1)&&(!(e.y1>t.y2)&&!(t.y1>e.y2)))))))},ln=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},un=function(e,t){return ln(e,t.x,t.y)},cn=function(e,t){return ln(e,t.x1,t.y1)&&ln(e,t.x2,t.y2)},dn=null!==(St=Math.hypot)&&void 0!==St?St:function(e,t){return Math.sqrt(e*e+t*t)};function hn(e,t,n,r,a,i){var o=function(e,t){if(e.length<3)throw new Error("Need at least 3 vertices");var n=function(e,t){return{x:e.x+t.x,y:e.y+t.y}},r=function(e,t){return{x:e.x-t.x,y:e.y-t.y}},a=function(e,t){return{x:e.x*t,y:e.y*t}},i=function(e,t){return e.x*t.y-e.y*t.x},o=function(e){var t=dn(e.x,e.y);return 0===t?{x:0,y:0}:{x:e.x/t,y:e.y/t}},s=function(e,t,o,s){var l=r(t,e),u=r(s,o),c=i(l,u);if(Math.abs(c)<1e-9)return n(e,a(l,.5));var d=i(r(o,e),u)/c;return n(e,a(l,d))},l=e.map(function(e){return{x:e.x,y:e.y}});(function(e){for(var t=0,n=0;n<e.length;n++){var r=e[n],a=e[(n+1)%e.length];t+=r.x*a.y-a.x*r.y}return t/2})(l)<0&&l.reverse();for(var u=l.length,c=[],d=0;d<u;d++){var h=l[d],f=l[(d+1)%u],p=r(f,h),v=o({x:p.y,y:-p.x});c.push(v)}for(var g=c.map(function(e,r){return{p1:n(l[r],a(e,t)),p2:n(l[(r+1)%u],a(e,t))}}),y=[],m=0;m<u;m++){var b=g[(m-1+u)%u],x=g[m],w=s(b.p1,b.p2,x.p1,x.p2);y.push(w)}return y}(Pn(e,t,n,r,a),i),s=en();return o.forEach(function(e){return nn(s,e.x,e.y)}),s}var fn=function(e,t,n,r,a,i,o){var s,l,u=arguments.length>7&&void 0!==arguments[7]?arguments[7]:"auto",c="auto"===u?Mn(a,i):u,d=a/2,h=i/2,f=(c=Math.min(c,d,h))!==d,p=c!==h;if(f){var v=r-h-o;if((s=Cn(e,t,n,r,n-d+c-o,v,n+d-c+o,v,!1)).length>0)return s}if(p){var g=n+d+o;if((s=Cn(e,t,n,r,g,r-h+c-o,g,r+h-c+o,!1)).length>0)return s}if(f){var y=r+h+o;if((s=Cn(e,t,n,r,n-d+c-o,y,n+d-c+o,y,!1)).length>0)return s}if(p){var m=n-d-o;if((s=Cn(e,t,n,r,m,r-h+c-o,m,r+h-c+o,!1)).length>0)return s}var b=n-d+c,x=r-h+c;if((l=kn(e,t,n,r,b,x,c+o)).length>0&&l[0]<=b&&l[1]<=x)return[l[0],l[1]];var w=n+d-c,E=r-h+c;if((l=kn(e,t,n,r,w,E,c+o)).length>0&&l[0]>=w&&l[1]<=E)return[l[0],l[1]];var k=n+d-c,T=r+h-c;if((l=kn(e,t,n,r,k,T,c+o)).length>0&&l[0]>=k&&l[1]>=T)return[l[0],l[1]];var C=n-d+c,P=r+h-c;return(l=kn(e,t,n,r,C,P,c+o)).length>0&&l[0]<=C&&l[1]>=P?[l[0],l[1]]:[]},pn=function(e,t,n,r,a,i,o){var s=o,l=Math.min(n,a),u=Math.max(n,a),c=Math.min(r,i),d=Math.max(r,i);return l-s<=e&&e<=u+s&&c-s<=t&&t<=d+s},vn=function(e,t,n,r,a,i,o,s,l){var u=Math.min(n,o,a)-l,c=Math.max(n,o,a)+l,d=Math.min(r,s,i)-l,h=Math.max(r,s,i)+l;return!(e<u||e>c||t<d||t>h)},gn=function(e,t,n,r,a,i,o,s){var l=[];!function(e,t,n,r,a){var i,o,s,l,u,c,d,h;0===e&&(e=1e-5),s=-27*(r/=e)+(t/=e)*(9*(n/=e)-t*t*2),i=(o=(3*n-t*t)/9)*o*o+(s/=54)*s,a[1]=0,d=t/3,i>0?(u=(u=s+Math.sqrt(i))<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=(c=s-Math.sqrt(i))<0?-Math.pow(-c,1/3):Math.pow(c,1/3),a[0]=-d+u+c,d+=(u+c)/2,a[4]=a[2]=-d,d=Math.sqrt(3)*(-c+u)/2,a[3]=d,a[5]=-d):(a[5]=a[3]=0,0===i?(h=s<0?-Math.pow(-s,1/3):Math.pow(s,1/3),a[0]=2*h-d,a[4]=a[2]=-(h+d)):(l=(o=-o)*o*o,l=Math.acos(s/Math.sqrt(l)),h=2*Math.sqrt(o),a[0]=-d+h*Math.cos(l/3),a[2]=-d+h*Math.cos((l+2*Math.PI)/3),a[4]=-d+h*Math.cos((l+4*Math.PI)/3)))}(1*n*n-4*n*a+2*n*o+4*a*a-4*a*o+o*o+r*r-4*r*i+2*r*s+4*i*i-4*i*s+s*s,9*n*a-3*n*n-3*n*o-6*a*a+3*a*o+9*r*i-3*r*r-3*r*s-6*i*i+3*i*s,3*n*n-6*n*a+n*o-n*e+2*a*a+2*a*e-o*e+3*r*r-6*r*i+r*s-r*t+2*i*i+2*i*t-s*t,1*n*a-n*n+n*e-a*e+r*i-r*r+r*t-i*t,l);for(var u=[],c=0;c<6;c+=2)Math.abs(l[c+1])<1e-7&&l[c]>=0&&l[c]<=1&&u.push(l[c]);u.push(1),u.push(0);for(var d,h,f,p=-1,v=0;v<u.length;v++)d=Math.pow(1-u[v],2)*n+2*(1-u[v])*u[v]*a+u[v]*u[v]*o,h=Math.pow(1-u[v],2)*r+2*(1-u[v])*u[v]*i+u[v]*u[v]*s,f=Math.pow(d-e,2)+Math.pow(h-t,2),p>=0?f<p&&(p=f):p=f;return p},yn=function(e,t,n,r,a,i){var o=[e-n,t-r],s=[a-n,i-r],l=s[0]*s[0]+s[1]*s[1],u=o[0]*o[0]+o[1]*o[1],c=o[0]*s[0]+o[1]*s[1],d=c*c/l;return c<0?u:d>l?(e-a)*(e-a)+(t-i)*(t-i):u-d},mn=function(e,t,n){for(var r,a,i,o,s=0,l=0;l<n.length/2;l++)if(r=n[2*l],a=n[2*l+1],l+1<n.length/2?(i=n[2*(l+1)],o=n[2*(l+1)+1]):(i=n[2*(l+1-n.length/2)],o=n[2*(l+1-n.length/2)+1]),r==e&&i==e);else{if(!(r>=e&&e>=i||r<=e&&e<=i))continue;(e-r)/(i-r)*(o-a)+a>t&&s++}return s%2!=0},bn=function(e,t,n,r,a,i,o,s,l){var u,c=new Array(n.length);null!=s[0]?(u=Math.atan(s[1]/s[0]),s[0]<0?u+=Math.PI/2:u=-u-Math.PI/2):u=s;for(var d,h=Math.cos(-u),f=Math.sin(-u),p=0;p<c.length/2;p++)c[2*p]=i/2*(n[2*p]*h-n[2*p+1]*f),c[2*p+1]=o/2*(n[2*p+1]*h+n[2*p]*f),c[2*p]+=r,c[2*p+1]+=a;if(l>0){var v=wn(c,-l);d=xn(v)}else d=c;return mn(e,t,d)},xn=function(e){for(var t,n,r,a,i,o,s,l,u=new Array(e.length/2),c=0;c<e.length/4;c++){t=e[4*c],n=e[4*c+1],r=e[4*c+2],a=e[4*c+3],c<e.length/4-1?(i=e[4*(c+1)],o=e[4*(c+1)+1],s=e[4*(c+1)+2],l=e[4*(c+1)+3]):(i=e[0],o=e[1],s=e[2],l=e[3]);var d=Cn(t,n,r,a,i,o,s,l,!0);u[2*c]=d[0],u[2*c+1]=d[1]}return u},wn=function(e,t){for(var n,r,a,i,o=new Array(2*e.length),s=0;s<e.length/2;s++){n=e[2*s],r=e[2*s+1],s<e.length/2-1?(a=e[2*(s+1)],i=e[2*(s+1)+1]):(a=e[0],i=e[1]);var l=i-r,u=-(a-n),c=Math.sqrt(l*l+u*u),d=l/c,h=u/c;o[4*s]=n+d*t,o[4*s+1]=r+h*t,o[4*s+2]=a+d*t,o[4*s+3]=i+h*t}return o},En=function(e,t,n,r,a,i,o){return e-=a,t-=i,(e/=n/2+o)*e+(t/=r/2+o)*t<=1},kn=function(e,t,n,r,a,i,o){var s=[n-e,r-t],l=[e-a,t-i],u=s[0]*s[0]+s[1]*s[1],c=2*(l[0]*s[0]+l[1]*s[1]),d=c*c-4*u*(l[0]*l[0]+l[1]*l[1]-o*o);if(d<0)return[];var h=(-c+Math.sqrt(d))/(2*u),f=(-c-Math.sqrt(d))/(2*u),p=Math.min(h,f),v=Math.max(h,f),g=[];if(p>=0&&p<=1&&g.push(p),v>=0&&v<=1&&g.push(v),0===g.length)return[];var y=g[0]*s[0]+e,m=g[0]*s[1]+t;return g.length>1?g[0]==g[1]?[y,m]:[y,m,g[1]*s[0]+e,g[1]*s[1]+t]:[y,m]},Tn=function(e,t,n){return t<=e&&e<=n||n<=e&&e<=t?e:e<=t&&t<=n||n<=t&&t<=e?t:n},Cn=function(e,t,n,r,a,i,o,s,l){var u=e-a,c=n-e,d=o-a,h=t-i,f=r-t,p=s-i,v=d*h-p*u,g=c*h-f*u,y=p*c-d*f;if(0!==y){var m=v/y,b=g/y,x=-.001;return x<=m&&m<=1.001&&x<=b&&b<=1.001||l?[e+m*c,t+m*f]:[]}return 0===v||0===g?Tn(e,n,o)===o?[o,s]:Tn(e,n,a)===a?[a,i]:Tn(a,o,n)===n?[n,r]:[]:[]},Pn=function(e,t,n,r,a){var i=[],o=r/2,s=a/2,l=t,u=n;i.push({x:l+o*e[0],y:u+s*e[1]});for(var c=1;c<e.length/2;c++)i.push({x:l+o*e[2*c],y:u+s*e[2*c+1]});return i},Sn=function(e,t,n,r,a,i,o,s){var l,u,c,d,h,f,p=[],v=new Array(n.length),g=!0;if(null==i&&(g=!1),g){for(var y=0;y<v.length/2;y++)v[2*y]=n[2*y]*i+r,v[2*y+1]=n[2*y+1]*o+a;if(s>0){var m=wn(v,-s);u=xn(m)}else u=v}else u=n;for(var b=0;b<u.length/2;b++)c=u[2*b],d=u[2*b+1],b<u.length/2-1?(h=u[2*(b+1)],f=u[2*(b+1)+1]):(h=u[0],f=u[1]),0!==(l=Cn(e,t,r,a,c,d,h,f)).length&&p.push(l[0],l[1]);return p},Bn=function(e,t,n){var r=[e[0]-t[0],e[1]-t[1]],a=Math.sqrt(r[0]*r[0]+r[1]*r[1]),i=(a-n)/a;return i<0&&(i=1e-5),[t[0]+i*r[0],t[1]+i*r[1]]},Dn=function(e,t){var n=An(e,t);return n=_n(n)},_n=function(e){for(var t,n,r=e.length/2,a=1/0,i=1/0,o=-1/0,s=-1/0,l=0;l<r;l++)t=e[2*l],n=e[2*l+1],a=Math.min(a,t),o=Math.max(o,t),i=Math.min(i,n),s=Math.max(s,n);for(var u=2/(o-a),c=2/(s-i),d=0;d<r;d++)t=e[2*d]=e[2*d]*u,n=e[2*d+1]=e[2*d+1]*c,a=Math.min(a,t),o=Math.max(o,t),i=Math.min(i,n),s=Math.max(s,n);if(i<-1)for(var h=0;h<r;h++)n=e[2*h+1]=e[2*h+1]+(-1-i);return e},An=function(e,t){var n=1/e*2*Math.PI,r=e%2==0?Math.PI/2+n/2:Math.PI/2;r+=t;for(var a,i=new Array(2*e),o=0;o<e;o++)a=o*n+r,i[2*o]=Math.cos(a),i[2*o+1]=Math.sin(-a);return i},Mn=function(e,t){return Math.min(e/4,t/4,8)},Rn=function(e,t){return Math.min(e/10,t/10,8)},In=function(e,t){return{heightOffset:Math.min(15,.05*t),widthOffset:Math.min(100,.25*e),ctrlPtOffsetPct:.05}};function Nn(e,t){function n(e){for(var t=[],n=0;n<e.length;n++){var r=e[n],a=e[(n+1)%e.length],i={x:a.x-r.x,y:a.y-r.y},o={x:-i.y,y:i.x},s=Math.sqrt(o.x*o.x+o.y*o.y);t.push({x:o.x/s,y:o.y/s})}return t}function r(e,t){var n,r=1/0,a=-1/0,i=o(e);try{for(i.s();!(n=i.n()).done;){var s=n.value,l=s.x*t.x+s.y*t.y;r=Math.min(r,l),a=Math.max(a,l)}}catch(u){i.e(u)}finally{i.f()}return{min:r,max:a}}function a(e,t){return!(e.max<t.min||t.max<e.min)}var i,s=o([].concat(u(n(e)),u(n(t))));try{for(s.s();!(i=s.n()).done;){var l=i.value;if(!a(r(e,l),r(t,l)))return!1}}catch(c){s.e(c)}finally{s.f()}return!0}var Ln=ct({dampingFactor:.8,precision:1e-6,iterations:200,weight:function(e){return 1}}),zn={pageRank:function(e){for(var t=Ln(e),n=t.dampingFactor,r=t.precision,a=t.iterations,i=t.weight,o=this._private.cy,s=this.byGroup(),l=s.nodes,u=s.edges,c=l.length,d=c*c,h=u.length,f=new Array(d),p=new Array(c),v=(1-n)/c,g=0;g<c;g++){for(var y=0;y<c;y++){f[g*c+y]=0}p[g]=0}for(var m=0;m<h;m++){var b=u[m],x=b.data("source"),w=b.data("target");if(x!==w){var E=l.indexOfId(x),k=l.indexOfId(w),T=i(b);f[k*c+E]+=T,p[E]+=T}}for(var C=1/c+v,P=0;P<c;P++)if(0===p[P])for(var S=0;S<c;S++){f[S*c+P]=C}else for(var B=0;B<c;B++){var D=B*c+P;f[D]=f[D]/p[P]+v}for(var _,A=new Array(c),M=new Array(c),R=0;R<c;R++)A[R]=1;for(var I=0;I<a;I++){for(var N=0;N<c;N++)M[N]=0;for(var L=0;L<c;L++)for(var z=0;z<c;z++){var O=L*c+z;M[L]+=f[O]*A[z]}Zt(M),_=A,A=M,M=_;for(var V=0,F=0;F<c;F++){var j=_[F]-A[F];V+=j*j}if(V<r)break}return{rank:function(e){return e=o.collection(e)[0],A[l.indexOf(e)]}}}},On=ct({root:null,weight:function(e){return 1},directed:!1,alpha:0}),Vn={degreeCentralityNormalized:function(e){e=On(e);var t=this.cy(),n=this.nodes(),r=n.length;if(e.directed){for(var a={},i={},o=0,s=0,l=0;l<r;l++){var u=n[l],c=u.id();e.root=u;var d=this.degreeCentrality(e);o<d.indegree&&(o=d.indegree),s<d.outdegree&&(s=d.outdegree),a[c]=d.indegree,i[c]=d.outdegree}return{indegree:function(e){return 0==o?0:(K(e)&&(e=t.filter(e)),a[e.id()]/o)},outdegree:function(e){return 0===s?0:(K(e)&&(e=t.filter(e)),i[e.id()]/s)}}}for(var h={},f=0,p=0;p<r;p++){var v=n[p];e.root=v;var g=this.degreeCentrality(e);f<g.degree&&(f=g.degree),h[v.id()]=g.degree}return{degree:function(e){return 0===f?0:(K(e)&&(e=t.filter(e)),h[e.id()]/f)}}},degreeCentrality:function(e){e=On(e);var t=this.cy(),n=this,r=e,a=r.root,i=r.weight,o=r.directed,s=r.alpha;if(a=t.collection(a)[0],o){for(var l=a.connectedEdges(),u=l.filter(function(e){return e.target().same(a)&&n.has(e)}),c=l.filter(function(e){return e.source().same(a)&&n.has(e)}),d=u.length,h=c.length,f=0,p=0,v=0;v<u.length;v++)f+=i(u[v]);for(var g=0;g<c.length;g++)p+=i(c[g]);return{indegree:Math.pow(d,1-s)*Math.pow(f,s),outdegree:Math.pow(h,1-s)*Math.pow(p,s)}}for(var y=a.connectedEdges().intersection(n),m=y.length,b=0,x=0;x<y.length;x++)b+=i(y[x]);return{degree:Math.pow(m,1-s)*Math.pow(b,s)}}};Vn.dc=Vn.degreeCentrality,Vn.dcn=Vn.degreeCentralityNormalised=Vn.degreeCentralityNormalized;var Fn=ct({harmonic:!0,weight:function(){return 1},directed:!1,root:null}),jn={closenessCentralityNormalized:function(e){for(var t=Fn(e),n=t.harmonic,r=t.weight,a=t.directed,i=this.cy(),o={},s=0,l=this.nodes(),u=this.floydWarshall({weight:r,directed:a}),c=0;c<l.length;c++){for(var d=0,h=l[c],f=0;f<l.length;f++)if(c!==f){var p=u.distance(h,l[f]);d+=n?1/p:p}n||(d=1/d),s<d&&(s=d),o[h.id()]=d}return{closeness:function(e){return 0==s?0:(e=K(e)?i.filter(e)[0].id():e.id(),o[e]/s)}}},closenessCentrality:function(e){var t=Fn(e),n=t.root,r=t.weight,a=t.directed,i=t.harmonic;n=this.filter(n)[0];for(var o=this.dijkstra({root:n,weight:r,directed:a}),s=0,l=this.nodes(),u=0;u<l.length;u++){var c=l[u];if(!c.same(n)){var d=o.distanceTo(c);s+=i?1/d:d}}return i?s:1/s}};jn.cc=jn.closenessCentrality,jn.ccn=jn.closenessCentralityNormalised=jn.closenessCentralityNormalized;var Xn=ct({weight:null,directed:!1}),qn={betweennessCentrality:function(e){for(var t=Xn(e),n=t.directed,r=t.weight,a=null!=r,i=this.cy(),o=this.nodes(),s={},l={},u=0,c=function(e,t){l[e]=t,t>u&&(u=t)},d=function(e){return l[e]},h=0;h<o.length;h++){var f=o[h],p=f.id();s[p]=n?f.outgoers().nodes():f.openNeighborhood().nodes(),c(p,0)}for(var v=function(){for(var e=o[g].id(),t=[],n={},l={},u={},h=new Bt(function(e,t){return u[e]-u[t]}),f=0;f<o.length;f++){var p=o[f].id();n[p]=[],l[p]=0,u[p]=1/0}for(l[e]=1,u[e]=0,h.push(e);!h.empty();){var v=h.pop();if(t.push(v),a)for(var y=0;y<s[v].length;y++){var m=s[v][y],b=i.getElementById(v),x=void 0;x=b.edgesTo(m).length>0?b.edgesTo(m)[0]:m.edgesTo(b)[0];var w=r(x);m=m.id(),u[m]>u[v]+w&&(u[m]=u[v]+w,h.nodes.indexOf(m)<0?h.push(m):h.updateItem(m),l[m]=0,n[m]=[]),u[m]==u[v]+w&&(l[m]=l[m]+l[v],n[m].push(v))}else for(var E=0;E<s[v].length;E++){var k=s[v][E].id();u[k]==1/0&&(h.push(k),u[k]=u[v]+1),u[k]==u[v]+1&&(l[k]=l[k]+l[v],n[k].push(v))}}for(var T={},C=0;C<o.length;C++)T[o[C].id()]=0;for(;t.length>0;){for(var P=t.pop(),S=0;S<n[P].length;S++){var B=n[P][S];T[B]=T[B]+l[B]/l[P]*(1+T[P])}P!=o[g].id()&&c(P,d(P)+T[P])}},g=0;g<o.length;g++)v();var y={betweenness:function(e){var t=i.collection(e).id();return d(t)},betweennessNormalized:function(e){if(0==u)return 0;var t=i.collection(e).id();return d(t)/u}};return y.betweennessNormalised=y.betweennessNormalized,y}};qn.bc=qn.betweennessCentrality;var Yn=ct({expandFactor:2,inflateFactor:2,multFactor:1,maxIterations:20,attributes:[function(e){return 1}]}),Wn=function(e,t){for(var n=0,r=0;r<t.length;r++)n+=t[r](e);return n},Un=function(e,t){for(var n,r=0;r<t;r++){n=0;for(var a=0;a<t;a++)n+=e[a*t+r];for(var i=0;i<t;i++)e[i*t+r]=e[i*t+r]/n}},Hn=function(e,t,n){for(var r=new Array(n*n),a=0;a<n;a++){for(var i=0;i<n;i++)r[a*n+i]=0;for(var o=0;o<n;o++)for(var s=0;s<n;s++)r[a*n+s]+=e[a*n+o]*t[o*n+s]}return r},Kn=function(e,t,n){for(var r=e.slice(0),a=1;a<n;a++)e=Hn(e,r,t);return e},Gn=function(e,t,n){for(var r=new Array(t*t),a=0;a<t*t;a++)r[a]=Math.pow(e[a],n);return Un(r,t),r},Zn=function(e,t,n,r){for(var a=0;a<n;a++){if(Math.round(e[a]*Math.pow(10,r))/Math.pow(10,r)!==Math.round(t[a]*Math.pow(10,r))/Math.pow(10,r))return!1}return!0},$n=function(e,t){for(var n=0;n<e.length;n++)if(!t[n]||e[n].id()!==t[n].id())return!1;return!0},Qn=function(e){for(var t=this.nodes(),n=this.edges(),r=this.cy(),a=function(e){return Yn(e)}(e),i={},o=0;o<t.length;o++)i[t[o].id()]=o;for(var s,l=t.length,u=l*l,c=new Array(u),d=0;d<u;d++)c[d]=0;for(var h=0;h<n.length;h++){var f=n[h],p=i[f.source().id()],v=i[f.target().id()],g=Wn(f,a.attributes);c[p*l+v]+=g,c[v*l+p]+=g}!function(e,t,n){for(var r=0;r<t;r++)e[r*t+r]=n}(c,l,a.multFactor),Un(c,l);for(var y=!0,m=0;y&&m<a.maxIterations;)y=!1,s=Kn(c,l,a.expandFactor),c=Gn(s,l,a.inflateFactor),Zn(c,s,u,4)||(y=!0),m++;var b=function(e,t,n,r){for(var a=[],i=0;i<t;i++){for(var o=[],s=0;s<t;s++)Math.round(1e3*e[i*t+s])/1e3>0&&o.push(n[s]);0!==o.length&&a.push(r.collection(o))}return a}(c,l,t,r);return b=function(e){for(var t=0;t<e.length;t++)for(var n=0;n<e.length;n++)t!=n&&$n(e[t],e[n])&&e.splice(n,1);return e}(b),b},Jn={markovClustering:Qn,mcl:Qn},er=function(e){return e},tr=function(e,t){return Math.abs(t-e)},nr=function(e,t,n){return e+tr(t,n)},rr=function(e,t,n){return e+Math.pow(n-t,2)},ar=function(e){return Math.sqrt(e)},ir=function(e,t,n){return Math.max(e,tr(t,n))},or=function(e,t,n,r,a){for(var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:er,o=r,s=0;s<e;s++)o=a(o,t(s),n(s));return i(o)},sr={euclidean:function(e,t,n){return e>=2?or(e,t,n,0,rr,ar):or(e,t,n,0,nr)},squaredEuclidean:function(e,t,n){return or(e,t,n,0,rr)},manhattan:function(e,t,n){return or(e,t,n,0,nr)},max:function(e,t,n){return or(e,t,n,-1/0,ir)}};function lr(e,t,n,r,a,i){var o;return o=G(e)?e:sr[e]||sr.euclidean,0===t&&G(e)?o(a,i):o(t,n,r,a,i)}sr["squared-euclidean"]=sr.squaredEuclidean,sr.squaredeuclidean=sr.squaredEuclidean;var ur=ct({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),cr=function(e){return ur(e)},dr=function(e,t,n,r,a){var i="kMedoids"!==a?function(e){return n[e]}:function(e){return r[e](n)},o=n,s=t;return lr(e,r.length,i,function(e){return r[e](t)},o,s)},hr=function(e,t,n){for(var r=n.length,a=new Array(r),i=new Array(r),o=new Array(t),s=null,l=0;l<r;l++)a[l]=e.min(n[l]).value,i[l]=e.max(n[l]).value;for(var u=0;u<t;u++){s=[];for(var c=0;c<r;c++)s[c]=Math.random()*(i[c]-a[c])+a[c];o[u]=s}return o},fr=function(e,t,n,r,a){for(var i=1/0,o=0,s=0;s<t.length;s++){var l=dr(n,e,t[s],r,a);l<i&&(i=l,o=s)}return o},pr=function(e,t,n){for(var r=[],a=null,i=0;i<t.length;i++)n[(a=t[i]).id()]===e&&r.push(a);return r},vr=function(e,t,n){return Math.abs(t-e)<=n},gr=function(e,t,n){for(var r=0;r<e.length;r++)for(var a=0;a<e[r].length;a++){if(Math.abs(e[r][a]-t[r][a])>n)return!1}return!0},yr=function(e,t,n){for(var r=0;r<n;r++)if(e===t[r])return!0;return!1},mr=function(e,t){var n=new Array(t);if(e.length<50)for(var r=0;r<t;r++){for(var a=e[Math.floor(Math.random()*e.length)];yr(a,n,r);)a=e[Math.floor(Math.random()*e.length)];n[r]=a}else for(var i=0;i<t;i++)n[i]=e[Math.floor(Math.random()*e.length)];return n},br=function(e,t,n){for(var r=0,a=0;a<t.length;a++)r+=dr("manhattan",t[a],e,n,"kMedoids");return r},xr=function(e,t,n,r,a){for(var i,o,s=0;s<t.length;s++)for(var l=0;l<e.length;l++)r[s][l]=Math.pow(n[s][l],a.m);for(var u=0;u<e.length;u++)for(var c=0;c<a.attributes.length;c++){i=0,o=0;for(var d=0;d<t.length;d++)i+=r[d][u]*a.attributes[c](t[d]),o+=r[d][u];e[u][c]=i/o}},wr=function(e,t,n,r,a){for(var i=0;i<e.length;i++)t[i]=e[i].slice();for(var o,s,l,u=2/(a.m-1),c=0;c<n.length;c++)for(var d=0;d<r.length;d++){o=0;for(var h=0;h<n.length;h++)s=dr(a.distance,r[d],n[c],a.attributes,"cmeans"),l=dr(a.distance,r[d],n[h],a.attributes,"cmeans"),o+=Math.pow(s/l,u);e[d][c]=1/o}},Er=function(e){var t,n,r,a,i,o=this.cy(),s=this.nodes(),l=cr(e);a=new Array(s.length);for(var u=0;u<s.length;u++)a[u]=new Array(l.k);r=new Array(s.length);for(var c=0;c<s.length;c++)r[c]=new Array(l.k);for(var d=0;d<s.length;d++){for(var h=0,f=0;f<l.k;f++)r[d][f]=Math.random(),h+=r[d][f];for(var p=0;p<l.k;p++)r[d][p]=r[d][p]/h}n=new Array(l.k);for(var v=0;v<l.k;v++)n[v]=new Array(l.attributes.length);i=new Array(s.length);for(var g=0;g<s.length;g++)i[g]=new Array(l.k);for(var y=!0,m=0;y&&m<l.maxIterations;)y=!1,xr(n,s,r,i,l),wr(r,a,n,s,l),gr(r,a,l.sensitivityThreshold)||(y=!0),m++;return t=function(e,t,n,r){for(var a,i,o=new Array(n.k),s=0;s<o.length;s++)o[s]=[];for(var l=0;l<t.length;l++){a=-1/0,i=-1;for(var u=0;u<t[0].length;u++)t[l][u]>a&&(a=t[l][u],i=u);o[i].push(e[l])}for(var c=0;c<o.length;c++)o[c]=r.collection(o[c]);return o}(s,r,l,o),{clusters:t,degreeOfMembership:r}},kr={kMeans:function(e){var t,n=this.cy(),r=this.nodes(),a=null,i=cr(e),o=new Array(i.k),s={};i.testMode?"number"==typeof i.testCentroids?(i.testCentroids,t=hr(r,i.k,i.attributes)):t="object"===d(i.testCentroids)?i.testCentroids:hr(r,i.k,i.attributes):t=hr(r,i.k,i.attributes);for(var l=!0,u=0;l&&u<i.maxIterations;){for(var c=0;c<r.length;c++)s[(a=r[c]).id()]=fr(a,t,i.distance,i.attributes,"kMeans");l=!1;for(var h=0;h<i.k;h++){var f=pr(h,r,s);if(0!==f.length){for(var p=i.attributes.length,v=t[h],g=new Array(p),y=new Array(p),m=0;m<p;m++){y[m]=0;for(var b=0;b<f.length;b++)a=f[b],y[m]+=i.attributes[m](a);g[m]=y[m]/f.length,vr(g[m],v[m],i.sensitivityThreshold)||(l=!0)}t[h]=g,o[h]=n.collection(f)}}u++}return o},kMedoids:function(e){var t,n,r=this.cy(),a=this.nodes(),i=null,o=cr(e),s=new Array(o.k),l={},u=new Array(o.k);o.testMode?"number"==typeof o.testCentroids||(t="object"===d(o.testCentroids)?o.testCentroids:mr(a,o.k)):t=mr(a,o.k);for(var c=!0,h=0;c&&h<o.maxIterations;){for(var f=0;f<a.length;f++)l[(i=a[f]).id()]=fr(i,t,o.distance,o.attributes,"kMedoids");c=!1;for(var p=0;p<t.length;p++){var v=pr(p,a,l);if(0!==v.length){u[p]=br(t[p],v,o.attributes);for(var g=0;g<v.length;g++)(n=br(v[g],v,o.attributes))<u[p]&&(u[p]=n,t[p]=v[g],c=!0);s[p]=r.collection(v)}}h++}return s},fuzzyCMeans:Er,fcm:Er},Tr=ct({distance:"euclidean",linkage:"min",mode:"threshold",threshold:1/0,addDendrogram:!1,dendrogramDepth:0,attributes:[]}),Cr={single:"min",complete:"max"},Pr=function(e,t,n,r,a){for(var i,o=0,s=1/0,l=a.attributes,u=function(e,t){return lr(a.distance,l.length,function(t){return l[t](e)},function(e){return l[e](t)},e,t)},c=0;c<e.length;c++){var d=e[c].key,h=n[d][r[d]];h<s&&(o=d,s=h)}if("threshold"===a.mode&&s>=a.threshold||"dendrogram"===a.mode&&1===e.length)return!1;var f,p=t[o],v=t[r[o]];f="dendrogram"===a.mode?{left:p,right:v,key:p.key}:{value:p.value.concat(v.value),key:p.key},e[p.index]=f,e.splice(v.index,1),t[p.key]=f;for(var g=0;g<e.length;g++){var y=e[g];p.key===y.key?i=1/0:"min"===a.linkage?(i=n[p.key][y.key],n[p.key][y.key]>n[v.key][y.key]&&(i=n[v.key][y.key])):"max"===a.linkage?(i=n[p.key][y.key],n[p.key][y.key]<n[v.key][y.key]&&(i=n[v.key][y.key])):i="mean"===a.linkage?(n[p.key][y.key]*p.size+n[v.key][y.key]*v.size)/(p.size+v.size):"dendrogram"===a.mode?u(y.value,p.value):u(y.value[0],p.value[0]),n[p.key][y.key]=n[y.key][p.key]=i}for(var m=0;m<e.length;m++){var b=e[m].key;if(r[b]===p.key||r[b]===v.key){for(var x=b,w=0;w<e.length;w++){var E=e[w].key;n[b][E]<n[b][x]&&(x=E)}r[b]=x}e[m].index=m}return p.key=v.key=p.index=v.index=null,!0},Sr=function(e,t,n){e&&(e.value?t.push(e.value):(e.left&&Sr(e.left,t),e.right&&Sr(e.right,t)))},Br=function(e,t){if(!e)return"";if(e.left&&e.right){var n=Br(e.left,t),r=Br(e.right,t),a=t.add({group:"nodes",data:{id:n+","+r}});return t.add({group:"edges",data:{source:n,target:a.id()}}),t.add({group:"edges",data:{source:r,target:a.id()}}),a.id()}return e.value?e.value.id():void 0},Dr=function(e,t,n){if(!e)return[];var r=[],a=[],i=[];return 0===t?(e.left&&Sr(e.left,r),e.right&&Sr(e.right,a),i=r.concat(a),[n.collection(i)]):1===t?e.value?[n.collection(e.value)]:(e.left&&Sr(e.left,r),e.right&&Sr(e.right,a),[n.collection(r),n.collection(a)]):e.value?[n.collection(e.value)]:(e.left&&(r=Dr(e.left,t-1,n)),e.right&&(a=Dr(e.right,t-1,n)),r.concat(a))},_r=function(e){for(var t=this.cy(),n=this.nodes(),r=function(e){var t=Tr(e),n=Cr[t.linkage];return null!=n&&(t.linkage=n),t}(e),a=r.attributes,i=function(e,t){return lr(r.distance,a.length,function(t){return a[t](e)},function(e){return a[e](t)},e,t)},o=[],s=[],l=[],u=[],c=0;c<n.length;c++){var d={value:"dendrogram"===r.mode?n[c]:[n[c]],key:c,index:c};o[c]=d,u[c]=d,s[c]=[],l[c]=0}for(var h=0;h<o.length;h++)for(var f=0;f<=h;f++){var p=void 0;p="dendrogram"===r.mode?h===f?1/0:i(o[h].value,o[f].value):h===f?1/0:i(o[h].value[0],o[f].value[0]),s[h][f]=p,s[f][h]=p,p<s[h][l[h]]&&(l[h]=f)}for(var v,g=Pr(o,u,s,l,r);g;)g=Pr(o,u,s,l,r);return"dendrogram"===r.mode?(v=Dr(o[0],r.dendrogramDepth,t),r.addDendrogram&&Br(o[0],t)):(v=new Array(o.length),o.forEach(function(e,n){e.key=e.index=null,v[n]=t.collection(e.value)})),v},Ar={hierarchicalClustering:_r,hca:_r},Mr=ct({distance:"euclidean",preference:"median",damping:.8,maxIterations:1e3,minIterations:100,attributes:[]}),Rr=function(e,t,n,r){var a=function(e,t){return r[t](e)};return-lr(e,r.length,function(e){return a(t,e)},function(e){return a(n,e)},t,n)},Ir=function(e,t){var n=null;return n="median"===t?function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];arguments.length>3&&void 0!==arguments[3]&&!arguments[3]?(n<e.length&&e.splice(n,e.length-n),t>0&&e.splice(0,t)):e=e.slice(t,n);for(var i=0,o=e.length-1;o>=0;o--){var s=e[o];a?isFinite(s)||(e[o]=-1/0,i++):e.splice(o,1)}r&&e.sort(function(e,t){return e-t});var l=e.length,u=Math.floor(l/2);return l%2!=0?e[u+1+i]:(e[u-1+i]+e[u+i])/2}(e):"mean"===t?function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=0,a=0,i=t;i<n;i++){var o=e[i];isFinite(o)&&(r+=o,a++)}return r/a}(e):"min"===t?function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=1/0,a=t;a<n;a++){var i=e[a];isFinite(i)&&(r=Math.min(i,r))}return r}(e):"max"===t?function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=-1/0,a=t;a<n;a++){var i=e[a];isFinite(i)&&(r=Math.max(i,r))}return r}(e):t,n},Nr=function(e,t,n){for(var r=[],a=0;a<e;a++){for(var i=-1,o=-1/0,s=0;s<n.length;s++){var l=n[s];t[a*e+l]>o&&(i=l,o=t[a*e+l])}i>0&&r.push(i)}for(var u=0;u<n.length;u++)r[n[u]]=n[u];return r},Lr=function(e){for(var t,n,r,a,i,o,s=this.cy(),l=this.nodes(),u=function(e){var t=e.damping,n=e.preference;.5<=t&&t<1||rt("Damping must range on [0.5, 1). Got: ".concat(t));var r=["median","mean","min","max"];return r.some(function(e){return e===n})||Q(n)||rt("Preference must be one of [".concat(r.map(function(e){return"'".concat(e,"'")}).join(", "),"] or a number. Got: ").concat(n)),Mr(e)}(e),c={},d=0;d<l.length;d++)c[l[d].id()]=d;n=(t=l.length)*t,r=new Array(n);for(var h=0;h<n;h++)r[h]=-1/0;for(var f=0;f<t;f++)for(var p=0;p<t;p++)f!==p&&(r[f*t+p]=Rr(u.distance,l[f],l[p],u.attributes));a=Ir(r,u.preference);for(var v=0;v<t;v++)r[v*t+v]=a;i=new Array(n);for(var g=0;g<n;g++)i[g]=0;o=new Array(n);for(var y=0;y<n;y++)o[y]=0;for(var m=new Array(t),b=new Array(t),x=new Array(t),w=0;w<t;w++)m[w]=0,b[w]=0,x[w]=0;for(var E,k=new Array(t*u.minIterations),T=0;T<k.length;T++)k[T]=0;for(E=0;E<u.maxIterations;E++){for(var C=0;C<t;C++){for(var P=-1/0,S=-1/0,B=-1,D=0,_=0;_<t;_++)m[_]=i[C*t+_],(D=o[C*t+_]+r[C*t+_])>=P?(S=P,P=D,B=_):D>S&&(S=D);for(var A=0;A<t;A++)i[C*t+A]=(1-u.damping)*(r[C*t+A]-P)+u.damping*m[A];i[C*t+B]=(1-u.damping)*(r[C*t+B]-S)+u.damping*m[B]}for(var M=0;M<t;M++){for(var R=0,I=0;I<t;I++)m[I]=o[I*t+M],b[I]=Math.max(0,i[I*t+M]),R+=b[I];R-=b[M],b[M]=i[M*t+M],R+=b[M];for(var N=0;N<t;N++)o[N*t+M]=(1-u.damping)*Math.min(0,R-b[N])+u.damping*m[N];o[M*t+M]=(1-u.damping)*(R-b[M])+u.damping*m[M]}for(var L=0,z=0;z<t;z++){var O=o[z*t+z]+i[z*t+z]>0?1:0;k[E%u.minIterations*t+z]=O,L+=O}if(L>0&&(E>=u.minIterations-1||E==u.maxIterations-1)){for(var V=0,F=0;F<t;F++){x[F]=0;for(var j=0;j<u.minIterations;j++)x[F]+=k[j*t+F];0!==x[F]&&x[F]!==u.minIterations||V++}if(V===t)break}}for(var X=function(e,t,n){for(var r=[],a=0;a<e;a++)t[a*e+a]+n[a*e+a]>0&&r.push(a);return r}(t,i,o),q=function(e,t,n){for(var r=Nr(e,t,n),a=0;a<n.length;a++){for(var i=[],o=0;o<r.length;o++)r[o]===n[a]&&i.push(o);for(var s=-1,l=-1/0,u=0;u<i.length;u++){for(var c=0,d=0;d<i.length;d++)c+=t[i[d]*e+i[u]];c>l&&(s=u,l=c)}n[a]=i[s]}return Nr(e,t,n)}(t,r,X),Y={},W=0;W<X.length;W++)Y[X[W]]=[];for(var U=0;U<l.length;U++){var H=q[c[l[U].id()]];null!=H&&Y[H].push(l[U])}for(var K=new Array(X.length),G=0;G<X.length;G++)K[G]=s.collection(Y[X[G]]);return K},zr={affinityPropagation:Lr,ap:Lr},Or=ct({root:void 0,directed:!1}),Vr=function(){var e=this,t={},n=0,r=0,a=[],i=[],o={},s=function(l,u,c){l===c&&(r+=1),t[u]={id:n,low:n++,cutVertex:!1};var d,h,f,p,v=e.getElementById(u).connectedEdges().intersection(e);0===v.size()?a.push(e.spawn(e.getElementById(u))):v.forEach(function(n){d=n.source().id(),h=n.target().id(),(f=d===u?h:d)!==c&&(p=n.id(),o[p]||(o[p]=!0,i.push({x:u,y:f,edge:n})),f in t?t[u].low=Math.min(t[u].low,t[f].id):(s(l,f,u),t[u].low=Math.min(t[u].low,t[f].low),t[u].id<=t[f].low&&(t[u].cutVertex=!0,function(n,r){for(var o=i.length-1,s=[],l=e.spawn();i[o].x!=n||i[o].y!=r;)s.push(i.pop().edge),o--;s.push(i.pop().edge),s.forEach(function(n){var r=n.connectedNodes().intersection(e);l.merge(n),r.forEach(function(n){var r=n.id(),a=n.connectedEdges().intersection(e);l.merge(n),t[r].cutVertex?l.merge(a.filter(function(e){return e.isLoop()})):l.merge(a)})}),a.push(l)}(u,f))))})};e.forEach(function(e){if(e.isNode()){var n=e.id();n in t||(r=0,s(n,n),t[n].cutVertex=r>1)}});var l=Object.keys(t).filter(function(e){return t[e].cutVertex}).map(function(t){return e.getElementById(t)});return{cut:e.spawn(l),components:a}},Fr=function(){var e=this,t={},n=0,r=[],a=[],i=e.spawn(e),o=function(s){if(a.push(s),t[s]={index:n,low:n++,explored:!1},e.getElementById(s).connectedEdges().intersection(e).forEach(function(e){var n=e.target().id();n!==s&&(n in t||o(n),t[n].explored||(t[s].low=Math.min(t[s].low,t[n].low)))}),t[s].index===t[s].low){for(var l=e.spawn();;){var u=a.pop();if(l.merge(e.getElementById(u)),t[u].low=t[s].index,t[u].explored=!0,u===s)break}var c=l.edgesWith(l),d=l.merge(c);r.push(d),i=i.difference(d)}};return e.forEach(function(e){if(e.isNode()){var n=e.id();n in t||o(n)}}),{cut:i,components:r}},jr={};[xt,_t,At,Rt,Nt,zt,jt,zn,Vn,jn,qn,Jn,kr,Ar,zr,{hierholzer:function(e){if(!$(e)){var t=arguments;e={root:t[0],directed:t[1]}}var n,r,a,i=Or(e),o=i.root,s=i.directed,l=this,u=!1;o&&(a=K(o)?this.filter(o)[0].id():o[0].id());var c={},d={};s?l.forEach(function(e){var t=e.id();if(e.isNode()){var a=e.indegree(!0),i=e.outdegree(!0),o=a-i,s=i-a;1==o?n?u=!0:n=t:1==s?r?u=!0:r=t:(s>1||o>1)&&(u=!0),c[t]=[],e.outgoers().forEach(function(e){e.isEdge()&&c[t].push(e.id())})}else d[t]=[void 0,e.target().id()]}):l.forEach(function(e){var t=e.id();e.isNode()?(e.degree(!0)%2&&(n?r?u=!0:r=t:n=t),c[t]=[],e.connectedEdges().forEach(function(e){return c[t].push(e.id())})):d[t]=[e.source().id(),e.target().id()]});var h={found:!1,trail:void 0};if(u)return h;if(r&&n)if(s){if(a&&r!=a)return h;a=r}else{if(a&&r!=a&&n!=a)return h;a||(a=r)}else a||(a=l[0].id());var f=function(e){for(var t,n,r,a=e,i=[e];c[a].length;)t=c[a].shift(),n=d[t][0],a!=(r=d[t][1])?(c[r]=c[r].filter(function(e){return e!=t}),a=r):s||a==n||(c[n]=c[n].filter(function(e){return e!=t}),a=n),i.unshift(t),i.unshift(a);return i},p=[],v=[];for(v=f(a);1!=v.length;)0==c[v[0]].length?(p.unshift(l.getElementById(v.shift())),p.unshift(l.getElementById(v.shift()))):v=f(v.shift()).concat(v);for(var g in p.unshift(l.getElementById(v.shift())),c)if(c[g].length)return h;return h.found=!0,h.trail=this.spawn(p,!0),h}},{hopcroftTarjanBiconnected:Vr,htbc:Vr,htb:Vr,hopcroftTarjanBiconnectedComponents:Vr},{tarjanStronglyConnected:Fr,tsc:Fr,tscc:Fr,tarjanStronglyConnectedComponents:Fr}].forEach(function(e){be(jr,e)});var Xr=function(e){if(!(this instanceof Xr))return new Xr(e);this.id="Thenable/1.0.7",this.state=0,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},"function"==typeof e&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))};Xr.prototype={fulfill:function(e){return qr(this,1,"fulfillValue",e)},reject:function(e){return qr(this,2,"rejectReason",e)},then:function(e,t){var n=this,r=new Xr;return n.onFulfilled.push(Ur(e,r,"fulfill")),n.onRejected.push(Ur(t,r,"reject")),Yr(n),r.proxy}};var qr=function(e,t,n,r){return 0===e.state&&(e.state=t,e[n]=r,Yr(e)),e},Yr=function(e){1===e.state?Wr(e,"onFulfilled",e.fulfillValue):2===e.state&&Wr(e,"onRejected",e.rejectReason)},Wr=function(e,t,n){if(0!==e[t].length){var r=e[t];e[t]=[];var a=function(){for(var e=0;e<r.length;e++)r[e](n)};"function"==typeof setImmediate?setImmediate(a):setTimeout(a,0)}},Ur=function(e,t,n){return function(r){if("function"!=typeof e)t[n].call(t,r);else{var a;try{a=e(r)}catch(i){return void t.reject(i)}Hr(t,a)}}},Hr=function(e,t){if(e!==t&&e.proxy!==t){var n;if("object"===d(t)&&null!==t||"function"==typeof t)try{n=t.then}catch(a){return void e.reject(a)}if("function"!=typeof n)e.fulfill(t);else{var r=!1;try{n.call(t,function(n){r||(r=!0,n===t?e.reject(new TypeError("circular thenable chain")):Hr(e,n))},function(t){r||(r=!0,e.reject(t))})}catch(a){r||e.reject(a)}}}else e.reject(new TypeError("cannot resolve promise with itself"))};Xr.all=function(e){return new Xr(function(t,n){for(var r=new Array(e.length),a=0,i=function(n,i){r[n]=i,++a===e.length&&t(r)},o=0;o<e.length;o++)(function(t){var r=e[t];null!=r&&null!=r.then?r.then(function(e){i(t,e)},function(e){n(e)}):i(t,r)})(o)})},Xr.resolve=function(e){return new Xr(function(t,n){t(e)})},Xr.reject=function(e){return new Xr(function(t,n){n(e)})};var Kr="undefined"!=typeof Promise?Promise:Xr,Gr=function(e,t,n){var r=re(e),a=!r,i=this._private=be({duration:1e3},t,n);if(i.target=e,i.style=i.style||i.css,i.started=!1,i.playing=!1,i.hooked=!1,i.applying=!1,i.progress=0,i.completes=[],i.frames=[],i.complete&&G(i.complete)&&i.completes.push(i.complete),a){var o=e.position();i.startPosition=i.startPosition||{x:o.x,y:o.y},i.startStyle=i.startStyle||e.cy().style().getAnimationStartStyle(e,i.style)}if(r){var s=e.pan();i.startPan={x:s.x,y:s.y},i.startZoom=e.zoom()}this.length=1,this[0]=this},Zr=Gr.prototype;be(Zr,{instanceString:function(){return"animation"},hook:function(){var e=this._private;if(!e.hooked){var t=e.target._private.animation;(e.queue?t.queue:t.current).push(this),ee(e.target)&&e.target.cy().addToAnimationPool(e.target),e.hooked=!0}return this},play:function(){var e=this._private;return 1===e.progress&&(e.progress=0),e.playing=!0,e.started=!1,e.stopped=!1,this.hook(),this},playing:function(){return this._private.playing},apply:function(){var e=this._private;return e.applying=!0,e.started=!1,e.stopped=!1,this.hook(),this},applying:function(){return this._private.applying},pause:function(){var e=this._private;return e.playing=!1,e.started=!1,this},stop:function(){var e=this._private;return e.playing=!1,e.started=!1,e.stopped=!0,this},rewind:function(){return this.progress(0)},fastforward:function(){return this.progress(1)},time:function(e){var t=this._private;return void 0===e?t.progress*t.duration:this.progress(e/t.duration)},progress:function(e){var t=this._private,n=t.playing;return void 0===e?t.progress:(n&&this.pause(),t.progress=e,t.started=!1,n&&this.play(),this)},completed:function(){return 1===this._private.progress},reverse:function(){var e=this._private,t=e.playing;t&&this.pause(),e.progress=1-e.progress,e.started=!1;var n=function(t,n){var r=e[t];null!=r&&(e[t]=e[n],e[n]=r)};if(n("zoom","startZoom"),n("pan","startPan"),n("position","startPosition"),e.style)for(var r=0;r<e.style.length;r++){var a=e.style[r],i=a.name,o=e.startStyle[i];e.startStyle[i]=a,e.style[r]=o}return t&&this.play(),this},promise:function(e){var t,n=this._private;if("frame"===e)t=n.frames;else t=n.completes;return new Kr(function(e,n){t.push(function(){e()})})}}),Zr.complete=Zr.completed,Zr.run=Zr.play,Zr.running=Zr.playing;var $r,Qr,Jr,ea,ta,na,ra,aa,ia,oa,sa,la,ua,ca,da,ha,fa,pa,va,ga,ya,ma,ba,xa,wa,Ea,ka,Ta,Ca,Pa,Sa,Ba,Da,_a,Aa,Ma,Ra,Ia,Na,La,za,Oa,Va,Fa,ja,Xa,qa,Ya,Wa,Ua,Ha,Ka,Ga,Za,$a,Qa,Ja,ei,ti,ni,ri,ai,ii,oi,si,li,ui,ci,di,hi,fi,pi,vi,gi,yi,mi,bi,xi,wi,Ei,ki,Ti,Ci,Pi,Si,Bi,Di={animated:function(){return function(){var e=this,t=void 0!==e.length?e:[e];if(!(this._private.cy||this).styleEnabled())return!1;var n=t[0];return n?n._private.animation.current.length>0:void 0}},clearQueue:function(){return function(){var e=this,t=void 0!==e.length?e:[e];if(!(this._private.cy||this).styleEnabled())return this;for(var n=0;n<t.length;n++){t[n]._private.animation.queue=[]}return this}},delay:function(){return function(e,t){return(this._private.cy||this).styleEnabled()?this.animate({delay:e,duration:e,complete:t}):this}},delayAnimation:function(){return function(e,t){return(this._private.cy||this).styleEnabled()?this.animation({delay:e,duration:e,complete:t}):this}},animation:function(){return function(e,t){var n=this,r=void 0!==n.length,a=r?n:[n],i=this._private.cy||this,o=!r,s=!o;if(!i.styleEnabled())return this;var l=i.style();if(e=be({},e,t),0===Object.keys(e).length)return new Gr(a[0],e);switch(void 0===e.duration&&(e.duration=400),e.duration){case"slow":e.duration=600;break;case"fast":e.duration=200}if(s&&(e.style=l.getPropsList(e.style||e.css),e.css=void 0),s&&null!=e.renderedPosition){var u=e.renderedPosition,c=i.pan(),d=i.zoom();e.position=qt(u,d,c)}if(o&&null!=e.panBy){var h=e.panBy,f=i.pan();e.pan={x:f.x+h.x,y:f.y+h.y}}var p=e.center||e.centre;if(o&&null!=p){var v=i.getCenterPan(p.eles,e.zoom);null!=v&&(e.pan=v)}if(o&&null!=e.fit){var g=e.fit,y=i.getFitViewport(g.eles||g.boundingBox,g.padding);null!=y&&(e.pan=y.pan,e.zoom=y.zoom)}if(o&&$(e.zoom)){var m=i.getZoomedViewport(e.zoom);null!=m?(m.zoomed&&(e.zoom=m.zoom),m.panned&&(e.pan=m.pan)):e.zoom=null}return new Gr(a[0],e)}},animate:function(){return function(e,t){var n=this,r=void 0!==n.length?n:[n];if(!(this._private.cy||this).styleEnabled())return this;t&&(e=be({},e,t));for(var a=0;a<r.length;a++){var i=r[a],o=i.animated()&&(void 0===e.queue||e.queue);i.animation(e,o?{queue:!0}:void 0).play()}return this}},stop:function(){return function(e,t){var n=this,r=void 0!==n.length?n:[n],a=this._private.cy||this;if(!a.styleEnabled())return this;for(var i=0;i<r.length;i++){for(var o=r[i]._private,s=o.animation.current,l=0;l<s.length;l++){var u=s[l]._private;t&&(u.duration=0)}e&&(o.animation.queue=[]),t||(o.animation.current=[])}return a.notify("draw"),this}}};function _i(){if(Qr)return $r;Qr=1;var e=Array.isArray;return $r=e}function Ai(){if(oa)return ia;oa=1;var e,t=function(){if(aa)return ra;aa=1;var e=Se()["__core-js_shared__"];return ra=e}(),n=(e=/[^.]+$/.exec(t&&t.keys&&t.keys.IE_PROTO||""))?"Symbol(src)_1."+e:"";return ia=function(e){return!!n&&n in e}}function Mi(){if(ca)return ua;ca=1;var e=function(){if(na)return ta;na=1;var e=_e(),t=Pe();return ta=function(n){if(!t(n))return!1;var r=e(n);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}}(),t=Ai(),n=Pe(),r=function(){if(la)return sa;la=1;var e=Function.prototype.toString;return sa=function(t){if(null!=t){try{return e.call(t)}catch(n){}try{return t+""}catch(n){}}return""}}(),a=/^\[object .+?Constructor\]$/,i=Function.prototype,o=Object.prototype,s=i.toString,l=o.hasOwnProperty,u=RegExp("^"+s.call(l).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");return ua=function(i){return!(!n(i)||t(i))&&(e(i)?u:a).test(r(i))}}function Ri(){if(pa)return fa;pa=1;var e=Mi(),t=(ha||(ha=1,da=function(e,t){return null==e?void 0:e[t]}),da);return fa=function(n,r){var a=t(n,r);return e(a)?a:void 0},fa}function Ii(){if(ga)return va;ga=1;var e=Ri()(Object,"create");return va=e}function Ni(){if(Ba)return Sa;Ba=1;var e=function(){if(ma)return ya;ma=1;var e=Ii();return ya=function(){this.__data__=e?e(null):{},this.size=0}}(),t=xa?ba:(xa=1,ba=function(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}),n=function(){if(Ea)return wa;Ea=1;var e=Ii(),t=Object.prototype.hasOwnProperty;return wa=function(n){var r=this.__data__;if(e){var a=r[n];return"__lodash_hash_undefined__"===a?void 0:a}return t.call(r,n)?r[n]:void 0},wa}(),r=function(){if(Ta)return ka;Ta=1;var e=Ii(),t=Object.prototype.hasOwnProperty;return ka=function(n){var r=this.__data__;return e?void 0!==r[n]:t.call(r,n)},ka}(),a=function(){if(Pa)return Ca;Pa=1;var e=Ii();return Ca=function(t,n){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=e&&void 0===n?"__lodash_hash_undefined__":n,this},Ca}();function i(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}return i.prototype.clear=e,i.prototype.delete=t,i.prototype.get=n,i.prototype.has=r,i.prototype.set=a,Sa=i}function Li(){if(Ma)return Aa;return Ma=1,Aa=function(e,t){return e===t||e!=e&&t!=t}}function zi(){if(Ia)return Ra;Ia=1;var e=Li();return Ra=function(t,n){for(var r=t.length;r--;)if(e(t[r][0],n))return r;return-1},Ra}function Oi(){if(Ya)return qa;Ya=1;var e=_a?Da:(_a=1,Da=function(){this.__data__=[],this.size=0}),t=function(){if(La)return Na;La=1;var e=zi(),t=Array.prototype.splice;return Na=function(n){var r=this.__data__,a=e(r,n);return!(a<0||(a==r.length-1?r.pop():t.call(r,a,1),--this.size,0))},Na}(),n=function(){if(Oa)return za;Oa=1;var e=zi();return za=function(t){var n=this.__data__,r=e(n,t);return r<0?void 0:n[r][1]},za}(),r=function(){if(Fa)return Va;Fa=1;var e=zi();return Va=function(t){return e(this.__data__,t)>-1}}(),a=function(){if(Xa)return ja;Xa=1;var e=zi();return ja=function(t,n){var r=this.__data__,a=e(r,t);return a<0?(++this.size,r.push([t,n])):r[a][1]=n,this},ja}();function i(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}return i.prototype.clear=e,i.prototype.delete=t,i.prototype.get=n,i.prototype.has=r,i.prototype.set=a,qa=i}function Vi(){if(Ka)return Ha;Ka=1;var e=Ni(),t=Oi(),n=function(){if(Ua)return Wa;Ua=1;var e=Ri()(Se(),"Map");return Wa=e}();return Ha=function(){this.size=0,this.__data__={hash:new e,map:new(n||t),string:new e}}}function Fi(){if(Qa)return $a;Qa=1;var e=Za?Ga:(Za=1,Ga=function(e){var t=typeof e;return"string"==t||"number"==t||"symbol"==t||"boolean"==t?"__proto__"!==e:null===e});return $a=function(t,n){var r=t.__data__;return e(n)?r["string"==typeof n?"string":"hash"]:r.map},$a}function ji(){if(li)return si;li=1;var e=Vi(),t=function(){if(ei)return Ja;ei=1;var e=Fi();return Ja=function(t){var n=e(this,t).delete(t);return this.size-=n?1:0,n}}(),n=function(){if(ni)return ti;ni=1;var e=Fi();return ti=function(t){return e(this,t).get(t)}}(),r=function(){if(ai)return ri;ai=1;var e=Fi();return ri=function(t){return e(this,t).has(t)}}(),a=function(){if(oi)return ii;oi=1;var e=Fi();return ii=function(t,n){var r=e(this,t),a=r.size;return r.set(t,n),this.size+=r.size==a?0:1,this},ii}();function i(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}return i.prototype.clear=e,i.prototype.delete=t,i.prototype.get=n,i.prototype.has=r,i.prototype.set=a,si=i}function Xi(){if(hi)return di;hi=1;var e=function(){if(ci)return ui;ci=1;var e=ji();function t(n,r){if("function"!=typeof n||null!=r&&"function"!=typeof r)throw new TypeError("Expected a function");var a=function(){var e=arguments,t=r?r.apply(this,e):e[0],i=a.cache;if(i.has(t))return i.get(t);var o=n.apply(this,e);return a.cache=i.set(t,o)||i,o};return a.cache=new(t.Cache||e),a}return t.Cache=e,ui=t}();return di=function(t){var n=e(t,function(e){return 500===r.size&&r.clear(),e}),r=n.cache;return n},di}function qi(){if(pi)return fi;pi=1;var e=Xi(),t=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,n=/\\(\\)?/g,r=e(function(e){var r=[];return 46===e.charCodeAt(0)&&r.push(""),e.replace(t,function(e,t,a,i){r.push(a?i.replace(n,"$1"):t||e)}),r});return fi=r}function Yi(){if(gi)return vi;return gi=1,vi=function(e,t){for(var n=-1,r=null==e?0:e.length,a=Array(r);++n<r;)a[n]=t(e[n],n,e);return a},vi}function Wi(){if(xi)return bi;xi=1;var e=function(){if(mi)return yi;mi=1;var e=De(),t=Yi(),n=_i(),r=Ae(),a=e?e.prototype:void 0,i=a?a.toString:void 0;return yi=function e(a){if("string"==typeof a)return a;if(n(a))return t(a,e)+"";if(r(a))return i?i.call(a):"";var o=a+"";return"0"==o&&1/a==-1/0?"-0":o},yi}();return bi=function(t){return null==t?"":e(t)}}function Ui(){if(Ei)return wi;Ei=1;var e=_i(),t=function(){if(ea)return Jr;ea=1;var e=_i(),t=Ae(),n=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,r=/^\w*$/;return Jr=function(a,i){if(e(a))return!1;var o=typeof a;return!("number"!=o&&"symbol"!=o&&"boolean"!=o&&null!=a&&!t(a))||r.test(a)||!n.test(a)||null!=i&&a in Object(i)},Jr}(),n=qi(),r=Wi();return wi=function(a,i){return e(a)?a:t(a,i)?[a]:n(r(a))},wi}function Hi(){if(Ti)return ki;Ti=1;var e=Ae();return ki=function(t){if("string"==typeof t||e(t))return t;var n=t+"";return"0"==n&&1/t==-1/0?"-0":n}}var Ki,Gi,Zi,$i,Qi,Ji,eo,to,no,ro,ao,io,oo=function(){if(Bi)return Si;Bi=1;var e=function(){if(Pi)return Ci;Pi=1;var e=Ui(),t=Hi();return Ci=function(n,r){for(var a=0,i=(r=e(r,n)).length;null!=n&&a<i;)n=n[t(r[a++])];return a&&a==i?n:void 0},Ci}();return Si=function(t,n,r){var a=null==t?void 0:e(t,n);return void 0===a?r:a},Si}(),so=Ce(oo);function lo(){if($i)return Zi;$i=1;var e=function(){if(Gi)return Ki;Gi=1;var e=Ri(),t=function(){try{var t=e(Object,"defineProperty");return t({},"",{}),t}catch(n){}}();return Ki=t}();return Zi=function(t,n,r){"__proto__"==n&&e?e(t,n,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[n]=r},Zi}function uo(){if(ro)return no;ro=1;var e=function(){if(Ji)return Qi;Ji=1;var e=lo(),t=Li(),n=Object.prototype.hasOwnProperty;return Qi=function(r,a,i){var o=r[a];n.call(r,a)&&t(o,i)&&(void 0!==i||a in r)||e(r,a,i)},Qi}(),t=Ui(),n=function(){if(to)return eo;to=1;var e=/^(?:0|[1-9]\d*)$/;return eo=function(t,n){var r=typeof t;return!!(n=null==n?9007199254740991:n)&&("number"==r||"symbol"!=r&&e.test(t))&&t>-1&&t%1==0&&t<n}}(),r=Pe(),a=Hi();return no=function(i,o,s,l){if(!r(i))return i;for(var u=-1,c=(o=t(o,i)).length,d=c-1,h=i;null!=h&&++u<c;){var f=a(o[u]),p=s;if("__proto__"===f||"constructor"===f||"prototype"===f)return i;if(u!=d){var v=h[f];void 0===(p=l?l(v,f,h):void 0)&&(p=r(v)?v:n(o[u+1])?[]:{})}e(h,f,p),h=h[f]}return i},no}var co,ho,fo,po,vo=function(){if(io)return ao;io=1;var e=uo();return ao=function(t,n,r){return null==t?t:e(t,n,r)},ao}(),go=Ce(vo);var yo=function(){if(po)return fo;po=1;var e=Yi(),t=(ho||(ho=1,co=function(e,t){var n=-1,r=e.length;for(t||(t=Array(r));++n<r;)t[n]=e[n];return t}),co),n=_i(),r=Ae(),a=qi(),i=Hi(),o=Wi();return fo=function(s){return n(s)?e(s,i):r(s)?[s]:t(a(o(s)))}}(),mo=Ce(yo),bo={data:function(e){return e=be({},{field:"data",bindingEvent:"data",allowBinding:!1,allowSetting:!1,allowGetting:!1,settingEvent:"data",settingTriggersEvent:!1,triggerFnName:"trigger",immutableKeys:{},updateStyle:!1,beforeGet:function(e){},beforeSet:function(e,t){},onSet:function(e){},canSet:function(e){return!0}},e),function(t,n){var r=e,a=this,i=void 0!==a.length,o=i?a:[a],l=i?a[0]:a;if(K(t)){var u,c=-1!==t.indexOf(".")&&mo(t);if(r.allowGetting&&void 0===n)return l&&(r.beforeGet(l),u=c&&void 0===l._private[r.field][t]?so(l._private[r.field],c):l._private[r.field][t]),u;if(r.allowSetting&&void 0!==n&&!r.immutableKeys[t]){var d=s({},t,n);r.beforeSet(a,d);for(var h=0,f=o.length;h<f;h++){var p=o[h];r.canSet(p)&&(c&&void 0===l._private[r.field][t]?go(p._private[r.field],c,n):p._private[r.field][t]=n)}r.updateStyle&&a.updateStyle(),r.onSet(a),r.settingTriggersEvent&&a[r.triggerFnName](r.settingEvent)}}else if(r.allowSetting&&$(t)){var v,g,y=t,m=Object.keys(y);r.beforeSet(a,y);for(var b=0;b<m.length;b++){if(g=y[v=m[b]],!r.immutableKeys[v])for(var x=0;x<o.length;x++){var w=o[x];r.canSet(w)&&(w._private[r.field][v]=g)}}r.updateStyle&&a.updateStyle(),r.onSet(a),r.settingTriggersEvent&&a[r.triggerFnName](r.settingEvent)}else if(r.allowBinding&&G(t)){var E=t;a.on(r.bindingEvent,E)}else if(r.allowGetting&&void 0===t){var k;return l&&(r.beforeGet(l),k=l._private[r.field]),k}return a}},removeData:function(e){return e=be({},{field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!1,immutableKeys:{}},e),function(t){var n=e,r=this,a=void 0!==r.length?r:[r];if(K(t)){for(var i=t.split(/\s+/),o=i.length,s=0;s<o;s++){var l=i[s];if(!ie(l))if(!n.immutableKeys[l])for(var u=0,c=a.length;u<c;u++)a[u]._private[n.field][l]=void 0}n.triggerEvent&&r[n.triggerFnName](n.event)}else if(void 0===t){for(var d=0,h=a.length;d<h;d++)for(var f=a[d]._private[n.field],p=Object.keys(f),v=0;v<p.length;v++){var g=p[v];!n.immutableKeys[g]&&(f[g]=void 0)}n.triggerEvent&&r[n.triggerFnName](n.event)}return r}}},xo={eventAliasesOn:function(e){var t=e;t.addListener=t.listen=t.bind=t.on,t.unlisten=t.unbind=t.off=t.removeListener,t.trigger=t.emit,t.pon=t.promiseOn=function(e,t){var n=this,r=Array.prototype.slice.call(arguments,0);return new Kr(function(e,t){var a=r.concat([function(t){n.off.apply(n,i),e(t)}]),i=a.concat([]);n.on.apply(n,a)})}}},wo={};[Di,bo,xo].forEach(function(e){be(wo,e)});var Eo={animate:wo.animate(),animation:wo.animation(),animated:wo.animated(),clearQueue:wo.clearQueue(),delay:wo.delay(),delayAnimation:wo.delayAnimation(),stop:wo.stop()},ko={classes:function(e){var t=this;if(void 0===e){var n=[];return t[0]._private.classes.forEach(function(e){return n.push(e)}),n}Z(e)||(e=(e||"").match(/\S+/g)||[]);for(var r=[],a=new yt(e),i=0;i<t.length;i++){for(var o=t[i],s=o._private,l=s.classes,u=!1,c=0;c<e.length;c++){var d=e[c];if(!l.has(d)){u=!0;break}}u||(u=l.size!==e.length),u&&(s.classes=a,r.push(o))}return r.length>0&&this.spawn(r).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes.has(e)},toggleClass:function(e,t){Z(e)||(e=e.match(/\S+/g)||[]);for(var n=this,r=void 0===t,a=[],i=0,o=n.length;i<o;i++)for(var s=n[i],l=s._private.classes,u=!1,c=0;c<e.length;c++){var d=e[c],h=l.has(d),f=!1;t||r&&!h?(l.add(d),f=!0):(!t||r&&h)&&(l.delete(d),f=!0),!u&&f&&(a.push(s),u=!0)}return a.length>0&&this.spawn(a).updateStyle().emit("class"),n},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var n=this;if(null==t)t=250;else if(0===t)return n;return n.addClass(e),setTimeout(function(){n.removeClass(e)},t),n}};ko.className=ko.classNames=ko.classes;var To={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:"\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'",number:fe,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};To.variable="(?:[\\w-.]|(?:\\\\"+To.metaChar+"))+",To.className="(?:[\\w-]|(?:\\\\"+To.metaChar+"))+",To.value=To.string+"|"+To.number,To.id=To.variable,function(){var e,t,n;for(e=To.comparatorOp.split("|"),n=0;n<e.length;n++)t=e[n],To.comparatorOp+="|@"+t;for(e=To.comparatorOp.split("|"),n=0;n<e.length;n++)(t=e[n]).indexOf("!")>=0||"="!==t&&(To.comparatorOp+="|\\!"+t)}();var Co=0,Po=1,So=2,Bo=3,Do=4,_o=5,Ao=6,Mo=7,Ro=8,Io=9,No=10,Lo=11,zo=12,Oo=13,Vo=14,Fo=15,jo=16,Xo=17,qo=18,Yo=19,Wo=20,Uo=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort(function(e,t){return function(e,t){return-1*me(e,t)}(e.selector,t.selector)}),Ho=function(){for(var e,t={},n=0;n<Uo.length;n++)t[(e=Uo[n]).selector]=e.matches;return t}(),Ko="("+Uo.map(function(e){return e.selector}).join("|")+")",Go=function(e){return e.replace(new RegExp("\\\\("+To.metaChar+")","g"),function(e,t){return t})},Zo=function(e,t,n){e[e.length-1]=n},$o=[{name:"group",query:!0,regex:"("+To.group+")",populate:function(e,t,n){var r=l(n,1)[0];t.checks.push({type:Co,value:"*"===r?r:r+"s"})}},{name:"state",query:!0,regex:Ko,populate:function(e,t,n){var r=l(n,1)[0];t.checks.push({type:Mo,value:r})}},{name:"id",query:!0,regex:"\\#("+To.id+")",populate:function(e,t,n){var r=l(n,1)[0];t.checks.push({type:Ro,value:Go(r)})}},{name:"className",query:!0,regex:"\\.("+To.className+")",populate:function(e,t,n){var r=l(n,1)[0];t.checks.push({type:Io,value:Go(r)})}},{name:"dataExists",query:!0,regex:"\\[\\s*("+To.variable+")\\s*\\]",populate:function(e,t,n){var r=l(n,1)[0];t.checks.push({type:Do,field:Go(r)})}},{name:"dataCompare",query:!0,regex:"\\[\\s*("+To.variable+")\\s*("+To.comparatorOp+")\\s*("+To.value+")\\s*\\]",populate:function(e,t,n){var r=l(n,3),a=r[0],i=r[1],o=r[2];o=null!=new RegExp("^"+To.string+"$").exec(o)?o.substring(1,o.length-1):parseFloat(o),t.checks.push({type:Bo,field:Go(a),operator:i,value:o})}},{name:"dataBool",query:!0,regex:"\\[\\s*("+To.boolOp+")\\s*("+To.variable+")\\s*\\]",populate:function(e,t,n){var r=l(n,2),a=r[0],i=r[1];t.checks.push({type:_o,field:Go(i),operator:a})}},{name:"metaCompare",query:!0,regex:"\\[\\[\\s*("+To.meta+")\\s*("+To.comparatorOp+")\\s*("+To.number+")\\s*\\]\\]",populate:function(e,t,n){var r=l(n,3),a=r[0],i=r[1],o=r[2];t.checks.push({type:Ao,field:Go(a),operator:i,value:parseFloat(o)})}},{name:"nextQuery",separator:!0,regex:To.separator,populate:function(e,t){var n=e.currentSubject,r=e.edgeCount,a=e.compoundCount,i=e[e.length-1];return null!=n&&(i.subject=n,e.currentSubject=null),i.edgeCount=r,i.compoundCount=a,e.edgeCount=0,e.compoundCount=0,e[e.length++]={checks:[]}}},{name:"directedEdge",separator:!0,regex:To.directedEdge,populate:function(e,t){if(null==e.currentSubject){var n={checks:[]},r=t,a={checks:[]};return n.checks.push({type:Lo,source:r,target:a}),Zo(e,0,n),e.edgeCount++,a}var i={checks:[]},o=t,s={checks:[]};return i.checks.push({type:zo,source:o,target:s}),Zo(e,0,i),e.edgeCount++,s}},{name:"undirectedEdge",separator:!0,regex:To.undirectedEdge,populate:function(e,t){if(null==e.currentSubject){var n={checks:[]},r=t,a={checks:[]};return n.checks.push({type:No,nodes:[r,a]}),Zo(e,0,n),e.edgeCount++,a}var i={checks:[]},o=t,s={checks:[]};return i.checks.push({type:Vo,node:o,neighbor:s}),Zo(e,0,i),s}},{name:"child",separator:!0,regex:To.child,populate:function(e,t){if(null==e.currentSubject){var n={checks:[]},r={checks:[]},a=e[e.length-1];return n.checks.push({type:Fo,parent:a,child:r}),Zo(e,0,n),e.compoundCount++,r}if(e.currentSubject===t){var i={checks:[]},o=e[e.length-1],s={checks:[]},l={checks:[]},u={checks:[]},c={checks:[]};return i.checks.push({type:Yo,left:o,right:s,subject:l}),l.checks=t.checks,t.checks=[{type:Wo}],c.checks.push({type:Wo}),s.checks.push({type:Xo,parent:c,child:u}),Zo(e,0,i),e.currentSubject=l,e.compoundCount++,u}var d={checks:[]},h={checks:[]},f=[{type:Xo,parent:d,child:h}];return d.checks=t.checks,t.checks=f,e.compoundCount++,h}},{name:"descendant",separator:!0,regex:To.descendant,populate:function(e,t){if(null==e.currentSubject){var n={checks:[]},r={checks:[]},a=e[e.length-1];return n.checks.push({type:jo,ancestor:a,descendant:r}),Zo(e,0,n),e.compoundCount++,r}if(e.currentSubject===t){var i={checks:[]},o=e[e.length-1],s={checks:[]},l={checks:[]},u={checks:[]},c={checks:[]};return i.checks.push({type:Yo,left:o,right:s,subject:l}),l.checks=t.checks,t.checks=[{type:Wo}],c.checks.push({type:Wo}),s.checks.push({type:qo,ancestor:c,descendant:u}),Zo(e,0,i),e.currentSubject=l,e.compoundCount++,u}var d={checks:[]},h={checks:[]},f=[{type:qo,ancestor:d,descendant:h}];return d.checks=t.checks,t.checks=f,e.compoundCount++,h}},{name:"subject",modifier:!0,regex:To.subject,populate:function(e,t){if(null!=e.currentSubject&&e.currentSubject!==t)return it("Redefinition of subject in selector `"+e.toString()+"`"),!1;e.currentSubject=t;var n=e[e.length-1].checks[0],r=null==n?null:n.type;r===Lo?n.type=Oo:r===No&&(n.type=Vo,n.node=n.nodes[1],n.neighbor=n.nodes[0],n.nodes=null)}}];$o.forEach(function(e){return e.regexObj=new RegExp("^"+e.regex)});var Qo=function(e){for(var t,n,r,a=0;a<$o.length;a++){var i=$o[a],o=i.name,s=e.match(i.regexObj);if(null!=s){n=s,t=i,r=o;var l=s[0];e=e.substring(l.length);break}}return{expr:t,match:n,name:r,remaining:e}},Jo={parse:function(e){var t=this,n=t.inputText=e,r=t[0]={checks:[]};for(t.length=1,n=function(e){var t=e.match(/^\s+/);if(t){var n=t[0];e=e.substring(n.length)}return e}(n);;){var a=Qo(n);if(null==a.expr)return it("The selector `"+e+"`is invalid"),!1;var i=a.match.slice(1),o=a.expr.populate(t,r,i);if(!1===o)return!1;if(null!=o&&(r=o),(n=a.remaining).match(/^\s*$/))break}var s=t[t.length-1];null!=t.currentSubject&&(s.subject=t.currentSubject),s.edgeCount=t.edgeCount,s.compoundCount=t.compoundCount;for(var l=0;l<t.length;l++){var u=t[l];if(u.compoundCount>0&&u.edgeCount>0)return it("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(u.edgeCount>1)return it("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;1===u.edgeCount&&it("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},toString:function(){if(null!=this.toStringCache)return this.toStringCache;for(var e=function(e){return null==e?"":e},t=function(t){return K(t)?'"'+t+'"':e(t)},n=function(e){return" "+e+" "},r=function(r,i){var o=r.type,s=r.value;switch(o){case Co:var l=e(s);return l.substring(0,l.length-1);case Bo:var u=r.field,c=r.operator;return"["+u+n(e(c))+t(s)+"]";case _o:var d=r.operator,h=r.field;return"["+e(d)+h+"]";case Do:return"["+r.field+"]";case Ao:var f=r.operator;return"[["+r.field+n(e(f))+t(s)+"]]";case Mo:return s;case Ro:return"#"+s;case Io:return"."+s;case Xo:case Fo:return a(r.parent,i)+n(">")+a(r.child,i);case qo:case jo:return a(r.ancestor,i)+" "+a(r.descendant,i);case Yo:var p=a(r.left,i),v=a(r.subject,i),g=a(r.right,i);return p+(p.length>0?" ":"")+v+g;case Wo:return""}},a=function(e,t){return e.checks.reduce(function(n,a,i){return n+(t===e&&0===i?"$":"")+r(a,t)},"")},i="",o=0;o<this.length;o++){var s=this[o];i+=a(s,s.subject),this.length>1&&o<this.length-1&&(i+=", ")}return this.toStringCache=i,i}},es=function(e,t,n){var r,a,i,o=K(e),s=Q(e),l=K(n),u=!1,c=!1,d=!1;switch(t.indexOf("!")>=0&&(t=t.replace("!",""),c=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),u=!0),(o||l||u)&&(a=o||s?""+e:"",i=""+n),u&&(e=a=a.toLowerCase(),n=i=i.toLowerCase()),t){case"*=":r=a.indexOf(i)>=0;break;case"$=":r=a.indexOf(i,a.length-i.length)>=0;break;case"^=":r=0===a.indexOf(i);break;case"=":r=e===n;break;case">":d=!0,r=e>n;break;case">=":d=!0,r=e>=n;break;case"<":d=!0,r=e<n;break;case"<=":d=!0,r=e<=n;break;default:r=!1}return!c||null==e&&d||(r=!r),r},ts=function(e,t){return e.data(t)},ns=[],rs=function(e,t){return e.checks.every(function(e){return ns[e.type](e,t)})};ns[Co]=function(e,t){var n=e.value;return"*"===n||n===t.group()},ns[Mo]=function(e,t){return function(e,t){return Ho[e](t)}(e.value,t)},ns[Ro]=function(e,t){var n=e.value;return t.id()===n},ns[Io]=function(e,t){var n=e.value;return t.hasClass(n)},ns[Ao]=function(e,t){var n=e.field,r=e.operator,a=e.value;return es(function(e,t){return e[t]()}(t,n),r,a)},ns[Bo]=function(e,t){var n=e.field,r=e.operator,a=e.value;return es(ts(t,n),r,a)},ns[_o]=function(e,t){var n=e.field,r=e.operator;return function(e,t){switch(t){case"?":return!!e;case"!":return!e;case"^":return void 0===e}}(ts(t,n),r)},ns[Do]=function(e,t){var n=e.field;return e.operator,void 0!==ts(t,n)},ns[No]=function(e,t){var n=e.nodes[0],r=e.nodes[1],a=t.source(),i=t.target();return rs(n,a)&&rs(r,i)||rs(r,a)&&rs(n,i)},ns[Vo]=function(e,t){return rs(e.node,t)&&t.neighborhood().some(function(t){return t.isNode()&&rs(e.neighbor,t)})},ns[Lo]=function(e,t){return rs(e.source,t.source())&&rs(e.target,t.target())},ns[zo]=function(e,t){return rs(e.source,t)&&t.outgoers().some(function(t){return t.isNode()&&rs(e.target,t)})},ns[Oo]=function(e,t){return rs(e.target,t)&&t.incomers().some(function(t){return t.isNode()&&rs(e.source,t)})},ns[Fo]=function(e,t){return rs(e.child,t)&&rs(e.parent,t.parent())},ns[Xo]=function(e,t){return rs(e.parent,t)&&t.children().some(function(t){return rs(e.child,t)})},ns[jo]=function(e,t){return rs(e.descendant,t)&&t.ancestors().some(function(t){return rs(e.ancestor,t)})},ns[qo]=function(e,t){return rs(e.ancestor,t)&&t.descendants().some(function(t){return rs(e.descendant,t)})},ns[Yo]=function(e,t){return rs(e.subject,t)&&rs(e.left,t)&&rs(e.right,t)},ns[Wo]=function(){return!0},ns[Po]=function(e,t){return e.value.has(t)},ns[So]=function(e,t){return(0,e.value)(t)};var as={matches:function(e){for(var t=0;t<this.length;t++){var n=this[t];if(rs(n,e))return!0}return!1},filter:function(e){var t=this;if(1===t.length&&1===t[0].checks.length&&t[0].checks[0].type===Ro)return e.getElementById(t[0].checks[0].value).collection();var n=function(e){for(var n=0;n<t.length;n++){var r=t[n];if(rs(r,e))return!0}return!1};return null==t.text()&&(n=function(){return!0}),e.filter(n)}},is=function(e){this.inputText=e,this.currentSubject=null,this.compoundCount=0,this.edgeCount=0,this.length=0,null==e||K(e)&&e.match(/^\s*$/)||(ee(e)?this.addQuery({checks:[{type:Po,value:e.collection()}]}):G(e)?this.addQuery({checks:[{type:So,value:e}]}):K(e)?this.parse(e)||(this.invalid=!0):rt("A selector must be created from a string; found "))},os=is.prototype;[Jo,as].forEach(function(e){return be(os,e)}),os.text=function(){return this.inputText},os.size=function(){return this.length},os.eq=function(e){return this[e]},os.sameText=function(e){return!this.invalid&&!e.invalid&&this.text()===e.text()},os.addQuery=function(e){this[this.length++]=e},os.selector=os.toString;var ss={allAre:function(e){var t=new is(e);return this.every(function(e){return t.matches(e)})},is:function(e){var t=new is(e);return this.some(function(e){return t.matches(e)})},some:function(e,t){for(var n=0;n<this.length;n++){if(t?e.apply(t,[this[n],n,this]):e(this[n],n,this))return!0}return!1},every:function(e,t){for(var n=0;n<this.length;n++){if(!(t?e.apply(t,[this[n],n,this]):e(this[n],n,this)))return!1}return!0},same:function(e){if(this===e)return!0;e=this.cy().collection(e);var t=this.length;return t===e.length&&(1===t?this[0]===e[0]:this.every(function(t){return e.hasElementWithId(t.id())}))},anySame:function(e){return e=this.cy().collection(e),this.some(function(t){return e.hasElementWithId(t.id())})},allAreNeighbors:function(e){e=this.cy().collection(e);var t=this.neighborhood();return e.every(function(e){return t.hasElementWithId(e.id())})},contains:function(e){e=this.cy().collection(e);var t=this;return e.every(function(e){return t.hasElementWithId(e.id())})}};ss.allAreNeighbours=ss.allAreNeighbors,ss.has=ss.contains,ss.equal=ss.equals=ss.same;var ls,us,cs=function(e,t){return function(n,r,a,i){var o,s=n,l=this;if(null==s?o="":ee(s)&&1===s.length&&(o=s.id()),1===l.length&&o){var u=l[0]._private,c=u.traversalCache=u.traversalCache||{},d=c[t]=c[t]||[],h=Ue(o),f=d[h];return f||(d[h]=e.call(l,n,r,a,i))}return e.call(l,n,r,a,i)}},ds={parent:function(e){var t=[];if(1===this.length){var n=this[0]._private.parent;if(n)return n}for(var r=0;r<this.length;r++){var a=this[r]._private.parent;a&&t.push(a)}return this.spawn(t,!0).filter(e)},parents:function(e){for(var t=[],n=this.parent();n.nonempty();){for(var r=0;r<n.length;r++){var a=n[r];t.push(a)}n=n.parent()}return this.spawn(t,!0).filter(e)},commonAncestors:function(e){for(var t,n=0;n<this.length;n++){var r=this[n].parents();t=(t=t||r).intersect(r)}return t.filter(e)},orphans:function(e){return this.stdFilter(function(e){return e.isOrphan()}).filter(e)},nonorphans:function(e){return this.stdFilter(function(e){return e.isChild()}).filter(e)},children:cs(function(e){for(var t=[],n=0;n<this.length;n++)for(var r=this[n]._private.children,a=0;a<r.length;a++)t.push(r[a]);return this.spawn(t,!0).filter(e)},"children"),siblings:function(e){return this.parent().children().not(this).filter(e)},isParent:function(){var e=this[0];if(e)return e.isNode()&&0!==e._private.children.length},isChildless:function(){var e=this[0];if(e)return e.isNode()&&0===e._private.children.length},isChild:function(){var e=this[0];if(e)return e.isNode()&&null!=e._private.parent},isOrphan:function(){var e=this[0];if(e)return e.isNode()&&null==e._private.parent},descendants:function(e){var t=[];return function e(n){for(var r=0;r<n.length;r++){var a=n[r];t.push(a),a.children().nonempty()&&e(a.children())}}(this.children()),this.spawn(t,!0).filter(e)}};function hs(e,t,n,r){for(var a=[],i=new yt,o=e.cy().hasCompoundNodes(),s=0;s<e.length;s++){var l=e[s];n?a.push(l):o&&r(a,i,l)}for(;a.length>0;){var u=a.shift();t(u),i.add(u.id()),o&&r(a,i,u)}return e}function fs(e,t,n){if(n.isParent())for(var r=n._private.children,a=0;a<r.length;a++){var i=r[a];t.has(i.id())||e.push(i)}}function ps(e,t,n){if(n.isChild()){var r=n._private.parent;t.has(r.id())||e.push(r)}}function vs(e,t,n){ps(e,t,n),fs(e,t,n)}ds.forEachDown=function(e){return hs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],fs)},ds.forEachUp=function(e){return hs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],ps)},ds.forEachUpAndDown=function(e){return hs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],vs)},ds.ancestors=ds.parents,(ls=us={data:wo.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:wo.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:wo.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:wo.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:wo.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:wo.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}}).attr=ls.data,ls.removeAttr=ls.removeData;var gs,ys,ms=us,bs={};function xs(e){return function(t){var n=this;if(void 0===t&&(t=!0),0!==n.length&&n.isNode()&&!n.removed()){for(var r=0,a=n[0],i=a._private.edges,o=0;o<i.length;o++){var s=i[o];!t&&s.isLoop()||(r+=e(a,s))}return r}}}function ws(e,t){return function(n){for(var r,a=this.nodes(),i=0;i<a.length;i++){var o=a[i][e](n);void 0===o||void 0!==r&&!t(o,r)||(r=o)}return r}}be(bs,{degree:xs(function(e,t){return t.source().same(t.target())?2:1}),indegree:xs(function(e,t){return t.target().same(e)?1:0}),outdegree:xs(function(e,t){return t.source().same(e)?1:0})}),be(bs,{minDegree:ws("degree",function(e,t){return e<t}),maxDegree:ws("degree",function(e,t){return e>t}),minIndegree:ws("indegree",function(e,t){return e<t}),maxIndegree:ws("indegree",function(e,t){return e>t}),minOutdegree:ws("outdegree",function(e,t){return e<t}),maxOutdegree:ws("outdegree",function(e,t){return e>t})}),be(bs,{totalDegree:function(e){for(var t=0,n=this.nodes(),r=0;r<n.length;r++)t+=n[r].degree(e);return t}});var Es=function(e,t,n){for(var r=0;r<e.length;r++){var a=e[r];if(!a.locked()){var i=a._private.position,o={x:null!=t.x?t.x-i.x:0,y:null!=t.y?t.y-i.y:0};!a.isParent()||0===o.x&&0===o.y||a.children().shift(o,n),a.dirtyBoundingBoxCache()}}},ks={field:"position",bindingEvent:"position",allowBinding:!0,allowSetting:!0,settingEvent:"position",settingTriggersEvent:!0,triggerFnName:"emitAndNotify",allowGetting:!0,validKeys:["x","y"],beforeGet:function(e){e.updateCompoundBounds()},beforeSet:function(e,t){Es(e,t,!1)},onSet:function(e){e.dirtyCompoundBoundsCache()},canSet:function(e){return!e.locked()}};gs=ys={position:wo.data(ks),silentPosition:wo.data(be({},ks,{allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!1,beforeSet:function(e,t){Es(e,t,!0)},onSet:function(e){e.dirtyCompoundBoundsCache()}})),positions:function(e,t){if($(e))t?this.silentPosition(e):this.position(e);else if(G(e)){var n=e,r=this.cy();r.startBatch();for(var a=0;a<this.length;a++){var i,o=this[a];(i=n(o,a))&&(t?o.silentPosition(i):o.position(i))}r.endBatch()}return this},silentPositions:function(e){return this.positions(e,!0)},shift:function(e,t,n){var r;if($(e)?(r={x:Q(e.x)?e.x:0,y:Q(e.y)?e.y:0},n=t):K(e)&&Q(t)&&((r={x:0,y:0})[e]=t),null!=r){var a=this.cy();a.startBatch();for(var i=0;i<this.length;i++){var o=this[i];if(!(a.hasCompoundNodes()&&o.isChild()&&o.ancestors().anySame(this))){var s=o.position(),l={x:s.x+r.x,y:s.y+r.y};n?o.silentPosition(l):o.position(l)}}a.endBatch()}return this},silentShift:function(e,t){return $(e)?this.shift(e,!0):K(e)&&Q(t)&&this.shift(e,t,!0),this},renderedPosition:function(e,t){var n=this[0],r=this.cy(),a=r.zoom(),i=r.pan(),o=$(e)?e:void 0,s=void 0!==o||void 0!==t&&K(e);if(n&&n.isNode()){if(!s){var l=n.position();return o=Xt(l,a,i),void 0===e?o:o[e]}for(var u=0;u<this.length;u++){var c=this[u];void 0!==t?c.position(e,(t-i[e])/a):void 0!==o&&c.position(qt(o,a,i))}}else if(!s)return;return this},relativePosition:function(e,t){var n=this[0],r=this.cy(),a=$(e)?e:void 0,i=void 0!==a||void 0!==t&&K(e),o=r.hasCompoundNodes();if(n&&n.isNode()){if(!i){var s=n.position(),l=o?n.parent():null,u=l&&l.length>0,c=u;u&&(l=l[0]);var d=c?l.position():{x:0,y:0};return a={x:s.x-d.x,y:s.y-d.y},void 0===e?a:a[e]}for(var h=0;h<this.length;h++){var f=this[h],p=o?f.parent():null,v=p&&p.length>0,g=v;v&&(p=p[0]);var y=g?p.position():{x:0,y:0};void 0!==t?f.position(e,t+y[e]):void 0!==a&&f.position({x:a.x+y.x,y:a.y+y.y})}}else if(!i)return;return this}},gs.modelPosition=gs.point=gs.position,gs.modelPositions=gs.points=gs.positions,gs.renderedPoint=gs.renderedPosition,gs.relativePoint=gs.relativePosition;var Ts,Cs,Ps=ys;Ts=Cs={},Cs.renderedBoundingBox=function(e){var t=this.boundingBox(e),n=this.cy(),r=n.zoom(),a=n.pan(),i=t.x1*r+a.x,o=t.x2*r+a.x,s=t.y1*r+a.y,l=t.y2*r+a.y;return{x1:i,x2:o,y1:s,y2:l,w:o-i,h:l-s}},Cs.dirtyCompoundBoundsCache=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();return t.styleEnabled()&&t.hasCompoundNodes()?(this.forEachUp(function(t){if(t.isParent()){var n=t._private;n.compoundBoundsClean=!1,n.bbCache=null,e||t.emitAndNotify("bounds")}}),this):this},Cs.updateCompoundBounds=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();if(!t.styleEnabled()||!t.hasCompoundNodes())return this;if(!e&&t.batching())return this;function n(e){if(e.isParent()){var t=e._private,n=e.children(),r="include"===e.pstyle("compound-sizing-wrt-labels").value,a={width:{val:e.pstyle("min-width").pfValue,left:e.pstyle("min-width-bias-left"),right:e.pstyle("min-width-bias-right")},height:{val:e.pstyle("min-height").pfValue,top:e.pstyle("min-height-bias-top"),bottom:e.pstyle("min-height-bias-bottom")}},i=n.boundingBox({includeLabels:r,includeOverlays:!1,useCache:!1}),o=t.position;0!==i.w&&0!==i.h||((i={w:e.pstyle("width").pfValue,h:e.pstyle("height").pfValue}).x1=o.x-i.w/2,i.x2=o.x+i.w/2,i.y1=o.y-i.h/2,i.y2=o.y+i.h/2);var s=a.width.left.value;"px"===a.width.left.units&&a.width.val>0&&(s=100*s/a.width.val);var l=a.width.right.value;"px"===a.width.right.units&&a.width.val>0&&(l=100*l/a.width.val);var u=a.height.top.value;"px"===a.height.top.units&&a.height.val>0&&(u=100*u/a.height.val);var c=a.height.bottom.value;"px"===a.height.bottom.units&&a.height.val>0&&(c=100*c/a.height.val);var d=y(a.width.val-i.w,s,l),h=d.biasDiff,f=d.biasComplementDiff,p=y(a.height.val-i.h,u,c),v=p.biasDiff,g=p.biasComplementDiff;t.autoPadding=function(e,t,n,r){if("%"!==n.units)return"px"===n.units?n.pfValue:0;switch(r){case"width":return e>0?n.pfValue*e:0;case"height":return t>0?n.pfValue*t:0;case"average":return e>0&&t>0?n.pfValue*(e+t)/2:0;case"min":return e>0&&t>0?e>t?n.pfValue*t:n.pfValue*e:0;case"max":return e>0&&t>0?e>t?n.pfValue*e:n.pfValue*t:0;default:return 0}}(i.w,i.h,e.pstyle("padding"),e.pstyle("padding-relative-to").value),t.autoWidth=Math.max(i.w,a.width.val),o.x=(-h+i.x1+i.x2+f)/2,t.autoHeight=Math.max(i.h,a.height.val),o.y=(-v+i.y1+i.y2+g)/2}function y(e,t,n){var r=0,a=0,i=t+n;return e>0&&i>0&&(r=t/i*e,a=n/i*e),{biasDiff:r,biasComplementDiff:a}}}for(var r=0;r<this.length;r++){var a=this[r],i=a._private;i.compoundBoundsClean&&!e||(n(a),t.batching()||(i.compoundBoundsClean=!0))}return this};var Ss=function(e){return e===1/0||e===-1/0?0:e},Bs=function(e,t,n,r,a){r-t!==0&&a-n!==0&&null!=t&&null!=n&&null!=r&&null!=a&&(e.x1=t<e.x1?t:e.x1,e.x2=r>e.x2?r:e.x2,e.y1=n<e.y1?n:e.y1,e.y2=a>e.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},Ds=function(e,t){return null==t?e:Bs(e,t.x1,t.y1,t.x2,t.y2)},_s=function(e,t,n){return ft(e,t,n)},As=function(e,t,n){if(!t.cy().headless()){var r,a,i=t._private,o=i.rstyle,s=o.arrowWidth/2;if("none"!==t.pstyle(n+"-arrow-shape").value){"source"===n?(r=o.srcX,a=o.srcY):"target"===n?(r=o.tgtX,a=o.tgtY):(r=o.midX,a=o.midY);var l=i.arrowBounds=i.arrowBounds||{},u=l[n]=l[n]||{};u.x1=r-s,u.y1=a-s,u.x2=r+s,u.y2=a+s,u.w=u.x2-u.x1,u.h=u.y2-u.y1,rn(u,1),Bs(e,u.x1,u.y1,u.x2,u.y2)}}},Ms=function(e,t,n){if(!t.cy().headless()){var r;r=n?n+"-":"";var a=t._private,i=a.rstyle;if(t.pstyle(r+"label").strValue){var o,s,l,u,c=t.pstyle("text-halign"),d=t.pstyle("text-valign"),h=_s(i,"labelWidth",n),f=_s(i,"labelHeight",n),p=_s(i,"labelX",n),v=_s(i,"labelY",n),g=t.pstyle(r+"text-margin-x").pfValue,y=t.pstyle(r+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle(r+"text-rotation"),x=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue/2,E=t.pstyle("text-background-padding").pfValue,k=f,T=h,C=T/2,P=k/2;if(m)o=p-C,s=p+C,l=v-P,u=v+P;else{switch(c.value){case"left":o=p-T,s=p;break;case"center":o=p-C,s=p+C;break;case"right":o=p,s=p+T}switch(d.value){case"top":l=v-k,u=v;break;case"center":l=v-P,u=v+P;break;case"bottom":l=v,u=v+k}}var S=g-Math.max(x,w)-E-2,B=g+Math.max(x,w)+E+2,D=y-Math.max(x,w)-E-2,_=y+Math.max(x,w)+E+2;o+=S,s+=B,l+=D,u+=_;var A=n||"main",M=a.labelBounds,R=M[A]=M[A]||{};R.x1=o,R.y1=l,R.x2=s,R.y2=u,R.w=s-o,R.h=u-l,R.leftPad=S,R.rightPad=B,R.topPad=D,R.botPad=_;var I=m&&"autorotate"===b.strValue,N=null!=b.pfValue&&0!==b.pfValue;if(I||N){var L=I?_s(a.rstyle,"labelAngle",n):b.pfValue,z=Math.cos(L),O=Math.sin(L),V=(o+s)/2,F=(l+u)/2;if(!m){switch(c.value){case"left":V=s;break;case"right":V=o}switch(d.value){case"top":F=u;break;case"bottom":F=l}}var j=function(e,t){return{x:(e-=V)*z-(t-=F)*O+V,y:e*O+t*z+F}},X=j(o,l),q=j(o,u),Y=j(s,l),W=j(s,u);o=Math.min(X.x,q.x,Y.x,W.x),s=Math.max(X.x,q.x,Y.x,W.x),l=Math.min(X.y,q.y,Y.y,W.y),u=Math.max(X.y,q.y,Y.y,W.y)}var U=A+"Rot",H=M[U]=M[U]||{};H.x1=o,H.y1=l,H.x2=s,H.y2=u,H.w=s-o,H.h=u-l,Bs(e,o,l,s,u),Bs(a.labelBounds.all,o,l,s,u)}return e}},Rs=function(e,t){if(!t.cy().headless()){var n=t.pstyle("outline-opacity").value,r=t.pstyle("outline-width").value+t.pstyle("outline-offset").value;Is(e,t,n,r,"outside",r/2)}},Is=function(e,t,n,r,a,i){if(!(0===n||r<=0||"inside"===a)){var o=t.cy(),s=t.pstyle("shape").value,l=o.renderer().nodeShapes[s],u=t.position(),c=u.x,d=u.y,h=t.width(),f=t.height();if(l.hasMiterBounds){"center"===a&&(r/=2);var p=l.miterBounds(c,d,h,f,r);Ds(e,p)}else null!=i&&i>0&&an(e,[i,i,i,i])}},Ns=function(e,t){var n,r,a,i,o,s,l,u=e._private.cy,c=u.styleEnabled(),d=u.headless(),h=en(),f=e._private,p=e.isNode(),v=e.isEdge(),g=f.rstyle,y=p&&c?e.pstyle("bounds-expansion").pfValue:[0],m=function(e){return"none"!==e.pstyle("display").value},b=!c||m(e)&&(!v||m(e.source())&&m(e.target()));if(b){var x=0;c&&t.includeOverlays&&0!==e.pstyle("overlay-opacity").value&&(x=e.pstyle("overlay-padding").value);var w=0;c&&t.includeUnderlays&&0!==e.pstyle("underlay-opacity").value&&(w=e.pstyle("underlay-padding").value);var E=Math.max(x,w),k=0;if(c&&(k=e.pstyle("width").pfValue/2),p&&t.includeNodes){var T=e.position();o=T.x,s=T.y;var C=e.outerWidth()/2,P=e.outerHeight()/2;Bs(h,n=o-C,a=s-P,r=o+C,i=s+P),c&&Rs(h,e),c&&t.includeOutlines&&!d&&Rs(h,e),c&&function(e,t){if(!t.cy().headless()){var n=t.pstyle("border-opacity").value,r=t.pstyle("border-width").pfValue,a=t.pstyle("border-position").value;Is(e,t,n,r,a)}}(h,e)}else if(v&&t.includeEdges)if(c&&!d){var S=e.pstyle("curve-style").strValue;if(n=Math.min(g.srcX,g.midX,g.tgtX),r=Math.max(g.srcX,g.midX,g.tgtX),a=Math.min(g.srcY,g.midY,g.tgtY),i=Math.max(g.srcY,g.midY,g.tgtY),Bs(h,n-=k,a-=k,r+=k,i+=k),"haystack"===S){var B=g.haystackPts;if(B&&2===B.length){if(n=B[0].x,a=B[0].y,n>(r=B[1].x)){var D=n;n=r,r=D}if(a>(i=B[1].y)){var _=a;a=i,i=_}Bs(h,n-k,a-k,r+k,i+k)}}else if("bezier"===S||"unbundled-bezier"===S||he(S,"segments")||he(S,"taxi")){var A;switch(S){case"bezier":case"unbundled-bezier":A=g.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":A=g.linePts}if(null!=A)for(var M=0;M<A.length;M++){var R=A[M];n=R.x-k,r=R.x+k,a=R.y-k,i=R.y+k,Bs(h,n,a,r,i)}}}else{var I=e.source().position(),N=e.target().position();if((n=I.x)>(r=N.x)){var L=n;n=r,r=L}if((a=I.y)>(i=N.y)){var z=a;a=i,i=z}Bs(h,n-=k,a-=k,r+=k,i+=k)}if(c&&t.includeEdges&&v&&(As(h,e,"mid-source"),As(h,e,"mid-target"),As(h,e,"source"),As(h,e,"target")),c)if("yes"===e.pstyle("ghost").value){var O=e.pstyle("ghost-offset-x").pfValue,V=e.pstyle("ghost-offset-y").pfValue;Bs(h,h.x1+O,h.y1+V,h.x2+O,h.y2+V)}var F=f.bodyBounds=f.bodyBounds||{};on(F,h),an(F,y),rn(F,1),c&&(n=h.x1,r=h.x2,a=h.y1,i=h.y2,Bs(h,n-E,a-E,r+E,i+E));var j=f.overlayBounds=f.overlayBounds||{};on(j,h),an(j,y),rn(j,1);var X=f.labelBounds=f.labelBounds||{};null!=X.all?((l=X.all).x1=1/0,l.y1=1/0,l.x2=-1/0,l.y2=-1/0,l.w=0,l.h=0):X.all=en(),c&&t.includeLabels&&(t.includeMainLabels&&Ms(h,e,null),v&&(t.includeSourceLabels&&Ms(h,e,"source"),t.includeTargetLabels&&Ms(h,e,"target")))}return h.x1=Ss(h.x1),h.y1=Ss(h.y1),h.x2=Ss(h.x2),h.y2=Ss(h.y2),h.w=Ss(h.x2-h.x1),h.h=Ss(h.y2-h.y1),h.w>0&&h.h>0&&b&&(an(h,y),rn(h,1)),h},Ls=function(e){var t=0,n=function(e){return(e?1:0)<<t++},r=0;return r+=n(e.incudeNodes),r+=n(e.includeEdges),r+=n(e.includeLabels),r+=n(e.includeMainLabels),r+=n(e.includeSourceLabels),r+=n(e.includeTargetLabels),r+=n(e.includeOverlays),r+=n(e.includeOutlines)},zs=function(e){var t=function(e){return Math.round(e)};if(e.isEdge()){var n=e.source().position(),r=e.target().position();return We([t(n.x),t(n.y),t(r.x),t(r.y)])}var a=e.position();return We([t(a.x),t(a.y)])},Os=function(e,t){var n,r=e._private,a=e.isEdge(),i=(null==t?Fs:Ls(t))===Fs;if(null==r.bbCache?(n=Ns(e,Vs),r.bbCache=n,r.bbCachePosKey=zs(e)):n=r.bbCache,!i){var o=e.isNode();n=en(),(t.includeNodes&&o||t.includeEdges&&!o)&&(t.includeOverlays?Ds(n,r.overlayBounds):Ds(n,r.bodyBounds)),t.includeLabels&&(t.includeMainLabels&&(!a||t.includeSourceLabels&&t.includeTargetLabels)?Ds(n,r.labelBounds.all):(t.includeMainLabels&&Ds(n,r.labelBounds.mainRot),t.includeSourceLabels&&Ds(n,r.labelBounds.sourceRot),t.includeTargetLabels&&Ds(n,r.labelBounds.targetRot))),n.w=n.x2-n.x1,n.h=n.y2-n.y1}return n},Vs={includeNodes:!0,includeEdges:!0,includeLabels:!0,includeMainLabels:!0,includeSourceLabels:!0,includeTargetLabels:!0,includeOverlays:!0,includeUnderlays:!0,includeOutlines:!0,useCache:!0},Fs=Ls(Vs),js=ct(Vs);Cs.boundingBox=function(e){var t,n=void 0===e||void 0===e.useCache||!0===e.useCache,r=se(function(e){var t=e._private;return null==t.bbCache||t.styleDirty||t.bbCachePosKey!==zs(e)},function(e){return e.id()});if(n&&1===this.length&&!r(this[0]))e=void 0===e?Vs:js(e),t=Os(this[0],e);else{t=en();var a=js(e=e||Vs),i=this,o=i.cy().styleEnabled();this.edges().forEach(r),this.nodes().forEach(r),o&&this.recalculateRenderedStyle(n),this.updateCompoundBounds(!n);for(var s=0;s<i.length;s++){var l=i[s];r(l)&&l.dirtyBoundingBoxCache(),Ds(t,Os(l,a))}}return t.x1=Ss(t.x1),t.y1=Ss(t.y1),t.x2=Ss(t.x2),t.y2=Ss(t.y2),t.w=Ss(t.x2-t.x1),t.h=Ss(t.y2-t.y1),t},Cs.dirtyBoundingBoxCache=function(){for(var e=0;e<this.length;e++){var t=this[e]._private;t.bbCache=null,t.bbCachePosKey=null,t.bodyBounds=null,t.overlayBounds=null,t.labelBounds.all=null,t.labelBounds.source=null,t.labelBounds.target=null,t.labelBounds.main=null,t.labelBounds.sourceRot=null,t.labelBounds.targetRot=null,t.labelBounds.mainRot=null,t.arrowBounds.source=null,t.arrowBounds.target=null,t.arrowBounds["mid-source"]=null,t.arrowBounds["mid-target"]=null}return this.emitAndNotify("bounds"),this},Cs.boundingBoxAt=function(e){var t=this.nodes(),n=this.cy(),r=n.hasCompoundNodes(),a=n.collection();if(r&&(a=t.filter(function(e){return e.isParent()}),t=t.not(a)),$(e)){var i=e;e=function(){return i}}n.startBatch(),t.forEach(function(t,n){return t._private.bbAtOldPos=e(t,n)}).silentPositions(e),r&&(a.dirtyCompoundBoundsCache(),a.dirtyBoundingBoxCache(),a.updateCompoundBounds(!0));var o=function(e){return{x1:e.x1,x2:e.x2,w:e.w,y1:e.y1,y2:e.y2,h:e.h}}(this.boundingBox({useCache:!1}));return t.silentPositions(function(e){return e._private.bbAtOldPos}),r&&(a.dirtyCompoundBoundsCache(),a.dirtyBoundingBoxCache(),a.updateCompoundBounds(!0)),n.endBatch(),o},Ts.boundingbox=Ts.bb=Ts.boundingBox,Ts.renderedBoundingbox=Ts.renderedBoundingBox;var Xs,qs,Ys=Cs;Xs=qs={};var Ws=function(e){e.uppercaseName=de(e.name),e.autoName="auto"+e.uppercaseName,e.labelName="label"+e.uppercaseName,e.outerName="outer"+e.uppercaseName,e.uppercaseOuterName=de(e.outerName),Xs[e.name]=function(){var t=this[0],n=t._private,r=n.cy._private.styleEnabled;if(t){if(r){if(t.isParent())return t.updateCompoundBounds(),n[e.autoName]||0;var a=t.pstyle(e.name);return"label"===a.strValue?(t.recalculateRenderedStyle(),n.rstyle[e.labelName]||0):a.pfValue}return 1}},Xs["outer"+e.uppercaseName]=function(){var t=this[0],n=t._private.cy._private.styleEnabled;if(t){if(n){var r=t[e.name](),a=t.pstyle("border-position").value;return r+("center"===a?t.pstyle("border-width").pfValue:"outside"===a?2*t.pstyle("border-width").pfValue:0)+2*t.padding()}return 1}},Xs["rendered"+e.uppercaseName]=function(){var t=this[0];if(t)return t[e.name]()*this.cy().zoom()},Xs["rendered"+e.uppercaseOuterName]=function(){var t=this[0];if(t)return t[e.outerName]()*this.cy().zoom()}};Ws({name:"width"}),Ws({name:"height"}),qs.padding=function(){var e=this[0],t=e._private;return e.isParent()?(e.updateCompoundBounds(),void 0!==t.autoPadding?t.autoPadding:e.pstyle("padding").pfValue):e.pstyle("padding").pfValue},qs.paddedHeight=function(){var e=this[0];return e.height()+2*e.padding()},qs.paddedWidth=function(){var e=this[0];return e.width()+2*e.padding()};var Us=qs,Hs={controlPoints:{get:function(e){return e.renderer().getControlPoints(e)},mult:!0},segmentPoints:{get:function(e){return e.renderer().getSegmentPoints(e)},mult:!0},sourceEndpoint:{get:function(e){return e.renderer().getSourceEndpoint(e)}},targetEndpoint:{get:function(e){return e.renderer().getTargetEndpoint(e)}},midpoint:{get:function(e){return e.renderer().getEdgeMidpoint(e)}}},Ks=Object.keys(Hs).reduce(function(e,t){var n=Hs[t],r=function(e){return"rendered"+e[0].toUpperCase()+e.substr(1)}(t);return e[t]=function(){return function(e,t){if(e.isEdge()&&e.takesUpSpace())return t(e)}(this,n.get)},n.mult?e[r]=function(){return function(e,t){if(e.isEdge()&&e.takesUpSpace()){var n=e.cy(),r=n.pan(),a=n.zoom();return t(e).map(function(e){return Xt(e,a,r)})}}(this,n.get)}:e[r]=function(){return function(e,t){if(e.isEdge()&&e.takesUpSpace()){var n=e.cy();return Xt(t(e),n.zoom(),n.pan())}}(this,n.get)},e},{}),Gs=be({},Ps,Ys,Us,Ks),Zs=function(e,t){this.recycle(e,t)};function $s(){return!1}function Qs(){return!0}Zs.prototype={instanceString:function(){return"event"},recycle:function(e,t){if(this.isImmediatePropagationStopped=this.isPropagationStopped=this.isDefaultPrevented=$s,null!=e&&e.preventDefault?(this.type=e.type,this.isDefaultPrevented=e.defaultPrevented?Qs:$s):null!=e&&e.type?t=e:this.type=e,null!=t&&(this.originalEvent=t.originalEvent,this.type=null!=t.type?t.type:this.type,this.cy=t.cy,this.target=t.target,this.position=t.position,this.renderedPosition=t.renderedPosition,this.namespace=t.namespace,this.layout=t.layout),null!=this.cy&&null!=this.position&&null==this.renderedPosition){var n=this.position,r=this.cy.zoom(),a=this.cy.pan();this.renderedPosition={x:n.x*r+a.x,y:n.y*r+a.y}}this.timeStamp=e&&e.timeStamp||Date.now()},preventDefault:function(){this.isDefaultPrevented=Qs;var e=this.originalEvent;e&&e.preventDefault&&e.preventDefault()},stopPropagation:function(){this.isPropagationStopped=Qs;var e=this.originalEvent;e&&e.stopPropagation&&e.stopPropagation()},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Qs,this.stopPropagation()},isDefaultPrevented:$s,isPropagationStopped:$s,isImmediatePropagationStopped:$s};var Js=/^([^.]+)(\.(?:[^.]+))?$/,el={qualifierCompare:function(e,t){return e===t},eventMatches:function(){return!0},addEventFields:function(){},callbackContext:function(e){return e},beforeEmit:function(){},afterEmit:function(){},bubble:function(){return!1},parent:function(){return null},context:null},tl=Object.keys(el),nl={};function rl(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:nl,t=arguments.length>1?arguments[1]:void 0,n=0;n<tl.length;n++){var r=tl[n];this[r]=e[r]||el[r]}this.context=t||this.context,this.listeners=[],this.emitting=0}var al=rl.prototype,il=function(e,t,n,r,a,i,o){G(r)&&(a=r,r=null),o&&(i=null==i?o:be({},i,o));for(var s=Z(n)?n:n.split(/\s+/),l=0;l<s.length;l++){var u=s[l];if(!ie(u)){var c=u.match(Js);if(c)if(!1===t(e,u,c[1],c[2]?c[2]:null,r,a,i))break}}},ol=function(e,t){return e.addEventFields(e.context,t),new Zs(t.type,t)},sl=function(e,t,n){if("event"!==H(n))if($(n))t(e,ol(e,n));else for(var r=Z(n)?n:n.split(/\s+/),a=0;a<r.length;a++){var i=r[a];if(!ie(i)){var o=i.match(Js);if(o){var s=o[1],l=o[2]?o[2]:null;t(e,ol(e,{type:s,namespace:l,target:e.context}))}}}else t(e,n)};al.on=al.addListener=function(e,t,n,r,a){return il(this,function(e,t,n,r,a,i,o){G(i)&&e.listeners.push({event:t,callback:i,type:n,namespace:r,qualifier:a,conf:o})},e,t,n,r,a),this},al.one=function(e,t,n,r){return this.on(e,t,n,r,{one:!0})},al.removeListener=al.off=function(e,t,n,r){var a=this;0!==this.emitting&&(this.listeners=this.listeners.slice());for(var i=this.listeners,o=function(o){var s=i[o];il(a,function(t,n,r,a,l,u){if((s.type===r||"*"===e)&&(!a&&".*"!==s.namespace||s.namespace===a)&&(!l||t.qualifierCompare(s.qualifier,l))&&(!u||s.callback===u))return i.splice(o,1),!1},e,t,n,r)},s=i.length-1;s>=0;s--)o(s);return this},al.removeAllListeners=function(){return this.removeListener("*")},al.emit=al.trigger=function(e,t,n){var r=this.listeners,a=r.length;return this.emitting++,Z(t)||(t=[t]),sl(this,function(e,i){null!=n&&(r=[{event:i.event,type:i.type,namespace:i.namespace,callback:n}],a=r.length);for(var o=function(){var n=r[s];if(n.type===i.type&&(!n.namespace||n.namespace===i.namespace||".*"===n.namespace)&&e.eventMatches(e.context,n,i)){var a=[i];null!=t&&function(e,t){for(var n=0;n<t.length;n++){var r=t[n];e.push(r)}}(a,t),e.beforeEmit(e.context,n,i),n.conf&&n.conf.one&&(e.listeners=e.listeners.filter(function(e){return e!==n}));var o=e.callbackContext(e.context,n,i),l=n.callback.apply(o,a);e.afterEmit(e.context,n,i),!1===l&&(i.stopPropagation(),i.preventDefault())}},s=0;s<a;s++)o();e.bubble(e.context)&&!i.isPropagationStopped()&&e.parent(e.context).emit(i,t)},e),this.emitting--,this};var ll={qualifierCompare:function(e,t){return null==e||null==t?null==e&&null==t:e.sameText(t)},eventMatches:function(e,t,n){var r=t.qualifier;return null==r||e!==n.target&&te(n.target)&&r.matches(n.target)},addEventFields:function(e,t){t.cy=e.cy(),t.target=e},callbackContext:function(e,t,n){return null!=t.qualifier?n.target:e},beforeEmit:function(e,t){t.conf&&t.conf.once&&t.conf.onceCollection.removeListener(t.event,t.qualifier,t.callback)},bubble:function(){return!0},parent:function(e){return e.isChild()?e.parent():e.cy()}},ul=function(e){return K(e)?new is(e):e},cl={createEmitter:function(){for(var e=0;e<this.length;e++){var t=this[e],n=t._private;n.emitter||(n.emitter=new rl(ll,t))}return this},emitter:function(){return this._private.emitter},on:function(e,t,n){for(var r=ul(t),a=0;a<this.length;a++){this[a].emitter().on(e,r,n)}return this},removeListener:function(e,t,n){for(var r=ul(t),a=0;a<this.length;a++){this[a].emitter().removeListener(e,r,n)}return this},removeAllListeners:function(){for(var e=0;e<this.length;e++){this[e].emitter().removeAllListeners()}return this},one:function(e,t,n){for(var r=ul(t),a=0;a<this.length;a++){this[a].emitter().one(e,r,n)}return this},once:function(e,t,n){for(var r=ul(t),a=0;a<this.length;a++){this[a].emitter().on(e,r,n,{once:!0,onceCollection:this})}},emit:function(e,t){for(var n=0;n<this.length;n++){this[n].emitter().emit(e,t)}return this},emitAndNotify:function(e,t){if(0!==this.length)return this.cy().notify(e,this),this.emit(e,t),this}};wo.eventAliasesOn(cl);var dl={nodes:function(e){return this.filter(function(e){return e.isNode()}).filter(e)},edges:function(e){return this.filter(function(e){return e.isEdge()}).filter(e)},byGroup:function(){for(var e=this.spawn(),t=this.spawn(),n=0;n<this.length;n++){var r=this[n];r.isNode()?e.push(r):t.push(r)}return{nodes:e,edges:t}},filter:function(e,t){if(void 0===e)return this;if(K(e)||ee(e))return new is(e).filter(this);if(G(e)){for(var n=this.spawn(),r=this,a=0;a<r.length;a++){var i=r[a];(t?e.apply(t,[i,a,r]):e(i,a,r))&&n.push(i)}return n}return this.spawn()},not:function(e){if(e){K(e)&&(e=this.filter(e));for(var t=this.spawn(),n=0;n<this.length;n++){var r=this[n];e.has(r)||t.push(r)}return t}return this},absoluteComplement:function(){return this.cy().mutableElements().not(this)},intersect:function(e){if(K(e)){var t=e;return this.filter(t)}for(var n=this.spawn(),r=e,a=this.length<e.length,i=a?this:r,o=a?r:this,s=0;s<i.length;s++){var l=i[s];o.has(l)&&n.push(l)}return n},xor:function(e){var t=this._private.cy;K(e)&&(e=t.$(e));var n=this.spawn(),r=e,a=function(e,t){for(var r=0;r<e.length;r++){var a=e[r],i=a._private.data.id;t.hasElementWithId(i)||n.push(a)}};return a(this,r),a(r,this),n},diff:function(e){var t=this._private.cy;K(e)&&(e=t.$(e));var n=this.spawn(),r=this.spawn(),a=this.spawn(),i=e,o=function(e,t,n){for(var r=0;r<e.length;r++){var i=e[r],o=i._private.data.id;t.hasElementWithId(o)?a.merge(i):n.push(i)}};return o(this,i,n),o(i,this,r),{left:n,right:r,both:a}},add:function(e){var t=this._private.cy;if(!e)return this;if(K(e)){var n=e;e=t.mutableElements().filter(n)}for(var r=this.spawnSelf(),a=0;a<e.length;a++){var i=e[a],o=!this.has(i);o&&r.push(i)}return r},merge:function(e){var t=this._private,n=t.cy;if(!e)return this;if(e&&K(e)){var r=e;e=n.mutableElements().filter(r)}for(var a=t.map,i=0;i<e.length;i++){var o=e[i],s=o._private.data.id;if(!a.has(s)){var l=this.length++;this[l]=o,a.set(s,{ele:o,index:l})}}return this},unmergeAt:function(e){var t=this[e].id(),n=this._private.map;this[e]=void 0,n.delete(t);var r=e===this.length-1;if(this.length>1&&!r){var a=this.length-1,i=this[a],o=i._private.data.id;this[a]=void 0,this[e]=i,n.set(o,{ele:i,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,n=e._private.data.id,r=t.map.get(n);if(!r)return this;var a=r.index;return this.unmergeAt(a),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&K(e)){var n=e;e=t.mutableElements().filter(n)}for(var r=0;r<e.length;r++)this.unmergeOne(e[r]);return this},unmergeBy:function(e){for(var t=this.length-1;t>=0;t--){e(this[t])&&this.unmergeAt(t)}return this},map:function(e,t){for(var n=[],r=this,a=0;a<r.length;a++){var i=r[a],o=t?e.apply(t,[i,a,r]):e(i,a,r);n.push(o)}return n},reduce:function(e,t){for(var n=t,r=this,a=0;a<r.length;a++)n=e(n,r[a],a,r);return n},max:function(e,t){for(var n,r=-1/0,a=this,i=0;i<a.length;i++){var o=a[i],s=t?e.apply(t,[o,i,a]):e(o,i,a);s>r&&(r=s,n=o)}return{value:r,ele:n}},min:function(e,t){for(var n,r=1/0,a=this,i=0;i<a.length;i++){var o=a[i],s=t?e.apply(t,[o,i,a]):e(o,i,a);s<r&&(r=s,n=o)}return{value:r,ele:n}}},hl=dl;hl.u=hl["|"]=hl["+"]=hl.union=hl.or=hl.add,hl["\\"]=hl["!"]=hl["-"]=hl.difference=hl.relativeComplement=hl.subtract=hl.not,hl.n=hl["&"]=hl["."]=hl.and=hl.intersection=hl.intersect,hl["^"]=hl["(+)"]=hl["(-)"]=hl.symmetricDifference=hl.symdiff=hl.xor,hl.fnFilter=hl.filterFn=hl.stdFilter=hl.filter,hl.complement=hl.abscomp=hl.absoluteComplement;var fl=function(e,t){var n=e.cy().hasCompoundNodes();function r(e){var t=e.pstyle("z-compound-depth");return"auto"===t.value?n?e.zDepth():0:"bottom"===t.value?-1:"top"===t.value?Qe:0}var a=r(e)-r(t);if(0!==a)return a;function i(e){return"auto"===e.pstyle("z-index-compare").value&&e.isNode()?1:0}var o=i(e)-i(t);if(0!==o)return o;var s=e.pstyle("z-index").value-t.pstyle("z-index").value;return 0!==s?s:e.poolIndex()-t.poolIndex()},pl={forEach:function(e,t){if(G(e))for(var n=this.length,r=0;r<n;r++){var a=this[r];if(!1===(t?e.apply(t,[a,r,this]):e(a,r,this)))break}return this},toArray:function(){for(var e=[],t=0;t<this.length;t++)e.push(this[t]);return e},slice:function(e,t){var n=[],r=this.length;null==t&&(t=r),null==e&&(e=0),e<0&&(e=r+e),t<0&&(t=r+t);for(var a=e;a>=0&&a<t&&a<r;a++)n.push(this[a]);return this.spawn(n)},size:function(){return this.length},eq:function(e){return this[e]||this.spawn()},first:function(){return this[0]||this.spawn()},last:function(){return this[this.length-1]||this.spawn()},empty:function(){return 0===this.length},nonempty:function(){return!this.empty()},sort:function(e){if(!G(e))return this;var t=this.toArray().sort(e);return this.spawn(t)},sortByZIndex:function(){return this.sort(fl)},zDepth:function(){var e=this[0];if(e){var t=e._private;if("nodes"===t.group){var n=t.data.parent?e.parents().size():0;return e.isParent()?n:Qe-1}var r=t.source,a=t.target,i=r.zDepth(),o=a.zDepth();return Math.max(i,o,0)}}};pl.each=pl.forEach;var vl;vl="undefined",("undefined"==typeof Symbol?"undefined":d(Symbol))!=vl&&d(Symbol.iterator)!=vl&&(pl[Symbol.iterator]=function(){var e=this,t={value:void 0,done:!1},n=0,r=this.length;return s({next:function(){return n<r?t.value=e[n++]:(t.value=void 0,t.done=!0),t}},Symbol.iterator,function(){return this})});var gl=ct({nodeDimensionsIncludeLabels:!1}),yl={layoutDimensions:function(e){var t;if(e=gl(e),this.takesUpSpace())if(e.nodeDimensionsIncludeLabels){var n=this.boundingBox();t={w:n.w,h:n.h}}else t={w:this.outerWidth(),h:this.outerHeight()};else t={w:0,h:0};return 0!==t.w&&0!==t.h||(t.w=t.h=1),t},layoutPositions:function(e,t,n){var r=this.nodes().filter(function(e){return!e.isParent()}),a=this.cy(),i=t.eles,o=function(e){return e.id()},s=se(n,o);e.emit({type:"layoutstart",layout:e}),e.animations=[];var l=t.spacingFactor&&1!==t.spacingFactor,u=function(){if(!l)return null;for(var e=en(),t=0;t<r.length;t++){var n=r[t],a=s(n,t);nn(e,a.x,a.y)}return e}(),c=se(function(e,n){var r=s(e,n);l&&(r=function(e,t,n){var r=t.x1+t.w/2,a=t.y1+t.h/2;return{x:r+(n.x-r)*e,y:a+(n.y-a)*e}}(Math.abs(t.spacingFactor),u,r));return null!=t.transform&&(r=t.transform(e,r)),r},o);if(t.animate){for(var d=0;d<r.length;d++){var h=r[d],f=c(h,d);if(null==t.animateFilter||t.animateFilter(h,d)){var p=h.animation({position:f,duration:t.animationDuration,easing:t.animationEasing});e.animations.push(p)}else h.position(f)}if(t.fit){var v=a.animation({fit:{boundingBox:i.boundingBoxAt(c),padding:t.padding},duration:t.animationDuration,easing:t.animationEasing});e.animations.push(v)}else if(void 0!==t.zoom&&void 0!==t.pan){var g=a.animation({zoom:t.zoom,pan:t.pan,duration:t.animationDuration,easing:t.animationEasing});e.animations.push(g)}e.animations.forEach(function(e){return e.play()}),e.one("layoutready",t.ready),e.emit({type:"layoutready",layout:e}),Kr.all(e.animations.map(function(e){return e.promise()})).then(function(){e.one("layoutstop",t.stop),e.emit({type:"layoutstop",layout:e})})}else r.positions(c),t.fit&&a.fit(t.eles,t.padding),null!=t.zoom&&a.zoom(t.zoom),t.pan&&a.pan(t.pan),e.one("layoutready",t.ready),e.emit({type:"layoutready",layout:e}),e.one("layoutstop",t.stop),e.emit({type:"layoutstop",layout:e});return this},layout:function(e){return this.cy().makeLayout(be({},e,{eles:this}))}};function ml(e,t,n){var r,a=n._private,i=a.styleCache=a.styleCache||[];return null!=(r=i[e])?r:r=i[e]=t(n)}function bl(e,t){return e=Ue(e),function(n){return ml(e,t,n)}}function xl(e,t){e=Ue(e);var n=function(e){return t.call(e)};return function(){var t=this[0];if(t)return ml(e,n,t)}}yl.createLayout=yl.makeLayout=yl.layout;var wl={recalculateRenderedStyle:function(e){var t=this.cy(),n=t.renderer(),r=t.styleEnabled();return n&&r&&n.recalculateRenderedStyle(this,e),this},dirtyStyleCache:function(){var e,t=this.cy(),n=function(e){return e._private.styleCache=null};t.hasCompoundNodes()?((e=this.spawnSelf().merge(this.descendants()).merge(this.parents())).merge(e.connectedEdges()),e.forEach(n)):this.forEach(function(e){n(e),e.connectedEdges().forEach(n)});return this},updateStyle:function(e){var t=this._private.cy;if(!t.styleEnabled())return this;if(t.batching())return t._private.batchStyleEles.merge(this),this;var n=this;e=!(!e&&void 0!==e),t.hasCompoundNodes()&&(n=this.spawnSelf().merge(this.descendants()).merge(this.parents()));var r=n;return e?r.emitAndNotify("style"):r.emit("style"),n.forEach(function(e){return e._private.styleDirty=!0}),this},cleanStyle:function(){var e=this.cy();if(e.styleEnabled())for(var t=0;t<this.length;t++){var n=this[t];n._private.styleDirty&&(n._private.styleDirty=!1,e.style().apply(n))}},parsedStyle:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this[0],r=n.cy();if(r.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,r.style().apply(n));var a=n._private.style[e];return null!=a?a:t?r.style().getDefaultProperty(e):null}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var n=t.pstyle(e);return void 0!==n.pfValue?n.pfValue:n.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled())return t?t.pstyle(e).units:void 0},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=this[0];return n?t.style().getRenderedStyle(n,e):void 0},style:function(e,t){var n=this.cy();if(!n.styleEnabled())return this;var r=!1,a=n.style();if($(e)){var i=e;a.applyBypass(this,i,r),this.emitAndNotify("style")}else if(K(e)){if(void 0===t){var o=this[0];return o?a.getStylePropertyValue(o,e):void 0}a.applyBypass(this,e,t,r),this.emitAndNotify("style")}else if(void 0===e){var s=this[0];return s?a.getRawStyle(s):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=!1,r=t.style(),a=this;if(void 0===e)for(var i=0;i<a.length;i++){var o=a[i];r.removeAllBypasses(o,n)}else{e=e.split(/\s+/);for(var s=0;s<a.length;s++){var l=a[s];r.removeBypasses(l,e,n)}}return this.emitAndNotify("style"),this},show:function(){return this.css("display","element"),this},hide:function(){return this.css("display","none"),this},effectiveOpacity:function(){var e=this.cy();if(!e.styleEnabled())return 1;var t=e.hasCompoundNodes(),n=this[0];if(n){var r=n._private,a=n.pstyle("opacity").value;if(!t)return a;var i=r.data.parent?n.parents():null;if(i)for(var o=0;o<i.length;o++){a*=i[o].pstyle("opacity").value}return a}},transparent:function(){if(!this.cy().styleEnabled())return!1;var e=this[0],t=e.cy().hasCompoundNodes();return e?t?0===e.effectiveOpacity():0===e.pstyle("opacity").value:void 0},backgrounding:function(){return!!this.cy().styleEnabled()&&!!this[0]._private.backgrounding}};function El(e,t){var n=e._private.data.parent?e.parents():null;if(n)for(var r=0;r<n.length;r++){if(!t(n[r]))return!1}return!0}function kl(e){var t=e.ok,n=e.edgeOkViaNode||e.ok,r=e.parentOk||e.ok;return function(){var e=this.cy();if(!e.styleEnabled())return!0;var a=this[0],i=e.hasCompoundNodes();if(a){var o=a._private;if(!t(a))return!1;if(a.isNode())return!i||El(a,r);var s=o.source,l=o.target;return n(s)&&(!i||El(s,n))&&(s===l||n(l)&&(!i||El(l,n)))}}}var Tl=bl("eleTakesUpSpace",function(e){return"element"===e.pstyle("display").value&&0!==e.width()&&(!e.isNode()||0!==e.height())});wl.takesUpSpace=xl("takesUpSpace",kl({ok:Tl}));var Cl=bl("eleInteractive",function(e){return"yes"===e.pstyle("events").value&&"visible"===e.pstyle("visibility").value&&Tl(e)}),Pl=bl("parentInteractive",function(e){return"visible"===e.pstyle("visibility").value&&Tl(e)});wl.interactive=xl("interactive",kl({ok:Cl,parentOk:Pl,edgeOkViaNode:Tl})),wl.noninteractive=function(){var e=this[0];if(e)return!e.interactive()};var Sl=bl("eleVisible",function(e){return"visible"===e.pstyle("visibility").value&&0!==e.pstyle("opacity").pfValue&&Tl(e)}),Bl=Tl;wl.visible=xl("visible",kl({ok:Sl,edgeOkViaNode:Bl})),wl.hidden=function(){var e=this[0];if(e)return!e.visible()},wl.isBundledBezier=xl("isBundledBezier",function(){return!!this.cy().styleEnabled()&&(!this.removed()&&"bezier"===this.pstyle("curve-style").value&&this.takesUpSpace())}),wl.bypass=wl.css=wl.style,wl.renderedCss=wl.renderedStyle,wl.removeBypass=wl.removeCss=wl.removeStyle,wl.pstyle=wl.parsedStyle;var Dl={};function _l(e){return function(){var t=arguments,n=[];if(2===t.length){var r=t[0],a=t[1];this.on(e.event,r,a)}else if(1===t.length&&G(t[0])){var i=t[0];this.on(e.event,i)}else if(0===t.length||1===t.length&&Z(t[0])){for(var o=1===t.length?t[0]:null,s=0;s<this.length;s++){var l=this[s],u=!e.ableField||l._private[e.ableField],c=l._private[e.field]!=e.value;if(e.overrideAble){var d=e.overrideAble(l);if(void 0!==d&&(u=d,!d))return this}u&&(l._private[e.field]=e.value,c&&n.push(l))}var h=this.spawn(n);h.updateStyle(),h.emit(e.event),o&&h.emit(o)}return this}}function Al(e){Dl[e.field]=function(){var t=this[0];if(t){if(e.overrideField){var n=e.overrideField(t);if(void 0!==n)return n}return t._private[e.field]}},Dl[e.on]=_l({event:e.on,field:e.field,ableField:e.ableField,overrideAble:e.overrideAble,value:!0}),Dl[e.off]=_l({event:e.off,field:e.field,ableField:e.ableField,overrideAble:e.overrideAble,value:!1})}Al({field:"locked",overrideField:function(e){return!!e.cy().autolock()||void 0},on:"lock",off:"unlock"}),Al({field:"grabbable",overrideField:function(e){return!e.cy().autoungrabify()&&!e.pannable()&&void 0},on:"grabify",off:"ungrabify"}),Al({field:"selected",ableField:"selectable",overrideAble:function(e){return!e.cy().autounselectify()&&void 0},on:"select",off:"unselect"}),Al({field:"selectable",overrideField:function(e){return!e.cy().autounselectify()&&void 0},on:"selectify",off:"unselectify"}),Dl.deselect=Dl.unselect,Dl.grabbed=function(){var e=this[0];if(e)return e._private.grabbed},Al({field:"active",on:"activate",off:"unactivate"}),Al({field:"pannable",on:"panify",off:"unpanify"}),Dl.inactive=function(){var e=this[0];if(e)return!e._private.active};var Ml={},Rl=function(e){return function(t){for(var n=[],r=0;r<this.length;r++){var a=this[r];if(a.isNode()){for(var i=!1,o=a.connectedEdges(),s=0;s<o.length;s++){var l=o[s],u=l.source(),c=l.target();if(e.noIncomingEdges&&c===a&&u!==a||e.noOutgoingEdges&&u===a&&c!==a){i=!0;break}}i||n.push(a)}}return this.spawn(n,!0).filter(t)}},Il=function(e){return function(t){for(var n=[],r=0;r<this.length;r++){var a=this[r];if(a.isNode())for(var i=a.connectedEdges(),o=0;o<i.length;o++){var s=i[o],l=s.source(),u=s.target();e.outgoing&&l===a?(n.push(s),n.push(u)):e.incoming&&u===a&&(n.push(s),n.push(l))}}return this.spawn(n,!0).filter(t)}},Nl=function(e){return function(t){for(var n=this,r=[],a={};;){var i=e.outgoing?n.outgoers():n.incomers();if(0===i.length)break;for(var o=!1,s=0;s<i.length;s++){var l=i[s],u=l.id();a[u]||(a[u]=!0,r.push(l),o=!0)}if(!o)break;n=i}return this.spawn(r,!0).filter(t)}};function Ll(e){return function(t){for(var n=[],r=0;r<this.length;r++){var a=this[r]._private[e.attr];a&&n.push(a)}return this.spawn(n,!0).filter(t)}}function zl(e){return function(t){var n=[],r=this._private.cy,a=e||{};K(t)&&(t=r.$(t));for(var i=0;i<t.length;i++)for(var o=t[i]._private.edges,s=0;s<o.length;s++){var l=o[s],u=l._private.data,c=this.hasElementWithId(u.source)&&t.hasElementWithId(u.target),d=t.hasElementWithId(u.source)&&this.hasElementWithId(u.target);if(c||d){if(a.thisIsSrc||a.thisIsTgt){if(a.thisIsSrc&&!c)continue;if(a.thisIsTgt&&!d)continue}n.push(l)}}return this.spawn(n,!0)}}function Ol(e){return e=be({},{codirected:!1},e),function(t){for(var n=[],r=this.edges(),a=e,i=0;i<r.length;i++)for(var o=r[i]._private,s=o.source,l=s._private.data.id,u=o.data.target,c=s._private.edges,d=0;d<c.length;d++){var h=c[d],f=h._private.data,p=f.target,v=f.source,g=p===u&&v===l,y=l===p&&u===v;(a.codirected&&g||!a.codirected&&(g||y))&&n.push(h)}return this.spawn(n,!0).filter(t)}}Ml.clearTraversalCache=function(){for(var e=0;e<this.length;e++)this[e]._private.traversalCache=null},be(Ml,{roots:Rl({noIncomingEdges:!0}),leaves:Rl({noOutgoingEdges:!0}),outgoers:cs(Il({outgoing:!0}),"outgoers"),successors:Nl({outgoing:!0}),incomers:cs(Il({incoming:!0}),"incomers"),predecessors:Nl({})}),be(Ml,{neighborhood:cs(function(e){for(var t=[],n=this.nodes(),r=0;r<n.length;r++)for(var a=n[r],i=a.connectedEdges(),o=0;o<i.length;o++){var s=i[o],l=s.source(),u=s.target(),c=a===l?u:l;c.length>0&&t.push(c[0]),t.push(s[0])}return this.spawn(t,!0).filter(e)},"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),Ml.neighbourhood=Ml.neighborhood,Ml.closedNeighbourhood=Ml.closedNeighborhood,Ml.openNeighbourhood=Ml.openNeighborhood,be(Ml,{source:cs(function(e){var t,n=this[0];return n&&(t=n._private.source||n.cy().collection()),t&&e?t.filter(e):t},"source"),target:cs(function(e){var t,n=this[0];return n&&(t=n._private.target||n.cy().collection()),t&&e?t.filter(e):t},"target"),sources:Ll({attr:"source"}),targets:Ll({attr:"target"})}),be(Ml,{edgesWith:cs(zl(),"edgesWith"),edgesTo:cs(zl({thisIsSrc:!0}),"edgesTo")}),be(Ml,{connectedEdges:cs(function(e){for(var t=[],n=0;n<this.length;n++){var r=this[n];if(r.isNode())for(var a=r._private.edges,i=0;i<a.length;i++){var o=a[i];t.push(o)}}return this.spawn(t,!0).filter(e)},"connectedEdges"),connectedNodes:cs(function(e){for(var t=[],n=0;n<this.length;n++){var r=this[n];r.isEdge()&&(t.push(r.source()[0]),t.push(r.target()[0]))}return this.spawn(t,!0).filter(e)},"connectedNodes"),parallelEdges:cs(Ol(),"parallelEdges"),codirectedEdges:cs(Ol({codirected:!0}),"codirectedEdges")}),be(Ml,{components:function(e){var t=this,n=t.cy(),r=n.collection(),a=null==e?t.nodes():e.nodes(),i=[];null!=e&&a.empty()&&(a=e.sources());var o=function(e,t){r.merge(e),a.unmerge(e),t.merge(e)};if(a.empty())return t.spawn();var s=function(){var e=n.collection();i.push(e);var r=a[0];o(r,e),t.bfs({directed:!1,roots:r,visit:function(t){return o(t,e)}}),e.forEach(function(n){n.connectedEdges().forEach(function(n){t.has(n)&&e.has(n.source())&&e.has(n.target())&&e.merge(n)})})};do{s()}while(a.length>0);return i},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}}),Ml.componentsOf=Ml.components;var Vl=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(void 0!==e){var a=new vt,i=!1;if(t){if(t.length>0&&$(t[0])&&!te(t[0])){i=!0;for(var o=[],s=new yt,l=0,u=t.length;l<u;l++){var c=t[l];null==c.data&&(c.data={});var d=c.data;if(null==d.id)d.id=st();else if(e.hasElementWithId(d.id)||s.has(d.id))continue;var h=new mt(e,c,!1);o.push(h),s.add(d.id)}t=o}}else t=[];this.length=0;for(var f=0,p=t.length;f<p;f++){var v=t[f][0];if(null!=v){var g=v._private.data.id;n&&a.has(g)||(n&&a.set(g,{index:this.length,ele:v}),this[this.length]=v,this.length++)}}this._private={eles:this,cy:e,get map(){return null==this.lazyMap&&this.rebuildMap(),this.lazyMap},set map(e){this.lazyMap=e},rebuildMap:function(){for(var e=this.lazyMap=new vt,t=this.eles,n=0;n<t.length;n++){var r=t[n];e.set(r.id(),{index:n,ele:r})}}},n&&(this._private.map=a),i&&!r&&this.restore()}else rt("A collection must have a reference to the core")},Fl=mt.prototype=Vl.prototype=Object.create(Array.prototype);Fl.instanceString=function(){return"collection"},Fl.spawn=function(e,t){return new Vl(this.cy(),e,t)},Fl.spawnSelf=function(){return this.spawn(this)},Fl.cy=function(){return this._private.cy},Fl.renderer=function(){return this._private.cy.renderer()},Fl.element=function(){return this[0]},Fl.collection=function(){return ne(this)?this:new Vl(this._private.cy,[this])},Fl.unique=function(){return new Vl(this._private.cy,this,!0)},Fl.hasElementWithId=function(e){return e=""+e,this._private.map.has(e)},Fl.getElementById=function(e){e=""+e;var t=this._private.cy,n=this._private.map.get(e);return n?n.ele:new Vl(t)},Fl.$id=Fl.getElementById,Fl.poolIndex=function(){var e=this._private.cy._private.elements,t=this[0]._private.data.id;return e._private.map.get(t).index},Fl.indexOf=function(e){var t=e[0]._private.data.id;return this._private.map.get(t).index},Fl.indexOfId=function(e){return e=""+e,this._private.map.get(e).index},Fl.json=function(e){var t=this.element(),n=this.cy();if(null==t&&e)return this;if(null!=t){var r=t._private;if($(e)){if(n.startBatch(),e.data){t.data(e.data);var a=r.data;if(t.isEdge()){var i=!1,o={},s=e.data.source,l=e.data.target;null!=s&&s!=a.source&&(o.source=""+s,i=!0),null!=l&&l!=a.target&&(o.target=""+l,i=!0),i&&(t=t.move(o))}else{var u="parent"in e.data,c=e.data.parent;!u||null==c&&null==a.parent||c==a.parent||(void 0===c&&(c=null),null!=c&&(c=""+c),t=t.move({parent:c}))}}e.position&&t.position(e.position);var d=function(n,a,i){var o=e[n];null!=o&&o!==r[n]&&(o?t[a]():t[i]())};return d("removed","remove","restore"),d("selected","select","unselect"),d("selectable","selectify","unselectify"),d("locked","lock","unlock"),d("grabbable","grabify","ungrabify"),d("pannable","panify","unpanify"),null!=e.classes&&t.classes(e.classes),n.endBatch(),this}if(void 0===e){var h={data:ot(r.data),position:ot(r.position),group:r.group,removed:r.removed,selected:r.selected,selectable:r.selectable,locked:r.locked,grabbable:r.grabbable,pannable:r.pannable,classes:null};h.classes="";var f=0;return r.classes.forEach(function(e){return h.classes+=0===f++?e:" "+e}),h}}},Fl.jsons=function(){for(var e=[],t=0;t<this.length;t++){var n=this[t].json();e.push(n)}return e},Fl.clone=function(){for(var e=this.cy(),t=[],n=0;n<this.length;n++){var r=this[n].json(),a=new mt(e,r,!1);t.push(a)}return new Vl(e,t)},Fl.copy=Fl.clone,Fl.restore=function(){for(var e,t,n=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=this,i=a.cy(),o=i._private,s=[],l=[],u=0,c=a.length;u<c;u++){var d=a[u];r&&!d.removed()||(d.isNode()?s.push(d):l.push(d))}e=s.concat(l);var h=function(){e.splice(t,1),t--};for(t=0;t<e.length;t++){var f=e[t],p=f._private,v=p.data;if(f.clearTraversalCache(),r||p.removed)if(void 0===v.id)v.id=st();else if(Q(v.id))v.id=""+v.id;else{if(ie(v.id)||!K(v.id)){rt("Can not create element with invalid string ID `"+v.id+"`"),h();continue}if(i.hasElementWithId(v.id)){rt("Can not create second element with ID `"+v.id+"`"),h();continue}}else;var g=v.id;if(f.isNode()){var y=p.position;null==y.x&&(y.x=0),null==y.y&&(y.y=0)}if(f.isEdge()){for(var m=f,b=["source","target"],x=b.length,w=!1,E=0;E<x;E++){var k=b[E],T=v[k];Q(T)&&(T=v[k]=""+v[k]),null==T||""===T?(rt("Can not create edge `"+g+"` with unspecified "+k),w=!0):i.hasElementWithId(T)||(rt("Can not create edge `"+g+"` with nonexistant "+k+" `"+T+"`"),w=!0)}if(w){h();continue}var C=i.getElementById(v.source),P=i.getElementById(v.target);C.same(P)?C._private.edges.push(m):(C._private.edges.push(m),P._private.edges.push(m)),m._private.source=C,m._private.target=P}p.map=new vt,p.map.set(g,{ele:f,index:0}),p.removed=!1,r&&i.addToPool(f)}for(var S=0;S<s.length;S++){var B=s[S],D=B._private.data;Q(D.parent)&&(D.parent=""+D.parent);var _=D.parent;if(null!=_||B._private.parent){var A=B._private.parent?i.collection().merge(B._private.parent):i.getElementById(_);if(A.empty())D.parent=void 0;else if(A[0].removed())it("Node added with missing parent, reference to parent removed"),D.parent=void 0,B._private.parent=null;else{for(var M=!1,R=A;!R.empty();){if(B.same(R)){M=!0,D.parent=void 0;break}R=R.parent()}M||(A[0]._private.children.push(B),B._private.parent=A[0],o.hasCompoundNodes=!0)}}}if(e.length>0){for(var I=e.length===a.length?a:new Vl(i,e),N=0;N<I.length;N++){var L=I[N];L.isNode()||(L.parallelEdges().clearTraversalCache(),L.source().clearTraversalCache(),L.target().clearTraversalCache())}(o.hasCompoundNodes?i.collection().merge(I).merge(I.connectedNodes()).merge(I.parent()):I).dirtyCompoundBoundsCache().dirtyBoundingBoxCache().updateStyle(n),n?I.emitAndNotify("add"):r&&I.emit("add")}return a},Fl.removed=function(){var e=this[0];return e&&e._private.removed},Fl.inside=function(){var e=this[0];return e&&!e._private.removed},Fl.remove=function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this,r=[],a={},i=n._private.cy;function o(e){var n=a[e.id()];t&&e.removed()||n||(a[e.id()]=!0,e.isNode()?(r.push(e),function(e){for(var t=e._private.edges,n=0;n<t.length;n++)o(t[n])}(e),function(e){for(var t=e._private.children,n=0;n<t.length;n++)o(t[n])}(e)):r.unshift(e))}for(var s=0,l=n.length;s<l;s++){o(n[s])}function u(e,t){var n=e._private.edges;dt(n,t),e.clearTraversalCache()}function c(e){e.clearTraversalCache()}var d=[];function h(e,t){t=t[0];var n=(e=e[0])._private.children,r=e.id();dt(n,t),t._private.parent=null,d.ids[r]||(d.ids[r]=!0,d.push(e))}d.ids={},n.dirtyCompoundBoundsCache(),t&&i.removeFromPool(r);for(var f=0;f<r.length;f++){var p=r[f];if(p.isEdge()){var v=p.source()[0],g=p.target()[0];u(v,p),u(g,p);for(var y=p.parallelEdges(),m=0;m<y.length;m++){var b=y[m];c(b),b.isBundledBezier()&&b.dirtyBoundingBoxCache()}}else{var x=p.parent();0!==x.length&&h(x,p)}t&&(p._private.removed=!0)}var w=i._private.elements;i._private.hasCompoundNodes=!1;for(var E=0;E<w.length;E++){if(w[E].isParent()){i._private.hasCompoundNodes=!0;break}}var k=new Vl(this.cy(),r);k.size()>0&&(e?k.emitAndNotify("remove"):t&&k.emit("remove"));for(var T=0;T<d.length;T++){var C=d[T];t&&C.removed()||C.updateStyle()}return k},Fl.move=function(e){var t=this._private.cy,n=this,r=!1,a=!1,i=function(e){return null==e?e:""+e};if(void 0!==e.source||void 0!==e.target){var o=i(e.source),s=i(e.target),l=null!=o&&t.hasElementWithId(o),u=null!=s&&t.hasElementWithId(s);(l||u)&&(t.batch(function(){n.remove(r,a),n.emitAndNotify("moveout");for(var e=0;e<n.length;e++){var t=n[e],i=t._private.data;t.isEdge()&&(l&&(i.source=o),u&&(i.target=s))}n.restore(r,a)}),n.emitAndNotify("move"))}else if(void 0!==e.parent){var c=i(e.parent);if(null===c||t.hasElementWithId(c)){var d=null===c?void 0:c;t.batch(function(){var e=n.remove(r,a);e.emitAndNotify("moveout");for(var t=0;t<n.length;t++){var i=n[t],o=i._private.data;i.isNode()&&(o.parent=d)}e.restore(r,a)}),n.emitAndNotify("move")}}return this},[jr,Eo,ko,ss,ds,ms,bs,Gs,cl,dl,{isNode:function(){return"nodes"===this.group()},isEdge:function(){return"edges"===this.group()},isLoop:function(){return this.isEdge()&&this.source()[0]===this.target()[0]},isSimple:function(){return this.isEdge()&&this.source()[0]!==this.target()[0]},group:function(){var e=this[0];if(e)return e._private.group}},pl,yl,wl,Dl,Ml].forEach(function(e){be(Fl,e)});var jl={add:function(e){var t,n=this;if(ee(e)){var r=e;if(r._private.cy===n)t=r.restore();else{for(var a=[],i=0;i<r.length;i++){var o=r[i];a.push(o.json())}t=new Vl(n,a)}}else if(Z(e)){t=new Vl(n,e)}else if($(e)&&(Z(e.nodes)||Z(e.edges))){for(var s=e,l=[],u=["nodes","edges"],c=0,d=u.length;c<d;c++){var h=u[c],f=s[h];if(Z(f))for(var p=0,v=f.length;p<v;p++){var g=be({group:h},f[p]);l.push(g)}}t=new Vl(n,l)}else{t=new mt(n,e).collection()}return t},remove:function(e){if(ee(e));else if(K(e)){var t=e;e=this.$(t)}return e.remove()}};function Xl(e,t,n,r){var a=.1,i="undefined"!=typeof Float32Array;if(4!==arguments.length)return!1;for(var o=0;o<4;++o)if("number"!=typeof arguments[o]||isNaN(arguments[o])||!isFinite(arguments[o]))return!1;e=Math.min(e,1),n=Math.min(n,1),e=Math.max(e,0),n=Math.max(n,0);var s=i?new Float32Array(11):new Array(11);function l(e,t){return 1-3*t+3*e}function u(e,t){return 3*t-6*e}function c(e){return 3*e}function d(e,t,n){return((l(t,n)*e+u(t,n))*e+c(t))*e}function h(e,t,n){return 3*l(t,n)*e*e+2*u(t,n)*e+c(t)}function f(t){for(var r=0,i=1;10!==i&&s[i]<=t;++i)r+=a;--i;var o=r+(t-s[i])/(s[i+1]-s[i])*a,l=h(o,e,n);return l>=.001?function(t,r){for(var a=0;a<4;++a){var i=h(r,e,n);if(0===i)return r;r-=(d(r,e,n)-t)/i}return r}(t,o):0===l?o:function(t,r,a){var i,o,s=0;do{(i=d(o=r+(a-r)/2,e,n)-t)>0?a=o:r=o}while(Math.abs(i)>1e-7&&++s<10);return o}(t,r,r+a)}var p=!1;function v(){p=!0,e===t&&n===r||function(){for(var t=0;t<11;++t)s[t]=d(t*a,e,n)}()}var g=function(a){return p||v(),e===t&&n===r?a:0===a?0:1===a?1:d(f(a),t,r)};g.getControlPoints=function(){return[{x:e,y:t},{x:n,y:r}]};var y="generateBezier("+[e,t,n,r]+")";return g.toString=function(){return y},g}var ql=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,n,r){var a={x:t.x+r.dx*n,v:t.v+r.dv*n,tension:t.tension,friction:t.friction};return{dx:a.v,dv:e(a)}}function n(n,r){var a={dx:n.v,dv:e(n)},i=t(n,.5*r,a),o=t(n,.5*r,i),s=t(n,r,o),l=1/6*(a.dx+2*(i.dx+o.dx)+s.dx),u=1/6*(a.dv+2*(i.dv+o.dv)+s.dv);return n.x=n.x+l*r,n.v=n.v+u*r,n}return function e(t,r,a){var i,o,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,d=1e-4;for(t=parseFloat(t)||500,r=parseFloat(r)||20,a=a||null,l.tension=t,l.friction=r,o=(i=null!==a)?(c=e(t,r))/a*.016:.016;s=n(s||l,o),u.push(1+s.x),c+=16,Math.abs(s.x)>d&&Math.abs(s.v)>d;);return i?function(e){return u[e*(u.length-1)|0]}:c}}(),Yl=function(e,t,n,r){var a=Xl(e,t,n,r);return function(e,t,n){return e+(t-e)*a(n)}},Wl={linear:function(e,t,n){return e+(t-e)*n},ease:Yl(.25,.1,.25,1),"ease-in":Yl(.42,0,1,1),"ease-out":Yl(0,0,.58,1),"ease-in-out":Yl(.42,0,.58,1),"ease-in-sine":Yl(.47,0,.745,.715),"ease-out-sine":Yl(.39,.575,.565,1),"ease-in-out-sine":Yl(.445,.05,.55,.95),"ease-in-quad":Yl(.55,.085,.68,.53),"ease-out-quad":Yl(.25,.46,.45,.94),"ease-in-out-quad":Yl(.455,.03,.515,.955),"ease-in-cubic":Yl(.55,.055,.675,.19),"ease-out-cubic":Yl(.215,.61,.355,1),"ease-in-out-cubic":Yl(.645,.045,.355,1),"ease-in-quart":Yl(.895,.03,.685,.22),"ease-out-quart":Yl(.165,.84,.44,1),"ease-in-out-quart":Yl(.77,0,.175,1),"ease-in-quint":Yl(.755,.05,.855,.06),"ease-out-quint":Yl(.23,1,.32,1),"ease-in-out-quint":Yl(.86,0,.07,1),"ease-in-expo":Yl(.95,.05,.795,.035),"ease-out-expo":Yl(.19,1,.22,1),"ease-in-out-expo":Yl(1,0,0,1),"ease-in-circ":Yl(.6,.04,.98,.335),"ease-out-circ":Yl(.075,.82,.165,1),"ease-in-out-circ":Yl(.785,.135,.15,.86),spring:function(e,t,n){if(0===n)return Wl.linear;var r=ql(e,t,n);return function(e,t,n){return e+(t-e)*r(n)}},"cubic-bezier":Yl};function Ul(e,t,n,r,a){if(1===r)return n;if(t===n)return n;var i=a(t,n,r);return null==e||((e.roundValue||e.color)&&(i=Math.round(i)),void 0!==e.min&&(i=Math.max(i,e.min)),void 0!==e.max&&(i=Math.min(i,e.max))),i}function Hl(e,t){return null!=e.pfValue||null!=e.value?null==e.pfValue||null!=t&&"%"===t.type.units?e.value:e.pfValue:e}function Kl(e,t,n,r,a){var i=null!=a?a.type:null;n<0?n=0:n>1&&(n=1);var o=Hl(e,a),s=Hl(t,a);if(Q(o)&&Q(s))return Ul(i,o,s,n,r);if(Z(o)&&Z(s)){for(var l=[],u=0;u<s.length;u++){var c=o[u],d=s[u];if(null!=c&&null!=d){var h=Ul(i,c,d,n,r);l.push(h)}else l.push(d)}return l}}function Gl(e,t,n,r){var a=!r,i=e._private,o=t._private,s=o.easing,l=o.startTime,u=(r?e:e.cy()).style();if(!o.easingImpl)if(null==s)o.easingImpl=Wl.linear;else{var c,d,h;if(K(s))c=u.parse("transition-timing-function",s).value;else c=s;K(c)?(d=c,h=[]):(d=c[1],h=c.slice(2).map(function(e){return+e})),h.length>0?("spring"===d&&h.push(o.duration),o.easingImpl=Wl[d].apply(null,h)):o.easingImpl=Wl[d]}var f,p=o.easingImpl;if(f=0===o.duration?1:(n-l)/o.duration,o.applying&&(f=o.progress),f<0?f=0:f>1&&(f=1),null==o.delay){var v=o.startPosition,g=o.position;if(g&&a&&!e.locked()){var y={};Zl(v.x,g.x)&&(y.x=Kl(v.x,g.x,f,p)),Zl(v.y,g.y)&&(y.y=Kl(v.y,g.y,f,p)),e.position(y)}var m=o.startPan,b=o.pan,x=i.pan,w=null!=b&&r;w&&(Zl(m.x,b.x)&&(x.x=Kl(m.x,b.x,f,p)),Zl(m.y,b.y)&&(x.y=Kl(m.y,b.y,f,p)),e.emit("pan"));var E=o.startZoom,k=o.zoom,T=null!=k&&r;T&&(Zl(E,k)&&(i.zoom=Jt(i.minZoom,Kl(E,k,f,p),i.maxZoom)),e.emit("zoom")),(w||T)&&e.emit("viewport");var C=o.style;if(C&&C.length>0&&a){for(var P=0;P<C.length;P++){var S=C[P],B=S.name,D=S,_=o.startStyle[B],A=Kl(_,D,f,p,u.properties[_.name]);u.overrideBypass(e,B,A)}e.emit("style")}}return o.progress=f,f}function Zl(e,t){return null!=e&&null!=t&&(!(!Q(e)||!Q(t))||!(!e||!t))}function $l(e,t,n,r){var a=t._private;a.started=!0,a.startTime=n-a.progress*a.duration}function Ql(e,t){var n=t._private.aniEles,r=[];function a(t,n){var a=t._private,i=a.animation.current,o=a.animation.queue,s=!1;if(0===i.length){var l=o.shift();l&&i.push(l)}for(var u=function(e){for(var t=e.length-1;t>=0;t--){(0,e[t])()}e.splice(0,e.length)},c=i.length-1;c>=0;c--){var d=i[c],h=d._private;h.stopped?(i.splice(c,1),h.hooked=!1,h.playing=!1,h.started=!1,u(h.frames)):(h.playing||h.applying)&&(h.playing&&h.applying&&(h.applying=!1),h.started||$l(0,d,e),Gl(t,d,e,n),h.applying&&(h.applying=!1),u(h.frames),null!=h.step&&h.step(e),d.completed()&&(i.splice(c,1),h.hooked=!1,h.playing=!1,h.started=!1,u(h.completes)),s=!0)}return n||0!==i.length||0!==o.length||r.push(t),s}for(var i=!1,o=0;o<n.length;o++){var s=a(n[o]);i=i||s}var l=a(t,!0);(i||l)&&(n.length>0?t.notify("draw",n):t.notify("draw")),n.unmerge(r),t.emit("step")}var Jl={animate:wo.animate(),animation:wo.animation(),animated:wo.animated(),clearQueue:wo.clearQueue(),delay:wo.delay(),delayAnimation:wo.delayAnimation(),stop:wo.stop(),addToAnimationPool:function(e){this.styleEnabled()&&this._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,e.styleEnabled()){var t=e.renderer();t&&t.beforeRender?t.beforeRender(function(t,n){Ql(n,e)},t.beforeRenderPriorities.animations):function t(){e._private.animationsRunning&&Le(function(n){Ql(n,e),t()})}()}}},eu={qualifierCompare:function(e,t){return null==e||null==t?null==e&&null==t:e.sameText(t)},eventMatches:function(e,t,n){var r=t.qualifier;return null==r||e!==n.target&&te(n.target)&&r.matches(n.target)},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,n){return null!=t.qualifier?n.target:e}},tu=function(e){return K(e)?new is(e):e},nu={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new rl(eu,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,n){return this.emitter().on(e,tu(t),n),this},removeListener:function(e,t,n){return this.emitter().removeListener(e,tu(t),n),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,n){return this.emitter().one(e,tu(t),n),this},once:function(e,t,n){return this.emitter().one(e,tu(t),n),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};wo.eventAliasesOn(nu);var ru={png:function(e){return e=e||{},this._private.renderer.png(e)},jpg:function(e){var t=this._private.renderer;return(e=e||{}).bg=e.bg||"#fff",t.jpg(e)}};ru.jpeg=ru.jpg;var au={layout:function(e){var t=this;if(null!=e)if(null!=e.name){var n=e.name,r=t.extension("layout",n);if(null!=r){var a;a=K(e.eles)?t.$(e.eles):null!=e.eles?e.eles:t.$();var i=new r(be({},e,{cy:t,eles:a}));return i}rt("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?")}else rt("A `name` must be specified to make a layout");else rt("Layout options must be specified to make a layout")}};au.createLayout=au.makeLayout=au.layout;var iu={notify:function(e,t){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var r=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();null!=t&&r.merge(t)}else if(n.notificationsEnabled){var a=this.renderer();!this.destroyed()&&a&&a.notify(e,t)}},notifications:function(e){var t=this._private;return void 0===e?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return null==e.batchCount&&(e.batchCount=0),0===e.batchCount&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(0===e.batchCount)return this;if(e.batchCount--,0===e.batchCount){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach(function(n){var r=e.batchNotifications[n];r.empty()?t.notify(n):t.notify(n,r)})}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch(function(){for(var n=Object.keys(e),r=0;r<n.length;r++){var a=n[r],i=e[a];t.getElementById(a).data(i)}})}},ou=ct({hideEdgesOnViewport:!1,textureOnViewport:!1,motionBlur:!1,motionBlurOpacity:.05,pixelRatio:void 0,desktopTapThreshold:4,touchTapThreshold:8,wheelSensitivity:1,debug:!1,showFps:!1,webgl:!1,webglDebug:!1,webglDebugShowAtlases:!1,webglTexSize:2048,webglTexRows:36,webglTexRowsNodes:18,webglBatchSize:2048,webglTexPerBatch:14,webglBgColor:[255,255,255]}),su={renderTo:function(e,t,n,r){return this._private.renderer.renderTo(e,t,n,r),this},renderer:function(){return this._private.renderer},forceRender:function(){return this.notify("draw"),this},resize:function(){return this.invalidateSize(),this.emitAndNotify("resize"),this},initRenderer:function(e){var t=this,n=t.extension("renderer",e.name);if(null!=n){void 0!==e.wheelSensitivity&&it("You have set a custom wheel sensitivity. This will make your app zoom unnaturally when using mainstream mice. You should change this value from the default only if you can guarantee that all your users will use the same hardware and OS configuration as your current machine.");var r=ou(e);r.cy=t,t._private.renderer=new n(r),this.notify("init")}else rt("Can not initialise: No such renderer `".concat(e.name,"` found. Did you forget to import it and `cytoscape.use()` it?"))},destroyRenderer:function(){var e=this;e.notify("destroy");var t=e.container();if(t)for(t._cyreg=null;t.childNodes.length>0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach(function(e){var t=e._private;t.rscratch={},t.rstyle={},t.animation.current=[],t.animation.queue=[]})},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};su.invalidateDimensions=su.resize;var lu={collection:function(e,t){return K(e)?this.$(e):ee(e)?e.collection():Z(e)?(t||(t={}),new Vl(this,e,t.unique,t.removed)):new Vl(this)},nodes:function(e){var t=this.$(function(e){return e.isNode()});return e?t.filter(e):t},edges:function(e){var t=this.$(function(e){return e.isEdge()});return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};lu.elements=lu.filter=lu.$;var uu={},cu="t";uu.apply=function(e){for(var t=this,n=t._private.cy.collection(),r=0;r<e.length;r++){var a=e[r],i=t.getContextMeta(a);if(!i.empty){var o=t.getContextStyle(i),s=t.applyContextStyle(i,o,a);a._private.appliedInitStyle?t.updateTransitions(a,s.diffProps):a._private.appliedInitStyle=!0,t.updateStyleHints(a)&&n.push(a)}}return n},uu.getPropertiesDiff=function(e,t){var n=this,r=n._private.propDiffs=n._private.propDiffs||{},a=e+"-"+t,i=r[a];if(i)return i;for(var o=[],s={},l=0;l<n.length;l++){var u=n[l],c=e[l]===cu,d=t[l]===cu,h=c!==d,f=u.mappedProperties.length>0;if(h||d&&f){var p=void 0;h&&f||h?p=u.properties:f&&(p=u.mappedProperties);for(var v=0;v<p.length;v++){for(var g=p[v],y=g.name,m=!1,b=l+1;b<n.length;b++){var x=n[b];if(t[b]===cu&&(m=null!=x.properties[g.name]))break}s[y]||m||(s[y]=!0,o.push(y))}}}return r[a]=o,o},uu.getContextMeta=function(e){for(var t,n=this,r="",a=e._private.styleCxtKey||"",i=0;i<n.length;i++){var o=n[i];r+=o.selector&&o.selector.matches(e)?cu:"f"}return t=n.getPropertiesDiff(a,r),e._private.styleCxtKey=r,{key:r,diffPropNames:t,empty:0===t.length}},uu.getContextStyle=function(e){var t=e.key,n=this._private.contextStyles=this._private.contextStyles||{};if(n[t])return n[t];for(var r={_private:{key:t}},a=0;a<this.length;a++){var i=this[a];if(t[a]===cu)for(var o=0;o<i.properties.length;o++){var s=i.properties[o];r[s.name]=s}}return n[t]=r,r},uu.applyContextStyle=function(e,t,n){for(var r=e.diffPropNames,a={},i=this.types,o=0;o<r.length;o++){var s=r[o],l=t[s],u=n.pstyle(s);if(!l){if(!u)continue;l=u.bypass?{name:s,deleteBypassed:!0}:{name:s,delete:!0}}if(u!==l){if(l.mapped===i.fn&&null!=u&&null!=u.mapping&&u.mapping.value===l.value){var c=u.mapping;if((c.fnValue=l.value(n))===c.prevFnValue)continue}var d=a[s]={prev:u};this.applyParsedProperty(n,l),d.next=n.pstyle(s),d.next&&d.next.bypass&&(d.next=d.next.bypassed)}}return{diffProps:a}},uu.updateStyleHints=function(e){var t=e._private,n=this,r=n.propertyGroupNames,a=n.propertyGroupKeys,i=function(e,t,r){return n.getPropertiesHash(e,t,r)},o=t.styleKey;if(e.removed())return!1;var s="nodes"===t.group,l=e._private.style;r=Object.keys(l);for(var u=0;u<a.length;u++){var c=a[u];t.styleKeys[c]=[Oe,Ve]}for(var d=function(e,n){return t.styleKeys[n][0]=je(e,t.styleKeys[n][0])},h=function(e,n){return t.styleKeys[n][1]=Xe(e,t.styleKeys[n][1])},f=function(e,t){d(e,t),h(e,t)},p=function(e,t){for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);d(r,t),h(r,t)}},v=function(e){return-128<e&&e<128&&Math.floor(e)!==e?2e9-(1024*e|0):e},g=0;g<r.length;g++){var y=r[g],m=l[y];if(null!=m){var b=this.properties[y],x=b.type,w=b.groupKey,E=void 0;null!=b.hashOverride?E=b.hashOverride(e,m):null!=m.pfValue&&(E=m.pfValue);var k=null==b.enums?m.value:null,T=null!=E,C=T||null!=k,P=m.units;if(x.number&&C&&!x.multiple)f(v(T?E:k),w),T||null==P||p(P,w);else p(m.strValue,w)}}for(var S,B,D=[Oe,Ve],_=0;_<a.length;_++){var A=a[_],M=t.styleKeys[A];D[0]=je(M[0],D[0]),D[1]=Xe(M[1],D[1])}t.styleKey=(S=D[0],B=D[1],2097152*S+B);var R=t.styleKeys;t.labelDimsKey=qe(R.labelDimensions);var I=i(e,["label"],R.labelDimensions);if(t.labelKey=qe(I),t.labelStyleKey=qe(Ye(R.commonLabel,I)),!s){var N=i(e,["source-label"],R.labelDimensions);t.sourceLabelKey=qe(N),t.sourceLabelStyleKey=qe(Ye(R.commonLabel,N));var L=i(e,["target-label"],R.labelDimensions);t.targetLabelKey=qe(L),t.targetLabelStyleKey=qe(Ye(R.commonLabel,L))}if(s){var z=t.styleKeys,O=z.nodeBody,V=z.nodeBorder,F=z.nodeOutline,j=z.backgroundImage,X=z.compound,q=z.pie,Y=z.stripe,W=[O,V,F,j,X,q,Y].filter(function(e){return null!=e}).reduce(Ye,[Oe,Ve]);t.nodeKey=qe(W),t.hasPie=null!=q&&q[0]!==Oe&&q[1]!==Ve,t.hasStripe=null!=Y&&Y[0]!==Oe&&Y[1]!==Ve}return o!==t.styleKey},uu.clearStyleHints=function(e){var t=e._private;t.styleCxtKey="",t.styleKeys={},t.styleKey=null,t.labelKey=null,t.labelStyleKey=null,t.sourceLabelKey=null,t.sourceLabelStyleKey=null,t.targetLabelKey=null,t.targetLabelStyleKey=null,t.nodeKey=null,t.hasPie=null,t.hasStripe=null},uu.applyParsedProperty=function(e,t){var n,r=this,a=t,i=e._private.style,o=r.types,s=r.properties[a.name].type,l=a.bypass,u=i[a.name],c=u&&u.bypass,d=e._private,h="mapping",f=function(e){return null==e?null:null!=e.pfValue?e.pfValue:e.value},p=function(){var t=f(u),n=f(a);r.checkTriggers(e,a.name,t,n)};if("curve-style"===t.name&&e.isEdge()&&("bezier"!==t.value&&e.isLoop()||"haystack"===t.value&&(e.source().isParent()||e.target().isParent()))&&(a=t=this.parse(t.name,"bezier",l)),a.delete)return i[a.name]=void 0,p(),!0;if(a.deleteBypassed)return u?!!u.bypass&&(u.bypassed=void 0,p(),!0):(p(),!0);if(a.deleteBypass)return u?!!u.bypass&&(i[a.name]=u.bypassed,p(),!0):(p(),!0);var v=function(){it("Do not assign mappings to elements without corresponding data (i.e. ele `"+e.id()+"` has no mapping for property `"+a.name+"` with data field `"+a.field+"`); try a `["+a.field+"]` selector to limit scope to elements with `"+a.field+"` defined")};switch(a.mapped){case o.mapData:for(var g,y=a.field.split("."),m=d.data,b=0;b<y.length&&m;b++){m=m[y[b]]}if(null==m)return v(),!1;if(!Q(m))return it("Do not use continuous mappers without specifying numeric data (i.e. `"+a.field+": "+m+"` for `"+e.id()+"` is non-numeric)"),!1;var x=a.fieldMax-a.fieldMin;if((g=0===x?0:(m-a.fieldMin)/x)<0?g=0:g>1&&(g=1),s.color){var w=a.valueMin[0],E=a.valueMax[0],k=a.valueMin[1],T=a.valueMax[1],C=a.valueMin[2],P=a.valueMax[2],S=null==a.valueMin[3]?1:a.valueMin[3],B=null==a.valueMax[3]?1:a.valueMax[3],D=[Math.round(w+(E-w)*g),Math.round(k+(T-k)*g),Math.round(C+(P-C)*g),Math.round(S+(B-S)*g)];n={bypass:a.bypass,name:a.name,value:D,strValue:"rgb("+D[0]+", "+D[1]+", "+D[2]+")"}}else{if(!s.number)return!1;var _=a.valueMin+(a.valueMax-a.valueMin)*g;n=this.parse(a.name,_,a.bypass,h)}if(!n)return v(),!1;n.mapping=a,a=n;break;case o.data:for(var A=a.field.split("."),M=d.data,R=0;R<A.length&&M;R++){M=M[A[R]]}if(null!=M&&(n=this.parse(a.name,M,a.bypass,h)),!n)return v(),!1;n.mapping=a,a=n;break;case o.fn:var I=a.value,N=null!=a.fnValue?a.fnValue:I(e);if(a.prevFnValue=N,null==N)return it("Custom function mappers may not return null (i.e. `"+a.name+"` for ele `"+e.id()+"` is null)"),!1;if(!(n=this.parse(a.name,N,a.bypass,h)))return it("Custom function mappers may not return invalid values for the property type (i.e. `"+a.name+"` for ele `"+e.id()+"` is invalid)"),!1;n.mapping=ot(a),a=n;break;case void 0:break;default:return!1}return l?(a.bypassed=c?u.bypassed:u,i[a.name]=a):c?u.bypassed=a:i[a.name]=a,p(),!0},uu.cleanElements=function(e,t){for(var n=0;n<e.length;n++){var r=e[n];if(this.clearStyleHints(r),r.dirtyCompoundBoundsCache(),r.dirtyBoundingBoxCache(),t)for(var a=r._private.style,i=Object.keys(a),o=0;o<i.length;o++){var s=i[o],l=a[s];null!=l&&(l.bypass?l.bypassed=null:a[s]=null)}else r._private.style={}}},uu.update=function(){this._private.cy.mutableElements().updateStyle()},uu.updateTransitions=function(e,t){var n=this,r=e._private,a=e.pstyle("transition-property").value,i=e.pstyle("transition-duration").pfValue,o=e.pstyle("transition-delay").pfValue;if(a.length>0&&i>0){for(var s={},l=!1,u=0;u<a.length;u++){var c=a[u],d=e.pstyle(c),h=t[c];if(h){var f=h.prev,p=null!=h.next?h.next:d,v=!1,g=void 0,y=1e-6;f&&(Q(f.pfValue)&&Q(p.pfValue)?(v=p.pfValue-f.pfValue,g=f.pfValue+y*v):Q(f.value)&&Q(p.value)?(v=p.value-f.value,g=f.value+y*v):Z(f.value)&&Z(p.value)&&(v=f.value[0]!==p.value[0]||f.value[1]!==p.value[1]||f.value[2]!==p.value[2],g=f.strValue),v&&(s[c]=p.strValue,this.applyBypass(e,c,g),l=!0))}}if(!l)return;r.transitioning=!0,new Kr(function(t){o>0?e.delayAnimation(o).play().promise().then(t):t()}).then(function(){return e.animation({style:s,duration:i,easing:e.pstyle("transition-timing-function").value,queue:!1}).play().promise()}).then(function(){n.removeBypasses(e,a),e.emitAndNotify("style"),r.transitioning=!1})}else r.transitioning&&(this.removeBypasses(e,a),e.emitAndNotify("style"),r.transitioning=!1)},uu.checkTrigger=function(e,t,n,r,a,i){var o=this.properties[t],s=a(o);e.removed()||null!=s&&s(n,r,e)&&i(o)},uu.checkZOrderTrigger=function(e,t,n,r){var a=this;this.checkTrigger(e,t,n,r,function(e){return e.triggersZOrder},function(){a._private.cy.notify("zorder",e)})},uu.checkBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,function(e){return e.triggersBounds},function(t){e.dirtyCompoundBoundsCache(),e.dirtyBoundingBoxCache()})},uu.checkConnectedEdgesBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,function(e){return e.triggersBoundsOfConnectedEdges},function(t){e.connectedEdges().forEach(function(e){e.dirtyBoundingBoxCache()})})},uu.checkParallelEdgesBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,function(e){return e.triggersBoundsOfParallelEdges},function(t){e.parallelEdges().forEach(function(e){e.dirtyBoundingBoxCache()})})},uu.checkTriggers=function(e,t,n,r){e.dirtyStyleCache(),this.checkZOrderTrigger(e,t,n,r),this.checkBoundsTrigger(e,t,n,r),this.checkConnectedEdgesBoundsTrigger(e,t,n,r),this.checkParallelEdgesBoundsTrigger(e,t,n,r)};var du={applyBypass:function(e,t,n,r){var a=[];if("*"===t||"**"===t){if(void 0!==n)for(var i=0;i<this.properties.length;i++){var o=this.properties[i].name,s=this.parse(o,n,!0);s&&a.push(s)}}else if(K(t)){var l=this.parse(t,n,!0);l&&a.push(l)}else{if(!$(t))return!1;var u=t;r=n;for(var c=Object.keys(u),d=0;d<c.length;d++){var h=c[d],f=u[h];if(void 0===f&&(f=u[ue(h)]),void 0!==f){var p=this.parse(h,f,!0);p&&a.push(p)}}}if(0===a.length)return!1;for(var v=!1,g=0;g<e.length;g++){for(var y=e[g],m={},b=void 0,x=0;x<a.length;x++){var w=a[x];if(r){var E=y.pstyle(w.name);b=m[w.name]={prev:E}}v=this.applyParsedProperty(y,ot(w))||v,r&&(b.next=y.pstyle(w.name))}v&&this.updateStyleHints(y),r&&this.updateTransitions(y,m,true)}return v},overrideBypass:function(e,t,n){t=le(t);for(var r=0;r<e.length;r++){var a=e[r],i=a._private.style[t],o=this.properties[t].type,s=o.color,l=o.mutiple,u=i?null!=i.pfValue?i.pfValue:i.value:null;i&&i.bypass?(i.value=n,null!=i.pfValue&&(i.pfValue=n),i.strValue=s?"rgb("+n.join(",")+")":l?n.join(" "):""+n,this.updateStyleHints(a)):this.applyBypass(a,t,n),this.checkTriggers(a,t,u,n)}},removeAllBypasses:function(e,t){return this.removeBypasses(e,this.propertyNames,t)},removeBypasses:function(e,t,n){for(var r=0;r<e.length;r++){for(var a=e[r],i={},o=0;o<t.length;o++){var s=t[o],l=this.properties[s],u=a.pstyle(l.name);if(u&&u.bypass){var c=this.parse(s,"",!0),d=i[l.name]={prev:u};this.applyParsedProperty(a,c),d.next=a.pstyle(l.name)}}this.updateStyleHints(a),n&&this.updateTransitions(a,i,true)}}},hu={getEmSizeInPixels:function(){var e=this.containerCss("font-size");return null!=e?parseFloat(e):1},containerCss:function(e){var t=this._private.cy,n=t.container(),r=t.window();if(r&&n&&r.getComputedStyle)return r.getComputedStyle(n).getPropertyValue(e)}},fu={getRenderedStyle:function(e,t){return t?this.getStylePropertyValue(e,t,!0):this.getRawStyle(e,!0)},getRawStyle:function(e,t){var n=this;if(e=e[0]){for(var r={},a=0;a<n.properties.length;a++){var i=n.properties[a],o=n.getStylePropertyValue(e,i.name,t);null!=o&&(r[i.name]=o,r[ue(i.name)]=o)}return r}},getIndexedStyle:function(e,t,n,r){var a=e.pstyle(t)[n][r];return null!=a?a:e.cy().style().getDefaultProperty(t)[n][0]},getStylePropertyValue:function(e,t,n){if(e=e[0]){var r=this.properties[t];r.alias&&(r=r.pointsTo);var a=r.type,i=e.pstyle(r.name);if(i){var o=i.value,s=i.units,l=i.strValue;if(n&&a.number&&null!=o&&Q(o)){var u=e.cy().zoom(),c=function(e){return e*u},d=function(e,t){return c(e)+t},h=Z(o);return(h?s.every(function(e){return null!=e}):null!=s)?h?o.map(function(e,t){return d(e,s[t])}).join(" "):d(o,s):h?o.map(function(e){return K(e)?e:""+c(e)}).join(" "):""+c(o)}if(null!=l)return l}return null}},getAnimationStartStyle:function(e,t){for(var n={},r=0;r<t.length;r++){var a=t[r].name,i=e.pstyle(a);void 0!==i&&(i=$(i)?this.parse(a,i.strValue):this.parse(a,i)),i&&(n[a]=i)}return n},getPropsList:function(e){var t=[],n=e,r=this.properties;if(n)for(var a=Object.keys(n),i=0;i<a.length;i++){var o=a[i],s=n[o],l=r[o]||r[le(o)],u=this.parse(l.name,s);u&&t.push(u)}return t},getNonDefaultPropertiesHash:function(e,t,n){var r,a,i,o,s,l,u=n.slice();for(s=0;s<t.length;s++)if(r=t[s],null!=(a=e.pstyle(r,!1)))if(null!=a.pfValue)u[0]=je(o,u[0]),u[1]=Xe(o,u[1]);else for(i=a.strValue,l=0;l<i.length;l++)o=i.charCodeAt(l),u[0]=je(o,u[0]),u[1]=Xe(o,u[1]);return u}};fu.getPropertiesHash=fu.getNonDefaultPropertiesHash;var pu={appendFromJson:function(e){for(var t=this,n=0;n<e.length;n++){var r=e[n],a=r.selector,i=r.style||r.css,o=Object.keys(i);t.selector(a);for(var s=0;s<o.length;s++){var l=o[s],u=i[l];t.css(l,u)}}return t},fromJson:function(e){var t=this;return t.resetToDefault(),t.appendFromJson(e),t},json:function(){for(var e=[],t=this.defaultLength;t<this.length;t++){for(var n=this[t],r=n.selector,a=n.properties,i={},o=0;o<a.length;o++){var s=a[o];i[s.name]=s.strValue}e.push({selector:r?r.toString():"core",style:i})}return e}},vu={appendFromString:function(e){var t,n,r,a=this,i=""+e;function o(){i=i.length>t.length?i.substr(t.length):""}function s(){n=n.length>r.length?n.substr(r.length):""}for(i=i.replace(/[/][*](\s|.)+?[*][/]/g,"");;){if(i.match(/^\s*$/))break;var l=i.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!l){it("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+i);break}t=l[0];var u=l[1];if("core"!==u)if(new is(u).invalid){it("Skipping parsing of block: Invalid selector found in string stylesheet: "+u),o();continue}var c=l[2],d=!1;n=c;for(var h=[];;){if(n.match(/^\s*$/))break;var f=n.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!f){it("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+c),d=!0;break}r=f[0];var p=f[1],v=f[2];if(this.properties[p])a.parse(p,v)?(h.push({name:p,val:v}),s()):(it("Skipping property: Invalid property definition in: "+r),s());else it("Skipping property: Invalid property name in: "+r),s()}if(d){o();break}a.selector(u);for(var g=0;g<h.length;g++){var y=h[g];a.css(y.name,y.val)}o()}return a},fromString:function(e){var t=this;return t.resetToDefault(),t.appendFromString(e),t}},gu={};!function(){var e=fe,t=ve,n=ye,r=function(e){return"^"+e+"\\s*\\(\\s*([\\w\\.]+)\\s*\\)$"},a=function(r){var a=e+"|\\w+|"+t+"|"+n+"|\\#[0-9a-fA-F]{3}|\\#[0-9a-fA-F]{6}";return"^"+r+"\\s*\\(([\\w\\.]+)\\s*\\,\\s*("+e+")\\s*\\,\\s*("+e+")\\s*,\\s*("+a+")\\s*\\,\\s*("+a+")\\)$"},i=["^url\\s*\\(\\s*['\"]?(.+?)['\"]?\\s*\\)$","^(none)$","^(.+)$"];gu.types={time:{number:!0,min:0,units:"s|ms",implicitUnits:"ms"},percent:{number:!0,min:0,max:100,units:"%",implicitUnits:"%"},percentages:{number:!0,min:0,max:100,units:"%",implicitUnits:"%",multiple:!0},zeroOneNumber:{number:!0,min:0,max:1,unitless:!0},zeroOneNumbers:{number:!0,min:0,max:1,unitless:!0,multiple:!0},nOneOneNumber:{number:!0,min:-1,max:1,unitless:!0},nonNegativeInt:{number:!0,min:0,integer:!0,unitless:!0},nonNegativeNumber:{number:!0,min:0,unitless:!0},position:{enums:["parent","origin"]},nodeSize:{number:!0,min:0,enums:["label"]},number:{number:!0,unitless:!0},numbers:{number:!0,unitless:!0,multiple:!0},positiveNumber:{number:!0,unitless:!0,min:0,strictMin:!0},size:{number:!0,min:0},bidirectionalSize:{number:!0},bidirectionalSizeMaybePercent:{number:!0,allowPercent:!0},bidirectionalSizes:{number:!0,multiple:!0},sizeMaybePercent:{number:!0,min:0,allowPercent:!0},axisDirection:{enums:["horizontal","leftward","rightward","vertical","upward","downward","auto"]},axisDirectionExplicit:{enums:["leftward","rightward","upward","downward"]},axisDirectionPrimary:{enums:["horizontal","vertical"]},paddingRelativeTo:{enums:["width","height","average","min","max"]},bgWH:{number:!0,min:0,allowPercent:!0,enums:["auto"],multiple:!0},bgPos:{number:!0,allowPercent:!0,multiple:!0},bgRelativeTo:{enums:["inner","include-padding"],multiple:!0},bgRepeat:{enums:["repeat","repeat-x","repeat-y","no-repeat"],multiple:!0},bgFit:{enums:["none","contain","cover"],multiple:!0},bgCrossOrigin:{enums:["anonymous","use-credentials","null"],multiple:!0},bgClip:{enums:["none","node"],multiple:!0},bgContainment:{enums:["inside","over"],multiple:!0},color:{color:!0},colors:{color:!0,multiple:!0},fill:{enums:["solid","linear-gradient","radial-gradient"]},bool:{enums:["yes","no"]},bools:{enums:["yes","no"],multiple:!0},lineStyle:{enums:["solid","dotted","dashed"]},lineCap:{enums:["butt","round","square"]},linePosition:{enums:["center","inside","outside"]},lineJoin:{enums:["round","bevel","miter"]},borderStyle:{enums:["solid","dotted","dashed","double"]},curveStyle:{enums:["bezier","unbundled-bezier","haystack","segments","straight","straight-triangle","taxi","round-segments","round-taxi"]},radiusType:{enums:["arc-radius","influence-radius"],multiple:!0},fontFamily:{regex:'^([\\w- \\"]+(?:\\s*,\\s*[\\w- \\"]+)*)$'},fontStyle:{enums:["italic","normal","oblique"]},fontWeight:{enums:["normal","bold","bolder","lighter","100","200","300","400","500","600","800","900",100,200,300,400,500,600,700,800,900]},textDecoration:{enums:["none","underline","overline","line-through"]},textTransform:{enums:["none","uppercase","lowercase"]},textWrap:{enums:["none","wrap","ellipsis"]},textOverflowWrap:{enums:["whitespace","anywhere"]},textBackgroundShape:{enums:["rectangle","roundrectangle","round-rectangle"]},nodeShape:{enums:["rectangle","roundrectangle","round-rectangle","cutrectangle","cut-rectangle","bottomroundrectangle","bottom-round-rectangle","barrel","ellipse","triangle","round-triangle","square","pentagon","round-pentagon","hexagon","round-hexagon","concavehexagon","concave-hexagon","heptagon","round-heptagon","octagon","round-octagon","tag","round-tag","star","diamond","round-diamond","vee","rhomboid","right-rhomboid","polygon"]},overlayShape:{enums:["roundrectangle","round-rectangle","ellipse"]},cornerRadius:{number:!0,min:0,units:"px|em",implicitUnits:"px",enums:["auto"]},compoundIncludeLabels:{enums:["include","exclude"]},arrowShape:{enums:["tee","triangle","triangle-tee","circle-triangle","triangle-cross","triangle-backcurve","vee","square","circle","diamond","chevron","none"]},arrowFill:{enums:["filled","hollow"]},arrowWidth:{number:!0,units:"%|px|em",implicitUnits:"px",enums:["match-line"]},display:{enums:["element","none"]},visibility:{enums:["hidden","visible"]},zCompoundDepth:{enums:["bottom","orphan","auto","top"]},zIndexCompare:{enums:["auto","manual"]},valign:{enums:["top","center","bottom"]},halign:{enums:["left","center","right"]},justification:{enums:["left","center","right","auto"]},text:{string:!0},data:{mapping:!0,regex:r("data")},layoutData:{mapping:!0,regex:r("layoutData")},scratch:{mapping:!0,regex:r("scratch")},mapData:{mapping:!0,regex:a("mapData")},mapLayoutData:{mapping:!0,regex:a("mapLayoutData")},mapScratch:{mapping:!0,regex:a("mapScratch")},fn:{mapping:!0,fn:!0},url:{regexes:i,singleRegexMatchValue:!0},urls:{regexes:i,singleRegexMatchValue:!0,multiple:!0},propList:{propList:!0},angle:{number:!0,units:"deg|rad",implicitUnits:"rad"},textRotation:{number:!0,units:"deg|rad",implicitUnits:"rad",enums:["none","autorotate"]},polygonPointList:{number:!0,multiple:!0,evenMultiple:!0,min:-1,max:1,unitless:!0},edgeDistances:{enums:["intersection","node-position","endpoints"]},edgeEndpoint:{number:!0,multiple:!0,units:"%|px|em|deg|rad",implicitUnits:"px",enums:["inside-to-node","outside-to-node","outside-to-node-or-label","outside-to-line","outside-to-line-or-label"],singleEnum:!0,validate:function(e,t){switch(e.length){case 2:return"deg"!==t[0]&&"rad"!==t[0]&&"deg"!==t[1]&&"rad"!==t[1];case 1:return K(e[0])||"deg"===t[0]||"rad"===t[0];default:return!1}}},easing:{regexes:["^(spring)\\s*\\(\\s*("+e+")\\s*,\\s*("+e+")\\s*\\)$","^(cubic-bezier)\\s*\\(\\s*("+e+")\\s*,\\s*("+e+")\\s*,\\s*("+e+")\\s*,\\s*("+e+")\\s*\\)$"],enums:["linear","ease","ease-in","ease-out","ease-in-out","ease-in-sine","ease-out-sine","ease-in-out-sine","ease-in-quad","ease-out-quad","ease-in-out-quad","ease-in-cubic","ease-out-cubic","ease-in-out-cubic","ease-in-quart","ease-out-quart","ease-in-out-quart","ease-in-quint","ease-out-quint","ease-in-out-quint","ease-in-expo","ease-out-expo","ease-in-out-expo","ease-in-circ","ease-out-circ","ease-in-out-circ"]},gradientDirection:{enums:["to-bottom","to-top","to-left","to-right","to-bottom-right","to-bottom-left","to-top-right","to-top-left","to-right-bottom","to-left-bottom","to-right-top","to-left-top"]},boundsExpansion:{number:!0,multiple:!0,min:0,validate:function(e){var t=e.length;return 1===t||2===t||4===t}}};var o={zeroNonZero:function(e,t){return(null==e||null==t)&&e!==t||(0==e&&0!=t||0!=e&&0==t)},any:function(e,t){return e!=t},emptyNonEmpty:function(e,t){var n=ie(e),r=ie(t);return n&&!r||!n&&r}},s=gu.types,l=[{name:"label",type:s.text,triggersBounds:o.any,triggersZOrder:o.emptyNonEmpty},{name:"text-rotation",type:s.textRotation,triggersBounds:o.any},{name:"text-margin-x",type:s.bidirectionalSize,triggersBounds:o.any},{name:"text-margin-y",type:s.bidirectionalSize,triggersBounds:o.any}],u=[{name:"source-label",type:s.text,triggersBounds:o.any},{name:"source-text-rotation",type:s.textRotation,triggersBounds:o.any},{name:"source-text-margin-x",type:s.bidirectionalSize,triggersBounds:o.any},{name:"source-text-margin-y",type:s.bidirectionalSize,triggersBounds:o.any},{name:"source-text-offset",type:s.size,triggersBounds:o.any}],c=[{name:"target-label",type:s.text,triggersBounds:o.any},{name:"target-text-rotation",type:s.textRotation,triggersBounds:o.any},{name:"target-text-margin-x",type:s.bidirectionalSize,triggersBounds:o.any},{name:"target-text-margin-y",type:s.bidirectionalSize,triggersBounds:o.any},{name:"target-text-offset",type:s.size,triggersBounds:o.any}],d=[{name:"font-family",type:s.fontFamily,triggersBounds:o.any},{name:"font-style",type:s.fontStyle,triggersBounds:o.any},{name:"font-weight",type:s.fontWeight,triggersBounds:o.any},{name:"font-size",type:s.size,triggersBounds:o.any},{name:"text-transform",type:s.textTransform,triggersBounds:o.any},{name:"text-wrap",type:s.textWrap,triggersBounds:o.any},{name:"text-overflow-wrap",type:s.textOverflowWrap,triggersBounds:o.any},{name:"text-max-width",type:s.size,triggersBounds:o.any},{name:"text-outline-width",type:s.size,triggersBounds:o.any},{name:"line-height",type:s.positiveNumber,triggersBounds:o.any}],h=[{name:"text-valign",type:s.valign,triggersBounds:o.any},{name:"text-halign",type:s.halign,triggersBounds:o.any},{name:"color",type:s.color},{name:"text-outline-color",type:s.color},{name:"text-outline-opacity",type:s.zeroOneNumber},{name:"text-background-color",type:s.color},{name:"text-background-opacity",type:s.zeroOneNumber},{name:"text-background-padding",type:s.size,triggersBounds:o.any},{name:"text-border-opacity",type:s.zeroOneNumber},{name:"text-border-color",type:s.color},{name:"text-border-width",type:s.size,triggersBounds:o.any},{name:"text-border-style",type:s.borderStyle,triggersBounds:o.any},{name:"text-background-shape",type:s.textBackgroundShape,triggersBounds:o.any},{name:"text-justification",type:s.justification},{name:"box-select-labels",type:s.bool,triggersBounds:o.any}],f=[{name:"events",type:s.bool,triggersZOrder:o.any},{name:"text-events",type:s.bool,triggersZOrder:o.any}],p=[{name:"display",type:s.display,triggersZOrder:o.any,triggersBounds:o.any,triggersBoundsOfConnectedEdges:o.any,triggersBoundsOfParallelEdges:function(e,t,n){return e!==t&&"bezier"===n.pstyle("curve-style").value}},{name:"visibility",type:s.visibility,triggersZOrder:o.any},{name:"opacity",type:s.zeroOneNumber,triggersZOrder:o.zeroNonZero},{name:"text-opacity",type:s.zeroOneNumber},{name:"min-zoomed-font-size",type:s.size},{name:"z-compound-depth",type:s.zCompoundDepth,triggersZOrder:o.any},{name:"z-index-compare",type:s.zIndexCompare,triggersZOrder:o.any},{name:"z-index",type:s.number,triggersZOrder:o.any}],v=[{name:"overlay-padding",type:s.size,triggersBounds:o.any},{name:"overlay-color",type:s.color},{name:"overlay-opacity",type:s.zeroOneNumber,triggersBounds:o.zeroNonZero},{name:"overlay-shape",type:s.overlayShape,triggersBounds:o.any},{name:"overlay-corner-radius",type:s.cornerRadius}],g=[{name:"underlay-padding",type:s.size,triggersBounds:o.any},{name:"underlay-color",type:s.color},{name:"underlay-opacity",type:s.zeroOneNumber,triggersBounds:o.zeroNonZero},{name:"underlay-shape",type:s.overlayShape,triggersBounds:o.any},{name:"underlay-corner-radius",type:s.cornerRadius}],y=[{name:"transition-property",type:s.propList},{name:"transition-duration",type:s.time},{name:"transition-delay",type:s.time},{name:"transition-timing-function",type:s.easing}],m=function(e,t){return"label"===t.value?-e.poolIndex():t.pfValue},b=[{name:"height",type:s.nodeSize,triggersBounds:o.any,hashOverride:m},{name:"width",type:s.nodeSize,triggersBounds:o.any,hashOverride:m},{name:"shape",type:s.nodeShape,triggersBounds:o.any},{name:"shape-polygon-points",type:s.polygonPointList,triggersBounds:o.any},{name:"corner-radius",type:s.cornerRadius},{name:"background-color",type:s.color},{name:"background-fill",type:s.fill},{name:"background-opacity",type:s.zeroOneNumber},{name:"background-blacken",type:s.nOneOneNumber},{name:"background-gradient-stop-colors",type:s.colors},{name:"background-gradient-stop-positions",type:s.percentages},{name:"background-gradient-direction",type:s.gradientDirection},{name:"padding",type:s.sizeMaybePercent,triggersBounds:o.any},{name:"padding-relative-to",type:s.paddingRelativeTo,triggersBounds:o.any},{name:"bounds-expansion",type:s.boundsExpansion,triggersBounds:o.any}],x=[{name:"border-color",type:s.color},{name:"border-opacity",type:s.zeroOneNumber},{name:"border-width",type:s.size,triggersBounds:o.any},{name:"border-style",type:s.borderStyle},{name:"border-cap",type:s.lineCap},{name:"border-join",type:s.lineJoin},{name:"border-dash-pattern",type:s.numbers},{name:"border-dash-offset",type:s.number},{name:"border-position",type:s.linePosition}],w=[{name:"outline-color",type:s.color},{name:"outline-opacity",type:s.zeroOneNumber},{name:"outline-width",type:s.size,triggersBounds:o.any},{name:"outline-style",type:s.borderStyle},{name:"outline-offset",type:s.size,triggersBounds:o.any}],E=[{name:"background-image",type:s.urls},{name:"background-image-crossorigin",type:s.bgCrossOrigin},{name:"background-image-opacity",type:s.zeroOneNumbers},{name:"background-image-containment",type:s.bgContainment},{name:"background-image-smoothing",type:s.bools},{name:"background-position-x",type:s.bgPos},{name:"background-position-y",type:s.bgPos},{name:"background-width-relative-to",type:s.bgRelativeTo},{name:"background-height-relative-to",type:s.bgRelativeTo},{name:"background-repeat",type:s.bgRepeat},{name:"background-fit",type:s.bgFit},{name:"background-clip",type:s.bgClip},{name:"background-width",type:s.bgWH},{name:"background-height",type:s.bgWH},{name:"background-offset-x",type:s.bgPos},{name:"background-offset-y",type:s.bgPos}],k=[{name:"position",type:s.position,triggersBounds:o.any},{name:"compound-sizing-wrt-labels",type:s.compoundIncludeLabels,triggersBounds:o.any},{name:"min-width",type:s.size,triggersBounds:o.any},{name:"min-width-bias-left",type:s.sizeMaybePercent,triggersBounds:o.any},{name:"min-width-bias-right",type:s.sizeMaybePercent,triggersBounds:o.any},{name:"min-height",type:s.size,triggersBounds:o.any},{name:"min-height-bias-top",type:s.sizeMaybePercent,triggersBounds:o.any},{name:"min-height-bias-bottom",type:s.sizeMaybePercent,triggersBounds:o.any}],T=[{name:"line-style",type:s.lineStyle},{name:"line-color",type:s.color},{name:"line-fill",type:s.fill},{name:"line-cap",type:s.lineCap},{name:"line-opacity",type:s.zeroOneNumber},{name:"line-dash-pattern",type:s.numbers},{name:"line-dash-offset",type:s.number},{name:"line-outline-width",type:s.size},{name:"line-outline-color",type:s.color},{name:"line-gradient-stop-colors",type:s.colors},{name:"line-gradient-stop-positions",type:s.percentages},{name:"curve-style",type:s.curveStyle,triggersBounds:o.any,triggersBoundsOfParallelEdges:function(e,t){return e!==t&&("bezier"===e||"bezier"===t)}},{name:"haystack-radius",type:s.zeroOneNumber,triggersBounds:o.any},{name:"source-endpoint",type:s.edgeEndpoint,triggersBounds:o.any},{name:"target-endpoint",type:s.edgeEndpoint,triggersBounds:o.any},{name:"control-point-step-size",type:s.size,triggersBounds:o.any},{name:"control-point-distances",type:s.bidirectionalSizes,triggersBounds:o.any},{name:"control-point-weights",type:s.numbers,triggersBounds:o.any},{name:"segment-distances",type:s.bidirectionalSizes,triggersBounds:o.any},{name:"segment-weights",type:s.numbers,triggersBounds:o.any},{name:"segment-radii",type:s.numbers,triggersBounds:o.any},{name:"radius-type",type:s.radiusType,triggersBounds:o.any},{name:"taxi-turn",type:s.bidirectionalSizeMaybePercent,triggersBounds:o.any},{name:"taxi-turn-min-distance",type:s.size,triggersBounds:o.any},{name:"taxi-direction",type:s.axisDirection,triggersBounds:o.any},{name:"taxi-radius",type:s.number,triggersBounds:o.any},{name:"edge-distances",type:s.edgeDistances,triggersBounds:o.any},{name:"arrow-scale",type:s.positiveNumber,triggersBounds:o.any},{name:"loop-direction",type:s.angle,triggersBounds:o.any},{name:"loop-sweep",type:s.angle,triggersBounds:o.any},{name:"source-distance-from-node",type:s.size,triggersBounds:o.any},{name:"target-distance-from-node",type:s.size,triggersBounds:o.any}],C=[{name:"ghost",type:s.bool,triggersBounds:o.any},{name:"ghost-offset-x",type:s.bidirectionalSize,triggersBounds:o.any},{name:"ghost-offset-y",type:s.bidirectionalSize,triggersBounds:o.any},{name:"ghost-opacity",type:s.zeroOneNumber}],P=[{name:"selection-box-color",type:s.color},{name:"selection-box-opacity",type:s.zeroOneNumber},{name:"selection-box-border-color",type:s.color},{name:"selection-box-border-width",type:s.size},{name:"active-bg-color",type:s.color},{name:"active-bg-opacity",type:s.zeroOneNumber},{name:"active-bg-size",type:s.size},{name:"outside-texture-bg-color",type:s.color},{name:"outside-texture-bg-opacity",type:s.zeroOneNumber}],S=[];gu.pieBackgroundN=16,S.push({name:"pie-size",type:s.sizeMaybePercent}),S.push({name:"pie-hole",type:s.sizeMaybePercent}),S.push({name:"pie-start-angle",type:s.angle});for(var B=1;B<=gu.pieBackgroundN;B++)S.push({name:"pie-"+B+"-background-color",type:s.color}),S.push({name:"pie-"+B+"-background-size",type:s.percent}),S.push({name:"pie-"+B+"-background-opacity",type:s.zeroOneNumber});var D=[];gu.stripeBackgroundN=16,D.push({name:"stripe-size",type:s.sizeMaybePercent}),D.push({name:"stripe-direction",type:s.axisDirectionPrimary});for(var _=1;_<=gu.stripeBackgroundN;_++)D.push({name:"stripe-"+_+"-background-color",type:s.color}),D.push({name:"stripe-"+_+"-background-size",type:s.percent}),D.push({name:"stripe-"+_+"-background-opacity",type:s.zeroOneNumber});var A=[],M=gu.arrowPrefixes=["source","mid-source","target","mid-target"];[{name:"arrow-shape",type:s.arrowShape,triggersBounds:o.any},{name:"arrow-color",type:s.color},{name:"arrow-fill",type:s.arrowFill},{name:"arrow-width",type:s.arrowWidth}].forEach(function(e){M.forEach(function(t){var n=t+"-"+e.name,r=e.type,a=e.triggersBounds;A.push({name:n,type:r,triggersBounds:a})})},{});var R=gu.properties=[].concat(f,y,p,v,g,C,h,d,l,u,c,b,x,w,E,S,D,k,T,A,P),I=gu.propertyGroups={behavior:f,transition:y,visibility:p,overlay:v,underlay:g,ghost:C,commonLabel:h,labelDimensions:d,mainLabel:l,sourceLabel:u,targetLabel:c,nodeBody:b,nodeBorder:x,nodeOutline:w,backgroundImage:E,pie:S,stripe:D,compound:k,edgeLine:T,edgeArrow:A,core:P},N=gu.propertyGroupNames={};(gu.propertyGroupKeys=Object.keys(I)).forEach(function(e){N[e]=I[e].map(function(e){return e.name}),I[e].forEach(function(t){return t.groupKey=e})});var L=gu.aliases=[{name:"content",pointsTo:"label"},{name:"control-point-distance",pointsTo:"control-point-distances"},{name:"control-point-weight",pointsTo:"control-point-weights"},{name:"segment-distance",pointsTo:"segment-distances"},{name:"segment-weight",pointsTo:"segment-weights"},{name:"segment-radius",pointsTo:"segment-radii"},{name:"edge-text-rotation",pointsTo:"text-rotation"},{name:"padding-left",pointsTo:"padding"},{name:"padding-right",pointsTo:"padding"},{name:"padding-top",pointsTo:"padding"},{name:"padding-bottom",pointsTo:"padding"}];gu.propertyNames=R.map(function(e){return e.name});for(var z=0;z<R.length;z++){var O=R[z];R[O.name]=O}for(var V=0;V<L.length;V++){var F=L[V],j=R[F.pointsTo],X={name:F.name,alias:!0,pointsTo:j};R.push(X),R[F.name]=X}}(),gu.getDefaultProperty=function(e){return this.getDefaultProperties()[e]},gu.getDefaultProperties=function(){var e=this._private;if(null!=e.defaultProperties)return e.defaultProperties;for(var t=be({"selection-box-color":"#ddd","selection-box-opacity":.65,"selection-box-border-color":"#aaa","selection-box-border-width":1,"active-bg-color":"black","active-bg-opacity":.15,"active-bg-size":30,"outside-texture-bg-color":"#000","outside-texture-bg-opacity":.125,events:"yes","text-events":"no","text-valign":"top","text-halign":"center","text-justification":"auto","line-height":1,color:"#000","text-outline-color":"#000","text-outline-width":0,"text-outline-opacity":1,"text-opacity":1,"text-decoration":"none","text-transform":"none","text-wrap":"none","text-overflow-wrap":"whitespace","text-max-width":9999,"text-background-color":"#000","text-background-opacity":0,"text-background-shape":"rectangle","text-background-padding":0,"text-border-opacity":0,"text-border-width":0,"text-border-style":"solid","text-border-color":"#000","font-family":"Helvetica Neue, Helvetica, sans-serif","font-style":"normal","font-weight":"normal","font-size":16,"min-zoomed-font-size":0,"text-rotation":"none","source-text-rotation":"none","target-text-rotation":"none",visibility:"visible",display:"element",opacity:1,"z-compound-depth":"auto","z-index-compare":"auto","z-index":0,label:"","text-margin-x":0,"text-margin-y":0,"source-label":"","source-text-offset":0,"source-text-margin-x":0,"source-text-margin-y":0,"target-label":"","target-text-offset":0,"target-text-margin-x":0,"target-text-margin-y":0,"overlay-opacity":0,"overlay-color":"#000","overlay-padding":10,"overlay-shape":"round-rectangle","overlay-corner-radius":"auto","underlay-opacity":0,"underlay-color":"#000","underlay-padding":10,"underlay-shape":"round-rectangle","underlay-corner-radius":"auto","transition-property":"none","transition-duration":0,"transition-delay":0,"transition-timing-function":"linear","box-select-labels":"no","background-blacken":0,"background-color":"#999","background-fill":"solid","background-opacity":1,"background-image":"none","background-image-crossorigin":"anonymous","background-image-opacity":1,"background-image-containment":"inside","background-image-smoothing":"yes","background-position-x":"50%","background-position-y":"50%","background-offset-x":0,"background-offset-y":0,"background-width-relative-to":"include-padding","background-height-relative-to":"include-padding","background-repeat":"no-repeat","background-fit":"none","background-clip":"node","background-width":"auto","background-height":"auto","border-color":"#000","border-opacity":1,"border-width":0,"border-style":"solid","border-dash-pattern":[4,2],"border-dash-offset":0,"border-cap":"butt","border-join":"miter","border-position":"center","outline-color":"#999","outline-opacity":1,"outline-width":0,"outline-offset":0,"outline-style":"solid",height:30,width:30,shape:"ellipse","shape-polygon-points":"-1, -1, 1, -1, 1, 1, -1, 1","corner-radius":"auto","bounds-expansion":0,"background-gradient-direction":"to-bottom","background-gradient-stop-colors":"#999","background-gradient-stop-positions":"0%",ghost:"no","ghost-offset-y":0,"ghost-offset-x":0,"ghost-opacity":0,padding:0,"padding-relative-to":"width",position:"origin","compound-sizing-wrt-labels":"include","min-width":0,"min-width-bias-left":0,"min-width-bias-right":0,"min-height":0,"min-height-bias-top":0,"min-height-bias-bottom":0},{"pie-size":"100%","pie-hole":0,"pie-start-angle":"0deg"},[{name:"pie-{{i}}-background-color",value:"black"},{name:"pie-{{i}}-background-size",value:"0%"},{name:"pie-{{i}}-background-opacity",value:1}].reduce(function(e,t){for(var n=1;n<=gu.pieBackgroundN;n++){var r=t.name.replace("{{i}}",n),a=t.value;e[r]=a}return e},{}),{"stripe-size":"100%","stripe-direction":"horizontal"},[{name:"stripe-{{i}}-background-color",value:"black"},{name:"stripe-{{i}}-background-size",value:"0%"},{name:"stripe-{{i}}-background-opacity",value:1}].reduce(function(e,t){for(var n=1;n<=gu.stripeBackgroundN;n++){var r=t.name.replace("{{i}}",n),a=t.value;e[r]=a}return e},{}),{"line-style":"solid","line-color":"#999","line-fill":"solid","line-cap":"butt","line-opacity":1,"line-outline-width":0,"line-outline-color":"#000","line-gradient-stop-colors":"#999","line-gradient-stop-positions":"0%","control-point-step-size":40,"control-point-weights":.5,"segment-weights":.5,"segment-distances":20,"segment-radii":15,"radius-type":"arc-radius","taxi-turn":"50%","taxi-radius":15,"taxi-turn-min-distance":10,"taxi-direction":"auto","edge-distances":"intersection","curve-style":"haystack","haystack-radius":0,"arrow-scale":1,"loop-direction":"-45deg","loop-sweep":"-90deg","source-distance-from-node":0,"target-distance-from-node":0,"source-endpoint":"outside-to-node","target-endpoint":"outside-to-node","line-dash-pattern":[6,3],"line-dash-offset":0},[{name:"arrow-shape",value:"none"},{name:"arrow-color",value:"#999"},{name:"arrow-fill",value:"filled"},{name:"arrow-width",value:1}].reduce(function(e,t){return gu.arrowPrefixes.forEach(function(n){var r=n+"-"+t.name,a=t.value;e[r]=a}),e},{})),n={},r=0;r<this.properties.length;r++){var a=this.properties[r];if(!a.pointsTo){var i=a.name,o=t[i],s=this.parse(i,o);n[i]=s}}return e.defaultProperties=n,e.defaultProperties},gu.addDefaultStylesheet=function(){this.selector(":parent").css({shape:"rectangle",padding:10,"background-color":"#eee","border-color":"#ccc","border-width":1}).selector("edge").css({width:3}).selector(":loop").css({"curve-style":"bezier"}).selector("edge:compound").css({"curve-style":"bezier","source-endpoint":"outside-to-line","target-endpoint":"outside-to-line"}).selector(":selected").css({"background-color":"#0169D9","line-color":"#0169D9","source-arrow-color":"#0169D9","target-arrow-color":"#0169D9","mid-source-arrow-color":"#0169D9","mid-target-arrow-color":"#0169D9"}).selector(":parent:selected").css({"background-color":"#CCE1F9","border-color":"#aec8e5"}).selector(":active").css({"overlay-color":"black","overlay-padding":10,"overlay-opacity":.25}),this.defaultLength=this.length};var yu={parse:function(e,t,n,r){var a=this;if(G(t))return a.parseImplWarn(e,t,n,r);var i,o=He(e,""+t,n?"t":"f","mapping"===r||!0===r||!1===r||null==r?"dontcare":r),s=a.propCache=a.propCache||[];return(i=s[o])||(i=s[o]=a.parseImplWarn(e,t,n,r)),(n||"mapping"===r)&&(i=ot(i))&&(i.value=ot(i.value)),i},parseImplWarn:function(e,t,n,r){var a=this.parseImpl(e,t,n,r);return a||null==t||it("The style property `".concat(e,": ").concat(t,"` is invalid")),!a||"width"!==a.name&&"height"!==a.name||"label"!==t||it("The style value of `label` is deprecated for `"+a.name+"`"),a}};yu.parseImpl=function(e,t,n,r){var a=this;e=le(e);var i=a.properties[e],o=t,s=a.types;if(!i)return null;if(void 0===t)return null;i.alias&&(i=i.pointsTo,e=i.name);var l=K(t);l&&(t=t.trim());var u,c,d=i.type;if(!d)return null;if(n&&(""===t||null===t))return{name:e,value:t,bypass:!0,deleteBypass:!0};if(G(t))return{name:e,value:t,strValue:"fn",mapped:s.fn,bypass:n};if(!l||r||t.length<7||"a"!==t[1]);else{if(t.length>=7&&"d"===t[0]&&(u=new RegExp(s.data.regex).exec(t))){if(n)return!1;var h=s.data;return{name:e,value:u,strValue:""+t,mapped:h,field:u[1],bypass:n}}if(t.length>=10&&"m"===t[0]&&(c=new RegExp(s.mapData.regex).exec(t))){if(n)return!1;if(d.multiple)return!1;var f=s.mapData;if(!d.color&&!d.number)return!1;var p=this.parse(e,c[4]);if(!p||p.mapped)return!1;var v=this.parse(e,c[5]);if(!v||v.mapped)return!1;if(p.pfValue===v.pfValue||p.strValue===v.strValue)return it("`"+e+": "+t+"` is not a valid mapper because the output range is zero; converting to `"+e+": "+p.strValue+"`"),this.parse(e,p.strValue);if(d.color){var g=p.value,y=v.value;if(!(g[0]!==y[0]||g[1]!==y[1]||g[2]!==y[2]||g[3]!==y[3]&&(null!=g[3]&&1!==g[3]||null!=y[3]&&1!==y[3])))return!1}return{name:e,value:c,strValue:""+t,mapped:f,field:c[1],fieldMin:parseFloat(c[2]),fieldMax:parseFloat(c[3]),valueMin:p.value,valueMax:v.value,bypass:n}}}if(d.multiple&&"multiple"!==r){var m;if(m=l?t.split(/\s+/):Z(t)?t:[t],d.evenMultiple&&m.length%2!=0)return null;for(var b=[],x=[],w=[],E="",k=!1,T=0;T<m.length;T++){var C=a.parse(e,m[T],n,"multiple");k=k||K(C.value),b.push(C.value),w.push(null!=C.pfValue?C.pfValue:C.value),x.push(C.units),E+=(T>0?" ":"")+C.strValue}return d.validate&&!d.validate(b,x)?null:d.singleEnum&&k?1===b.length&&K(b[0])?{name:e,value:b[0],strValue:b[0],bypass:n}:null:{name:e,value:b,pfValue:w,strValue:E,bypass:n,units:x}}var P,S,B=function(){for(var r=0;r<d.enums.length;r++){if(d.enums[r]===t)return{name:e,value:t,strValue:""+t,bypass:n}}return null};if(d.number){var D,_="px";if(d.units&&(D=d.units),d.implicitUnits&&(_=d.implicitUnits),!d.unitless)if(l){var A="px|em"+(d.allowPercent?"|\\%":"");D&&(A=D);var M=t.match("^("+fe+")("+A+")?$");M&&(t=M[1],D=M[2]||_)}else D&&!d.implicitUnits||(D=_);if(t=parseFloat(t),isNaN(t)&&void 0===d.enums)return null;if(isNaN(t)&&void 0!==d.enums)return t=o,B();if(d.integer&&(!Q(S=t)||Math.floor(S)!==S))return null;if(void 0!==d.min&&(t<d.min||d.strictMin&&t===d.min)||void 0!==d.max&&(t>d.max||d.strictMax&&t===d.max))return null;var R={name:e,value:t,strValue:""+t+(D||""),units:D,bypass:n};return d.unitless||"px"!==D&&"em"!==D?R.pfValue=t:R.pfValue="px"!==D&&D?this.getEmSizeInPixels()*t:t,"ms"!==D&&"s"!==D||(R.pfValue="ms"===D?t:1e3*t),"deg"!==D&&"rad"!==D||(R.pfValue="rad"===D?t:(P=t,Math.PI*P/180)),"%"===D&&(R.pfValue=t/100),R}if(d.propList){var I=[],N=""+t;if("none"===N);else{for(var L=N.split(/\s*,\s*|\s+/),z=0;z<L.length;z++){var O=L[z].trim();a.properties[O]?I.push(O):it("`"+O+"` is not a valid property name")}if(0===I.length)return null}return{name:e,value:I,strValue:0===I.length?"none":I.join(" "),bypass:n}}if(d.color){var V=xe(t);return V?{name:e,value:V,pfValue:V,strValue:"rgb("+V[0]+","+V[1]+","+V[2]+")",bypass:n}:null}if(d.regex||d.regexes){if(d.enums){var F=B();if(F)return F}for(var j=d.regexes?d.regexes:[d.regex],X=0;X<j.length;X++){var q=new RegExp(j[X]).exec(t);if(q)return{name:e,value:d.singleRegexMatchValue?q[1]:q,strValue:""+t,bypass:n}}return null}return d.string?{name:e,value:""+t,strValue:""+t,bypass:n}:d.enums?B():null};var mu=function(e){if(!(this instanceof mu))return new mu(e);re(e)?(this._private={cy:e,coreStyle:{}},this.length=0,this.resetToDefault()):rt("A style must have a core reference")},bu=mu.prototype;bu.instanceString=function(){return"style"},bu.clear=function(){for(var e=this._private,t=e.cy.elements(),n=0;n<this.length;n++)this[n]=void 0;return this.length=0,e.contextStyles={},e.propDiffs={},this.cleanElements(t,!0),t.forEach(function(e){var t=e[0]._private;t.styleDirty=!0,t.appliedInitStyle=!1}),this},bu.resetToDefault=function(){return this.clear(),this.addDefaultStylesheet(),this},bu.core=function(e){return this._private.coreStyle[e]||this.getDefaultProperty(e)},bu.selector=function(e){var t="core"===e?null:new is(e),n=this.length++;return this[n]={selector:t,properties:[],mappedProperties:[],index:n},this},bu.css=function(){var e=arguments;if(1===e.length)for(var t=e[0],n=0;n<this.properties.length;n++){var r=this.properties[n],a=t[r.name];void 0===a&&(a=t[ue(r.name)]),void 0!==a&&this.cssRule(r.name,a)}else 2===e.length&&this.cssRule(e[0],e[1]);return this},bu.style=bu.css,bu.cssRule=function(e,t){var n=this.parse(e,t);if(n){var r=this.length-1;this[r].properties.push(n),this[r].properties[n.name]=n,n.name.match(/pie-(\d+)-background-size/)&&n.value&&(this._private.hasPie=!0),n.name.match(/stripe-(\d+)-background-size/)&&n.value&&(this._private.hasStripe=!0),n.mapped&&this[r].mappedProperties.push(n),!this[r].selector&&(this._private.coreStyle[n.name]=n)}return this},bu.append=function(e){return ae(e)?e.appendToStyle(this):Z(e)?this.appendFromJson(e):K(e)&&this.appendFromString(e),this},mu.fromJson=function(e,t){var n=new mu(e);return n.fromJson(t),n},mu.fromString=function(e,t){return new mu(e).fromString(t)},[uu,du,hu,fu,pu,vu,gu,yu].forEach(function(e){be(bu,e)}),mu.types=bu.types,mu.properties=bu.properties,mu.propertyGroups=bu.propertyGroups,mu.propertyGroupNames=bu.propertyGroupNames,mu.propertyGroupKeys=bu.propertyGroupKeys;var xu={style:function(e){e&&this.setStyle(e).update();return this._private.style},setStyle:function(e){var t=this._private;return ae(e)?t.style=e.generateStyle(this):Z(e)?t.style=mu.fromJson(this,e):K(e)?t.style=mu.fromString(this,e):t.style=mu(this),t.style},updateStyle:function(){this.mutableElements().updateStyle()}},wu={autolock:function(e){return void 0===e?this._private.autolock:(this._private.autolock=!!e,this)},autoungrabify:function(e){return void 0===e?this._private.autoungrabify:(this._private.autoungrabify=!!e,this)},autounselectify:function(e){return void 0===e?this._private.autounselectify:(this._private.autounselectify=!!e,this)},selectionType:function(e){var t=this._private;return null==t.selectionType&&(t.selectionType="single"),void 0===e?t.selectionType:("additive"!==e&&"single"!==e||(t.selectionType=e),this)},panningEnabled:function(e){return void 0===e?this._private.panningEnabled:(this._private.panningEnabled=!!e,this)},userPanningEnabled:function(e){return void 0===e?this._private.userPanningEnabled:(this._private.userPanningEnabled=!!e,this)},zoomingEnabled:function(e){return void 0===e?this._private.zoomingEnabled:(this._private.zoomingEnabled=!!e,this)},userZoomingEnabled:function(e){return void 0===e?this._private.userZoomingEnabled:(this._private.userZoomingEnabled=!!e,this)},boxSelectionEnabled:function(e){return void 0===e?this._private.boxSelectionEnabled:(this._private.boxSelectionEnabled=!!e,this)},pan:function(){var e,t,n,r,a,i=arguments,o=this._private.pan;switch(i.length){case 0:return o;case 1:if(K(i[0]))return o[e=i[0]];if($(i[0])){if(!this._private.panningEnabled)return this;r=(n=i[0]).x,a=n.y,Q(r)&&(o.x=r),Q(a)&&(o.y=a),this.emit("pan viewport")}break;case 2:if(!this._private.panningEnabled)return this;t=i[1],"x"!==(e=i[0])&&"y"!==e||!Q(t)||(o[e]=t),this.emit("pan viewport")}return this.notify("viewport"),this},panBy:function(e,t){var n,r,a,i,o,s=arguments,l=this._private.pan;if(!this._private.panningEnabled)return this;switch(s.length){case 1:$(e)&&(i=(a=s[0]).x,o=a.y,Q(i)&&(l.x+=i),Q(o)&&(l.y+=o),this.emit("pan viewport"));break;case 2:r=t,"x"!==(n=e)&&"y"!==n||!Q(r)||(l[n]+=r),this.emit("pan viewport")}return this.notify("viewport"),this},gc:function(){this.notify("gc")},fit:function(e,t){var n=this.getFitViewport(e,t);if(n){var r=this._private;r.zoom=n.zoom,r.pan=n.pan,this.emit("pan zoom viewport"),this.notify("viewport")}return this},getFitViewport:function(e,t){if(Q(e)&&void 0===t&&(t=e,e=void 0),this._private.panningEnabled&&this._private.zoomingEnabled){var n,r;if(K(e)){var a=e;e=this.$(a)}else if($(r=e)&&Q(r.x1)&&Q(r.x2)&&Q(r.y1)&&Q(r.y2)){var i=e;(n={x1:i.x1,y1:i.y1,x2:i.x2,y2:i.y2}).w=n.x2-n.x1,n.h=n.y2-n.y1}else ee(e)||(e=this.mutableElements());if(!ee(e)||!e.empty()){n=n||e.boundingBox();var o,s=this.width(),l=this.height();if(t=Q(t)?t:0,!isNaN(s)&&!isNaN(l)&&s>0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0)return{zoom:o=(o=(o=Math.min((s-2*t)/n.w,(l-2*t)/n.h))>this._private.maxZoom?this._private.maxZoom:o)<this._private.minZoom?this._private.minZoom:o,pan:{x:(s-o*(n.x1+n.x2))/2,y:(l-o*(n.y1+n.y2))/2}}}}},zoomRange:function(e,t){var n=this._private;if(null==t){var r=e;e=r.min,t=r.max}return Q(e)&&Q(t)&&e<=t?(n.minZoom=e,n.maxZoom=t):Q(e)&&void 0===t&&e<=n.maxZoom?n.minZoom=e:Q(t)&&void 0===e&&t>=n.minZoom&&(n.maxZoom=t),this},minZoom:function(e){return void 0===e?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return void 0===e?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t,n,r=this._private,a=r.pan,i=r.zoom,o=!1;if(r.zoomingEnabled||(o=!0),Q(e)?n=e:$(e)&&(n=e.level,null!=e.position?t=Xt(e.position,i,a):null!=e.renderedPosition&&(t=e.renderedPosition),null==t||r.panningEnabled||(o=!0)),n=(n=n>r.maxZoom?r.maxZoom:n)<r.minZoom?r.minZoom:n,o||!Q(n)||n===i||null!=t&&(!Q(t.x)||!Q(t.y)))return null;if(null!=t){var s=a,l=i,u=n;return{zoomed:!0,panned:!0,zoom:u,pan:{x:-u/l*(t.x-s.x)+t.x,y:-u/l*(t.y-s.y)+t.y}}}return{zoomed:!0,panned:!1,zoom:n,pan:a}},zoom:function(e){if(void 0===e)return this._private.zoom;var t=this.getZoomedViewport(e),n=this._private;return null!=t&&t.zoomed?(n.zoom=t.zoom,t.panned&&(n.pan.x=t.pan.x,n.pan.y=t.pan.y),this.emit("zoom"+(t.panned?" pan":"")+" viewport"),this.notify("viewport"),this):this},viewport:function(e){var t=this._private,n=!0,r=!0,a=[],i=!1,o=!1;if(!e)return this;if(Q(e.zoom)||(n=!1),$(e.pan)||(r=!1),!n&&!r)return this;if(n){var s=e.zoom;s<t.minZoom||s>t.maxZoom||!t.zoomingEnabled?i=!0:(t.zoom=s,a.push("zoom"))}if(r&&(!i||!e.cancelOnFailedZoom)&&t.panningEnabled){var l=e.pan;Q(l.x)&&(t.pan.x=l.x,o=!1),Q(l.y)&&(t.pan.y=l.y,o=!1),o||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(K(e)){var n=e;e=this.mutableElements().filter(n)}else ee(e)||(e=this.mutableElements());if(0!==e.length){var r=e.boundingBox(),a=this.width(),i=this.height();return{x:(a-(t=void 0===t?this._private.zoom:t)*(r.x1+r.x2))/2,y:(i-t*(r.y1+r.y2))/2}}}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e,t,n=this._private,r=n.container,a=this;return n.sizeCache=n.sizeCache||(r?(e=a.window().getComputedStyle(r),t=function(t){return parseFloat(e.getPropertyValue(t))},{width:r.clientWidth-t("padding-left")-t("padding-right"),height:r.clientHeight-t("padding-top")-t("padding-bottom")}):{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,n=this.renderedExtent(),r={x1:(n.x1-e.x)/t,x2:(n.x2-e.x)/t,y1:(n.y1-e.y)/t,y2:(n.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){return e?(this._private.multiClickDebounceTime=e,this):this._private.multiClickDebounceTime}};wu.centre=wu.center,wu.autolockNodes=wu.autolock,wu.autoungrabifyNodes=wu.autoungrabify;var Eu={data:wo.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:wo.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:wo.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:wo.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Eu.attr=Eu.data,Eu.removeAttr=Eu.removeData;var ku=function(e){var t=this,n=(e=be({},e)).container;n&&!J(n)&&J(n[0])&&(n=n[0]);var r=n?n._cyreg:null;(r=r||{})&&r.cy&&(r.cy.destroy(),r={});var a=r.readies=r.readies||[];n&&(n._cyreg=r),r.cy=t;var i=void 0!==f&&void 0!==n&&!e.headless,o=e;o.layout=be({name:i?"grid":"null"},o.layout),o.renderer=be({name:i?"canvas":"null"},o.renderer);var s=function(e,t,n){return void 0!==t?t:void 0!==n?n:e},l=this._private={container:n,ready:!1,options:o,elements:new Vl(this),listeners:[],aniEles:new Vl(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:s(!0,o.zoomingEnabled),userZoomingEnabled:s(!0,o.userZoomingEnabled),panningEnabled:s(!0,o.panningEnabled),userPanningEnabled:s(!0,o.userPanningEnabled),boxSelectionEnabled:s(!0,o.boxSelectionEnabled),autolock:s(!1,o.autolock,o.autolockNodes),autoungrabify:s(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:s(!1,o.autounselectify),styleEnabled:void 0===o.styleEnabled?i:o.styleEnabled,zoom:Q(o.zoom)?o.zoom:1,pan:{x:$(o.pan)&&Q(o.pan.x)?o.pan.x:0,y:$(o.pan)&&Q(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:s(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});l.styleEnabled&&t.setStyle([]);var u=be({},o,o.renderer);t.initRenderer(u);!function(e,t){if(e.some(oe))return Kr.all(e).then(t);t(e)}([o.style,o.elements],function(e){var n=e[0],i=e[1];l.styleEnabled&&t.style().append(n),function(e,n,r){t.notifications(!1);var a=t.mutableElements();a.length>0&&a.remove(),null!=e&&($(e)||Z(e))&&t.add(e),t.one("layoutready",function(e){t.notifications(!0),t.emit(e),t.one("load",n),t.emitAndNotify("load")}).one("layoutstop",function(){t.one("done",r),t.emit("done")});var i=be({},t._private.options.layout);i.eles=t.elements(),t.layout(i).run()}(i,function(){t.startAnimationLoop(),l.ready=!0,G(o.ready)&&t.on("ready",o.ready);for(var e=0;e<a.length;e++){var n=a[e];t.on("ready",n)}r&&(r.readies=[]),t.emit("ready")},o.done)})},Tu=ku.prototype;be(Tu,{instanceString:function(){return"core"},isReady:function(){return this._private.ready},destroyed:function(){return this._private.destroyed},ready:function(e){return this.isReady()?this.emitter().emit("ready",[],e):this.on("ready",e),this},destroy:function(){var e=this;if(!e.destroyed())return e.stopAnimationLoop(),e.destroyRenderer(),this.emit("destroy"),e._private.destroyed=!0,e},hasElementWithId:function(e){return this._private.elements.hasElementWithId(e)},getElementById:function(e){return this._private.elements.getElementById(e)},hasCompoundNodes:function(){return this._private.hasCompoundNodes},headless:function(){return this._private.renderer.isHeadless()},styleEnabled:function(){return this._private.styleEnabled},addToPool:function(e){return this._private.elements.merge(e),this},removeFromPool:function(e){return this._private.elements.unmerge(e),this},container:function(){return this._private.container||null},window:function(){if(null==this._private.container)return f;var e=this._private.container.ownerDocument;return void 0===e||null==e?f:e.defaultView||f},mount:function(e){if(null!=e){var t=this,n=t._private,r=n.options;return!J(e)&&J(e[0])&&(e=e[0]),t.stopAnimationLoop(),t.destroyRenderer(),n.container=e,n.styleEnabled=!0,t.invalidateSize(),t.initRenderer(be({},r,r.renderer,{name:"null"===r.renderer.name?"canvas":r.renderer.name})),t.startAnimationLoop(),t.style(r.style),t.emit("mount"),t}},unmount:function(){var e=this;return e.stopAnimationLoop(),e.destroyRenderer(),e.initRenderer({name:"null"}),e.emit("unmount"),e},options:function(){return ot(this._private.options)},json:function(e){var t=this,n=t._private,r=t.mutableElements();if($(e)){if(t.startBatch(),e.elements){var a={},i=function(e,n){for(var r=[],i=[],o=0;o<e.length;o++){var s=e[o];if(s.data.id){var l=""+s.data.id,u=t.getElementById(l);a[l]=!0,0!==u.length?i.push({ele:u,json:s}):n?(s.group=n,r.push(s)):r.push(s)}else it("cy.json() cannot handle elements without an ID attribute")}t.add(r);for(var c=0;c<i.length;c++){var d=i[c],h=d.ele,f=d.json;h.json(f)}};if(Z(e.elements))i(e.elements);else for(var o=["nodes","edges"],s=0;s<o.length;s++){var l=o[s],u=e.elements[l];Z(u)&&i(u,l)}var c=t.collection();r.filter(function(e){return!a[e.id()]}).forEach(function(e){e.isParent()?c.merge(e):e.remove()}),c.forEach(function(e){return e.children().move({parent:null})}),c.forEach(function(e){return function(e){return t.getElementById(e.id())}(e).remove()})}e.style&&t.style(e.style),null!=e.zoom&&e.zoom!==n.zoom&&t.zoom(e.zoom),e.pan&&(e.pan.x===n.pan.x&&e.pan.y===n.pan.y||t.pan(e.pan)),e.data&&t.data(e.data);for(var d=["minZoom","maxZoom","zoomingEnabled","userZoomingEnabled","panningEnabled","userPanningEnabled","boxSelectionEnabled","autolock","autoungrabify","autounselectify","multiClickDebounceTime"],h=0;h<d.length;h++){var f=d[h];null!=e[f]&&t[f](e[f])}return t.endBatch(),this}var p={};!!e?p.elements=this.elements().map(function(e){return e.json()}):(p.elements={},r.forEach(function(e){var t=e.group();p.elements[t]||(p.elements[t]=[]),p.elements[t].push(e.json())})),this._private.styleEnabled&&(p.style=t.style().json()),p.data=ot(t.data());var v=n.options;return p.zoomingEnabled=n.zoomingEnabled,p.userZoomingEnabled=n.userZoomingEnabled,p.zoom=n.zoom,p.minZoom=n.minZoom,p.maxZoom=n.maxZoom,p.panningEnabled=n.panningEnabled,p.userPanningEnabled=n.userPanningEnabled,p.pan=ot(n.pan),p.boxSelectionEnabled=n.boxSelectionEnabled,p.renderer=ot(v.renderer),p.hideEdgesOnViewport=v.hideEdgesOnViewport,p.textureOnViewport=v.textureOnViewport,p.wheelSensitivity=v.wheelSensitivity,p.motionBlur=v.motionBlur,p.multiClickDebounceTime=v.multiClickDebounceTime,p}}),Tu.$id=Tu.getElementById,[jl,Jl,nu,ru,au,iu,su,lu,xu,wu,Eu].forEach(function(e){be(Tu,e)});var Cu={fit:!0,directed:!1,padding:30,circle:!1,grid:!1,spacingFactor:1.75,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,roots:void 0,depthSort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}},Pu={maximal:!1,acyclic:!1},Su=function(e){return e.scratch("breadthfirst")},Bu=function(e,t){return e.scratch("breadthfirst",t)};function Du(e){this.options=be({},Cu,Pu,e)}Du.prototype.run=function(){var e,t=this.options,n=t.cy,r=t.eles,a=r.nodes().filter(function(e){return e.isChildless()}),i=r,o=t.directed,s=t.acyclic||t.maximal||t.maximalAdjustments>0,l=!!t.boundingBox,u=n.extent(),c=en(l?t.boundingBox:{x1:u.x1,y1:u.y1,w:u.w,h:u.h});if(ee(t.roots))e=t.roots;else if(Z(t.roots)){for(var d=[],h=0;h<t.roots.length;h++){var f=t.roots[h],p=n.getElementById(f);d.push(p)}e=n.collection(d)}else if(K(t.roots))e=n.$(t.roots);else if(o)e=a.roots();else{var v=r.components();e=n.collection();for(var g=function(){var t=v[y],n=t.maxDegree(!1),r=t.filter(function(e){return e.degree(!1)===n});e=e.add(r)},y=0;y<v.length;y++)g()}var m=[],b={},x=function(e,t){null==m[t]&&(m[t]=[]);var n=m[t].length;m[t].push(e),Bu(e,{index:n,depth:t})};i.bfs({roots:e,directed:t.directed,visit:function(e,t,n,r,a){var i=e[0],o=i.id();i.isChildless()&&x(i,a),b[o]=!0}});for(var w=[],E=0;E<a.length;E++){var k=a[E];b[k.id()]||w.push(k)}var T=function(e){for(var t=m[e],n=0;n<t.length;n++){var r=t[n];null!=r?Bu(r,{depth:e,index:n}):(t.splice(n,1),n--)}},C=function(e,n){for(var a=Su(e),i=e.incomers().filter(function(e){return e.isNode()&&r.has(e)}),o=-1,s=e.id(),l=0;l<i.length;l++){var u=i[l],c=Su(u);o=Math.max(o,c.depth)}if(a.depth<=o){if(!t.acyclic&&n[s])return null;var d=o+1;return function(e,t){var n=Su(e),r=n.depth,a=n.index;m[r][a]=null,e.isChildless()&&x(e,t)}(e,d),n[s]=d,!0}return!1};if(o&&s){var P=[],S={},B=function(e){return P.push(e)},D=function(){return P.shift()};for(a.forEach(function(e){return P.push(e)});P.length>0;){var _=D(),A=C(_,S);if(A)_.outgoers().filter(function(e){return e.isNode()&&r.has(e)}).forEach(B);else if(null===A){it("Detected double maximal shift for node `"+_.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var M=0;if(t.avoidOverlap)for(var R=0;R<a.length;R++){var I=a[R].layoutDimensions(t),N=I.w,L=I.h;M=Math.max(M,N,L)}var z={},O=function(e){if(z[e.id()])return z[e.id()];for(var t=Su(e).depth,n=e.neighborhood(),r=0,i=0,o=0;o<n.length;o++){var s=n[o];if(!s.isEdge()&&!s.isParent()&&a.has(s)){var l=Su(s);if(null!=l){var u=l.index,c=l.depth;if(null!=u&&null!=c){var d=m[c].length;c<t&&(r+=u/d,i++)}}}}return r/=i=Math.max(1,i),0===i&&(r=0),z[e.id()]=r,r},V=function(e,t){var n=O(e)-O(t);return 0===n?me(e.id(),t.id()):n};void 0!==t.depthSort&&(V=t.depthSort);for(var F=m.length,j=0;j<F;j++)m[j].sort(V),T(j);for(var X=[],q=0;q<w.length;q++)X.push(w[q]);X.length&&(m.unshift(X),F=m.length,function(){for(var e=0;e<F;e++)T(e)}());for(var Y=0,W=0;W<F;W++)Y=Math.max(m[W].length,Y);var U=c.x1+c.w/2,H=c.y1+c.h/2,G=a.reduce(function(e,n){return r=n.boundingBox({includeLabels:t.nodeDimensionsIncludeLabels}),{w:-1===e.w?r.w:(e.w+r.w)/2,h:-1===e.h?r.h:(e.h+r.h)/2};var r},{w:-1,h:-1}),$=Math.max(1===F?0:l?(c.h-2*t.padding-G.h)/(F-1):(c.h-2*t.padding-G.h)/(F+1),M),Q=m.reduce(function(e,t){return Math.max(e,t.length)},0);return r.nodes().layoutPositions(this,t,function(e){var n=Su(e),r=n.depth,a=n.index;if(t.circle){var i=Math.min(c.w/2/F,c.h/2/F),o=(i=Math.max(i,M))*r+i-(F>0&&m[0].length<=3?i/2:0),s=2*Math.PI/m[r].length*a;return 0===r&&1===m[0].length&&(o=1),{x:U+o*Math.cos(s),y:H+o*Math.sin(s)}}var u=m[r].length,d=Math.max(1===u?0:l?(c.w-2*t.padding-G.w)/((t.grid?Q:u)-1):(c.w-2*t.padding-G.w)/((t.grid?Q:u)+1),M);return{x:U+(a+1-(u+1)/2)*d,y:H+(r+1-(F+1)/2)*$}}),this};var _u={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function Au(e){this.options=be({},_u,e)}Au.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,a=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,i=r.nodes().not(":parent");t.sort&&(i=i.sort(t.sort));for(var o,s=en(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l=s.x1+s.w/2,u=s.y1+s.h/2,c=(void 0===t.sweep?2*Math.PI-2*Math.PI/i.length:t.sweep)/Math.max(1,i.length-1),d=0,h=0;h<i.length;h++){var f=i[h].layoutDimensions(t),p=f.w,v=f.h;d=Math.max(d,p,v)}if(o=Q(t.radius)?t.radius:i.length<=1?0:Math.min(s.h,s.w)/2-d,i.length>1&&t.avoidOverlap){d*=1.75;var g=Math.cos(c)-Math.cos(0),y=Math.sin(c)-Math.sin(0),m=Math.sqrt(d*d/(g*g+y*y));o=Math.max(m,o)}return r.nodes().layoutPositions(this,t,function(e,n){var r=t.startAngle+n*c*(a?1:-1),i=o*Math.cos(r),s=o*Math.sin(r);return{x:l+i,y:u+s}}),this};var Mu,Ru={fit:!0,padding:30,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function Iu(e){this.options=be({},Ru,e)}Iu.prototype.run=function(){for(var e=this.options,t=e,n=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,r=e.cy,a=t.eles,i=a.nodes().not(":parent"),o=en(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s=o.x1+o.w/2,l=o.y1+o.h/2,u=[],c=0,d=0;d<i.length;d++){var h,f=i[d];h=t.concentric(f),u.push({value:h,node:f}),f._private.scratch.concentric=h}i.updateStyle();for(var p=0;p<i.length;p++){var v=i[p].layoutDimensions(t);c=Math.max(c,v.w,v.h)}u.sort(function(e,t){return t.value-e.value});for(var g=t.levelWidth(i),y=[[]],m=y[0],b=0;b<u.length;b++){var x=u[b];if(m.length>0)Math.abs(m[0].value-x.value)>=g&&(m=[],y.push(m));m.push(x)}var w=c+t.minNodeSpacing;if(!t.avoidOverlap){var E=y.length>0&&y[0].length>1,k=(Math.min(o.w,o.h)/2-w)/(y.length+E?1:0);w=Math.min(w,k)}for(var T=0,C=0;C<y.length;C++){var P=y[C],S=void 0===t.sweep?2*Math.PI-2*Math.PI/P.length:t.sweep,B=P.dTheta=S/Math.max(1,P.length-1);if(P.length>1&&t.avoidOverlap){var D=Math.cos(B)-Math.cos(0),_=Math.sin(B)-Math.sin(0),A=Math.sqrt(w*w/(D*D+_*_));T=Math.max(A,T)}P.r=T,T+=w}if(t.equidistant){for(var M=0,R=0,I=0;I<y.length;I++){var N=y[I].r-R;M=Math.max(M,N)}R=0;for(var L=0;L<y.length;L++){var z=y[L];0===L&&(R=z.r),z.r=R,R+=M}}for(var O={},V=0;V<y.length;V++)for(var F=y[V],j=F.dTheta,X=F.r,q=0;q<F.length;q++){var Y=F[q],W=t.startAngle+(n?1:-1)*j*q,U={x:s+X*Math.cos(W),y:l+X*Math.sin(W)};O[Y.node.id()]=U}return a.nodes().layoutPositions(this,t,function(e){var t=e.id();return O[t]}),this};var Nu={ready:function(){},stop:function(){},animate:!0,animationEasing:void 0,animationDuration:void 0,animateFilter:function(e,t){return!0},animationThreshold:250,refresh:20,fit:!0,padding:30,boundingBox:void 0,nodeDimensionsIncludeLabels:!1,randomize:!1,componentSpacing:40,nodeRepulsion:function(e){return 2048},nodeOverlap:4,idealEdgeLength:function(e){return 32},edgeElasticity:function(e){return 32},nestingFactor:1.2,gravity:1,numIter:1e3,initialTemp:1e3,coolingFactor:.99,minTemp:1};function Lu(e){this.options=be({},Nu,e),this.options.layout=this;var t=this.options.eles.nodes(),n=this.options.eles.edges().filter(function(e){var n=e.source().data("id"),r=e.target().data("id"),a=t.some(function(e){return e.data("id")===n}),i=t.some(function(e){return e.data("id")===r});return!a||!i});this.options.eles=this.options.eles.not(n)}Lu.prototype.run=function(){var e=this.options,t=e.cy,n=this;n.stopped=!1,!0!==e.animate&&!1!==e.animate||n.emit({type:"layoutstart",layout:n}),Mu=!0===e.debug;var r=zu(t,n,e);Mu&&undefined(r),e.randomize&&Fu(r);var a=ze(),i=function(){Xu(r,t,e),!0===e.fit&&t.fit(e.padding)},o=function(t){return!(n.stopped||t>=e.numIter)&&(qu(r,e),r.temperature=r.temperature*e.coolingFactor,!(r.temperature<e.minTemp))},s=function(){if(!0===e.animate||!1===e.animate)i(),n.one("layoutstop",e.stop),n.emit({type:"layoutstop",layout:n});else{var t=e.eles.nodes(),a=ju(r,e,t);t.layoutPositions(n,e,a)}},l=0,u=!0;if(!0===e.animate){var c=function(){for(var t=0;u&&t<e.refresh;)u=o(l),l++,t++;u?(ze()-a>=e.animationThreshold&&i(),Le(c)):(tc(r,e),s())};c()}else{for(;u;)u=o(l),l++;tc(r,e),s()}return this},Lu.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this},Lu.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var zu=function(e,t,n){for(var r=n.eles.edges(),a=n.eles.nodes(),i=en(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:r.size(),temperature:n.initialTemp,clientWidth:i.w,clientHeight:i.h,boundingBox:i},s=n.eles.components(),l={},u=0;u<s.length;u++)for(var c=s[u],d=0;d<c.length;d++){l[c[d].id()]=u}for(u=0;u<o.nodeSize;u++){var h=(y=a[u]).layoutDimensions(n);(R={}).isLocked=y.locked(),R.id=y.data("id"),R.parentId=y.data("parent"),R.cmptId=l[y.id()],R.children=[],R.positionX=y.position("x"),R.positionY=y.position("y"),R.offsetX=0,R.offsetY=0,R.height=h.w,R.width=h.h,R.maxX=R.positionX+R.width/2,R.minX=R.positionX-R.width/2,R.maxY=R.positionY+R.height/2,R.minY=R.positionY-R.height/2,R.padLeft=parseFloat(y.style("padding")),R.padRight=parseFloat(y.style("padding")),R.padTop=parseFloat(y.style("padding")),R.padBottom=parseFloat(y.style("padding")),R.nodeRepulsion=G(n.nodeRepulsion)?n.nodeRepulsion(y):n.nodeRepulsion,o.layoutNodes.push(R),o.idToIndex[R.id]=u}var f=[],p=0,v=-1,g=[];for(u=0;u<o.nodeSize;u++){var y,m=(y=o.layoutNodes[u]).parentId;null!=m?o.layoutNodes[o.idToIndex[m]].children.push(y.id):(f[++v]=y.id,g.push(y.id))}for(o.graphSet.push(g);p<=v;){var b=f[p++],x=o.idToIndex[b],w=o.layoutNodes[x].children;if(w.length>0){o.graphSet.push(w);for(u=0;u<w.length;u++)f[++v]=w[u]}}for(u=0;u<o.graphSet.length;u++){var E=o.graphSet[u];for(d=0;d<E.length;d++){var k=o.idToIndex[E[d]];o.indexToGraph[k]=u}}for(u=0;u<o.edgeSize;u++){var T=r[u],C={};C.id=T.data("id"),C.sourceId=T.data("source"),C.targetId=T.data("target");var P=G(n.idealEdgeLength)?n.idealEdgeLength(T):n.idealEdgeLength,S=G(n.edgeElasticity)?n.edgeElasticity(T):n.edgeElasticity,B=o.idToIndex[C.sourceId],D=o.idToIndex[C.targetId];if(o.indexToGraph[B]!=o.indexToGraph[D]){for(var _=Ou(C.sourceId,C.targetId,o),A=o.graphSet[_],M=0,R=o.layoutNodes[B];-1===A.indexOf(R.id);)R=o.layoutNodes[o.idToIndex[R.parentId]],M++;for(R=o.layoutNodes[D];-1===A.indexOf(R.id);)R=o.layoutNodes[o.idToIndex[R.parentId]],M++;P*=M*n.nestingFactor}C.idealLength=P,C.elasticity=S,o.layoutEdges.push(C)}return o},Ou=function(e,t,n){var r=Vu(e,t,0,n);return 2>r.count?0:r.graph},Vu=function(e,t,n,r){var a=r.graphSet[n];if(-1<a.indexOf(e)&&-1<a.indexOf(t))return{count:2,graph:n};for(var i=0,o=0;o<a.length;o++){var s=a[o],l=r.idToIndex[s],u=r.layoutNodes[l].children;if(0!==u.length){var c=r.indexToGraph[r.idToIndex[u[0]]],d=Vu(e,t,c,r);if(0!==d.count){if(1!==d.count)return d;if(2===++i)break}}}return{count:i,graph:n}},Fu=function(e,t){for(var n=e.clientWidth,r=e.clientHeight,a=0;a<e.nodeSize;a++){var i=e.layoutNodes[a];0!==i.children.length||i.isLocked||(i.positionX=Math.random()*n,i.positionY=Math.random()*r)}},ju=function(e,t,n){var r=e.boundingBox,a={x1:1/0,x2:-1/0,y1:1/0,y2:-1/0};return t.boundingBox&&(n.forEach(function(t){var n=e.layoutNodes[e.idToIndex[t.data("id")]];a.x1=Math.min(a.x1,n.positionX),a.x2=Math.max(a.x2,n.positionX),a.y1=Math.min(a.y1,n.positionY),a.y2=Math.max(a.y2,n.positionY)}),a.w=a.x2-a.x1,a.h=a.y2-a.y1),function(n,i){var o=e.layoutNodes[e.idToIndex[n.data("id")]];if(t.boundingBox){var s=(o.positionX-a.x1)/a.w,l=(o.positionY-a.y1)/a.h;return{x:r.x1+s*r.w,y:r.y1+l*r.h}}return{x:o.positionX,y:o.positionY}}},Xu=function(e,t,n){var r=n.layout,a=n.eles.nodes(),i=ju(e,n,a);a.positions(i),!0!==e.ready&&(e.ready=!0,r.one("layoutready",n.ready),r.emit({type:"layoutready",layout:this}))},qu=function(e,t,n){Yu(e,t),Gu(e),Zu(e,t),$u(e),Qu(e)},Yu=function(e,t){for(var n=0;n<e.graphSet.length;n++)for(var r=e.graphSet[n],a=r.length,i=0;i<a;i++)for(var o=e.layoutNodes[e.idToIndex[r[i]]],s=i+1;s<a;s++){var l=e.layoutNodes[e.idToIndex[r[s]]];Uu(o,l,e,t)}},Wu=function(e){return 2*e*Math.random()-1},Uu=function(e,t,n,r){if(e.cmptId===t.cmptId||n.isCompound){var a=t.positionX-e.positionX,i=t.positionY-e.positionY;0===a&&0===i&&(a=Wu(1),i=Wu(1));var o=Hu(e,t,a,i);if(o>0)var s=(u=r.nodeOverlap*o)*a/(v=Math.sqrt(a*a+i*i)),l=u*i/v;else{var u,c=Ku(e,a,i),d=Ku(t,-1*a,-1*i),h=d.x-c.x,f=d.y-c.y,p=h*h+f*f,v=Math.sqrt(p);s=(u=(e.nodeRepulsion+t.nodeRepulsion)/p)*h/v,l=u*f/v}e.isLocked||(e.offsetX-=s,e.offsetY-=l),t.isLocked||(t.offsetX+=s,t.offsetY+=l)}},Hu=function(e,t,n,r){if(n>0)var a=e.maxX-t.minX;else a=t.maxX-e.minX;if(r>0)var i=e.maxY-t.minY;else i=t.maxY-e.minY;return a>=0&&i>=0?Math.sqrt(a*a+i*i):0},Ku=function(e,t,n){var r=e.positionX,a=e.positionY,i=e.height||1,o=e.width||1,s=n/t,l=i/o,u={};return 0===t&&0<n||0===t&&0>n?(u.x=r,u.y=a+i/2,u):0<t&&-1*l<=s&&s<=l?(u.x=r+o/2,u.y=a+o*n/2/t,u):0>t&&-1*l<=s&&s<=l?(u.x=r-o/2,u.y=a-o*n/2/t,u):0<n&&(s<=-1*l||s>=l)?(u.x=r+i*t/2/n,u.y=a+i/2,u):0>n&&(s<=-1*l||s>=l)?(u.x=r-i*t/2/n,u.y=a-i/2,u):u},Gu=function(e,t){for(var n=0;n<e.edgeSize;n++){var r=e.layoutEdges[n],a=e.idToIndex[r.sourceId],i=e.layoutNodes[a],o=e.idToIndex[r.targetId],s=e.layoutNodes[o],l=s.positionX-i.positionX,u=s.positionY-i.positionY;if(0!==l||0!==u){var c=Ku(i,l,u),d=Ku(s,-1*l,-1*u),h=d.x-c.x,f=d.y-c.y,p=Math.sqrt(h*h+f*f),v=Math.pow(r.idealLength-p,2)/r.elasticity;if(0!==p)var g=v*h/p,y=v*f/p;else g=0,y=0;i.isLocked||(i.offsetX+=g,i.offsetY+=y),s.isLocked||(s.offsetX-=g,s.offsetY-=y)}}},Zu=function(e,t){if(0!==t.gravity)for(var n=0;n<e.graphSet.length;n++){var r=e.graphSet[n],a=r.length;if(0===n)var i=e.clientHeight/2,o=e.clientWidth/2;else{var s=e.layoutNodes[e.idToIndex[r[0]]],l=e.layoutNodes[e.idToIndex[s.parentId]];i=l.positionX,o=l.positionY}for(var u=0;u<a;u++){var c=e.layoutNodes[e.idToIndex[r[u]]];if(!c.isLocked){var d=i-c.positionX,h=o-c.positionY,f=Math.sqrt(d*d+h*h);if(f>1){var p=t.gravity*d/f,v=t.gravity*h/f;c.offsetX+=p,c.offsetY+=v}}}}},$u=function(e,t){var n=[],r=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;r<=a;){var i=n[r++],o=e.idToIndex[i],s=e.layoutNodes[o],l=s.children;if(0<l.length&&!s.isLocked){for(var u=s.offsetX,c=s.offsetY,d=0;d<l.length;d++){var h=e.layoutNodes[e.idToIndex[l[d]]];h.offsetX+=u,h.offsetY+=c,n[++a]=l[d]}s.offsetX=0,s.offsetY=0}}},Qu=function(e,t){for(var n=0;n<e.nodeSize;n++){0<(a=e.layoutNodes[n]).children.length&&(a.maxX=void 0,a.minX=void 0,a.maxY=void 0,a.minY=void 0)}for(n=0;n<e.nodeSize;n++){if(!(0<(a=e.layoutNodes[n]).children.length||a.isLocked)){var r=Ju(a.offsetX,a.offsetY,e.temperature);a.positionX+=r.x,a.positionY+=r.y,a.offsetX=0,a.offsetY=0,a.minX=a.positionX-a.width,a.maxX=a.positionX+a.width,a.minY=a.positionY-a.height,a.maxY=a.positionY+a.height,ec(a,e)}}for(n=0;n<e.nodeSize;n++){var a;0<(a=e.layoutNodes[n]).children.length&&!a.isLocked&&(a.positionX=(a.maxX+a.minX)/2,a.positionY=(a.maxY+a.minY)/2,a.width=a.maxX-a.minX,a.height=a.maxY-a.minY)}},Ju=function(e,t,n){var r=Math.sqrt(e*e+t*t);if(r>n)var a={x:n*e/r,y:n*t/r};else a={x:e,y:t};return a},ec=function(e,t){var n=e.parentId;if(null!=n){var r=t.layoutNodes[t.idToIndex[n]],a=!1;return(null==r.maxX||e.maxX+r.padRight>r.maxX)&&(r.maxX=e.maxX+r.padRight,a=!0),(null==r.minX||e.minX-r.padLeft<r.minX)&&(r.minX=e.minX-r.padLeft,a=!0),(null==r.maxY||e.maxY+r.padBottom>r.maxY)&&(r.maxY=e.maxY+r.padBottom,a=!0),(null==r.minY||e.minY-r.padTop<r.minY)&&(r.minY=e.minY-r.padTop,a=!0),a?ec(r,t):void 0}},tc=function(e,t){for(var n=e.layoutNodes,r=[],a=0;a<n.length;a++){var i=n[a],o=i.cmptId;(r[o]=r[o]||[]).push(i)}var s=0;for(a=0;a<r.length;a++){if(v=r[a]){v.x1=1/0,v.x2=-1/0,v.y1=1/0,v.y2=-1/0;for(var l=0;l<v.length;l++){var u=v[l];v.x1=Math.min(v.x1,u.positionX-u.width/2),v.x2=Math.max(v.x2,u.positionX+u.width/2),v.y1=Math.min(v.y1,u.positionY-u.height/2),v.y2=Math.max(v.y2,u.positionY+u.height/2)}v.w=v.x2-v.x1,v.h=v.y2-v.y1,s+=v.w*v.h}}r.sort(function(e,t){return t.w*t.h-e.w*e.h});var c=0,d=0,h=0,f=0,p=Math.sqrt(s)*e.clientWidth/e.clientHeight;for(a=0;a<r.length;a++){var v;if(v=r[a]){for(l=0;l<v.length;l++){(u=v[l]).isLocked||(u.positionX+=c-v.x1,u.positionY+=d-v.y1)}c+=v.w+t.componentSpacing,h+=v.w+t.componentSpacing,f=Math.max(f,v.h),h>p&&(d+=f+t.componentSpacing,c=0,h=0,f=0)}}},nc={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function rc(e){this.options=be({},nc,e)}rc.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,a=r.nodes().not(":parent");t.sort&&(a=a.sort(t.sort));var i=en(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(0===i.h||0===i.w)r.nodes().layoutPositions(this,t,function(e){return{x:i.x1,y:i.y1}});else{var o=a.size(),s=Math.sqrt(o*i.h/i.w),l=Math.round(s),u=Math.round(i.w/i.h*s),c=function(e){if(null==e)return Math.min(l,u);Math.min(l,u)==l?l=e:u=e},d=function(e){if(null==e)return Math.max(l,u);Math.max(l,u)==l?l=e:u=e},h=t.rows,f=null!=t.cols?t.cols:t.columns;if(null!=h&&null!=f)l=h,u=f;else if(null!=h&&null==f)l=h,u=Math.ceil(o/l);else if(null==h&&null!=f)u=f,l=Math.ceil(o/u);else if(u*l>o){var p=c(),v=d();(p-1)*v>=o?c(p-1):(v-1)*p>=o&&d(v-1)}else for(;u*l<o;){var g=c(),y=d();(y+1)*g>=o?d(y+1):c(g+1)}var m=i.w/u,b=i.h/l;if(t.condense&&(m=0,b=0),t.avoidOverlap)for(var x=0;x<a.length;x++){var w=a[x],E=w._private.position;null!=E.x&&null!=E.y||(E.x=0,E.y=0);var k=w.layoutDimensions(t),T=t.avoidOverlapPadding,C=k.w+T,P=k.h+T;m=Math.max(m,C),b=Math.max(b,P)}for(var S={},B=function(e,t){return!!S["c-"+e+"-"+t]},D=function(e,t){S["c-"+e+"-"+t]=!0},_=0,A=0,M=function(){++A>=u&&(A=0,_++)},R={},I=0;I<a.length;I++){var N=a[I],L=t.position(N);if(L&&(void 0!==L.row||void 0!==L.col)){var z={row:L.row,col:L.col};if(void 0===z.col)for(z.col=0;B(z.row,z.col);)z.col++;else if(void 0===z.row)for(z.row=0;B(z.row,z.col);)z.row++;R[N.id()]=z,D(z.row,z.col)}}a.layoutPositions(this,t,function(e,t){var n,r;if(e.locked()||e.isParent())return!1;var a=R[e.id()];if(a)n=a.col*m+m/2+i.x1,r=a.row*b+b/2+i.y1;else{for(;B(_,A);)M();n=A*m+m/2+i.x1,r=_*b+b/2+i.y1,D(_,A),M()}return{x:n,y:r}})}return this};var ac={ready:function(){},stop:function(){}};function ic(e){this.options=be({},ac,e)}ic.prototype.run=function(){var e=this.options,t=e.eles,n=this;return e.cy,n.emit("layoutstart"),t.nodes().positions(function(){return{x:0,y:0}}),n.one("layoutready",e.ready),n.emit("layoutready"),n.one("layoutstop",e.stop),n.emit("layoutstop"),this},ic.prototype.stop=function(){return this};var oc={positions:void 0,zoom:void 0,pan:void 0,fit:!0,padding:30,spacingFactor:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function sc(e){this.options=be({},oc,e)}sc.prototype.run=function(){var e=this.options,t=e.eles.nodes(),n=G(e.positions);return t.layoutPositions(this,e,function(t,r){var a=function(t){if(null==e.positions)return function(e){return{x:e.x,y:e.y}}(t.position());if(n)return e.positions(t);var r=e.positions[t._private.data.id];return null==r?null:r}(t);return!t.locked()&&null!=a&&a}),this};var lc={fit:!0,padding:30,boundingBox:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function uc(e){this.options=be({},lc,e)}uc.prototype.run=function(){var e=this.options,t=e.cy,n=e.eles,r=en(e.boundingBox?e.boundingBox:{x1:0,y1:0,w:t.width(),h:t.height()});return n.nodes().layoutPositions(this,e,function(e,t){return{x:r.x1+Math.round(Math.random()*r.w),y:r.y1+Math.round(Math.random()*r.h)}}),this};var cc=[{name:"breadthfirst",impl:Du},{name:"circle",impl:Au},{name:"concentric",impl:Iu},{name:"cose",impl:Lu},{name:"grid",impl:rc},{name:"null",impl:ic},{name:"preset",impl:sc},{name:"random",impl:uc}];function dc(e){this.options=e,this.notifications=0}var hc=function(){},fc=function(){throw new Error("A headless instance can not render images")};dc.prototype={recalculateRenderedStyle:hc,notify:function(){this.notifications++},init:hc,isHeadless:function(){return!0},png:fc,jpg:fc};var pc={arrowShapeWidth:.3,registerArrowShapes:function(){var e=this.arrowShapes={},t=this,n=function(e,t,n,r,a,i,o){var s=a.x-n/2-o,l=a.x+n/2+o,u=a.y-n/2-o,c=a.y+n/2+o;return s<=e&&e<=l&&u<=t&&t<=c},r=function(e,t,n,r,a){var i=e*Math.cos(r)-t*Math.sin(r),o=(e*Math.sin(r)+t*Math.cos(r))*n;return{x:i*n+a.x,y:o+a.y}},a=function(e,t,n,a){for(var i=[],o=0;o<e.length;o+=2){var s=e[o],l=e[o+1];i.push(r(s,l,t,n,a))}return i},i=function(e){for(var t=[],n=0;n<e.length;n++){var r=e[n];t.push(r.x,r.y)}return t},o=function(e){return e.pstyle("width").pfValue*e.pstyle("arrow-scale").pfValue*2},s=function(r,s){K(s)&&(s=e[s]),e[r]=be({name:r,points:[-.15,-.3,.15,-.3,.15,.3,-.15,.3],collide:function(e,t,n,r,o,s){var l=i(a(this.points,n+2*s,r,o));return mn(e,t,l)},roughCollide:n,draw:function(e,n,r,i){var o=a(this.points,n,r,i);t.arrowShapeImpl("polygon")(e,o)},spacing:function(e){return 0},gap:o},s)};s("none",{collide:et,roughCollide:et,draw:nt,spacing:tt,gap:tt}),s("triangle",{points:[-.15,-.3,0,0,.15,-.3]}),s("arrow","triangle"),s("triangle-backcurve",{points:e.triangle.points,controlPoint:[0,-.15],roughCollide:n,draw:function(e,n,i,o,s){var l=a(this.points,n,i,o),u=this.controlPoint,c=r(u[0],u[1],n,i,o);t.arrowShapeImpl(this.name)(e,l,c)},gap:function(e){return.8*o(e)}}),s("triangle-tee",{points:[0,0,.15,-.3,-.15,-.3,0,0],pointsTee:[-.15,-.4,-.15,-.5,.15,-.5,.15,-.4],collide:function(e,t,n,r,o,s,l){var u=i(a(this.points,n+2*l,r,o)),c=i(a(this.pointsTee,n+2*l,r,o));return mn(e,t,u)||mn(e,t,c)},draw:function(e,n,r,i,o){var s=a(this.points,n,r,i),l=a(this.pointsTee,n,r,i);t.arrowShapeImpl(this.name)(e,s,l)}}),s("circle-triangle",{radius:.15,pointsTr:[0,-.15,.15,-.45,-.15,-.45,0,-.15],collide:function(e,t,n,r,o,s,l){var u=o,c=Math.pow(u.x-e,2)+Math.pow(u.y-t,2)<=Math.pow((n+2*l)*this.radius,2),d=i(a(this.points,n+2*l,r,o));return mn(e,t,d)||c},draw:function(e,n,r,i,o){var s=a(this.pointsTr,n,r,i);t.arrowShapeImpl(this.name)(e,s,i.x,i.y,this.radius*n)},spacing:function(e){return t.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.radius}}),s("triangle-cross",{points:[0,0,.15,-.3,-.15,-.3,0,0],baseCrossLinePts:[-.15,-.4,-.15,-.4,.15,-.4,.15,-.4],crossLinePts:function(e,t){var n=this.baseCrossLinePts.slice(),r=t/e;return n[3]=n[3]-r,n[5]=n[5]-r,n},collide:function(e,t,n,r,o,s,l){var u=i(a(this.points,n+2*l,r,o)),c=i(a(this.crossLinePts(n,s),n+2*l,r,o));return mn(e,t,u)||mn(e,t,c)},draw:function(e,n,r,i,o){var s=a(this.points,n,r,i),l=a(this.crossLinePts(n,o),n,r,i);t.arrowShapeImpl(this.name)(e,s,l)}}),s("vee",{points:[-.15,-.3,0,0,.15,-.3,0,-.15],gap:function(e){return.525*o(e)}}),s("circle",{radius:.15,collide:function(e,t,n,r,a,i,o){var s=a;return Math.pow(s.x-e,2)+Math.pow(s.y-t,2)<=Math.pow((n+2*o)*this.radius,2)},draw:function(e,n,r,a,i){t.arrowShapeImpl(this.name)(e,a.x,a.y,this.radius*n)},spacing:function(e){return t.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.radius}}),s("tee",{points:[-.15,0,-.15,-.1,.15,-.1,.15,0],spacing:function(e){return 1},gap:function(e){return 1}}),s("square",{points:[-.15,0,.15,0,.15,-.3,-.15,-.3]}),s("diamond",{points:[-.15,-.15,0,-.3,.15,-.15,0,0],gap:function(e){return e.pstyle("width").pfValue*e.pstyle("arrow-scale").value}}),s("chevron",{points:[0,0,-.15,-.15,-.1,-.2,0,-.1,.1,-.2,.15,-.15],gap:function(e){return.95*e.pstyle("width").pfValue*e.pstyle("arrow-scale").value}})}},vc={projectIntoViewport:function(e,t){var n=this.cy,r=this.findContainerClientCoords(),a=r[0],i=r[1],o=r[4],s=n.pan(),l=n.zoom();return[((e-a)/o-s.x)/l,((t-i)/o-s.y)/l]},findContainerClientCoords:function(){if(this.containerBB)return this.containerBB;var e=this.container,t=e.getBoundingClientRect(),n=this.cy.window().getComputedStyle(e),r=function(e){return parseFloat(n.getPropertyValue(e))},a=r("padding-left"),i=r("padding-right"),o=r("padding-top"),s=r("padding-bottom"),l=r("border-left-width"),u=r("border-right-width"),c=r("border-top-width"),d=(r("border-bottom-width"),e.clientWidth),h=e.clientHeight,f=a+i,p=o+s,v=l+u,g=t.width/(d+v),y=d-f,m=h-p,b=t.left+a+l,x=t.top+o+c;return this.containerBB=[b,x,y,m,g]},invalidateContainerClientCoordsCache:function(){this.containerBB=null},findNearestElement:function(e,t,n,r){return this.findNearestElements(e,t,n,r)[0]},findNearestElements:function(e,t,n,r){var a,i,o=this,s=this,l=s.getCachedZSortedEles(),u=[],c=s.cy.zoom(),d=s.cy.hasCompoundNodes(),h=(r?24:8)/c,f=(r?8:2)/c,p=(r?8:2)/c,v=1/0;function g(e,t){if(e.isNode()){if(i)return;i=e,u.push(e)}if(e.isEdge()&&(null==t||t<v))if(a){if(a.pstyle("z-compound-depth").value===e.pstyle("z-compound-depth").value&&a.pstyle("z-compound-depth").value===e.pstyle("z-compound-depth").value)for(var n=0;n<u.length;n++)if(u[n].isEdge()){u[n]=e,a=e,v=null!=t?t:v;break}}else u.push(e),a=e,v=null!=t?t:v}function y(n){var r=n.outerWidth()+2*f,a=n.outerHeight()+2*f,i=r/2,l=a/2,u=n.position(),c="auto"===n.pstyle("corner-radius").value?"auto":n.pstyle("corner-radius").pfValue,d=n._private.rscratch;if(u.x-i<=e&&e<=u.x+i&&u.y-l<=t&&t<=u.y+l&&s.nodeShapes[o.getNodeShape(n)].checkPoint(e,t,0,r,a,u.x,u.y,c,d))return g(n,0),!0}function m(n){var r,a=n._private,i=a.rscratch,l=n.pstyle("width").pfValue,c=n.pstyle("arrow-scale").value,f=l/2+h,p=f*f,v=2*f,m=a.source,b=a.target;if("segments"===i.edgeType||"straight"===i.edgeType||"haystack"===i.edgeType){for(var x=i.allpts,w=0;w+3<x.length;w+=2)if(pn(e,t,x[w],x[w+1],x[w+2],x[w+3],v)&&p>(r=yn(e,t,x[w],x[w+1],x[w+2],x[w+3])))return g(n,r),!0}else if("bezier"===i.edgeType||"multibezier"===i.edgeType||"self"===i.edgeType||"compound"===i.edgeType)for(x=i.allpts,w=0;w+5<i.allpts.length;w+=4)if(vn(e,t,x[w],x[w+1],x[w+2],x[w+3],x[w+4],x[w+5],v)&&p>(r=gn(e,t,x[w],x[w+1],x[w+2],x[w+3],x[w+4],x[w+5])))return g(n,r),!0;m=m||a.source,b=b||a.target;var E=o.getArrowWidth(l,c),k=[{name:"source",x:i.arrowStartX,y:i.arrowStartY,angle:i.srcArrowAngle},{name:"target",x:i.arrowEndX,y:i.arrowEndY,angle:i.tgtArrowAngle},{name:"mid-source",x:i.midX,y:i.midY,angle:i.midsrcArrowAngle},{name:"mid-target",x:i.midX,y:i.midY,angle:i.midtgtArrowAngle}];for(w=0;w<k.length;w++){var T=k[w],C=s.arrowShapes[n.pstyle(T.name+"-arrow-shape").value],P=n.pstyle("width").pfValue;if(C.roughCollide(e,t,E,T.angle,{x:T.x,y:T.y},P,h)&&C.collide(e,t,E,T.angle,{x:T.x,y:T.y},P,h))return g(n),!0}d&&u.length>0&&(y(m),y(b))}function b(e,t,n){return ft(e,t,n)}function x(n,r){var a,i=n._private,o=p;a=r?r+"-":"",n.boundingBox();var s=i.labelBounds[r||"main"],l=n.pstyle(a+"label").value;if("yes"===n.pstyle("text-events").strValue&&l){var u=b(i.rscratch,"labelX",r),c=b(i.rscratch,"labelY",r),d=b(i.rscratch,"labelAngle",r),h=n.pstyle(a+"text-margin-x").pfValue,f=n.pstyle(a+"text-margin-y").pfValue,v=s.x1-o-h,y=s.x2+o-h,m=s.y1-o-f,x=s.y2+o-f;if(d){var w=Math.cos(d),E=Math.sin(d),k=function(e,t){return{x:(e-=u)*w-(t-=c)*E+u,y:e*E+t*w+c}},T=k(v,m),C=k(v,x),P=k(y,m),S=k(y,x),B=[T.x+h,T.y+f,P.x+h,P.y+f,S.x+h,S.y+f,C.x+h,C.y+f];if(mn(e,t,B))return g(n),!0}else if(ln(s,e,t))return g(n),!0}}n&&(l=l.interactive);for(var w=l.length-1;w>=0;w--){var E=l[w];E.isNode()?y(E)||x(E):m(E)||x(E)||x(E,"source")||x(E,"target")}return u},getAllInBox:function(e,t,n,r){var a=this.getCachedZSortedEles().interactive,i=2/this.cy.zoom(),o=[],s=Math.min(e,n),l=Math.max(e,n),u=Math.min(t,r),c=Math.max(t,r),d=en({x1:e=s,y1:t=u,x2:n=l,y2:r=c});function h(e,t,n){return ft(e,t,n)}function f(e,t){var n=e._private,r=i;e.boundingBox();var a=n.labelBounds.main;if(!a)return null;var o=h(n.rscratch,"labelX",t),s=h(n.rscratch,"labelY",t),l=h(n.rscratch,"labelAngle",t),u=e.pstyle("text-margin-x").pfValue,c=e.pstyle("text-margin-y").pfValue,d=a.x1-r-u,f=a.x2+r-u,p=a.y1-r-c,v=a.y2+r-c;if(l){var g=Math.cos(l),y=Math.sin(l),m=function(e,t){return{x:(e-=o)*g-(t-=s)*y+o,y:e*y+t*g+s}};return[m(d,p),m(f,p),m(f,v),m(d,v)]}return[{x:d,y:p},{x:f,y:p},{x:f,y:v},{x:d,y:v}]}for(var p=0;p<a.length;p++){var v=a[p];if(v.isNode()){var g=v,y="yes"===g.pstyle("text-events").strValue,m="yes"===g.pstyle("box-select-labels").strValue,b=g.boundingBox({includeNodes:!0,includeEdges:!1,includeLabels:m&&y});if(sn(d,b)){var x=f(g),w=[{x:d.x1,y:d.y1},{x:d.x2,y:d.y1},{x:d.x2,y:d.y2},{x:d.x1,y:d.y2}];x&&!Nn(x,w)||o.push(g)}}else{var E=v,k=E._private,T=k.rscratch;if(null!=T.startX&&null!=T.startY&&!ln(d,T.startX,T.startY))continue;if(null!=T.endX&&null!=T.endY&&!ln(d,T.endX,T.endY))continue;if("bezier"===T.edgeType||"multibezier"===T.edgeType||"self"===T.edgeType||"compound"===T.edgeType||"segments"===T.edgeType||"haystack"===T.edgeType){for(var C=k.rstyle.bezierPts||k.rstyle.linePts||k.rstyle.haystackPts,P=!0,S=0;S<C.length;S++)if(!un(d,C[S])){P=!1;break}P&&o.push(E)}else"haystack"!==T.edgeType&&"straight"!==T.edgeType||o.push(E)}}return o}},gc={calculateArrowAngles:function(e){var t,n,r,a,i,o,s=e._private.rscratch,l="haystack"===s.edgeType,u="bezier"===s.edgeType,c="multibezier"===s.edgeType,d="segments"===s.edgeType,h="compound"===s.edgeType,f="self"===s.edgeType;if(l?(r=s.haystackPts[0],a=s.haystackPts[1],i=s.haystackPts[2],o=s.haystackPts[3]):(r=s.arrowStartX,a=s.arrowStartY,i=s.arrowEndX,o=s.arrowEndY),v=s.midX,g=s.midY,d)t=r-s.segpts[0],n=a-s.segpts[1];else if(c||h||f||u){var p=s.allpts;t=r-$t(p[0],p[2],p[4],.1),n=a-$t(p[1],p[3],p[5],.1)}else t=r-v,n=a-g;s.srcArrowAngle=Wt(t,n);var v=s.midX,g=s.midY;if(l&&(v=(r+i)/2,g=(a+o)/2),t=i-r,n=o-a,d)if((p=s.allpts).length/2%2==0){var y=(C=p.length/2)-2;t=p[C]-p[y],n=p[C+1]-p[y+1]}else if(s.isRound)t=s.midVector[1],n=-s.midVector[0];else{y=(C=p.length/2-1)-2;t=p[C]-p[y],n=p[C+1]-p[y+1]}else if(c||h||f){var m,b,x,w,p=s.allpts;if(s.ctrlpts.length/2%2==0){var E=(k=(T=p.length/2-1)+2)+2;m=$t(p[T],p[k],p[E],0),b=$t(p[T+1],p[k+1],p[E+1],0),x=$t(p[T],p[k],p[E],1e-4),w=$t(p[T+1],p[k+1],p[E+1],1e-4)}else{var k,T;E=(k=p.length/2-1)+2;m=$t(p[T=k-2],p[k],p[E],.4999),b=$t(p[T+1],p[k+1],p[E+1],.4999),x=$t(p[T],p[k],p[E],.5),w=$t(p[T+1],p[k+1],p[E+1],.5)}t=x-m,n=w-b}if(s.midtgtArrowAngle=Wt(t,n),s.midDispX=t,s.midDispY=n,t*=-1,n*=-1,d)if((p=s.allpts).length/2%2==0);else if(!s.isRound){var C,P=(C=p.length/2-1)+2;t=-(p[P]-p[C]),n=-(p[P+1]-p[C+1])}if(s.midsrcArrowAngle=Wt(t,n),d)t=i-s.segpts[s.segpts.length-2],n=o-s.segpts[s.segpts.length-1];else if(c||h||f||u){var S=(p=s.allpts).length;t=i-$t(p[S-6],p[S-4],p[S-2],.9),n=o-$t(p[S-5],p[S-3],p[S-1],.9)}else t=i-v,n=o-g;s.tgtArrowAngle=Wt(t,n)}};gc.getArrowWidth=gc.getArrowHeight=function(e,t){var n=this.arrowWidthCache=this.arrowWidthCache||{},r=n[e+", "+t];return r||(r=Math.max(Math.pow(13.37*e,.9),29)*t,n[e+", "+t]=r,r)};var yc,mc,bc,xc,wc,Ec,kc,Tc,Cc,Pc,Sc,Bc,Dc,_c,Ac,Mc,Rc,Ic={},Nc={},Lc=function(e,t,n){n.x=t.x-e.x,n.y=t.y-e.y,n.len=Math.sqrt(n.x*n.x+n.y*n.y),n.nx=n.x/n.len,n.ny=n.y/n.len,n.ang=Math.atan2(n.ny,n.nx)},zc=function(e,t,n,r,a){var i,o;if(e!==Rc?Lc(t,e,Ic):((o=Ic).x=-1*(i=Nc).x,o.y=-1*i.y,o.nx=-1*i.nx,o.ny=-1*i.ny,o.ang=i.ang>0?-(Math.PI-i.ang):Math.PI+i.ang),Lc(t,n,Nc),bc=Ic.nx*Nc.ny-Ic.ny*Nc.nx,xc=Ic.nx*Nc.nx-Ic.ny*-Nc.ny,kc=Math.asin(Math.max(-1,Math.min(1,bc))),Math.abs(kc)<1e-6)return yc=t.x,mc=t.y,void(Cc=Sc=0);wc=1,Ec=!1,xc<0?kc<0?kc=Math.PI+kc:(kc=Math.PI-kc,wc=-1,Ec=!0):kc>0&&(wc=-1,Ec=!0),Sc=void 0!==t.radius?t.radius:r,Tc=kc/2,Bc=Math.min(Ic.len/2,Nc.len/2),a?(Pc=Math.abs(Math.cos(Tc)*Sc/Math.sin(Tc)))>Bc?(Pc=Bc,Cc=Math.abs(Pc*Math.sin(Tc)/Math.cos(Tc))):Cc=Sc:(Pc=Math.min(Bc,Sc),Cc=Math.abs(Pc*Math.sin(Tc)/Math.cos(Tc))),Ac=t.x+Nc.nx*Pc,Mc=t.y+Nc.ny*Pc,yc=Ac-Nc.ny*Cc*wc,mc=Mc+Nc.nx*Cc*wc,Dc=t.x+Ic.nx*Pc,_c=t.y+Ic.ny*Pc,Rc=t};function Oc(e,t){0===t.radius?e.lineTo(t.cx,t.cy):e.arc(t.cx,t.cy,t.radius,t.startAngle,t.endAngle,t.counterClockwise)}function Vc(e,t,n,r){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];return 0===r||0===t.radius?{cx:t.x,cy:t.y,radius:0,startX:t.x,startY:t.y,stopX:t.x,stopY:t.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(zc(e,t,n,r,a),{cx:yc,cy:mc,radius:Cc,startX:Dc,startY:_c,stopX:Ac,stopY:Mc,startAngle:Ic.ang+Math.PI/2*wc,endAngle:Nc.ang-Math.PI/2*wc,counterClockwise:Ec})}var Fc=.01,jc=Math.sqrt(.02),Xc={};function qc(e){var t=[];if(null!=e){for(var n=0;n<e.length;n+=2){var r=e[n],a=e[n+1];t.push({x:r,y:a})}return t}}Xc.findMidptPtsEtc=function(e,t){var n,r=t.posPts,a=t.intersectionPts,i=t.vectorNormInverse,o=e.pstyle("source-endpoint"),s=e.pstyle("target-endpoint"),u=null!=o.units&&null!=s.units;switch(e.pstyle("edge-distances").value){case"node-position":n=r;break;case"intersection":n=a;break;case"endpoints":if(u){var c=l(this.manualEndptToPx(e.source()[0],o),2),d=c[0],h=c[1],f=l(this.manualEndptToPx(e.target()[0],s),2),p=f[0],v=f[1],g={x1:d,y1:h,x2:p,y2:v};i=function(e,t,n,r){var a=r-t,i=n-e,o=Math.sqrt(i*i+a*a);return{x:-a/o,y:i/o}}(d,h,p,v),n=g}else it("Edge ".concat(e.id()," has edge-distances:endpoints specified without manual endpoints specified via source-endpoint and target-endpoint. Falling back on edge-distances:intersection (default).")),n=a}return{midptPts:n,vectorNormInverse:i}},Xc.findHaystackPoints=function(e){for(var t=0;t<e.length;t++){var n=e[t],r=n._private,a=r.rscratch;if(!a.haystack){var i=2*Math.random()*Math.PI;a.source={x:Math.cos(i),y:Math.sin(i)},i=2*Math.random()*Math.PI,a.target={x:Math.cos(i),y:Math.sin(i)}}var o=r.source,s=r.target,l=o.position(),u=s.position(),c=o.width(),d=s.width(),h=o.height(),f=s.height(),p=n.pstyle("haystack-radius").value/2;a.haystackPts=a.allpts=[a.source.x*c*p+l.x,a.source.y*h*p+l.y,a.target.x*d*p+u.x,a.target.y*f*p+u.y],a.midX=(a.allpts[0]+a.allpts[2])/2,a.midY=(a.allpts[1]+a.allpts[3])/2,a.edgeType="haystack",a.haystack=!0,this.storeEdgeProjections(n),this.calculateArrowAngles(n),this.recalculateEdgeLabelProjections(n),this.calculateLabelAngles(n)}},Xc.findSegmentsPoints=function(e,t){var n=e._private.rscratch,r=e.pstyle("segment-weights"),a=e.pstyle("segment-distances"),i=e.pstyle("segment-radii"),o=e.pstyle("radius-type"),s=Math.min(r.pfValue.length,a.pfValue.length),l=i.pfValue[i.pfValue.length-1],u=o.pfValue[o.pfValue.length-1];n.edgeType="segments",n.segpts=[],n.radii=[],n.isArcRadius=[];for(var c=0;c<s;c++){var d=r.pfValue[c],h=a.pfValue[c],f=1-d,p=d,v=this.findMidptPtsEtc(e,t),g=v.midptPts,y=v.vectorNormInverse,m={x:g.x1*f+g.x2*p,y:g.y1*f+g.y2*p};n.segpts.push(m.x+y.x*h,m.y+y.y*h),n.radii.push(void 0!==i.pfValue[c]?i.pfValue[c]:l),n.isArcRadius.push("arc-radius"===(void 0!==o.pfValue[c]?o.pfValue[c]:u))}},Xc.findLoopPoints=function(e,t,n,r){var a=e._private.rscratch,i=t.dirCounts,o=t.srcPos,s=e.pstyle("control-point-distances"),l=s?s.pfValue[0]:void 0,u=e.pstyle("loop-direction").pfValue,c=e.pstyle("loop-sweep").pfValue,d=e.pstyle("control-point-step-size").pfValue;a.edgeType="self";var h=n,f=d;r&&(h=0,f=l);var p=u-Math.PI/2,v=p-c/2,g=p+c/2,y=String(u+"_"+c);h=void 0===i[y]?i[y]=0:++i[y],a.ctrlpts=[o.x+1.4*Math.cos(v)*f*(h/3+1),o.y+1.4*Math.sin(v)*f*(h/3+1),o.x+1.4*Math.cos(g)*f*(h/3+1),o.y+1.4*Math.sin(g)*f*(h/3+1)]},Xc.findCompoundLoopPoints=function(e,t,n,r){var a=e._private.rscratch;a.edgeType="compound";var i=t.srcPos,o=t.tgtPos,s=t.srcW,l=t.srcH,u=t.tgtW,c=t.tgtH,d=e.pstyle("control-point-step-size").pfValue,h=e.pstyle("control-point-distances"),f=h?h.pfValue[0]:void 0,p=n,v=d;r&&(p=0,v=f);var g={x:i.x-s/2,y:i.y-l/2},y={x:o.x-u/2,y:o.y-c/2},m={x:Math.min(g.x,y.x),y:Math.min(g.y,y.y)},b=Math.max(.5,Math.log(s*Fc)),x=Math.max(.5,Math.log(u*Fc));a.ctrlpts=[m.x,m.y-(1+Math.pow(50,1.12)/100)*v*(p/3+1)*b,m.x-(1+Math.pow(50,1.12)/100)*v*(p/3+1)*x,m.y]},Xc.findStraightEdgePoints=function(e){e._private.rscratch.edgeType="straight"},Xc.findBezierPoints=function(e,t,n,r,a){var i=e._private.rscratch,o=e.pstyle("control-point-step-size").pfValue,s=e.pstyle("control-point-distances"),l=e.pstyle("control-point-weights"),u=s&&l?Math.min(s.value.length,l.value.length):1,c=s?s.pfValue[0]:void 0,d=l.value[0],h=r;i.edgeType=h?"multibezier":"bezier",i.ctrlpts=[];for(var f=0;f<u;f++){var p=(.5-t.eles.length/2+n)*o*(a?-1:1),v=void 0,g=Ht(p);h&&(c=s?s.pfValue[f]:o,d=l.value[f]);var y=void 0!==(v=r?c:void 0!==c?g*c:void 0)?v:p,m=1-d,b=d,x=this.findMidptPtsEtc(e,t),w=x.midptPts,E=x.vectorNormInverse,k={x:w.x1*m+w.x2*b,y:w.y1*m+w.y2*b};i.ctrlpts.push(k.x+E.x*y,k.y+E.y*y)}},Xc.findTaxiPoints=function(e,t){var n=e._private.rscratch;n.edgeType="segments";var r="vertical",a="horizontal",i="leftward",o="rightward",s="downward",l="upward",u=t.posPts,c=t.srcW,d=t.srcH,h=t.tgtW,f=t.tgtH,p="node-position"!==e.pstyle("edge-distances").value,v=e.pstyle("taxi-direction").value,g=v,y=e.pstyle("taxi-turn"),m="%"===y.units,b=y.pfValue,x=b<0,w=e.pstyle("taxi-turn-min-distance").pfValue,E=p?(c+h)/2:0,k=p?(d+f)/2:0,T=u.x2-u.x1,C=u.y2-u.y1,P=function(e,t){return e>0?Math.max(e-t,0):Math.min(e+t,0)},S=P(T,E),B=P(C,k),D=!1;"auto"===g?v=Math.abs(S)>Math.abs(B)?a:r:g===l||g===s?(v=r,D=!0):g!==i&&g!==o||(v=a,D=!0);var _,A=v===r,M=A?B:S,R=A?C:T,I=Ht(R),N=!1;(D&&(m||x)||!(g===s&&R<0||g===l&&R>0||g===i&&R>0||g===o&&R<0)||(M=(I*=-1)*Math.abs(M),N=!0),m)?_=(b<0?1+b:b)*M:_=(b<0?M:0)+b*I;var L=function(e){return Math.abs(e)<w||Math.abs(e)>=Math.abs(M)},z=L(_),O=L(Math.abs(M)-Math.abs(_));if((z||O)&&!N)if(A){var V=Math.abs(R)<=d/2,F=Math.abs(T)<=h/2;if(V){var j=(u.x1+u.x2)/2,X=u.y1,q=u.y2;n.segpts=[j,X,j,q]}else if(F){var Y=(u.y1+u.y2)/2,W=u.x1,U=u.x2;n.segpts=[W,Y,U,Y]}else n.segpts=[u.x1,u.y2]}else{var H=Math.abs(R)<=c/2,K=Math.abs(C)<=f/2;if(H){var G=(u.y1+u.y2)/2,Z=u.x1,$=u.x2;n.segpts=[Z,G,$,G]}else if(K){var Q=(u.x1+u.x2)/2,J=u.y1,ee=u.y2;n.segpts=[Q,J,Q,ee]}else n.segpts=[u.x2,u.y1]}else if(A){var te=u.y1+_+(p?d/2*I:0),ne=u.x1,re=u.x2;n.segpts=[ne,te,re,te]}else{var ae=u.x1+_+(p?c/2*I:0),ie=u.y1,oe=u.y2;n.segpts=[ae,ie,ae,oe]}if(n.isRound){var se=e.pstyle("taxi-radius").value,le="arc-radius"===e.pstyle("radius-type").value[0];n.radii=new Array(n.segpts.length/2).fill(se),n.isArcRadius=new Array(n.segpts.length/2).fill(le)}},Xc.tryToCorrectInvalidPoints=function(e,t){var n=e._private.rscratch;if("bezier"===n.edgeType){var r=t.srcPos,a=t.tgtPos,i=t.srcW,o=t.srcH,s=t.tgtW,l=t.tgtH,u=t.srcShape,c=t.tgtShape,d=t.srcCornerRadius,h=t.tgtCornerRadius,f=t.srcRs,p=t.tgtRs,v=!Q(n.startX)||!Q(n.startY),g=!Q(n.arrowStartX)||!Q(n.arrowStartY),y=!Q(n.endX)||!Q(n.endY),m=!Q(n.arrowEndX)||!Q(n.arrowEndY),b=3*(this.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.arrowShapeWidth),x=Kt({x:n.ctrlpts[0],y:n.ctrlpts[1]},{x:n.startX,y:n.startY}),w=x<b,E=Kt({x:n.ctrlpts[0],y:n.ctrlpts[1]},{x:n.endX,y:n.endY}),k=E<b,T=!1;if(v||g||w){T=!0;var C={x:n.ctrlpts[0]-r.x,y:n.ctrlpts[1]-r.y},P=Math.sqrt(C.x*C.x+C.y*C.y),S={x:C.x/P,y:C.y/P},B=Math.max(i,o),D={x:n.ctrlpts[0]+2*S.x*B,y:n.ctrlpts[1]+2*S.y*B},_=u.intersectLine(r.x,r.y,i,o,D.x,D.y,0,d,f);w?(n.ctrlpts[0]=n.ctrlpts[0]+S.x*(b-x),n.ctrlpts[1]=n.ctrlpts[1]+S.y*(b-x)):(n.ctrlpts[0]=_[0]+S.x*b,n.ctrlpts[1]=_[1]+S.y*b)}if(y||m||k){T=!0;var A={x:n.ctrlpts[0]-a.x,y:n.ctrlpts[1]-a.y},M=Math.sqrt(A.x*A.x+A.y*A.y),R={x:A.x/M,y:A.y/M},I=Math.max(i,o),N={x:n.ctrlpts[0]+2*R.x*I,y:n.ctrlpts[1]+2*R.y*I},L=c.intersectLine(a.x,a.y,s,l,N.x,N.y,0,h,p);k?(n.ctrlpts[0]=n.ctrlpts[0]+R.x*(b-E),n.ctrlpts[1]=n.ctrlpts[1]+R.y*(b-E)):(n.ctrlpts[0]=L[0]+R.x*b,n.ctrlpts[1]=L[1]+R.y*b)}T&&this.findEndpoints(e)}},Xc.storeAllpts=function(e){var t=e._private.rscratch;if("multibezier"===t.edgeType||"bezier"===t.edgeType||"self"===t.edgeType||"compound"===t.edgeType){t.allpts=[],t.allpts.push(t.startX,t.startY);for(var n=0;n+1<t.ctrlpts.length;n+=2)t.allpts.push(t.ctrlpts[n],t.ctrlpts[n+1]),n+3<t.ctrlpts.length&&t.allpts.push((t.ctrlpts[n]+t.ctrlpts[n+2])/2,(t.ctrlpts[n+1]+t.ctrlpts[n+3])/2);var r;t.allpts.push(t.endX,t.endY),t.ctrlpts.length/2%2==0?(r=t.allpts.length/2-1,t.midX=t.allpts[r],t.midY=t.allpts[r+1]):(r=t.allpts.length/2-3,t.midX=$t(t.allpts[r],t.allpts[r+2],t.allpts[r+4],.5),t.midY=$t(t.allpts[r+1],t.allpts[r+3],t.allpts[r+5],.5))}else if("straight"===t.edgeType)t.allpts=[t.startX,t.startY,t.endX,t.endY],t.midX=(t.startX+t.endX+t.arrowStartX+t.arrowEndX)/4,t.midY=(t.startY+t.endY+t.arrowStartY+t.arrowEndY)/4;else if("segments"===t.edgeType){if(t.allpts=[],t.allpts.push(t.startX,t.startY),t.allpts.push.apply(t.allpts,t.segpts),t.allpts.push(t.endX,t.endY),t.isRound){t.roundCorners=[];for(var a=2;a+3<t.allpts.length;a+=2){var i=t.radii[a/2-1],o=t.isArcRadius[a/2-1];t.roundCorners.push(Vc({x:t.allpts[a-2],y:t.allpts[a-1]},{x:t.allpts[a],y:t.allpts[a+1],radius:i},{x:t.allpts[a+2],y:t.allpts[a+3]},i,o))}}if(t.segpts.length%4==0){var s=t.segpts.length/2,l=s-2;t.midX=(t.segpts[l]+t.segpts[s])/2,t.midY=(t.segpts[l+1]+t.segpts[s+1])/2}else{var u=t.segpts.length/2-1;if(t.isRound){var c={x:t.segpts[u],y:t.segpts[u+1]},d=t.roundCorners[u/2];if(0===d.radius){var h={x:t.segpts[u+2],y:t.segpts[u+3]};t.midX=c.x,t.midY=c.y,t.midVector=[c.y-h.y,h.x-c.x]}else{var f=[c.x-d.cx,c.y-d.cy],p=d.radius/Math.sqrt(Math.pow(f[0],2)+Math.pow(f[1],2));f=f.map(function(e){return e*p}),t.midX=d.cx+f[0],t.midY=d.cy+f[1],t.midVector=f}}else t.midX=t.segpts[u],t.midY=t.segpts[u+1]}}},Xc.checkForInvalidEdgeWarning=function(e){var t=e[0]._private.rscratch;t.nodesOverlap||Q(t.startX)&&Q(t.startY)&&Q(t.endX)&&Q(t.endY)?t.loggedErr=!1:t.loggedErr||(t.loggedErr=!0,it("Edge `"+e.id()+"` has invalid endpoints and so it is impossible to draw. Adjust your edge style (e.g. control points) accordingly or use an alternative edge type. This is expected behaviour when the source node and the target node overlap."))},Xc.findEdgeControlPoints=function(e){var t=this;if(e&&0!==e.length){for(var n=this,r=n.cy.hasCompoundNodes(),a=new vt,i=function(e,t){return[].concat(u(e),[t?1:0]).join("-")},o=[],s=[],l=0;l<e.length;l++){var c=e[l],d=c._private,h=c.pstyle("curve-style").value;if(!c.removed()&&c.takesUpSpace())if("haystack"!==h){var f="unbundled-bezier"===h||he(h,"segments")||"straight"===h||"straight-triangle"===h||he(h,"taxi"),p="unbundled-bezier"===h||"bezier"===h,v=d.source,g=d.target,y=[v.poolIndex(),g.poolIndex()].sort(),m=i(y,f),b=a.get(m);null==b&&(b={eles:[]},o.push({pairId:y,edgeIsUnbundled:f}),a.set(m,b)),b.eles.push(c),f&&(b.hasUnbundled=!0),p&&(b.hasBezier=!0)}else s.push(c)}for(var x=function(){var e,s=o[w],l=s.pairId,u=s.edgeIsUnbundled,c=i(l,u),d=a.get(c);if(!d.hasUnbundled){var h=d.eles[0].parallelEdges().filter(function(e){return e.isBundledBezier()});ht(d.eles),h.forEach(function(e){return d.eles.push(e)}),d.eles.sort(function(e,t){return e.poolIndex()-t.poolIndex()})}var f=d.eles[0],p=f.source(),v=f.target();if(p.poolIndex()>v.poolIndex()){var g=p;p=v,v=g}var y=d.srcPos=p.position(),m=d.tgtPos=v.position(),b=d.srcW=p.outerWidth(),x=d.srcH=p.outerHeight(),E=d.tgtW=v.outerWidth(),k=d.tgtH=v.outerHeight(),T=d.srcShape=n.nodeShapes[t.getNodeShape(p)],C=d.tgtShape=n.nodeShapes[t.getNodeShape(v)],P=d.srcCornerRadius="auto"===p.pstyle("corner-radius").value?"auto":p.pstyle("corner-radius").pfValue,S=d.tgtCornerRadius="auto"===v.pstyle("corner-radius").value?"auto":v.pstyle("corner-radius").pfValue,B=d.tgtRs=v._private.rscratch,D=d.srcRs=p._private.rscratch;d.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var _=0;_<d.eles.length;_++){var A=d.eles[_],M=A[0]._private.rscratch,R=A.pstyle("curve-style").value,I="unbundled-bezier"===R||he(R,"segments")||he(R,"taxi"),N=!p.same(A.source());if(!d.calculatedIntersection&&p!==v&&(d.hasBezier||d.hasUnbundled)){d.calculatedIntersection=!0;var L=T.intersectLine(y.x,y.y,b,x,m.x,m.y,0,P,D),z=d.srcIntn=L,O=C.intersectLine(m.x,m.y,E,k,y.x,y.y,0,S,B),V=d.tgtIntn=O,F=d.intersectionPts={x1:L[0],x2:O[0],y1:L[1],y2:O[1]},j=d.posPts={x1:y.x,x2:m.x,y1:y.y,y2:m.y},X=O[1]-L[1],q=O[0]-L[0],Y=Math.sqrt(q*q+X*X);Q(Y)&&Y>=jc||(Y=Math.sqrt(Math.max(q*q,Fc)+Math.max(X*X,Fc)));var W=d.vector={x:q,y:X},U=d.vectorNorm={x:W.x/Y,y:W.y/Y},H={x:-U.y,y:U.x};d.nodesOverlap=!Q(Y)||C.checkPoint(L[0],L[1],0,E,k,m.x,m.y,S,B)||T.checkPoint(O[0],O[1],0,b,x,y.x,y.y,P,D),d.vectorNormInverse=H,e={nodesOverlap:d.nodesOverlap,dirCounts:d.dirCounts,calculatedIntersection:!0,hasBezier:d.hasBezier,hasUnbundled:d.hasUnbundled,eles:d.eles,srcPos:m,srcRs:B,tgtPos:y,tgtRs:D,srcW:E,srcH:k,tgtW:b,tgtH:x,srcIntn:V,tgtIntn:z,srcShape:C,tgtShape:T,posPts:{x1:j.x2,y1:j.y2,x2:j.x1,y2:j.y1},intersectionPts:{x1:F.x2,y1:F.y2,x2:F.x1,y2:F.y1},vector:{x:-W.x,y:-W.y},vectorNorm:{x:-U.x,y:-U.y},vectorNormInverse:{x:-H.x,y:-H.y}}}var K=N?e:d;M.nodesOverlap=K.nodesOverlap,M.srcIntn=K.srcIntn,M.tgtIntn=K.tgtIntn,M.isRound=R.startsWith("round"),r&&(p.isParent()||p.isChild()||v.isParent()||v.isChild())&&(p.parents().anySame(v)||v.parents().anySame(p)||p.same(v)&&p.isParent())?t.findCompoundLoopPoints(A,K,_,I):p===v?t.findLoopPoints(A,K,_,I):R.endsWith("segments")?t.findSegmentsPoints(A,K):R.endsWith("taxi")?t.findTaxiPoints(A,K):"straight"===R||!I&&d.eles.length%2==1&&_===Math.floor(d.eles.length/2)?t.findStraightEdgePoints(A):t.findBezierPoints(A,K,_,I,N),t.findEndpoints(A),t.tryToCorrectInvalidPoints(A,K),t.checkForInvalidEdgeWarning(A),t.storeAllpts(A),t.storeEdgeProjections(A),t.calculateArrowAngles(A),t.recalculateEdgeLabelProjections(A),t.calculateLabelAngles(A)}},w=0;w<o.length;w++)x();this.findHaystackPoints(s)}},Xc.getSegmentPoints=function(e){var t=e[0]._private.rscratch;if(this.recalculateRenderedStyle(e),"segments"===t.edgeType)return qc(t.segpts)},Xc.getControlPoints=function(e){var t=e[0]._private.rscratch;this.recalculateRenderedStyle(e);var n=t.edgeType;if("bezier"===n||"multibezier"===n||"self"===n||"compound"===n)return qc(t.ctrlpts)},Xc.getEdgeMidpoint=function(e){var t=e[0]._private.rscratch;return this.recalculateRenderedStyle(e),{x:t.midX,y:t.midY}};var Yc={manualEndptToPx:function(e,t){var n=e.position(),r=e.outerWidth(),a=e.outerHeight(),i=e._private.rscratch;if(2===t.value.length){var o=[t.pfValue[0],t.pfValue[1]];return"%"===t.units[0]&&(o[0]=o[0]*r),"%"===t.units[1]&&(o[1]=o[1]*a),o[0]+=n.x,o[1]+=n.y,o}var s=t.pfValue[0];s=-Math.PI/2+s;var l=2*Math.max(r,a),u=[n.x+Math.cos(s)*l,n.y+Math.sin(s)*l];return this.nodeShapes[this.getNodeShape(e)].intersectLine(n.x,n.y,r,a,u[0],u[1],0,"auto"===e.pstyle("corner-radius").value?"auto":e.pstyle("corner-radius").pfValue,i)},findEndpoints:function(e){var t,n,r,a,i,o,s,l,u,c=this,d=e.source()[0],h=e.target()[0],f=d.position(),p=h.position(),v=e.pstyle("target-arrow-shape").value,g=e.pstyle("source-arrow-shape").value,y=e.pstyle("target-distance-from-node").pfValue,m=e.pstyle("source-distance-from-node").pfValue,b=d._private.rscratch,x=h._private.rscratch,w=e.pstyle("curve-style").value,E=e._private.rscratch,k=E.edgeType,T=he(w,"taxi"),C="self"===k||"compound"===k,P="bezier"===k||"multibezier"===k||C,S="bezier"!==k,B="straight"===k||"segments"===k,D="segments"===k,_=P||S||B,A=C||T,M=e.pstyle("source-endpoint"),R=A?"outside-to-node":M.value,I="auto"===d.pstyle("corner-radius").value?"auto":d.pstyle("corner-radius").pfValue,N=e.pstyle("target-endpoint"),L=A?"outside-to-node":N.value,z="auto"===h.pstyle("corner-radius").value?"auto":h.pstyle("corner-radius").pfValue;E.srcManEndpt=M,E.tgtManEndpt=N;var O=null!==(t=2===(null==N||null===(n=N.pfValue)||void 0===n?void 0:n.length)?N.pfValue:null)&&void 0!==t?t:[0,0],V=null!==(r=2===(null==M||null===(a=M.pfValue)||void 0===a?void 0:a.length)?M.pfValue:null)&&void 0!==r?r:[0,0];if(P){var F=[E.ctrlpts[0],E.ctrlpts[1]];o=S?[E.ctrlpts[E.ctrlpts.length-2],E.ctrlpts[E.ctrlpts.length-1]]:F,s=F}else if(B){var j=D?E.segpts.slice(0,2):[p.x+O[0],p.y+O[1]];o=D?E.segpts.slice(E.segpts.length-2):[f.x+V[0],f.y+V[1]],s=j}if("inside-to-node"===L)i=[p.x,p.y];else if(N.units)i=this.manualEndptToPx(h,N);else if("outside-to-line"===L)i=E.tgtIntn;else if("outside-to-node"===L||"outside-to-node-or-label"===L?l=o:"outside-to-line"!==L&&"outside-to-line-or-label"!==L||(l=[f.x,f.y]),i=c.nodeShapes[this.getNodeShape(h)].intersectLine(p.x,p.y,h.outerWidth(),h.outerHeight(),l[0],l[1],0,z,x),"outside-to-node-or-label"===L||"outside-to-line-or-label"===L){var X=h._private.rscratch,q=X.labelWidth,Y=X.labelHeight,W=X.labelX,U=X.labelY,H=q/2,K=Y/2,G=h.pstyle("text-valign").value;"top"===G?U-=K:"bottom"===G&&(U+=K);var Z=h.pstyle("text-halign").value;"left"===Z?W-=H:"right"===Z&&(W+=H);var $=Sn(l[0],l[1],[W-H,U-K,W+H,U-K,W+H,U+K,W-H,U+K],p.x,p.y);if($.length>0){var J=f,ee=Gt(J,Yt(i)),te=Gt(J,Yt($)),ne=ee;if(te<ee&&(i=$,ne=te),$.length>2)Gt(J,{x:$[2],y:$[3]})<ne&&(i=[$[2],$[3]])}}var re=Bn(i,o,c.arrowShapes[v].spacing(e)+y),ae=Bn(i,o,c.arrowShapes[v].gap(e)+y);if(E.endX=ae[0],E.endY=ae[1],E.arrowEndX=re[0],E.arrowEndY=re[1],"inside-to-node"===R)i=[f.x,f.y];else if(M.units)i=this.manualEndptToPx(d,M);else if("outside-to-line"===R)i=E.srcIntn;else if("outside-to-node"===R||"outside-to-node-or-label"===R?u=s:"outside-to-line"!==R&&"outside-to-line-or-label"!==R||(u=[p.x,p.y]),i=c.nodeShapes[this.getNodeShape(d)].intersectLine(f.x,f.y,d.outerWidth(),d.outerHeight(),u[0],u[1],0,I,b),"outside-to-node-or-label"===R||"outside-to-line-or-label"===R){var ie=d._private.rscratch,oe=ie.labelWidth,se=ie.labelHeight,le=ie.labelX,ue=ie.labelY,ce=oe/2,de=se/2,fe=d.pstyle("text-valign").value;"top"===fe?ue-=de:"bottom"===fe&&(ue+=de);var pe=d.pstyle("text-halign").value;"left"===pe?le-=ce:"right"===pe&&(le+=ce);var ve=Sn(u[0],u[1],[le-ce,ue-de,le+ce,ue-de,le+ce,ue+de,le-ce,ue+de],f.x,f.y);if(ve.length>0){var ge=p,ye=Gt(ge,Yt(i)),me=Gt(ge,Yt(ve)),be=ye;if(me<ye&&(i=[ve[0],ve[1]],be=me),ve.length>2)Gt(ge,{x:ve[2],y:ve[3]})<be&&(i=[ve[2],ve[3]])}}var xe=Bn(i,s,c.arrowShapes[g].spacing(e)+m),we=Bn(i,s,c.arrowShapes[g].gap(e)+m);E.startX=we[0],E.startY=we[1],E.arrowStartX=xe[0],E.arrowStartY=xe[1],_&&(Q(E.startX)&&Q(E.startY)&&Q(E.endX)&&Q(E.endY)?E.badLine=!1:E.badLine=!0)},getSourceEndpoint:function(e){var t=e[0]._private.rscratch;return this.recalculateRenderedStyle(e),"haystack"===t.edgeType?{x:t.haystackPts[0],y:t.haystackPts[1]}:{x:t.arrowStartX,y:t.arrowStartY}},getTargetEndpoint:function(e){var t=e[0]._private.rscratch;return this.recalculateRenderedStyle(e),"haystack"===t.edgeType?{x:t.haystackPts[2],y:t.haystackPts[3]}:{x:t.arrowEndX,y:t.arrowEndY}}},Wc={};function Uc(e,t,n){for(var r=function(e,t,n,r){return $t(e,t,n,r)},a=t._private.rstyle.bezierPts,i=0;i<e.bezierProjPcts.length;i++){var o=e.bezierProjPcts[i];a.push({x:r(n[0],n[2],n[4],o),y:r(n[1],n[3],n[5],o)})}}Wc.storeEdgeProjections=function(e){var t=e._private,n=t.rscratch,r=n.edgeType;if(t.rstyle.bezierPts=null,t.rstyle.linePts=null,t.rstyle.haystackPts=null,"multibezier"===r||"bezier"===r||"self"===r||"compound"===r){t.rstyle.bezierPts=[];for(var a=0;a+5<n.allpts.length;a+=4)Uc(this,e,n.allpts.slice(a,a+6))}else if("segments"===r){var i=t.rstyle.linePts=[];for(a=0;a+1<n.allpts.length;a+=2)i.push({x:n.allpts[a],y:n.allpts[a+1]})}else if("haystack"===r){var o=n.haystackPts;t.rstyle.haystackPts=[{x:o[0],y:o[1]},{x:o[2],y:o[3]}]}t.rstyle.arrowWidth=this.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.arrowShapeWidth},Wc.recalculateEdgeProjections=function(e){this.findEdgeControlPoints(e)};var Hc={recalculateNodeLabelProjection:function(e){var t=e.pstyle("label").strValue;if(!ie(t)){var n,r,a=e._private,i=e.width(),o=e.height(),s=e.padding(),l=e.position(),u=e.pstyle("text-halign").strValue,c=e.pstyle("text-valign").strValue,d=a.rscratch,h=a.rstyle;switch(u){case"left":n=l.x-i/2-s;break;case"right":n=l.x+i/2+s;break;default:n=l.x}switch(c){case"top":r=l.y-o/2-s;break;case"bottom":r=l.y+o/2+s;break;default:r=l.y}d.labelX=n,d.labelY=r,h.labelX=n,h.labelY=r,this.calculateLabelAngles(e),this.applyLabelDimensions(e)}}},Kc=function(e,t){var n=Math.atan(t/e);return 0===e&&n<0&&(n*=-1),n},Gc=function(e,t){var n=t.x-e.x,r=t.y-e.y;return Kc(n,r)};Hc.recalculateEdgeLabelProjections=function(e){var t,n=e._private,r=n.rscratch,a=this,i={mid:e.pstyle("label").strValue,source:e.pstyle("source-label").strValue,target:e.pstyle("target-label").strValue};if(i.mid||i.source||i.target){t={x:r.midX,y:r.midY};var o=function(e,t,r){pt(n.rscratch,e,t,r),pt(n.rstyle,e,t,r)};o("labelX",null,t.x),o("labelY",null,t.y);var s=Kc(r.midDispX,r.midDispY);o("labelAutoAngle",null,s);var l=function(){if(l.cache)return l.cache;for(var e=[],t=0;t+5<r.allpts.length;t+=4){var i={x:r.allpts[t],y:r.allpts[t+1]},o={x:r.allpts[t+2],y:r.allpts[t+3]},s={x:r.allpts[t+4],y:r.allpts[t+5]};e.push({p0:i,p1:o,p2:s,startDist:0,length:0,segments:[]})}var u=n.rstyle.bezierPts,c=a.bezierProjPcts.length;function d(e,t,n,r,a){var i=Kt(t,n),o=e.segments[e.segments.length-1],s={p0:t,p1:n,t0:r,t1:a,startDist:o?o.startDist+o.length:0,length:i};e.segments.push(s),e.length+=i}for(var h=0;h<e.length;h++){var f=e[h],p=e[h-1];p&&(f.startDist=p.startDist+p.length),d(f,f.p0,u[h*c],0,a.bezierProjPcts[0]);for(var v=0;v<c-1;v++)d(f,u[h*c+v],u[h*c+v+1],a.bezierProjPcts[v],a.bezierProjPcts[v+1]);d(f,u[h*c+c-1],f.p2,a.bezierProjPcts[c-1],1)}return l.cache=e},u=function(n){var a,s="source"===n;if(i[n]){var u=e.pstyle(n+"-text-offset").pfValue;switch(r.edgeType){case"self":case"compound":case"bezier":case"multibezier":for(var c,d=l(),h=0,f=0,p=0;p<d.length;p++){for(var v=d[s?p:d.length-1-p],g=0;g<v.segments.length;g++){var y=v.segments[s?g:v.segments.length-1-g],m=p===d.length-1&&g===v.segments.length-1;if(h=f,(f+=y.length)>=u||m){c={cp:v,segment:y};break}}if(c)break}var b=c.cp,x=c.segment,w=(u-h)/x.length,E=x.t1-x.t0,k=s?x.t0+E*w:x.t1-E*w;k=Jt(0,k,1),t=Qt(b.p0,b.p1,b.p2,k),a=function(e,t,n,r){var a=Jt(0,r-.001,1),i=Jt(0,r+.001,1),o=Qt(e,t,n,a),s=Qt(e,t,n,i);return Gc(o,s)}(b.p0,b.p1,b.p2,k);break;case"straight":case"segments":case"haystack":for(var T,C,P,S,B=0,D=r.allpts.length,_=0;_+3<D&&(s?(P={x:r.allpts[_],y:r.allpts[_+1]},S={x:r.allpts[_+2],y:r.allpts[_+3]}):(P={x:r.allpts[D-2-_],y:r.allpts[D-1-_]},S={x:r.allpts[D-4-_],y:r.allpts[D-3-_]}),C=B,!((B+=T=Kt(P,S))>=u));_+=2);var A=(u-C)/T;A=Jt(0,A,1),t=function(e,t,n,r){var a=t.x-e.x,i=t.y-e.y,o=Kt(e,t),s=a/o,l=i/o;return n=null==n?0:n,r=null!=r?r:n*o,{x:e.x+s*r,y:e.y+l*r}}(P,S,A),a=Gc(P,S)}o("labelX",n,t.x),o("labelY",n,t.y),o("labelAutoAngle",n,a)}};u("source"),u("target"),this.applyLabelDimensions(e)}},Hc.applyLabelDimensions=function(e){this.applyPrefixedLabelDimensions(e),e.isEdge()&&(this.applyPrefixedLabelDimensions(e,"source"),this.applyPrefixedLabelDimensions(e,"target"))},Hc.applyPrefixedLabelDimensions=function(e,t){var n=e._private,r=this.getLabelText(e,t),a=Ue(r,e._private.labelDimsKey);if(ft(n.rscratch,"prefixedLabelDimsKey",t)!==a){pt(n.rscratch,"prefixedLabelDimsKey",t,a);var i=this.calculateLabelDimensions(e,r),o=e.pstyle("line-height").pfValue,s=e.pstyle("text-wrap").strValue,l=ft(n.rscratch,"labelWrapCachedLines",t)||[],u="wrap"!==s?1:Math.max(l.length,1),c=i.height/u,d=c*o,h=i.width,f=i.height+(u-1)*(o-1)*c;pt(n.rstyle,"labelWidth",t,h),pt(n.rscratch,"labelWidth",t,h),pt(n.rstyle,"labelHeight",t,f),pt(n.rscratch,"labelHeight",t,f),pt(n.rscratch,"labelLineHeight",t,d)}},Hc.getLabelText=function(e,t){var n=e._private,r=t?t+"-":"",a=e.pstyle(r+"label").strValue,i=e.pstyle("text-transform").value,s=function(e,r){return r?(pt(n.rscratch,e,t,r),r):ft(n.rscratch,e,t)};if(!a)return"";"none"==i||("uppercase"==i?a=a.toUpperCase():"lowercase"==i&&(a=a.toLowerCase()));var l=e.pstyle("text-wrap").value;if("wrap"===l){var u=s("labelKey");if(null!=u&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var c=a.split("\n"),d=e.pstyle("text-max-width").pfValue,h="anywhere"===e.pstyle("text-overflow-wrap").value,f=[],p=/[\s\u200b]+|$/g,v=0;v<c.length;v++){var g=c[v],y=this.calculateLabelDimensions(e,g).width;if(h){var m=g.split("").join("\u200b");g=m}if(y>d){var b,x="",w=0,E=o(g.matchAll(p));try{for(E.s();!(b=E.n()).done;){var k=b.value,T=k[0],C=g.substring(w,k.index);w=k.index+T.length;var P=0===x.length?C:x+C+T;this.calculateLabelDimensions(e,P).width<=d?x+=C+T:(x&&f.push(x),x=C+T)}}catch(A){E.e(A)}finally{E.f()}x.match(/^[\s\u200b]+$/)||f.push(x)}else f.push(g)}s("labelWrapCachedLines",f),a=s("labelWrapCachedText",f.join("\n")),s("labelWrapKey",u)}else if("ellipsis"===l){var S=e.pstyle("text-max-width").pfValue,B="",D=!1;if(this.calculateLabelDimensions(e,a).width<S)return a;for(var _=0;_<a.length;_++){if(this.calculateLabelDimensions(e,B+a[_]+"\u2026").width>S)break;B+=a[_],_===a.length-1&&(D=!0)}return D||(B+="\u2026"),B}return a},Hc.getLabelJustification=function(e){var t=e.pstyle("text-justification").strValue,n=e.pstyle("text-halign").strValue;if("auto"!==t)return t;if(!e.isNode())return"center";switch(n){case"left":return"right";case"right":return"left";default:return"center"}},Hc.calculateLabelDimensions=function(e,t){var n=this.cy.window().document,r=e.pstyle("font-style").strValue,a=e.pstyle("font-size").pfValue,i=e.pstyle("font-family").strValue,o=e.pstyle("font-weight").strValue,s=this.labelCalcCanvas,l=this.labelCalcCanvasContext;if(!s){s=this.labelCalcCanvas=n.createElement("canvas"),l=this.labelCalcCanvasContext=s.getContext("2d");var u=s.style;u.position="absolute",u.left="-9999px",u.top="-9999px",u.zIndex="-1",u.visibility="hidden",u.pointerEvents="none"}l.font="".concat(r," ").concat(o," ").concat(a,"px ").concat(i);for(var c=0,d=0,h=t.split("\n"),f=0;f<h.length;f++){var p=h[f],v=l.measureText(p),g=Math.ceil(v.width),y=a;c=Math.max(g,c),d+=y}return{width:c+=0,height:d+=0}},Hc.calculateLabelAngle=function(e,t){var n=e._private.rscratch,r=e.isEdge(),a=t?t+"-":"",i=e.pstyle(a+"text-rotation"),o=i.strValue;return"none"===o?0:r&&"autorotate"===o?n.labelAutoAngle:"autorotate"===o?0:i.pfValue},Hc.calculateLabelAngles=function(e){var t=this,n=e.isEdge(),r=e._private.rscratch;r.labelAngle=t.calculateLabelAngle(e),n&&(r.sourceLabelAngle=t.calculateLabelAngle(e,"source"),r.targetLabelAngle=t.calculateLabelAngle(e,"target"))};var Zc={},$c=!1;Zc.getNodeShape=function(e){var t=e.pstyle("shape").value;if("cutrectangle"===t&&(e.width()<28||e.height()<28))return $c||(it("The `cutrectangle` node shape can not be used at small sizes so `rectangle` is used instead"),$c=!0),"rectangle";if(e.isParent())return"rectangle"===t||"roundrectangle"===t||"round-rectangle"===t||"cutrectangle"===t||"cut-rectangle"===t||"barrel"===t?t:"rectangle";if("polygon"===t){var n=e.pstyle("shape-polygon-points").value;return this.nodeShapes.makePolygon(n).name}return t};var Qc={registerCalculationListeners:function(){var e=this.cy,t=e.collection(),n=this,r=function(e){var n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(t.merge(e),n)for(var r=0;r<e.length;r++){var a=e[r]._private.rstyle;a.clean=!1,a.cleanConnected=!1}};n.binder(e).on("bounds.* dirty.*",function(e){var t=e.target;r(t)}).on("style.* background.*",function(e){var t=e.target;r(t,!1)});var a=function(a){if(a){var i=n.onUpdateEleCalcsFns;t.cleanStyle();for(var o=0;o<t.length;o++){var s=t[o],l=s._private.rstyle;s.isNode()&&!l.cleanConnected&&(r(s.connectedEdges()),l.cleanConnected=!0)}if(i)for(var u=0;u<i.length;u++){(0,i[u])(a,t)}n.recalculateRenderedStyle(t),t=e.collection()}};n.flushRenderedStyleQueue=function(){a(!0)},n.beforeRender(a,n.beforeRenderPriorities.eleCalcs)},onUpdateEleCalcs:function(e){(this.onUpdateEleCalcsFns=this.onUpdateEleCalcsFns||[]).push(e)},recalculateRenderedStyle:function(e,t){var n=function(e){return e._private.rstyle.cleanConnected};if(0!==e.length){var r=[],a=[];if(!this.destroyed){void 0===t&&(t=!0);for(var i=0;i<e.length;i++){var o=e[i],s=o._private,l=s.rstyle;!o.isEdge()||n(o.source())&&n(o.target())||(l.clean=!1),o.isEdge()&&o.isBundledBezier()&&o.parallelEdges().some(function(e){return!e._private.rstyle.clean&&e.isBundledBezier()})&&(l.clean=!1),t&&l.clean||o.removed()||"none"!==o.pstyle("display").value&&("nodes"===s.group?a.push(o):r.push(o),l.clean=!0)}for(var u=0;u<a.length;u++){var c=a[u],d=c._private.rstyle,h=c.position();this.recalculateNodeLabelProjection(c),d.nodeX=h.x,d.nodeY=h.y,d.nodeW=c.pstyle("width").pfValue,d.nodeH=c.pstyle("height").pfValue}this.recalculateEdgeProjections(r);for(var f=0;f<r.length;f++){var p=r[f]._private,v=p.rstyle,g=p.rscratch;v.srcX=g.arrowStartX,v.srcY=g.arrowStartY,v.tgtX=g.arrowEndX,v.tgtY=g.arrowEndY,v.midX=g.midX,v.midY=g.midY,v.labelAngle=g.labelAngle,v.sourceLabelAngle=g.sourceLabelAngle,v.targetLabelAngle=g.targetLabelAngle}}}}},Jc={updateCachedGrabbedEles:function(){var e=this.cachedZSortedEles;if(e){e.drag=[],e.nondrag=[];for(var t=[],n=0;n<e.length;n++){var r=(a=e[n])._private.rscratch;a.grabbed()&&!a.isParent()?t.push(a):r.inDragLayer?e.drag.push(a):e.nondrag.push(a)}for(n=0;n<t.length;n++){var a=t[n];e.drag.push(a)}}},invalidateCachedZSortedEles:function(){this.cachedZSortedEles=null},getCachedZSortedEles:function(e){if(e||!this.cachedZSortedEles){var t=this.cy.mutableElements().toArray();t.sort(fl),t.interactive=t.filter(function(e){return e.interactive()}),this.cachedZSortedEles=t,this.updateCachedGrabbedEles()}else t=this.cachedZSortedEles;return t}},ed={};[vc,gc,Xc,Yc,Wc,Hc,Zc,Qc,Jc].forEach(function(e){be(ed,e)});var td={getCachedImage:function(e,t,n){var r=this.imageCache=this.imageCache||{},a=r[e];if(a)return a.image.complete||a.image.addEventListener("load",n),a.image;var i=(a=r[e]=r[e]||{}).image=new Image;i.addEventListener("load",n),i.addEventListener("error",function(){i.error=!0});var o="data:";return e.substring(0,5).toLowerCase()===o||(t="null"===t?null:t,i.crossOrigin=t),i.src=e,i}},nd={registerBinding:function(e,t,n,r){var a=Array.prototype.slice.apply(arguments,[1]);if(Array.isArray(e)){for(var i=[],o=0;o<e.length;o++){var s=e[o];if(void 0!==s){var l=this.binder(s);i.push(l.on.apply(l,a))}}return i}return(l=this.binder(e)).on.apply(l,a)}};nd.binder=function(e){var t,n=this,r=n.cy.window(),a=e===r||e===r.document||e===r.document.body||(t=e,"undefined"!=typeof HTMLElement&&t instanceof HTMLElement);if(null==n.supportsPassiveEvents){var i=!1;try{var o=Object.defineProperty({},"passive",{get:function(){return i=!0,!0}});r.addEventListener("test",null,o)}catch(l){}n.supportsPassiveEvents=i}var s=function(t,r,i){var o=Array.prototype.slice.call(arguments);return a&&n.supportsPassiveEvents&&(o[2]={capture:null!=i&&i,passive:!1,once:!1}),n.bindings.push({target:e,args:o}),(e.addEventListener||e.on).apply(e,o),this};return{on:s,addEventListener:s,addListener:s,bind:s}},nd.nodeIsDraggable=function(e){return e&&e.isNode()&&!e.locked()&&e.grabbable()},nd.nodeIsGrabbable=function(e){return this.nodeIsDraggable(e)&&e.interactive()},nd.load=function(){var e=this,t=e.cy.window(),n=function(e){return e.selected()},r=function(t,n,r,a){null==t&&(t=e.cy);for(var i=0;i<n.length;i++){var o=n[i];t.emit({originalEvent:r,type:o,position:a})}},a=function(e){return e.shiftKey||e.metaKey||e.ctrlKey},i=function(t,n){var r=!0;if(e.cy.hasCompoundNodes()&&t&&t.pannable())for(var a=0;n&&a<n.length;a++){if((t=n[a]).isNode()&&t.isParent()&&!t.pannable()){r=!1;break}}else r=!0;return r},o=function(e){e[0]._private.rscratch.inDragLayer=!0},s=function(e){e[0]._private.rscratch.isGrabTarget=!0},l=function(e,t){var n=t.addToList;n.has(e)||!e.grabbable()||e.locked()||(n.merge(e),function(e){e[0]._private.grabbed=!0}(e))},u=function(t,n){n=n||{};var r=t.cy().hasCompoundNodes();n.inDragLayer&&(t.forEach(o),t.neighborhood().stdFilter(function(e){return!r||e.isEdge()}).forEach(o)),n.addToList&&t.forEach(function(e){l(e,n)}),function(e,t){if(e.cy().hasCompoundNodes()&&(null!=t.inDragLayer||null!=t.addToList)){var n=e.descendants();t.inDragLayer&&(n.forEach(o),n.connectedEdges().forEach(o)),t.addToList&&l(n,t)}}(t,n),h(t,{inDragLayer:n.inDragLayer}),e.updateCachedGrabbedEles()},c=u,d=function(t){t&&(e.getCachedZSortedEles().forEach(function(e){!function(e){e[0]._private.grabbed=!1}(e),function(e){e[0]._private.rscratch.inDragLayer=!1}(e),function(e){e[0]._private.rscratch.isGrabTarget=!1}(e)}),e.updateCachedGrabbedEles())},h=function(e,t){if((null!=t.inDragLayer||null!=t.addToList)&&e.cy().hasCompoundNodes()){var n=e.ancestors().orphans();if(!n.same(e)){var r=n.descendants().spawnSelf().merge(n).unmerge(e).unmerge(e.descendants()),a=r.connectedEdges();t.inDragLayer&&(a.forEach(o),r.forEach(o)),t.addToList&&r.forEach(function(e){l(e,t)})}}},f=function(){null!=document.activeElement&&null!=document.activeElement.blur&&document.activeElement.blur()},p="undefined"!=typeof MutationObserver,v="undefined"!=typeof ResizeObserver;p?(e.removeObserver=new MutationObserver(function(t){for(var n=0;n<t.length;n++){var r=t[n].removedNodes;if(r)for(var a=0;a<r.length;a++){if(r[a]===e.container){e.destroy();break}}}}),e.container.parentNode&&e.removeObserver.observe(e.container.parentNode,{childList:!0})):e.registerBinding(e.container,"DOMNodeRemoved",function(t){e.destroy()});var g=Me(function(){e.cy.resize()},100);p&&(e.styleObserver=new MutationObserver(g),e.styleObserver.observe(e.container,{attributes:!0})),e.registerBinding(t,"resize",g),v&&(e.resizeObserver=new ResizeObserver(g),e.resizeObserver.observe(e.container));var y=function(){e.invalidateContainerClientCoordsCache()};!function(e,t){for(;null!=e;)t(e),e=e.parentNode}(e.container,function(t){e.registerBinding(t,"transitionend",y),e.registerBinding(t,"animationend",y),e.registerBinding(t,"scroll",y)}),e.registerBinding(e.container,"contextmenu",function(e){e.preventDefault()});var m=function(t){for(var n=e.findContainerClientCoords(),r=n[0],a=n[1],i=n[2],o=n[3],s=t.touches?t.touches:[t],l=!1,u=0;u<s.length;u++){var c=s[u];if(r<=c.clientX&&c.clientX<=r+i&&a<=c.clientY&&c.clientY<=a+o){l=!0;break}}if(!l)return!1;for(var d=e.container,h=t.target.parentNode,f=!1;h;){if(h===d){f=!0;break}h=h.parentNode}return!!f};e.registerBinding(e.container,"mousedown",function(t){if(m(t)&&(1!==e.hoverData.which||1===t.which)){t.preventDefault(),f(),e.hoverData.capture=!0,e.hoverData.which=t.which;var n=e.cy,a=[t.clientX,t.clientY],i=e.projectIntoViewport(a[0],a[1]),o=e.selection,l=e.findNearestElements(i[0],i[1],!0,!1),d=l[0],h=e.dragData.possibleDragElements;e.hoverData.mdownPos=i,e.hoverData.mdownGPos=a;var p=function(e){return{originalEvent:t,type:e,position:{x:i[0],y:i[1]}}};if(3==t.which){e.hoverData.cxtStarted=!0;var v={originalEvent:t,type:"cxttapstart",position:{x:i[0],y:i[1]}};d?(d.activate(),d.emit(v),e.hoverData.down=d):n.emit(v),e.hoverData.downTime=(new Date).getTime(),e.hoverData.cxtDragged=!1}else if(1==t.which){if(d&&d.activate(),null!=d&&e.nodeIsGrabbable(d)){if(s(d),d.selected()){h=e.dragData.possibleDragElements=n.collection();var g=n.$(function(t){return t.isNode()&&t.selected()&&e.nodeIsGrabbable(t)});u(g,{addToList:h}),d.emit(p("grabon")),g.forEach(function(e){e.emit(p("grab"))})}else h=e.dragData.possibleDragElements=n.collection(),c(d,{addToList:h}),d.emit(p("grabon")).emit(p("grab"));e.redrawHint("eles",!0),e.redrawHint("drag",!0)}e.hoverData.down=d,e.hoverData.downs=l,e.hoverData.downTime=(new Date).getTime(),r(d,["mousedown","tapstart","vmousedown"],t,{x:i[0],y:i[1]}),null==d?(o[4]=1,e.data.bgActivePosistion={x:i[0],y:i[1]},e.redrawHint("select",!0),e.redraw()):d.pannable()&&(o[4]=1),e.hoverData.tapholdCancelled=!1,clearTimeout(e.hoverData.tapholdTimeout),e.hoverData.tapholdTimeout=setTimeout(function(){if(!e.hoverData.tapholdCancelled){var t=e.hoverData.down;t?t.emit(p("taphold")):n.emit(p("taphold"))}},e.tapholdDuration)}o[0]=o[2]=i[0],o[1]=o[3]=i[1]}},!1);var b,x,w,E=function(e){var t=e.getRootNode();if(t&&11===t.nodeType&&void 0!==t.host)return t}(e.container);e.registerBinding([t,E],"mousemove",function(t){if(e.hoverData.capture||m(t)){var n=!1,o=e.cy,s=o.zoom(),l=[t.clientX,t.clientY],c=e.projectIntoViewport(l[0],l[1]),h=e.hoverData.mdownPos,f=e.hoverData.mdownGPos,p=e.selection,v=null;e.hoverData.draggingEles||e.hoverData.dragging||e.hoverData.selecting||(v=e.findNearestElement(c[0],c[1],!0,!1));var g,y=e.hoverData.last,b=e.hoverData.down,x=[c[0]-p[2],c[1]-p[3]],w=e.dragData.possibleDragElements;if(f){var E=l[0]-f[0],k=E*E,T=l[1]-f[1],C=k+T*T;e.hoverData.isOverThresholdDrag=g=C>=e.desktopTapThreshold2}var P=a(t);g&&(e.hoverData.tapholdCancelled=!0);n=!0,r(v,["mousemove","vmousemove","tapdrag"],t,{x:c[0],y:c[1]});var S=function(e){return{originalEvent:t,type:e,position:{x:c[0],y:c[1]}}},B=function(){e.data.bgActivePosistion=void 0,e.hoverData.selecting||o.emit(S("boxstart")),p[4]=1,e.hoverData.selecting=!0,e.redrawHint("select",!0),e.redraw()};if(3===e.hoverData.which){if(g){var D=S("cxtdrag");b?b.emit(D):o.emit(D),e.hoverData.cxtDragged=!0,e.hoverData.cxtOver&&v===e.hoverData.cxtOver||(e.hoverData.cxtOver&&e.hoverData.cxtOver.emit(S("cxtdragout")),e.hoverData.cxtOver=v,v&&v.emit(S("cxtdragover")))}}else if(e.hoverData.dragging){if(n=!0,o.panningEnabled()&&o.userPanningEnabled()){var _;if(e.hoverData.justStartedPan){var A=e.hoverData.mdownPos;_={x:(c[0]-A[0])*s,y:(c[1]-A[1])*s},e.hoverData.justStartedPan=!1}else _={x:x[0]*s,y:x[1]*s};o.panBy(_),o.emit(S("dragpan")),e.hoverData.dragged=!0}c=e.projectIntoViewport(t.clientX,t.clientY)}else if(1!=p[4]||null!=b&&!b.pannable()){if(b&&b.pannable()&&b.active()&&b.unactivate(),b&&b.grabbed()||v==y||(y&&r(y,["mouseout","tapdragout"],t,{x:c[0],y:c[1]}),v&&r(v,["mouseover","tapdragover"],t,{x:c[0],y:c[1]}),e.hoverData.last=v),b)if(g){if(o.boxSelectionEnabled()&&P)b&&b.grabbed()&&(d(w),b.emit(S("freeon")),w.emit(S("free")),e.dragData.didDrag&&(b.emit(S("dragfreeon")),w.emit(S("dragfree")))),B();else if(b&&b.grabbed()&&e.nodeIsDraggable(b)){var M=!e.dragData.didDrag;M&&e.redrawHint("eles",!0),e.dragData.didDrag=!0,e.hoverData.draggingEles||u(w,{inDragLayer:!0});var R={x:0,y:0};if(Q(x[0])&&Q(x[1])&&(R.x+=x[0],R.y+=x[1],M)){var I=e.hoverData.dragDelta;I&&Q(I[0])&&Q(I[1])&&(R.x+=I[0],R.y+=I[1])}e.hoverData.draggingEles=!0,w.silentShift(R).emit(S("position")).emit(S("drag")),e.redrawHint("drag",!0),e.redraw()}}else!function(){var t=e.hoverData.dragDelta=e.hoverData.dragDelta||[];0===t.length?(t.push(x[0]),t.push(x[1])):(t[0]+=x[0],t[1]+=x[1])}();n=!0}else if(g){if(e.hoverData.dragging||!o.boxSelectionEnabled()||!P&&o.panningEnabled()&&o.userPanningEnabled()){if(!e.hoverData.selecting&&o.panningEnabled()&&o.userPanningEnabled()){i(b,e.hoverData.downs)&&(e.hoverData.dragging=!0,e.hoverData.justStartedPan=!0,p[4]=0,e.data.bgActivePosistion=Yt(h),e.redrawHint("select",!0),e.redraw())}}else B();b&&b.pannable()&&b.active()&&b.unactivate()}return p[2]=c[0],p[3]=c[1],n?(t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),!1):void 0}},!1),e.registerBinding(t,"mouseup",function(t){if((1!==e.hoverData.which||1===t.which||!e.hoverData.capture)&&e.hoverData.capture){e.hoverData.capture=!1;var i=e.cy,o=e.projectIntoViewport(t.clientX,t.clientY),s=e.selection,l=e.findNearestElement(o[0],o[1],!0,!1),u=e.dragData.possibleDragElements,c=e.hoverData.down,h=a(t);e.data.bgActivePosistion&&(e.redrawHint("select",!0),e.redraw()),e.hoverData.tapholdCancelled=!0,e.data.bgActivePosistion=void 0,c&&c.unactivate();var f=function(e){return{originalEvent:t,type:e,position:{x:o[0],y:o[1]}}};if(3===e.hoverData.which){var p=f("cxttapend");if(c?c.emit(p):i.emit(p),!e.hoverData.cxtDragged){var v=f("cxttap");c?c.emit(v):i.emit(v)}e.hoverData.cxtDragged=!1,e.hoverData.which=null}else if(1===e.hoverData.which){if(r(l,["mouseup","tapend","vmouseup"],t,{x:o[0],y:o[1]}),e.dragData.didDrag||e.hoverData.dragged||e.hoverData.selecting||e.hoverData.isOverThresholdDrag||(r(c,["click","tap","vclick"],t,{x:o[0],y:o[1]}),x=!1,t.timeStamp-w<=i.multiClickDebounceTime()?(b&&clearTimeout(b),x=!0,w=null,r(c,["dblclick","dbltap","vdblclick"],t,{x:o[0],y:o[1]})):(b=setTimeout(function(){x||r(c,["oneclick","onetap","voneclick"],t,{x:o[0],y:o[1]})},i.multiClickDebounceTime()),w=t.timeStamp)),null!=c||e.dragData.didDrag||e.hoverData.selecting||e.hoverData.dragged||a(t)||(i.$(n).unselect(["tapunselect"]),u.length>0&&e.redrawHint("eles",!0),e.dragData.possibleDragElements=u=i.collection()),l!=c||e.dragData.didDrag||e.hoverData.selecting||null!=l&&l._private.selectable&&(e.hoverData.dragging||("additive"===i.selectionType()||h?l.selected()?l.unselect(["tapunselect"]):l.select(["tapselect"]):h||(i.$(n).unmerge(l).unselect(["tapunselect"]),l.select(["tapselect"]))),e.redrawHint("eles",!0)),e.hoverData.selecting){var g=i.collection(e.getAllInBox(s[0],s[1],s[2],s[3]));e.redrawHint("select",!0),g.length>0&&e.redrawHint("eles",!0),i.emit(f("boxend"));var y=function(e){return e.selectable()&&!e.selected()};"additive"===i.selectionType()||h||i.$(n).unmerge(g).unselect(),g.emit(f("box")).stdFilter(y).select().emit(f("boxselect")),e.redraw()}if(e.hoverData.dragging&&(e.hoverData.dragging=!1,e.redrawHint("select",!0),e.redrawHint("eles",!0),e.redraw()),!s[4]){e.redrawHint("drag",!0),e.redrawHint("eles",!0);var m=c&&c.grabbed();d(u),m&&(c.emit(f("freeon")),u.emit(f("free")),e.dragData.didDrag&&(c.emit(f("dragfreeon")),u.emit(f("dragfree"))))}}s[4]=0,e.hoverData.down=null,e.hoverData.cxtStarted=!1,e.hoverData.draggingEles=!1,e.hoverData.selecting=!1,e.hoverData.isOverThresholdDrag=!1,e.dragData.didDrag=!1,e.hoverData.dragged=!1,e.hoverData.dragDelta=[],e.hoverData.mdownPos=null,e.hoverData.mdownGPos=null,e.hoverData.which=null}},!1);var k,T,C,P,S,B,D,_,A,M,R,I,N,L,z=[],O=1e5,V=function(t){var n=!1,r=t.deltaY;if(null==r&&(null!=t.wheelDeltaY?r=t.wheelDeltaY/4:null!=t.wheelDelta&&(r=t.wheelDelta/4)),null==k)if(z.length>=4){var a=z;if(k=function(e,t){for(var n=0;n<e.length;n++)if(e[n]%t!==0)return!1;return!0}(a,5),!k){var i=Math.abs(a[0]);k=function(e){for(var t=Math.abs(e[0]),n=1;n<e.length;n++)if(Math.abs(e[n])!==t)return!1;return!0}(a)&&i>5}if(k)for(var o=0;o<a.length;o++)O=Math.min(Math.abs(a[o]),O)}else z.push(r),n=!0;else k&&(O=Math.min(Math.abs(r),O));if(!e.scrollingPage){var s=e.cy,l=s.zoom(),u=s.pan(),c=e.projectIntoViewport(t.clientX,t.clientY),d=[c[0]*l+u.x,c[1]*l+u.y];if(e.hoverData.draggingEles||e.hoverData.dragging||e.hoverData.cxtStarted||0!==e.selection[4])t.preventDefault();else if(s.panningEnabled()&&s.userPanningEnabled()&&s.zoomingEnabled()&&s.userZoomingEnabled()){var h;t.preventDefault(),e.data.wheelZooming=!0,clearTimeout(e.data.wheelTimeout),e.data.wheelTimeout=setTimeout(function(){e.data.wheelZooming=!1,e.redrawHint("eles",!0),e.redraw()},150),n&&Math.abs(r)>5&&(r=5*Ht(r)),h=r/-250,k&&(h/=O,h*=3),h*=e.wheelSensitivity,1===t.deltaMode&&(h*=33);var f=s.zoom()*Math.pow(10,h);"gesturechange"===t.type&&(f=e.gestureStartZoom*t.scale),s.zoom({level:f,renderedPosition:{x:d[0],y:d[1]}}),s.emit({type:"gesturechange"===t.type?"pinchzoom":"scrollzoom",originalEvent:t,position:{x:c[0],y:c[1]}})}}};e.registerBinding(e.container,"wheel",V,!0),e.registerBinding(t,"scroll",function(t){e.scrollingPage=!0,clearTimeout(e.scrollingPageTimeout),e.scrollingPageTimeout=setTimeout(function(){e.scrollingPage=!1},250)},!0),e.registerBinding(e.container,"gesturestart",function(t){e.gestureStartZoom=e.cy.zoom(),e.hasTouchStarted||t.preventDefault()},!0),e.registerBinding(e.container,"gesturechange",function(t){e.hasTouchStarted||V(t)},!0),e.registerBinding(e.container,"mouseout",function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseout",position:{x:n[0],y:n[1]}})},!1),e.registerBinding(e.container,"mouseover",function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseover",position:{x:n[0],y:n[1]}})},!1);var F,j,X,q,Y,W,U,H=function(e,t,n,r){return Math.sqrt((n-e)*(n-e)+(r-t)*(r-t))},K=function(e,t,n,r){return(n-e)*(n-e)+(r-t)*(r-t)};if(e.registerBinding(e.container,"touchstart",F=function(t){if(e.hasTouchStarted=!0,m(t)){f(),e.touchData.capture=!0,e.data.bgActivePosistion=void 0;var n=e.cy,a=e.touchData.now,i=e.touchData.earlier;if(t.touches[0]){var o=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);a[0]=o[0],a[1]=o[1]}if(t.touches[1]){o=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);a[2]=o[0],a[3]=o[1]}if(t.touches[2]){o=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);a[4]=o[0],a[5]=o[1]}var l=function(e){return{originalEvent:t,type:e,position:{x:a[0],y:a[1]}}};if(t.touches[1]){e.touchData.singleTouchMoved=!0,d(e.dragData.touchDragEles);var h=e.findContainerClientCoords();M=h[0],R=h[1],I=h[2],N=h[3],T=t.touches[0].clientX-M,C=t.touches[0].clientY-R,P=t.touches[1].clientX-M,S=t.touches[1].clientY-R,L=0<=T&&T<=I&&0<=P&&P<=I&&0<=C&&C<=N&&0<=S&&S<=N;var p=n.pan(),v=n.zoom();B=H(T,C,P,S),D=K(T,C,P,S),A=[((_=[(T+P)/2,(C+S)/2])[0]-p.x)/v,(_[1]-p.y)/v];if(D<4e4&&!t.touches[2]){var g=e.findNearestElement(a[0],a[1],!0,!0),y=e.findNearestElement(a[2],a[3],!0,!0);return g&&g.isNode()?(g.activate().emit(l("cxttapstart")),e.touchData.start=g):y&&y.isNode()?(y.activate().emit(l("cxttapstart")),e.touchData.start=y):n.emit(l("cxttapstart")),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!0,e.touchData.cxtDragged=!1,e.data.bgActivePosistion=void 0,void e.redraw()}}if(t.touches[2])n.boxSelectionEnabled()&&t.preventDefault();else if(t.touches[1]);else if(t.touches[0]){var b=e.findNearestElements(a[0],a[1],!0,!0),x=b[0];if(null!=x&&(x.activate(),e.touchData.start=x,e.touchData.starts=b,e.nodeIsGrabbable(x))){var w=e.dragData.touchDragEles=n.collection(),E=null;e.redrawHint("eles",!0),e.redrawHint("drag",!0),x.selected()?(E=n.$(function(t){return t.selected()&&e.nodeIsGrabbable(t)}),u(E,{addToList:w})):c(x,{addToList:w}),s(x),x.emit(l("grabon")),E?E.forEach(function(e){e.emit(l("grab"))}):x.emit(l("grab"))}r(x,["touchstart","tapstart","vmousedown"],t,{x:a[0],y:a[1]}),null==x&&(e.data.bgActivePosistion={x:o[0],y:o[1]},e.redrawHint("select",!0),e.redraw()),e.touchData.singleTouchMoved=!1,e.touchData.singleTouchStartTime=+new Date,clearTimeout(e.touchData.tapholdTimeout),e.touchData.tapholdTimeout=setTimeout(function(){!1!==e.touchData.singleTouchMoved||e.pinching||e.touchData.selecting||r(e.touchData.start,["taphold"],t,{x:a[0],y:a[1]})},e.tapholdDuration)}if(t.touches.length>=1){for(var k=e.touchData.startPosition=[null,null,null,null,null,null],z=0;z<a.length;z++)k[z]=i[z]=a[z];var O=t.touches[0];e.touchData.startGPosition=[O.clientX,O.clientY]}}},!1),e.registerBinding(t,"touchmove",j=function(t){var n=e.touchData.capture;if(n||m(t)){var a=e.selection,o=e.cy,s=e.touchData.now,l=e.touchData.earlier,c=o.zoom();if(t.touches[0]){var h=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);s[0]=h[0],s[1]=h[1]}if(t.touches[1]){h=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);s[2]=h[0],s[3]=h[1]}if(t.touches[2]){h=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);s[4]=h[0],s[5]=h[1]}var f,p=function(e){return{originalEvent:t,type:e,position:{x:s[0],y:s[1]}}},v=e.touchData.startGPosition;if(n&&t.touches[0]&&v){for(var g=[],y=0;y<s.length;y++)g[y]=s[y]-l[y];var b=t.touches[0].clientX-v[0],x=b*b,w=t.touches[0].clientY-v[1];f=x+w*w>=e.touchTapThreshold2}if(n&&e.touchData.cxt){t.preventDefault();var E=t.touches[0].clientX-M,k=t.touches[0].clientY-R,_=t.touches[1].clientX-M,I=t.touches[1].clientY-R,N=K(E,k,_,I);if(N/D>=2.25||N>=22500){e.touchData.cxt=!1,e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var z=p("cxttapend");e.touchData.start?(e.touchData.start.unactivate().emit(z),e.touchData.start=null):o.emit(z)}}if(n&&e.touchData.cxt){z=p("cxtdrag");e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.touchData.start?e.touchData.start.emit(z):o.emit(z),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxtDragged=!0;var O=e.findNearestElement(s[0],s[1],!0,!0);e.touchData.cxtOver&&O===e.touchData.cxtOver||(e.touchData.cxtOver&&e.touchData.cxtOver.emit(p("cxtdragout")),e.touchData.cxtOver=O,O&&O.emit(p("cxtdragover")))}else if(n&&t.touches[2]&&o.boxSelectionEnabled())t.preventDefault(),e.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,e.touchData.selecting||o.emit(p("boxstart")),e.touchData.selecting=!0,e.touchData.didSelect=!0,a[4]=1,a&&0!==a.length&&void 0!==a[0]?(a[2]=(s[0]+s[2]+s[4])/3,a[3]=(s[1]+s[3]+s[5])/3):(a[0]=(s[0]+s[2]+s[4])/3,a[1]=(s[1]+s[3]+s[5])/3,a[2]=(s[0]+s[2]+s[4])/3+1,a[3]=(s[1]+s[3]+s[5])/3+1),e.redrawHint("select",!0),e.redraw();else if(n&&t.touches[1]&&!e.touchData.didSelect&&o.zoomingEnabled()&&o.panningEnabled()&&o.userZoomingEnabled()&&o.userPanningEnabled()){if(t.preventDefault(),e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),te=e.dragData.touchDragEles){e.redrawHint("drag",!0);for(var V=0;V<te.length;V++){var F=te[V]._private;F.grabbed=!1,F.rscratch.inDragLayer=!1}}var j=e.touchData.start,X=(E=t.touches[0].clientX-M,k=t.touches[0].clientY-R,_=t.touches[1].clientX-M,I=t.touches[1].clientY-R,H(E,k,_,I)),q=X/B;if(L){var Y=(E-T+(_-P))/2,W=(k-C+(I-S))/2,U=o.zoom(),G=U*q,Z=o.pan(),$=A[0]*U+Z.x,J=A[1]*U+Z.y,ee={x:-G/U*($-Z.x-Y)+$,y:-G/U*(J-Z.y-W)+J};if(j&&j.active()){var te=e.dragData.touchDragEles;d(te),e.redrawHint("drag",!0),e.redrawHint("eles",!0),j.unactivate().emit(p("freeon")),te.emit(p("free")),e.dragData.didDrag&&(j.emit(p("dragfreeon")),te.emit(p("dragfree")))}o.viewport({zoom:G,pan:ee,cancelOnFailedZoom:!0}),o.emit(p("pinchzoom")),B=X,T=E,C=k,P=_,S=I,e.pinching=!0}if(t.touches[0]){h=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);s[0]=h[0],s[1]=h[1]}if(t.touches[1]){h=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);s[2]=h[0],s[3]=h[1]}if(t.touches[2]){h=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);s[4]=h[0],s[5]=h[1]}}else if(t.touches[0]&&!e.touchData.didSelect){var ne=e.touchData.start,re=e.touchData.last;if(e.hoverData.draggingEles||e.swipePanning||(O=e.findNearestElement(s[0],s[1],!0,!0)),n&&null!=ne&&t.preventDefault(),n&&null!=ne&&e.nodeIsDraggable(ne))if(f){te=e.dragData.touchDragEles;var ae=!e.dragData.didDrag;ae&&u(te,{inDragLayer:!0}),e.dragData.didDrag=!0;var ie={x:0,y:0};if(Q(g[0])&&Q(g[1]))if(ie.x+=g[0],ie.y+=g[1],ae)e.redrawHint("eles",!0),(oe=e.touchData.dragDelta)&&Q(oe[0])&&Q(oe[1])&&(ie.x+=oe[0],ie.y+=oe[1]);e.hoverData.draggingEles=!0,te.silentShift(ie).emit(p("position")).emit(p("drag")),e.redrawHint("drag",!0),e.touchData.startPosition[0]==l[0]&&e.touchData.startPosition[1]==l[1]&&e.redrawHint("eles",!0),e.redraw()}else{var oe;0===(oe=e.touchData.dragDelta=e.touchData.dragDelta||[]).length?(oe.push(g[0]),oe.push(g[1])):(oe[0]+=g[0],oe[1]+=g[1])}if(r(ne||O,["touchmove","tapdrag","vmousemove"],t,{x:s[0],y:s[1]}),ne&&ne.grabbed()||O==re||(re&&re.emit(p("tapdragout")),O&&O.emit(p("tapdragover"))),e.touchData.last=O,n)for(V=0;V<s.length;V++)s[V]&&e.touchData.startPosition[V]&&f&&(e.touchData.singleTouchMoved=!0);if(n&&(null==ne||ne.pannable())&&o.panningEnabled()&&o.userPanningEnabled()){i(ne,e.touchData.starts)&&(t.preventDefault(),e.data.bgActivePosistion||(e.data.bgActivePosistion=Yt(e.touchData.startPosition)),e.swipePanning?(o.panBy({x:g[0]*c,y:g[1]*c}),o.emit(p("dragpan"))):f&&(e.swipePanning=!0,o.panBy({x:b*c,y:w*c}),o.emit(p("dragpan")),ne&&(ne.unactivate(),e.redrawHint("select",!0),e.touchData.start=null)));h=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);s[0]=h[0],s[1]=h[1]}}for(y=0;y<s.length;y++)l[y]=s[y];n&&t.touches.length>0&&!e.hoverData.draggingEles&&!e.swipePanning&&null!=e.data.bgActivePosistion&&(e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.redraw())}},!1),e.registerBinding(t,"touchcancel",X=function(t){var n=e.touchData.start;e.touchData.capture=!1,n&&n.unactivate()}),e.registerBinding(t,"touchend",q=function(t){var a=e.touchData.start;if(e.touchData.capture){0===t.touches.length&&(e.touchData.capture=!1),t.preventDefault();var i=e.selection;e.swipePanning=!1,e.hoverData.draggingEles=!1;var o=e.cy,s=o.zoom(),l=e.touchData.now,u=e.touchData.earlier;if(t.touches[0]){var c=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);l[0]=c[0],l[1]=c[1]}if(t.touches[1]){c=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);l[2]=c[0],l[3]=c[1]}if(t.touches[2]){c=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);l[4]=c[0],l[5]=c[1]}var h,f=function(e){return{originalEvent:t,type:e,position:{x:l[0],y:l[1]}}};if(a&&a.unactivate(),e.touchData.cxt){if(h=f("cxttapend"),a?a.emit(h):o.emit(h),!e.touchData.cxtDragged){var p=f("cxttap");a?a.emit(p):o.emit(p)}return e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!1,e.touchData.start=null,void e.redraw()}if(!t.touches[2]&&o.boxSelectionEnabled()&&e.touchData.selecting){e.touchData.selecting=!1;var v=o.collection(e.getAllInBox(i[0],i[1],i[2],i[3]));i[0]=void 0,i[1]=void 0,i[2]=void 0,i[3]=void 0,i[4]=0,e.redrawHint("select",!0),o.emit(f("boxend"));v.emit(f("box")).stdFilter(function(e){return e.selectable()&&!e.selected()}).select().emit(f("boxselect")),v.nonempty()&&e.redrawHint("eles",!0),e.redraw()}if(null!=a&&a.unactivate(),t.touches[2])e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);else if(t.touches[1]);else if(t.touches[0]);else if(!t.touches[0]){e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var g=e.dragData.touchDragEles;if(null!=a){var y=a._private.grabbed;d(g),e.redrawHint("drag",!0),e.redrawHint("eles",!0),y&&(a.emit(f("freeon")),g.emit(f("free")),e.dragData.didDrag&&(a.emit(f("dragfreeon")),g.emit(f("dragfree")))),r(a,["touchend","tapend","vmouseup","tapdragout"],t,{x:l[0],y:l[1]}),a.unactivate(),e.touchData.start=null}else{var m=e.findNearestElement(l[0],l[1],!0,!0);r(m,["touchend","tapend","vmouseup","tapdragout"],t,{x:l[0],y:l[1]})}var b=e.touchData.startPosition[0]-l[0],x=b*b,w=e.touchData.startPosition[1]-l[1],E=(x+w*w)*s*s;e.touchData.singleTouchMoved||(a||o.$(":selected").unselect(["tapunselect"]),r(a,["tap","vclick"],t,{x:l[0],y:l[1]}),Y=!1,t.timeStamp-U<=o.multiClickDebounceTime()?(W&&clearTimeout(W),Y=!0,U=null,r(a,["dbltap","vdblclick"],t,{x:l[0],y:l[1]})):(W=setTimeout(function(){Y||r(a,["onetap","voneclick"],t,{x:l[0],y:l[1]})},o.multiClickDebounceTime()),U=t.timeStamp)),null!=a&&!e.dragData.didDrag&&a._private.selectable&&E<e.touchTapThreshold2&&!e.pinching&&("single"===o.selectionType()?(o.$(n).unmerge(a).unselect(["tapunselect"]),a.select(["tapselect"])):a.selected()?a.unselect(["tapunselect"]):a.select(["tapselect"]),e.redrawHint("eles",!0)),e.touchData.singleTouchMoved=!0}for(var k=0;k<l.length;k++)u[k]=l[k];e.dragData.didDrag=!1,0===t.touches.length&&(e.touchData.dragDelta=[],e.touchData.startPosition=[null,null,null,null,null,null],e.touchData.startGPosition=null,e.touchData.didSelect=!1),t.touches.length<2&&(1===t.touches.length&&(e.touchData.startGPosition=[t.touches[0].clientX,t.touches[0].clientY]),e.pinching=!1,e.redrawHint("eles",!0),e.redraw())}},!1),"undefined"==typeof TouchEvent){var G=[],Z=function(e){return{clientX:e.clientX,clientY:e.clientY,force:1,identifier:e.pointerId,pageX:e.pageX,pageY:e.pageY,radiusX:e.width/2,radiusY:e.height/2,screenX:e.screenX,screenY:e.screenY,target:e.target}},$=function(e){G.push(function(e){return{event:e,touch:Z(e)}}(e))},J=function(e){for(var t=0;t<G.length;t++){if(G[t].event.pointerId===e.pointerId)return void G.splice(t,1)}},ee=function(e){e.touches=G.map(function(e){return e.touch})},te=function(e){return"mouse"===e.pointerType||4===e.pointerType};e.registerBinding(e.container,"pointerdown",function(e){te(e)||(e.preventDefault(),$(e),ee(e),F(e))}),e.registerBinding(e.container,"pointerup",function(e){te(e)||(J(e),ee(e),q(e))}),e.registerBinding(e.container,"pointercancel",function(e){te(e)||(J(e),ee(e),X())}),e.registerBinding(e.container,"pointermove",function(e){te(e)||(e.preventDefault(),function(e){var t=G.filter(function(t){return t.event.pointerId===e.pointerId})[0];t.event=e,t.touch=Z(e)}(e),ee(e),j(e))})}};var rd={generatePolygon:function(e,t){return this.nodeShapes[e]={renderer:this,name:e,points:t,draw:function(e,t,n,r,a,i){this.renderer.nodeShapeImpl("polygon",e,t,n,r,a,this.points)},intersectLine:function(e,t,n,r,a,i,o,s){return Sn(a,i,this.points,e,t,n/2,r/2,o)},checkPoint:function(e,t,n,r,a,i,o,s){return bn(e,t,this.points,i,o,r,a,[0,-1],n)},hasMiterBounds:"rectangle"!==e,miterBounds:function(e,t,n,r,a,i){return hn(this.points,e,t,n,r,a)}}}};rd.generateEllipse=function(){return this.nodeShapes.ellipse={renderer:this,name:"ellipse",draw:function(e,t,n,r,a,i){this.renderer.nodeShapeImpl(this.name,e,t,n,r,a)},intersectLine:function(e,t,n,r,a,i,o,s){return function(e,t,n,r,a,i){var o=n-e,s=r-t;o/=a,s/=i;var l=Math.sqrt(o*o+s*s),u=l-1;if(u<0)return[];var c=u/l;return[(n-e)*c+e,(r-t)*c+t]}(a,i,e,t,n/2+o,r/2+o)},checkPoint:function(e,t,n,r,a,i,o,s){return En(e,t,r,a,i,o,n)}}},rd.generateRoundPolygon=function(e,t){return this.nodeShapes[e]={renderer:this,name:e,points:t,getOrCreateCorners:function(e,n,r,a,i,o,s){if(void 0!==o[s]&&o[s+"-cx"]===e&&o[s+"-cy"]===n)return o[s];o[s]=new Array(t.length/2),o[s+"-cx"]=e,o[s+"-cy"]=n;var l=r/2,u=a/2;i="auto"===i?Rn(r,a):i;for(var c=new Array(t.length/2),d=0;d<t.length/2;d++)c[d]={x:e+l*t[2*d],y:n+u*t[2*d+1]};var h,f,p,v,g=c.length;for(f=c[g-1],h=0;h<g;h++)p=c[h%g],v=c[(h+1)%g],o[s][h]=Vc(f,p,v,i),f=p,p=v;return o[s]},draw:function(e,t,n,r,a,i,o){this.renderer.nodeShapeImpl("round-polygon",e,t,n,r,a,this.points,this.getOrCreateCorners(t,n,r,a,i,o,"drawCorners"))},intersectLine:function(e,t,n,r,a,i,o,s,l){return function(e,t,n,r,a,i,o,s,l){var u,c=[],d=new Array(2*n.length);l.forEach(function(n,i){0===i?(d[d.length-2]=n.startX,d[d.length-1]=n.startY):(d[4*i-2]=n.startX,d[4*i-1]=n.startY),d[4*i]=n.stopX,d[4*i+1]=n.stopY,0!==(u=kn(e,t,r,a,n.cx,n.cy,n.radius)).length&&c.push(u[0],u[1])});for(var h=0;h<d.length/4;h++)0!==(u=Cn(e,t,r,a,d[4*h],d[4*h+1],d[4*h+2],d[4*h+3],!1)).length&&c.push(u[0],u[1]);if(c.length>2){for(var f=[c[0],c[1]],p=Math.pow(f[0]-e,2)+Math.pow(f[1]-t,2),v=1;v<c.length/2;v++){var g=Math.pow(c[2*v]-e,2)+Math.pow(c[2*v+1]-t,2);g<=p&&(f[0]=c[2*v],f[1]=c[2*v+1],p=g)}return f}return c}(a,i,this.points,e,t,0,0,0,this.getOrCreateCorners(e,t,n,r,s,l,"corners"))},checkPoint:function(e,t,n,r,a,i,o,s,l){return function(e,t,n,r,a,i,o,s){for(var l=new Array(2*n.length),u=0;u<s.length;u++){var c=s[u];if(l[4*u+0]=c.startX,l[4*u+1]=c.startY,l[4*u+2]=c.stopX,l[4*u+3]=c.stopY,Math.pow(c.cx-e,2)+Math.pow(c.cy-t,2)<=Math.pow(c.radius,2))return!0}return mn(e,t,l)}(e,t,this.points,0,0,0,0,this.getOrCreateCorners(i,o,r,a,s,l,"corners"))}}},rd.generateRoundRectangle=function(){return this.nodeShapes["round-rectangle"]=this.nodeShapes.roundrectangle={renderer:this,name:"round-rectangle",points:Dn(4,0),draw:function(e,t,n,r,a,i){this.renderer.nodeShapeImpl(this.name,e,t,n,r,a,this.points,i)},intersectLine:function(e,t,n,r,a,i,o,s){return fn(a,i,e,t,n,r,o,s)},checkPoint:function(e,t,n,r,a,i,o,s){var l=r/2,u=a/2;s="auto"===s?Mn(r,a):s;var c=2*(s=Math.min(l,u,s));return!!bn(e,t,this.points,i,o,r,a-c,[0,-1],n)||(!!bn(e,t,this.points,i,o,r-c,a,[0,-1],n)||(!!En(e,t,c,c,i-l+s,o-u+s,n)||(!!En(e,t,c,c,i+l-s,o-u+s,n)||(!!En(e,t,c,c,i+l-s,o+u-s,n)||!!En(e,t,c,c,i-l+s,o+u-s,n)))))}}},rd.generateCutRectangle=function(){return this.nodeShapes["cut-rectangle"]=this.nodeShapes.cutrectangle={renderer:this,name:"cut-rectangle",cornerLength:8,points:Dn(4,0),draw:function(e,t,n,r,a,i){this.renderer.nodeShapeImpl(this.name,e,t,n,r,a,null,i)},generateCutTrianglePts:function(e,t,n,r,a){var i="auto"===a?this.cornerLength:a,o=t/2,s=e/2,l=n-s,u=n+s,c=r-o,d=r+o;return{topLeft:[l,c+i,l+i,c,l+i,c+i],topRight:[u-i,c,u,c+i,u-i,c+i],bottomRight:[u,d-i,u-i,d,u-i,d-i],bottomLeft:[l+i,d,l,d-i,l+i,d-i]}},intersectLine:function(e,t,n,r,a,i,o,s){var l=this.generateCutTrianglePts(n+2*o,r+2*o,e,t,s),u=[].concat.apply([],[l.topLeft.splice(0,4),l.topRight.splice(0,4),l.bottomRight.splice(0,4),l.bottomLeft.splice(0,4)]);return Sn(a,i,u,e,t)},checkPoint:function(e,t,n,r,a,i,o,s){var l="auto"===s?this.cornerLength:s;if(bn(e,t,this.points,i,o,r,a-2*l,[0,-1],n))return!0;if(bn(e,t,this.points,i,o,r-2*l,a,[0,-1],n))return!0;var u=this.generateCutTrianglePts(r,a,i,o);return mn(e,t,u.topLeft)||mn(e,t,u.topRight)||mn(e,t,u.bottomRight)||mn(e,t,u.bottomLeft)}}},rd.generateBarrel=function(){return this.nodeShapes.barrel={renderer:this,name:"barrel",points:Dn(4,0),draw:function(e,t,n,r,a,i){this.renderer.nodeShapeImpl(this.name,e,t,n,r,a)},intersectLine:function(e,t,n,r,a,i,o,s){var l=this.generateBarrelBezierPts(n+2*o,r+2*o,e,t),u=function(e){var t=Qt({x:e[0],y:e[1]},{x:e[2],y:e[3]},{x:e[4],y:e[5]},.15),n=Qt({x:e[0],y:e[1]},{x:e[2],y:e[3]},{x:e[4],y:e[5]},.5),r=Qt({x:e[0],y:e[1]},{x:e[2],y:e[3]},{x:e[4],y:e[5]},.85);return[e[0],e[1],t.x,t.y,n.x,n.y,r.x,r.y,e[4],e[5]]},c=[].concat(u(l.topLeft),u(l.topRight),u(l.bottomRight),u(l.bottomLeft));return Sn(a,i,c,e,t)},generateBarrelBezierPts:function(e,t,n,r){var a=t/2,i=e/2,o=n-i,s=n+i,l=r-a,u=r+a,c=In(e,t),d=c.heightOffset,h=c.widthOffset,f=c.ctrlPtOffsetPct*e,p={topLeft:[o,l+d,o+f,l,o+h,l],topRight:[s-h,l,s-f,l,s,l+d],bottomRight:[s,u-d,s-f,u,s-h,u],bottomLeft:[o+h,u,o+f,u,o,u-d]};return p.topLeft.isTop=!0,p.topRight.isTop=!0,p.bottomLeft.isBottom=!0,p.bottomRight.isBottom=!0,p},checkPoint:function(e,t,n,r,a,i,o,s){var l=In(r,a),u=l.heightOffset,c=l.widthOffset;if(bn(e,t,this.points,i,o,r,a-2*u,[0,-1],n))return!0;if(bn(e,t,this.points,i,o,r-2*c,a,[0,-1],n))return!0;for(var d=this.generateBarrelBezierPts(r,a,i,o),h=function(e,t,n){var r,a,i=n[4],o=n[2],s=n[0],l=n[5],u=n[1],c=Math.min(i,s),d=Math.max(i,s),h=Math.min(l,u),f=Math.max(l,u);if(c<=e&&e<=d&&h<=t&&t<=f){var p=[(r=i)-2*(a=o)+s,2*(a-r),r],v=function(e,t,n,r){var a=t*t-4*e*(n-=r);if(a<0)return[];var i=Math.sqrt(a),o=2*e;return[(-t+i)/o,(-t-i)/o]}(p[0],p[1],p[2],e).filter(function(e){return 0<=e&&e<=1});if(v.length>0)return v[0]}return null},f=Object.keys(d),p=0;p<f.length;p++){var v=d[f[p]],g=h(e,t,v);if(null!=g){var y=v[5],m=v[3],b=v[1],x=$t(y,m,b,g);if(v.isTop&&x<=t)return!0;if(v.isBottom&&t<=x)return!0}}return!1}}},rd.generateBottomRoundrectangle=function(){return this.nodeShapes["bottom-round-rectangle"]=this.nodeShapes.bottomroundrectangle={renderer:this,name:"bottom-round-rectangle",points:Dn(4,0),draw:function(e,t,n,r,a,i){this.renderer.nodeShapeImpl(this.name,e,t,n,r,a,this.points,i)},intersectLine:function(e,t,n,r,a,i,o,s){var l=t-(r/2+o),u=Cn(a,i,e,t,e-(n/2+o),l,e+(n/2+o),l,!1);return u.length>0?u:fn(a,i,e,t,n,r,o,s)},checkPoint:function(e,t,n,r,a,i,o,s){var l=2*(s="auto"===s?Mn(r,a):s);if(bn(e,t,this.points,i,o,r,a-l,[0,-1],n))return!0;if(bn(e,t,this.points,i,o,r-l,a,[0,-1],n))return!0;var u=r/2+2*n,c=a/2+2*n;return!!mn(e,t,[i-u,o-c,i-u,o,i+u,o,i+u,o-c])||(!!En(e,t,l,l,i+r/2-s,o+a/2-s,n)||!!En(e,t,l,l,i-r/2+s,o+a/2-s,n))}}},rd.registerNodeShapes=function(){var e=this.nodeShapes={},t=this;this.generateEllipse(),this.generatePolygon("triangle",Dn(3,0)),this.generateRoundPolygon("round-triangle",Dn(3,0)),this.generatePolygon("rectangle",Dn(4,0)),e.square=e.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();var n=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",n),this.generateRoundPolygon("round-diamond",n),this.generatePolygon("pentagon",Dn(5,0)),this.generateRoundPolygon("round-pentagon",Dn(5,0)),this.generatePolygon("hexagon",Dn(6,0)),this.generateRoundPolygon("round-hexagon",Dn(6,0)),this.generatePolygon("heptagon",Dn(7,0)),this.generateRoundPolygon("round-heptagon",Dn(7,0)),this.generatePolygon("octagon",Dn(8,0)),this.generateRoundPolygon("round-octagon",Dn(8,0));var r=new Array(20),a=An(5,0),i=An(5,Math.PI/5),o=.5*(3-Math.sqrt(5));o*=1.57;for(var s=0;s<i.length/2;s++)i[2*s]*=o,i[2*s+1]*=o;for(s=0;s<5;s++)r[4*s]=a[2*s],r[4*s+1]=a[2*s+1],r[4*s+2]=i[2*s],r[4*s+3]=i[2*s+1];r=_n(r),this.generatePolygon("star",r),this.generatePolygon("vee",[-1,-1,0,-.333,1,-1,0,1]),this.generatePolygon("rhomboid",[-1,-1,.333,-1,1,1,-.333,1]),this.generatePolygon("right-rhomboid",[-.333,-1,1,-1,.333,1,-1,1]),this.nodeShapes.concavehexagon=this.generatePolygon("concave-hexagon",[-1,-.95,-.75,0,-1,.95,1,.95,.75,0,1,-.95]);var l=[-1,-1,.25,-1,1,0,.25,1,-1,1];this.generatePolygon("tag",l),this.generateRoundPolygon("round-tag",l),e.makePolygon=function(e){var n,r="polygon-"+e.join("$");return(n=this[r])?n:t.generatePolygon(r,e)}};var ad={timeToRender:function(){return this.redrawTotalTime/this.redrawCount},redraw:function(e){e=e||ut();var t=this;void 0===t.averageRedrawTime&&(t.averageRedrawTime=0),void 0===t.lastRedrawTime&&(t.lastRedrawTime=0),void 0===t.lastDrawTime&&(t.lastDrawTime=0),t.requestedFrame=!0,t.renderOptions=e},beforeRender:function(e,t){if(!this.destroyed){null==t&&rt("Priority is not optional for beforeRender");var n=this.beforeRenderCallbacks;n.push({fn:e,priority:t}),n.sort(function(e,t){return t.priority-e.priority})}}},id=function(e,t,n){for(var r=e.beforeRenderCallbacks,a=0;a<r.length;a++)r[a].fn(t,n)};ad.startRenderLoop=function(){var e=this,t=e.cy;if(!e.renderLoopStarted){e.renderLoopStarted=!0;var n=function(r){if(!e.destroyed){if(t.batching());else if(e.requestedFrame&&!e.skipFrame){id(e,!0,r);var a=ze();e.render(e.renderOptions);var i=e.lastDrawTime=ze();void 0===e.averageRedrawTime&&(e.averageRedrawTime=i-a),void 0===e.redrawCount&&(e.redrawCount=0),e.redrawCount++,void 0===e.redrawTotalTime&&(e.redrawTotalTime=0);var o=i-a;e.redrawTotalTime+=o,e.lastRedrawTime=o,e.averageRedrawTime=e.averageRedrawTime/2+o/2,e.requestedFrame=!1}else id(e,!1,r);e.skipFrame=!1,Le(n)}};Le(n)}};var od=function(e){this.init(e)},sd=od.prototype;sd.clientFunctions=["redrawHint","render","renderTo","matchCanvasSize","nodeShapeImpl","arrowShapeImpl"],sd.init=function(e){var t=this;t.options=e,t.cy=e.cy;var n=t.container=e.cy.container(),r=t.cy.window();if(r){var a=r.document,i=a.head,o="__________cytoscape_stylesheet",s="__________cytoscape_container",l=null!=a.getElementById(o);if(n.className.indexOf(s)<0&&(n.className=(n.className||"")+" "+s),!l){var u=a.createElement("style");u.id=o,u.textContent="."+s+" { position: relative; }",i.insertBefore(u,i.children[0])}"static"===r.getComputedStyle(n).getPropertyValue("position")&&it("A Cytoscape container has style position:static and so can not use UI extensions properly")}t.selection=[void 0,void 0,void 0,void 0,0],t.bezierProjPcts=[.05,.225,.4,.5,.6,.775,.95],t.hoverData={down:null,last:null,downTime:null,triggerMode:null,dragging:!1,initialPan:[null,null],capture:!1},t.dragData={possibleDragElements:[]},t.touchData={start:null,capture:!1,startPosition:[null,null,null,null,null,null],singleTouchStartTime:null,singleTouchMoved:!0,now:[null,null,null,null,null,null],earlier:[null,null,null,null,null,null]},t.redraws=0,t.showFps=e.showFps,t.debug=e.debug,t.webgl=e.webgl,t.hideEdgesOnViewport=e.hideEdgesOnViewport,t.textureOnViewport=e.textureOnViewport,t.wheelSensitivity=e.wheelSensitivity,t.motionBlurEnabled=e.motionBlur,t.forcedPixelRatio=Q(e.pixelRatio)?e.pixelRatio:null,t.motionBlur=e.motionBlur,t.motionBlurOpacity=e.motionBlurOpacity,t.motionBlurTransparency=1-t.motionBlurOpacity,t.motionBlurPxRatio=1,t.mbPxRBlurry=1,t.minMbLowQualFrames=4,t.fullQualityMb=!1,t.clearedForMotionBlur=[],t.desktopTapThreshold=e.desktopTapThreshold,t.desktopTapThreshold2=e.desktopTapThreshold*e.desktopTapThreshold,t.touchTapThreshold=e.touchTapThreshold,t.touchTapThreshold2=e.touchTapThreshold*e.touchTapThreshold,t.tapholdDuration=500,t.bindings=[],t.beforeRenderCallbacks=[],t.beforeRenderPriorities={animations:400,eleCalcs:300,eleTxrDeq:200,lyrTxrDeq:150,lyrTxrSkip:100},t.registerNodeShapes(),t.registerArrowShapes(),t.registerCalculationListeners()},sd.notify=function(e,t){var n=this,r=n.cy;this.destroyed||("init"!==e?"destroy"!==e?(("add"===e||"remove"===e||"move"===e&&r.hasCompoundNodes()||"load"===e||"zorder"===e||"mount"===e)&&n.invalidateCachedZSortedEles(),"viewport"===e&&n.redrawHint("select",!0),"gc"===e&&n.redrawHint("gc",!0),"load"!==e&&"resize"!==e&&"mount"!==e||(n.invalidateContainerClientCoordsCache(),n.matchCanvasSize(n.container)),n.redrawHint("eles",!0),n.redrawHint("drag",!0),this.startRenderLoop(),this.redraw()):n.destroy():n.load())},sd.destroy=function(){var e=this;e.destroyed=!0,e.cy.stopAnimationLoop();for(var t=0;t<e.bindings.length;t++){var n=e.bindings[t],r=n.target;(r.off||r.removeEventListener).apply(r,n.args)}if(e.bindings=[],e.beforeRenderCallbacks=[],e.onUpdateEleCalcsFns=[],e.removeObserver&&e.removeObserver.disconnect(),e.styleObserver&&e.styleObserver.disconnect(),e.resizeObserver&&e.resizeObserver.disconnect(),e.labelCalcDiv)try{document.body.removeChild(e.labelCalcDiv)}catch(a){}},sd.isHeadless=function(){return!1},[pc,ed,td,nd,rd,ad].forEach(function(e){be(sd,e)});var ld=1e3/60,ud=function(e){return function(){var t=this,n=this.renderer;if(!t.dequeueingSetup){t.dequeueingSetup=!0;var r=Me(function(){n.redrawHint("eles",!0),n.redrawHint("drag",!0),n.redraw()},e.deqRedrawThreshold),a=e.priority||nt;n.beforeRender(function(a,i){var o=ze(),s=n.averageRedrawTime,l=n.lastRedrawTime,u=[],c=n.cy.extent(),d=n.getPixelRatio();for(a||n.flushRenderedStyleQueue();;){var h=ze(),f=h-o,p=h-i;if(l<ld){var v=ld-(a?s:0);if(p>=e.deqFastCost*v)break}else if(a){if(f>=e.deqCost*l||f>=e.deqAvgCost*s)break}else if(p>=e.deqNoDrawCost*ld)break;var g=e.deq(t,d,c);if(!(g.length>0))break;for(var y=0;y<g.length;y++)u.push(g[y])}u.length>0&&(e.onDeqd(t,u),!a&&e.shouldRedraw(t,u,d,c)&&r())},a(t))}}},cd=function(){return i(function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:et;a(this,e),this.idsByKey=new vt,this.keyForId=new vt,this.cachesByLvl=new vt,this.lvls=[],this.getKey=t,this.doesEleInvalidateKey=n},[{key:"getIdsFor",value:function(e){null==e&&rt("Can not get id list for null key");var t=this.idsByKey,n=this.idsByKey.get(e);return n||(n=new yt,t.set(e,n)),n}},{key:"addIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).add(t)}},{key:"deleteIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).delete(t)}},{key:"getNumberOfIdsForKey",value:function(e){return null==e?0:this.getIdsFor(e).size}},{key:"updateKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t),r=this.getKey(e);this.deleteIdForKey(n,t),this.addIdForKey(r,t),this.keyForId.set(t,r)}},{key:"deleteKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteIdForKey(n,t),this.keyForId.delete(t)}},{key:"keyHasChangedFor",value:function(e){var t=e.id();return this.keyForId.get(t)!==this.getKey(e)}},{key:"isInvalid",value:function(e){return this.keyHasChangedFor(e)||this.doesEleInvalidateKey(e)}},{key:"getCachesAt",value:function(e){var t=this.cachesByLvl,n=this.lvls,r=t.get(e);return r||(r=new vt,t.set(e,r),n.push(e)),r}},{key:"getCache",value:function(e,t){return this.getCachesAt(t).get(e)}},{key:"get",value:function(e,t){var n=this.getKey(e),r=this.getCache(n,t);return null!=r&&this.updateKeyMappingFor(e),r}},{key:"getForCachedKey",value:function(e,t){var n=this.keyForId.get(e.id());return this.getCache(n,t)}},{key:"hasCache",value:function(e,t){return this.getCachesAt(t).has(e)}},{key:"has",value:function(e,t){var n=this.getKey(e);return this.hasCache(n,t)}},{key:"setCache",value:function(e,t,n){n.key=e,this.getCachesAt(t).set(e,n)}},{key:"set",value:function(e,t,n){var r=this.getKey(e);this.setCache(r,t,n),this.updateKeyMappingFor(e)}},{key:"deleteCache",value:function(e,t){this.getCachesAt(t).delete(e)}},{key:"delete",value:function(e,t){var n=this.getKey(e);this.deleteCache(n,t)}},{key:"invalidateKey",value:function(e){var t=this;this.lvls.forEach(function(n){return t.deleteCache(e,n)})}},{key:"invalidate",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteKeyMappingFor(e);var r=this.doesEleInvalidateKey(e);return r&&this.invalidateKey(n),r||0===this.getNumberOfIdsForKey(n)}}])}(),dd=7.99,hd={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},fd=ct({getKey:null,doesEleInvalidateKey:et,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:Je,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),pd=function(e,t){var n=this;n.renderer=e,n.onDequeues=[];var r=fd(t);be(n,r),n.lookup=new cd(r.getKey,r.doesEleInvalidateKey),n.setupDequeueing()},vd=pd.prototype;vd.reasons=hd,vd.getTextureQueue=function(e){var t=this;return t.eleImgCaches=t.eleImgCaches||{},t.eleImgCaches[e]=t.eleImgCaches[e]||[]},vd.getRetiredTextureQueue=function(e){var t=this.eleImgCaches.retired=this.eleImgCaches.retired||{};return t[e]=t[e]||[]},vd.getElementQueue=function(){return this.eleCacheQueue=this.eleCacheQueue||new Bt(function(e,t){return t.reqs-e.reqs})},vd.getElementKeyToQueue=function(){return this.eleKeyToCacheQueue=this.eleKeyToCacheQueue||{}},vd.getElement=function(e,t,n,r,a){var i=this,o=this.renderer,s=o.cy.zoom(),l=this.lookup;if(!t||0===t.w||0===t.h||isNaN(t.w)||isNaN(t.h)||!e.visible()||e.removed())return null;if(!i.allowEdgeTxrCaching&&e.isEdge()||!i.allowParentTxrCaching&&e.isParent())return null;if(null==r&&(r=Math.ceil(Ut(s*n))),r<-4)r=-4;else if(s>=7.99||r>3)return null;var u=Math.pow(2,r),c=t.h*u,d=t.w*u,h=o.eleTextBiggerThanMin(e,u);if(!this.isVisible(e,h))return null;var f,p=l.get(e,r);if(p&&p.invalidated&&(p.invalidated=!1,p.texture.invalidatedWidth-=p.width),p)return p;if(f=c<=25?25:c<=50?50:50*Math.ceil(c/50),c>1024||d>1024)return null;var v=i.getTextureQueue(f),g=v[v.length-2],y=function(){return i.recycleTexture(f,d)||i.addTexture(f,d)};g||(g=v[v.length-1]),g||(g=y()),g.width-g.usedWidth<d&&(g=y());for(var m,b=function(e){return e&&e.scaledLabelShown===h},x=a&&a===hd.dequeue,w=a&&a===hd.highQuality,E=a&&a===hd.downscale,k=r+1;k<=3;k++){var T=l.get(e,k);if(T){m=T;break}}var C=m&&m.level===r+1?m:null,P=function(){g.context.drawImage(C.texture.canvas,C.x,0,C.width,C.height,g.usedWidth,0,d,c)};if(g.context.setTransform(1,0,0,1,0,0),g.context.clearRect(g.usedWidth,0,d,f),b(C))P();else if(b(m)){if(!w)return i.queueElement(e,m.level-1),m;for(var S=m.level;S>r;S--)C=i.getElement(e,t,n,S,hd.downscale);P()}else{var B;if(!x&&!w&&!E)for(var D=r-1;D>=-4;D--){var _=l.get(e,D);if(_){B=_;break}}if(b(B))return i.queueElement(e,r),B;g.context.translate(g.usedWidth,0),g.context.scale(u,u),this.drawElement(g.context,e,t,h,!1),g.context.scale(1/u,1/u),g.context.translate(-g.usedWidth,0)}return p={x:g.usedWidth,texture:g,level:r,scale:u,width:d,height:c,scaledLabelShown:h},g.usedWidth+=Math.ceil(d+8),g.eleCaches.push(p),l.set(e,r,p),i.checkTextureFullness(g),p},vd.invalidateElements=function(e){for(var t=0;t<e.length;t++)this.invalidateElement(e[t])},vd.invalidateElement=function(e){var t=this,n=t.lookup,r=[];if(n.isInvalid(e)){for(var a=-4;a<=3;a++){var i=n.getForCachedKey(e,a);i&&r.push(i)}if(n.invalidate(e))for(var o=0;o<r.length;o++){var s=r[o],l=s.texture;l.invalidatedWidth+=s.width,s.invalidated=!0,t.checkTextureUtility(l)}t.removeFromQueue(e)}},vd.checkTextureUtility=function(e){e.invalidatedWidth>=.2*e.width&&this.retireTexture(e)},vd.checkTextureFullness=function(e){var t=this.getTextureQueue(e.height);e.usedWidth/e.width>.8&&e.fullnessChecks>=10?dt(t,e):e.fullnessChecks++},vd.retireTexture=function(e){var t=e.height,n=this.getTextureQueue(t),r=this.lookup;dt(n,e),e.retired=!0;for(var a=e.eleCaches,i=0;i<a.length;i++){var o=a[i];r.deleteCache(o.key,o.level)}ht(a),this.getRetiredTextureQueue(t).push(e)},vd.addTexture=function(e,t){var n={};return this.getTextureQueue(e).push(n),n.eleCaches=[],n.height=e,n.width=Math.max(1024,t),n.usedWidth=0,n.invalidatedWidth=0,n.fullnessChecks=0,n.canvas=this.renderer.makeOffscreenCanvas(n.width,n.height),n.context=n.canvas.getContext("2d"),n},vd.recycleTexture=function(e,t){for(var n=this.getTextureQueue(e),r=this.getRetiredTextureQueue(e),a=0;a<r.length;a++){var i=r[a];if(i.width>=t)return i.retired=!1,i.usedWidth=0,i.invalidatedWidth=0,i.fullnessChecks=0,ht(i.eleCaches),i.context.setTransform(1,0,0,1,0,0),i.context.clearRect(0,0,i.width,i.height),dt(r,i),n.push(i),i}},vd.queueElement=function(e,t){var n=this.getElementQueue(),r=this.getElementKeyToQueue(),a=this.getKey(e),i=r[a];if(i)i.level=Math.max(i.level,t),i.eles.merge(e),i.reqs++,n.updateItem(i);else{var o={eles:e.spawn().merge(e),level:t,reqs:1,key:a};n.push(o),r[a]=o}},vd.dequeue=function(e){for(var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),a=[],i=t.lookup,o=0;o<1&&n.size()>0;o++){var s=n.pop(),l=s.key,u=s.eles[0],c=i.hasCache(u,s.level);if(r[l]=null,!c){a.push(s);var d=t.getBoundingBox(u);t.getElement(u,d,e,s.level,hd.dequeue)}}return a},vd.removeFromQueue=function(e){var t=this.getElementQueue(),n=this.getElementKeyToQueue(),r=this.getKey(e),a=n[r];null!=a&&(1===a.eles.length?(a.reqs=Qe,t.updateItem(a),t.pop(),n[r]=null):a.eles.unmerge(e))},vd.onDequeue=function(e){this.onDequeues.push(e)},vd.offDequeue=function(e){dt(this.onDequeues,e)},vd.setupDequeueing=ud({deqRedrawThreshold:100,deqCost:.15,deqAvgCost:.1,deqNoDrawCost:.9,deqFastCost:.9,deq:function(e,t,n){return e.dequeue(t,n)},onDeqd:function(e,t){for(var n=0;n<e.onDequeues.length;n++){(0,e.onDequeues[n])(t)}},shouldRedraw:function(e,t,n,r){for(var a=0;a<t.length;a++)for(var i=t[a].eles,o=0;o<i.length;o++){var s=i[o].boundingBox();if(sn(s,r))return!0}return!1},priority:function(e){return e.renderer.beforeRenderPriorities.eleTxrDeq}});var gd=function(e){var t=this,n=t.renderer=e,r=n.cy;t.layersByLevel={},t.firstGet=!0,t.lastInvalidationTime=ze()-500,t.skipping=!1,t.eleTxrDeqs=r.collection(),t.scheduleElementRefinement=Me(function(){t.refineElementTextures(t.eleTxrDeqs),t.eleTxrDeqs.unmerge(t.eleTxrDeqs)},50),n.beforeRender(function(e,n){n-t.lastInvalidationTime<=250?t.skipping=!0:t.skipping=!1},n.beforeRenderPriorities.lyrTxrSkip);t.layersQueue=new Bt(function(e,t){return t.reqs-e.reqs}),t.setupDequeueing()},yd=gd.prototype,md=0,bd=Math.pow(2,53)-1;yd.makeLayer=function(e,t){var n=Math.pow(2,t),r=Math.ceil(e.w*n),a=Math.ceil(e.h*n),i=this.renderer.makeOffscreenCanvas(r,a),o={id:md=++md%bd,bb:e,level:t,width:r,height:a,canvas:i,context:i.getContext("2d"),eles:[],elesQueue:[],reqs:0},s=o.context,l=-o.bb.x1,u=-o.bb.y1;return s.scale(n,n),s.translate(l,u),o},yd.getLayers=function(e,t,n){var r=this,a=r.renderer.cy.zoom(),i=r.firstGet;if(r.firstGet=!1,null==n)if((n=Math.ceil(Ut(a*t)))<-4)n=-4;else if(a>=3.99||n>2)return null;r.validateLayersElesOrdering(n,e);var o,s,l=r.layersByLevel,u=Math.pow(2,n),c=l[n]=l[n]||[];if(r.levelIsComplete(n,e))return c;!function(){var t=function(t){if(r.validateLayersElesOrdering(t,e),r.levelIsComplete(t,e))return s=l[t],!0},a=function(e){if(!s)for(var r=n+e;-4<=r&&r<=2&&!t(r);r+=e);};a(1),a(-1);for(var i=c.length-1;i>=0;i--){var o=c[i];o.invalid&&dt(c,o)}}();var d=function(t){var a=(t=t||{}).after;!function(){if(!o){o=en();for(var t=0;t<e.length;t++)tn(o,e[t].boundingBox())}}();var i=Math.ceil(o.w*u),s=Math.ceil(o.h*u);if(i>32767||s>32767)return null;if(i*s>16e6)return null;var l=r.makeLayer(o,n);if(null!=a){var d=c.indexOf(a)+1;c.splice(d,0,l)}else(void 0===t.insert||t.insert)&&c.unshift(l);return l};if(r.skipping&&!i)return null;for(var h=null,f=e.length/1,p=!i,v=0;v<e.length;v++){var g=e[v],y=g._private.rscratch,m=y.imgLayerCaches=y.imgLayerCaches||{},b=m[n];if(b)h=b;else{if((!h||h.eles.length>=f||!cn(h.bb,g.boundingBox()))&&!(h=d({insert:!0,after:h})))return null;s||p?r.queueLayer(h,g):r.drawEleInLayer(h,g,n,t),h.eles.push(g),m[n]=h}}return s||(p?null:c)},yd.getEleLevelForLayerLevel=function(e,t){return e},yd.drawEleInLayer=function(e,t,n,r){var a=this.renderer,i=e.context,o=t.boundingBox();0!==o.w&&0!==o.h&&t.visible()&&(n=this.getEleLevelForLayerLevel(n,r),a.setImgSmoothing(i,!1),a.drawCachedElement(i,t,null,null,n,true),a.setImgSmoothing(i,!0))},yd.levelIsComplete=function(e,t){var n=this.layersByLevel[e];if(!n||0===n.length)return!1;for(var r=0,a=0;a<n.length;a++){var i=n[a];if(i.reqs>0)return!1;if(i.invalid)return!1;r+=i.eles.length}return r===t.length},yd.validateLayersElesOrdering=function(e,t){var n=this.layersByLevel[e];if(n)for(var r=0;r<n.length;r++){for(var a=n[r],i=-1,o=0;o<t.length;o++)if(a.eles[0]===t[o]){i=o;break}if(i<0)this.invalidateLayer(a);else{var s=i;for(o=0;o<a.eles.length;o++)if(a.eles[o]!==t[s+o]){this.invalidateLayer(a);break}}}},yd.updateElementsInLayers=function(e,t){for(var n=te(e[0]),r=0;r<e.length;r++)for(var a=n?null:e[r],i=n?e[r]:e[r].ele,o=i._private.rscratch,s=o.imgLayerCaches=o.imgLayerCaches||{},l=-4;l<=2;l++){var u=s[l];u&&(a&&this.getEleLevelForLayerLevel(u.level)!==a.level||t(u,i,a))}},yd.haveLayers=function(){for(var e=!1,t=-4;t<=2;t++){var n=this.layersByLevel[t];if(n&&n.length>0){e=!0;break}}return e},yd.invalidateElements=function(e){var t=this;0!==e.length&&(t.lastInvalidationTime=ze(),0!==e.length&&t.haveLayers()&&t.updateElementsInLayers(e,function(e,n,r){t.invalidateLayer(e)}))},yd.invalidateLayer=function(e){if(this.lastInvalidationTime=ze(),!e.invalid){var t=e.level,n=e.eles,r=this.layersByLevel[t];dt(r,e),e.elesQueue=[],e.invalid=!0,e.replacement&&(e.replacement.invalid=!0);for(var a=0;a<n.length;a++){var i=n[a]._private.rscratch.imgLayerCaches;i&&(i[t]=null)}}},yd.refineElementTextures=function(e){var t=this;t.updateElementsInLayers(e,function(e,n,r){var a=e.replacement;if(a||((a=e.replacement=t.makeLayer(e.bb,e.level)).replaces=e,a.eles=e.eles),!a.reqs)for(var i=0;i<a.eles.length;i++)t.queueLayer(a,a.eles[i])})},yd.enqueueElementRefinement=function(e){this.eleTxrDeqs.merge(e),this.scheduleElementRefinement()},yd.queueLayer=function(e,t){var n=this.layersQueue,r=e.elesQueue,a=r.hasId=r.hasId||{};if(!e.replacement){if(t){if(a[t.id()])return;r.push(t),a[t.id()]=!0}e.reqs?(e.reqs++,n.updateItem(e)):(e.reqs=1,n.push(e))}},yd.dequeue=function(e){for(var t=this,n=t.layersQueue,r=[],a=0;a<1&&0!==n.size();){var i=n.peek();if(i.replacement)n.pop();else if(i.replaces&&i!==i.replaces.replacement)n.pop();else if(i.invalid)n.pop();else{var o=i.elesQueue.shift();o&&(t.drawEleInLayer(i,o,i.level,e),a++),0===r.length&&r.push(!0),0===i.elesQueue.length&&(n.pop(),i.reqs=0,i.replaces&&t.applyLayerReplacement(i),t.requestRedraw())}}return r},yd.applyLayerReplacement=function(e){var t=this.layersByLevel[e.level],n=e.replaces,r=t.indexOf(n);if(!(r<0||n.invalid)){t[r]=e;for(var a=0;a<e.eles.length;a++){var i=e.eles[a]._private,o=i.imgLayerCaches=i.imgLayerCaches||{};o&&(o[e.level]=e)}this.requestRedraw()}},yd.requestRedraw=Me(function(){var e=this.renderer;e.redrawHint("eles",!0),e.redrawHint("drag",!0),e.redraw()},100),yd.setupDequeueing=ud({deqRedrawThreshold:50,deqCost:.15,deqAvgCost:.1,deqNoDrawCost:.9,deqFastCost:.9,deq:function(e,t){return e.dequeue(t)},onDeqd:nt,shouldRedraw:Je,priority:function(e){return e.renderer.beforeRenderPriorities.lyrTxrDeq}});var xd,wd={};function Ed(e,t){for(var n=0;n<t.length;n++){var r=t[n];e.lineTo(r.x,r.y)}}function kd(e,t,n){for(var r,a=0;a<t.length;a++){var i=t[a];0===a&&(r=i),e.lineTo(i.x,i.y)}e.quadraticCurveTo(n.x,n.y,r.x,r.y)}function Td(e,t,n){e.beginPath&&e.beginPath();for(var r=t,a=0;a<r.length;a++){var i=r[a];e.lineTo(i.x,i.y)}var o=n,s=n[0];e.moveTo(s.x,s.y);for(a=1;a<o.length;a++){i=o[a];e.lineTo(i.x,i.y)}e.closePath&&e.closePath()}function Cd(e,t,n,r,a){e.beginPath&&e.beginPath(),e.arc(n,r,a,0,2*Math.PI,!1);var i=t,o=i[0];e.moveTo(o.x,o.y);for(var s=0;s<i.length;s++){var l=i[s];e.lineTo(l.x,l.y)}e.closePath&&e.closePath()}function Pd(e,t,n,r){e.arc(t,n,r,0,2*Math.PI,!1)}wd.arrowShapeImpl=function(e){return(xd||(xd={polygon:Ed,"triangle-backcurve":kd,"triangle-tee":Td,"circle-triangle":Cd,"triangle-cross":Td,circle:Pd}))[e]};var Sd={drawElement:function(e,t,n,r,a,i){t.isNode()?this.drawNode(e,t,n,r,a,i):this.drawEdge(e,t,n,r,a,i)},drawElementOverlay:function(e,t){t.isNode()?this.drawNodeOverlay(e,t):this.drawEdgeOverlay(e,t)},drawElementUnderlay:function(e,t){t.isNode()?this.drawNodeUnderlay(e,t):this.drawEdgeUnderlay(e,t)},drawCachedElementPortion:function(e,t,n,r,a,i,o,s){var l=this,u=n.getBoundingBox(t);if(0!==u.w&&0!==u.h){var c=n.getElement(t,u,r,a,i);if(null!=c){var d=s(l,t);if(0===d)return;var h,f,p,v,g,y,m=o(l,t),b=u.x1,x=u.y1,w=u.w,E=u.h;if(0!==m){var k=n.getRotationPoint(t);p=k.x,v=k.y,e.translate(p,v),e.rotate(m),(g=l.getImgSmoothing(e))||l.setImgSmoothing(e,!0);var T=n.getRotationOffset(t);h=T.x,f=T.y}else h=b,f=x;1!==d&&(y=e.globalAlpha,e.globalAlpha=y*d),e.drawImage(c.texture.canvas,c.x,0,c.width,c.height,h,f,w,E),1!==d&&(e.globalAlpha=y),0!==m&&(e.rotate(-m),e.translate(-p,-v),g||l.setImgSmoothing(e,!1))}else n.drawElement(e,t)}}},Bd=function(){return 0},Dd=function(e,t){return e.getTextAngle(t,null)},_d=function(e,t){return e.getTextAngle(t,"source")},Ad=function(e,t){return e.getTextAngle(t,"target")},Md=function(e,t){return t.effectiveOpacity()},Rd=function(e,t){return t.pstyle("text-opacity").pfValue*t.effectiveOpacity()};Sd.drawCachedElement=function(e,t,n,r,a,i){var o=this,s=o.data,l=s.eleTxrCache,u=s.lblTxrCache,c=s.slbTxrCache,d=s.tlbTxrCache,h=t.boundingBox(),f=!0===i?l.reasons.highQuality:null;if(0!==h.w&&0!==h.h&&t.visible()&&(!r||sn(h,r))){var p=t.isEdge(),v=t.element()._private.rscratch.badLine;o.drawElementUnderlay(e,t),o.drawCachedElementPortion(e,t,l,n,a,f,Bd,Md),p&&v||o.drawCachedElementPortion(e,t,u,n,a,f,Dd,Rd),p&&!v&&(o.drawCachedElementPortion(e,t,c,n,a,f,_d,Rd),o.drawCachedElementPortion(e,t,d,n,a,f,Ad,Rd)),o.drawElementOverlay(e,t)}},Sd.drawElements=function(e,t){for(var n=0;n<t.length;n++){var r=t[n];this.drawElement(e,r)}},Sd.drawCachedElements=function(e,t,n,r){for(var a=0;a<t.length;a++){var i=t[a];this.drawCachedElement(e,i,n,r)}},Sd.drawCachedNodes=function(e,t,n,r){for(var a=0;a<t.length;a++){var i=t[a];i.isNode()&&this.drawCachedElement(e,i,n,r)}},Sd.drawLayeredElements=function(e,t,n,r){var a=this.data.lyrTxrCache.getLayers(t,n);if(a)for(var i=0;i<a.length;i++){var o=a[i],s=o.bb;0!==s.w&&0!==s.h&&e.drawImage(o.canvas,s.x1,s.y1,s.w,s.h)}else this.drawCachedElements(e,t,n,r)};var Id={drawEdge:function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],o=this,s=t._private.rscratch;if((!i||t.visible())&&!s.badLine&&null!=s.allpts&&!isNaN(s.allpts[0])){var l;n&&(l=n,e.translate(-l.x1,-l.y1));var u=i?t.pstyle("opacity").value:1,c=i?t.pstyle("line-opacity").value:1,d=t.pstyle("curve-style").value,h=t.pstyle("line-style").value,f=t.pstyle("width").pfValue,p=t.pstyle("line-cap").value,v=t.pstyle("line-outline-width").value,g=t.pstyle("line-outline-color").value,y=u*c,m=u*c,b=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:y;"straight-triangle"===d?(o.eleStrokeStyle(e,t,n),o.drawEdgeTrianglePath(t,e,s.allpts)):(e.lineWidth=f,e.lineCap=p,o.eleStrokeStyle(e,t,n),o.drawEdgePath(t,e,s.allpts,h),e.lineCap="butt")},x=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:m;o.drawArrowheads(e,t,n)};if(e.lineJoin="round","yes"===t.pstyle("ghost").value){var w=t.pstyle("ghost-offset-x").pfValue,E=t.pstyle("ghost-offset-y").pfValue,k=t.pstyle("ghost-opacity").value,T=y*k;e.translate(w,E),b(T),x(T),e.translate(-w,-E)}else!function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:y;e.lineWidth=f+v,e.lineCap=p,v>0?(o.colorStrokeStyle(e,g[0],g[1],g[2],n),"straight-triangle"===d?o.drawEdgeTrianglePath(t,e,s.allpts):(o.drawEdgePath(t,e,s.allpts,h),e.lineCap="butt")):e.lineCap="butt"}();a&&o.drawEdgeUnderlay(e,t),b(),x(),a&&o.drawEdgeOverlay(e,t),o.drawElementText(e,t,null,r),n&&e.translate(l.x1,l.y1)}}},Nd=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n){if(n.visible()){var r=n.pstyle("".concat(e,"-opacity")).value;if(0!==r){var a=this,i=a.usePaths(),o=n._private.rscratch,s=2*n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-color")).value;t.lineWidth=s,"self"!==o.edgeType||i?t.lineCap="round":t.lineCap="butt",a.colorStrokeStyle(t,l[0],l[1],l[2],r),a.drawEdgePath(n,t,o.allpts,"solid")}}}};Id.drawEdgeOverlay=Nd("overlay"),Id.drawEdgeUnderlay=Nd("underlay"),Id.drawEdgePath=function(e,t,n,r){var a,i=e._private.rscratch,s=t,l=!1,u=this.usePaths(),c=e.pstyle("line-dash-pattern").pfValue,d=e.pstyle("line-dash-offset").pfValue;if(u){var h=n.join("$");i.pathCacheKey&&i.pathCacheKey===h?(a=t=i.pathCache,l=!0):(a=t=new Path2D,i.pathCacheKey=h,i.pathCache=a)}if(s.setLineDash)switch(r){case"dotted":s.setLineDash([1,1]);break;case"dashed":s.setLineDash(c),s.lineDashOffset=d;break;case"solid":s.setLineDash([])}if(!l&&!i.badLine)switch(t.beginPath&&t.beginPath(),t.moveTo(n[0],n[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var f=2;f+3<n.length;f+=4)t.quadraticCurveTo(n[f],n[f+1],n[f+2],n[f+3]);break;case"straight":case"haystack":for(var p=2;p+1<n.length;p+=2)t.lineTo(n[p],n[p+1]);break;case"segments":if(i.isRound){var v,g=o(i.roundCorners);try{for(g.s();!(v=g.n()).done;){Oc(t,v.value)}}catch(m){g.e(m)}finally{g.f()}t.lineTo(n[n.length-2],n[n.length-1])}else for(var y=2;y+1<n.length;y+=2)t.lineTo(n[y],n[y+1])}t=s,u?t.stroke(a):t.stroke(),t.setLineDash&&t.setLineDash([])},Id.drawEdgeTrianglePath=function(e,t,n){t.fillStyle=t.strokeStyle;for(var r=e.pstyle("width").pfValue,a=0;a+1<n.length;a+=2){var i=[n[a+2]-n[a],n[a+3]-n[a+1]],o=Math.sqrt(i[0]*i[0]+i[1]*i[1]),s=[i[1]/o,-i[0]/o],l=[s[0]*r/2,s[1]*r/2];t.beginPath(),t.moveTo(n[a]-l[0],n[a+1]-l[1]),t.lineTo(n[a]+l[0],n[a+1]+l[1]),t.lineTo(n[a+2],n[a+3]),t.closePath(),t.fill()}},Id.drawArrowheads=function(e,t,n){var r=t._private.rscratch,a="haystack"===r.edgeType;a||this.drawArrowhead(e,t,"source",r.arrowStartX,r.arrowStartY,r.srcArrowAngle,n),this.drawArrowhead(e,t,"mid-target",r.midX,r.midY,r.midtgtArrowAngle,n),this.drawArrowhead(e,t,"mid-source",r.midX,r.midY,r.midsrcArrowAngle,n),a||this.drawArrowhead(e,t,"target",r.arrowEndX,r.arrowEndY,r.tgtArrowAngle,n)},Id.drawArrowhead=function(e,t,n,r,a,i,o){if(!(isNaN(r)||null==r||isNaN(a)||null==a||isNaN(i)||null==i)){var s=this,l=t.pstyle(n+"-arrow-shape").value;if("none"!==l){var u="hollow"===t.pstyle(n+"-arrow-fill").value?"both":"filled",c=t.pstyle(n+"-arrow-fill").value,d=t.pstyle("width").pfValue,h=t.pstyle(n+"-arrow-width"),f="match-line"===h.value?d:h.pfValue;"%"===h.units&&(f*=d);var p=t.pstyle("opacity").value;void 0===o&&(o=p);var v=e.globalCompositeOperation;1===o&&"hollow"!==c||(e.globalCompositeOperation="destination-out",s.colorFillStyle(e,255,255,255,1),s.colorStrokeStyle(e,255,255,255,1),s.drawArrowShape(t,e,u,d,l,f,r,a,i),e.globalCompositeOperation=v);var g=t.pstyle(n+"-arrow-color").value;s.colorFillStyle(e,g[0],g[1],g[2],o),s.colorStrokeStyle(e,g[0],g[1],g[2],o),s.drawArrowShape(t,e,c,d,l,f,r,a,i)}}},Id.drawArrowShape=function(e,t,n,r,a,i,o,s,l){var u,c=this,d=this.usePaths()&&"triangle-cross"!==a,h=!1,f=t,p={x:o,y:s},v=e.pstyle("arrow-scale").value,g=this.getArrowWidth(r,v),y=c.arrowShapes[a];if(d){var m=c.arrowPathCache=c.arrowPathCache||[],b=Ue(a),x=m[b];null!=x?(u=t=x,h=!0):(u=t=new Path2D,m[b]=u)}h||(t.beginPath&&t.beginPath(),d?y.draw(t,1,0,{x:0,y:0},1):y.draw(t,g,l,p,r),t.closePath&&t.closePath()),t=f,d&&(t.translate(o,s),t.rotate(l),t.scale(g,g)),"filled"!==n&&"both"!==n||(d?t.fill(u):t.fill()),"hollow"!==n&&"both"!==n||(t.lineWidth=i/(d?g:1),t.lineJoin="miter",d?t.stroke(u):t.stroke()),d&&(t.scale(1/g,1/g),t.rotate(-l),t.translate(-o,-s))};var Ld={safeDrawImage:function(e,t,n,r,a,i,o,s,l,u){if(!(a<=0||i<=0||l<=0||u<=0))try{e.drawImage(t,n,r,a,i,o,s,l,u)}catch(c){it(c)}},drawInscribedImage:function(e,t,n,r,a){var i=this,o=n.position(),s=o.x,l=o.y,u=n.cy().style(),c=u.getIndexedStyle.bind(u),d=c(n,"background-fit","value",r),h=c(n,"background-repeat","value",r),f=n.width(),p=n.height(),v=2*n.padding(),g=f+("inner"===c(n,"background-width-relative-to","value",r)?0:v),y=p+("inner"===c(n,"background-height-relative-to","value",r)?0:v),m=n._private.rscratch,b="node"===c(n,"background-clip","value",r),x=c(n,"background-image-opacity","value",r)*a,w=c(n,"background-image-smoothing","value",r),E=n.pstyle("corner-radius").value;"auto"!==E&&(E=n.pstyle("corner-radius").pfValue);var k=t.width||t.cachedW,T=t.height||t.cachedH;null!=k&&null!=T||(document.body.appendChild(t),k=t.cachedW=t.width||t.offsetWidth,T=t.cachedH=t.height||t.offsetHeight,document.body.removeChild(t));var C=k,P=T;if("auto"!==c(n,"background-width","value",r)&&(C="%"===c(n,"background-width","units",r)?c(n,"background-width","pfValue",r)*g:c(n,"background-width","pfValue",r)),"auto"!==c(n,"background-height","value",r)&&(P="%"===c(n,"background-height","units",r)?c(n,"background-height","pfValue",r)*y:c(n,"background-height","pfValue",r)),0!==C&&0!==P){if("contain"===d)C*=S=Math.min(g/C,y/P),P*=S;else if("cover"===d){var S;C*=S=Math.max(g/C,y/P),P*=S}var B=s-g/2,D=c(n,"background-position-x","units",r),_=c(n,"background-position-x","pfValue",r);B+="%"===D?(g-C)*_:_;var A=c(n,"background-offset-x","units",r),M=c(n,"background-offset-x","pfValue",r);B+="%"===A?(g-C)*M:M;var R=l-y/2,I=c(n,"background-position-y","units",r),N=c(n,"background-position-y","pfValue",r);R+="%"===I?(y-P)*N:N;var L=c(n,"background-offset-y","units",r),z=c(n,"background-offset-y","pfValue",r);R+="%"===L?(y-P)*z:z,m.pathCache&&(B-=s,R-=l,s=0,l=0);var O=e.globalAlpha;e.globalAlpha=x;var V=i.getImgSmoothing(e),F=!1;if("no"===w&&V?(i.setImgSmoothing(e,!1),F=!0):"yes"!==w||V||(i.setImgSmoothing(e,!0),F=!0),"no-repeat"===h)b&&(e.save(),m.pathCache?e.clip(m.pathCache):(i.nodeShapes[i.getNodeShape(n)].draw(e,s,l,g,y,E,m),e.clip())),i.safeDrawImage(e,t,0,0,k,T,B,R,C,P),b&&e.restore();else{var j=e.createPattern(t,h);e.fillStyle=j,i.nodeShapes[i.getNodeShape(n)].draw(e,s,l,g,y,E,m),e.translate(B,R),e.fill(),e.translate(-B,-R)}e.globalAlpha=O,F&&i.setImgSmoothing(e,V)}}},zd={};function Od(e,t,n,r,a){var i=arguments.length>5&&void 0!==arguments[5]?arguments[5]:5,o=arguments.length>6?arguments[6]:void 0;e.beginPath(),e.moveTo(t+i,n),e.lineTo(t+r-i,n),e.quadraticCurveTo(t+r,n,t+r,n+i),e.lineTo(t+r,n+a-i),e.quadraticCurveTo(t+r,n+a,t+r-i,n+a),e.lineTo(t+i,n+a),e.quadraticCurveTo(t,n+a,t,n+a-i),e.lineTo(t,n+i),e.quadraticCurveTo(t,n,t+i,n),e.closePath(),o?e.stroke():e.fill()}zd.eleTextBiggerThanMin=function(e,t){if(!t){var n=e.cy().zoom(),r=this.getPixelRatio(),a=Math.ceil(Ut(n*r));t=Math.pow(2,a)}return!(e.pstyle("font-size").pfValue*t<e.pstyle("min-zoomed-font-size").pfValue)},zd.drawElementText=function(e,t,n,r,a){var i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],o=this;if(null==r){if(i&&!o.eleTextBiggerThanMin(t))return}else if(!1===r)return;if(t.isNode()){var s=t.pstyle("label");if(!s||!s.value)return;var l=o.getLabelJustification(t);e.textAlign=l,e.textBaseline="bottom"}else{var u=t.element()._private.rscratch.badLine,c=t.pstyle("label"),d=t.pstyle("source-label"),h=t.pstyle("target-label");if(u||(!c||!c.value)&&(!d||!d.value)&&(!h||!h.value))return;e.textAlign="center",e.textBaseline="bottom"}var f,p=!n;n&&(f=n,e.translate(-f.x1,-f.y1)),null==a?(o.drawText(e,t,null,p,i),t.isEdge()&&(o.drawText(e,t,"source",p,i),o.drawText(e,t,"target",p,i))):o.drawText(e,t,a,p,i),n&&e.translate(f.x1,f.y1)},zd.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var n=0;n<this.fontCaches.length;n++)if((t=this.fontCaches[n]).context===e)return t;return t={context:e},this.fontCaches.push(t),t},zd.setupTextStyle=function(e,t){var n=!(arguments.length>2&&void 0!==arguments[2])||arguments[2],r=t.pstyle("font-style").strValue,a=t.pstyle("font-size").pfValue+"px",i=t.pstyle("font-family").strValue,o=t.pstyle("font-weight").strValue,s=n?t.effectiveOpacity()*t.pstyle("text-opacity").value:1,l=t.pstyle("text-outline-opacity").value*s,u=t.pstyle("color").value,c=t.pstyle("text-outline-color").value;e.font=r+" "+o+" "+a+" "+i,e.lineJoin="round",this.colorFillStyle(e,u[0],u[1],u[2],s),this.colorStrokeStyle(e,c[0],c[1],c[2],l)},zd.getTextAngle=function(e,t){var n,r=e._private.rscratch,a=t?t+"-":"",i=e.pstyle(a+"text-rotation");if("autorotate"===i.strValue){var o=ft(r,"labelAngle",t);n=e.isEdge()?o:0}else n="none"===i.strValue?0:i.pfValue;return n},zd.drawText=function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=t._private.rscratch,o=a?t.effectiveOpacity():1;if(!a||0!==o&&0!==t.pstyle("text-opacity").value){"main"===n&&(n=null);var s,l,u=ft(i,"labelX",n),c=ft(i,"labelY",n),d=this.getLabelText(t,n);if(null!=d&&""!==d&&!isNaN(u)&&!isNaN(c)){this.setupTextStyle(e,t,a);var h,f=n?n+"-":"",p=ft(i,"labelWidth",n),v=ft(i,"labelHeight",n),g=t.pstyle(f+"text-margin-x").pfValue,y=t.pstyle(f+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle("text-halign").value,x=t.pstyle("text-valign").value;switch(m&&(b="center",x="center"),u+=g,c+=y,0!==(h=r?this.getTextAngle(t,n):0)&&(s=u,l=c,e.translate(s,l),e.rotate(h),u=0,c=0),x){case"top":break;case"center":c+=v/2;break;case"bottom":c+=v}var w=t.pstyle("text-background-opacity").value,E=t.pstyle("text-border-opacity").value,k=t.pstyle("text-border-width").pfValue,T=t.pstyle("text-background-padding").pfValue,C=0===t.pstyle("text-background-shape").strValue.indexOf("round");if(w>0||k>0&&E>0){var P=u-T;switch(b){case"left":P-=p;break;case"center":P-=p/2}var S=c-v-T,B=p+2*T,D=v+2*T;if(w>0){var _=e.fillStyle,A=t.pstyle("text-background-color").value;e.fillStyle="rgba("+A[0]+","+A[1]+","+A[2]+","+w*o+")",C?Od(e,P,S,B,D,2):e.fillRect(P,S,B,D),e.fillStyle=_}if(k>0&&E>0){var M=e.strokeStyle,R=e.lineWidth,I=t.pstyle("text-border-color").value,N=t.pstyle("text-border-style").value;if(e.strokeStyle="rgba("+I[0]+","+I[1]+","+I[2]+","+E*o+")",e.lineWidth=k,e.setLineDash)switch(N){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"double":e.lineWidth=k/4,e.setLineDash([]);break;case"solid":e.setLineDash([])}if(C?Od(e,P,S,B,D,2,"stroke"):e.strokeRect(P,S,B,D),"double"===N){var L=k/2;C?Od(e,P+L,S+L,B-2*L,D-2*L,2,"stroke"):e.strokeRect(P+L,S+L,B-2*L,D-2*L)}e.setLineDash&&e.setLineDash([]),e.lineWidth=R,e.strokeStyle=M}}var z=2*t.pstyle("text-outline-width").pfValue;if(z>0&&(e.lineWidth=z),"wrap"===t.pstyle("text-wrap").value){var O=ft(i,"labelWrapCachedLines",n),V=ft(i,"labelLineHeight",n),F=p/2,j=this.getLabelJustification(t);switch("auto"===j||("left"===b?"left"===j?u+=-p:"center"===j&&(u+=-F):"center"===b?"left"===j?u+=-F:"right"===j&&(u+=F):"right"===b&&("center"===j?u+=F:"right"===j&&(u+=p))),x){case"top":case"center":case"bottom":c-=(O.length-1)*V}for(var X=0;X<O.length;X++)z>0&&e.strokeText(O[X],u,c),e.fillText(O[X],u,c),c+=V}else z>0&&e.strokeText(d,u,c),e.fillText(d,u,c);0!==h&&(e.rotate(-h),e.translate(-s,-l))}}};var Vd={drawNode:function(e,t,n){var r,a,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],l=this,u=t._private,c=u.rscratch,d=t.position();if(Q(d.x)&&Q(d.y)&&(!s||t.visible())){var h,f,p=s?t.effectiveOpacity():1,v=l.usePaths(),g=!1,y=t.padding();r=t.width()+2*y,a=t.height()+2*y,n&&(f=n,e.translate(-f.x1,-f.y1));for(var m=t.pstyle("background-image").value,b=new Array(m.length),x=new Array(m.length),w=0,E=0;E<m.length;E++){var k=m[E];if(b[E]=null!=k&&"none"!==k){var T=t.cy().style().getIndexedStyle(t,"background-image-crossorigin","value",E);w++,x[E]=l.getCachedImage(k,T,function(){u.backgroundTimestamp=Date.now(),t.emitAndNotify("background")})}}var C=t.pstyle("background-blacken").value,P=t.pstyle("border-width").pfValue,S=t.pstyle("background-opacity").value*p,B=t.pstyle("border-color").value,D=t.pstyle("border-style").value,_=t.pstyle("border-join").value,A=t.pstyle("border-cap").value,M=t.pstyle("border-position").value,R=t.pstyle("border-dash-pattern").pfValue,I=t.pstyle("border-dash-offset").pfValue,N=t.pstyle("border-opacity").value*p,L=t.pstyle("outline-width").pfValue,z=t.pstyle("outline-color").value,O=t.pstyle("outline-style").value,V=t.pstyle("outline-opacity").value*p,F=t.pstyle("outline-offset").value,j=t.pstyle("corner-radius").value;"auto"!==j&&(j=t.pstyle("corner-radius").pfValue);var X=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:S;l.eleFillStyle(e,t,n)},q=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:N;l.colorStrokeStyle(e,B[0],B[1],B[2],t)},Y=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:V;l.colorStrokeStyle(e,z[0],z[1],z[2],t)},W=function(e,t,n,r){var a,i=l.nodePathCache=l.nodePathCache||[],o=He("polygon"===n?n+","+r.join(","):n,""+t,""+e,""+j),s=i[o],u=!1;return null!=s?(a=s,u=!0,c.pathCache=a):(a=new Path2D,i[o]=c.pathCache=a),{path:a,cacheHit:u}},U=t.pstyle("shape").strValue,H=t.pstyle("shape-polygon-points").pfValue;if(v){e.translate(d.x,d.y);var K=W(r,a,U,H);h=K.path,g=K.cacheHit}var G=function(){if(!g){var n=d;v&&(n={x:0,y:0}),l.nodeShapes[l.getNodeShape(t)].draw(h||e,n.x,n.y,r,a,j,c)}v?e.fill(h):e.fill()},Z=function(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:p,r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=u.backgrounding,i=0,o=0;o<x.length;o++){var s=t.cy().style().getIndexedStyle(t,"background-image-containment","value",o);r&&"over"===s||!r&&"inside"===s?i++:b[o]&&x[o].complete&&!x[o].error&&(i++,l.drawInscribedImage(e,x[o],t,o,n))}u.backgrounding=!(i===w),a!==u.backgrounding&&t.updateStyle(!1)},$=function(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;l.hasPie(t)&&(l.drawPie(e,t,i),n&&(v||l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,j,c)))},J=function(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;l.hasStripe(t)&&(e.save(),v?e.clip(c.pathCache):(l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,j,c),e.clip()),l.drawStripe(e,t,i),e.restore(),n&&(v||l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,j,c)))},ee=function(){var t=(C>0?C:-C)*(arguments.length>0&&void 0!==arguments[0]?arguments[0]:p),n=C>0?0:255;0!==C&&(l.colorFillStyle(e,n,n,n,t),v?e.fill(h):e.fill())},te=function(){if(P>0){if(e.lineWidth=P,e.lineCap=A,e.lineJoin=_,e.setLineDash)switch(D){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash(R),e.lineDashOffset=I;break;case"solid":case"double":e.setLineDash([])}if("center"!==M){if(e.save(),e.lineWidth*=2,"inside"===M)v?e.clip(h):e.clip();else{var t=new Path2D;t.rect(-r/2-P,-a/2-P,r+2*P,a+2*P),t.addPath(h),e.clip(t,"evenodd")}v?e.stroke(h):e.stroke(),e.restore()}else v?e.stroke(h):e.stroke();if("double"===D){e.lineWidth=P/3;var n=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",v?e.stroke(h):e.stroke(),e.globalCompositeOperation=n}e.setLineDash&&e.setLineDash([])}},ne=function(){if(L>0){if(e.lineWidth=L,e.lineCap="butt",e.setLineDash)switch(O){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}var n=d;v&&(n={x:0,y:0});var i=l.getNodeShape(t),o=P;"inside"===M&&(o=0),"outside"===M&&(o*=2);var s,u=(r+o+(L+F))/r,c=(a+o+(L+F))/a,h=r*u,f=a*c,p=l.nodeShapes[i].points;if(v)s=W(h,f,i,p).path;if("ellipse"===i)l.drawEllipsePath(s||e,n.x,n.y,h,f);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(i)){var g=0,y=0,m=0;"round-diamond"===i?g=1.4*(o+F+L):"round-heptagon"===i?(g=1.075*(o+F+L),m=-(o/2+F+L)/35):"round-hexagon"===i?g=1.12*(o+F+L):"round-pentagon"===i?(g=1.13*(o+F+L),m=-(o/2+F+L)/15):"round-tag"===i?(g=1.12*(o+F+L),y=.07*(o/2+L+F)):"round-triangle"===i&&(g=(o+F+L)*(Math.PI/2),m=-(o+F/2+L)/Math.PI),0!==g&&(h=r*(u=(r+g)/r),["round-hexagon","round-tag"].includes(i)||(f=a*(c=(a+g)/a)));for(var b=h/2,x=f/2,w=(j="auto"===j?Rn(h,f):j)+(o+L+F)/2,E=new Array(p.length/2),k=new Array(p.length/2),T=0;T<p.length/2;T++)E[T]={x:n.x+y+b*p[2*T],y:n.y+m+x*p[2*T+1]};var C,S,B,D,_=E.length;for(S=E[_-1],C=0;C<_;C++)B=E[C%_],D=E[(C+1)%_],k[C]=Vc(S,B,D,w),S=B,B=D;l.drawRoundPolygonPath(s||e,n.x+y,n.y+m,r*u,a*c,p,k)}else if(["roundrectangle","round-rectangle"].includes(i))j="auto"===j?Mn(h,f):j,l.drawRoundRectanglePath(s||e,n.x,n.y,h,f,j+(o+L+F)/2);else if(["cutrectangle","cut-rectangle"].includes(i))j="auto"===j?8:j,l.drawCutRectanglePath(s||e,n.x,n.y,h,f,null,j+(o+L+F)/4);else if(["bottomroundrectangle","bottom-round-rectangle"].includes(i))j="auto"===j?Mn(h,f):j,l.drawBottomRoundRectanglePath(s||e,n.x,n.y,h,f,j+(o+L+F)/2);else if("barrel"===i)l.drawBarrelPath(s||e,n.x,n.y,h,f);else if(i.startsWith("polygon")||["rhomboid","right-rhomboid","round-tag","tag","vee"].includes(i)){p=xn(wn(p,(o+L+F)/r)),l.drawPolygonPath(s||e,n.x,n.y,r,a,p)}else{p=xn(wn(p,-((o+L+F)/r))),l.drawPolygonPath(s||e,n.x,n.y,r,a,p)}if(v?e.stroke(s):e.stroke(),"double"===O){e.lineWidth=o/3;var A=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",v?e.stroke(s):e.stroke(),e.globalCompositeOperation=A}e.setLineDash&&e.setLineDash([])}};if("yes"===t.pstyle("ghost").value){var re=t.pstyle("ghost-offset-x").pfValue,ae=t.pstyle("ghost-offset-y").pfValue,ie=t.pstyle("ghost-opacity").value,oe=ie*p;e.translate(re,ae),Y(),ne(),X(ie*S),G(),Z(oe,!0),q(ie*N),te(),$(0!==C||0!==P),J(0!==C||0!==P),Z(oe,!1),ee(oe),e.translate(-re,-ae)}v&&e.translate(-d.x,-d.y),o&&l.drawNodeUnderlay(e,t,d,r,a),v&&e.translate(d.x,d.y),Y(),ne(),X(),G(),Z(p,!0),q(),te(),$(0!==C||0!==P),J(0!==C||0!==P),Z(p,!1),ee(),v&&e.translate(-d.x,-d.y),l.drawElementText(e,t,null,i),o&&l.drawNodeOverlay(e,t,d,r,a),n&&e.translate(f.x1,f.y1)}}},Fd=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n,r,a,i){if(n.visible()){var o=n.pstyle("".concat(e,"-padding")).pfValue,s=n.pstyle("".concat(e,"-opacity")).value,l=n.pstyle("".concat(e,"-color")).value,u=n.pstyle("".concat(e,"-shape")).value,c=n.pstyle("".concat(e,"-corner-radius")).value;if(s>0){if(r=r||n.position(),null==a||null==i){var d=n.padding();a=n.width()+2*d,i=n.height()+2*d}this.colorFillStyle(t,l[0],l[1],l[2],s),this.nodeShapes[u].draw(t,r.x,r.y,a+2*o,i+2*o,c),t.fill()}}}};Vd.drawNodeOverlay=Fd("overlay"),Vd.drawNodeUnderlay=Fd("underlay"),Vd.hasPie=function(e){return(e=e[0])._private.hasPie},Vd.hasStripe=function(e){return(e=e[0])._private.hasStripe},Vd.drawPie=function(e,t,n,r){t=t[0],r=r||t.position();var a,i=t.cy().style(),o=t.pstyle("pie-size"),s=t.pstyle("pie-hole"),l=t.pstyle("pie-start-angle").pfValue,u=r.x,c=r.y,d=t.width(),h=t.height(),f=Math.min(d,h)/2,p=0;if(this.usePaths()&&(u=0,c=0),"%"===o.units?f*=o.pfValue:void 0!==o.pfValue&&(f=o.pfValue/2),"%"===s.units?a=f*s.pfValue:void 0!==s.pfValue&&(a=s.pfValue/2),!(a>=f))for(var v=1;v<=i.pieBackgroundN;v++){var g=t.pstyle("pie-"+v+"-background-size").value,y=t.pstyle("pie-"+v+"-background-color").value,m=t.pstyle("pie-"+v+"-background-opacity").value*n,b=g/100;b+p>1&&(b=1-p);var x=1.5*Math.PI+2*Math.PI*p,w=(x+=l)+2*Math.PI*b;0===g||p>=1||p+b>1||(0===a?(e.beginPath(),e.moveTo(u,c),e.arc(u,c,f,x,w),e.closePath()):(e.beginPath(),e.arc(u,c,f,x,w),e.arc(u,c,a,w,x,!0),e.closePath()),this.colorFillStyle(e,y[0],y[1],y[2],m),e.fill(),p+=b)}},Vd.drawStripe=function(e,t,n,r){t=t[0],r=r||t.position();var a=t.cy().style(),i=r.x,o=r.y,s=t.width(),l=t.height(),u=0,c=this.usePaths();e.save();var d=t.pstyle("stripe-direction").value,h=t.pstyle("stripe-size");switch(d){case"vertical":break;case"righward":e.rotate(-Math.PI/2)}var f=s,p=l;"%"===h.units?(f*=h.pfValue,p*=h.pfValue):void 0!==h.pfValue&&(f=h.pfValue,p=h.pfValue),c&&(i=0,o=0),o-=f/2,i-=p/2;for(var v=1;v<=a.stripeBackgroundN;v++){var g=t.pstyle("stripe-"+v+"-background-size").value,y=t.pstyle("stripe-"+v+"-background-color").value,m=t.pstyle("stripe-"+v+"-background-opacity").value*n,b=g/100;b+u>1&&(b=1-u),0===g||u>=1||u+b>1||(e.beginPath(),e.rect(i,o+p*u,f,p*b),e.closePath(),this.colorFillStyle(e,y[0],y[1],y[2],m),e.fill(),u+=b)}e.restore()};var jd,Xd={};function qd(e,t,n){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS))throw new Error(e.getShaderInfoLog(r));return r}function Yd(e,t,n){void 0===n&&(n=t);var r=e.makeOffscreenCanvas(t,n),a=r.context=r.getContext("2d");return r.clear=function(){return a.clearRect(0,0,r.width,r.height)},r.clear(),r}function Wd(e){var t=e.pixelRatio,n=e.cy.zoom(),r=e.cy.pan();return{zoom:n*t,pan:{x:r.x*t,y:r.y*t}}}function Ud(e){return"solid"===e.pstyle("background-fill").value&&("none"===e.pstyle("background-image").strValue&&(0===e.pstyle("border-width").value||(0===e.pstyle("border-opacity").value||"solid"===e.pstyle("border-style").value)))}function Hd(e,t){if(e.length!==t.length)return!1;for(var n=0;n<e.length;n++)if(e[n]!==t[n])return!1;return!0}function Kd(e,t,n){var r=e[0]/255,a=e[1]/255,i=e[2]/255,o=t,s=n||new Array(4);return s[0]=r*o,s[1]=a*o,s[2]=i*o,s[3]=o,s}function Gd(e,t){var n=t||new Array(4);return n[0]=(255&e)/255,n[1]=(e>>8&255)/255,n[2]=(e>>16&255)/255,n[3]=(e>>24&255)/255,n}function Zd(e){return e[0]+(e[1]<<8)+(e[2]<<16)+(e[3]<<24)}function $d(e,t){switch(t){case"float":return[1,e.FLOAT,4];case"vec2":return[2,e.FLOAT,4];case"vec3":return[3,e.FLOAT,4];case"vec4":return[4,e.FLOAT,4];case"int":return[1,e.INT,4];case"ivec2":return[2,e.INT,4]}}function Qd(e,t,n){switch(t){case e.FLOAT:return new Float32Array(n);case e.INT:return new Int32Array(n)}}function Jd(e,t,n,r,a,i){switch(t){case e.FLOAT:return new Float32Array(n.buffer,i*r,a);case e.INT:return new Int32Array(n.buffer,i*r,a)}}function eh(e,t,n,r){var a=l($d(e,n),3),i=a[0],o=a[1],s=a[2],u=Qd(e,o,t*i),c=i*s,d=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,d),e.bufferData(e.ARRAY_BUFFER,t*c,e.DYNAMIC_DRAW),e.enableVertexAttribArray(r),o===e.FLOAT?e.vertexAttribPointer(r,i,o,!1,c,0):o===e.INT&&e.vertexAttribIPointer(r,i,o,c,0),e.vertexAttribDivisor(r,1),e.bindBuffer(e.ARRAY_BUFFER,null);for(var h=new Array(t),f=0;f<t;f++)h[f]=Jd(e,o,u,c,i,f);return d.dataArray=u,d.stride=c,d.size=i,d.getView=function(e){return h[e]},d.setPoint=function(e,t,n){var r=h[e];r[0]=t,r[1]=n},d.bufferSubData=function(t){e.bindBuffer(e.ARRAY_BUFFER,d),t?e.bufferSubData(e.ARRAY_BUFFER,0,u,0,t*i):e.bufferSubData(e.ARRAY_BUFFER,0,u)},d}Xd.getPixelRatio=function(){var e=this.data.contexts[0];if(null!=this.forcedPixelRatio)return this.forcedPixelRatio;var t=this.cy.window(),n=e.backingStorePixelRatio||e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return(t.devicePixelRatio||1)/n},Xd.paintCache=function(e){for(var t,n=this.paintCaches=this.paintCaches||[],r=!0,a=0;a<n.length;a++)if((t=n[a]).context===e){r=!1;break}return r&&(t={context:e},n.push(t)),t},Xd.createGradientStyleFor=function(e,t,n,r,a){var i,o=this.usePaths(),s=n.pstyle(t+"-gradient-stop-colors").value,l=n.pstyle(t+"-gradient-stop-positions").pfValue;if("radial-gradient"===r)if(n.isEdge()){var u=n.sourceEndpoint(),c=n.targetEndpoint(),d=n.midpoint(),h=Kt(u,d),f=Kt(c,d);i=e.createRadialGradient(d.x,d.y,0,d.x,d.y,Math.max(h,f))}else{var p=o?{x:0,y:0}:n.position(),v=n.paddedWidth(),g=n.paddedHeight();i=e.createRadialGradient(p.x,p.y,0,p.x,p.y,Math.max(v,g))}else if(n.isEdge()){var y=n.sourceEndpoint(),m=n.targetEndpoint();i=e.createLinearGradient(y.x,y.y,m.x,m.y)}else{var b=o?{x:0,y:0}:n.position(),x=n.paddedWidth()/2,w=n.paddedHeight()/2;switch(n.pstyle("background-gradient-direction").value){case"to-bottom":i=e.createLinearGradient(b.x,b.y-w,b.x,b.y+w);break;case"to-top":i=e.createLinearGradient(b.x,b.y+w,b.x,b.y-w);break;case"to-left":i=e.createLinearGradient(b.x+x,b.y,b.x-x,b.y);break;case"to-right":i=e.createLinearGradient(b.x-x,b.y,b.x+x,b.y);break;case"to-bottom-right":case"to-right-bottom":i=e.createLinearGradient(b.x-x,b.y-w,b.x+x,b.y+w);break;case"to-top-right":case"to-right-top":i=e.createLinearGradient(b.x-x,b.y+w,b.x+x,b.y-w);break;case"to-bottom-left":case"to-left-bottom":i=e.createLinearGradient(b.x+x,b.y-w,b.x-x,b.y+w);break;case"to-top-left":case"to-left-top":i=e.createLinearGradient(b.x+x,b.y+w,b.x-x,b.y-w)}}if(!i)return null;for(var E=l.length===s.length,k=s.length,T=0;T<k;T++)i.addColorStop(E?l[T]:T/(k-1),"rgba("+s[T][0]+","+s[T][1]+","+s[T][2]+","+a+")");return i},Xd.gradientFillStyle=function(e,t,n,r){var a=this.createGradientStyleFor(e,"background",t,n,r);if(!a)return null;e.fillStyle=a},Xd.colorFillStyle=function(e,t,n,r,a){e.fillStyle="rgba("+t+","+n+","+r+","+a+")"},Xd.eleFillStyle=function(e,t,n){var r=t.pstyle("background-fill").value;if("linear-gradient"===r||"radial-gradient"===r)this.gradientFillStyle(e,t,r,n);else{var a=t.pstyle("background-color").value;this.colorFillStyle(e,a[0],a[1],a[2],n)}},Xd.gradientStrokeStyle=function(e,t,n,r){var a=this.createGradientStyleFor(e,"line",t,n,r);if(!a)return null;e.strokeStyle=a},Xd.colorStrokeStyle=function(e,t,n,r,a){e.strokeStyle="rgba("+t+","+n+","+r+","+a+")"},Xd.eleStrokeStyle=function(e,t,n){var r=t.pstyle("line-fill").value;if("linear-gradient"===r||"radial-gradient"===r)this.gradientStrokeStyle(e,t,r,n);else{var a=t.pstyle("line-color").value;this.colorStrokeStyle(e,a[0],a[1],a[2],n)}},Xd.matchCanvasSize=function(e){var t=this,n=t.data,r=t.findContainerClientCoords(),a=r[2],i=r[3],o=t.getPixelRatio(),s=t.motionBlurPxRatio;e!==t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_NODE]&&e!==t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_DRAG]||(o=s);var l,u=a*o,c=i*o;if(u!==t.canvasWidth||c!==t.canvasHeight){t.fontCaches=null;var d=n.canvasContainer;d.style.width=a+"px",d.style.height=i+"px";for(var h=0;h<t.CANVAS_LAYERS;h++)(l=n.canvases[h]).width=u,l.height=c,l.style.width=a+"px",l.style.height=i+"px";for(h=0;h<t.BUFFER_COUNT;h++)(l=n.bufferCanvases[h]).width=u,l.height=c,l.style.width=a+"px",l.style.height=i+"px";t.textureMult=1,o<=1&&(l=n.bufferCanvases[t.TEXTURE_BUFFER],t.textureMult=2,l.width=u*t.textureMult,l.height=c*t.textureMult),t.canvasWidth=u,t.canvasHeight=c,t.pixelRatio=o}},Xd.renderTo=function(e,t,n,r){this.render({forcedContext:e,forcedZoom:t,forcedPan:n,drawAllLayers:!0,forcedPxRatio:r})},Xd.clearCanvas=function(){var e=this,t=e.data;function n(t){t.clearRect(0,0,e.canvasWidth,e.canvasHeight)}n(t.contexts[e.NODE]),n(t.contexts[e.DRAG])},Xd.render=function(e){var t=this;e=e||ut();var n=t.cy,r=e.forcedContext,a=e.drawAllLayers,i=e.drawOnlyNodeLayer,o=e.forcedZoom,s=e.forcedPan,l=void 0===e.forcedPxRatio?this.getPixelRatio():e.forcedPxRatio,u=t.data,c=u.canvasNeedsRedraw,d=t.textureOnViewport&&!r&&(t.pinching||t.hoverData.dragging||t.swipePanning||t.data.wheelZooming),h=void 0!==e.motionBlur?e.motionBlur:t.motionBlur,f=t.motionBlurPxRatio,p=n.hasCompoundNodes(),v=t.hoverData.draggingEles,g=!(!t.hoverData.selecting&&!t.touchData.selecting),y=h=h&&!r&&t.motionBlurEnabled&&!g;r||(t.prevPxRatio!==l&&(t.invalidateContainerClientCoordsCache(),t.matchCanvasSize(t.container),t.redrawHint("eles",!0),t.redrawHint("drag",!0)),t.prevPxRatio=l),!r&&t.motionBlurTimeout&&clearTimeout(t.motionBlurTimeout),h&&(null==t.mbFrames&&(t.mbFrames=0),t.mbFrames++,t.mbFrames<3&&(y=!1),t.mbFrames>t.minMbLowQualFrames&&(t.motionBlurPxRatio=t.mbPxRBlurry)),t.clearingMotionBlur&&(t.motionBlurPxRatio=1),t.textureDrawLastFrame&&!d&&(c[t.NODE]=!0,c[t.SELECT_BOX]=!0);var m=n.style(),b=n.zoom(),x=void 0!==o?o:b,w=n.pan(),E={x:w.x,y:w.y},k={zoom:b,pan:{x:w.x,y:w.y}},T=t.prevViewport;void 0===T||k.zoom!==T.zoom||k.pan.x!==T.pan.x||k.pan.y!==T.pan.y||v&&!p||(t.motionBlurPxRatio=1),s&&(E=s),x*=l,E.x*=l,E.y*=l;var C=t.getCachedZSortedEles();function P(e,n,r,a,i){var o=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",t.colorFillStyle(e,255,255,255,t.motionBlurTransparency),e.fillRect(n,r,a,i),e.globalCompositeOperation=o}function S(e,n){var i,l,c,d;t.clearingMotionBlur||e!==u.bufferContexts[t.MOTIONBLUR_BUFFER_NODE]&&e!==u.bufferContexts[t.MOTIONBLUR_BUFFER_DRAG]?(i=E,l=x,c=t.canvasWidth,d=t.canvasHeight):(i={x:w.x*f,y:w.y*f},l=b*f,c=t.canvasWidth*f,d=t.canvasHeight*f),e.setTransform(1,0,0,1,0,0),"motionBlur"===n?P(e,0,0,c,d):r||void 0!==n&&!n||e.clearRect(0,0,c,d),a||(e.translate(i.x,i.y),e.scale(l,l)),s&&e.translate(s.x,s.y),o&&e.scale(o,o)}if(d||(t.textureDrawLastFrame=!1),d){if(t.textureDrawLastFrame=!0,!t.textureCache){t.textureCache={},t.textureCache.bb=n.mutableElements().boundingBox(),t.textureCache.texture=t.data.bufferCanvases[t.TEXTURE_BUFFER];var B=t.data.bufferContexts[t.TEXTURE_BUFFER];B.setTransform(1,0,0,1,0,0),B.clearRect(0,0,t.canvasWidth*t.textureMult,t.canvasHeight*t.textureMult),t.render({forcedContext:B,drawOnlyNodeLayer:!0,forcedPxRatio:l*t.textureMult}),(k=t.textureCache.viewport={zoom:n.zoom(),pan:n.pan(),width:t.canvasWidth,height:t.canvasHeight}).mpan={x:(0-k.pan.x)/k.zoom,y:(0-k.pan.y)/k.zoom}}c[t.DRAG]=!1,c[t.NODE]=!1;var D=u.contexts[t.NODE],_=t.textureCache.texture;k=t.textureCache.viewport;D.setTransform(1,0,0,1,0,0),h?P(D,0,0,k.width,k.height):D.clearRect(0,0,k.width,k.height);var A=m.core("outside-texture-bg-color").value,M=m.core("outside-texture-bg-opacity").value;t.colorFillStyle(D,A[0],A[1],A[2],M),D.fillRect(0,0,k.width,k.height);b=n.zoom();S(D,!1),D.clearRect(k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l),D.drawImage(_,k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l)}else t.textureOnViewport&&!r&&(t.textureCache=null);var R=n.extent(),I=t.pinching||t.hoverData.dragging||t.swipePanning||t.data.wheelZooming||t.hoverData.draggingEles||t.cy.animated(),N=t.hideEdgesOnViewport&&I,L=[];if(L[t.NODE]=!c[t.NODE]&&h&&!t.clearedForMotionBlur[t.NODE]||t.clearingMotionBlur,L[t.NODE]&&(t.clearedForMotionBlur[t.NODE]=!0),L[t.DRAG]=!c[t.DRAG]&&h&&!t.clearedForMotionBlur[t.DRAG]||t.clearingMotionBlur,L[t.DRAG]&&(t.clearedForMotionBlur[t.DRAG]=!0),c[t.NODE]||a||i||L[t.NODE]){var z=h&&!L[t.NODE]&&1!==f;S(D=r||(z?t.data.bufferContexts[t.MOTIONBLUR_BUFFER_NODE]:u.contexts[t.NODE]),h&&!z?"motionBlur":void 0),N?t.drawCachedNodes(D,C.nondrag,l,R):t.drawLayeredElements(D,C.nondrag,l,R),t.debug&&t.drawDebugPoints(D,C.nondrag),a||h||(c[t.NODE]=!1)}if(!i&&(c[t.DRAG]||a||L[t.DRAG])){z=h&&!L[t.DRAG]&&1!==f;S(D=r||(z?t.data.bufferContexts[t.MOTIONBLUR_BUFFER_DRAG]:u.contexts[t.DRAG]),h&&!z?"motionBlur":void 0),N?t.drawCachedNodes(D,C.drag,l,R):t.drawCachedElements(D,C.drag,l,R),t.debug&&t.drawDebugPoints(D,C.drag),a||h||(c[t.DRAG]=!1)}if(this.drawSelectionRectangle(e,S),h&&1!==f){var O=u.contexts[t.NODE],V=t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_NODE],F=u.contexts[t.DRAG],j=t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_DRAG],X=function(e,n,r){e.setTransform(1,0,0,1,0,0),r||!y?e.clearRect(0,0,t.canvasWidth,t.canvasHeight):P(e,0,0,t.canvasWidth,t.canvasHeight);var a=f;e.drawImage(n,0,0,t.canvasWidth*a,t.canvasHeight*a,0,0,t.canvasWidth,t.canvasHeight)};(c[t.NODE]||L[t.NODE])&&(X(O,V,L[t.NODE]),c[t.NODE]=!1),(c[t.DRAG]||L[t.DRAG])&&(X(F,j,L[t.DRAG]),c[t.DRAG]=!1)}t.prevViewport=k,t.clearingMotionBlur&&(t.clearingMotionBlur=!1,t.motionBlurCleared=!0,t.motionBlur=!0),h&&(t.motionBlurTimeout=setTimeout(function(){t.motionBlurTimeout=null,t.clearedForMotionBlur[t.NODE]=!1,t.clearedForMotionBlur[t.DRAG]=!1,t.motionBlur=!1,t.clearingMotionBlur=!d,t.mbFrames=0,c[t.NODE]=!0,c[t.DRAG]=!0,t.redraw()},100)),r||n.emit("render")},Xd.drawSelectionRectangle=function(e,t){var n=this,r=n.cy,a=n.data,i=r.style(),o=e.drawOnlyNodeLayer,s=e.drawAllLayers,l=a.canvasNeedsRedraw,u=e.forcedContext;if(n.showFps||!o&&l[n.SELECT_BOX]&&!s){var c=u||a.contexts[n.SELECT_BOX];if(t(c),1==n.selection[4]&&(n.hoverData.selecting||n.touchData.selecting)){var d=n.cy.zoom(),h=i.core("selection-box-border-width").value/d;c.lineWidth=h,c.fillStyle="rgba("+i.core("selection-box-color").value[0]+","+i.core("selection-box-color").value[1]+","+i.core("selection-box-color").value[2]+","+i.core("selection-box-opacity").value+")",c.fillRect(n.selection[0],n.selection[1],n.selection[2]-n.selection[0],n.selection[3]-n.selection[1]),h>0&&(c.strokeStyle="rgba("+i.core("selection-box-border-color").value[0]+","+i.core("selection-box-border-color").value[1]+","+i.core("selection-box-border-color").value[2]+","+i.core("selection-box-opacity").value+")",c.strokeRect(n.selection[0],n.selection[1],n.selection[2]-n.selection[0],n.selection[3]-n.selection[1]))}if(a.bgActivePosistion&&!n.hoverData.selecting){d=n.cy.zoom();var f=a.bgActivePosistion;c.fillStyle="rgba("+i.core("active-bg-color").value[0]+","+i.core("active-bg-color").value[1]+","+i.core("active-bg-color").value[2]+","+i.core("active-bg-opacity").value+")",c.beginPath(),c.arc(f.x,f.y,i.core("active-bg-size").pfValue/d,0,2*Math.PI),c.fill()}var p=n.lastRedrawTime;if(n.showFps&&p){p=Math.round(p);var v=Math.round(1e3/p),g="1 frame = "+p+" ms = "+v+" fps";if(c.setTransform(1,0,0,1,0,0),c.fillStyle="rgba(255, 0, 0, 0.75)",c.strokeStyle="rgba(255, 0, 0, 0.75)",c.font="30px Arial",!jd){var y=c.measureText(g);jd=y.actualBoundingBoxAscent}c.fillText(g,0,jd);c.strokeRect(0,jd+10,250,20),c.fillRect(0,jd+10,250*Math.min(v/60,1),20)}s||(l[n.SELECT_BOX]=!1)}};var th="undefined"!=typeof Float32Array?Float32Array:Array;function nh(){var e=new th(9);return th!=Float32Array&&(e[1]=0,e[2]=0,e[3]=0,e[5]=0,e[6]=0,e[7]=0),e[0]=1,e[4]=1,e[8]=1,e}function rh(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e}function ah(e,t,n){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],d=t[8],h=n[0],f=n[1];return e[0]=r,e[1]=a,e[2]=i,e[3]=o,e[4]=s,e[5]=l,e[6]=h*r+f*o+u,e[7]=h*a+f*s+c,e[8]=h*i+f*l+d,e}function ih(e,t,n){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],d=t[8],h=Math.sin(n),f=Math.cos(n);return e[0]=f*r+h*o,e[1]=f*a+h*s,e[2]=f*i+h*l,e[3]=f*o-h*r,e[4]=f*s-h*a,e[5]=f*l-h*i,e[6]=u,e[7]=c,e[8]=d,e}function oh(e,t,n){var r=n[0],a=n[1];return e[0]=r*t[0],e[1]=r*t[1],e[2]=r*t[2],e[3]=a*t[3],e[4]=a*t[4],e[5]=a*t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e}Math.hypot||(Math.hypot=function(){for(var e=0,t=arguments.length;t--;)e+=arguments[t]*arguments[t];return Math.sqrt(e)});var sh=function(){return i(function e(t,n,r,i){a(this,e),this.debugID=Math.floor(1e4*Math.random()),this.r=t,this.texSize=n,this.texRows=r,this.texHeight=Math.floor(n/r),this.enableWrapping=!0,this.locked=!1,this.texture=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=i(t,n,n),this.scratch=i(t,n,this.texHeight,"scratch")},[{key:"lock",value:function(){this.locked=!0}},{key:"getKeys",value:function(){return new Set(this.keyToLocation.keys())}},{key:"getScale",value:function(e){var t=e.w,n=e.h,r=this.texHeight,a=this.texSize,i=r/n,o=t*i,s=n*i;return o>a&&(o=t*(i=a/t),s=n*i),{scale:i,texW:o,texH:s}}},{key:"draw",value:function(e,t,n){var r=this;if(this.locked)throw new Error("can't draw, atlas is locked");var a=this.texSize,i=this.texRows,o=this.texHeight,s=this.getScale(t),l=s.scale,u=s.texW,c=s.texH,d=function(e,r){if(n&&r){var a=r.context,i=e.x,s=e.row,u=i,c=o*s;a.save(),a.translate(u,c),a.scale(l,l),n(a,t),a.restore()}},h=[null,null],f=function(){d(r.freePointer,r.canvas),h[0]={x:r.freePointer.x,y:r.freePointer.row*o,w:u,h:c},h[1]={x:r.freePointer.x+u,y:r.freePointer.row*o,w:0,h:c},r.freePointer.x+=u,r.freePointer.x==a&&(r.freePointer.x=0,r.freePointer.row++)},p=function(){r.freePointer.x=0,r.freePointer.row++};if(this.freePointer.x+u<=a)f();else{if(this.freePointer.row>=i-1)return!1;this.freePointer.x===a?(p(),f()):this.enableWrapping?function(){var e=r.scratch,t=r.canvas;e.clear(),d({x:0,row:0},e);var n=a-r.freePointer.x,i=u-n,s=o,l=r.freePointer.x,f=r.freePointer.row*o,p=n;t.context.drawImage(e,0,0,p,s,l,f,p,s),h[0]={x:l,y:f,w:p,h:c};var v=n,g=(r.freePointer.row+1)*o,y=i;t&&t.context.drawImage(e,v,0,y,s,0,g,y,s),h[1]={x:0,y:g,w:y,h:c},r.freePointer.x=i,r.freePointer.row++}():(p(),f())}return this.keyToLocation.set(e,h),this.needsBuffer=!0,h}},{key:"getOffsets",value:function(e){return this.keyToLocation.get(e)}},{key:"isEmpty",value:function(){return 0===this.freePointer.x&&0===this.freePointer.row}},{key:"canFit",value:function(e){if(this.locked)return!1;var t=this.texSize,n=this.texRows,r=this.getScale(e).texW;return!(this.freePointer.x+r>t)||this.freePointer.row<n-1}},{key:"bufferIfNeeded",value:function(e){this.texture||(this.texture=function(e){var t=e.createTexture();return t.buffer=function(n){e.bindTexture(e.TEXTURE_2D,t),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR_MIPMAP_NEAREST),e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,!0),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,e.RGBA,e.UNSIGNED_BYTE,n),e.generateMipmap(e.TEXTURE_2D),e.bindTexture(e.TEXTURE_2D,null)},t.deleteTexture=function(){e.deleteTexture(t)},t}(e,this.debugID)),this.needsBuffer&&(this.texture.buffer(this.canvas),this.needsBuffer=!1,this.locked&&(this.canvas=null,this.scratch=null))}},{key:"dispose",value:function(){this.texture&&(this.texture.deleteTexture(),this.texture=null),this.canvas=null,this.scratch=null,this.locked=!0}}])}(),lh=function(){return i(function e(t,n,r,i){a(this,e),this.r=t,this.texSize=n,this.texRows=r,this.createTextureCanvas=i,this.atlases=[],this.styleKeyToAtlas=new Map,this.markedKeys=new Set},[{key:"getKeys",value:function(){return new Set(this.styleKeyToAtlas.keys())}},{key:"_createAtlas",value:function(){var e=this.r,t=this.texSize,n=this.texRows,r=this.createTextureCanvas;return new sh(e,t,n,r)}},{key:"_getScratchCanvas",value:function(){if(!this.scratch){var e=this.r,t=this.texSize,n=this.texRows,r=this.createTextureCanvas,a=Math.floor(t/n);this.scratch=r(e,t,a,"scratch")}return this.scratch}},{key:"draw",value:function(e,t,n){var r=this.styleKeyToAtlas.get(e);return r||((r=this.atlases[this.atlases.length-1])&&r.canFit(t)||(r&&r.lock(),r=this._createAtlas(),this.atlases.push(r)),r.draw(e,t,n),this.styleKeyToAtlas.set(e,r)),r}},{key:"getAtlas",value:function(e){return this.styleKeyToAtlas.get(e)}},{key:"hasAtlas",value:function(e){return this.styleKeyToAtlas.has(e)}},{key:"markKeyForGC",value:function(e){this.markedKeys.add(e)}},{key:"gc",value:function(){var e=this,t=this.markedKeys;if(0!==t.size){var n,r=[],a=new Map,i=null,s=o(this.atlases);try{var c=function(){var s,c,d=n.value,h=d.getKeys(),f=(c=h,(s=t).intersection?s.intersection(c):new Set(u(s).filter(function(e){return c.has(e)})));if(0===f.size)return r.push(d),h.forEach(function(e){return a.set(e,d)}),1;i||(i=e._createAtlas(),r.push(i));var p,v=o(h);try{for(v.s();!(p=v.n()).done;){var g=p.value;if(!f.has(g)){var y=l(d.getOffsets(g),2),m=y[0],b=y[1];i.canFit({w:m.w+b.w,h:m.h})||(i.lock(),i=e._createAtlas(),r.push(i)),d.canvas&&(e._copyTextureToNewAtlas(g,d,i),a.set(g,i))}}}catch(x){v.e(x)}finally{v.f()}d.dispose()};for(s.s();!(n=s.n()).done;)c()}catch(d){s.e(d)}finally{s.f()}this.atlases=r,this.styleKeyToAtlas=a,this.markedKeys=new Set}else console.log("nothing to garbage collect")}},{key:"_copyTextureToNewAtlas",value:function(e,t,n){var r=l(t.getOffsets(e),2),a=r[0],i=r[1];if(0===i.w)n.draw(e,a,function(e){e.drawImage(t.canvas,a.x,a.y,a.w,a.h,0,0,a.w,a.h)});else{var o=this._getScratchCanvas();o.clear(),o.context.drawImage(t.canvas,a.x,a.y,a.w,a.h,0,0,a.w,a.h),o.context.drawImage(t.canvas,i.x,i.y,i.w,i.h,a.w,0,i.w,i.h);var s=a.w+i.w,u=a.h;n.draw(e,{w:s,h:u},function(e){e.drawImage(o,0,0,s,u,0,0,s,u)})}}},{key:"getCounts",value:function(){return{keyCount:this.styleKeyToAtlas.size,atlasCount:new Set(this.styleKeyToAtlas.values()).size}}}])}();var uh=function(){return i(function e(t,n){a(this,e),this.r=t,this.globalOptions=n,this.atlasSize=n.webglTexSize,this.maxAtlasesPerBatch=n.webglTexPerBatch,this.renderTypes=new Map,this.collections=new Map,this.typeAndIdToKey=new Map},[{key:"getAtlasSize",value:function(){return this.atlasSize}},{key:"addAtlasCollection",value:function(e,t){var n=this.globalOptions,r=n.webglTexSize,a=n.createTextureCanvas,i=t.texRows,o=this._cacheScratchCanvas(a),s=new lh(this.r,r,i,o);this.collections.set(e,s)}},{key:"addRenderType",value:function(e,t){var n=t.collection;if(!this.collections.has(n))throw new Error("invalid atlas collection name '".concat(n,"'"));var r=this.collections.get(n),a=be({type:e,atlasCollection:r},t);this.renderTypes.set(e,a)}},{key:"getRenderTypeOpts",value:function(e){return this.renderTypes.get(e)}},{key:"getAtlasCollection",value:function(e){return this.collections.get(e)}},{key:"_cacheScratchCanvas",value:function(e){var t=-1,n=-1,r=null;return function(a,i,o,s){return s?(r&&i==t&&o==n||(t=i,n=o,r=e(a,i,o)),r):e(a,i,o)}}},{key:"_key",value:function(e,t){return"".concat(e,"-").concat(t)}},{key:"invalidate",value:function(e){var t,n=this,r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},a=r.forceRedraw,i=void 0!==a&&a,s=r.filterEle,l=void 0===s?function(){return!0}:s,u=r.filterType,c=void 0===u?function(){return!0}:u,d=!1,h=!1,f=o(e);try{for(f.s();!(t=f.n()).done;){var p=t.value;if(l(p)){var v,g=o(this.renderTypes.values());try{var y=function(){var e=v.value,t=e.type;if(c(t)){var r=n.collections.get(e.collection),a=e.getKey(p),o=Array.isArray(a)?a:[a];if(i)o.forEach(function(e){return r.markKeyForGC(e)}),h=!0;else{var s=e.getID?e.getID(p):p.id(),l=n._key(t,s),u=n.typeAndIdToKey.get(l);void 0===u||Hd(o,u)||(d=!0,n.typeAndIdToKey.delete(l),u.forEach(function(e){return r.markKeyForGC(e)}))}}};for(g.s();!(v=g.n()).done;)y()}catch(m){g.e(m)}finally{g.f()}}}}catch(m){f.e(m)}finally{f.f()}return h&&(this.gc(),d=!1),d}},{key:"gc",value:function(){var e,t=o(this.collections.values());try{for(t.s();!(e=t.n()).done;){e.value.gc()}}catch(n){t.e(n)}finally{t.f()}}},{key:"getOrCreateAtlas",value:function(e,t,n,r){var a=this.renderTypes.get(t),i=this.collections.get(a.collection),o=!1,s=i.draw(r,n,function(t){a.drawClipped?(t.save(),t.beginPath(),t.rect(0,0,n.w,n.h),t.clip(),a.drawElement(t,e,n,!0,!0),t.restore()):a.drawElement(t,e,n,!0,!0),o=!0});if(o){var l=a.getID?a.getID(e):e.id(),u=this._key(t,l);this.typeAndIdToKey.has(u)?this.typeAndIdToKey.get(u).push(r):this.typeAndIdToKey.set(u,[r])}return s}},{key:"getAtlasInfo",value:function(e,t){var n=this,r=this.renderTypes.get(t),a=r.getKey(e);return(Array.isArray(a)?a:[a]).map(function(a){var i=r.getBoundingBox(e,a),o=n.getOrCreateAtlas(e,t,i,a),s=l(o.getOffsets(a),2),u=s[0];return{atlas:o,tex:u,tex1:u,tex2:s[1],bb:i}})}},{key:"getDebugInfo",value:function(){var e,t=[],n=o(this.collections);try{for(n.s();!(e=n.n()).done;){var r=l(e.value,2),a=r[0],i=r[1].getCounts(),s=i.keyCount,u=i.atlasCount;t.push({type:a,keyCount:s,atlasCount:u})}}catch(c){n.e(c)}finally{n.f()}return t}}])}(),ch=function(){return i(function e(t){a(this,e),this.globalOptions=t,this.atlasSize=t.webglTexSize,this.maxAtlasesPerBatch=t.webglTexPerBatch,this.batchAtlases=[]},[{key:"getMaxAtlasesPerBatch",value:function(){return this.maxAtlasesPerBatch}},{key:"getAtlasSize",value:function(){return this.atlasSize}},{key:"getIndexArray",value:function(){return Array.from({length:this.maxAtlasesPerBatch},function(e,t){return t})}},{key:"startBatch",value:function(){this.batchAtlases=[]}},{key:"getAtlasCount",value:function(){return this.batchAtlases.length}},{key:"getAtlases",value:function(){return this.batchAtlases}},{key:"canAddToCurrentBatch",value:function(e){return this.batchAtlases.length!==this.maxAtlasesPerBatch||this.batchAtlases.includes(e)}},{key:"getAtlasIndexForBatch",value:function(e){var t=this.batchAtlases.indexOf(e);if(t<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(e),t=this.batchAtlases.length-1}return t}}])}(),dh={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},hh=1,fh=2,ph=function(){return i(function e(t,n,r){a(this,e),this.r=t,this.gl=n,this.maxInstances=r.webglBatchSize,this.atlasSize=r.webglTexSize,this.bgColor=r.bgColor,this.debug=r.webglDebug,this.batchDebugInfo=[],r.enableWrapping=!0,r.createTextureCanvas=Yd,this.atlasManager=new uh(t,r),this.batchManager=new ch(r),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(dh.SCREEN),this.pickingProgram=this._createShaderProgram(dh.PICKING),this.vao=this._createVAO()},[{key:"addAtlasCollection",value:function(e,t){this.atlasManager.addAtlasCollection(e,t)}},{key:"addTextureAtlasRenderType",value:function(e,t){this.atlasManager.addRenderType(e,t)}},{key:"addSimpleShapeRenderType",value:function(e,t){this.simpleShapeOptions.set(e,t)}},{key:"invalidate",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).type,n=this.atlasManager;return t?n.invalidate(e,{filterType:function(e){return e===t},forceRedraw:!0}):n.invalidate(e)}},{key:"gc",value:function(){this.atlasManager.gc()}},{key:"_createShaderProgram",value:function(e){var t=this.gl,n="#version 300 es\n precision highp float;\n\n uniform mat3 uPanZoomMatrix;\n uniform int uAtlasSize;\n \n // instanced\n in vec2 aPosition; // a vertex from the unit square\n \n in mat3 aTransform; // used to transform verticies, eg into a bounding box\n in int aVertType; // the type of thing we are rendering\n\n // the z-index that is output when using picking mode\n in vec4 aIndex;\n \n // For textures\n in int aAtlasId; // which shader unit/atlas to use\n in vec4 aTex; // x/y/w/h of texture in atlas\n\n // for edges\n in vec4 aPointAPointB;\n in vec4 aPointCPointD;\n in vec2 aLineWidth; // also used for node border width\n\n // simple shapes\n in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left]\n in vec4 aColor; // also used for edges\n in vec4 aBorderColor; // aLineWidth is used for border width\n\n // output values passed to the fragment shader\n out vec2 vTexCoord;\n out vec4 vColor;\n out vec2 vPosition;\n // flat values are not interpolated\n flat out int vAtlasId; \n flat out int vVertType;\n flat out vec2 vTopRight;\n flat out vec2 vBotLeft;\n flat out vec4 vCornerRadius;\n flat out vec4 vBorderColor;\n flat out vec2 vBorderWidth;\n flat out vec4 vIndex;\n \n void main(void) {\n int vid = gl_VertexID;\n vec2 position = aPosition; // TODO make this a vec3, simplifies some code below\n\n if(aVertType == ".concat(0,") {\n float texX = aTex.x; // texture coordinates\n float texY = aTex.y;\n float texW = aTex.z;\n float texH = aTex.w;\n\n if(vid == 1 || vid == 2 || vid == 4) {\n texX += texW;\n }\n if(vid == 2 || vid == 4 || vid == 5) {\n texY += texH;\n }\n\n float d = float(uAtlasSize);\n vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n }\n else if(aVertType == ").concat(4," || aVertType == ").concat(7," \n || aVertType == ").concat(5," || aVertType == ").concat(6,") { // simple shapes\n\n // the bounding box is needed by the fragment shader\n vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat\n vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat\n vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated\n\n // calculations are done in the fragment shader, just pass these along\n vColor = aColor;\n vCornerRadius = aCornerRadius;\n vBorderColor = aBorderColor;\n vBorderWidth = aLineWidth;\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n }\n else if(aVertType == ").concat(1,") {\n vec2 source = aPointAPointB.xy;\n vec2 target = aPointAPointB.zw;\n\n // adjust the geometry so that the line is centered on the edge\n position.y = position.y - 0.5;\n\n // stretch the unit square into a long skinny rectangle\n vec2 xBasis = target - source;\n vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x));\n vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y;\n\n gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0);\n vColor = aColor;\n } \n else if(aVertType == ").concat(2,") {\n vec2 pointA = aPointAPointB.xy;\n vec2 pointB = aPointAPointB.zw;\n vec2 pointC = aPointCPointD.xy;\n vec2 pointD = aPointCPointD.zw;\n\n // adjust the geometry so that the line is centered on the edge\n position.y = position.y - 0.5;\n\n vec2 p0, p1, p2, pos;\n if(position.x == 0.0) { // The left side of the unit square\n p0 = pointA;\n p1 = pointB;\n p2 = pointC;\n pos = position;\n } else { // The right side of the unit square, use same approach but flip the geometry upside down\n p0 = pointD;\n p1 = pointC;\n p2 = pointB;\n pos = vec2(0.0, -position.y);\n }\n\n vec2 p01 = p1 - p0;\n vec2 p12 = p2 - p1;\n vec2 p21 = p1 - p2;\n\n // Find the normal vector.\n vec2 tangent = normalize(normalize(p12) + normalize(p01));\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // Find the vector perpendicular to p0 -> p1.\n vec2 p01Norm = normalize(vec2(-p01.y, p01.x));\n\n // Determine the bend direction.\n float sigma = sign(dot(p01 + p21, normal));\n float width = aLineWidth[0];\n\n if(sign(pos.y) == -sigma) {\n // This is an intersecting vertex. Adjust the position so that there's no overlap.\n vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm);\n gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0);\n } else {\n // This is a non-intersecting vertex. Treat it like a mitre join.\n vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm);\n gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0);\n }\n\n vColor = aColor;\n } \n else if(aVertType == ").concat(3," && vid < 3) {\n // massage the first triangle into an edge arrow\n if(vid == 0)\n position = vec2(-0.15, -0.3);\n if(vid == 1)\n position = vec2( 0.0, 0.0);\n if(vid == 2)\n position = vec2( 0.15, -0.3);\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n vColor = aColor;\n }\n else {\n gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space\n }\n\n vAtlasId = aAtlasId;\n vVertType = aVertType;\n vIndex = aIndex;\n }\n "),r=this.batchManager.getIndexArray(),a="#version 300 es\n precision highp float;\n\n // declare texture unit for each texture atlas in the batch\n ".concat(r.map(function(e){return"uniform sampler2D uTexture".concat(e,";")}).join("\n\t"),"\n\n uniform vec4 uBGColor;\n uniform float uZoom;\n\n in vec2 vTexCoord;\n in vec4 vColor;\n in vec2 vPosition; // model coordinates\n\n flat in int vAtlasId;\n flat in vec4 vIndex;\n flat in int vVertType;\n flat in vec2 vTopRight;\n flat in vec2 vBotLeft;\n flat in vec4 vCornerRadius;\n flat in vec4 vBorderColor;\n flat in vec2 vBorderWidth;\n\n out vec4 outColor;\n\n ").concat("\n float circleSD(vec2 p, float r) {\n return distance(vec2(0), p) - r; // signed distance\n }\n","\n ").concat("\n float rectangleSD(vec2 p, vec2 b) {\n vec2 d = abs(p)-b;\n return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0);\n }\n","\n ").concat("\n float roundRectangleSD(vec2 p, vec2 b, vec4 cr) {\n cr.xy = (p.x > 0.0) ? cr.xy : cr.zw;\n cr.x = (p.y > 0.0) ? cr.x : cr.y;\n vec2 q = abs(p) - b + cr.x;\n return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x;\n }\n","\n ").concat("\n float ellipseSD(vec2 p, vec2 ab) {\n p = abs( p ); // symmetry\n\n // find root with Newton solver\n vec2 q = ab*(p-ab);\n float w = (q.x<q.y)? 1.570796327 : 0.0;\n for( int i=0; i<5; i++ ) {\n vec2 cs = vec2(cos(w),sin(w));\n vec2 u = ab*vec2( cs.x,cs.y);\n vec2 v = ab*vec2(-cs.y,cs.x);\n w = w + dot(p-u,v)/(dot(p-u,u)+dot(v,v));\n }\n \n // compute final point and distance\n float d = length(p-ab*vec2(cos(w),sin(w)));\n \n // return signed distance\n return (dot(p/ab,p/ab)>1.0) ? d : -d;\n }\n","\n\n vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha\n return vec4( \n top.rgb + (bot.rgb * (1.0 - top.a)),\n top.a + (bot.a * (1.0 - top.a)) \n );\n }\n\n vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance\n // scale to the zoom level so that borders don't look blurry when zoomed in\n // note 1.5 is an aribitrary value chosen because it looks good\n return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); \n }\n\n void main(void) {\n if(vVertType == ").concat(0,") {\n // look up the texel from the texture unit\n ").concat(r.map(function(e){return"if(vAtlasId == ".concat(e,") outColor = texture(uTexture").concat(e,", vTexCoord);")}).join("\n\telse "),"\n } \n else if(vVertType == ").concat(3,") {\n // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out';\n outColor = blend(vColor, uBGColor);\n outColor.a = 1.0; // make opaque, masks out line under arrow\n }\n else if(vVertType == ").concat(4," && vBorderWidth == vec2(0.0)) { // simple rectangle with no border\n outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done\n }\n else if(vVertType == ").concat(4," || vVertType == ").concat(7," \n || vVertType == ").concat(5," || vVertType == ").concat(6,") { // use SDF\n\n float outerBorder = vBorderWidth[0];\n float innerBorder = vBorderWidth[1];\n float borderPadding = outerBorder * 2.0;\n float w = vTopRight.x - vBotLeft.x - borderPadding;\n float h = vTopRight.y - vBotLeft.y - borderPadding;\n vec2 b = vec2(w/2.0, h/2.0); // half width, half height\n vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center\n\n float d; // signed distance\n if(vVertType == ").concat(4,") {\n d = rectangleSD(p, b);\n } else if(vVertType == ").concat(7," && w == h) {\n d = circleSD(p, b.x); // faster than ellipse\n } else if(vVertType == ").concat(7,") {\n d = ellipseSD(p, b);\n } else {\n d = roundRectangleSD(p, b, vCornerRadius.wzyx);\n }\n\n // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling\n // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box\n if(d > 0.0) {\n if(d > outerBorder) {\n discard;\n } else {\n outColor = distInterp(vBorderColor, vec4(0), d - outerBorder);\n }\n } else {\n if(d > innerBorder) {\n vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor;\n vec4 innerBorderColor = blend(vBorderColor, vColor);\n outColor = distInterp(innerBorderColor, outerColor, d);\n } \n else {\n vec4 outerColor;\n if(innerBorder == 0.0 && outerBorder == 0.0) {\n outerColor = vec4(0);\n } else if(innerBorder == 0.0) {\n outerColor = vBorderColor;\n } else {\n outerColor = blend(vBorderColor, vColor);\n }\n outColor = distInterp(vColor, outerColor, d - innerBorder);\n }\n }\n }\n else {\n outColor = vColor;\n }\n\n ").concat(e.picking?"if(outColor.a == 0.0) discard;\n else outColor = vIndex;":"","\n }\n "),i=function(e,t,n){var r=qd(e,e.VERTEX_SHADER,t),a=qd(e,e.FRAGMENT_SHADER,n),i=e.createProgram();if(e.attachShader(i,r),e.attachShader(i,a),e.linkProgram(i),!e.getProgramParameter(i,e.LINK_STATUS))throw new Error("Could not initialize shaders");return i}(t,n,a);i.aPosition=t.getAttribLocation(i,"aPosition"),i.aIndex=t.getAttribLocation(i,"aIndex"),i.aVertType=t.getAttribLocation(i,"aVertType"),i.aTransform=t.getAttribLocation(i,"aTransform"),i.aAtlasId=t.getAttribLocation(i,"aAtlasId"),i.aTex=t.getAttribLocation(i,"aTex"),i.aPointAPointB=t.getAttribLocation(i,"aPointAPointB"),i.aPointCPointD=t.getAttribLocation(i,"aPointCPointD"),i.aLineWidth=t.getAttribLocation(i,"aLineWidth"),i.aColor=t.getAttribLocation(i,"aColor"),i.aCornerRadius=t.getAttribLocation(i,"aCornerRadius"),i.aBorderColor=t.getAttribLocation(i,"aBorderColor"),i.uPanZoomMatrix=t.getUniformLocation(i,"uPanZoomMatrix"),i.uAtlasSize=t.getUniformLocation(i,"uAtlasSize"),i.uBGColor=t.getUniformLocation(i,"uBGColor"),i.uZoom=t.getUniformLocation(i,"uZoom"),i.uTextures=[];for(var o=0;o<this.batchManager.getMaxAtlasesPerBatch();o++)i.uTextures.push(t.getUniformLocation(i,"uTexture".concat(o)));return i}},{key:"_createVAO",value:function(){var e=[0,0,1,0,1,1,0,0,1,1,0,1];this.vertexCount=e.length/2;var t=this.maxInstances,n=this.gl,r=this.program,a=n.createVertexArray();return n.bindVertexArray(a),function(e,t,n,r){var a=l($d(e,t),2),i=a[0],o=a[1],s=Qd(e,o,r),u=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,u),e.bufferData(e.ARRAY_BUFFER,s,e.STATIC_DRAW),o===e.FLOAT?e.vertexAttribPointer(n,i,o,!1,0,0):o===e.INT&&e.vertexAttribIPointer(n,i,o,0,0),e.enableVertexAttribArray(n),e.bindBuffer(e.ARRAY_BUFFER,null)}(n,"vec2",r.aPosition,e),this.transformBuffer=function(e,t,n){for(var r=new Float32Array(9*t),a=new Array(t),i=0;i<t;i++){var o=9*i*4;a[i]=new Float32Array(r.buffer,o,9)}var s=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,s),e.bufferData(e.ARRAY_BUFFER,r.byteLength,e.DYNAMIC_DRAW);for(var l=0;l<3;l++){var u=n+l;e.enableVertexAttribArray(u),e.vertexAttribPointer(u,3,e.FLOAT,!1,36,12*l),e.vertexAttribDivisor(u,1)}return e.bindBuffer(e.ARRAY_BUFFER,null),s.getMatrixView=function(e){return a[e]},s.setData=function(e,t){a[t].set(e,0)},s.bufferSubData=function(){e.bindBuffer(e.ARRAY_BUFFER,s),e.bufferSubData(e.ARRAY_BUFFER,0,r)},s}(n,t,r.aTransform),this.indexBuffer=eh(n,t,"vec4",r.aIndex),this.vertTypeBuffer=eh(n,t,"int",r.aVertType),this.atlasIdBuffer=eh(n,t,"int",r.aAtlasId),this.texBuffer=eh(n,t,"vec4",r.aTex),this.pointAPointBBuffer=eh(n,t,"vec4",r.aPointAPointB),this.pointCPointDBuffer=eh(n,t,"vec4",r.aPointCPointD),this.lineWidthBuffer=eh(n,t,"vec2",r.aLineWidth),this.colorBuffer=eh(n,t,"vec4",r.aColor),this.cornerRadiusBuffer=eh(n,t,"vec4",r.aCornerRadius),this.borderColorBuffer=eh(n,t,"vec4",r.aBorderColor),n.bindVertexArray(null),a}},{key:"buffers",get:function(){var e=this;return this._buffers||(this._buffers=Object.keys(this).filter(function(e){return he(e,"Buffer")}).map(function(t){return e[t]})),this._buffers}},{key:"startFrame",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:dh.SCREEN;this.panZoomMatrix=e,this.renderTarget=t,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()}},{key:"startBatch",value:function(){this.instanceCount=0,this.batchManager.startBatch()}},{key:"endFrame",value:function(){this.endBatch()}},{key:"_isVisible",value:function(e,t){return!!e.visible()&&(!t||!t.isVisible||t.isVisible(e))}},{key:"drawTexture",value:function(e,t,n){var r=this.atlasManager,a=this.batchManager,i=r.getRenderTypeOpts(n);if(this._isVisible(e,i)){if(this.renderTarget.picking&&i.getTexPickingMode){var s=i.getTexPickingMode(e);if(s===hh)return;if(s==fh)return void this.drawPickingRectangle(e,t,n)}var u,c=o(r.getAtlasInfo(e,n));try{for(c.s();!(u=c.n()).done;){var d=u.value,h=d.atlas,f=d.tex1,p=d.tex2;a.canAddToCurrentBatch(h)||this.endBatch();for(var v=a.getAtlasIndexForBatch(h),g=0,y=[[f,!0],[p,!1]];g<y.length;g++){var m=l(y[g],2),b=m[0],x=m[1];if(0!=b.w){var w=this.instanceCount;this.vertTypeBuffer.getView(w)[0]=0,Gd(t,this.indexBuffer.getView(w)),this.atlasIdBuffer.getView(w)[0]=v;var E=this.texBuffer.getView(w);E[0]=b.x,E[1]=b.y,E[2]=b.w,E[3]=b.h;var k=this.transformBuffer.getMatrixView(w);this.setTransformMatrix(e,k,i,d,x),this.instanceCount++,x||this.wrappedCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}}catch(T){c.e(T)}finally{c.f()}}}},{key:"setTransformMatrix",value:function(e,t,n,r){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=0;if(n.shapeProps&&n.shapeProps.padding&&(i=e.pstyle(n.shapeProps.padding).pfValue),r){var o=r.bb,s=r.tex1,l=r.tex2,u=s.w/(s.w+l.w);a||(u=1-u);var c=this._getAdjustedBB(o,i,a,u);this._applyTransformMatrix(t,c,n,e)}else{var d=n.getBoundingBox(e),h=this._getAdjustedBB(d,i,!0,1);this._applyTransformMatrix(t,h,n,e)}}},{key:"_applyTransformMatrix",value:function(e,t,n,r){var a,i;rh(e);var o=n.getRotation?n.getRotation(r):0;if(0!==o){var s=n.getRotationPoint(r);ah(e,e,[s.x,s.y]),ih(e,e,o);var l=n.getRotationOffset(r);a=l.x+(t.xOffset||0),i=l.y+(t.yOffset||0)}else a=t.x1,i=t.y1;ah(e,e,[a,i]),oh(e,e,[t.w,t.h])}},{key:"_getAdjustedBB",value:function(e,t,n,r){var a=e.x1,i=e.y1,o=e.w,s=e.h;t&&(a-=t,i-=t,o+=2*t,s+=2*t);var l=0,u=o*r;return n&&r<1?o=u:!n&&r<1&&(a+=l=o-u,o=u),{x1:a,y1:i,w:o,h:s,xOffset:l,yOffset:e.yOffset}}},{key:"drawPickingRectangle",value:function(e,t,n){var r=this.atlasManager.getRenderTypeOpts(n),a=this.instanceCount;this.vertTypeBuffer.getView(a)[0]=4,Gd(t,this.indexBuffer.getView(a)),Kd([0,0,0],1,this.colorBuffer.getView(a));var i=this.transformBuffer.getMatrixView(a);this.setTransformMatrix(e,i,r),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},{key:"drawNode",value:function(e,t,n){var r=this.simpleShapeOptions.get(n);if(this._isVisible(e,r)){var a=r.shapeProps,i=this._getVertTypeForShape(e,a.shape);if(void 0===i||r.isSimple&&!r.isSimple(e))this.drawTexture(e,t,n);else{var o=this.instanceCount;if(this.vertTypeBuffer.getView(o)[0]=i,5===i||6===i){var s=r.getBoundingBox(e),l=this._getCornerRadius(e,a.radius,s),u=this.cornerRadiusBuffer.getView(o);u[0]=l,u[1]=l,u[2]=l,u[3]=l,6===i&&(u[0]=0,u[2]=0)}Gd(t,this.indexBuffer.getView(o)),Kd(e.pstyle(a.color).value,e.pstyle(a.opacity).value,this.colorBuffer.getView(o));var c=this.lineWidthBuffer.getView(o);if(c[0]=0,c[1]=0,a.border){var d=e.pstyle("border-width").value;if(d>0){Kd(e.pstyle("border-color").value,e.pstyle("border-opacity").value,this.borderColorBuffer.getView(o));var h=e.pstyle("border-position").value;if("inside"===h)c[0]=0,c[1]=-d;else if("outside"===h)c[0]=d,c[1]=0;else{var f=d/2;c[0]=f,c[1]=-f}}}var p=this.transformBuffer.getMatrixView(o);this.setTransformMatrix(e,p,r),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},{key:"_getVertTypeForShape",value:function(e,t){switch(e.pstyle(t).value){case"rectangle":return 4;case"ellipse":return 7;case"roundrectangle":case"round-rectangle":return 5;case"bottom-round-rectangle":return 6;default:return}}},{key:"_getCornerRadius",value:function(e,t,n){var r=n.w,a=n.h;if("auto"===e.pstyle(t).value)return Mn(r,a);var i=e.pstyle(t).pfValue,o=r/2,s=a/2;return Math.min(i,s,o)}},{key:"drawEdgeArrow",value:function(e,t,n){if(e.visible()){var r,a,i,o=e._private.rscratch;if("source"===n?(r=o.arrowStartX,a=o.arrowStartY,i=o.srcArrowAngle):(r=o.arrowEndX,a=o.arrowEndY,i=o.tgtArrowAngle),!(isNaN(r)||null==r||isNaN(a)||null==a||isNaN(i)||null==i))if("none"!==e.pstyle(n+"-arrow-shape").value){var s=e.pstyle(n+"-arrow-color").value,l=e.pstyle("opacity").value*e.pstyle("line-opacity").value,u=e.pstyle("width").pfValue,c=e.pstyle("arrow-scale").value,d=this.r.getArrowWidth(u,c),h=this.instanceCount,f=this.transformBuffer.getMatrixView(h);rh(f),ah(f,f,[r,a]),oh(f,f,[d,d]),ih(f,f,i),this.vertTypeBuffer.getView(h)[0]=3,Gd(t,this.indexBuffer.getView(h)),Kd(s,l,this.colorBuffer.getView(h)),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},{key:"drawEdgeLine",value:function(e,t){if(e.visible()){var n=this._getEdgePoints(e);if(n){var r=e.pstyle("opacity").value,a=e.pstyle("line-opacity").value,i=e.pstyle("width").pfValue,o=e.pstyle("line-color").value,s=r*a;if(n.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),4==n.length){var l=this.instanceCount;this.vertTypeBuffer.getView(l)[0]=1,Gd(t,this.indexBuffer.getView(l)),Kd(o,s,this.colorBuffer.getView(l)),this.lineWidthBuffer.getView(l)[0]=i;var u=this.pointAPointBBuffer.getView(l);u[0]=n[0],u[1]=n[1],u[2]=n[2],u[3]=n[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var c=0;c<n.length-2;c+=2){var d=this.instanceCount;this.vertTypeBuffer.getView(d)[0]=2,Gd(t,this.indexBuffer.getView(d)),Kd(o,s,this.colorBuffer.getView(d)),this.lineWidthBuffer.getView(d)[0]=i;var h=n[c-2],f=n[c-1],p=n[c],v=n[c+1],g=n[c+2],y=n[c+3],m=n[c+4],b=n[c+5];0==c&&(h=2*p-g+.001,f=2*v-y+.001),c==n.length-4&&(m=2*g-p+.001,b=2*y-v+.001);var x=this.pointAPointBBuffer.getView(d);x[0]=h,x[1]=f,x[2]=p,x[3]=v;var w=this.pointCPointDBuffer.getView(d);w[0]=g,w[1]=y,w[2]=m,w[3]=b,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}}},{key:"_getEdgePoints",value:function(e){var t=e._private.rscratch;if(!t.badLine&&null!=t.allpts&&!isNaN(t.allpts[0])){var n=t.allpts;if(4==n.length)return n;var r=this._getNumSegments(e);return this._getCurveSegmentPoints(n,r)}}},{key:"_getNumSegments",value:function(e){return Math.min(Math.max(15,5),this.maxInstances)}},{key:"_getCurveSegmentPoints",value:function(e,t){if(4==e.length)return e;for(var n=Array(2*(t+1)),r=0;r<=t;r++)if(0==r)n[0]=e[0],n[1]=e[1];else if(r==t)n[2*r]=e[e.length-2],n[2*r+1]=e[e.length-1];else{var a=r/t;this._setCurvePoint(e,a,n,2*r)}return n}},{key:"_setCurvePoint",value:function(e,t,n,r){if(!(e.length<=2)){for(var a=Array(e.length-2),i=0;i<a.length;i+=2){var o=(1-t)*e[i]+t*e[i+2],s=(1-t)*e[i+1]+t*e[i+3];a[i]=o,a[i+1]=s}return this._setCurvePoint(a,t,n,r)}n[r]=e[0],n[r+1]=e[1]}},{key:"endBatch",value:function(){var e=this.gl,t=this.vao,n=this.vertexCount,r=this.instanceCount;if(0!==r){var a=this.renderTarget.picking?this.pickingProgram:this.program;e.useProgram(a),e.bindVertexArray(t);var i,s=o(this.buffers);try{for(s.s();!(i=s.n()).done;){i.value.bufferSubData(r)}}catch(p){s.e(p)}finally{s.f()}for(var l,u,c=this.batchManager.getAtlases(),d=0;d<c.length;d++)c[d].bufferIfNeeded(e);for(var h=0;h<c.length;h++)e.activeTexture(e.TEXTURE0+h),e.bindTexture(e.TEXTURE_2D,c[h].texture),e.uniform1i(a.uTextures[h],h);e.uniform1f(a.uZoom,(l=this.r,u=l.pixelRatio,l.cy.zoom()*u)),e.uniformMatrix3fv(a.uPanZoomMatrix,!1,this.panZoomMatrix),e.uniform1i(a.uAtlasSize,this.batchManager.getAtlasSize());var f=Kd(this.bgColor,1);e.uniform4fv(a.uBGColor,f),e.drawArraysInstanced(e.TRIANGLES,0,n,r),e.bindVertexArray(null),e.bindTexture(e.TEXTURE_2D,null),this.debug&&this.batchDebugInfo.push({count:r,atlasCount:c.length}),this.startBatch()}}},{key:"getDebugInfo",value:function(){var e=this.atlasManager.getDebugInfo(),t=e.reduce(function(e,t){return e+t.atlasCount},0),n=this.batchDebugInfo,r=n.reduce(function(e,t){return e+t.count},0);return{atlasInfo:e,totalAtlases:t,wrappedCount:this.wrappedCount,simpleCount:this.simpleCount,batchCount:n.length,batchInfo:n,totalInstances:r}}}])}(),vh={};function gh(e,t){var n=e._private.rscratch;return ft(n,"labelWrapCachedLines",t)||[]}vh.initWebgl=function(e,t){var n=this,r=n.data.contexts[n.WEBGL];e.bgColor=function(e){var t=e.cy.container(),n=t&&t.style&&t.style.backgroundColor||"white";return xe(n)}(n),e.webglTexSize=Math.min(e.webglTexSize,r.getParameter(r.MAX_TEXTURE_SIZE)),e.webglTexRows=Math.min(e.webglTexRows,54),e.webglTexRowsNodes=Math.min(e.webglTexRowsNodes,54),e.webglBatchSize=Math.min(e.webglBatchSize,16384),e.webglTexPerBatch=Math.min(e.webglTexPerBatch,r.getParameter(r.MAX_TEXTURE_IMAGE_UNITS)),n.webglDebug=e.webglDebug,n.webglDebugShowAtlases=e.webglDebugShowAtlases,n.pickingFrameBuffer=function(e){var t=e.createFramebuffer();e.bindFramebuffer(e.FRAMEBUFFER,t);var n=e.createTexture();return e.bindTexture(e.TEXTURE_2D,n),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.CLAMP_TO_EDGE),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.CLAMP_TO_EDGE),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,n,0),e.bindFramebuffer(e.FRAMEBUFFER,null),t.setFramebufferAttachmentSizes=function(t,r){e.bindTexture(e.TEXTURE_2D,n),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,t,r,0,e.RGBA,e.UNSIGNED_BYTE,null)},t}(r),n.pickingFrameBuffer.needsDraw=!0,n.drawing=new ph(n,r,e);var a=function(e){return function(t){return n.getTextAngle(t,e)}},i=function(e){return function(t){var n=t.pstyle(e);return n&&n.value}},s=function(e){return function(t){return t.pstyle("".concat(e,"-opacity")).value>0}},u=function(e){return"yes"===e.pstyle("text-events").strValue?fh:hh},c=function(e){var t=e.position(),n=t.x,r=t.y,a=e.outerWidth(),i=e.outerHeight();return{w:a,h:i,x1:n-a/2,y1:r-i/2}};n.drawing.addAtlasCollection("node",{texRows:e.webglTexRowsNodes}),n.drawing.addAtlasCollection("label",{texRows:e.webglTexRows}),n.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:t.getStyleKey,getBoundingBox:t.getElementBox,drawElement:t.drawElement}),n.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:c,isSimple:Ud,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),n.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:c,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),n.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:c,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),n.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:u,getKey:yh(t.getLabelKey,null),getBoundingBox:mh(t.getLabelBox,null),drawClipped:!0,drawElement:t.drawLabel,getRotation:a(null),getRotationPoint:t.getLabelRotationPoint,getRotationOffset:t.getLabelRotationOffset,isVisible:i("label")}),n.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:u,getKey:yh(t.getSourceLabelKey,"source"),getBoundingBox:mh(t.getSourceLabelBox,"source"),drawClipped:!0,drawElement:t.drawSourceLabel,getRotation:a("source"),getRotationPoint:t.getSourceLabelRotationPoint,getRotationOffset:t.getSourceLabelRotationOffset,isVisible:i("source-label")}),n.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:u,getKey:yh(t.getTargetLabelKey,"target"),getBoundingBox:mh(t.getTargetLabelBox,"target"),drawClipped:!0,drawElement:t.drawTargetLabel,getRotation:a("target"),getRotationPoint:t.getTargetLabelRotationPoint,getRotationOffset:t.getTargetLabelRotationOffset,isVisible:i("target-label")});var d=Me(function(){console.log("garbage collect flag set"),n.data.gc=!0},1e4);n.onUpdateEleCalcs(function(e,t){var r=!1;t&&t.length>0&&(r|=n.drawing.invalidate(t)),r&&d()}),function(e){var t=e.render;e.render=function(n){n=n||{};var r=e.cy;e.webgl&&(r.zoom()>dd?(!function(e){var t=e.data.contexts[e.WEBGL];t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT)}(e),t.call(e,n)):(!function(e){var t=function(t){t.save(),t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.canvasWidth,e.canvasHeight),t.restore()};t(e.data.contexts[e.NODE]),t(e.data.contexts[e.DRAG])}(e),wh(e,n,dh.SCREEN)))};var n=e.matchCanvasSize;e.matchCanvasSize=function(t){n.call(e,t),e.pickingFrameBuffer.setFramebufferAttachmentSizes(e.canvasWidth,e.canvasHeight),e.pickingFrameBuffer.needsDraw=!0},e.findNearestElements=function(t,n,r,a){return function(e,t,n){var r,a,i,s=function(e,t,n){var r,a,i,o,s=Wd(e),u=s.pan,c=s.zoom,d=function(e,t,n,r,a){var i=r*n+t.x,o=a*n+t.y;return[i,o=Math.round(e.canvasHeight-o)]}(e,u,c,t,n),h=l(d,2),f=h[0],p=h[1],v=6;if(r=f-v/2,a=p-v/2,o=v,0===(i=v)||0===o)return[];var g=e.data.contexts[e.WEBGL];g.bindFramebuffer(g.FRAMEBUFFER,e.pickingFrameBuffer),e.pickingFrameBuffer.needsDraw&&(g.viewport(0,0,g.canvas.width,g.canvas.height),wh(e,null,dh.PICKING),e.pickingFrameBuffer.needsDraw=!1);var y=i*o,m=new Uint8Array(4*y);g.readPixels(r,a,i,o,g.RGBA,g.UNSIGNED_BYTE,m),g.bindFramebuffer(g.FRAMEBUFFER,null);for(var b=new Set,x=0;x<y;x++){var w=Zd(m.slice(4*x,4*x+4))-1;w>=0&&b.add(w)}return b}(e,t,n),u=e.getCachedZSortedEles(),c=o(s);try{for(c.s();!(i=c.n()).done;){var d=u[i.value];if(!r&&d.isNode()&&(r=d),!a&&d.isEdge()&&(a=d),r&&a)break}}catch(h){c.e(h)}finally{c.f()}return[r,a].filter(Boolean)}(e,t,n)};var r=e.invalidateCachedZSortedEles;e.invalidateCachedZSortedEles=function(){r.call(e),e.pickingFrameBuffer.needsDraw=!0};var a=e.notify;e.notify=function(t,n){a.call(e,t,n),"viewport"===t||"bounds"===t?e.pickingFrameBuffer.needsDraw=!0:"background"===t&&e.drawing.invalidate(n,{type:"node-body"})}}(n)};var yh=function(e,t){return function(n){var r=e(n),a=gh(n,t);return a.length>1?a.map(function(e,t){return"".concat(r,"_").concat(t)}):r}},mh=function(e,t){return function(n,r){var a=e(n);if("string"==typeof r){var i=r.indexOf("_");if(i>0){var o=Number(r.substring(i+1)),s=gh(n,t),l=a.h/s.length,u=l*o,c=a.y1+u;return{x1:a.x1,w:a.w,y1:c,h:l,yOffset:u}}}return a}};function bh(e,t){var n=e.canvasWidth,r=e.canvasHeight,a=Wd(e),i=a.pan,o=a.zoom;t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,n,r),t.translate(i.x,i.y),t.scale(o,o)}function xh(e,t,n){var r=e.drawing;t+=1,n.isNode()?(r.drawNode(n,t,"node-underlay"),r.drawNode(n,t,"node-body"),r.drawTexture(n,t,"label"),r.drawNode(n,t,"node-overlay")):(r.drawEdgeLine(n,t),r.drawEdgeArrow(n,t,"source"),r.drawEdgeArrow(n,t,"target"),r.drawTexture(n,t,"label"),r.drawTexture(n,t,"edge-source-label"),r.drawTexture(n,t,"edge-target-label"))}function wh(e,t,n){var r;e.webglDebug&&(r=performance.now());var a=e.drawing,i=0;if(n.screen&&e.data.canvasNeedsRedraw[e.SELECT_BOX]&&function(e,t){e.drawSelectionRectangle(t,function(t){return bh(e,t)})}(e,t),e.data.canvasNeedsRedraw[e.NODE]||n.picking){var s=e.data.contexts[e.WEBGL];n.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var l=function(e){var t=e.canvasWidth,n=e.canvasHeight,r=Wd(e),a=r.pan,i=r.zoom,o=nh();ah(o,o,[a.x,a.y]),oh(o,o,[i,i]);var s=nh();!function(e,t,n){e[0]=2/t,e[1]=0,e[2]=0,e[3]=0,e[4]=-2/n,e[5]=0,e[6]=-1,e[7]=1,e[8]=1}(s,t,n);var l,u,c,d,h,f,p,v,g,y,m,b,x,w,E,k,T,C,P,S,B,D=nh();return l=D,c=o,d=(u=s)[0],h=u[1],f=u[2],p=u[3],v=u[4],g=u[5],y=u[6],m=u[7],b=u[8],x=c[0],w=c[1],E=c[2],k=c[3],T=c[4],C=c[5],P=c[6],S=c[7],B=c[8],l[0]=x*d+w*p+E*y,l[1]=x*h+w*v+E*m,l[2]=x*f+w*g+E*b,l[3]=k*d+T*p+C*y,l[4]=k*h+T*v+C*m,l[5]=k*f+T*g+C*b,l[6]=P*d+S*p+B*y,l[7]=P*h+S*v+B*m,l[8]=P*f+S*g+B*b,D}(e),u=e.getCachedZSortedEles();if(i=u.length,a.startFrame(l,n),n.screen){for(var c=0;c<u.nondrag.length;c++)xh(e,c,u.nondrag[c]);for(var d=0;d<u.drag.length;d++)xh(e,d,u.drag[d])}else if(n.picking)for(var h=0;h<u.length;h++)xh(e,h,u[h]);a.endFrame(),n.screen&&e.webglDebugShowAtlases&&(function(e){var t=e.data.contexts[e.NODE];t.save(),bh(e,t),t.strokeStyle="rgba(0, 0, 0, 0.3)",t.beginPath(),t.moveTo(-1e3,0),t.lineTo(1e3,0),t.stroke(),t.beginPath(),t.moveTo(0,-1e3),t.lineTo(0,1e3),t.stroke(),t.restore()}(e),function(e){var t=function(t,n,r){for(var a=t.atlasManager.getAtlasCollection(n),i=e.data.contexts[e.NODE],o=a.atlases,s=0;s<o.length;s++){var l=o[s].canvas;if(l){var u=l.width,c=l.height,d=u*s,h=l.height*r;i.save(),i.scale(.4,.4),i.drawImage(l,d,h),i.strokeStyle="black",i.rect(d,h,u,c),i.stroke(),i.restore()}}},n=0;t(e.drawing,"node",n++),t(e.drawing,"label",n++)}(e)),e.data.canvasNeedsRedraw[e.NODE]=!1,e.data.canvasNeedsRedraw[e.DRAG]=!1}if(e.webglDebug){var f=performance.now(),p=Math.ceil(f-r),v=a.getDebugInfo(),g=["".concat(i," elements"),"".concat(v.totalInstances," instances"),"".concat(v.batchCount," batches"),"".concat(v.totalAtlases," atlases"),"".concat(v.wrappedCount," wrapped textures"),"".concat(v.simpleCount," simple shapes")].join(", ");console.log("WebGL (".concat(n.name,") - frame time ").concat(p,"ms")),console.log("Totals:"),console.log(" ".concat(g)),console.log("Texture Atlases Used:");var y,m=o(v.atlasInfo);try{for(m.s();!(y=m.n()).done;){var b=y.value;console.log(" ".concat(b.type,": ").concat(b.keyCount," keys, ").concat(b.atlasCount," atlases"))}}catch(x){m.e(x)}finally{m.f()}console.log("")}e.data.gc&&(console.log("Garbage Collect!"),e.data.gc=!1,a.gc())}for(var Eh={drawPolygonPath:function(e,t,n,r,a,i){var o=r/2,s=a/2;e.beginPath&&e.beginPath(),e.moveTo(t+o*i[0],n+s*i[1]);for(var l=1;l<i.length/2;l++)e.lineTo(t+o*i[2*l],n+s*i[2*l+1]);e.closePath()},drawRoundPolygonPath:function(e,t,n,r,a,i,o){o.forEach(function(t){return Oc(e,t)}),e.closePath()},drawRoundRectanglePath:function(e,t,n,r,a,i){var o=r/2,s=a/2,l="auto"===i?Mn(r,a):Math.min(i,s,o);e.beginPath&&e.beginPath(),e.moveTo(t,n-s),e.arcTo(t+o,n-s,t+o,n,l),e.arcTo(t+o,n+s,t,n+s,l),e.arcTo(t-o,n+s,t-o,n,l),e.arcTo(t-o,n-s,t,n-s,l),e.lineTo(t,n-s),e.closePath()},drawBottomRoundRectanglePath:function(e,t,n,r,a,i){var o=r/2,s=a/2,l="auto"===i?Mn(r,a):i;e.beginPath&&e.beginPath(),e.moveTo(t,n-s),e.lineTo(t+o,n-s),e.lineTo(t+o,n),e.arcTo(t+o,n+s,t,n+s,l),e.arcTo(t-o,n+s,t-o,n,l),e.lineTo(t-o,n-s),e.lineTo(t,n-s),e.closePath()},drawCutRectanglePath:function(e,t,n,r,a,i,o){var s=r/2,l=a/2,u="auto"===o?8:o;e.beginPath&&e.beginPath(),e.moveTo(t-s+u,n-l),e.lineTo(t+s-u,n-l),e.lineTo(t+s,n-l+u),e.lineTo(t+s,n+l-u),e.lineTo(t+s-u,n+l),e.lineTo(t-s+u,n+l),e.lineTo(t-s,n+l-u),e.lineTo(t-s,n-l+u),e.closePath()},drawBarrelPath:function(e,t,n,r,a){var i=r/2,o=a/2,s=t-i,l=t+i,u=n-o,c=n+o,d=In(r,a),h=d.widthOffset,f=d.heightOffset,p=d.ctrlPtOffsetPct*h;e.beginPath&&e.beginPath(),e.moveTo(s,u+f),e.lineTo(s,c-f),e.quadraticCurveTo(s+p,c,s+h,c),e.lineTo(l-h,c),e.quadraticCurveTo(l-p,c,l,c-f),e.lineTo(l,u+f),e.quadraticCurveTo(l-p,u,l-h,u),e.lineTo(s+h,u),e.quadraticCurveTo(s+p,u,s,u+f),e.closePath()}},kh=Math.sin(0),Th=Math.cos(0),Ch={},Ph={},Sh=Math.PI/40,Bh=0*Math.PI;Bh<2*Math.PI;Bh+=Sh)Ch[Bh]=Math.sin(Bh),Ph[Bh]=Math.cos(Bh);Eh.drawEllipsePath=function(e,t,n,r,a){if(e.beginPath&&e.beginPath(),e.ellipse)e.ellipse(t,n,r/2,a/2,0,0,2*Math.PI);else for(var i,o,s=r/2,l=a/2,u=0*Math.PI;u<2*Math.PI;u+=Sh)i=t-s*Ch[u]*kh+s*Ph[u]*Th,o=n+l*Ph[u]*kh+l*Ch[u]*Th,0===u?e.moveTo(i,o):e.lineTo(i,o);e.closePath()};var Dh={};function _h(e){var t=e.indexOf(",");return e.substr(t+1)}function Ah(e,t,n){var r=function(){return t.toDataURL(n,e.quality)};switch(e.output){case"blob-promise":return new Kr(function(r,a){try{t.toBlob(function(e){null!=e?r(e):a(new Error("`canvas.toBlob()` sent a null value in its callback"))},n,e.quality)}catch(i){a(i)}});case"blob":return function(e,t){for(var n=atob(e),r=new ArrayBuffer(n.length),a=new Uint8Array(r),i=0;i<n.length;i++)a[i]=n.charCodeAt(i);return new Blob([r],{type:t})}(_h(r()),n);case"base64":return _h(r());default:return r()}}Dh.createBuffer=function(e,t){var n=document.createElement("canvas");return n.width=e,n.height=t,[n,n.getContext("2d")]},Dh.bufferCanvasImage=function(e){var t=this.cy,n=t.mutableElements().boundingBox(),r=this.findContainerClientCoords(),a=e.full?Math.ceil(n.w):r[2],i=e.full?Math.ceil(n.h):r[3],o=Q(e.maxWidth)||Q(e.maxHeight),s=this.getPixelRatio(),l=1;if(void 0!==e.scale)a*=e.scale,i*=e.scale,l=e.scale;else if(o){var u=1/0,c=1/0;Q(e.maxWidth)&&(u=l*e.maxWidth/a),Q(e.maxHeight)&&(c=l*e.maxHeight/i),a*=l=Math.min(u,c),i*=l}o||(a*=s,i*=s,l*=s);var d=document.createElement("canvas");d.width=a,d.height=i,d.style.width=a+"px",d.style.height=i+"px";var h=d.getContext("2d");if(a>0&&i>0){h.clearRect(0,0,a,i),h.globalCompositeOperation="source-over";var f=this.getCachedZSortedEles();if(e.full)h.translate(-n.x1*l,-n.y1*l),h.scale(l,l),this.drawElements(h,f),h.scale(1/l,1/l),h.translate(n.x1*l,n.y1*l);else{var p=t.pan(),v={x:p.x*l,y:p.y*l};l*=t.zoom(),h.translate(v.x,v.y),h.scale(l,l),this.drawElements(h,f),h.scale(1/l,1/l),h.translate(-v.x,-v.y)}e.bg&&(h.globalCompositeOperation="destination-over",h.fillStyle=e.bg,h.rect(0,0,a,i),h.fill())}return d},Dh.png=function(e){return Ah(e,this.bufferCanvasImage(e),"image/png")},Dh.jpg=function(e){return Ah(e,this.bufferCanvasImage(e),"image/jpeg")};var Mh={nodeShapeImpl:function(e,t,n,r,a,i,o,s){switch(e){case"ellipse":return this.drawEllipsePath(t,n,r,a,i);case"polygon":return this.drawPolygonPath(t,n,r,a,i,o);case"round-polygon":return this.drawRoundPolygonPath(t,n,r,a,i,o,s);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(t,n,r,a,i,s);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(t,n,r,a,i,o,s);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(t,n,r,a,i,s);case"barrel":return this.drawBarrelPath(t,n,r,a,i)}}},Rh=Nh,Ih=Nh.prototype;function Nh(e){var t=this,n=t.cy.window().document;e.webgl&&(Ih.CANVAS_LAYERS=t.CANVAS_LAYERS=4,console.log("webgl rendering enabled")),t.data={canvases:new Array(Ih.CANVAS_LAYERS),contexts:new Array(Ih.CANVAS_LAYERS),canvasNeedsRedraw:new Array(Ih.CANVAS_LAYERS),bufferCanvases:new Array(Ih.BUFFER_COUNT),bufferContexts:new Array(Ih.CANVAS_LAYERS)};var r="-webkit-tap-highlight-color",a="rgba(0,0,0,0)";t.data.canvasContainer=n.createElement("div");var i=t.data.canvasContainer.style;t.data.canvasContainer.style[r]=a,i.position="relative",i.zIndex="0",i.overflow="hidden";var o=e.cy.container();o.appendChild(t.data.canvasContainer),o.style[r]=a;var s={"-webkit-user-select":"none","-moz-user-select":"-moz-none","user-select":"none","-webkit-tap-highlight-color":"rgba(0,0,0,0)","outline-style":"none"};p&&p.userAgent.match(/msie|trident|edge/i)&&(s["-ms-touch-action"]="none",s["touch-action"]="none");for(var l=0;l<Ih.CANVAS_LAYERS;l++){var u=t.data.canvases[l]=n.createElement("canvas"),c=Ih.CANVAS_TYPES[l];t.data.contexts[l]=u.getContext(c),t.data.contexts[l]||rt("Could not create canvas of type "+c),Object.keys(s).forEach(function(e){u.style[e]=s[e]}),u.style.position="absolute",u.setAttribute("data-id","layer"+l),u.style.zIndex=String(Ih.CANVAS_LAYERS-l),t.data.canvasContainer.appendChild(u),t.data.canvasNeedsRedraw[l]=!1}t.data.topCanvas=t.data.canvases[0],t.data.canvases[Ih.NODE].setAttribute("data-id","layer"+Ih.NODE+"-node"),t.data.canvases[Ih.SELECT_BOX].setAttribute("data-id","layer"+Ih.SELECT_BOX+"-selectbox"),t.data.canvases[Ih.DRAG].setAttribute("data-id","layer"+Ih.DRAG+"-drag"),t.data.canvases[Ih.WEBGL]&&t.data.canvases[Ih.WEBGL].setAttribute("data-id","layer"+Ih.WEBGL+"-webgl");for(l=0;l<Ih.BUFFER_COUNT;l++)t.data.bufferCanvases[l]=n.createElement("canvas"),t.data.bufferContexts[l]=t.data.bufferCanvases[l].getContext("2d"),t.data.bufferCanvases[l].style.position="absolute",t.data.bufferCanvases[l].setAttribute("data-id","buffer"+l),t.data.bufferCanvases[l].style.zIndex=String(-l-1),t.data.bufferCanvases[l].style.visibility="hidden";t.pathsEnabled=!0;var d=en(),h=function(e){return{x:-e.w/2,y:-e.h/2}},f=function(e){return e[0]._private.nodeKey},v=function(e){return e[0]._private.labelStyleKey},g=function(e){return e[0]._private.sourceLabelStyleKey},y=function(e){return e[0]._private.targetLabelStyleKey},m=function(e,n,r,a,i){return t.drawElement(e,n,r,!1,!1,i)},b=function(e,n,r,a,i){return t.drawElementText(e,n,r,a,"main",i)},x=function(e,n,r,a,i){return t.drawElementText(e,n,r,a,"source",i)},w=function(e,n,r,a,i){return t.drawElementText(e,n,r,a,"target",i)},E=function(e){return e.boundingBox(),e[0]._private.bodyBounds},k=function(e){return e.boundingBox(),e[0]._private.labelBounds.main||d},T=function(e){return e.boundingBox(),e[0]._private.labelBounds.source||d},C=function(e){return e.boundingBox(),e[0]._private.labelBounds.target||d},P=function(e,t){return t},S=function(e){return{x:((t=E(e)).x1+t.x2)/2,y:(t.y1+t.y2)/2};var t},B=function(e,t,n){var r=e?e+"-":"";return{x:t.x+n.pstyle(r+"text-margin-x").pfValue,y:t.y+n.pstyle(r+"text-margin-y").pfValue}},D=function(e,t,n){var r=e[0]._private.rscratch;return{x:r[t],y:r[n]}},_=function(e){return B("",D(e,"labelX","labelY"),e)},A=function(e){return B("source",D(e,"sourceLabelX","sourceLabelY"),e)},M=function(e){return B("target",D(e,"targetLabelX","targetLabelY"),e)},R=function(e){return h(E(e))},I=function(e){return h(T(e))},N=function(e){return h(C(e))},L=function(e){var t=k(e),n=h(k(e));if(e.isNode()){switch(e.pstyle("text-halign").value){case"left":n.x=-t.w-(t.leftPad||0);break;case"right":n.x=-(t.rightPad||0)}switch(e.pstyle("text-valign").value){case"top":n.y=-t.h-(t.topPad||0);break;case"bottom":n.y=-(t.botPad||0)}}return n},z=t.data.eleTxrCache=new pd(t,{getKey:f,doesEleInvalidateKey:function(e){var t=e[0]._private;return!(t.oldBackgroundTimestamp===t.backgroundTimestamp)},drawElement:m,getBoundingBox:E,getRotationPoint:S,getRotationOffset:R,allowEdgeTxrCaching:!1,allowParentTxrCaching:!1}),O=t.data.lblTxrCache=new pd(t,{getKey:v,drawElement:b,getBoundingBox:k,getRotationPoint:_,getRotationOffset:L,isVisible:P}),V=t.data.slbTxrCache=new pd(t,{getKey:g,drawElement:x,getBoundingBox:T,getRotationPoint:A,getRotationOffset:I,isVisible:P}),F=t.data.tlbTxrCache=new pd(t,{getKey:y,drawElement:w,getBoundingBox:C,getRotationPoint:M,getRotationOffset:N,isVisible:P}),j=t.data.lyrTxrCache=new gd(t);t.onUpdateEleCalcs(function(e,t){z.invalidateElements(t),O.invalidateElements(t),V.invalidateElements(t),F.invalidateElements(t),j.invalidateElements(t);for(var n=0;n<t.length;n++){var r=t[n]._private;r.oldBackgroundTimestamp=r.backgroundTimestamp}});var X=function(e){for(var t=0;t<e.length;t++)j.enqueueElementRefinement(e[t].ele)};z.onDequeue(X),O.onDequeue(X),V.onDequeue(X),F.onDequeue(X),e.webgl&&t.initWebgl(e,{getStyleKey:f,getLabelKey:v,getSourceLabelKey:g,getTargetLabelKey:y,drawElement:m,drawLabel:b,drawSourceLabel:x,drawTargetLabel:w,getElementBox:E,getLabelBox:k,getSourceLabelBox:T,getTargetLabelBox:C,getElementRotationPoint:S,getElementRotationOffset:R,getLabelRotationPoint:_,getSourceLabelRotationPoint:A,getTargetLabelRotationPoint:M,getLabelRotationOffset:L,getSourceLabelRotationOffset:I,getTargetLabelRotationOffset:N})}Ih.CANVAS_LAYERS=3,Ih.SELECT_BOX=0,Ih.DRAG=1,Ih.NODE=2,Ih.WEBGL=3,Ih.CANVAS_TYPES=["2d","2d","2d","webgl2"],Ih.BUFFER_COUNT=3,Ih.TEXTURE_BUFFER=0,Ih.MOTIONBLUR_BUFFER_NODE=1,Ih.MOTIONBLUR_BUFFER_DRAG=2,Ih.redrawHint=function(e,t){var n=this;switch(e){case"eles":n.data.canvasNeedsRedraw[Ih.NODE]=t;break;case"drag":n.data.canvasNeedsRedraw[Ih.DRAG]=t;break;case"select":n.data.canvasNeedsRedraw[Ih.SELECT_BOX]=t;break;case"gc":n.data.gc=!0}};var Lh="undefined"!=typeof Path2D;Ih.path2dEnabled=function(e){if(void 0===e)return this.pathsEnabled;this.pathsEnabled=!!e},Ih.usePaths=function(){return Lh&&this.pathsEnabled},Ih.setImgSmoothing=function(e,t){null!=e.imageSmoothingEnabled?e.imageSmoothingEnabled=t:(e.webkitImageSmoothingEnabled=t,e.mozImageSmoothingEnabled=t,e.msImageSmoothingEnabled=t)},Ih.getImgSmoothing=function(e){return null!=e.imageSmoothingEnabled?e.imageSmoothingEnabled:e.webkitImageSmoothingEnabled||e.mozImageSmoothingEnabled||e.msImageSmoothingEnabled},Ih.makeOffscreenCanvas=function(e,t){var n;"undefined"!==("undefined"==typeof OffscreenCanvas?"undefined":d(OffscreenCanvas))?n=new OffscreenCanvas(e,t):((n=this.cy.window().document.createElement("canvas")).width=e,n.height=t);return n},[wd,Sd,Id,Ld,zd,Vd,Xd,vh,Eh,Dh,Mh].forEach(function(e){be(Ih,e)});var zh=[{type:"layout",extensions:cc},{type:"renderer",extensions:[{name:"null",impl:dc},{name:"base",impl:od},{name:"canvas",impl:Rh}]}],Oh={},Vh={};function Fh(e,t,n){var r=n,a=function(n){it("Can not register `"+t+"` for `"+e+"` since `"+n+"` already exists in the prototype and can not be overridden")};if("core"===e){if(ku.prototype[t])return a(t);ku.prototype[t]=n}else if("collection"===e){if(Vl.prototype[t])return a(t);Vl.prototype[t]=n}else if("layout"===e){for(var i=function(e){this.options=e,n.call(this,e),$(this._private)||(this._private={}),this._private.cy=e.cy,this._private.listeners=[],this.createEmitter()},o=i.prototype=Object.create(n.prototype),s=[],l=0;l<s.length;l++){var u=s[l];o[u]=o[u]||function(){return this}}o.start&&!o.run?o.run=function(){return this.start(),this}:!o.start&&o.run&&(o.start=function(){return this.run(),this});var c=n.prototype.stop;o.stop=function(){var e=this.options;if(e&&e.animate){var t=this.animations;if(t)for(var n=0;n<t.length;n++)t[n].stop()}return c?c.call(this):this.emit("layoutstop"),this},o.destroy||(o.destroy=function(){return this}),o.cy=function(){return this._private.cy};var d=function(e){return e._private.cy},h={addEventFields:function(e,t){t.layout=e,t.cy=d(e),t.target=e},bubble:function(){return!0},parent:function(e){return d(e)}};be(o,{createEmitter:function(){return this._private.emitter=new rl(h,this),this},emitter:function(){return this._private.emitter},on:function(e,t){return this.emitter().on(e,t),this},one:function(e,t){return this.emitter().one(e,t),this},once:function(e,t){return this.emitter().one(e,t),this},removeListener:function(e,t){return this.emitter().removeListener(e,t),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},emit:function(e,t){return this.emitter().emit(e,t),this}}),wo.eventAliasesOn(o),r=i}else if("renderer"===e&&"null"!==t&&"base"!==t){var f=jh("renderer","base"),p=f.prototype,v=n,g=n.prototype,y=function(){f.apply(this,arguments),v.apply(this,arguments)},m=y.prototype;for(var b in p){var x=p[b];if(null!=g[b])return a(b);m[b]=x}for(var w in g)m[w]=g[w];p.clientFunctions.forEach(function(e){m[e]=m[e]||function(){rt("Renderer does not implement `renderer."+e+"()` on its prototype")}}),r=y}else if("__proto__"===e||"constructor"===e||"prototype"===e)return rt(e+" is an illegal type to be registered, possibly lead to prototype pollutions");return Ee({map:Oh,keys:[e,t],value:r})}function jh(e,t){return ke({map:Oh,keys:[e,t]})}function Xh(e,t,n,r,a){return Ee({map:Vh,keys:[e,t,n,r],value:a})}function qh(e,t,n,r){return ke({map:Vh,keys:[e,t,n,r]})}var Yh=function(){return 2===arguments.length?jh.apply(null,arguments):3===arguments.length?Fh.apply(null,arguments):4===arguments.length?qh.apply(null,arguments):5===arguments.length?Xh.apply(null,arguments):void rt("Invalid extension access syntax")};ku.prototype.extension=Yh,zh.forEach(function(e){e.extensions.forEach(function(t){Fh(e.type,t.name,t.impl)})});var Wh=function(){if(!(this instanceof Wh))return new Wh;this.length=0},Uh=Wh.prototype;Uh.instanceString=function(){return"stylesheet"},Uh.selector=function(e){return this[this.length++]={selector:e,properties:[]},this},Uh.css=function(e,t){var n=this.length-1;if(K(e))this[n].properties.push({name:e,value:t});else if($(e))for(var r=e,a=Object.keys(r),i=0;i<a.length;i++){var o=a[i],s=r[o];if(null!=s){var l=mu.properties[o]||mu.properties[ue(o)];if(null!=l){var u=l.name,c=s;this[n].properties.push({name:u,value:c})}}}return this},Uh.style=Uh.css,Uh.generateStyle=function(e){var t=new mu(e);return this.appendToStyle(t)},Uh.appendToStyle=function(e){for(var t=0;t<this.length;t++){var n=this[t],r=n.selector,a=n.properties;e.selector(r);for(var i=0;i<a.length;i++){var o=a[i];e.css(o.name,o.value)}}return e};var Hh=function(e){return void 0===e&&(e={}),$(e)?new ku(e):K(e)?Yh.apply(Yh,arguments):void 0};Hh.use=function(e){var t=Array.prototype.slice.call(arguments,1);return t.unshift(Hh),e.apply(null,t),this},Hh.warnings=function(e){return at(e)},Hh.version="3.32.1",Hh.stylesheet=Hh.Stylesheet=Wh}}]); \ No newline at end of file diff --git a/assets/js/9219.cb8684dc.js.LICENSE.txt b/assets/js/9219.cb8684dc.js.LICENSE.txt new file mode 100644 index 0000000000..a9f6f12447 --- /dev/null +++ b/assets/js/9219.cb8684dc.js.LICENSE.txt @@ -0,0 +1,9 @@ +/*! +Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable +Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) +Licensed under The MIT License (http://opensource.org/licenses/MIT) +*/ + +/*! Bezier curve function generator. Copyright Gaetan Renaudeau. MIT License: http://en.wikipedia.org/wiki/MIT_License */ + +/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */ diff --git a/assets/js/9311.dd0d5079.js b/assets/js/9311.dd0d5079.js new file mode 100644 index 0000000000..2730b49eed --- /dev/null +++ b/assets/js/9311.dd0d5079.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9311],{29311:(e,r,s)=>{s.d(r,{diagram:()=>l});var a=s(78479),c=(s(11047),s(91544),s(44533),s(80284),s(61923),s(290),s(49636),s(267),s(29951),s(63727),s(9420),s(97485)),l={parser:a._$,get db(){return new a.NM},renderer:a.Lh,styles:a.tM,init:(0,c.K2)(e=>{e.class||(e.class={}),e.class.arrowMarkerAbsolute=e.arrowMarkerAbsolute},"init")}}}]); \ No newline at end of file diff --git a/assets/js/9339.62e7186f.js b/assets/js/9339.62e7186f.js new file mode 100644 index 0000000000..aaed2a4b6a --- /dev/null +++ b/assets/js/9339.62e7186f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9339],{406:(e,t)=>{let n;function r(){if(void 0===n)throw new Error("No runtime abstraction layer installed");return n}Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.install=function(e){if(void 0===e)throw new Error("No runtime abstraction layer provided");n=e}}(r||(r={})),t.default=r},3602:(e,t,n)=>{n.d(t,{A:()=>u});var r=n(76095),i=n(42849),s=n(22859);const a=function(e){return function(t,n,a){var o=Object(t);if(!(0,i.A)(t)){var l=(0,r.A)(n,3);t=(0,s.A)(t),n=function(e){return l(o[e],e,o)}}var c=e(t,n,a);return c>-1?o[l?t[c]:c]:void 0}};var o=n(46482),l=n(81066),c=Math.max;const u=a(function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var s=null==n?0:(0,l.A)(n);return s<0&&(s=c(i+s,0)),(0,o.A)(e,(0,r.A)(t,3),s)})},5237:(e,t,n)=>{n.d(t,{A:()=>c});var r=n(34713),i=n(16957),s=n(16599),a=n(96920),o=Object.prototype,l=o.hasOwnProperty;const c=(0,r.A)(function(e,t){e=Object(e);var n=-1,r=t.length,c=r>2?t[2]:void 0;for(c&&(0,s.A)(t[0],t[1],c)&&(r=1);++n<r;)for(var u=t[n],d=(0,a.A)(u),h=-1,f=d.length;++h<f;){var p=d[h],m=e[p];(void 0===m||(0,i.A)(m,o[p])&&!l.call(e,p))&&(e[p]=u[p])}return e})},8158:(e,t,n)=>{n.d(t,{t:()=>Fr,u:()=>Gr});var r=n(67567),i=n(29520),s=n(49948),a=n(34813);var o=n(38817),l=n(72185),c=n(89949);function u(e,t,n){return`${e.name}_${t}_${n}`}class d{constructor(e){this.target=e}isEpsilon(){return!1}}class h extends d{constructor(e,t){super(e),this.tokenType=t}}class f extends d{constructor(e){super(e)}isEpsilon(){return!0}}class p extends d{constructor(e,t,n){super(e),this.rule=t,this.followState=n}isEpsilon(){return!0}}function m(e){const t={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};!function(e,t){const n=t.length;for(let r=0;r<n;r++){const n=t[r],i=x(e,n,void 0,{type:2}),s=x(e,n,void 0,{type:7});i.stop=s,e.ruleToStartState.set(n,i),e.ruleToStopState.set(n,s)}}(t,e);const n=e.length;for(let r=0;r<n;r++){const n=e[r],i=y(t,n,n);void 0!==i&&E(t,n,i)}return t}function g(e,t,n){return n instanceof o.BK?$(e,t,n.terminalType,n):n instanceof o.wL?function(e,t,n){const r=n.referencedRule,i=e.ruleToStartState.get(r),s=x(e,t,n,{type:1}),a=x(e,t,n,{type:1}),o=new p(i,r,a);return I(s,o),{left:s,right:a}}(e,t,n):n instanceof o.ak?function(e,t,n){const r=x(e,t,n,{type:1});v(e,r);const i=(0,l.A)(n.definition,n=>g(e,t,n)),s=R(e,t,r,n,...i);return s}(e,t,n):n instanceof o.c$?function(e,t,n){const r=x(e,t,n,{type:1});v(e,r);const i=R(e,t,r,n,y(e,t,n));return function(e,t,n,r){const i=r.left,s=r.right;return k(i,s),e.decisionMap[u(t,"Option",n.idx)]=i,r}(e,t,n,i)}(e,t,n):n instanceof o.Y2?function(e,t,n){const r=x(e,t,n,{type:5});v(e,r);const i=R(e,t,r,n,y(e,t,n));return A(e,t,n,i)}(e,t,n):n instanceof o.Pp?function(e,t,n){const r=x(e,t,n,{type:5});v(e,r);const i=R(e,t,r,n,y(e,t,n)),s=$(e,t,n.separator,n);return A(e,t,n,i,s)}(e,t,n):n instanceof o.$P?function(e,t,n){const r=x(e,t,n,{type:4});v(e,r);const i=R(e,t,r,n,y(e,t,n));return T(e,t,n,i)}(e,t,n):n instanceof o.Cy?function(e,t,n){const r=x(e,t,n,{type:4});v(e,r);const i=R(e,t,r,n,y(e,t,n)),s=$(e,t,n.separator,n);return T(e,t,n,i,s)}(e,t,n):y(e,t,n)}function y(e,t,n){const r=(0,c.A)((0,l.A)(n.definition,n=>g(e,t,n)),e=>void 0!==e);return 1===r.length?r[0]:0===r.length?void 0:function(e,t){const n=t.length;for(let s=0;s<n-1;s++){const n=t[s];let r;1===n.left.transitions.length&&(r=n.left.transitions[0]);const i=r instanceof p,a=r,o=t[s+1].left;1===n.left.type&&1===n.right.type&&void 0!==r&&(i&&a.followState===n.right||r.target===n.right)?(i?a.followState=o:r.target=o,S(e,n.right)):k(n.right,o)}const r=t[0],i=t[n-1];return{left:r.left,right:i.right}}(e,r)}function T(e,t,n,r,i){const s=r.left,a=r.right,o=x(e,t,n,{type:11});v(e,o);const l=x(e,t,n,{type:12});return s.loopback=o,l.loopback=o,e.decisionMap[u(t,i?"RepetitionMandatoryWithSeparator":"RepetitionMandatory",n.idx)]=o,k(a,o),void 0===i?(k(o,s),k(o,l)):(k(o,l),k(o,i.left),k(i.right,s)),{left:s,right:l}}function A(e,t,n,r,i){const s=r.left,a=r.right,o=x(e,t,n,{type:10});v(e,o);const l=x(e,t,n,{type:12}),c=x(e,t,n,{type:9});return o.loopback=c,l.loopback=c,k(o,s),k(o,l),k(a,c),void 0!==i?(k(c,l),k(c,i.left),k(i.right,s)):k(c,o),e.decisionMap[u(t,i?"RepetitionWithSeparator":"Repetition",n.idx)]=o,{left:o,right:l}}function v(e,t){return e.decisionStates.push(t),t.decision=e.decisionStates.length-1,t.decision}function R(e,t,n,r,...i){const s=x(e,t,r,{type:8,start:n});n.end=s;for(const o of i)void 0!==o?(k(n,o.left),k(o.right,s)):k(n,s);const a={left:n,right:s};return e.decisionMap[u(t,function(e){if(e instanceof o.ak)return"Alternation";if(e instanceof o.c$)return"Option";if(e instanceof o.Y2)return"Repetition";if(e instanceof o.Pp)return"RepetitionWithSeparator";if(e instanceof o.$P)return"RepetitionMandatory";if(e instanceof o.Cy)return"RepetitionMandatoryWithSeparator";throw new Error("Invalid production type encountered")}(r),r.idx)]=n,a}function $(e,t,n,r){const i=x(e,t,r,{type:1}),s=x(e,t,r,{type:1});return I(i,new h(s,n)),{left:i,right:s}}function E(e,t,n){const r=e.ruleToStartState.get(t);k(r,n.left);const i=e.ruleToStopState.get(t);k(n.right,i);return{left:r,right:i}}function k(e,t){I(e,new f(t))}function x(e,t,n,r){const i=Object.assign({atn:e,production:n,epsilonOnlyTransitions:!1,rule:t,transitions:[],nextTokenWithinRule:[],stateNumber:e.states.length},r);return e.states.push(i),i}function I(e,t){0===e.transitions.length&&(e.epsilonOnlyTransitions=t.isEpsilon()),e.transitions.push(t)}function S(e,t){e.states.splice(e.states.indexOf(t),1)}const N={};class C{constructor(){this.map={},this.configs=[]}get size(){return this.configs.length}finalize(){this.map={}}add(e){const t=w(e);t in this.map||(this.map[t]=this.configs.length,this.configs.push(e))}get elements(){return this.configs}get alts(){return(0,l.A)(this.configs,e=>e.alt)}get key(){let e="";for(const t in this.map)e+=t+":";return e}}function w(e,t=!0){return`${t?`a${e.alt}`:""}s${e.state.stateNumber}:${e.stack.map(e=>e.stateNumber.toString()).join("_")}`}var L=n(22675),b=n(64620),O=n(76095),_=n(80171);const P=function(e,t){return e&&e.length?(0,_.A)(e,(0,O.A)(t,2)):[]};var M=n(60129),D=n(83129),U=n(90570),F=n(96800);function G(e,t){const n={};return r=>{const i=r.toString();let s=n[i];return void 0!==s||(s={atnStartState:e,decision:t,states:{}},n[i]=s),s}}class K{constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,t){this.predicates[e]=t}toString(){let e="";const t=this.predicates.length;for(let n=0;n<t;n++)e+=!0===this.predicates[n]?"1":"0";return e}}const B=new K;class j extends o.T6{constructor(e){var t;super(),this.logging=null!==(t=null==e?void 0:e.logging)&&void 0!==t?t:e=>console.log(e)}initialize(e){this.atn=m(e.rules),this.dfas=function(e){const t=e.decisionStates.length,n=Array(t);for(let r=0;r<t;r++)n[r]=G(e.decisionStates[r],r);return n}(this.atn)}validateAmbiguousAlternationAlternatives(){return[]}validateEmptyOrAlternatives(){return[]}buildLookaheadForAlternation(e){const{prodOccurrence:t,rule:n,hasPredicates:r,dynamicTokensEnabled:i}=e,s=this.dfas,a=this.logging,c=u(n,"Alternation",t),d=this.atn.decisionMap[c].decision,h=(0,l.A)((0,o.jk)({maxLookahead:1,occurrence:t,prodType:"Alternation",rule:n}),e=>(0,l.A)(e,e=>e[0]));if(V(h,!1)&&!i){const e=(0,F.A)(h,(e,t,n)=>((0,D.A)(t,t=>{t&&(e[t.tokenTypeIdx]=n,(0,D.A)(t.categoryMatches,t=>{e[t]=n}))}),e),{});return r?function(t){var n;const r=this.LA(1),i=e[r.tokenTypeIdx];if(void 0!==t&&void 0!==i){const e=null===(n=t[i])||void 0===n?void 0:n.GATE;if(void 0!==e&&!1===e.call(this))return}return i}:function(){const t=this.LA(1);return e[t.tokenTypeIdx]}}return r?function(e){const t=new K,n=void 0===e?0:e.length;for(let i=0;i<n;i++){const n=null==e?void 0:e[i].GATE;t.set(i,void 0===n||n.call(this))}const r=H.call(this,s,d,t,a);return"number"==typeof r?r:void 0}:function(){const e=H.call(this,s,d,B,a);return"number"==typeof e?e:void 0}}buildLookaheadForOptional(e){const{prodOccurrence:t,rule:n,prodType:r,dynamicTokensEnabled:i}=e,s=this.dfas,a=this.logging,c=u(n,r,t),d=this.atn.decisionMap[c].decision,h=(0,l.A)((0,o.jk)({maxLookahead:1,occurrence:t,prodType:r,rule:n}),e=>(0,l.A)(e,e=>e[0]));if(V(h)&&h[0][0]&&!i){const e=h[0],t=(0,M.A)(e);if(1===t.length&&(0,U.A)(t[0].categoryMatches)){const e=t[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===e}}{const e=(0,F.A)(t,(e,t)=>(void 0!==t&&(e[t.tokenTypeIdx]=!0,(0,D.A)(t.categoryMatches,t=>{e[t]=!0})),e),{});return function(){const t=this.LA(1);return!0===e[t.tokenTypeIdx]}}}return function(){const e=H.call(this,s,d,B,a);return"object"!=typeof e&&0===e}}}function V(e,t=!0){const n=new Set;for(const r of e){const e=new Set;for(const i of r){if(void 0===i){if(t)break;return!1}const r=[i.tokenTypeIdx].concat(i.categoryMatches);for(const t of r)if(n.has(t)){if(!e.has(t))return!1}else n.add(t),e.add(t)}}return!0}function H(e,t,n,r){const i=e[t](n);let s=i.start;if(void 0===s){s=ee(i,Z(te(i.atnStartState))),i.start=s}return W.apply(this,[i,s,n,r])}function W(e,t,n,r){let i=t,s=1;const a=[];let o=this.LA(s++);for(;;){let t=q(i,o);if(void 0===t&&(t=z.apply(this,[e,i,o,s,n,r])),t===N)return X(a,i,o);if(!0===t.isAcceptState)return t.prediction;i=t,a.push(o),o=this.LA(s++)}}function z(e,t,n,r,i,s){const a=function(e,t,n){const r=new C,i=[];for(const a of e.elements){if(!1===n.is(a.alt))continue;if(7===a.state.type){i.push(a);continue}const e=a.state.transitions.length;for(let n=0;n<e;n++){const e=Q(a.state.transitions[n],t);void 0!==e&&r.add({state:e,alt:a.alt,stack:a.stack})}}let s;0===i.length&&1===r.size&&(s=r);if(void 0===s){s=new C;for(const e of r.elements)ne(e,s)}if(i.length>0&&!function(e){for(const t of e.elements)if(7===t.state.type)return!0;return!1}(s))for(const a of i)s.add(a);return s}(t.configs,n,i);if(0===a.size)return J(e,t,n,N),N;let o=Z(a);const l=function(e,t){let n;for(const r of e.elements)if(!0===t.is(r.alt))if(void 0===n)n=r.alt;else if(n!==r.alt)return;return n}(a,i);if(void 0!==l)o.isAcceptState=!0,o.prediction=l,o.configs.uniqueAlt=l;else if(function(e){if(function(e){for(const t of e.elements)if(7!==t.state.type)return!1;return!0}(e))return!0;const t=function(e){const t=new Map;for(const n of e){const e=w(n,!1);let r=t.get(e);void 0===r&&(r={},t.set(e,r)),r[n.alt]=!0}return t}(e.elements);return function(e){for(const t of Array.from(e.values()))if(Object.keys(t).length>1)return!0;return!1}(t)&&!function(e){for(const t of Array.from(e.values()))if(1===Object.keys(t).length)return!0;return!1}(t)}(a)){const t=(0,L.A)(a.alts);o.isAcceptState=!0,o.prediction=t,o.configs.uniqueAlt=t,Y.apply(this,[e,r,a.alts,s])}return o=J(e,t,n,o),o}function Y(e,t,n,r){const i=[];for(let a=1;a<=t;a++)i.push(this.LA(a).tokenType);const s=e.atnStartState;r(function(e){const t=(0,l.A)(e.prefixPath,e=>(0,o.Sk)(e)).join(", "),n=0===e.production.idx?"":e.production.idx;let r=`Ambiguous Alternatives Detected: <${e.ambiguityIndices.join(", ")}> in <${function(e){if(e instanceof o.wL)return"SUBRULE";if(e instanceof o.c$)return"OPTION";if(e instanceof o.ak)return"OR";if(e instanceof o.$P)return"AT_LEAST_ONE";if(e instanceof o.Cy)return"AT_LEAST_ONE_SEP";if(e instanceof o.Pp)return"MANY_SEP";if(e instanceof o.Y2)return"MANY";if(e instanceof o.BK)return"CONSUME";throw Error("non exhaustive match")}(e.production)}${n}> inside <${e.topLevelRule.name}> Rule,\n<${t}> may appears as a prefix path in all these alternatives.\n`;return r+="See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details.",r}({topLevelRule:s.rule,ambiguityIndices:n,production:s.production,prefixPath:i}))}function X(e,t,n){const r=(0,b.A)(t.configs.elements,e=>e.state.transitions);return{actualToken:n,possibleTokenTypes:P(r.filter(e=>e instanceof h).map(e=>e.tokenType),e=>e.tokenTypeIdx),tokenPath:e}}function q(e,t){return e.edges[t.tokenTypeIdx]}function Q(e,t){if(e instanceof h&&(0,o.G)(t,e.tokenType))return e.target}function Z(e){return{configs:e,edges:{},isAcceptState:!1,prediction:-1}}function J(e,t,n,r){return r=ee(e,r),t.edges[n.tokenTypeIdx]=r,r}function ee(e,t){if(t===N)return t;const n=t.configs.key,r=e.states[n];return void 0!==r?r:(t.configs.finalize(),e.states[n]=t,t)}function te(e){const t=new C,n=e.transitions.length;for(let r=0;r<n;r++){ne({state:e.transitions[r].target,alt:r,stack:[]},t)}return t}function ne(e,t){const n=e.state;if(7===n.type){if(e.stack.length>0){const n=[...e.stack];ne({state:n.pop(),alt:e.alt,stack:n},t)}else t.add(e);return}n.epsilonOnlyTransitions||t.add(e);const r=n.transitions.length;for(let i=0;i<r;i++){const r=re(e,n.transitions[i]);void 0!==r&&ne(r,t)}}function re(e,t){if(t instanceof f)return{state:t.target,alt:e.alt,stack:e.stack};if(t instanceof p){const n=[...e.stack,t.followState];return{state:t.target,alt:e.alt,stack:n}}}var ie,se,ae,oe,le,ce,ue,de,he,fe,pe,me,ge,ye,Te,Ae,ve,Re,$e,Ee,ke,xe,Ie,Se,Ne,Ce,we,Le,be,Oe,_e,Pe,Me,De,Ue,Fe,Ge,Ke,Be,je,Ve,He,We,ze,Ye,Xe,qe,Qe,Ze,Je,et,tt,nt,rt,it,st,at,ot,lt,ct,ut,dt,ht,ft,pt,mt,gt,yt,Tt,At,vt,Rt,$t,Et,kt,xt,It,St,Nt=n(64561);!function(e){e.is=function(e){return"string"==typeof e}}(ie||(ie={})),function(e){e.is=function(e){return"string"==typeof e}}(se||(se={})),function(e){e.MIN_VALUE=-2147483648,e.MAX_VALUE=2147483647,e.is=function(t){return"number"==typeof t&&e.MIN_VALUE<=t&&t<=e.MAX_VALUE}}(ae||(ae={})),function(e){e.MIN_VALUE=0,e.MAX_VALUE=2147483647,e.is=function(t){return"number"==typeof t&&e.MIN_VALUE<=t&&t<=e.MAX_VALUE}}(oe||(oe={})),function(e){e.create=function(e,t){return e===Number.MAX_VALUE&&(e=oe.MAX_VALUE),t===Number.MAX_VALUE&&(t=oe.MAX_VALUE),{line:e,character:t}},e.is=function(e){let t=e;return wt.objectLiteral(t)&&wt.uinteger(t.line)&&wt.uinteger(t.character)}}(le||(le={})),function(e){e.create=function(e,t,n,r){if(wt.uinteger(e)&&wt.uinteger(t)&&wt.uinteger(n)&&wt.uinteger(r))return{start:le.create(e,t),end:le.create(n,r)};if(le.is(e)&&le.is(t))return{start:e,end:t};throw new Error(`Range#create called with invalid arguments[${e}, ${t}, ${n}, ${r}]`)},e.is=function(e){let t=e;return wt.objectLiteral(t)&&le.is(t.start)&&le.is(t.end)}}(ce||(ce={})),function(e){e.create=function(e,t){return{uri:e,range:t}},e.is=function(e){let t=e;return wt.objectLiteral(t)&&ce.is(t.range)&&(wt.string(t.uri)||wt.undefined(t.uri))}}(ue||(ue={})),function(e){e.create=function(e,t,n,r){return{targetUri:e,targetRange:t,targetSelectionRange:n,originSelectionRange:r}},e.is=function(e){let t=e;return wt.objectLiteral(t)&&ce.is(t.targetRange)&&wt.string(t.targetUri)&&ce.is(t.targetSelectionRange)&&(ce.is(t.originSelectionRange)||wt.undefined(t.originSelectionRange))}}(de||(de={})),function(e){e.create=function(e,t,n,r){return{red:e,green:t,blue:n,alpha:r}},e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.numberRange(t.red,0,1)&&wt.numberRange(t.green,0,1)&&wt.numberRange(t.blue,0,1)&&wt.numberRange(t.alpha,0,1)}}(he||(he={})),function(e){e.create=function(e,t){return{range:e,color:t}},e.is=function(e){const t=e;return wt.objectLiteral(t)&&ce.is(t.range)&&he.is(t.color)}}(fe||(fe={})),function(e){e.create=function(e,t,n){return{label:e,textEdit:t,additionalTextEdits:n}},e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.string(t.label)&&(wt.undefined(t.textEdit)||Ee.is(t))&&(wt.undefined(t.additionalTextEdits)||wt.typedArray(t.additionalTextEdits,Ee.is))}}(pe||(pe={})),function(e){e.Comment="comment",e.Imports="imports",e.Region="region"}(me||(me={})),function(e){e.create=function(e,t,n,r,i,s){const a={startLine:e,endLine:t};return wt.defined(n)&&(a.startCharacter=n),wt.defined(r)&&(a.endCharacter=r),wt.defined(i)&&(a.kind=i),wt.defined(s)&&(a.collapsedText=s),a},e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.uinteger(t.startLine)&&wt.uinteger(t.startLine)&&(wt.undefined(t.startCharacter)||wt.uinteger(t.startCharacter))&&(wt.undefined(t.endCharacter)||wt.uinteger(t.endCharacter))&&(wt.undefined(t.kind)||wt.string(t.kind))}}(ge||(ge={})),function(e){e.create=function(e,t){return{location:e,message:t}},e.is=function(e){let t=e;return wt.defined(t)&&ue.is(t.location)&&wt.string(t.message)}}(ye||(ye={})),function(e){e.Error=1,e.Warning=2,e.Information=3,e.Hint=4}(Te||(Te={})),function(e){e.Unnecessary=1,e.Deprecated=2}(Ae||(Ae={})),function(e){e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.string(t.href)}}(ve||(ve={})),function(e){e.create=function(e,t,n,r,i,s){let a={range:e,message:t};return wt.defined(n)&&(a.severity=n),wt.defined(r)&&(a.code=r),wt.defined(i)&&(a.source=i),wt.defined(s)&&(a.relatedInformation=s),a},e.is=function(e){var t;let n=e;return wt.defined(n)&&ce.is(n.range)&&wt.string(n.message)&&(wt.number(n.severity)||wt.undefined(n.severity))&&(wt.integer(n.code)||wt.string(n.code)||wt.undefined(n.code))&&(wt.undefined(n.codeDescription)||wt.string(null===(t=n.codeDescription)||void 0===t?void 0:t.href))&&(wt.string(n.source)||wt.undefined(n.source))&&(wt.undefined(n.relatedInformation)||wt.typedArray(n.relatedInformation,ye.is))}}(Re||(Re={})),function(e){e.create=function(e,t,...n){let r={title:e,command:t};return wt.defined(n)&&n.length>0&&(r.arguments=n),r},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.title)&&wt.string(t.command)}}($e||($e={})),function(e){e.replace=function(e,t){return{range:e,newText:t}},e.insert=function(e,t){return{range:{start:e,end:e},newText:t}},e.del=function(e){return{range:e,newText:""}},e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.string(t.newText)&&ce.is(t.range)}}(Ee||(Ee={})),function(e){e.create=function(e,t,n){const r={label:e};return void 0!==t&&(r.needsConfirmation=t),void 0!==n&&(r.description=n),r},e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.string(t.label)&&(wt.boolean(t.needsConfirmation)||void 0===t.needsConfirmation)&&(wt.string(t.description)||void 0===t.description)}}(ke||(ke={})),function(e){e.is=function(e){const t=e;return wt.string(t)}}(xe||(xe={})),function(e){e.replace=function(e,t,n){return{range:e,newText:t,annotationId:n}},e.insert=function(e,t,n){return{range:{start:e,end:e},newText:t,annotationId:n}},e.del=function(e,t){return{range:e,newText:"",annotationId:t}},e.is=function(e){const t=e;return Ee.is(t)&&(ke.is(t.annotationId)||xe.is(t.annotationId))}}(Ie||(Ie={})),function(e){e.create=function(e,t){return{textDocument:e,edits:t}},e.is=function(e){let t=e;return wt.defined(t)&&_e.is(t.textDocument)&&Array.isArray(t.edits)}}(Se||(Se={})),function(e){e.create=function(e,t,n){let r={kind:"create",uri:e};return void 0===t||void 0===t.overwrite&&void 0===t.ignoreIfExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){let t=e;return t&&"create"===t.kind&&wt.string(t.uri)&&(void 0===t.options||(void 0===t.options.overwrite||wt.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||wt.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||xe.is(t.annotationId))}}(Ne||(Ne={})),function(e){e.create=function(e,t,n,r){let i={kind:"rename",oldUri:e,newUri:t};return void 0===n||void 0===n.overwrite&&void 0===n.ignoreIfExists||(i.options=n),void 0!==r&&(i.annotationId=r),i},e.is=function(e){let t=e;return t&&"rename"===t.kind&&wt.string(t.oldUri)&&wt.string(t.newUri)&&(void 0===t.options||(void 0===t.options.overwrite||wt.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||wt.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||xe.is(t.annotationId))}}(Ce||(Ce={})),function(e){e.create=function(e,t,n){let r={kind:"delete",uri:e};return void 0===t||void 0===t.recursive&&void 0===t.ignoreIfNotExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){let t=e;return t&&"delete"===t.kind&&wt.string(t.uri)&&(void 0===t.options||(void 0===t.options.recursive||wt.boolean(t.options.recursive))&&(void 0===t.options.ignoreIfNotExists||wt.boolean(t.options.ignoreIfNotExists)))&&(void 0===t.annotationId||xe.is(t.annotationId))}}(we||(we={})),function(e){e.is=function(e){let t=e;return t&&(void 0!==t.changes||void 0!==t.documentChanges)&&(void 0===t.documentChanges||t.documentChanges.every(e=>wt.string(e.kind)?Ne.is(e)||Ce.is(e)||we.is(e):Se.is(e)))}}(Le||(Le={}));!function(e){e.create=function(e){return{uri:e}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)}}(be||(be={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)&&wt.integer(t.version)}}(Oe||(Oe={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)&&(null===t.version||wt.integer(t.version))}}(_e||(_e={})),function(e){e.create=function(e,t,n,r){return{uri:e,languageId:t,version:n,text:r}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)&&wt.string(t.languageId)&&wt.integer(t.version)&&wt.string(t.text)}}(Pe||(Pe={})),function(e){e.PlainText="plaintext",e.Markdown="markdown",e.is=function(t){const n=t;return n===e.PlainText||n===e.Markdown}}(Me||(Me={})),function(e){e.is=function(e){const t=e;return wt.objectLiteral(e)&&Me.is(t.kind)&&wt.string(t.value)}}(De||(De={})),function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25}(Ue||(Ue={})),function(e){e.PlainText=1,e.Snippet=2}(Fe||(Fe={})),function(e){e.Deprecated=1}(Ge||(Ge={})),function(e){e.create=function(e,t,n){return{newText:e,insert:t,replace:n}},e.is=function(e){const t=e;return t&&wt.string(t.newText)&&ce.is(t.insert)&&ce.is(t.replace)}}(Ke||(Ke={})),function(e){e.asIs=1,e.adjustIndentation=2}(Be||(Be={})),function(e){e.is=function(e){const t=e;return t&&(wt.string(t.detail)||void 0===t.detail)&&(wt.string(t.description)||void 0===t.description)}}(je||(je={})),function(e){e.create=function(e){return{label:e}}}(Ve||(Ve={})),function(e){e.create=function(e,t){return{items:e||[],isIncomplete:!!t}}}(He||(He={})),function(e){e.fromPlainText=function(e){return e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")},e.is=function(e){const t=e;return wt.string(t)||wt.objectLiteral(t)&&wt.string(t.language)&&wt.string(t.value)}}(We||(We={})),function(e){e.is=function(e){let t=e;return!!t&&wt.objectLiteral(t)&&(De.is(t.contents)||We.is(t.contents)||wt.typedArray(t.contents,We.is))&&(void 0===e.range||ce.is(e.range))}}(ze||(ze={})),function(e){e.create=function(e,t){return t?{label:e,documentation:t}:{label:e}}}(Ye||(Ye={})),function(e){e.create=function(e,t,...n){let r={label:e};return wt.defined(t)&&(r.documentation=t),wt.defined(n)?r.parameters=n:r.parameters=[],r}}(Xe||(Xe={})),function(e){e.Text=1,e.Read=2,e.Write=3}(qe||(qe={})),function(e){e.create=function(e,t){let n={range:e};return wt.number(t)&&(n.kind=t),n}}(Qe||(Qe={})),function(e){e.File=1,e.Module=2,e.Namespace=3,e.Package=4,e.Class=5,e.Method=6,e.Property=7,e.Field=8,e.Constructor=9,e.Enum=10,e.Interface=11,e.Function=12,e.Variable=13,e.Constant=14,e.String=15,e.Number=16,e.Boolean=17,e.Array=18,e.Object=19,e.Key=20,e.Null=21,e.EnumMember=22,e.Struct=23,e.Event=24,e.Operator=25,e.TypeParameter=26}(Ze||(Ze={})),function(e){e.Deprecated=1}(Je||(Je={})),function(e){e.create=function(e,t,n,r,i){let s={name:e,kind:t,location:{uri:r,range:n}};return i&&(s.containerName=i),s}}(et||(et={})),function(e){e.create=function(e,t,n,r){return void 0!==r?{name:e,kind:t,location:{uri:n,range:r}}:{name:e,kind:t,location:{uri:n}}}}(tt||(tt={})),function(e){e.create=function(e,t,n,r,i,s){let a={name:e,detail:t,kind:n,range:r,selectionRange:i};return void 0!==s&&(a.children=s),a},e.is=function(e){let t=e;return t&&wt.string(t.name)&&wt.number(t.kind)&&ce.is(t.range)&&ce.is(t.selectionRange)&&(void 0===t.detail||wt.string(t.detail))&&(void 0===t.deprecated||wt.boolean(t.deprecated))&&(void 0===t.children||Array.isArray(t.children))&&(void 0===t.tags||Array.isArray(t.tags))}}(nt||(nt={})),function(e){e.Empty="",e.QuickFix="quickfix",e.Refactor="refactor",e.RefactorExtract="refactor.extract",e.RefactorInline="refactor.inline",e.RefactorRewrite="refactor.rewrite",e.Source="source",e.SourceOrganizeImports="source.organizeImports",e.SourceFixAll="source.fixAll"}(rt||(rt={})),function(e){e.Invoked=1,e.Automatic=2}(it||(it={})),function(e){e.create=function(e,t,n){let r={diagnostics:e};return null!=t&&(r.only=t),null!=n&&(r.triggerKind=n),r},e.is=function(e){let t=e;return wt.defined(t)&&wt.typedArray(t.diagnostics,Re.is)&&(void 0===t.only||wt.typedArray(t.only,wt.string))&&(void 0===t.triggerKind||t.triggerKind===it.Invoked||t.triggerKind===it.Automatic)}}(st||(st={})),function(e){e.create=function(e,t,n){let r={title:e},i=!0;return"string"==typeof t?(i=!1,r.kind=t):$e.is(t)?r.command=t:r.edit=t,i&&void 0!==n&&(r.kind=n),r},e.is=function(e){let t=e;return t&&wt.string(t.title)&&(void 0===t.diagnostics||wt.typedArray(t.diagnostics,Re.is))&&(void 0===t.kind||wt.string(t.kind))&&(void 0!==t.edit||void 0!==t.command)&&(void 0===t.command||$e.is(t.command))&&(void 0===t.isPreferred||wt.boolean(t.isPreferred))&&(void 0===t.edit||Le.is(t.edit))}}(at||(at={})),function(e){e.create=function(e,t){let n={range:e};return wt.defined(t)&&(n.data=t),n},e.is=function(e){let t=e;return wt.defined(t)&&ce.is(t.range)&&(wt.undefined(t.command)||$e.is(t.command))}}(ot||(ot={})),function(e){e.create=function(e,t){return{tabSize:e,insertSpaces:t}},e.is=function(e){let t=e;return wt.defined(t)&&wt.uinteger(t.tabSize)&&wt.boolean(t.insertSpaces)}}(lt||(lt={})),function(e){e.create=function(e,t,n){return{range:e,target:t,data:n}},e.is=function(e){let t=e;return wt.defined(t)&&ce.is(t.range)&&(wt.undefined(t.target)||wt.string(t.target))}}(ct||(ct={})),function(e){e.create=function(e,t){return{range:e,parent:t}},e.is=function(t){let n=t;return wt.objectLiteral(n)&&ce.is(n.range)&&(void 0===n.parent||e.is(n.parent))}}(ut||(ut={})),function(e){e.namespace="namespace",e.type="type",e.class="class",e.enum="enum",e.interface="interface",e.struct="struct",e.typeParameter="typeParameter",e.parameter="parameter",e.variable="variable",e.property="property",e.enumMember="enumMember",e.event="event",e.function="function",e.method="method",e.macro="macro",e.keyword="keyword",e.modifier="modifier",e.comment="comment",e.string="string",e.number="number",e.regexp="regexp",e.operator="operator",e.decorator="decorator"}(dt||(dt={})),function(e){e.declaration="declaration",e.definition="definition",e.readonly="readonly",e.static="static",e.deprecated="deprecated",e.abstract="abstract",e.async="async",e.modification="modification",e.documentation="documentation",e.defaultLibrary="defaultLibrary"}(ht||(ht={})),function(e){e.is=function(e){const t=e;return wt.objectLiteral(t)&&(void 0===t.resultId||"string"==typeof t.resultId)&&Array.isArray(t.data)&&(0===t.data.length||"number"==typeof t.data[0])}}(ft||(ft={})),function(e){e.create=function(e,t){return{range:e,text:t}},e.is=function(e){const t=e;return null!=t&&ce.is(t.range)&&wt.string(t.text)}}(pt||(pt={})),function(e){e.create=function(e,t,n){return{range:e,variableName:t,caseSensitiveLookup:n}},e.is=function(e){const t=e;return null!=t&&ce.is(t.range)&&wt.boolean(t.caseSensitiveLookup)&&(wt.string(t.variableName)||void 0===t.variableName)}}(mt||(mt={})),function(e){e.create=function(e,t){return{range:e,expression:t}},e.is=function(e){const t=e;return null!=t&&ce.is(t.range)&&(wt.string(t.expression)||void 0===t.expression)}}(gt||(gt={})),function(e){e.create=function(e,t){return{frameId:e,stoppedLocation:t}},e.is=function(e){const t=e;return wt.defined(t)&&ce.is(e.stoppedLocation)}}(yt||(yt={})),function(e){e.Type=1,e.Parameter=2,e.is=function(e){return 1===e||2===e}}(Tt||(Tt={})),function(e){e.create=function(e){return{value:e}},e.is=function(e){const t=e;return wt.objectLiteral(t)&&(void 0===t.tooltip||wt.string(t.tooltip)||De.is(t.tooltip))&&(void 0===t.location||ue.is(t.location))&&(void 0===t.command||$e.is(t.command))}}(At||(At={})),function(e){e.create=function(e,t,n){const r={position:e,label:t};return void 0!==n&&(r.kind=n),r},e.is=function(e){const t=e;return wt.objectLiteral(t)&&le.is(t.position)&&(wt.string(t.label)||wt.typedArray(t.label,At.is))&&(void 0===t.kind||Tt.is(t.kind))&&void 0===t.textEdits||wt.typedArray(t.textEdits,Ee.is)&&(void 0===t.tooltip||wt.string(t.tooltip)||De.is(t.tooltip))&&(void 0===t.paddingLeft||wt.boolean(t.paddingLeft))&&(void 0===t.paddingRight||wt.boolean(t.paddingRight))}}(vt||(vt={})),function(e){e.createSnippet=function(e){return{kind:"snippet",value:e}}}(Rt||(Rt={})),function(e){e.create=function(e,t,n,r){return{insertText:e,filterText:t,range:n,command:r}}}($t||($t={})),function(e){e.create=function(e){return{items:e}}}(Et||(Et={})),function(e){e.Invoked=0,e.Automatic=1}(kt||(kt={})),function(e){e.create=function(e,t){return{range:e,text:t}}}(xt||(xt={})),function(e){e.create=function(e,t){return{triggerKind:e,selectedCompletionInfo:t}}}(It||(It={})),function(e){e.is=function(e){const t=e;return wt.objectLiteral(t)&&se.is(t.uri)&&wt.string(t.name)}}(St||(St={}));var Ct,wt;!function(e){function t(e,n){if(e.length<=1)return e;const r=e.length/2|0,i=e.slice(0,r),s=e.slice(r);t(i,n),t(s,n);let a=0,o=0,l=0;for(;a<i.length&&o<s.length;){let t=n(i[a],s[o]);e[l++]=t<=0?i[a++]:s[o++]}for(;a<i.length;)e[l++]=i[a++];for(;o<s.length;)e[l++]=s[o++];return e}e.create=function(e,t,n,r){return new Lt(e,t,n,r)},e.is=function(e){let t=e;return!!(wt.defined(t)&&wt.string(t.uri)&&(wt.undefined(t.languageId)||wt.string(t.languageId))&&wt.uinteger(t.lineCount)&&wt.func(t.getText)&&wt.func(t.positionAt)&&wt.func(t.offsetAt))},e.applyEdits=function(e,n){let r=e.getText(),i=t(n,(e,t)=>{let n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n}),s=r.length;for(let t=i.length-1;t>=0;t--){let n=i[t],a=e.offsetAt(n.range.start),o=e.offsetAt(n.range.end);if(!(o<=s))throw new Error("Overlapping edit");r=r.substring(0,a)+n.newText+r.substring(o,r.length),s=a}return r}}(Ct||(Ct={}));class Lt{constructor(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){let t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content}update(e,t){this._content=e.text,this._version=t,this._lineOffsets=void 0}getLineOffsets(){if(void 0===this._lineOffsets){let e=[],t=this._content,n=!0;for(let r=0;r<t.length;r++){n&&(e.push(r),n=!1);let i=t.charAt(r);n="\r"===i||"\n"===i,"\r"===i&&r+1<t.length&&"\n"===t.charAt(r+1)&&r++}n&&t.length>0&&e.push(t.length),this._lineOffsets=e}return this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);let t=this.getLineOffsets(),n=0,r=t.length;if(0===r)return le.create(0,e);for(;n<r;){let i=Math.floor((n+r)/2);t[i]>e?r=i:n=i+1}let i=n-1;return le.create(i,e-t[i])}offsetAt(e){let t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;let n=t[e.line],r=e.line+1<t.length?t[e.line+1]:this._content.length;return Math.max(Math.min(n+e.character,r),n)}get lineCount(){return this.getLineOffsets().length}}!function(e){const t=Object.prototype.toString;e.defined=function(e){return void 0!==e},e.undefined=function(e){return void 0===e},e.boolean=function(e){return!0===e||!1===e},e.string=function(e){return"[object String]"===t.call(e)},e.number=function(e){return"[object Number]"===t.call(e)},e.numberRange=function(e,n,r){return"[object Number]"===t.call(e)&&n<=e&&e<=r},e.integer=function(e){return"[object Number]"===t.call(e)&&-2147483648<=e&&e<=2147483647},e.uinteger=function(e){return"[object Number]"===t.call(e)&&0<=e&&e<=2147483647},e.func=function(e){return"[object Function]"===t.call(e)},e.objectLiteral=function(e){return null!==e&&"object"==typeof e},e.typedArray=function(e,t){return Array.isArray(e)&&e.every(t)}}(wt||(wt={}));class bt{constructor(){this.nodeStack=[]}get current(){var e;return null!==(e=this.nodeStack[this.nodeStack.length-1])&&void 0!==e?e:this.rootNode}buildRootNode(e){return this.rootNode=new Dt(e),this.rootNode.root=this.rootNode,this.nodeStack=[this.rootNode],this.rootNode}buildCompositeNode(e){const t=new Pt;return t.grammarSource=e,t.root=this.rootNode,this.current.content.push(t),this.nodeStack.push(t),t}buildLeafNode(e,t){const n=new _t(e.startOffset,e.image.length,(0,r.wf)(e),e.tokenType,!t);return n.grammarSource=t,n.root=this.rootNode,this.current.content.push(n),n}removeNode(e){const t=e.container;if(t){const n=t.content.indexOf(e);n>=0&&t.content.splice(n,1)}}addHiddenNodes(e){const t=[];for(const s of e){const e=new _t(s.startOffset,s.image.length,(0,r.wf)(s),s.tokenType,!0);e.root=this.rootNode,t.push(e)}let n=this.current,i=!1;if(n.content.length>0)n.content.push(...t);else{for(;n.container;){const e=n.container.content.indexOf(n);if(e>0){n.container.content.splice(e,0,...t),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...t)}}construct(e){const t=this.current;"string"==typeof e.$type&&(this.current.astNode=e),e.$cstNode=t;const n=this.nodeStack.pop();0===(null==n?void 0:n.content.length)&&this.removeNode(n)}}class Ot{get parent(){return this.container}get feature(){return this.grammarSource}get hidden(){return!1}get astNode(){var e,t;const n="string"==typeof(null===(e=this._astNode)||void 0===e?void 0:e.$type)?this._astNode:null===(t=this.container)||void 0===t?void 0:t.astNode;if(!n)throw new Error("This node has no associated AST element");return n}set astNode(e){this._astNode=e}get element(){return this.astNode}get text(){return this.root.fullText.substring(this.offset,this.end)}}class _t extends Ot{get offset(){return this._offset}get length(){return this._length}get end(){return this._offset+this._length}get hidden(){return this._hidden}get tokenType(){return this._tokenType}get range(){return this._range}constructor(e,t,n,r,i=!1){super(),this._hidden=i,this._offset=e,this._tokenType=r,this._length=t,this._range=n}}class Pt extends Ot{constructor(){super(...arguments),this.content=new Mt(this)}get children(){return this.content}get offset(){var e,t;return null!==(t=null===(e=this.firstNonHiddenNode)||void 0===e?void 0:e.offset)&&void 0!==t?t:0}get length(){return this.end-this.offset}get end(){var e,t;return null!==(t=null===(e=this.lastNonHiddenNode)||void 0===e?void 0:e.end)&&void 0!==t?t:0}get range(){const e=this.firstNonHiddenNode,t=this.lastNonHiddenNode;if(e&&t){if(void 0===this._rangeCache){const{range:n}=e,{range:r}=t;this._rangeCache={start:n.start,end:r.end.line<n.start.line?n.start:r.end}}return this._rangeCache}return{start:le.create(0,0),end:le.create(0,0)}}get firstNonHiddenNode(){for(const e of this.content)if(!e.hidden)return e;return this.content[0]}get lastNonHiddenNode(){for(let e=this.content.length-1;e>=0;e--){const t=this.content[e];if(!t.hidden)return t}return this.content[this.content.length-1]}}class Mt extends Array{constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,Mt.prototype)}push(...e){return this.addParents(e),super.push(...e)}unshift(...e){return this.addParents(e),super.unshift(...e)}splice(e,t,...n){return this.addParents(n),super.splice(e,t,...n)}addParents(e){for(const t of e)t.container=this.parent}}class Dt extends Pt{get text(){return this._text.substring(this.offset,this.end)}get fullText(){return this._text}constructor(e){super(),this._text="",this._text=null!=e?e:""}}const Ut=Symbol("Datatype");function Ft(e){return e.$type===Ut}const Gt=e=>e.endsWith("\u200b")?e:e+"\u200b";class Kt{constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;const t=this.lexer.definition,n="production"===e.LanguageMetaData.mode;this.wrapper=new zt(t,Object.assign(Object.assign({},e.parser.ParserConfig),{skipValidations:n,errorMessageProvider:e.parser.ParserErrorMessageProvider}))}alternatives(e,t){this.wrapper.wrapOr(e,t)}optional(e,t){this.wrapper.wrapOption(e,t)}many(e,t){this.wrapper.wrapMany(e,t)}atLeastOne(e,t){this.wrapper.wrapAtLeastOne(e,t)}getRule(e){return this.allRules.get(e)}isRecording(){return this.wrapper.IS_RECORDING}get unorderedGroups(){return this._unorderedGroups}getRuleStack(){return this.wrapper.RULE_STACK}finalize(){this.wrapper.wrapSelfAnalysis()}}class Bt extends Kt{get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new bt,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,t){const n=this.computeRuleType(e),r=this.wrapper.DEFINE_RULE(Gt(e.name),this.startImplementation(n,t).bind(this));return this.allRules.set(e.name,r),e.entry&&(this.mainRule=r),r}computeRuleType(e){if(!e.fragment){if((0,i.Xq)(e))return Ut;{const t=(0,i.PV)(e);return null!=t?t:e.name}}}parse(e,t={}){this.nodeBuilder.buildRootNode(e);const n=this.lexerResult=this.lexer.tokenize(e);this.wrapper.input=n.tokens;const r=t.rule?this.allRules.get(t.rule):this.mainRule;if(!r)throw new Error(t.rule?`No rule found with name '${t.rule}'`:"No main rule available.");const i=r.call(this.wrapper,{});return this.nodeBuilder.addHiddenNodes(n.hidden),this.unorderedGroups.clear(),this.lexerResult=void 0,{value:i,lexerErrors:n.errors,lexerReport:n.report,parserErrors:this.wrapper.errors}}startImplementation(e,t){return n=>{const r=!this.isRecording()&&void 0!==e;if(r){const t={$type:e};this.stack.push(t),e===Ut&&(t.value="")}let i;try{i=t(n)}catch(s){i=void 0}return void 0===i&&r&&(i=this.construct()),i}}extractHiddenTokens(e){const t=this.lexerResult.hidden;if(!t.length)return[];const n=e.startOffset;for(let r=0;r<t.length;r++){if(t[r].startOffset>n)return t.splice(0,r)}return t.splice(0,t.length)}consume(e,t,n){const r=this.wrapper.wrapConsume(e,t);if(!this.isRecording()&&this.isValidToken(r)){const e=this.extractHiddenTokens(r);this.nodeBuilder.addHiddenNodes(e);const t=this.nodeBuilder.buildLeafNode(r,n),{assignment:i,isCrossRef:s}=this.getAssignment(n),o=this.current;if(i){const e=(0,a.wb)(n)?r.image:this.converter.convert(r.image,t);this.assign(i.operator,i.feature,e,t,s)}else if(Ft(o)){let e=r.image;(0,a.wb)(n)||(e=this.converter.convert(e,t).toString()),o.value+=e}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&"number"==typeof e.endOffset&&!isNaN(e.endOffset)}subrule(e,t,n,r,i){let s;this.isRecording()||n||(s=this.nodeBuilder.buildCompositeNode(r));const a=this.wrapper.wrapSubrule(e,t,i);!this.isRecording()&&s&&s.length>0&&this.performSubruleAssignment(a,r,s)}performSubruleAssignment(e,t,n){const{assignment:r,isCrossRef:i}=this.getAssignment(t);if(r)this.assign(r.operator,r.feature,e,n,i);else if(!r){const t=this.current;if(Ft(t))t.value+=e.toString();else if("object"==typeof e&&e){const n=this.assignWithoutOverride(e,t);this.stack.pop(),this.stack.push(n)}}}action(e,t){if(!this.isRecording()){let n=this.current;if(t.feature&&t.operator){n=this.construct(),this.nodeBuilder.removeNode(n.$cstNode);this.nodeBuilder.buildCompositeNode(t).content.push(n.$cstNode);const r={$type:e};this.stack.push(r),this.assign(t.operator,t.feature,n,n.$cstNode,!1)}else n.$type=e}}construct(){if(this.isRecording())return;const e=this.current;return(0,Nt.SD)(e),this.nodeBuilder.construct(e),this.stack.pop(),Ft(e)?this.converter.convert(e.value,e.$cstNode):((0,Nt.OP)(this.astReflection,e),e)}getAssignment(e){if(!this.assignmentMap.has(e)){const t=(0,Nt.XG)(e,a.wh);this.assignmentMap.set(e,{assignment:t,isCrossRef:!!t&&(0,a._c)(t.terminal)})}return this.assignmentMap.get(e)}assign(e,t,n,r,i){const s=this.current;let a;switch(a=i&&"string"==typeof n?this.linker.buildReference(s,t,r,n):n,e){case"=":s[t]=a;break;case"?=":s[t]=!0;break;case"+=":Array.isArray(s[t])||(s[t]=[]),s[t].push(a)}}assignWithoutOverride(e,t){for(const[r,i]of Object.entries(t)){const t=e[r];void 0===t?e[r]=i:Array.isArray(t)&&Array.isArray(i)&&(i.push(...t),e[r]=i)}const n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}}class jt{buildMismatchTokenMessage(e){return o.my.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return o.my.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return o.my.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return o.my.buildEarlyExitMessage(e)}}class Vt extends jt{buildMismatchTokenMessage({expected:e,actual:t}){return`Expecting ${e.LABEL?"`"+e.LABEL+"`":e.name.endsWith(":KW")?`keyword '${e.name.substring(0,e.name.length-3)}'`:`token of type '${e.name}'`} but found \`${t.image}\`.`}buildNotAllInputParsedMessage({firstRedundant:e}){return`Expecting end of file but found \`${e.image}\`.`}}class Ht extends Kt{constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();const t=this.lexer.tokenize(e,{mode:"partial"});return this.tokens=t.tokens,this.wrapper.input=[...this.tokens],this.mainRule.call(this.wrapper,{}),this.unorderedGroups.clear(),{tokens:this.tokens,elementStack:[...this.lastElementStack],tokenIndex:this.nextTokenIndex}}rule(e,t){const n=this.wrapper.DEFINE_RULE(Gt(e.name),this.startImplementation(t).bind(this));return this.allRules.set(e.name,n),e.entry&&(this.mainRule=n),n}resetState(){this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}startImplementation(e){return t=>{const n=this.keepStackSize();try{e(t)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){const e=this.elementStack.length;return this.stackSize=e,e}resetStackSize(e){this.removeUnexpectedElements(),this.stackSize=e}consume(e,t,n){this.wrapper.wrapConsume(e,t),this.isRecording()||(this.lastElementStack=[...this.elementStack,n],this.nextTokenIndex=this.currIdx+1)}subrule(e,t,n,r,i){this.before(r),this.wrapper.wrapSubrule(e,t,i),this.after(r)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){const t=this.elementStack.lastIndexOf(e);t>=0&&this.elementStack.splice(t)}}get currIdx(){return this.wrapper.currIdx}}const Wt={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new Vt};class zt extends o.jr{constructor(e,t){const n=t&&"maxLookahead"in t;super(e,Object.assign(Object.assign(Object.assign({},Wt),{lookaheadStrategy:n?new o.T6({maxLookahead:t.maxLookahead}):new j({logging:t.skipValidations?()=>{}:void 0})}),t))}get IS_RECORDING(){return this.RECORDING_PHASE}DEFINE_RULE(e,t){return this.RULE(e,t)}wrapSelfAnalysis(){this.performSelfAnalysis()}wrapConsume(e,t){return this.consume(e,t)}wrapSubrule(e,t,n){return this.subrule(e,t,{ARGS:[n]})}wrapOr(e,t){this.or(e,t)}wrapOption(e,t){this.option(e,t)}wrapMany(e,t){this.many(e,t)}wrapAtLeastOne(e,t){this.atLeastOne(e,t)}}var Yt=n(36610),Xt=n(93897);function qt(e,t,n){return function(e,t){const n=(0,i.YV)(t,!1),r=(0,Xt.Td)(t.rules).filter(a.s7).filter(e=>n.has(e));for(const i of r){const t=Object.assign(Object.assign({},e),{consume:1,optional:1,subrule:1,many:1,or:1});e.parser.rule(i,Qt(t,i.definition))}}({parser:t,tokens:n,ruleNames:new Map},e),t}function Qt(e,t,n=!1){let r;if((0,a.wb)(t))r=function(e,t){const n=e.consume++,r=e.tokens[t.value];if(!r)throw new Error("Could not find token for keyword: "+t.value);return()=>e.parser.consume(n,r,t)}(e,t);else if((0,a.ve)(t))r=function(e,t){const n=(0,i.Uz)(t);return()=>e.parser.action(n,t)}(e,t);else if((0,a.wh)(t))r=Qt(e,t.terminal);else if((0,a._c)(t))r=en(e,t);else if((0,a.$g)(t))r=function(e,t){const n=t.rule.ref;if((0,a.s7)(n)){const r=e.subrule++,i=n.fragment,s=t.arguments.length>0?function(e,t){const n=t.map(e=>Zt(e.value));return t=>{const r={};for(let i=0;i<n.length;i++){const s=e.parameters[i],a=n[i];r[s.name]=a(t)}return r}}(n,t.arguments):()=>({});return a=>e.parser.subrule(r,nn(e,n),i,t,s(a))}if((0,a.rE)(n)){const r=e.consume++,i=rn(e,n.name);return()=>e.parser.consume(r,i,t)}if(!n)throw new Yt.W(t.$cstNode,`Undefined rule: ${t.rule.$refText}`);(0,Yt.d)(n)}(e,t);else if((0,a.jp)(t))r=function(e,t){if(1===t.elements.length)return Qt(e,t.elements[0]);{const n=[];for(const i of t.elements){const t={ALT:Qt(e,i,!0)},r=Jt(i);r&&(t.GATE=Zt(r)),n.push(t)}const r=e.or++;return t=>e.parser.alternatives(r,n.map(e=>{const n={ALT:()=>e.ALT(t)},r=e.GATE;return r&&(n.GATE=()=>r(t)),n}))}}(e,t);else if((0,a.cY)(t))r=function(e,t){if(1===t.elements.length)return Qt(e,t.elements[0]);const n=[];for(const o of t.elements){const t={ALT:Qt(e,o,!0)},r=Jt(o);r&&(t.GATE=Zt(r)),n.push(t)}const r=e.or++,i=(e,t)=>`uGroup_${e}_${t.getRuleStack().join("-")}`,s=t=>e.parser.alternatives(r,n.map((n,s)=>{const a={ALT:()=>!0},o=e.parser;a.ALT=()=>{if(n.ALT(t),!o.isRecording()){const e=i(r,o);o.unorderedGroups.get(e)||o.unorderedGroups.set(e,[]);const t=o.unorderedGroups.get(e);void 0===(null==t?void 0:t[s])&&(t[s]=!0)}};const l=n.GATE;return a.GATE=l?()=>l(t):()=>{const e=o.unorderedGroups.get(i(r,o));return!(null==e?void 0:e[s])},a})),a=tn(e,Jt(t),s,"*");return t=>{a(t),e.parser.isRecording()||e.parser.unorderedGroups.delete(i(r,e.parser))}}(e,t);else if((0,a.IZ)(t))r=function(e,t){const n=t.elements.map(t=>Qt(e,t));return e=>n.forEach(t=>t(e))}(e,t);else{if(!(0,a.FO)(t))throw new Yt.W(t.$cstNode,`Unexpected element type: ${t.$type}`);{const n=e.consume++;r=()=>e.parser.consume(n,o.LT,t)}}return tn(e,n?void 0:Jt(t),r,t.cardinality)}function Zt(e){if((0,a.RP)(e)){const t=Zt(e.left),n=Zt(e.right);return e=>t(e)||n(e)}if((0,a.Tu)(e)){const t=Zt(e.left),n=Zt(e.right);return e=>t(e)&&n(e)}if((0,a.Ct)(e)){const t=Zt(e.value);return e=>!t(e)}if((0,a.TF)(e)){const t=e.parameter.ref.name;return e=>void 0!==e&&!0===e[t]}if((0,a.Cz)(e)){const t=Boolean(e.true);return()=>t}(0,Yt.d)(e)}function Jt(e){if((0,a.IZ)(e))return e.guardCondition}function en(e,t,n=t.terminal){if(n){if((0,a.$g)(n)&&(0,a.s7)(n.rule.ref)){const r=n.rule.ref,i=e.subrule++;return n=>e.parser.subrule(i,nn(e,r),!1,t,n)}if((0,a.$g)(n)&&(0,a.rE)(n.rule.ref)){const r=e.consume++,i=rn(e,n.rule.ref.name);return()=>e.parser.consume(r,i,t)}if((0,a.wb)(n)){const r=e.consume++,i=rn(e,n.value);return()=>e.parser.consume(r,i,t)}throw new Error("Could not build cross reference parser")}{if(!t.type.ref)throw new Error("Could not resolve reference to type: "+t.type.$refText);const n=(0,i.U5)(t.type.ref),r=null==n?void 0:n.terminal;if(!r)throw new Error("Could not find name assignment for type: "+(0,i.Uz)(t.type.ref));return en(e,t,r)}}function tn(e,t,n,r){const i=t&&Zt(t);if(!r){if(i){const t=e.or++;return r=>e.parser.alternatives(t,[{ALT:()=>n(r),GATE:()=>i(r)},{ALT:(0,o.mT)(),GATE:()=>!i(r)}])}return n}if("*"===r){const t=e.many++;return r=>e.parser.many(t,{DEF:()=>n(r),GATE:i?()=>i(r):void 0})}if("+"===r){const t=e.many++;if(i){const r=e.or++;return s=>e.parser.alternatives(r,[{ALT:()=>e.parser.atLeastOne(t,{DEF:()=>n(s)}),GATE:()=>i(s)},{ALT:(0,o.mT)(),GATE:()=>!i(s)}])}return r=>e.parser.atLeastOne(t,{DEF:()=>n(r)})}if("?"===r){const t=e.optional++;return r=>e.parser.optional(t,{DEF:()=>n(r),GATE:i?()=>i(r):void 0})}(0,Yt.d)(r)}function nn(e,t){const n=function(e,t){if((0,a.s7)(t))return t.name;if(e.ruleNames.has(t))return e.ruleNames.get(t);{let n=t,r=n.$container,i=t.$type;for(;!(0,a.s7)(r);){if((0,a.IZ)(r)||(0,a.jp)(r)||(0,a.cY)(r)){i=r.elements.indexOf(n).toString()+":"+i}n=r,r=r.$container}return i=r.name+":"+i,e.ruleNames.set(t,i),i}}(e,t),r=e.parser.getRule(n);if(!r)throw new Error(`Rule "${n}" not found."`);return r}function rn(e,t){const n=e.tokens[t];if(!n)throw new Error(`Token "${t}" not found."`);return n}function sn(e){const t=function(e){const t=e.Grammar,n=e.parser.Lexer,r=new Bt(e);return qt(t,r,n.definition)}(e);return t.finalize(),t}var an=n(89212),on=n(12223),ln=n(20202),cn=n(64913);let un=0,dn=10;const hn=Symbol("OperationCancelled");function fn(e){return e===hn}async function pn(e){if(e===ln.XO.None)return;const t=performance.now();if(t-un>=dn&&(un=t,await new Promise(e=>{"undefined"==typeof setImmediate?setTimeout(e,0):setImmediate(e)}),un=performance.now()),e.isCancellationRequested)throw hn}class mn{constructor(){this.promise=new Promise((e,t)=>{this.resolve=t=>(e(t),this),this.reject=e=>(t(e),this)})}}class gn{constructor(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){const t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content}update(e,t){for(const n of e)if(gn.isIncremental(n)){const e=Rn(n.range),t=this.offsetAt(e.start),r=this.offsetAt(e.end);this._content=this._content.substring(0,t)+n.text+this._content.substring(r,this._content.length);const i=Math.max(e.start.line,0),s=Math.max(e.end.line,0);let a=this._lineOffsets;const o=An(n.text,!1,t);if(s-i===o.length)for(let n=0,c=o.length;n<c;n++)a[n+i+1]=o[n];else o.length<1e4?a.splice(i+1,s-i,...o):this._lineOffsets=a=a.slice(0,i+1).concat(o,a.slice(s+1));const l=n.text.length-(r-t);if(0!==l)for(let n=i+1+o.length,c=a.length;n<c;n++)a[n]=a[n]+l}else{if(!gn.isFull(n))throw new Error("Unknown change event received");this._content=n.text,this._lineOffsets=void 0}this._version=t}getLineOffsets(){return void 0===this._lineOffsets&&(this._lineOffsets=An(this._content,!0)),this._lineOffsets}positionAt(e){e=Math.max(Math.min(e,this._content.length),0);const t=this.getLineOffsets();let n=0,r=t.length;if(0===r)return{line:0,character:e};for(;n<r;){const i=Math.floor((n+r)/2);t[i]>e?r=i:n=i+1}const i=n-1;return{line:i,character:(e=this.ensureBeforeEOL(e,t[i]))-t[i]}}offsetAt(e){const t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;const n=t[e.line];if(e.character<=0)return n;const r=e.line+1<t.length?t[e.line+1]:this._content.length,i=Math.min(n+e.character,r);return this.ensureBeforeEOL(i,n)}ensureBeforeEOL(e,t){for(;e>t&&vn(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){const t=e;return null!=t&&"string"==typeof t.text&&void 0!==t.range&&(void 0===t.rangeLength||"number"==typeof t.rangeLength)}static isFull(e){const t=e;return null!=t&&"string"==typeof t.text&&void 0===t.range&&void 0===t.rangeLength}}var yn;function Tn(e,t){if(e.length<=1)return e;const n=e.length/2|0,r=e.slice(0,n),i=e.slice(n);Tn(r,t),Tn(i,t);let s=0,a=0,o=0;for(;s<r.length&&a<i.length;){const n=t(r[s],i[a]);e[o++]=n<=0?r[s++]:i[a++]}for(;s<r.length;)e[o++]=r[s++];for(;a<i.length;)e[o++]=i[a++];return e}function An(e,t,n=0){const r=t?[n]:[];for(let i=0;i<e.length;i++){const t=e.charCodeAt(i);vn(t)&&(13===t&&i+1<e.length&&10===e.charCodeAt(i+1)&&i++,r.push(n+i+1))}return r}function vn(e){return 13===e||10===e}function Rn(e){const t=e.start,n=e.end;return t.line>n.line||t.line===n.line&&t.character>n.character?{start:n,end:t}:e}function $n(e){const t=Rn(e.range);return t!==e.range?{newText:e.newText,range:t}:e}!function(e){e.create=function(e,t,n,r){return new gn(e,t,n,r)},e.update=function(e,t,n){if(e instanceof gn)return e.update(t,n),e;throw new Error("TextDocument.update: document must be created by TextDocument.create")},e.applyEdits=function(e,t){const n=e.getText(),r=Tn(t.map($n),(e,t)=>{const n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n});let i=0;const s=[];for(const a of r){const t=e.offsetAt(a.range.start);if(t<i)throw new Error("Overlapping edit");t>i&&s.push(n.substring(i,t)),a.newText.length&&s.push(a.newText),i=e.offsetAt(a.range.end)}return s.push(n.substr(i)),s.join("")}}(yn||(yn={}));var En,kn=n(55216);!function(e){e[e.Changed=0]="Changed",e[e.Parsed=1]="Parsed",e[e.IndexedContent=2]="IndexedContent",e[e.ComputedScopes=3]="ComputedScopes",e[e.Linked=4]="Linked",e[e.IndexedReferences=5]="IndexedReferences",e[e.Validated=6]="Validated"}(En||(En={}));class xn{constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e,t=ln.XO.None){const n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,t)}fromTextDocument(e,t,n){return t=null!=t?t:kn.r.parse(e.uri),ln.XO.is(n)?this.createAsync(t,e,n):this.create(t,e,n)}fromString(e,t,n){return ln.XO.is(n)?this.createAsync(t,e,n):this.create(t,e,n)}fromModel(e,t){return this.create(t,{$model:e})}create(e,t,n){if("string"==typeof t){const r=this.parse(e,t,n);return this.createLangiumDocument(r,e,void 0,t)}if("$model"in t){const n={value:t.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(n,e)}{const r=this.parse(e,t.getText(),n);return this.createLangiumDocument(r,e,t)}}async createAsync(e,t,n){if("string"==typeof t){const r=await this.parseAsync(e,t,n);return this.createLangiumDocument(r,e,void 0,t)}{const r=await this.parseAsync(e,t.getText(),n);return this.createLangiumDocument(r,e,t)}}createLangiumDocument(e,t,n,r){let i;if(n)i={parseResult:e,uri:t,state:En.Parsed,references:[],textDocument:n};else{const n=this.createTextDocumentGetter(t,r);i={parseResult:e,uri:t,state:En.Parsed,references:[],get textDocument(){return n()}}}return e.value.$document=i,i}async update(e,t){var n,r;const i=null===(n=e.parseResult.value.$cstNode)||void 0===n?void 0:n.root.fullText,s=null===(r=this.textDocuments)||void 0===r?void 0:r.get(e.uri.toString()),a=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{const t=this.createTextDocumentGetter(e.uri,a);Object.defineProperty(e,"textDocument",{get:t})}return i!==a&&(e.parseResult=await this.parseAsync(e.uri,a,t),e.parseResult.value.$document=e),e.state=En.Parsed,e}parse(e,t,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(t,n)}parseAsync(e,t,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(t,n)}createTextDocumentGetter(e,t){const n=this.serviceRegistry;let r;return()=>null!=r?r:r=yn.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,null!=t?t:"")}}class In{constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.serviceRegistry=e.ServiceRegistry}get all(){return(0,Xt.Td)(this.documentMap.values())}addDocument(e){const t=e.uri.toString();if(this.documentMap.has(t))throw new Error(`A document with the URI '${t}' is already present.`);this.documentMap.set(t,e)}getDocument(e){const t=e.toString();return this.documentMap.get(t)}async getOrCreateDocument(e,t){let n=this.getDocument(e);return n||(n=await this.langiumDocumentFactory.fromUri(e,t),this.addDocument(n),n)}createDocument(e,t,n){if(n)return this.langiumDocumentFactory.fromString(t,e,n).then(e=>(this.addDocument(e),e));{const n=this.langiumDocumentFactory.fromString(t,e);return this.addDocument(n),n}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){const t=e.toString(),n=this.documentMap.get(t);if(n){this.serviceRegistry.getServices(e).references.Linker.unlink(n),n.state=En.Changed,n.precomputedScopes=void 0,n.diagnostics=void 0}return n}deleteDocument(e){const t=e.toString(),n=this.documentMap.get(t);return n&&(n.state=En.Changed,this.documentMap.delete(t)),n}}const Sn=Symbol("ref_resolving");class Nn{constructor(e){this.reflection=e.shared.AstReflection,this.langiumDocuments=()=>e.shared.workspace.LangiumDocuments,this.scopeProvider=e.references.ScopeProvider,this.astNodeLocator=e.workspace.AstNodeLocator}async link(e,t=ln.XO.None){for(const n of(0,Nt.jm)(e.parseResult.value))await pn(t),(0,Nt.DM)(n).forEach(t=>this.doLink(t,e))}doLink(e,t){var n;const r=e.reference;if(void 0===r._ref){r._ref=Sn;try{const t=this.getCandidate(e);if((0,cn.Zl)(t))r._ref=t;else if(r._nodeDescription=t,this.langiumDocuments().hasDocument(t.documentUri)){const n=this.loadAstNode(t);r._ref=null!=n?n:this.createLinkingError(e,t)}else r._ref=void 0}catch(i){console.error(`An error occurred while resolving reference to '${r.$refText}':`,i);const t=null!==(n=i.message)&&void 0!==n?n:String(i);r._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${r.$refText}': ${t}`})}t.references.push(r)}}unlink(e){for(const t of e.references)delete t._ref,delete t._nodeDescription;e.references=[]}getCandidate(e){const t=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return null!=t?t:this.createLinkingError(e)}buildReference(e,t,n,r){const i=this,s={$refNode:n,$refText:r,get ref(){var n;if((0,cn.ng)(this._ref))return this._ref;if((0,cn.Nr)(this._nodeDescription)){const n=i.loadAstNode(this._nodeDescription);this._ref=null!=n?n:i.createLinkingError({reference:s,container:e,property:t},this._nodeDescription)}else if(void 0===this._ref){this._ref=Sn;const r=(0,Nt.cQ)(e).$document,a=i.getLinkedNode({reference:s,container:e,property:t});if(a.error&&r&&r.state<En.ComputedScopes)return this._ref=void 0;this._ref=null!==(n=a.node)&&void 0!==n?n:a.error,this._nodeDescription=a.descr,null==r||r.references.push(this)}else if(this._ref===Sn)throw new Error(`Cyclic reference resolution detected: ${i.astNodeLocator.getAstNodePath(e)}/${t} (symbol '${r}')`);return(0,cn.ng)(this._ref)?this._ref:void 0},get $nodeDescription(){return this._nodeDescription},get error(){return(0,cn.Zl)(this._ref)?this._ref:void 0}};return s}getLinkedNode(e){var t;try{const t=this.getCandidate(e);if((0,cn.Zl)(t))return{error:t};const n=this.loadAstNode(t);return n?{node:n,descr:t}:{descr:t,error:this.createLinkingError(e,t)}}catch(n){console.error(`An error occurred while resolving reference to '${e.reference.$refText}':`,n);const r=null!==(t=n.message)&&void 0!==t?t:String(n);return{error:Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${e.reference.$refText}': ${r}`})}}}loadAstNode(e){if(e.node)return e.node;const t=this.langiumDocuments().getDocument(e.documentUri);return t?this.astNodeLocator.getAstNode(t.parseResult.value,e.path):void 0}createLinkingError(e,t){const n=(0,Nt.cQ)(e.container).$document;n&&n.state<En.ComputedScopes&&console.warn(`Attempted reference resolution before document reached ComputedScopes state (${n.uri}).`);const r=this.reflection.getReferenceType(e);return Object.assign(Object.assign({},e),{message:`Could not resolve reference to ${r} named '${e.reference.$refText}'.`,targetDescription:t})}}class Cn{getName(e){if(function(e){return"string"==typeof e.name}(e))return e.name}getNameNode(e){return(0,i.qO)(e.$cstNode,"name")}}var wn;!function(e){e.basename=kn.A.basename,e.dirname=kn.A.dirname,e.extname=kn.A.extname,e.joinPath=kn.A.joinPath,e.resolvePath=kn.A.resolvePath,e.equals=function(e,t){return(null==e?void 0:e.toString())===(null==t?void 0:t.toString())},e.relative=function(e,t){const n="string"==typeof e?e:e.path,r="string"==typeof t?t:t.path,i=n.split("/").filter(e=>e.length>0),s=r.split("/").filter(e=>e.length>0);let a=0;for(;a<i.length&&i[a]===s[a];a++);return"../".repeat(i.length-a)+s.slice(a).join("/")},e.normalize=function(e){return kn.r.parse(e.toString()).toString()}}(wn||(wn={}));class Ln{constructor(e){this.nameProvider=e.references.NameProvider,this.index=e.shared.workspace.IndexManager,this.nodeLocator=e.workspace.AstNodeLocator}findDeclaration(e){if(e){const t=(0,i.Rp)(e),n=e.astNode;if(t&&n){const r=n[t.feature];if((0,cn.A_)(r))return r.ref;if(Array.isArray(r))for(const t of r)if((0,cn.A_)(t)&&t.$refNode&&t.$refNode.offset<=e.offset&&t.$refNode.end>=e.end)return t.ref}if(n){const t=this.nameProvider.getNameNode(n);if(t&&(t===e||(0,r.pO)(e,t)))return n}}}findDeclarationNode(e){const t=this.findDeclaration(e);if(null==t?void 0:t.$cstNode){const e=this.nameProvider.getNameNode(t);return null!=e?e:t.$cstNode}}findReferences(e,t){const n=[];if(t.includeDeclaration){const t=this.getReferenceToSelf(e);t&&n.push(t)}let r=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return t.documentUri&&(r=r.filter(e=>wn.equals(e.sourceUri,t.documentUri))),n.push(...r),(0,Xt.Td)(n)}getReferenceToSelf(e){const t=this.nameProvider.getNameNode(e);if(t){const n=(0,Nt.YE)(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:(0,r.SX)(t),local:!0}}}}class bn{constructor(e){if(this.map=new Map,e)for(const[t,n]of e)this.add(t,n)}get size(){return Xt.iD.sum((0,Xt.Td)(this.map.values()).map(e=>e.length))}clear(){this.map.clear()}delete(e,t){if(void 0===t)return this.map.delete(e);{const n=this.map.get(e);if(n){const r=n.indexOf(t);if(r>=0)return 1===n.length?this.map.delete(e):n.splice(r,1),!0}return!1}}get(e){var t;return null!==(t=this.map.get(e))&&void 0!==t?t:[]}has(e,t){if(void 0===t)return this.map.has(e);{const n=this.map.get(e);return!!n&&n.indexOf(t)>=0}}add(e,t){return this.map.has(e)?this.map.get(e).push(t):this.map.set(e,[t]),this}addAll(e,t){return this.map.has(e)?this.map.get(e).push(...t):this.map.set(e,Array.from(t)),this}forEach(e){this.map.forEach((t,n)=>t.forEach(t=>e(t,n,this)))}[Symbol.iterator](){return this.entries().iterator()}entries(){return(0,Xt.Td)(this.map.entries()).flatMap(([e,t])=>t.map(t=>[e,t]))}keys(){return(0,Xt.Td)(this.map.keys())}values(){return(0,Xt.Td)(this.map.values()).flat()}entriesGroupedByKey(){return(0,Xt.Td)(this.map.entries())}}class On{get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(const[t,n]of e)this.set(t,n)}clear(){this.map.clear(),this.inverse.clear()}set(e,t){return this.map.set(e,t),this.inverse.set(t,e),this}get(e){return this.map.get(e)}getKey(e){return this.inverse.get(e)}delete(e){const t=this.map.get(e);return void 0!==t&&(this.map.delete(e),this.inverse.delete(t),!0)}}class _n{constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e,t=ln.XO.None){return this.computeExportsForNode(e.parseResult.value,e,void 0,t)}async computeExportsForNode(e,t,n=Nt.VN,r=ln.XO.None){const i=[];this.exportNode(e,i,t);for(const s of n(e))await pn(r),this.exportNode(s,i,t);return i}exportNode(e,t,n){const r=this.nameProvider.getName(e);r&&t.push(this.descriptions.createDescription(e,r,n))}async computeLocalScopes(e,t=ln.XO.None){const n=e.parseResult.value,r=new bn;for(const i of(0,Nt.Uo)(n))await pn(t),this.processNode(i,e,r);return r}processNode(e,t,n){const r=e.$container;if(r){const i=this.nameProvider.getName(e);i&&n.add(r,this.descriptions.createDescription(e,i,t))}}}class Pn{constructor(e,t,n){var r;this.elements=e,this.outerScope=t,this.caseInsensitive=null!==(r=null==n?void 0:n.caseInsensitive)&&void 0!==r&&r}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){const t=this.caseInsensitive?this.elements.find(t=>t.name.toLowerCase()===e.toLowerCase()):this.elements.find(t=>t.name===e);return t||(this.outerScope?this.outerScope.getElement(e):void 0)}}class Mn{constructor(e,t,n){var r;this.elements=new Map,this.caseInsensitive=null!==(r=null==n?void 0:n.caseInsensitive)&&void 0!==r&&r;for(const i of e){const e=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.set(e,i)}this.outerScope=t}getElement(e){const t=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(t);return n||(this.outerScope?this.outerScope.getElement(e):void 0)}getAllElements(){let e=(0,Xt.Td)(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}}class Dn{constructor(){this.toDispose=[],this.isDisposed=!1}onDispose(e){this.toDispose.push(e)}dispose(){this.throwIfDisposed(),this.clear(),this.isDisposed=!0,this.toDispose.forEach(e=>e.dispose())}throwIfDisposed(){if(this.isDisposed)throw new Error("This cache has already been disposed")}}class Un extends Dn{constructor(){super(...arguments),this.cache=new Map}has(e){return this.throwIfDisposed(),this.cache.has(e)}set(e,t){this.throwIfDisposed(),this.cache.set(e,t)}get(e,t){if(this.throwIfDisposed(),this.cache.has(e))return this.cache.get(e);if(t){const n=t();return this.cache.set(e,n),n}}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}}class Fn extends Dn{constructor(e){super(),this.cache=new Map,this.converter=null!=e?e:e=>e}has(e,t){return this.throwIfDisposed(),this.cacheForContext(e).has(t)}set(e,t,n){this.throwIfDisposed(),this.cacheForContext(e).set(t,n)}get(e,t,n){this.throwIfDisposed();const r=this.cacheForContext(e);if(r.has(t))return r.get(t);if(n){const e=n();return r.set(t,e),e}}delete(e,t){return this.throwIfDisposed(),this.cacheForContext(e).delete(t)}clear(e){if(this.throwIfDisposed(),e){const t=this.converter(e);this.cache.delete(t)}else this.cache.clear()}cacheForContext(e){const t=this.converter(e);let n=this.cache.get(t);return n||(n=new Map,this.cache.set(t,n)),n}}class Gn extends Un{constructor(e,t){super(),t?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(t,()=>{this.clear()})),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((e,t)=>{t.length>0&&this.clear()}))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(()=>{this.clear()}))}}class Kn{constructor(e){this.reflection=e.shared.AstReflection,this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider,this.indexManager=e.shared.workspace.IndexManager,this.globalScopeCache=new Gn(e.shared)}getScope(e){const t=[],n=this.reflection.getReferenceType(e),r=(0,Nt.YE)(e.container).precomputedScopes;if(r){let i=e.container;do{const e=r.get(i);e.length>0&&t.push((0,Xt.Td)(e).filter(e=>this.reflection.isSubtype(e.type,n))),i=i.$container}while(i)}let i=this.getGlobalScope(n,e);for(let s=t.length-1;s>=0;s--)i=this.createScope(t[s],i);return i}createScope(e,t,n){return new Pn((0,Xt.Td)(e),t,n)}createScopeForNodes(e,t,n){const r=(0,Xt.Td)(e).map(e=>{const t=this.nameProvider.getName(e);if(t)return this.descriptions.createDescription(e,t)}).nonNullable();return new Pn(r,t,n)}getGlobalScope(e,t){return this.globalScopeCache.get(e,()=>new Mn(this.indexManager.allElements(e)))}}function Bn(e){return"object"==typeof e&&!!e&&("$ref"in e||"$error"in e)}class jn{constructor(e){this.ignoreProperties=new Set(["$container","$containerProperty","$containerIndex","$document","$cstNode"]),this.langiumDocuments=e.shared.workspace.LangiumDocuments,this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider,this.commentProvider=e.documentation.CommentProvider}serialize(e,t){const n=null!=t?t:{},r=null==t?void 0:t.replacer,i=(e,t)=>this.replacer(e,t,n),s=r?(e,t)=>r(e,t,i):i;try{return this.currentDocument=(0,Nt.YE)(e),JSON.stringify(e,s,null==t?void 0:t.space)}finally{this.currentDocument=void 0}}deserialize(e,t){const n=null!=t?t:{},r=JSON.parse(e);return this.linkNode(r,r,n),r}replacer(e,t,{refText:n,sourceText:r,textRegions:i,comments:s,uriConverter:a}){var o,l,c,u;if(!this.ignoreProperties.has(e)){if((0,cn.A_)(t)){const e=t.ref,r=n?t.$refText:void 0;if(e){const n=(0,Nt.YE)(e);let i="";this.currentDocument&&this.currentDocument!==n&&(i=a?a(n.uri,t):n.uri.toString());return{$ref:`${i}#${this.astNodeLocator.getAstNodePath(e)}`,$refText:r}}return{$error:null!==(l=null===(o=t.error)||void 0===o?void 0:o.message)&&void 0!==l?l:"Could not resolve reference",$refText:r}}if((0,cn.ng)(t)){let n;if(i&&(n=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},t)),e&&!t.$document||!(null==n?void 0:n.$textRegion)||(n.$textRegion.documentURI=null===(c=this.currentDocument)||void 0===c?void 0:c.uri.toString())),r&&!e&&(null!=n||(n=Object.assign({},t)),n.$sourceText=null===(u=t.$cstNode)||void 0===u?void 0:u.text),s){null!=n||(n=Object.assign({},t));const e=this.commentProvider.getComment(t);e&&(n.$comment=e.replace(/\r/g,""))}return null!=n?n:t}return t}}addAstNodeRegionWithAssignmentsTo(e){const t=e=>({offset:e.offset,end:e.end,length:e.length,range:e.range});if(e.$cstNode){const n=(e.$textRegion=t(e.$cstNode)).assignments={};return Object.keys(e).filter(e=>!e.startsWith("$")).forEach(r=>{const s=(0,i.Bd)(e.$cstNode,r).map(t);0!==s.length&&(n[r]=s)}),e}}linkNode(e,t,n,r,i,s){for(const[o,l]of Object.entries(e))if(Array.isArray(l))for(let r=0;r<l.length;r++){const i=l[r];Bn(i)?l[r]=this.reviveReference(e,o,t,i,n):(0,cn.ng)(i)&&this.linkNode(i,t,n,e,o,r)}else Bn(l)?e[o]=this.reviveReference(e,o,t,l,n):(0,cn.ng)(l)&&this.linkNode(l,t,n,e,o);const a=e;a.$container=r,a.$containerProperty=i,a.$containerIndex=s}reviveReference(e,t,n,r,i){let s=r.$refText,a=r.$error;if(r.$ref){const e=this.getRefNode(n,r.$ref,i.uriConverter);if((0,cn.ng)(e))return s||(s=this.nameProvider.getName(e)),{$refText:null!=s?s:"",ref:e};a=e}if(a){const n={$refText:null!=s?s:""};return n.error={container:e,property:t,message:a,reference:n},n}}getRefNode(e,t,n){try{const r=t.indexOf("#");if(0===r){const n=this.astNodeLocator.getAstNode(e,t.substring(1));return n||"Could not resolve path: "+t}if(r<0){const e=n?n(t):kn.r.parse(t),r=this.langiumDocuments.getDocument(e);return r?r.parseResult.value:"Could not find document for URI: "+t}const i=n?n(t.substring(0,r)):kn.r.parse(t.substring(0,r)),s=this.langiumDocuments.getDocument(i);if(!s)return"Could not find document for URI: "+t;if(r===t.length-1)return s.parseResult.value;const a=this.astNodeLocator.getAstNode(s.parseResult.value,t.substring(r+1));return a||"Could not resolve URI: "+t}catch(r){return String(r)}}}class Vn{get map(){return this.fileExtensionMap}constructor(e){this.languageIdMap=new Map,this.fileExtensionMap=new Map,this.textDocuments=null==e?void 0:e.workspace.TextDocuments}register(e){const t=e.LanguageMetaData;for(const n of t.fileExtensions)this.fileExtensionMap.has(n)&&console.warn(`The file extension ${n} is used by multiple languages. It is now assigned to '${t.languageId}'.`),this.fileExtensionMap.set(n,e);this.languageIdMap.set(t.languageId,e),1===this.languageIdMap.size?this.singleton=e:this.singleton=void 0}getServices(e){var t,n;if(void 0!==this.singleton)return this.singleton;if(0===this.languageIdMap.size)throw new Error("The service registry is empty. Use `register` to register the services of a language.");const r=null===(n=null===(t=this.textDocuments)||void 0===t?void 0:t.get(e))||void 0===n?void 0:n.languageId;if(void 0!==r){const e=this.languageIdMap.get(r);if(e)return e}const i=wn.extname(e),s=this.fileExtensionMap.get(i);if(!s)throw r?new Error(`The service registry contains no services for the extension '${i}' for language '${r}'.`):new Error(`The service registry contains no services for the extension '${i}'.`);return s}hasServices(e){try{return this.getServices(e),!0}catch(t){return!1}}get all(){return Array.from(this.languageIdMap.values())}}function Hn(e){return{code:e}}var Wn,zn;!function(e){e.all=["fast","slow","built-in"]}(Wn||(Wn={}));class Yn{constructor(e){this.entries=new bn,this.entriesBefore=[],this.entriesAfter=[],this.reflection=e.shared.AstReflection}register(e,t=this,n="fast"){if("built-in"===n)throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(const[r,i]of Object.entries(e)){const e=i;if(Array.isArray(e))for(const i of e){const e={check:this.wrapValidationException(i,t),category:n};this.addEntry(r,e)}else if("function"==typeof e){const i={check:this.wrapValidationException(e,t),category:n};this.addEntry(r,i)}else(0,Yt.d)(e)}}wrapValidationException(e,t){return async(n,r,i)=>{await this.handleException(()=>e.call(t,n,r,i),"An error occurred during validation",r,n)}}async handleException(e,t,n,r){try{await e()}catch(i){if(fn(i))throw i;console.error(`${t}:`,i),i instanceof Error&&i.stack&&console.error(i.stack);n("error",`${t}: ${i instanceof Error?i.message:String(i)}`,{node:r})}}addEntry(e,t){if("AstNode"!==e)for(const n of this.reflection.getAllSubTypes(e))this.entries.add(n,t);else this.entries.add("AstNode",t)}getChecks(e,t){let n=(0,Xt.Td)(this.entries.get(e)).concat(this.entries.get("AstNode"));return t&&(n=n.filter(e=>t.includes(e.category))),n.map(e=>e.check)}registerBeforeDocument(e,t=this){this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",t))}registerAfterDocument(e,t=this){this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",t))}wrapPreparationException(e,t,n){return async(r,i,s,a)=>{await this.handleException(()=>e.call(n,r,i,s,a),t,i,r)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}}class Xn{constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e,t={},n=ln.XO.None){const r=e.parseResult,i=[];if(await pn(n),!t.categories||t.categories.includes("built-in")){if(this.processLexingErrors(r,i,t),t.stopAfterLexingErrors&&i.some(e=>{var t;return(null===(t=e.data)||void 0===t?void 0:t.code)===zn.LexingError}))return i;if(this.processParsingErrors(r,i,t),t.stopAfterParsingErrors&&i.some(e=>{var t;return(null===(t=e.data)||void 0===t?void 0:t.code)===zn.ParsingError}))return i;if(this.processLinkingErrors(e,i,t),t.stopAfterLinkingErrors&&i.some(e=>{var t;return(null===(t=e.data)||void 0===t?void 0:t.code)===zn.LinkingError}))return i}try{i.push(...await this.validateAst(r.value,t,n))}catch(s){if(fn(s))throw s;console.error("An error occurred during validation:",s)}return await pn(n),i}processLexingErrors(e,t,n){var r,i,s;const a=[...e.lexerErrors,...null!==(i=null===(r=e.lexerReport)||void 0===r?void 0:r.diagnostics)&&void 0!==i?i:[]];for(const o of a){const e=null!==(s=o.severity)&&void 0!==s?s:"error",n={severity:Qn(e),range:{start:{line:o.line-1,character:o.column-1},end:{line:o.line-1,character:o.column+o.length-1}},message:o.message,data:Zn(e),source:this.getSource()};t.push(n)}}processParsingErrors(e,t,n){for(const i of e.parserErrors){let e;if(isNaN(i.token.startOffset)){if("previousToken"in i){const t=i.previousToken;if(isNaN(t.startOffset)){const t={line:0,character:0};e={start:t,end:t}}else{const n={line:t.endLine-1,character:t.endColumn};e={start:n,end:n}}}}else e=(0,r.wf)(i.token);if(e){const n={severity:Qn("error"),range:e,message:i.message,data:Hn(zn.ParsingError),source:this.getSource()};t.push(n)}}}processLinkingErrors(e,t,n){for(const r of e.references){const e=r.error;if(e){const n={node:e.container,property:e.property,index:e.index,data:{code:zn.LinkingError,containerType:e.container.$type,property:e.property,refText:e.reference.$refText}};t.push(this.toDiagnostic("error",e.message,n))}}}async validateAst(e,t,n=ln.XO.None){const r=[],i=(e,t,n)=>{r.push(this.toDiagnostic(e,t,n))};return await this.validateAstBefore(e,t,i,n),await this.validateAstNodes(e,t,i,n),await this.validateAstAfter(e,t,i,n),r}async validateAstBefore(e,t,n,r=ln.XO.None){var i;const s=this.validationRegistry.checksBefore;for(const a of s)await pn(r),await a(e,n,null!==(i=t.categories)&&void 0!==i?i:[],r)}async validateAstNodes(e,t,n,r=ln.XO.None){await Promise.all((0,Nt.jm)(e).map(async e=>{await pn(r);const i=this.validationRegistry.getChecks(e.$type,t.categories);for(const t of i)await t(e,n,r)}))}async validateAstAfter(e,t,n,r=ln.XO.None){var i;const s=this.validationRegistry.checksAfter;for(const a of s)await pn(r),await a(e,n,null!==(i=t.categories)&&void 0!==i?i:[],r)}toDiagnostic(e,t,n){return{message:t,range:qn(n),severity:Qn(e),code:n.code,codeDescription:n.codeDescription,tags:n.tags,relatedInformation:n.relatedInformation,data:n.data,source:this.getSource()}}getSource(){return this.metadata.languageId}}function qn(e){if(e.range)return e.range;let t;return"string"==typeof e.property?t=(0,i.qO)(e.node.$cstNode,e.property,e.index):"string"==typeof e.keyword&&(t=(0,i.SS)(e.node.$cstNode,e.keyword,e.index)),null!=t||(t=e.node.$cstNode),t?t.range:{start:{line:0,character:0},end:{line:0,character:0}}}function Qn(e){switch(e){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+e)}}function Zn(e){switch(e){case"error":return Hn(zn.LexingError);case"warning":return Hn(zn.LexingWarning);case"info":return Hn(zn.LexingInfo);case"hint":return Hn(zn.LexingHint);default:throw new Error("Invalid diagnostic severity: "+e)}}!function(e){e.LexingError="lexing-error",e.LexingWarning="lexing-warning",e.LexingInfo="lexing-info",e.LexingHint="lexing-hint",e.ParsingError="parsing-error",e.LinkingError="linking-error"}(zn||(zn={}));class Jn{constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,t,n){const i=null!=n?n:(0,Nt.YE)(e);null!=t||(t=this.nameProvider.getName(e));const s=this.astNodeLocator.getAstNodePath(e);if(!t)throw new Error(`Node at path ${s} has no name.`);let a;const o=()=>{var t;return null!=a?a:a=(0,r.SX)(null!==(t=this.nameProvider.getNameNode(e))&&void 0!==t?t:e.$cstNode)};return{node:e,name:t,get nameSegment(){return o()},selectionSegment:(0,r.SX)(e.$cstNode),type:e.$type,documentUri:i.uri,path:s}}}class er{constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e,t=ln.XO.None){const n=[],r=e.parseResult.value;for(const i of(0,Nt.jm)(r))await pn(t),(0,Nt.DM)(i).filter(e=>!(0,cn.Zl)(e)).forEach(e=>{const t=this.createDescription(e);t&&n.push(t)});return n}createDescription(e){const t=e.reference.$nodeDescription,n=e.reference.$refNode;if(!t||!n)return;const i=(0,Nt.YE)(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:t.documentUri,targetPath:t.path,segment:(0,r.SX)(n),local:wn.equals(t.documentUri,i)}}}class tr{constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){const t=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return t+this.segmentSeparator+n}return""}getPathSegment({$containerProperty:e,$containerIndex:t}){if(!e)throw new Error("Missing '$containerProperty' in AST node.");return void 0!==t?e+this.indexSeparator+t:e}getAstNode(e,t){return t.split(this.segmentSeparator).reduce((e,t)=>{if(!e||0===t.length)return e;const n=t.indexOf(this.indexSeparator);if(n>0){const r=t.substring(0,n),i=parseInt(t.substring(n+1)),s=e[r];return null==s?void 0:s[i]}return e[t]},e)}}var nr,rr=n(40436);class ir{constructor(e){this._ready=new mn,this.settings={},this.workspaceConfig=!1,this.onConfigurationSectionUpdateEmitter=new rr.Emitter,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var t,n;this.workspaceConfig=null!==(n=null===(t=e.capabilities.workspace)||void 0===t?void 0:t.configuration)&&void 0!==n&&n}async initialized(e){if(this.workspaceConfig){if(e.register){const t=this.serviceRegistry.all;e.register({section:t.map(e=>this.toSectionName(e.LanguageMetaData.languageId))})}if(e.fetchConfiguration){const t=this.serviceRegistry.all.map(e=>({section:this.toSectionName(e.LanguageMetaData.languageId)})),n=await e.fetchConfiguration(t);t.forEach((e,t)=>{this.updateSectionConfiguration(e.section,n[t])})}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach(t=>{const n=e.settings[t];this.updateSectionConfiguration(t,n),this.onConfigurationSectionUpdateEmitter.fire({section:t,configuration:n})})}updateSectionConfiguration(e,t){this.settings[e]=t}async getConfiguration(e,t){await this.ready;const n=this.toSectionName(e);if(this.settings[n])return this.settings[n][t]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}}!function(e){e.create=function(e){return{dispose:async()=>await e()}}}(nr||(nr={}));class sr{constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new bn,this.documentPhaseListeners=new bn,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=En.Changed,this.langiumDocuments=e.workspace.LangiumDocuments,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.textDocuments=e.workspace.TextDocuments,this.indexManager=e.workspace.IndexManager,this.serviceRegistry=e.ServiceRegistry}async build(e,t={},n=ln.XO.None){var r,i;for(const s of e){const e=s.uri.toString();if(s.state===En.Validated){if("boolean"==typeof t.validation&&t.validation)s.state=En.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(e);else if("object"==typeof t.validation){const n=this.buildState.get(e),a=null===(r=null==n?void 0:n.result)||void 0===r?void 0:r.validationChecks;if(a){const r=(null!==(i=t.validation.categories)&&void 0!==i?i:Wn.all).filter(e=>!a.includes(e));r.length>0&&(this.buildState.set(e,{completed:!1,options:{validation:Object.assign(Object.assign({},t.validation),{categories:r})},result:n.result}),s.state=En.IndexedReferences)}}}else this.buildState.delete(e)}this.currentState=En.Changed,await this.emitUpdate(e.map(e=>e.uri),[]),await this.buildDocuments(e,t,n)}async update(e,t,n=ln.XO.None){this.currentState=En.Changed;for(const s of t)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(const s of e){if(!this.langiumDocuments.invalidateDocument(s)){const e=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);e.state=En.Changed,this.langiumDocuments.addDocument(e)}this.buildState.delete(s.toString())}const r=(0,Xt.Td)(e).concat(t).map(e=>e.toString()).toSet();this.langiumDocuments.all.filter(e=>!r.has(e.uri.toString())&&this.shouldRelink(e,r)).forEach(e=>{this.serviceRegistry.getServices(e.uri).references.Linker.unlink(e),e.state=Math.min(e.state,En.ComputedScopes),e.diagnostics=void 0}),await this.emitUpdate(e,t),await pn(n);const i=this.sortDocuments(this.langiumDocuments.all.filter(e=>{var t;return e.state<En.Linked||!(null===(t=this.buildState.get(e.uri.toString()))||void 0===t?void 0:t.completed)}).toArray());await this.buildDocuments(i,this.updateBuildOptions,n)}async emitUpdate(e,t){await Promise.all(this.updateListeners.map(n=>n(e,t)))}sortDocuments(e){let t=0,n=e.length-1;for(;t<n;){for(;t<e.length&&this.hasTextDocument(e[t]);)t++;for(;n>=0&&!this.hasTextDocument(e[n]);)n--;t<n&&([e[t],e[n]]=[e[n],e[t]])}return e}hasTextDocument(e){var t;return Boolean(null===(t=this.textDocuments)||void 0===t?void 0:t.get(e.uri))}shouldRelink(e,t){return!!e.references.some(e=>void 0!==e.error)||this.indexManager.isAffected(e,t)}onUpdate(e){return this.updateListeners.push(e),nr.create(()=>{const t=this.updateListeners.indexOf(e);t>=0&&this.updateListeners.splice(t,1)})}async buildDocuments(e,t,n){this.prepareBuild(e,t),await this.runCancelable(e,En.Parsed,n,e=>this.langiumDocumentFactory.update(e,n)),await this.runCancelable(e,En.IndexedContent,n,e=>this.indexManager.updateContent(e,n)),await this.runCancelable(e,En.ComputedScopes,n,async e=>{const t=this.serviceRegistry.getServices(e.uri).references.ScopeComputation;e.precomputedScopes=await t.computeLocalScopes(e,n)}),await this.runCancelable(e,En.Linked,n,e=>this.serviceRegistry.getServices(e.uri).references.Linker.link(e,n)),await this.runCancelable(e,En.IndexedReferences,n,e=>this.indexManager.updateReferences(e,n));const r=e.filter(e=>this.shouldValidate(e));await this.runCancelable(r,En.Validated,n,e=>this.validate(e,n));for(const i of e){const e=this.buildState.get(i.uri.toString());e&&(e.completed=!0)}}prepareBuild(e,t){for(const n of e){const e=n.uri.toString(),r=this.buildState.get(e);r&&!r.completed||this.buildState.set(e,{completed:!1,options:t,result:null==r?void 0:r.result})}}async runCancelable(e,t,n,r){const i=e.filter(e=>e.state<t);for(const a of i)await pn(n),await r(a),a.state=t,await this.notifyDocumentPhase(a,t,n);const s=e.filter(e=>e.state===t);await this.notifyBuildPhase(s,t,n),this.currentState=t}onBuildPhase(e,t){return this.buildPhaseListeners.add(e,t),nr.create(()=>{this.buildPhaseListeners.delete(e,t)})}onDocumentPhase(e,t){return this.documentPhaseListeners.add(e,t),nr.create(()=>{this.documentPhaseListeners.delete(e,t)})}waitUntil(e,t,n){let r;if(t&&"path"in t?r=t:n=t,null!=n||(n=ln.XO.None),r){const t=this.langiumDocuments.getDocument(r);if(t&&t.state>e)return Promise.resolve(r)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(hn):new Promise((t,i)=>{const s=this.onBuildPhase(e,()=>{if(s.dispose(),a.dispose(),r){const e=this.langiumDocuments.getDocument(r);t(null==e?void 0:e.uri)}else t(void 0)}),a=n.onCancellationRequested(()=>{s.dispose(),a.dispose(),i(hn)})})}async notifyDocumentPhase(e,t,n){const r=this.documentPhaseListeners.get(t).slice();for(const s of r)try{await s(e,n)}catch(i){if(!fn(i))throw i}}async notifyBuildPhase(e,t,n){if(0===e.length)return;const r=this.buildPhaseListeners.get(t).slice();for(const i of r)await pn(n),await i(e,n)}shouldValidate(e){return Boolean(this.getBuildOptions(e).validation)}async validate(e,t){var n,r;const i=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,a="object"==typeof s?s:void 0,o=await i.validateDocument(e,a,t);e.diagnostics?e.diagnostics.push(...o):e.diagnostics=o;const l=this.buildState.get(e.uri.toString());if(l){null!==(n=l.result)&&void 0!==n||(l.result={});const e=null!==(r=null==a?void 0:a.categories)&&void 0!==r?r:Wn.all;l.result.validationChecks?l.result.validationChecks.push(...e):l.result.validationChecks=[...e]}}getBuildOptions(e){var t,n;return null!==(n=null===(t=this.buildState.get(e.uri.toString()))||void 0===t?void 0:t.options)&&void 0!==n?n:{}}}class ar{constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new Fn,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,t){const n=(0,Nt.YE)(e).uri,r=[];return this.referenceIndex.forEach(e=>{e.forEach(e=>{wn.equals(e.targetUri,n)&&e.targetPath===t&&r.push(e)})}),(0,Xt.Td)(r)}allElements(e,t){let n=(0,Xt.Td)(this.symbolIndex.keys());return t&&(n=n.filter(e=>!t||t.has(e))),n.map(t=>this.getFileDescriptions(t,e)).flat()}getFileDescriptions(e,t){var n;if(!t)return null!==(n=this.symbolIndex.get(e))&&void 0!==n?n:[];const r=this.symbolByTypeIndex.get(e,t,()=>{var n;return(null!==(n=this.symbolIndex.get(e))&&void 0!==n?n:[]).filter(e=>this.astReflection.isSubtype(e.type,t))});return r}remove(e){const t=e.toString();this.symbolIndex.delete(t),this.symbolByTypeIndex.clear(t),this.referenceIndex.delete(t)}async updateContent(e,t=ln.XO.None){const n=this.serviceRegistry.getServices(e.uri),r=await n.references.ScopeComputation.computeExports(e,t),i=e.uri.toString();this.symbolIndex.set(i,r),this.symbolByTypeIndex.clear(i)}async updateReferences(e,t=ln.XO.None){const n=this.serviceRegistry.getServices(e.uri),r=await n.workspace.ReferenceDescriptionProvider.createDescriptions(e,t);this.referenceIndex.set(e.uri.toString(),r)}isAffected(e,t){const n=this.referenceIndex.get(e.uri.toString());return!!n&&n.some(e=>!e.local&&t.has(e.targetUri.toString()))}}class or{constructor(e){this.initialBuildOptions={},this._ready=new mn,this.serviceRegistry=e.ServiceRegistry,this.langiumDocuments=e.workspace.LangiumDocuments,this.documentBuilder=e.workspace.DocumentBuilder,this.fileSystemProvider=e.workspace.FileSystemProvider,this.mutex=e.workspace.WorkspaceLock}get ready(){return this._ready.promise}get workspaceFolders(){return this.folders}initialize(e){var t;this.folders=null!==(t=e.workspaceFolders)&&void 0!==t?t:void 0}initialized(e){return this.mutex.write(e=>{var t;return this.initializeWorkspace(null!==(t=this.folders)&&void 0!==t?t:[],e)})}async initializeWorkspace(e,t=ln.XO.None){const n=await this.performStartup(e);await pn(t),await this.documentBuilder.build(n,this.initialBuildOptions,t)}async performStartup(e){const t=this.serviceRegistry.all.flatMap(e=>e.LanguageMetaData.fileExtensions),n=[],r=e=>{n.push(e),this.langiumDocuments.hasDocument(e.uri)||this.langiumDocuments.addDocument(e)};return await this.loadAdditionalDocuments(e,r),await Promise.all(e.map(e=>[e,this.getRootFolder(e)]).map(async e=>this.traverseFolder(...e,t,r))),this._ready.resolve(),n}loadAdditionalDocuments(e,t){return Promise.resolve()}getRootFolder(e){return kn.r.parse(e.uri)}async traverseFolder(e,t,n,r){const i=await this.fileSystemProvider.readDirectory(t);await Promise.all(i.map(async t=>{if(this.includeEntry(e,t,n))if(t.isDirectory)await this.traverseFolder(e,t.uri,n,r);else if(t.isFile){const e=await this.langiumDocuments.getOrCreateDocument(t.uri);r(e)}}))}includeEntry(e,t,n){const r=wn.basename(t.uri);if(r.startsWith("."))return!1;if(t.isDirectory)return"node_modules"!==r&&"out"!==r;if(t.isFile){const e=wn.extname(t.uri);return n.includes(e)}return!1}}class lr{buildUnexpectedCharactersMessage(e,t,n,r,i){return o.PW.buildUnexpectedCharactersMessage(e,t,n,r,i)}buildUnableToPopLexerModeMessage(e){return o.PW.buildUnableToPopLexerModeMessage(e)}}const cr={mode:"full"};class ur{constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;const t=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(t);const n=hr(t)?Object.values(t):t,r="production"===e.LanguageMetaData.mode;this.chevrotainLexer=new o.JG(n,{positionTracking:"full",skipValidations:r,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e,t=cr){var n,r,i;const s=this.chevrotainLexer.tokenize(e);return{tokens:s.tokens,errors:s.errors,hidden:null!==(n=s.groups.hidden)&&void 0!==n?n:[],report:null===(i=(r=this.tokenBuilder).flushLexingReport)||void 0===i?void 0:i.call(r,e)}}toTokenTypeDictionary(e){if(hr(e))return e;const t=dr(e)?Object.values(e.modes).flat():e,n={};return t.forEach(e=>n[e.name]=e),n}}function dr(e){return e&&"modes"in e&&"defaultMode"in e}function hr(e){return!function(e){return Array.isArray(e)&&(0===e.length||"name"in e[0])}(e)&&!dr(e)}function fr(e,t,n){let r,i;"string"==typeof e?(i=t,r=n):(i=e.range.start,r=t),i||(i=le.create(0,0));const s=function(e){var t,n,r;const i=[];let s=e.position.line,a=e.position.character;for(let o=0;o<e.lines.length;o++){const l=0===o,c=o===e.lines.length-1;let u=e.lines[o],d=0;if(l&&e.options.start){const n=null===(t=e.options.start)||void 0===t?void 0:t.exec(u);n&&(d=n.index+n[0].length)}else{const t=null===(n=e.options.line)||void 0===n?void 0:n.exec(u);t&&(d=t.index+t[0].length)}if(c){const t=null===(r=e.options.end)||void 0===r?void 0:r.exec(u);t&&(u=u.substring(0,t.index))}u=u.substring(0,Rr(u));if(vr(u,d)>=u.length){if(i.length>0){const e=le.create(s,a);i.push({type:"break",content:"",range:ce.create(e,e)})}}else{mr.lastIndex=d;const e=mr.exec(u);if(e){const t=e[0],n=e[1],r=le.create(s,a+d),o=le.create(s,a+d+t.length);i.push({type:"tag",content:n,range:ce.create(r,o)}),d+=t.length,d=vr(u,d)}if(d<u.length){const e=u.substring(d),t=Array.from(e.matchAll(gr));i.push(...yr(t,e,s,a+d))}}s++,a=0}if(i.length>0&&"break"===i[i.length-1].type)return i.slice(0,-1);return i}({lines:pr(e),position:i,options:Sr(r)});return function(e){var t,n,r,i;const s=le.create(e.position.line,e.position.character);if(0===e.tokens.length)return new Cr([],ce.create(s,s));const a=[];for(;e.index<e.tokens.length;){const t=$r(e,a[a.length-1]);t&&a.push(t)}const o=null!==(n=null===(t=a[0])||void 0===t?void 0:t.range.start)&&void 0!==n?n:s,l=null!==(i=null===(r=a[a.length-1])||void 0===r?void 0:r.range.end)&&void 0!==i?i:s;return new Cr(a,ce.create(o,l))}({index:0,tokens:s,position:i})}function pr(e){let t="";t="string"==typeof e?e:e.text;return t.split(s.TH)}const mr=/\s*(@([\p{L}][\p{L}\p{N}]*)?)/uy,gr=/\{(@[\p{L}][\p{L}\p{N}]*)(\s*)([^\r\n}]+)?\}/gu;function yr(e,t,n,r){const i=[];if(0===e.length){const e=le.create(n,r),s=le.create(n,r+t.length);i.push({type:"text",content:t,range:ce.create(e,s)})}else{let s=0;for(const o of e){const e=o.index,a=t.substring(s,e);a.length>0&&i.push({type:"text",content:t.substring(s,e),range:ce.create(le.create(n,s+r),le.create(n,e+r))});let l=a.length+1;const c=o[1];if(i.push({type:"inline-tag",content:c,range:ce.create(le.create(n,s+l+r),le.create(n,s+l+c.length+r))}),l+=c.length,4===o.length){l+=o[2].length;const e=o[3];i.push({type:"text",content:e,range:ce.create(le.create(n,s+l+r),le.create(n,s+l+e.length+r))})}else i.push({type:"text",content:"",range:ce.create(le.create(n,s+l+r),le.create(n,s+l+r))});s=e+o[0].length}const a=t.substring(s);a.length>0&&i.push({type:"text",content:a,range:ce.create(le.create(n,s+r),le.create(n,s+r+a.length))})}return i}const Tr=/\S/,Ar=/\s*$/;function vr(e,t){const n=e.substring(t).match(Tr);return n?t+n.index:e.length}function Rr(e){const t=e.match(Ar);if(t&&"number"==typeof t.index)return t.index}function $r(e,t){const n=e.tokens[e.index];return"tag"===n.type?xr(e,!1):"text"===n.type||"inline-tag"===n.type?Er(e):(function(e,t){if(t){const n=new br("",e.range);"inlines"in t?t.inlines.push(n):t.content.inlines.push(n)}}(n,t),void e.index++)}function Er(e){let t=e.tokens[e.index];const n=t;let r=t;const i=[];for(;t&&"break"!==t.type&&"tag"!==t.type;)i.push(kr(e)),r=t,t=e.tokens[e.index];return new Lr(i,ce.create(n.range.start,r.range.end))}function kr(e){return"inline-tag"===e.tokens[e.index].type?xr(e,!0):Ir(e)}function xr(e,t){const n=e.tokens[e.index++],r=n.content.substring(1),i=e.tokens[e.index];if("text"===(null==i?void 0:i.type)){if(t){const i=Ir(e);return new wr(r,new Lr([i],i.range),t,ce.create(n.range.start,i.range.end))}{const i=Er(e);return new wr(r,i,t,ce.create(n.range.start,i.range.end))}}{const e=n.range;return new wr(r,new Lr([],e),t,e)}}function Ir(e){const t=e.tokens[e.index++];return new br(t.content,t.range)}function Sr(e){if(!e)return Sr({start:"/**",end:"*/",line:"*"});const{start:t,end:n,line:r}=e;return{start:Nr(t,!0),end:Nr(n,!1),line:Nr(r,!0)}}function Nr(e,t){if("string"==typeof e||"object"==typeof e){const n="string"==typeof e?(0,s.Nt)(e):e.source;return t?new RegExp(`^\\s*${n}`):new RegExp(`\\s*${n}\\s*$`)}return e}class Cr{constructor(e,t){this.elements=e,this.range=t}getTag(e){return this.getAllTags().find(t=>t.name===e)}getTags(e){return this.getAllTags().filter(t=>t.name===e)}getAllTags(){return this.elements.filter(e=>"name"in e)}toString(){let e="";for(const t of this.elements)if(0===e.length)e=t.toString();else{const n=t.toString();e+=Or(e)+n}return e.trim()}toMarkdown(e){let t="";for(const n of this.elements)if(0===t.length)t=n.toMarkdown(e);else{const r=n.toMarkdown(e);t+=Or(t)+r}return t.trim()}}class wr{constructor(e,t,n,r){this.name=e,this.content=t,this.inline=n,this.range=r}toString(){let e=`@${this.name}`;const t=this.content.toString();return 1===this.content.inlines.length?e=`${e} ${t}`:this.content.inlines.length>1&&(e=`${e}\n${t}`),this.inline?`{${e}}`:e}toMarkdown(e){var t,n;return null!==(n=null===(t=null==e?void 0:e.renderTag)||void 0===t?void 0:t.call(e,this))&&void 0!==n?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){const t=this.content.toMarkdown(e);if(this.inline){const n=function(e,t,n){var r,i;if("linkplain"===e||"linkcode"===e||"link"===e){const s=t.indexOf(" ");let a=t;if(s>0){const e=vr(t,s);a=t.substring(e),t=t.substring(0,s)}("linkcode"===e||"link"===e&&"code"===n.link)&&(a=`\`${a}\``);const o=null!==(i=null===(r=n.renderLink)||void 0===r?void 0:r.call(n,t,a))&&void 0!==i?i:function(e,t){try{return kn.r.parse(e,!0),`[${t}](${e})`}catch(r){return e}}(t,a);return o}return}(this.name,t,null!=e?e:{});if("string"==typeof n)return n}let n="";"italic"===(null==e?void 0:e.tag)||void 0===(null==e?void 0:e.tag)?n="*":"bold"===(null==e?void 0:e.tag)?n="**":"bold-italic"===(null==e?void 0:e.tag)&&(n="***");let r=`${n}@${this.name}${n}`;return 1===this.content.inlines.length?r=`${r} \u2014 ${t}`:this.content.inlines.length>1&&(r=`${r}\n${t}`),this.inline?`{${r}}`:r}}class Lr{constructor(e,t){this.inlines=e,this.range=t}toString(){let e="";for(let t=0;t<this.inlines.length;t++){const n=this.inlines[t],r=this.inlines[t+1];e+=n.toString(),r&&r.range.start.line>n.range.start.line&&(e+="\n")}return e}toMarkdown(e){let t="";for(let n=0;n<this.inlines.length;n++){const r=this.inlines[n],i=this.inlines[n+1];t+=r.toMarkdown(e),i&&i.range.start.line>r.range.start.line&&(t+="\n")}return t}}class br{constructor(e,t){this.text=e,this.range=t}toString(){return this.text}toMarkdown(){return this.text}}function Or(e){return e.endsWith("\n")?"\n":"\n\n"}class _r{constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){const t=this.commentProvider.getComment(e);if(t&&function(e,t){const n=Sr(t),r=pr(e);if(0===r.length)return!1;const i=r[0],s=r[r.length-1],a=n.start,o=n.end;return Boolean(null==a?void 0:a.exec(i))&&Boolean(null==o?void 0:o.exec(s))}(t)){return fr(t).toMarkdown({renderLink:(t,n)=>this.documentationLinkRenderer(e,t,n),renderTag:t=>this.documentationTagRenderer(e,t)})}}documentationLinkRenderer(e,t,n){var r;const i=null!==(r=this.findNameInPrecomputedScopes(e,t))&&void 0!==r?r:this.findNameInGlobalScope(e,t);if(i&&i.nameSegment){const e=i.nameSegment.range.start.line+1,t=i.nameSegment.range.start.character+1;return`[${n}](${i.documentUri.with({fragment:`L${e},${t}`}).toString()})`}}documentationTagRenderer(e,t){}findNameInPrecomputedScopes(e,t){const n=(0,Nt.YE)(e).precomputedScopes;if(!n)return;let r=e;do{const e=n.get(r).find(e=>e.name===t);if(e)return e;r=r.$container}while(r)}findNameInGlobalScope(e,t){return this.indexManager.allElements().find(e=>e.name===t)}}class Pr{constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var t;return function(e){return"string"==typeof e.$comment}(e)?e.$comment:null===(t=(0,r.v)(e.$cstNode,this.grammarConfig().multilineCommentRules))||void 0===t?void 0:t.text}}class Mr{constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,t){return Promise.resolve(this.syncParser.parse(e))}}class Dr{constructor(){this.previousTokenSource=new ln.Qi,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();const t=(un=performance.now(),new ln.Qi);return this.previousTokenSource=t,this.enqueue(this.writeQueue,e,t.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,t,n=ln.XO.None){const r=new mn,i={action:t,deferred:r,cancellationToken:n};return e.push(i),this.performNextOperation(),r.promise}async performNextOperation(){if(!this.done)return;const e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else{if(!(this.readQueue.length>0))return;e.push(...this.readQueue.splice(0,this.readQueue.length))}this.done=!1,await Promise.all(e.map(async({action:e,deferred:t,cancellationToken:n})=>{try{const r=await Promise.resolve().then(()=>e(n));t.resolve(r)}catch(r){fn(r)?t.resolve(void 0):t.reject(r)}})),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}class Ur{constructor(e){this.grammarElementIdMap=new On,this.tokenTypeIdMap=new On,this.grammar=e.Grammar,this.lexer=e.parser.Lexer,this.linker=e.references.Linker}dehydrate(e){return{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport?this.dehydrateLexerReport(e.lexerReport):void 0,parserErrors:e.parserErrors.map(e=>Object.assign(Object.assign({},e),{message:e.message})),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){const t=new Map,n=new Map;for(const r of(0,Nt.jm)(e))t.set(r,{});if(e.$cstNode)for(const i of(0,r.NS)(e.$cstNode))n.set(i,{});return{astNodes:t,cstNodes:n}}dehydrateAstNode(e,t){const n=t.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,void 0!==e.$cstNode&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,t));for(const[r,i]of Object.entries(e))if(!r.startsWith("$"))if(Array.isArray(i)){const e=[];n[r]=e;for(const n of i)(0,cn.ng)(n)?e.push(this.dehydrateAstNode(n,t)):(0,cn.A_)(n)?e.push(this.dehydrateReference(n,t)):e.push(n)}else(0,cn.ng)(i)?n[r]=this.dehydrateAstNode(i,t):(0,cn.A_)(i)?n[r]=this.dehydrateReference(i,t):void 0!==i&&(n[r]=i);return n}dehydrateReference(e,t){const n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=t.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,t){const n=t.cstNodes.get(e);return(0,cn.br)(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=t.astNodes.get(e.astNode),(0,cn.mD)(e)?n.content=e.content.map(e=>this.dehydrateCstNode(e,t)):(0,cn.FC)(e)&&(n.tokenType=e.tokenType.name,n.offset=e.offset,n.length=e.length,n.startLine=e.range.start.line,n.startColumn=e.range.start.character,n.endLine=e.range.end.line,n.endColumn=e.range.end.character),n}hydrate(e){const t=e.value,n=this.createHydrationContext(t);return"$cstNode"in t&&this.hydrateCstNode(t.$cstNode,n),{lexerErrors:e.lexerErrors,lexerReport:e.lexerReport,parserErrors:e.parserErrors,value:this.hydrateAstNode(t,n)}}createHydrationContext(e){const t=new Map,n=new Map;for(const r of(0,Nt.jm)(e))t.set(r,{});let i;if(e.$cstNode)for(const s of(0,r.NS)(e.$cstNode)){let e;"fullText"in s?(e=new Dt(s.fullText),i=e):"content"in s?e=new Pt:"tokenType"in s&&(e=this.hydrateCstLeafNode(s)),e&&(n.set(s,e),e.root=i)}return{astNodes:t,cstNodes:n}}hydrateAstNode(e,t){const n=t.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,e.$cstNode&&(n.$cstNode=t.cstNodes.get(e.$cstNode));for(const[r,i]of Object.entries(e))if(!r.startsWith("$"))if(Array.isArray(i)){const e=[];n[r]=e;for(const s of i)(0,cn.ng)(s)?e.push(this.setParent(this.hydrateAstNode(s,t),n)):(0,cn.A_)(s)?e.push(this.hydrateReference(s,n,r,t)):e.push(s)}else(0,cn.ng)(i)?n[r]=this.setParent(this.hydrateAstNode(i,t),n):(0,cn.A_)(i)?n[r]=this.hydrateReference(i,n,r,t):void 0!==i&&(n[r]=i);return n}setParent(e,t){return e.$container=t,e}hydrateReference(e,t,n,r){return this.linker.buildReference(t,n,r.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,t,n=0){const r=t.cstNodes.get(e);if("number"==typeof e.grammarSource&&(r.grammarSource=this.getGrammarElement(e.grammarSource)),r.astNode=t.astNodes.get(e.astNode),(0,cn.mD)(r))for(const i of e.content){const e=this.hydrateCstNode(i,t,n++);r.content.push(e)}return r}hydrateCstLeafNode(e){const t=this.getTokenType(e.tokenType),n=e.offset,r=e.length,i=e.startLine,s=e.startColumn,a=e.endLine,o=e.endColumn,l=e.hidden;return new _t(n,r,{start:{line:i,character:s},end:{line:a,character:o}},t,l)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return 0===this.grammarElementIdMap.size&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){0===this.grammarElementIdMap.size&&this.createGrammarElementIdMap();return this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(const t of(0,Nt.jm)(this.grammar))(0,a.r1)(t)&&this.grammarElementIdMap.set(t,e++)}}function Fr(e){return{documentation:{CommentProvider:e=>new Pr(e),DocumentationProvider:e=>new _r(e)},parser:{AsyncParser:e=>new Mr(e),GrammarConfig:e=>function(e){const t=[],n=e.Grammar;for(const r of n.rules)(0,a.rE)(r)&&(0,i.eb)(r)&&(0,s.lU)((0,i.S)(r))&&t.push(r.name);return{multilineCommentRules:t,nameRegexp:r.El}}(e),LangiumParser:e=>sn(e),CompletionParser:e=>function(e){const t=e.Grammar,n=e.parser.Lexer,r=new Ht(e);return qt(t,r,n.definition),r.finalize(),r}(e),ValueConverter:()=>new on.d,TokenBuilder:()=>new an.Q,Lexer:e=>new ur(e),ParserErrorMessageProvider:()=>new Vt,LexerErrorMessageProvider:()=>new lr},workspace:{AstNodeLocator:()=>new tr,AstNodeDescriptionProvider:e=>new Jn(e),ReferenceDescriptionProvider:e=>new er(e)},references:{Linker:e=>new Nn(e),NameProvider:()=>new Cn,ScopeProvider:e=>new Kn(e),ScopeComputation:e=>new _n(e),References:e=>new Ln(e)},serializer:{Hydrator:e=>new Ur(e),JsonSerializer:e=>new jn(e)},validation:{DocumentValidator:e=>new Xn(e),ValidationRegistry:e=>new Yn(e)},shared:()=>e.shared}}function Gr(e){return{ServiceRegistry:e=>new Vn(e),workspace:{LangiumDocuments:e=>new In(e),LangiumDocumentFactory:e=>new xn(e),DocumentBuilder:e=>new sr(e),IndexManager:e=>new ar(e),WorkspaceManager:e=>new or(e),FileSystemProvider:t=>e.fileSystemProvider(t),WorkspaceLock:()=>new Dr,ConfigurationProvider:e=>new ir(e)}}}},11921:(e,t,n)=>{function r(e){return e.charCodeAt(0)}function i(e,t){Array.isArray(e)?e.forEach(function(e){t.push(e)}):t.push(e)}function s(e,t){if(!0===e[t])throw"duplicate flag "+t;e[t];e[t]=!0}function a(e){if(void 0===e)throw Error("Internal Error - Should never get here!");return!0}function o(){throw Error("Internal Error - Should never get here!")}function l(e){return"Character"===e.type}n.d(t,{z:()=>g,H:()=>m});const c=[];for(let y=r("0");y<=r("9");y++)c.push(y);const u=[r("_")].concat(c);for(let y=r("a");y<=r("z");y++)u.push(y);for(let y=r("A");y<=r("Z");y++)u.push(y);const d=[r(" "),r("\f"),r("\n"),r("\r"),r("\t"),r("\v"),r("\t"),r("\xa0"),r("\u1680"),r("\u2000"),r("\u2001"),r("\u2002"),r("\u2003"),r("\u2004"),r("\u2005"),r("\u2006"),r("\u2007"),r("\u2008"),r("\u2009"),r("\u200a"),r("\u2028"),r("\u2029"),r("\u202f"),r("\u205f"),r("\u3000"),r("\ufeff")],h=/[0-9a-fA-F]/,f=/[0-9]/,p=/[1-9]/;class m{constructor(){this.idx=0,this.input="",this.groupIdx=0}saveState(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}}restoreState(e){this.idx=e.idx,this.input=e.input,this.groupIdx=e.groupIdx}pattern(e){this.idx=0,this.input=e,this.groupIdx=0,this.consumeChar("/");const t=this.disjunction();this.consumeChar("/");const n={type:"Flags",loc:{begin:this.idx,end:e.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};for(;this.isRegExpFlag();)switch(this.popChar()){case"g":s(n,"global");break;case"i":s(n,"ignoreCase");break;case"m":s(n,"multiLine");break;case"u":s(n,"unicode");break;case"y":s(n,"sticky")}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:n,value:t,loc:this.loc(0)}}disjunction(){const e=[],t=this.idx;for(e.push(this.alternative());"|"===this.peekChar();)this.consumeChar("|"),e.push(this.alternative());return{type:"Disjunction",value:e,loc:this.loc(t)}}alternative(){const e=[],t=this.idx;for(;this.isTerm();)e.push(this.term());return{type:"Alternative",value:e,loc:this.loc(t)}}term(){return this.isAssertion()?this.assertion():this.atom()}assertion(){const e=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(e)};case"$":return{type:"EndAnchor",loc:this.loc(e)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(e)};case"B":return{type:"NonWordBoundary",loc:this.loc(e)}}throw Error("Invalid Assertion Escape");case"(":let t;switch(this.consumeChar("?"),this.popChar()){case"=":t="Lookahead";break;case"!":t="NegativeLookahead"}a(t);const n=this.disjunction();return this.consumeChar(")"),{type:t,value:n,loc:this.loc(e)}}return o()}quantifier(e=!1){let t;const n=this.idx;switch(this.popChar()){case"*":t={atLeast:0,atMost:1/0};break;case"+":t={atLeast:1,atMost:1/0};break;case"?":t={atLeast:0,atMost:1};break;case"{":const n=this.integerIncludingZero();switch(this.popChar()){case"}":t={atLeast:n,atMost:n};break;case",":let e;this.isDigit()?(e=this.integerIncludingZero(),t={atLeast:n,atMost:e}):t={atLeast:n,atMost:1/0},this.consumeChar("}")}if(!0===e&&void 0===t)return;a(t)}if(!0!==e||void 0!==t)return a(t)?("?"===this.peekChar(0)?(this.consumeChar("?"),t.greedy=!1):t.greedy=!0,t.type="Quantifier",t.loc=this.loc(n),t):void 0}atom(){let e;const t=this.idx;switch(this.peekChar()){case".":e=this.dotAll();break;case"\\":e=this.atomEscape();break;case"[":e=this.characterClass();break;case"(":e=this.group()}return void 0===e&&this.isPatternCharacter()&&(e=this.patternCharacter()),a(e)?(e.loc=this.loc(t),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):o()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[r("\n"),r("\r"),r("\u2028"),r("\u2029")]}}atomEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}decimalEscapeAtom(){return{type:"GroupBackReference",value:this.positiveInteger()}}characterClassEscape(){let e,t=!1;switch(this.popChar()){case"d":e=c;break;case"D":e=c,t=!0;break;case"s":e=d;break;case"S":e=d,t=!0;break;case"w":e=u;break;case"W":e=u,t=!0}return a(e)?{type:"Set",value:e,complement:t}:o()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=r("\f");break;case"n":e=r("\n");break;case"r":e=r("\r");break;case"t":e=r("\t");break;case"v":e=r("\v")}return a(e)?{type:"Character",value:e}:o()}controlLetterEscapeAtom(){this.consumeChar("c");const e=this.popChar();if(!1===/[a-zA-Z]/.test(e))throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:r("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){return{type:"Character",value:r(this.popChar())}}classPatternCharacterAtom(){switch(this.peekChar()){case"\n":case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:return{type:"Character",value:r(this.popChar())}}}characterClass(){const e=[];let t=!1;for(this.consumeChar("["),"^"===this.peekChar(0)&&(this.consumeChar("^"),t=!0);this.isClassAtom();){const t=this.classAtom();t.type;if(l(t)&&this.isRangeDash()){this.consumeChar("-");const n=this.classAtom();n.type;if(l(n)){if(n.value<t.value)throw Error("Range out of order in character class");e.push({from:t.value,to:n.value})}else i(t.value,e),e.push(r("-")),i(n.value,e)}else i(t.value,e)}return this.consumeChar("]"),{type:"Set",complement:t,value:e}}classAtom(){switch(this.peekChar()){case"]":case"\n":case"\r":case"\u2028":case"\u2029":throw Error("TBD");case"\\":return this.classEscape();default:return this.classPatternCharacterAtom()}}classEscape(){switch(this.consumeChar("\\"),this.peekChar()){case"b":return this.consumeChar("b"),{type:"Character",value:r("\b")};case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}}group(){let e=!0;if(this.consumeChar("("),"?"===this.peekChar(0))this.consumeChar("?"),this.consumeChar(":"),e=!1;else this.groupIdx++;const t=this.disjunction();this.consumeChar(")");const n={type:"Group",capturing:e,value:t};return e&&(n.idx=this.groupIdx),n}positiveInteger(){let e=this.popChar();if(!1===p.test(e))throw Error("Expecting a positive integer");for(;f.test(this.peekChar(0));)e+=this.popChar();return parseInt(e,10)}integerIncludingZero(){let e=this.popChar();if(!1===f.test(e))throw Error("Expecting an integer");for(;f.test(this.peekChar(0));)e+=this.popChar();return parseInt(e,10)}patternCharacter(){const e=this.popChar();switch(e){case"\n":case"\r":case"\u2028":case"\u2029":case"^":case"$":case"\\":case".":case"*":case"+":case"?":case"(":case")":case"[":case"|":throw Error("TBD");default:return{type:"Character",value:r(e)}}}isRegExpFlag(){switch(this.peekChar(0)){case"g":case"i":case"m":case"u":case"y":return!0;default:return!1}}isRangeDash(){return"-"===this.peekChar()&&this.isClassAtom(1)}isDigit(){return f.test(this.peekChar(0))}isClassAtom(e=0){switch(this.peekChar(e)){case"]":case"\n":case"\r":case"\u2028":case"\u2029":return!1;default:return!0}}isTerm(){return this.isAtom()||this.isAssertion()}isAtom(){if(this.isPatternCharacter())return!0;switch(this.peekChar(0)){case".":case"\\":case"[":case"(":return!0;default:return!1}}isAssertion(){switch(this.peekChar(0)){case"^":case"$":return!0;case"\\":switch(this.peekChar(1)){case"b":case"B":return!0;default:return!1}case"(":return"?"===this.peekChar(1)&&("="===this.peekChar(2)||"!"===this.peekChar(2));default:return!1}}isQuantifier(){const e=this.saveState();try{return void 0!==this.quantifier(!0)}catch(t){return!1}finally{this.restoreState(e)}}isPatternCharacter(){switch(this.peekChar()){case"^":case"$":case"\\":case".":case"*":case"+":case"?":case"(":case")":case"[":case"|":case"/":case"\n":case"\r":case"\u2028":case"\u2029":return!1;default:return!0}}parseHexDigits(e){let t="";for(let n=0;n<e;n++){const e=this.popChar();if(!1===h.test(e))throw Error("Expecting a HexDecimal digits");t+=e}return{type:"Character",value:parseInt(t,16)}}peekChar(e=0){return this.input[this.idx+e]}popChar(){const e=this.peekChar(0);return this.consumeChar(void 0),e}consumeChar(e){if(void 0!==e&&this.input[this.idx]!==e)throw Error("Expected: '"+e+"' but found: '"+this.input[this.idx]+"' at offset: "+this.idx);if(this.idx>=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}class g{visitChildren(e){for(const t in e){const n=e[t];e.hasOwnProperty(t)&&(void 0!==n.type?this.visit(n):Array.isArray(n)&&n.forEach(e=>{this.visit(e)},this))}}visit(e){switch(e.type){case"Pattern":this.visitPattern(e);break;case"Flags":this.visitFlags(e);break;case"Disjunction":this.visitDisjunction(e);break;case"Alternative":this.visitAlternative(e);break;case"StartAnchor":this.visitStartAnchor(e);break;case"EndAnchor":this.visitEndAnchor(e);break;case"WordBoundary":this.visitWordBoundary(e);break;case"NonWordBoundary":this.visitNonWordBoundary(e);break;case"Lookahead":this.visitLookahead(e);break;case"NegativeLookahead":this.visitNegativeLookahead(e);break;case"Character":this.visitCharacter(e);break;case"Set":this.visitSet(e);break;case"Group":this.visitGroup(e);break;case"GroupBackReference":this.visitGroupBackReference(e);break;case"Quantifier":this.visitQuantifier(e)}this.visitChildren(e)}visitPattern(e){}visitFlags(e){}visitDisjunction(e){}visitAlternative(e){}visitStartAnchor(e){}visitEndAnchor(e){}visitWordBoundary(e){}visitNonWordBoundary(e){}visitLookahead(e){}visitNegativeLookahead(e){}visitCharacter(e){}visitSet(e){}visitGroup(e){}visitGroupBackReference(e){}visitQuantifier(e){}}},12223:(e,t,n)=>{n.d(t,{d:()=>a});var r,i=n(34813),s=n(29520);class a{convert(e,t){let n=t.grammarSource;if((0,i._c)(n)&&(n=(0,s.g4)(n)),(0,i.$g)(n)){const r=n.rule.ref;if(!r)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(r,e,t)}return e}runConverter(e,t,n){var i;switch(e.name.toUpperCase()){case"INT":return r.convertInt(t);case"STRING":return r.convertString(t);case"ID":return r.convertID(t)}switch(null===(i=(0,s.P3)(e))||void 0===i?void 0:i.toLowerCase()){case"number":return r.convertNumber(t);case"boolean":return r.convertBoolean(t);case"bigint":return r.convertBigint(t);case"date":return r.convertDate(t);default:return t}}}!function(e){function t(e){switch(e){case"b":return"\b";case"f":return"\f";case"n":return"\n";case"r":return"\r";case"t":return"\t";case"v":return"\v";case"0":return"\0";default:return e}}e.convertString=function(e){let n="";for(let r=1;r<e.length-1;r++){const i=e.charAt(r);if("\\"===i){n+=t(e.charAt(++r))}else n+=i}return n},e.convertID=function(e){return"^"===e.charAt(0)?e.substring(1):e},e.convertInt=function(e){return parseInt(e)},e.convertBigint=function(e){return BigInt(e)},e.convertDate=function(e){return new Date(e)},e.convertNumber=function(e){return Number(e)},e.convertBoolean=function(e){return"true"===e.toLowerCase()}}(r||(r={}))},12345:(e,t,n)=>{n.d(t,{$:()=>c});var r=n(60349),i=n(96103),s=n(95846),a=n(8158),o=class extends r.mR{static{(0,r.K2)(this,"PacketTokenBuilder")}constructor(){super(["packet-beta"])}},l={parser:{TokenBuilder:(0,r.K2)(()=>new o,"TokenBuilder"),ValueConverter:(0,r.K2)(()=>new r.Tm,"ValueConverter")}};function c(e=i.D){const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.AM,l);return t.ServiceRegistry.register(n),{shared:t,Packet:n}}(0,r.K2)(c,"createPacketServices")},13884:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(13027);const i=function(e,t,n){for(var i=-1,s=e.length;++i<s;){var a=e[i],o=t(a);if(null!=o&&(void 0===l?o==o&&!(0,r.A)(o):n(o,l)))var l=o,c=a}return c}},20202:(e,t,n)=>{t.Qi=t.XO=void 0;const r=n(406),i=n(78137),s=n(40436);var a;!function(e){e.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:s.Event.None}),e.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:s.Event.None}),e.is=function(t){const n=t;return n&&(n===e.None||n===e.Cancelled||i.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}}(a||(t.XO=a={}));const o=Object.freeze(function(e,t){const n=(0,r.default)().timer.setTimeout(e.bind(t),0);return{dispose(){n.dispose()}}});class l{constructor(){this._isCancelled=!1}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?o:(this._emitter||(this._emitter=new s.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}}t.Qi=class{get token(){return this._token||(this._token=new l),this._token}cancel(){this._token?this._token.cancel():this._token=a.Cancelled}dispose(){this._token?this._token instanceof l&&this._token.dispose():this._token=a.None}}},21963:(e,t,n)=>{n.d(t,{f:()=>u});var r=n(60349),i=n(96103),s=n(95846),a=n(8158),o=class extends r.mR{static{(0,r.K2)(this,"PieTokenBuilder")}constructor(){super(["pie","showData"])}},l=class extends r.dg{static{(0,r.K2)(this,"PieValueConverter")}runCustomConverter(e,t,n){if("PIE_SECTION_LABEL"===e.name)return t.replace(/"/g,"").trim()}},c={parser:{TokenBuilder:(0,r.K2)(()=>new o,"TokenBuilder"),ValueConverter:(0,r.K2)(()=>new l,"ValueConverter")}};function u(e=i.D){const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.KX,c);return t.ServiceRegistry.register(n),{shared:t,Pie:n}}(0,r.K2)(u,"createPieServices")},22675:(e,t,n)=>{n.d(t,{A:()=>a});var r=n(13884),i=n(23855),s=n(56117);const a=function(e){return e&&e.length?(0,r.A)(e,s.A,i.A):void 0}},23741:(e,t,n)=>{n.d(t,{v:()=>c});var r=n(60349),i=n(96103),s=n(95846),a=n(8158),o=class extends r.mR{static{(0,r.K2)(this,"InfoTokenBuilder")}constructor(){super(["info","showInfo"])}},l={parser:{TokenBuilder:(0,r.K2)(()=>new o,"TokenBuilder"),ValueConverter:(0,r.K2)(()=>new r.Tm,"ValueConverter")}};function c(e=i.D){const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.e5,l);return t.ServiceRegistry.register(n),{shared:t,Info:n}}(0,r.K2)(c,"createInfoServices")},23855:(e,t,n)=>{n.d(t,{A:()=>r});const r=function(e,t){return e<t}},29520:(e,t,n)=>{n.d(t,{Bd:()=>f,P3:()=>x,PV:()=>E,Rp:()=>T,S:()=>I,SS:()=>g,U5:()=>A,Uz:()=>k,Xq:()=>R,YV:()=>c,eb:()=>h,g4:()=>d,qO:()=>p});var r=n(36610),i=n(34813),s=n(64913),a=n(64561),o=n(67567),l=n(49948);function c(e,t){const n=new Set,r=function(e){return e.rules.find(e=>i.s7(e)&&e.entry)}(e);if(!r)return new Set(e.rules);const s=[r].concat(function(e){return e.rules.filter(e=>i.rE(e)&&e.hidden)}(e));for(const i of s)u(i,n,t);const a=new Set;for(const o of e.rules)(n.has(o.name)||i.rE(o)&&o.hidden)&&a.add(o);return a}function u(e,t,n){t.add(e.name),(0,a.Uo)(e).forEach(e=>{if(i.$g(e)||n&&i.lF(e)){const r=e.rule.ref;r&&!t.has(r.name)&&u(r,t,n)}})}function d(e){if(e.terminal)return e.terminal;if(e.type.ref){const t=A(e.type.ref);return null==t?void 0:t.terminal}}function h(e){return e.hidden&&!(0,l.Yv)(I(e))}function f(e,t){return e&&t?m(e,t,e.astNode,!0):[]}function p(e,t,n){if(!e||!t)return;const r=m(e,t,e.astNode,!0);return 0!==r.length?r[n=void 0!==n?Math.max(0,Math.min(n,r.length-1)):0]:void 0}function m(e,t,n,r){if(!r){const n=(0,a.XG)(e.grammarSource,i.wh);if(n&&n.feature===t)return[e]}return(0,s.mD)(e)&&e.astNode===n?e.content.flatMap(e=>m(e,t,n,!1)):[]}function g(e,t,n){if(!e)return;const r=y(e,t,null==e?void 0:e.astNode);return 0!==r.length?r[n=void 0!==n?Math.max(0,Math.min(n,r.length-1)):0]:void 0}function y(e,t,n){if(e.astNode!==n)return[];if(i.wb(e.grammarSource)&&e.grammarSource.value===t)return[e];const r=(0,o.NS)(e).iterator();let s;const a=[];do{if(s=r.next(),!s.done){const e=s.value;e.astNode===n?i.wb(e.grammarSource)&&e.grammarSource.value===t&&a.push(e):r.prune()}}while(!s.done);return a}function T(e){var t;const n=e.astNode;for(;n===(null===(t=e.container)||void 0===t?void 0:t.astNode);){const t=(0,a.XG)(e.grammarSource,i.wh);if(t)return t;e=e.container}}function A(e){let t=e;return i.SP(t)&&(i.ve(t.$container)?t=t.$container.$container:i.s7(t.$container)?t=t.$container:(0,r.d)(t.$container)),v(e,t,new Map)}function v(e,t,n){var r;function s(t,r){let s;return(0,a.XG)(t,i.wh)||(s=v(r,r,n)),n.set(e,s),s}if(n.has(e))return n.get(e);n.set(e,void 0);for(const o of(0,a.Uo)(t)){if(i.wh(o)&&"name"===o.feature.toLowerCase())return n.set(e,o),o;if(i.$g(o)&&i.s7(o.rule.ref))return s(o,o.rule.ref);if(i.D8(o)&&(null===(r=o.typeRef)||void 0===r?void 0:r.ref))return s(o,o.typeRef.ref)}}function R(e){return $(e,new Set)}function $(e,t){if(t.has(e))return!0;t.add(e);for(const n of(0,a.Uo)(e))if(i.$g(n)){if(!n.rule.ref)return!1;if(i.s7(n.rule.ref)&&!$(n.rule.ref,t))return!1}else{if(i.wh(n))return!1;if(i.ve(n))return!1}return Boolean(e.definition)}function E(e){if(e.inferredType)return e.inferredType.name;if(e.dataType)return e.dataType;if(e.returnType){const t=e.returnType.ref;if(t){if(i.s7(t))return t.name;if(i.S2(t)||i.Xj(t))return t.name}}}function k(e){var t;if(i.s7(e))return R(e)?e.name:null!==(t=E(e))&&void 0!==t?t:e.name;if(i.S2(e)||i.Xj(e)||i.fG(e))return e.name;if(i.ve(e)){const t=function(e){var t;if(e.inferredType)return e.inferredType.name;if(null===(t=e.type)||void 0===t?void 0:t.ref)return k(e.type.ref);return}(e);if(t)return t}else if(i.SP(e))return e.name;throw new Error("Cannot get name of Unknown Type")}function x(e){var t,n,r;return i.rE(e)?null!==(n=null===(t=e.type)||void 0===t?void 0:t.name)&&void 0!==n?n:"string":null!==(r=E(e))&&void 0!==r?r:e.name}function I(e){const t={s:!1,i:!1,u:!1},n=N(e.definition,t),r=Object.entries(t).filter(([,e])=>e).map(([e])=>e).join("");return new RegExp(n,r)}const S=/[\s\S]/.source;function N(e,t){if(i.Fy(e))return w((a=e).elements.map(e=>N(e)).join("|"),{cardinality:a.cardinality,lookahead:a.lookahead});if(i.O4(e))return w((s=e).elements.map(e=>N(e)).join(""),{cardinality:s.cardinality,lookahead:s.lookahead});if(i.Bg(e))return function(e){if(e.right)return w(`[${C(e.left)}-${C(e.right)}]`,{cardinality:e.cardinality,lookahead:e.lookahead,wrap:!1});return w(C(e.left),{cardinality:e.cardinality,lookahead:e.lookahead,wrap:!1})}(e);if(i.lF(e)){const t=e.rule.ref;if(!t)throw new Error("Missing rule reference.");return w(N(t.definition),{cardinality:e.cardinality,lookahead:e.lookahead})}if(i.GL(e))return w(`(?!${N((r=e).terminal)})${S}*?`,{cardinality:r.cardinality,lookahead:r.lookahead});if(i.Mz(e))return w(`${S}*?${N((n=e).terminal)}`,{cardinality:n.cardinality,lookahead:n.lookahead});if(i.vd(e)){const n=e.regex.lastIndexOf("/"),r=e.regex.substring(1,n),i=e.regex.substring(n+1);return t&&(t.i=i.includes("i"),t.s=i.includes("s"),t.u=i.includes("u")),w(r,{cardinality:e.cardinality,lookahead:e.lookahead,wrap:!1})}if(i.z2(e))return w(S,{cardinality:e.cardinality,lookahead:e.lookahead});throw new Error(`Invalid terminal element: ${null==e?void 0:e.$type}`);var n,r,s,a}function C(e){return(0,l.Nt)(e.value)}function w(e,t){var n;return(!1!==t.wrap||t.lookahead)&&(e=`(${null!==(n=t.lookahead)&&void 0!==n?n:""}${e})`),t.cardinality?`${e}${t.cardinality}`:e}},31361:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(44753),i=n(42849);const s=function(e,t){var n=-1,s=(0,i.A)(e)?Array(e.length):[];return(0,r.A)(e,function(e,r,i){s[++n]=t(e,r,i)}),s}},34813:(e,t,n)=>{n.d(t,{$g:()=>fe,Bg:()=>J,Ct:()=>S,Cz:()=>p,D8:()=>U,FO:()=>re,Fy:()=>me,GL:()=>ce,IZ:()=>se,Mz:()=>Ee,O4:()=>ye,QX:()=>Ie,RP:()=>T,S2:()=>k,SP:()=>$,TF:()=>L,Tu:()=>g,Xj:()=>j,_c:()=>te,cY:()=>Re,fG:()=>M,jp:()=>X,lF:()=>Ae,r1:()=>u,rE:()=>K,s7:()=>O,vd:()=>de,ve:()=>z,wb:()=>oe,wh:()=>Q,z2:()=>xe});var r=n(64913);const i="AbstractRule";const s="AbstractType";const a="Condition";const o="TypeDefinition";const l="ValueLiteral";const c="AbstractElement";function u(e){return Se.isInstance(e,c)}const d="ArrayLiteral";const h="ArrayType";const f="BooleanLiteral";function p(e){return Se.isInstance(e,f)}const m="Conjunction";function g(e){return Se.isInstance(e,m)}const y="Disjunction";function T(e){return Se.isInstance(e,y)}const A="Grammar";const v="GrammarImport";const R="InferredType";function $(e){return Se.isInstance(e,R)}const E="Interface";function k(e){return Se.isInstance(e,E)}const x="NamedArgument";const I="Negation";function S(e){return Se.isInstance(e,I)}const N="NumberLiteral";const C="Parameter";const w="ParameterReference";function L(e){return Se.isInstance(e,w)}const b="ParserRule";function O(e){return Se.isInstance(e,b)}const _="ReferenceType";const P="ReturnType";function M(e){return Se.isInstance(e,P)}const D="SimpleType";function U(e){return Se.isInstance(e,D)}const F="StringLiteral";const G="TerminalRule";function K(e){return Se.isInstance(e,G)}const B="Type";function j(e){return Se.isInstance(e,B)}const V="TypeAttribute";const H="UnionType";const W="Action";function z(e){return Se.isInstance(e,W)}const Y="Alternatives";function X(e){return Se.isInstance(e,Y)}const q="Assignment";function Q(e){return Se.isInstance(e,q)}const Z="CharacterRange";function J(e){return Se.isInstance(e,Z)}const ee="CrossReference";function te(e){return Se.isInstance(e,ee)}const ne="EndOfFile";function re(e){return Se.isInstance(e,ne)}const ie="Group";function se(e){return Se.isInstance(e,ie)}const ae="Keyword";function oe(e){return Se.isInstance(e,ae)}const le="NegatedToken";function ce(e){return Se.isInstance(e,le)}const ue="RegexToken";function de(e){return Se.isInstance(e,ue)}const he="RuleCall";function fe(e){return Se.isInstance(e,he)}const pe="TerminalAlternatives";function me(e){return Se.isInstance(e,pe)}const ge="TerminalGroup";function ye(e){return Se.isInstance(e,ge)}const Te="TerminalRuleCall";function Ae(e){return Se.isInstance(e,Te)}const ve="UnorderedGroup";function Re(e){return Se.isInstance(e,ve)}const $e="UntilToken";function Ee(e){return Se.isInstance(e,$e)}const ke="Wildcard";function xe(e){return Se.isInstance(e,ke)}class Ie extends r.kD{getAllTypes(){return[c,i,s,W,Y,d,h,q,f,Z,a,m,ee,y,ne,A,v,ie,R,E,ae,x,le,I,N,C,w,b,_,ue,P,he,D,F,pe,ge,G,Te,B,V,o,H,ve,$e,l,ke]}computeIsSubtype(e,t){switch(e){case W:case Y:case q:case Z:case ee:case ne:case ie:case ae:case le:case ue:case he:case pe:case ge:case Te:case ve:case $e:case ke:return this.isSubtype(c,t);case d:case N:case F:return this.isSubtype(l,t);case h:case _:case D:case H:return this.isSubtype(o,t);case f:return this.isSubtype(a,t)||this.isSubtype(l,t);case m:case y:case I:case w:return this.isSubtype(a,t);case R:case E:case B:return this.isSubtype(s,t);case b:return this.isSubtype(i,t)||this.isSubtype(s,t);case G:return this.isSubtype(i,t);default:return!1}}getReferenceType(e){const t=`${e.container.$type}:${e.property}`;switch(t){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return s;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return i;case"Grammar:usedGrammars":return A;case"NamedArgument:parameter":case"ParameterReference:parameter":return C;case"TerminalRuleCall:rule":return G;default:throw new Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case c:return{name:c,properties:[{name:"cardinality"},{name:"lookahead"}]};case d:return{name:d,properties:[{name:"elements",defaultValue:[]}]};case h:return{name:h,properties:[{name:"elementType"}]};case f:return{name:f,properties:[{name:"true",defaultValue:!1}]};case m:return{name:m,properties:[{name:"left"},{name:"right"}]};case y:return{name:y,properties:[{name:"left"},{name:"right"}]};case A:return{name:A,properties:[{name:"definesHiddenTokens",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"imports",defaultValue:[]},{name:"interfaces",defaultValue:[]},{name:"isDeclared",defaultValue:!1},{name:"name"},{name:"rules",defaultValue:[]},{name:"types",defaultValue:[]},{name:"usedGrammars",defaultValue:[]}]};case v:return{name:v,properties:[{name:"path"}]};case R:return{name:R,properties:[{name:"name"}]};case E:return{name:E,properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case x:return{name:x,properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case I:return{name:I,properties:[{name:"value"}]};case N:return{name:N,properties:[{name:"value"}]};case C:return{name:C,properties:[{name:"name"}]};case w:return{name:w,properties:[{name:"parameter"}]};case b:return{name:b,properties:[{name:"dataType"},{name:"definesHiddenTokens",defaultValue:!1},{name:"definition"},{name:"entry",defaultValue:!1},{name:"fragment",defaultValue:!1},{name:"hiddenTokens",defaultValue:[]},{name:"inferredType"},{name:"name"},{name:"parameters",defaultValue:[]},{name:"returnType"},{name:"wildcard",defaultValue:!1}]};case _:return{name:_,properties:[{name:"referenceType"}]};case P:return{name:P,properties:[{name:"name"}]};case D:return{name:D,properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case F:return{name:F,properties:[{name:"value"}]};case G:return{name:G,properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case B:return{name:B,properties:[{name:"name"},{name:"type"}]};case V:return{name:V,properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case H:return{name:H,properties:[{name:"types",defaultValue:[]}]};case W:return{name:W,properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case Y:return{name:Y,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case q:return{name:q,properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case Z:return{name:Z,properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case ee:return{name:ee,properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case ne:return{name:ne,properties:[{name:"cardinality"},{name:"lookahead"}]};case ie:return{name:ie,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case ae:return{name:ae,properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case le:return{name:le,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case ue:return{name:ue,properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case he:return{name:he,properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case pe:return{name:pe,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case ge:return{name:ge,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Te:return{name:Te,properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case ve:return{name:ve,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case $e:return{name:$e,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case ke:return{name:ke,properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}}const Se=new Ie},36610:(e,t,n)=>{n.d(t,{W:()=>r,d:()=>i});class r extends Error{constructor(e,t){super(e?`${t} at ${e.range.start.line}:${e.range.start.character}`:t)}}function i(e){throw new Error("Error! The input value was not handled.")}},38817:(e,t,n)=>{n.d(t,{ak:()=>V,mT:()=>Pr,LT:()=>Xt,jr:()=>Dr,T6:()=>dr,JG:()=>Mt,wL:()=>M,c$:()=>F,Y2:()=>B,$P:()=>G,Cy:()=>K,Pp:()=>j,BK:()=>H,PW:()=>Ot,my:()=>Zt,jk:()=>En,Sk:()=>Dt,G:()=>Qt});var r=n(83129),i=n(6064),s=n(90570),a=n(72185),o=n(52540),l=n(64350);function c(e){function t(){}t.prototype=e;const n=new t;function r(){return typeof n.bar}return r(),r(),e}const u=function(e,t,n){var r=-1,i=e.length;t<0&&(t=-t>i?0:i+t),(n=n>i?i:n)<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var s=Array(i);++r<i;)s[r]=e[r+t];return s};var d=n(81066);const h=function(e,t,n){var r=null==e?0:e.length;return r?(t=n||void 0===t?1:(0,d.A)(t),u(e,t<0?0:t,r)):[]};var f=n(50586),p=n(63406),m=n(88168),g=n(47848),y=n(42849),T=n(39458),A=n(22859),v=Object.prototype.hasOwnProperty;const R=(0,g.A)(function(e,t){if((0,T.A)(t)||(0,y.A)(t))(0,m.A)(t,(0,A.A)(t),e);else for(var n in t)v.call(t,n)&&(0,p.A)(e,n,t[n])});var $=n(22663),E=n(76095),k=n(71159),x=n(47042);const I=function(e,t){if(null==e)return{};var n=(0,$.A)((0,x.A)(e),function(e){return[e]});return t=(0,E.A)(t),(0,k.A)(e,n,function(e,n){return t(e,n[0])})};var S=n(80565),N=n(97427);const C=function(e){return(0,N.A)(e)&&"[object RegExp]"==(0,S.A)(e)};var w=n(5220),L=n(10130),b=L.A&&L.A.isRegExp;const O=b?(0,w.A)(b):C;function _(e){return t=e,(0,f.A)(t.LABEL)&&""!==t.LABEL?e.LABEL:e.name;var t}class P{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){this._definition=e}accept(e){e.visit(this),(0,r.A)(this.definition,t=>{t.accept(e)})}}class M extends P{constructor(e){super([]),this.idx=1,R(this,I(e,e=>void 0!==e))}set definition(e){}get definition(){return void 0!==this.referencedRule?this.referencedRule.definition:[]}accept(e){e.visit(this)}}class D extends P{constructor(e){super(e.definition),this.orgText="",R(this,I(e,e=>void 0!==e))}}class U extends P{constructor(e){super(e.definition),this.ignoreAmbiguities=!1,R(this,I(e,e=>void 0!==e))}}class F extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,e=>void 0!==e))}}class G extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,e=>void 0!==e))}}class K extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,e=>void 0!==e))}}class B extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,e=>void 0!==e))}}class j extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,e=>void 0!==e))}}class V extends P{get definition(){return this._definition}set definition(e){this._definition=e}constructor(e){super(e.definition),this.idx=1,this.ignoreAmbiguities=!1,this.hasPredicates=!1,R(this,I(e,e=>void 0!==e))}}class H{constructor(e){this.idx=1,R(this,I(e,e=>void 0!==e))}accept(e){e.visit(this)}}function W(e){function t(e){return(0,a.A)(e,W)}if(e instanceof M){const t={type:"NonTerminal",name:e.nonTerminalName,idx:e.idx};return(0,f.A)(e.label)&&(t.label=e.label),t}if(e instanceof U)return{type:"Alternative",definition:t(e.definition)};if(e instanceof F)return{type:"Option",idx:e.idx,definition:t(e.definition)};if(e instanceof G)return{type:"RepetitionMandatory",idx:e.idx,definition:t(e.definition)};if(e instanceof K)return{type:"RepetitionMandatoryWithSeparator",idx:e.idx,separator:W(new H({terminalType:e.separator})),definition:t(e.definition)};if(e instanceof j)return{type:"RepetitionWithSeparator",idx:e.idx,separator:W(new H({terminalType:e.separator})),definition:t(e.definition)};if(e instanceof B)return{type:"Repetition",idx:e.idx,definition:t(e.definition)};if(e instanceof V)return{type:"Alternation",idx:e.idx,definition:t(e.definition)};if(e instanceof H){const t={type:"Terminal",name:e.terminalType.name,label:_(e.terminalType),idx:e.idx};(0,f.A)(e.label)&&(t.terminalLabel=e.label);const n=e.terminalType.PATTERN;return e.terminalType.PATTERN&&(t.pattern=O(n)?n.source:n),t}if(e instanceof D)return{type:"Rule",name:e.name,orgText:e.orgText,definition:t(e.definition)};throw Error("non exhaustive match")}class z{visit(e){const t=e;switch(t.constructor){case M:return this.visitNonTerminal(t);case U:return this.visitAlternative(t);case F:return this.visitOption(t);case G:return this.visitRepetitionMandatory(t);case K:return this.visitRepetitionMandatoryWithSeparator(t);case j:return this.visitRepetitionWithSeparator(t);case B:return this.visitRepetition(t);case V:return this.visitAlternation(t);case H:return this.visitTerminal(t);case D:return this.visitRule(t);default:throw Error("non exhaustive match")}}visitNonTerminal(e){}visitAlternative(e){}visitOption(e){}visitRepetition(e){}visitRepetitionMandatory(e){}visitRepetitionMandatoryWithSeparator(e){}visitRepetitionWithSeparator(e){}visitAlternation(e){}visitTerminal(e){}visitRule(e){}}var Y=n(25601),X=n(44753);const q=function(e,t){var n;return(0,X.A)(e,function(e,r,i){return!(n=t(e,r,i))}),!!n};var Q=n(95526),Z=n(16599);const J=function(e,t,n){var r=(0,Q.A)(e)?Y.A:q;return n&&(0,Z.A)(e,t,n)&&(t=void 0),r(e,(0,E.A)(t,3))};var ee=n(37617),te=Math.max;const ne=function(e,t,n,r){e=(0,y.A)(e)?e:(0,i.A)(e),n=n&&!r?(0,d.A)(n):0;var s=e.length;return n<0&&(n=te(s+n,0)),(0,f.A)(e)?n<=s&&e.indexOf(t,n)>-1:!!s&&(0,ee.A)(e,t,n)>-1};const re=function(e,t){for(var n=-1,r=null==e?0:e.length;++n<r;)if(!t(e[n],n,e))return!1;return!0};const ie=function(e,t){var n=!0;return(0,X.A)(e,function(e,r,i){return n=!!t(e,r,i)}),n};const se=function(e,t,n){var r=(0,Q.A)(e)?re:ie;return n&&(0,Z.A)(e,t,n)&&(t=void 0),r(e,(0,E.A)(t,3))};function ae(e,t=[]){return!!(e instanceof F||e instanceof B||e instanceof j)||(e instanceof V?J(e.definition,e=>ae(e,t)):!(e instanceof M&&ne(t,e))&&(e instanceof P&&(e instanceof M&&t.push(e),se(e.definition,e=>ae(e,t)))))}function oe(e){if(e instanceof M)return"SUBRULE";if(e instanceof F)return"OPTION";if(e instanceof V)return"OR";if(e instanceof G)return"AT_LEAST_ONE";if(e instanceof K)return"AT_LEAST_ONE_SEP";if(e instanceof j)return"MANY_SEP";if(e instanceof B)return"MANY";if(e instanceof H)return"CONSUME";throw Error("non exhaustive match")}class le{walk(e,t=[]){(0,r.A)(e.definition,(n,r)=>{const i=h(e.definition,r+1);if(n instanceof M)this.walkProdRef(n,i,t);else if(n instanceof H)this.walkTerminal(n,i,t);else if(n instanceof U)this.walkFlat(n,i,t);else if(n instanceof F)this.walkOption(n,i,t);else if(n instanceof G)this.walkAtLeastOne(n,i,t);else if(n instanceof K)this.walkAtLeastOneSep(n,i,t);else if(n instanceof j)this.walkManySep(n,i,t);else if(n instanceof B)this.walkMany(n,i,t);else{if(!(n instanceof V))throw Error("non exhaustive match");this.walkOr(n,i,t)}})}walkTerminal(e,t,n){}walkProdRef(e,t,n){}walkFlat(e,t,n){const r=t.concat(n);this.walk(e,r)}walkOption(e,t,n){const r=t.concat(n);this.walk(e,r)}walkAtLeastOne(e,t,n){const r=[new F({definition:e.definition})].concat(t,n);this.walk(e,r)}walkAtLeastOneSep(e,t,n){const r=ce(e,t,n);this.walk(e,r)}walkMany(e,t,n){const r=[new F({definition:e.definition})].concat(t,n);this.walk(e,r)}walkManySep(e,t,n){const r=ce(e,t,n);this.walk(e,r)}walkOr(e,t,n){const i=t.concat(n);(0,r.A)(e.definition,e=>{const t=new U({definition:[e]});this.walk(t,i)})}}function ce(e,t,n){return[new F({definition:[new H({terminalType:e.separator})].concat(e.definition)})].concat(t,n)}var ue=n(80171);const de=function(e){return e&&e.length?(0,ue.A)(e):[]};var he=n(60129);function fe(e){if(e instanceof M)return fe(e.referencedRule);if(e instanceof H)return[e.terminalType];if(function(e){return e instanceof U||e instanceof F||e instanceof B||e instanceof G||e instanceof K||e instanceof j||e instanceof H||e instanceof D}(e))return function(e){let t=[];const n=e.definition;let r,i=0,s=n.length>i,a=!0;for(;s&&a;)r=n[i],a=ae(r),t=t.concat(fe(r)),i+=1,s=n.length>i;return de(t)}(e);if(function(e){return e instanceof V}(e))return function(e){const t=(0,a.A)(e.definition,e=>fe(e));return de((0,he.A)(t))}(e);throw Error("non exhaustive match")}const pe="_~IN~_";class me extends le{constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,t,n){}walkProdRef(e,t,n){const r=(i=e.referencedRule,s=e.idx,i.name+s+pe+this.topProd.name);var i,s;const a=t.concat(n),o=fe(new U({definition:a}));this.follows[r]=o}}var ge=n(60707),ye=n(11921),Te=n(5237),Ae=n(71031),ve=n(52837);const Re=function(e){if("function"!=typeof e)throw new TypeError("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}};const $e=function(e,t){return((0,Q.A)(e)?Ae.A:ve.A)(e,Re((0,E.A)(t,3)))};var Ee=n(41863),ke=Math.max;const xe=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=null==n?0:(0,d.A)(n);return i<0&&(i=ke(r+i,0)),(0,ee.A)(e,t,i)};var Ie=n(96800),Se=n(89949),Ne=n(46691),Ce=n(9532),we=n(53924),Le=n(9584);const be=function(e,t,n,r){var i=-1,s=Ce.A,a=!0,o=e.length,l=[],c=t.length;if(!o)return l;n&&(t=(0,$.A)(t,(0,w.A)(n))),r?(s=we.A,a=!1):t.length>=200&&(s=Le.A,a=!1,t=new Ne.A(t));e:for(;++i<o;){var u=e[i],d=null==n?u:n(u);if(u=r||0!==u?u:0,a&&d==d){for(var h=c;h--;)if(t[h]===d)continue e;l.push(u)}else s(t,d,r)||l.push(u)}return l};var Oe=n(49759),_e=n(34713),Pe=n(33998);const Me=(0,_e.A)(function(e,t){return(0,Pe.A)(e)?be(e,(0,Oe.A)(t,1,Pe.A,!0)):[]});const De=function(e){for(var t=-1,n=null==e?0:e.length,r=0,i=[];++t<n;){var s=e[t];s&&(i[r++]=s)}return i};const Ue=function(e){return e&&e.length?e[0]:void 0};var Fe=n(3602);function Ge(e){console&&console.error&&console.error(`Error: ${e}`)}function Ke(e){console&&console.warn&&console.warn(`Warning: ${e}`)}let Be={};const je=new ye.H;function Ve(e){const t=e.toString();if(Be.hasOwnProperty(t))return Be[t];{const e=je.pattern(t);return Be[t]=e,e}}const He="Complement Sets are not supported for first char optimization",We='Unable to use "first char" lexer optimizations:\n';function ze(e,t=!1){try{const t=Ve(e);return Ye(t.value,{},t.flags.ignoreCase)}catch(n){if(n.message===He)t&&Ke(`${We}\tUnable to optimize: < ${e.toString()} >\n\tComplement Sets cannot be automatically optimized.\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";t&&(n="\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details."),Ge(`${We}\n\tFailed parsing: < ${e.toString()} >\n\tUsing the @chevrotain/regexp-to-ast library\n\tPlease open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function Ye(e,t,n){switch(e.type){case"Disjunction":for(let r=0;r<e.value.length;r++)Ye(e.value[r],t,n);break;case"Alternative":const i=e.value;for(let e=0;e<i.length;e++){const s=i[e];switch(s.type){case"EndAnchor":case"GroupBackReference":case"Lookahead":case"NegativeLookahead":case"StartAnchor":case"WordBoundary":case"NonWordBoundary":continue}const a=s;switch(a.type){case"Character":Xe(a.value,t,n);break;case"Set":if(!0===a.complement)throw Error(He);(0,r.A)(a.value,e=>{if("number"==typeof e)Xe(e,t,n);else{const r=e;if(!0===n)for(let e=r.from;e<=r.to;e++)Xe(e,t,n);else{for(let e=r.from;e<=r.to&&e<yt;e++)Xe(e,t,n);if(r.to>=yt){const e=r.from>=yt?r.from:yt,n=r.to,i=At(e),s=At(n);for(let r=i;r<=s;r++)t[r]=r}}}});break;case"Group":Ye(a.value,t,n);break;default:throw Error("Non Exhaustive Match")}const o=void 0!==a.quantifier&&0===a.quantifier.atLeast;if("Group"===a.type&&!1===Qe(a)||"Group"!==a.type&&!1===o)break}break;default:throw Error("non exhaustive match!")}return(0,i.A)(t)}function Xe(e,t,n){const r=At(e);t[r]=r,!0===n&&function(e,t){const n=String.fromCharCode(e),r=n.toUpperCase();if(r!==n){const e=At(r.charCodeAt(0));t[e]=e}else{const e=n.toLowerCase();if(e!==n){const n=At(e.charCodeAt(0));t[n]=n}}}(e,t)}function qe(e,t){return(0,Fe.A)(e.value,e=>{if("number"==typeof e)return ne(t,e);{const n=e;return void 0!==(0,Fe.A)(t,e=>n.from<=e&&e<=n.to)}})}function Qe(e){const t=e.quantifier;return!(!t||0!==t.atLeast)||!!e.value&&((0,Q.A)(e.value)?se(e.value,Qe):Qe(e.value))}class Ze extends ye.z{constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(!0!==this.found){switch(e.type){case"Lookahead":return void this.visitLookahead(e);case"NegativeLookahead":return void this.visitNegativeLookahead(e)}super.visitChildren(e)}}visitCharacter(e){ne(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?void 0===qe(e,this.targetCharCodes)&&(this.found=!0):void 0!==qe(e,this.targetCharCodes)&&(this.found=!0)}}function Je(e,t){if(t instanceof RegExp){const n=Ve(t),r=new Ze(e);return r.visit(n),r.found}return void 0!==(0,Fe.A)(t,t=>ne(e,t.charCodeAt(0)))}const et="PATTERN",tt="defaultMode",nt="modes";let rt="boolean"==typeof new RegExp("(?:)").sticky;function it(e,t){const n=(t=(0,Te.A)(t,{useSticky:rt,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r","\n"],tracer:(e,t)=>t()})).tracer;let i;n("initCharCodeToOptimizedIndexMap",()=>{!function(){if((0,s.A)(Tt)){Tt=new Array(65536);for(let e=0;e<65536;e++)Tt[e]=e>255?255+~~(e/255):e}}()}),n("Reject Lexer.NA",()=>{i=$e(e,e=>e[et]===Mt.NA)});let l,c,u,d,h,p,m,g,y,T,A,v=!1;n("Transform Patterns",()=>{v=!1,l=(0,a.A)(i,e=>{const n=e[et];if(O(n)){const e=n.source;return 1!==e.length||"^"===e||"$"===e||"."===e||n.ignoreCase?2!==e.length||"\\"!==e[0]||ne(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],e[1])?t.useSticky?ct(n):lt(n):e[1]:e}if((0,Ee.A)(n))return v=!0,{exec:n};if("object"==typeof n)return v=!0,n;if("string"==typeof n){if(1===n.length)return n;{const e=n.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),r=new RegExp(e);return t.useSticky?ct(r):lt(r)}}throw Error("non exhaustive match")})}),n("misc mapping",()=>{c=(0,a.A)(i,e=>e.tokenTypeIdx),u=(0,a.A)(i,e=>{const t=e.GROUP;if(t!==Mt.SKIPPED){if((0,f.A)(t))return t;if((0,ge.A)(t))return!1;throw Error("non exhaustive match")}}),d=(0,a.A)(i,e=>{const t=e.LONGER_ALT;if(t){return(0,Q.A)(t)?(0,a.A)(t,e=>xe(i,e)):[xe(i,t)]}}),h=(0,a.A)(i,e=>e.PUSH_MODE),p=(0,a.A)(i,e=>(0,o.A)(e,"POP_MODE"))}),n("Line Terminator Handling",()=>{const e=mt(t.lineTerminatorCharacters);m=(0,a.A)(i,e=>!1),"onlyOffset"!==t.positionTracking&&(m=(0,a.A)(i,t=>(0,o.A)(t,"LINE_BREAKS")?!!t.LINE_BREAKS:!1===pt(t,e)&&Je(e,t.PATTERN)))}),n("Misc Mapping #2",()=>{g=(0,a.A)(i,dt),y=(0,a.A)(l,ht),T=(0,Ie.A)(i,(e,t)=>{const n=t.GROUP;return(0,f.A)(n)&&n!==Mt.SKIPPED&&(e[n]=[]),e},{}),A=(0,a.A)(l,(e,t)=>({pattern:l[t],longerAlt:d[t],canLineTerminator:m[t],isCustom:g[t],short:y[t],group:u[t],push:h[t],pop:p[t],tokenTypeIdx:c[t],tokenType:i[t]}))});let R=!0,$=[];return t.safeMode||n("First Char Optimization",()=>{$=(0,Ie.A)(i,(e,n,i)=>{if("string"==typeof n.PATTERN){const t=At(n.PATTERN.charCodeAt(0));gt(e,t,A[i])}else if((0,Q.A)(n.START_CHARS_HINT)){let t;(0,r.A)(n.START_CHARS_HINT,n=>{const r=At("string"==typeof n?n.charCodeAt(0):n);t!==r&&(t=r,gt(e,r,A[i]))})}else if(O(n.PATTERN))if(n.PATTERN.unicode)R=!1,t.ensureOptimizations&&Ge(`${We}\tUnable to analyze < ${n.PATTERN.toString()} > pattern.\n\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{const a=ze(n.PATTERN,t.ensureOptimizations);(0,s.A)(a)&&(R=!1),(0,r.A)(a,t=>{gt(e,t,A[i])})}else t.ensureOptimizations&&Ge(`${We}\tTokenType: <${n.name}> is using a custom token pattern without providing <start_chars_hint> parameter.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),R=!1;return e},[])}),{emptyGroups:T,patternIdxToConfig:A,charCodeToPatternIdxToConfig:$,hasCustom:v,canBeOptimized:R}}function st(e,t){let n=[];const i=function(e){const t=(0,Se.A)(e,e=>!(0,o.A)(e,et)),n=(0,a.A)(t,e=>({message:"Token Type: ->"+e.name+"<- missing static 'PATTERN' property",type:_t.MISSING_PATTERN,tokenTypes:[e]})),r=Me(e,t);return{errors:n,valid:r}}(e);n=n.concat(i.errors);const s=function(e){const t=(0,Se.A)(e,e=>{const t=e[et];return!(O(t)||(0,Ee.A)(t)||(0,o.A)(t,"exec")||(0,f.A)(t))}),n=(0,a.A)(t,e=>({message:"Token Type: ->"+e.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:_t.INVALID_PATTERN,tokenTypes:[e]})),r=Me(e,t);return{errors:n,valid:r}}(i.valid),l=s.valid;return n=n.concat(s.errors),n=n.concat(function(e){let t=[];const n=(0,Se.A)(e,e=>O(e[et]));return t=t.concat(function(e){class t extends ye.z{constructor(){super(...arguments),this.found=!1}visitEndAnchor(e){this.found=!0}}const n=(0,Se.A)(e,e=>{const n=e.PATTERN;try{const e=Ve(n),r=new t;return r.visit(e),r.found}catch(r){return at.test(n.source)}}),r=(0,a.A)(n,e=>({message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+e.name+"<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:_t.EOI_ANCHOR_FOUND,tokenTypes:[e]}));return r}(n)),t=t.concat(function(e){class t extends ye.z{constructor(){super(...arguments),this.found=!1}visitStartAnchor(e){this.found=!0}}const n=(0,Se.A)(e,e=>{const n=e.PATTERN;try{const e=Ve(n),r=new t;return r.visit(e),r.found}catch(r){return ot.test(n.source)}}),r=(0,a.A)(n,e=>({message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+e.name+"<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:_t.SOI_ANCHOR_FOUND,tokenTypes:[e]}));return r}(n)),t=t.concat(function(e){const t=(0,Se.A)(e,e=>{const t=e[et];return t instanceof RegExp&&(t.multiline||t.global)}),n=(0,a.A)(t,e=>({message:"Token Type: ->"+e.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:_t.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[e]}));return n}(n)),t=t.concat(function(e){const t=[];let n=(0,a.A)(e,n=>(0,Ie.A)(e,(e,r)=>(n.PATTERN.source!==r.PATTERN.source||ne(t,r)||r.PATTERN===Mt.NA||(t.push(r),e.push(r)),e),[]));n=De(n);const r=(0,Se.A)(n,e=>e.length>1),i=(0,a.A)(r,e=>{const t=(0,a.A)(e,e=>e.name);return{message:`The same RegExp pattern ->${Ue(e).PATTERN}<-has been used in all of the following Token Types: ${t.join(", ")} <-`,type:_t.DUPLICATE_PATTERNS_FOUND,tokenTypes:e}});return i}(n)),t=t.concat(function(e){const t=(0,Se.A)(e,e=>e.PATTERN.test("")),n=(0,a.A)(t,e=>({message:"Token Type: ->"+e.name+"<- static 'PATTERN' must not match an empty string",type:_t.EMPTY_MATCH_PATTERN,tokenTypes:[e]}));return n}(n)),t}(l)),n=n.concat(function(e){const t=(0,Se.A)(e,e=>{if(!(0,o.A)(e,"GROUP"))return!1;const t=e.GROUP;return t!==Mt.SKIPPED&&t!==Mt.NA&&!(0,f.A)(t)}),n=(0,a.A)(t,e=>({message:"Token Type: ->"+e.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:_t.INVALID_GROUP_TYPE_FOUND,tokenTypes:[e]}));return n}(l)),n=n.concat(function(e,t){const n=(0,Se.A)(e,e=>void 0!==e.PUSH_MODE&&!ne(t,e.PUSH_MODE)),r=(0,a.A)(n,e=>({message:`Token Type: ->${e.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${e.PUSH_MODE}<-which does not exist`,type:_t.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[e]}));return r}(l,t)),n=n.concat(function(e){const t=[],n=(0,Ie.A)(e,(e,t,n)=>{const r=t.PATTERN;return r===Mt.NA||((0,f.A)(r)?e.push({str:r,idx:n,tokenType:t}):O(r)&&function(e){const t=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return void 0===(0,Fe.A)(t,t=>-1!==e.source.indexOf(t))}(r)&&e.push({str:r.source,idx:n,tokenType:t})),e},[]);return(0,r.A)(e,(e,i)=>{(0,r.A)(n,({str:n,idx:r,tokenType:s})=>{if(i<r&&function(e,t){if(O(t)){const n=t.exec(e);return null!==n&&0===n.index}if((0,Ee.A)(t))return t(e,0,[],{});if((0,o.A)(t,"exec"))return t.exec(e,0,[],{});if("string"==typeof t)return t===e;throw Error("non exhaustive match")}(n,e.PATTERN)){const n=`Token: ->${s.name}<- can never be matched.\nBecause it appears AFTER the Token Type ->${e.name}<-in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;t.push({message:n,type:_t.UNREACHABLE_PATTERN,tokenTypes:[e,s]})}})}),t}(l)),n}const at=/[^\\][$]/;const ot=/[^\\[][\^]|^\^/;function lt(e){const t=e.ignoreCase?"i":"";return new RegExp(`^(?:${e.source})`,t)}function ct(e){const t=e.ignoreCase?"iy":"y";return new RegExp(`${e.source}`,t)}function ut(e,t,n){const s=[];let a=!1;const l=De((0,he.A)((0,i.A)(e.modes))),c=$e(l,e=>e[et]===Mt.NA),u=mt(n);return t&&(0,r.A)(c,e=>{const t=pt(e,u);if(!1!==t){const n=function(e,t){if(t.issue===_t.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern.\n\tThe problem is in the <${e.name}> Token Type\n\t Root cause: ${t.errMsg}.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(t.issue===_t.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the <line_breaks> option.\n\tThe problem is in the <${e.name}> Token Type\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}(e,t),r={message:n,type:t.issue,tokenType:e};s.push(r)}else(0,o.A)(e,"LINE_BREAKS")?!0===e.LINE_BREAKS&&(a=!0):Je(u,e.PATTERN)&&(a=!0)}),t&&!a&&s.push({message:"Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n\tfor details.",type:_t.NO_LINE_BREAKS_FLAGS}),s}function dt(e){const t=e.PATTERN;if(O(t))return!1;if((0,Ee.A)(t))return!0;if((0,o.A)(t,"exec"))return!0;if((0,f.A)(t))return!1;throw Error("non exhaustive match")}function ht(e){return!(!(0,f.A)(e)||1!==e.length)&&e.charCodeAt(0)}const ft={test:function(e){const t=e.length;for(let n=this.lastIndex;n<t;n++){const t=e.charCodeAt(n);if(10===t)return this.lastIndex=n+1,!0;if(13===t)return 10===e.charCodeAt(n+1)?this.lastIndex=n+2:this.lastIndex=n+1,!0}return!1},lastIndex:0};function pt(e,t){if((0,o.A)(e,"LINE_BREAKS"))return!1;if(O(e.PATTERN)){try{Je(t,e.PATTERN)}catch(n){return{issue:_t.IDENTIFY_TERMINATOR,errMsg:n.message}}return!1}if((0,f.A)(e.PATTERN))return!1;if(dt(e))return{issue:_t.CUSTOM_LINE_BREAK};throw Error("non exhaustive match")}function mt(e){return(0,a.A)(e,e=>(0,f.A)(e)?e.charCodeAt(0):e)}function gt(e,t,n){void 0===e[t]?e[t]=[n]:e[t].push(n)}const yt=256;let Tt=[];function At(e){return e<yt?e:Tt[e]}var vt=n(56117),Rt=n(16687),$t=n(48663);function Et(e){const t=(new Date).getTime(),n=e();return{time:(new Date).getTime()-t,value:n}}function kt(e,t){const n=e.tokenTypeIdx;return n===t.tokenTypeIdx||!0===t.isParent&&!0===t.categoryMatchesMap[n]}function xt(e,t){return e.tokenTypeIdx===t.tokenTypeIdx}let It=1;const St={};function Nt(e){const t=function(e){let t=(0,l.A)(e),n=e,r=!0;for(;r;){n=De((0,he.A)((0,a.A)(n,e=>e.CATEGORIES)));const e=Me(n,t);t=t.concat(e),(0,s.A)(e)?r=!1:n=e}return t}(e);!function(e){(0,r.A)(e,e=>{var t;wt(e)||(St[It]=e,e.tokenTypeIdx=It++),Lt(e)&&!(0,Q.A)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Lt(e)||(e.CATEGORIES=[]),t=e,(0,o.A)(t,"categoryMatches")||(e.categoryMatches=[]),function(e){return(0,o.A)(e,"categoryMatchesMap")}(e)||(e.categoryMatchesMap={})})}(t),function(e){(0,r.A)(e,e=>{Ct([],e)})}(t),function(e){(0,r.A)(e,e=>{e.categoryMatches=[],(0,r.A)(e.categoryMatchesMap,(t,n)=>{e.categoryMatches.push(St[n].tokenTypeIdx)})})}(t),(0,r.A)(t,e=>{e.isParent=e.categoryMatches.length>0})}function Ct(e,t){(0,r.A)(e,e=>{t.categoryMatchesMap[e.tokenTypeIdx]=!0}),(0,r.A)(t.CATEGORIES,n=>{const r=e.concat(t);ne(r,n)||Ct(r,n)})}function wt(e){return(0,o.A)(e,"tokenTypeIdx")}function Lt(e){return(0,o.A)(e,"CATEGORIES")}function bt(e){return(0,o.A)(e,"tokenTypeIdx")}const Ot={buildUnableToPopLexerModeMessage:e=>`Unable to pop Lexer Mode after encountering Token ->${e.image}<- The Mode Stack is empty`,buildUnexpectedCharactersMessage:(e,t,n,r,i)=>`unexpected character: ->${e.charAt(t)}<- at offset: ${t}, skipped ${n} characters.`};var _t;!function(e){e[e.MISSING_PATTERN=0]="MISSING_PATTERN",e[e.INVALID_PATTERN=1]="INVALID_PATTERN",e[e.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",e[e.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",e[e.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",e[e.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",e[e.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",e[e.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",e[e.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",e[e.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",e[e.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",e[e.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",e[e.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",e[e.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",e[e.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",e[e.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",e[e.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",e[e.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"}(_t||(_t={}));const Pt={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:["\n","\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:Ot,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(Pt);class Mt{constructor(e,t=Pt){if(this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},this.TRACE_INIT=(e,t)=>{if(!0===this.traceInitPerf){this.traceInitIndent++;const n=new Array(this.traceInitIndent+1).join("\t");this.traceInitIndent<this.traceInitMaxIdent&&console.log(`${n}--\x3e <${e}>`);const{time:r,value:i}=Et(t),s=r>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&s(`${n}<-- <${e}> time: ${r}ms`),this.traceInitIndent--,i}return t()},"boolean"==typeof t)throw Error("The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported");this.config=R({},Pt,t);const n=this.config.traceInitPerf;!0===n?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):"number"==typeof n&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",()=>{let n,i=!0;this.TRACE_INIT("Lexer Config handling",()=>{if(this.config.lineTerminatorsPattern===Pt.lineTerminatorsPattern)this.config.lineTerminatorsPattern=ft;else if(this.config.lineTerminatorCharacters===Pt.lineTerminatorCharacters)throw Error("Error: Missing <lineTerminatorCharacters> property on the Lexer config.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS");if(t.safeMode&&t.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');this.trackStartLines=/full|onlyStart/i.test(this.config.positionTracking),this.trackEndLines=/full/i.test(this.config.positionTracking),(0,Q.A)(e)?n={modes:{defaultMode:(0,l.A)(e)},defaultMode:tt}:(i=!1,n=(0,l.A)(e))}),!1===this.config.skipValidations&&(this.TRACE_INIT("performRuntimeChecks",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(function(e){const t=[];return(0,o.A)(e,tt)||t.push({message:"A MultiMode Lexer cannot be initialized without a <"+tt+"> property in its definition\n",type:_t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,o.A)(e,nt)||t.push({message:"A MultiMode Lexer cannot be initialized without a <modes> property in its definition\n",type:_t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,o.A)(e,nt)&&(0,o.A)(e,tt)&&!(0,o.A)(e.modes,e.defaultMode)&&t.push({message:`A MultiMode Lexer cannot be initialized with a ${tt}: <${e.defaultMode}>which does not exist\n`,type:_t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,o.A)(e,nt)&&(0,r.A)(e.modes,(e,n)=>{(0,r.A)(e,(i,s)=>{if((0,ge.A)(i))t.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${n}> at index: <${s}>\n`,type:_t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if((0,o.A)(i,"LONGER_ALT")){const s=(0,Q.A)(i.LONGER_ALT)?i.LONGER_ALT:[i.LONGER_ALT];(0,r.A)(s,r=>{(0,ge.A)(r)||ne(e,r)||t.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${r.name}> on token <${i.name}> outside of mode <${n}>\n`,type:_t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})})}})}),t}(n,this.trackStartLines,this.config.lineTerminatorCharacters))}),this.TRACE_INIT("performWarningRuntimeChecks",()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(ut(n,this.trackStartLines,this.config.lineTerminatorCharacters))})),n.modes=n.modes?n.modes:{},(0,r.A)(n.modes,(e,t)=>{n.modes[t]=$e(e,e=>(0,ge.A)(e))});const u=(0,A.A)(n.modes);if((0,r.A)(n.modes,(e,n)=>{this.TRACE_INIT(`Mode: <${n}> processing`,()=>{if(this.modes.push(n),!1===this.config.skipValidations&&this.TRACE_INIT("validatePatterns",()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(st(e,u))}),(0,s.A)(this.lexerDefinitionErrors)){let r;Nt(e),this.TRACE_INIT("analyzeTokenTypes",()=>{r=it(e,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:this.TRACE_INIT})}),this.patternIdxToConfig[n]=r.patternIdxToConfig,this.charCodeToPatternIdxToConfig[n]=r.charCodeToPatternIdxToConfig,this.emptyGroups=R({},this.emptyGroups,r.emptyGroups),this.hasCustom=r.hasCustom||this.hasCustom,this.canModeBeOptimized[n]=r.canBeOptimized}})}),this.defaultMode=n.defaultMode,!(0,s.A)(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){const e=(0,a.A)(this.lexerDefinitionErrors,e=>e.message).join("-----------------------\n");throw new Error("Errors detected in definition of Lexer:\n"+e)}(0,r.A)(this.lexerDefinitionWarning,e=>{Ke(e.message)}),this.TRACE_INIT("Choosing sub-methods implementations",()=>{if(rt?(this.chopInput=vt.A,this.match=this.matchWithTest):(this.updateLastIndex=Rt.A,this.match=this.matchWithExec),i&&(this.handleModes=Rt.A),!1===this.trackStartLines&&(this.computeNewColumn=vt.A),!1===this.trackEndLines&&(this.updateTokenEndLineColumnLocation=Rt.A),/full/i.test(this.config.positionTracking))this.createTokenInstance=this.createFullToken;else if(/onlyStart/i.test(this.config.positionTracking))this.createTokenInstance=this.createStartOnlyToken;else{if(!/onlyOffset/i.test(this.config.positionTracking))throw Error(`Invalid <positionTracking> config option: "${this.config.positionTracking}"`);this.createTokenInstance=this.createOffsetOnlyToken}this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)}),this.TRACE_INIT("Failed Optimization Warnings",()=>{const e=(0,Ie.A)(this.canModeBeOptimized,(e,t,n)=>(!1===t&&e.push(n),e),[]);if(t.ensureOptimizations&&!(0,s.A)(e))throw Error(`Lexer Modes: < ${e.join(", ")} > cannot be optimized.\n\t Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.`)}),this.TRACE_INIT("clearRegExpParserCache",()=>{Be={}}),this.TRACE_INIT("toFastProperties",()=>{c(this)})})}tokenize(e,t=this.defaultMode){if(!(0,s.A)(this.lexerDefinitionErrors)){const e=(0,a.A)(this.lexerDefinitionErrors,e=>e.message).join("-----------------------\n");throw new Error("Unable to Tokenize because Errors detected in definition of Lexer:\n"+e)}return this.tokenizeInternal(e,t)}tokenizeInternal(e,t){let n,i,s,a,o,l,c,u,d,h,f,p,m,g,y;const T=e,v=T.length;let R=0,$=0;const E=this.hasCustom?0:Math.floor(e.length/10),k=new Array(E),x=[];let I=this.trackStartLines?1:void 0,S=this.trackStartLines?1:void 0;const N=function(e){const t={},n=(0,A.A)(e);return(0,r.A)(n,n=>{const r=e[n];if(!(0,Q.A)(r))throw Error("non exhaustive match");t[n]=[]}),t}(this.emptyGroups),C=this.trackStartLines,w=this.config.lineTerminatorsPattern;let L=0,b=[],O=[];const _=[],P=[];let M;function D(){return b}function U(e){const t=At(e),n=O[t];return void 0===n?P:n}Object.freeze(P);const F=e=>{if(1===_.length&&void 0===e.tokenType.PUSH_MODE){const t=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(e);x.push({offset:e.startOffset,line:e.startLine,column:e.startColumn,length:e.image.length,message:t})}else{_.pop();const e=(0,$t.A)(_);b=this.patternIdxToConfig[e],O=this.charCodeToPatternIdxToConfig[e],L=b.length;const t=this.canModeBeOptimized[e]&&!1===this.config.safeMode;M=O&&t?U:D}};function G(e){_.push(e),O=this.charCodeToPatternIdxToConfig[e],b=this.patternIdxToConfig[e],L=b.length,L=b.length;const t=this.canModeBeOptimized[e]&&!1===this.config.safeMode;M=O&&t?U:D}let K;G.call(this,t);const B=this.config.recoveryEnabled;for(;R<v;){l=null;const t=T.charCodeAt(R),r=M(t),A=r.length;for(n=0;n<A;n++){K=r[n];const i=K.pattern;c=null;const d=K.short;if(!1!==d?t===d&&(l=i):!0===K.isCustom?(y=i.exec(T,R,k,N),null!==y?(l=y[0],void 0!==y.payload&&(c=y.payload)):l=null):(this.updateLastIndex(i,R),l=this.match(i,e,R)),null!==l){if(o=K.longerAlt,void 0!==o){const t=o.length;for(s=0;s<t;s++){const t=b[o[s]],n=t.pattern;if(u=null,!0===t.isCustom?(y=n.exec(T,R,k,N),null!==y?(a=y[0],void 0!==y.payload&&(u=y.payload)):a=null):(this.updateLastIndex(n,R),a=this.match(n,e,R)),a&&a.length>l.length){l=a,c=u,K=t;break}}}break}}if(null!==l){if(d=l.length,h=K.group,void 0!==h&&(f=K.tokenTypeIdx,p=this.createTokenInstance(l,R,f,K.tokenType,I,S,d),this.handlePayload(p,c),!1===h?$=this.addToken(k,$,p):N[h].push(p)),e=this.chopInput(e,d),R+=d,S=this.computeNewColumn(S,d),!0===C&&!0===K.canLineTerminator){let e,t,n=0;w.lastIndex=0;do{e=w.test(l),!0===e&&(t=w.lastIndex-1,n++)}while(!0===e);0!==n&&(I+=n,S=d-t,this.updateTokenEndLineColumnLocation(p,h,t,n,I,S,d))}this.handleModes(K,F,G,p)}else{const t=R,n=I,r=S;let s=!1===B;for(;!1===s&&R<v;)for(e=this.chopInput(e,1),R++,i=0;i<L;i++){const t=b[i],n=t.pattern,r=t.short;if(!1!==r?T.charCodeAt(R)===r&&(s=!0):!0===t.isCustom?s=null!==n.exec(T,R,k,N):(this.updateLastIndex(n,R),s=null!==n.exec(e)),!0===s)break}if(m=R-t,S=this.computeNewColumn(S,m),g=this.config.errorMessageProvider.buildUnexpectedCharactersMessage(T,t,m,n,r),x.push({offset:t,line:n,column:r,length:m,message:g}),!1===B)break}}return this.hasCustom||(k.length=$),{tokens:k,groups:N,errors:x}}handleModes(e,t,n,r){if(!0===e.pop){const i=e.push;t(r),void 0!==i&&n.call(this,i)}else void 0!==e.push&&n.call(this,e.push)}chopInput(e,t){return e.substring(t)}updateLastIndex(e,t){e.lastIndex=t}updateTokenEndLineColumnLocation(e,t,n,r,i,s,a){let o,l;void 0!==t&&(o=n===a-1,l=o?-1:0,1===r&&!0===o||(e.endLine=i+l,e.endColumn=s-1-l))}computeNewColumn(e,t){return e+t}createOffsetOnlyToken(e,t,n,r){return{image:e,startOffset:t,tokenTypeIdx:n,tokenType:r}}createStartOnlyToken(e,t,n,r,i,s){return{image:e,startOffset:t,startLine:i,startColumn:s,tokenTypeIdx:n,tokenType:r}}createFullToken(e,t,n,r,i,s,a){return{image:e,startOffset:t,endOffset:t+a-1,startLine:i,endLine:i,startColumn:s,endColumn:s+a-1,tokenTypeIdx:n,tokenType:r}}addTokenUsingPush(e,t,n){return e.push(n),t}addTokenUsingMemberAccess(e,t,n){return e[t]=n,++t}handlePayloadNoCustom(e,t){}handlePayloadWithCustom(e,t){null!==t&&(e.payload=t)}matchWithTest(e,t,n){return!0===e.test(t)?t.substring(n,e.lastIndex):null}matchWithExec(e,t){const n=e.exec(t);return null!==n?n[0]:null}}function Dt(e){return Ut(e)?e.LABEL:e.name}function Ut(e){return(0,f.A)(e.LABEL)&&""!==e.LABEL}Mt.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",Mt.NA=/NOT_APPLICABLE/;const Ft="parent",Gt="categories",Kt="label",Bt="group",jt="push_mode",Vt="pop_mode",Ht="longer_alt",Wt="line_breaks",zt="start_chars_hint";function Yt(e){return function(e){const t=e.pattern,n={};n.name=e.name,(0,ge.A)(t)||(n.PATTERN=t);if((0,o.A)(e,Ft))throw"The parent property is no longer supported.\nSee: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.";(0,o.A)(e,Gt)&&(n.CATEGORIES=e[Gt]);Nt([n]),(0,o.A)(e,Kt)&&(n.LABEL=e[Kt]);(0,o.A)(e,Bt)&&(n.GROUP=e[Bt]);(0,o.A)(e,Vt)&&(n.POP_MODE=e[Vt]);(0,o.A)(e,jt)&&(n.PUSH_MODE=e[jt]);(0,o.A)(e,Ht)&&(n.LONGER_ALT=e[Ht]);(0,o.A)(e,Wt)&&(n.LINE_BREAKS=e[Wt]);(0,o.A)(e,zt)&&(n.START_CHARS_HINT=e[zt]);return n}(e)}const Xt=Yt({name:"EOF",pattern:Mt.NA});function qt(e,t,n,r,i,s,a,o){return{image:t,startOffset:n,endOffset:r,startLine:i,endLine:s,startColumn:a,endColumn:o,tokenTypeIdx:e.tokenTypeIdx,tokenType:e}}function Qt(e,t){return kt(e,t)}Nt([Xt]);const Zt={buildMismatchTokenMessage:({expected:e,actual:t,previous:n,ruleName:r})=>`Expecting ${Ut(e)?`--\x3e ${Dt(e)} <--`:`token of type --\x3e ${e.name} <--`} but found --\x3e '${t.image}' <--`,buildNotAllInputParsedMessage:({firstRedundant:e,ruleName:t})=>"Redundant input, expecting EOF but found: "+e.image,buildNoViableAltMessage({expectedPathsPerAlt:e,actual:t,previous:n,customUserDescription:r,ruleName:i}){const s="Expecting: ",o="\nbut found: '"+Ue(t).image+"'";if(r)return s+r+o;{const t=(0,Ie.A)(e,(e,t)=>e.concat(t),[]),n=(0,a.A)(t,e=>`[${(0,a.A)(e,e=>Dt(e)).join(", ")}]`);return s+`one of these possible Token sequences:\n${(0,a.A)(n,(e,t)=>` ${t+1}. ${e}`).join("\n")}`+o}},buildEarlyExitMessage({expectedIterationPaths:e,actual:t,customUserDescription:n,ruleName:r}){const i="Expecting: ",s="\nbut found: '"+Ue(t).image+"'";if(n)return i+n+s;return i+`expecting at least one iteration which starts with one of these possible Token sequences::\n <${(0,a.A)(e,e=>`[${(0,a.A)(e,e=>Dt(e)).join(",")}]`).join(" ,")}>`+s}};Object.freeze(Zt);const Jt={buildRuleNotFoundError:(e,t)=>"Invalid grammar, reference to a rule which is not defined: ->"+t.nonTerminalName+"<-\ninside top level rule: ->"+e.name+"<-"},en={buildDuplicateFoundError(e,t){const n=e.name,r=Ue(t),i=r.idx,s=oe(r),a=(o=r)instanceof H?o.terminalType.name:o instanceof M?o.nonTerminalName:"";var o;let l=`->${s}${i>0?i:""}<- ${a?`with argument: ->${a}<-`:""}\n appears more than once (${t.length} times) in the top level rule: ->${n}<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n `;return l=l.replace(/[ \t]+/g," "),l=l.replace(/\s\s+/g,"\n"),l},buildNamespaceConflictError:e=>`Namespace conflict found in grammar.\nThe grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${e.name}>.\nTo resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter.`,buildAlternationPrefixAmbiguityError(e){const t=(0,a.A)(e.prefixPath,e=>Dt(e)).join(", "),n=0===e.alternation.idx?"":e.alternation.idx;return`Ambiguous alternatives: <${e.ambiguityIndices.join(" ,")}> due to common lookahead prefix\nin <OR${n}> inside <${e.topLevelRule.name}> Rule,\n<${t}> may appears as a prefix path in all these alternatives.\nSee: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details.`},buildAlternationAmbiguityError(e){const t=(0,a.A)(e.prefixPath,e=>Dt(e)).join(", "),n=0===e.alternation.idx?"":e.alternation.idx;let r=`Ambiguous Alternatives Detected: <${e.ambiguityIndices.join(" ,")}> in <OR${n}> inside <${e.topLevelRule.name}> Rule,\n<${t}> may appears as a prefix path in all these alternatives.\n`;return r+="See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details.",r},buildEmptyRepetitionError(e){let t=oe(e.repetition);0!==e.repetition.idx&&(t+=e.repetition.idx);return`The repetition <${t}> within Rule <${e.topLevelRule.name}> can never consume any tokens.\nThis could lead to an infinite loop.`},buildTokenNameError:e=>"deprecated",buildEmptyAlternationError:e=>`Ambiguous empty alternative: <${e.emptyChoiceIdx+1}> in <OR${e.alternation.idx}> inside <${e.topLevelRule.name}> Rule.\nOnly the last alternative may be an empty alternative.`,buildTooManyAlternativesError:e=>`An Alternation cannot have more than 256 alternatives:\n<OR${e.alternation.idx}> inside <${e.topLevelRule.name}> Rule.\n has ${e.alternation.definition.length+1} alternatives.`,buildLeftRecursionError(e){const t=e.topLevelRule.name;return`Left Recursion found in grammar.\nrule: <${t}> can be invoked from itself (directly or indirectly)\nwithout consuming any Tokens. The grammar path that causes this is: \n ${`${t} --\x3e ${(0,a.A)(e.leftRecursionPath,e=>e.name).concat([t]).join(" --\x3e ")}`}\n To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError:e=>"deprecated",buildDuplicateRuleNameError(e){let t;t=e.topLevelRule instanceof D?e.topLevelRule.name:e.topLevelRule;return`Duplicate definition, rule: ->${t}<- is already defined in the grammar: ->${e.grammarName}<-`}};class tn extends z{constructor(e,t){super(),this.nameToTopRule=e,this.errMsgProvider=t,this.errors=[]}resolveRefs(){(0,r.A)((0,i.A)(this.nameToTopRule),e=>{this.currTopLevel=e,e.accept(this)})}visitNonTerminal(e){const t=this.nameToTopRule[e.nonTerminalName];if(t)e.referencedRule=t;else{const t=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:t,type:Or.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}var nn=n(64620),rn=n(35745);const sn=function(e,t,n,r){for(var i=-1,s=null==e?0:e.length;++i<s;){var a=e[i];t(r,a,n(a),e)}return r};const an=function(e,t,n,r){return(0,X.A)(e,function(e,i,s){t(r,e,n(e),s)}),r};const on=function(e,t){return function(n,r){var i=(0,Q.A)(n)?sn:an,s=t?t():{};return i(n,e,(0,E.A)(r,2),s)}};var ln=Object.prototype.hasOwnProperty;const cn=on(function(e,t,n){ln.call(e,n)?e[n].push(t):(0,rn.A)(e,n,[t])});const un=function(e,t,n){var r=null==e?0:e.length;return r?(t=n||void 0===t?1:(0,d.A)(t),u(e,0,(t=r-t)<0?0:t)):[]};class dn extends le{constructor(e,t){super(),this.topProd=e,this.path=t,this.possibleTokTypes=[],this.nextProductionName="",this.nextProductionOccurrence=0,this.found=!1,this.isAtEndOfPath=!1}startWalking(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,l.A)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,l.A)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes}walk(e,t=[]){this.found||super.walk(e,t)}walkProdRef(e,t,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){const r=t.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,r)}}updateExpectedNext(){(0,s.A)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}}class hn extends dn{constructor(e,t){super(e,t),this.path=t,this.nextTerminalName="",this.nextTerminalOccurrence=0,this.nextTerminalName=this.path.lastTok.name,this.nextTerminalOccurrence=this.path.lastTokOccurrence}walkTerminal(e,t,n){if(this.isAtEndOfPath&&e.terminalType.name===this.nextTerminalName&&e.idx===this.nextTerminalOccurrence&&!this.found){const e=t.concat(n),r=new U({definition:e});this.possibleTokTypes=fe(r),this.found=!0}}}class fn extends le{constructor(e,t){super(),this.topRule=e,this.occurrence=t,this.result={token:void 0,occurrence:void 0,isEndOfRule:void 0}}startWalking(){return this.walk(this.topRule),this.result}}class pn extends fn{walkMany(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkMany(e,t,n)}}class mn extends fn{walkManySep(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkManySep(e,t,n)}}class gn extends fn{walkAtLeastOne(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkAtLeastOne(e,t,n)}}class yn extends fn{walkAtLeastOneSep(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkAtLeastOneSep(e,t,n)}}function Tn(e,t,n=[]){n=(0,l.A)(n);let i=[],a=0;function o(r){const s=Tn(r.concat(h(e,a+1)),t,n);return i.concat(s)}for(;n.length<t&&a<e.length;){const t=e[a];if(t instanceof U)return o(t.definition);if(t instanceof M)return o(t.definition);if(t instanceof F)i=o(t.definition);else{if(t instanceof G){return o(t.definition.concat([new B({definition:t.definition})]))}if(t instanceof K){return o([new U({definition:t.definition}),new B({definition:[new H({terminalType:t.separator})].concat(t.definition)})])}if(t instanceof j){const e=t.definition.concat([new B({definition:[new H({terminalType:t.separator})].concat(t.definition)})]);i=o(e)}else if(t instanceof B){const e=t.definition.concat([new B({definition:t.definition})]);i=o(e)}else{if(t instanceof V)return(0,r.A)(t.definition,e=>{!1===(0,s.A)(e.definition)&&(i=o(e.definition))}),i;if(!(t instanceof H))throw Error("non exhaustive match");n.push(t.terminalType)}}a++}return i.push({partialPath:n,suffixDef:h(e,a)}),i}function An(e,t,n,r){const i="EXIT_NONE_TERMINAL",a=[i],o="EXIT_ALTERNATIVE";let c=!1;const u=t.length,d=u-r-1,f=[],p=[];for(p.push({idx:-1,def:e,ruleStack:[],occurrenceStack:[]});!(0,s.A)(p);){const e=p.pop();if(e===o){c&&(0,$t.A)(p).idx<=d&&p.pop();continue}const r=e.def,m=e.idx,g=e.ruleStack,y=e.occurrenceStack;if((0,s.A)(r))continue;const T=r[0];if(T===i){const e={idx:m,def:h(r),ruleStack:un(g),occurrenceStack:un(y)};p.push(e)}else if(T instanceof H)if(m<u-1){const e=m+1;if(n(t[e],T.terminalType)){const t={idx:e,def:h(r),ruleStack:g,occurrenceStack:y};p.push(t)}}else{if(m!==u-1)throw Error("non exhaustive match");f.push({nextTokenType:T.terminalType,nextTokenOccurrence:T.idx,ruleStack:g,occurrenceStack:y}),c=!0}else if(T instanceof M){const e=(0,l.A)(g);e.push(T.nonTerminalName);const t=(0,l.A)(y);t.push(T.idx);const n={idx:m,def:T.definition.concat(a,h(r)),ruleStack:e,occurrenceStack:t};p.push(n)}else if(T instanceof F){const e={idx:m,def:h(r),ruleStack:g,occurrenceStack:y};p.push(e),p.push(o);const t={idx:m,def:T.definition.concat(h(r)),ruleStack:g,occurrenceStack:y};p.push(t)}else if(T instanceof G){const e=new B({definition:T.definition,idx:T.idx}),t={idx:m,def:T.definition.concat([e],h(r)),ruleStack:g,occurrenceStack:y};p.push(t)}else if(T instanceof K){const e=new H({terminalType:T.separator}),t=new B({definition:[e].concat(T.definition),idx:T.idx}),n={idx:m,def:T.definition.concat([t],h(r)),ruleStack:g,occurrenceStack:y};p.push(n)}else if(T instanceof j){const e={idx:m,def:h(r),ruleStack:g,occurrenceStack:y};p.push(e),p.push(o);const t=new H({terminalType:T.separator}),n=new B({definition:[t].concat(T.definition),idx:T.idx}),i={idx:m,def:T.definition.concat([n],h(r)),ruleStack:g,occurrenceStack:y};p.push(i)}else if(T instanceof B){const e={idx:m,def:h(r),ruleStack:g,occurrenceStack:y};p.push(e),p.push(o);const t=new B({definition:T.definition,idx:T.idx}),n={idx:m,def:T.definition.concat([t],h(r)),ruleStack:g,occurrenceStack:y};p.push(n)}else if(T instanceof V)for(let t=T.definition.length-1;t>=0;t--){const e={idx:m,def:T.definition[t].definition.concat(h(r)),ruleStack:g,occurrenceStack:y};p.push(e),p.push(o)}else if(T instanceof U)p.push({idx:m,def:T.definition.concat(h(r)),ruleStack:g,occurrenceStack:y});else{if(!(T instanceof D))throw Error("non exhaustive match");p.push(vn(T,m,g,y))}}return f}function vn(e,t,n,r){const i=(0,l.A)(n);i.push(e.name);const s=(0,l.A)(r);return s.push(1),{idx:t,def:e.definition,ruleStack:i,occurrenceStack:s}}var Rn;function $n(e){if(e instanceof F||"Option"===e)return Rn.OPTION;if(e instanceof B||"Repetition"===e)return Rn.REPETITION;if(e instanceof G||"RepetitionMandatory"===e)return Rn.REPETITION_MANDATORY;if(e instanceof K||"RepetitionMandatoryWithSeparator"===e)return Rn.REPETITION_MANDATORY_WITH_SEPARATOR;if(e instanceof j||"RepetitionWithSeparator"===e)return Rn.REPETITION_WITH_SEPARATOR;if(e instanceof V||"Alternation"===e)return Rn.ALTERNATION;throw Error("non exhaustive match")}function En(e){const{occurrence:t,rule:n,prodType:r,maxLookahead:i}=e,s=$n(r);return s===Rn.ALTERNATION?bn(t,n,i):On(t,n,s,i)}function kn(e,t,n,i){const s=e.length,l=se(e,e=>se(e,e=>1===e.length));if(t)return function(t){const r=(0,a.A)(t,e=>e.GATE);for(let i=0;i<s;i++){const t=e[i],s=t.length,a=r[i];if(void 0===a||!1!==a.call(this))e:for(let e=0;e<s;e++){const r=t[e],s=r.length;for(let e=0;e<s;e++){const t=this.LA(e+1);if(!1===n(t,r[e]))continue e}return i}}};if(l&&!i){const t=(0,a.A)(e,e=>(0,he.A)(e)),n=(0,Ie.A)(t,(e,t,n)=>((0,r.A)(t,t=>{(0,o.A)(e,t.tokenTypeIdx)||(e[t.tokenTypeIdx]=n),(0,r.A)(t.categoryMatches,t=>{(0,o.A)(e,t)||(e[t]=n)})}),e),{});return function(){const e=this.LA(1);return n[e.tokenTypeIdx]}}return function(){for(let t=0;t<s;t++){const r=e[t],i=r.length;e:for(let e=0;e<i;e++){const i=r[e],s=i.length;for(let e=0;e<s;e++){const t=this.LA(e+1);if(!1===n(t,i[e]))continue e}return t}}}}function xn(e,t,n){const i=se(e,e=>1===e.length),a=e.length;if(i&&!n){const t=(0,he.A)(e);if(1===t.length&&(0,s.A)(t[0].categoryMatches)){const e=t[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===e}}{const e=(0,Ie.A)(t,(e,t,n)=>(e[t.tokenTypeIdx]=!0,(0,r.A)(t.categoryMatches,t=>{e[t]=!0}),e),[]);return function(){const t=this.LA(1);return!0===e[t.tokenTypeIdx]}}}return function(){e:for(let n=0;n<a;n++){const r=e[n],i=r.length;for(let e=0;e<i;e++){const n=this.LA(e+1);if(!1===t(n,r[e]))continue e}return!0}return!1}}!function(e){e[e.OPTION=0]="OPTION",e[e.REPETITION=1]="REPETITION",e[e.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",e[e.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",e[e.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",e[e.ALTERNATION=5]="ALTERNATION"}(Rn||(Rn={}));class In extends le{constructor(e,t,n){super(),this.topProd=e,this.targetOccurrence=t,this.targetProdType=n}startWalking(){return this.walk(this.topProd),this.restDef}checkIsTarget(e,t,n,r){return e.idx===this.targetOccurrence&&this.targetProdType===t&&(this.restDef=n.concat(r),!0)}walkOption(e,t,n){this.checkIsTarget(e,Rn.OPTION,t,n)||super.walkOption(e,t,n)}walkAtLeastOne(e,t,n){this.checkIsTarget(e,Rn.REPETITION_MANDATORY,t,n)||super.walkOption(e,t,n)}walkAtLeastOneSep(e,t,n){this.checkIsTarget(e,Rn.REPETITION_MANDATORY_WITH_SEPARATOR,t,n)||super.walkOption(e,t,n)}walkMany(e,t,n){this.checkIsTarget(e,Rn.REPETITION,t,n)||super.walkOption(e,t,n)}walkManySep(e,t,n){this.checkIsTarget(e,Rn.REPETITION_WITH_SEPARATOR,t,n)||super.walkOption(e,t,n)}}class Sn extends z{constructor(e,t,n){super(),this.targetOccurrence=e,this.targetProdType=t,this.targetRef=n,this.result=[]}checkIsTarget(e,t){e.idx!==this.targetOccurrence||this.targetProdType!==t||void 0!==this.targetRef&&e!==this.targetRef||(this.result=e.definition)}visitOption(e){this.checkIsTarget(e,Rn.OPTION)}visitRepetition(e){this.checkIsTarget(e,Rn.REPETITION)}visitRepetitionMandatory(e){this.checkIsTarget(e,Rn.REPETITION_MANDATORY)}visitRepetitionMandatoryWithSeparator(e){this.checkIsTarget(e,Rn.REPETITION_MANDATORY_WITH_SEPARATOR)}visitRepetitionWithSeparator(e){this.checkIsTarget(e,Rn.REPETITION_WITH_SEPARATOR)}visitAlternation(e){this.checkIsTarget(e,Rn.ALTERNATION)}}function Nn(e){const t=new Array(e);for(let n=0;n<e;n++)t[n]=[];return t}function Cn(e){let t=[""];for(let n=0;n<e.length;n++){const r=e[n],i=[];for(let e=0;e<t.length;e++){const n=t[e];i.push(n+"_"+r.tokenTypeIdx);for(let e=0;e<r.categoryMatches.length;e++){const t="_"+r.categoryMatches[e];i.push(n+t)}}t=i}return t}function wn(e,t,n){for(let r=0;r<e.length;r++){if(r===n)continue;const i=e[r];for(let e=0;e<t.length;e++){if(!0===i[t[e]])return!1}}return!0}function Ln(e,t){const n=(0,a.A)(e,e=>Tn([e],1)),i=Nn(n.length),o=(0,a.A)(n,e=>{const t={};return(0,r.A)(e,e=>{const n=Cn(e.partialPath);(0,r.A)(n,e=>{t[e]=!0})}),t});let l=n;for(let a=1;a<=t;a++){const e=l;l=Nn(e.length);for(let n=0;n<e.length;n++){const c=e[n];for(let e=0;e<c.length;e++){const u=c[e].partialPath,d=c[e].suffixDef,h=Cn(u);if(wn(o,h,n)||(0,s.A)(d)||u.length===t){const e=i[n];if(!1===_n(e,u)){e.push(u);for(let e=0;e<h.length;e++){const t=h[e];o[n][t]=!0}}}else{const e=Tn(d,a+1,u);l[n]=l[n].concat(e),(0,r.A)(e,e=>{const t=Cn(e.partialPath);(0,r.A)(t,e=>{o[n][e]=!0})})}}}}return i}function bn(e,t,n,r){const i=new Sn(e,Rn.ALTERNATION,r);return t.accept(i),Ln(i.result,n)}function On(e,t,n,r){const i=new Sn(e,n);t.accept(i);const s=i.result,a=new In(t,e,n).startWalking();return Ln([new U({definition:s}),new U({definition:a})],r)}function _n(e,t){e:for(let n=0;n<e.length;n++){const r=e[n];if(r.length===t.length){for(let e=0;e<r.length;e++){const n=t[e],i=r[e];if(!1===(n===i||void 0!==i.categoryMatchesMap[n.tokenTypeIdx]))continue e}return!0}}return!1}function Pn(e){return se(e,e=>se(e,e=>se(e,e=>(0,s.A)(e.categoryMatches))))}function Mn(e,t,n,s){const o=(0,nn.A)(e,e=>function(e,t){const n=new Fn;e.accept(n);const r=n.allProductions,s=cn(r,Dn),o=I(s,e=>e.length>1),l=(0,a.A)((0,i.A)(o),n=>{const r=Ue(n),i=t.buildDuplicateFoundError(e,n),s=oe(r),a={message:i,type:Or.DUPLICATE_PRODUCTIONS,ruleName:e.name,dslName:s,occurrence:r.idx},o=Un(r);return o&&(a.parameter=o),a});return l}(e,n)),l=function(e,t,n){const i=[],s=(0,a.A)(t,e=>e.name);return(0,r.A)(e,e=>{const t=e.name;if(ne(s,t)){const r=n.buildNamespaceConflictError(e);i.push({message:r,type:Or.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:t})}}),i}(e,t,n),c=(0,nn.A)(e,e=>function(e,t){const n=new Bn;e.accept(n);const r=n.alternations,i=(0,nn.A)(r,n=>n.definition.length>255?[{message:t.buildTooManyAlternativesError({topLevelRule:e,alternation:n}),type:Or.TOO_MANY_ALTS,ruleName:e.name,occurrence:n.idx}]:[]);return i}(e,n)),u=(0,nn.A)(e,t=>function(e,t,n,r){const i=[],s=(0,Ie.A)(t,(t,n)=>n.name===e.name?t+1:t,0);if(s>1){const t=r.buildDuplicateRuleNameError({topLevelRule:e,grammarName:n});i.push({message:t,type:Or.DUPLICATE_RULE_NAME,ruleName:e.name})}return i}(t,e,s,n));return o.concat(l,c,u)}function Dn(e){return`${oe(e)}_#_${e.idx}_#_${Un(e)}`}function Un(e){return e instanceof H?e.terminalType.name:e instanceof M?e.nonTerminalName:""}class Fn extends z{constructor(){super(...arguments),this.allProductions=[]}visitNonTerminal(e){this.allProductions.push(e)}visitOption(e){this.allProductions.push(e)}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}visitAlternation(e){this.allProductions.push(e)}visitTerminal(e){this.allProductions.push(e)}}function Gn(e,t,n,r=[]){const i=[],a=Kn(t.definition);if((0,s.A)(a))return[];{const t=e.name;ne(a,e)&&i.push({message:n.buildLeftRecursionError({topLevelRule:e,leftRecursionPath:r}),type:Or.LEFT_RECURSION,ruleName:t});const s=Me(a,r.concat([e])),o=(0,nn.A)(s,t=>{const i=(0,l.A)(r);return i.push(t),Gn(e,t,n,i)});return i.concat(o)}}function Kn(e){let t=[];if((0,s.A)(e))return t;const n=Ue(e);if(n instanceof M)t.push(n.referencedRule);else if(n instanceof U||n instanceof F||n instanceof G||n instanceof K||n instanceof j||n instanceof B)t=t.concat(Kn(n.definition));else if(n instanceof V)t=(0,he.A)((0,a.A)(n.definition,e=>Kn(e.definition)));else if(!(n instanceof H))throw Error("non exhaustive match");const r=ae(n),i=e.length>1;if(r&&i){const n=h(e);return t.concat(Kn(n))}return t}class Bn extends z{constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}}function jn(e,t,n){const i=new Bn;e.accept(i);let s=i.alternations;s=$e(s,e=>!0===e.ignoreAmbiguities);const o=(0,nn.A)(s,i=>{const s=i.idx,o=i.maxLookahead||t,l=bn(s,e,o,i),c=function(e,t,n,i){const s=[],o=(0,Ie.A)(e,(n,i,a)=>(!0===t.definition[a].ignoreAmbiguities||(0,r.A)(i,i=>{const o=[a];(0,r.A)(e,(e,n)=>{a!==n&&_n(e,i)&&!0!==t.definition[n].ignoreAmbiguities&&o.push(n)}),o.length>1&&!_n(s,i)&&(s.push(i),n.push({alts:o,path:i}))}),n),[]),l=(0,a.A)(o,e=>{const r=(0,a.A)(e.alts,e=>e+1);return{message:i.buildAlternationAmbiguityError({topLevelRule:n,alternation:t,ambiguityIndices:r,prefixPath:e.path}),type:Or.AMBIGUOUS_ALTS,ruleName:n.name,occurrence:t.idx,alternatives:e.alts}});return l}(l,i,e,n),u=function(e,t,n,r){const i=(0,Ie.A)(e,(e,t,n)=>{const r=(0,a.A)(t,e=>({idx:n,path:e}));return e.concat(r)},[]),s=De((0,nn.A)(i,e=>{if(!0===t.definition[e.idx].ignoreAmbiguities)return[];const s=e.idx,o=e.path,l=(0,Se.A)(i,e=>{return!0!==t.definition[e.idx].ignoreAmbiguities&&e.idx<s&&(n=e.path,r=o,n.length<r.length&&se(n,(e,t)=>{const n=r[t];return e===n||n.categoryMatchesMap[e.tokenTypeIdx]}));var n,r});return(0,a.A)(l,e=>{const i=[e.idx+1,s+1],a=0===t.idx?"":t.idx;return{message:r.buildAlternationPrefixAmbiguityError({topLevelRule:n,alternation:t,ambiguityIndices:i,prefixPath:e.path}),type:Or.AMBIGUOUS_PREFIX_ALTS,ruleName:n.name,occurrence:a,alternatives:i}})}));return s}(l,i,e,n);return c.concat(u)});return o}class Vn extends z{constructor(){super(...arguments),this.allProductions=[]}visitRepetitionWithSeparator(e){this.allProductions.push(e)}visitRepetitionMandatory(e){this.allProductions.push(e)}visitRepetitionMandatoryWithSeparator(e){this.allProductions.push(e)}visitRepetition(e){this.allProductions.push(e)}}function Hn(e){const t=(0,Te.A)(e,{errMsgProvider:Jt}),n={};return(0,r.A)(e.rules,e=>{n[e.name]=e}),function(e,t){const n=new tn(e,t);return n.resolveRefs(),n.errors}(n,t.errMsgProvider)}const Wn="MismatchedTokenException",zn="NoViableAltException",Yn="EarlyExitException",Xn="NotAllInputParsedException",qn=[Wn,zn,Yn,Xn];function Qn(e){return ne(qn,e.name)}Object.freeze(qn);class Zn extends Error{constructor(e,t){super(e),this.token=t,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}class Jn extends Zn{constructor(e,t,n){super(e,t),this.previousToken=n,this.name=Wn}}class er extends Zn{constructor(e,t,n){super(e,t),this.previousToken=n,this.name=zn}}class tr extends Zn{constructor(e,t){super(e,t),this.name=Xn}}class nr extends Zn{constructor(e,t,n){super(e,t),this.previousToken=n,this.name=Yn}}const rr={},ir="InRuleRecoveryException";class sr extends Error{constructor(e){super(e),this.name=ir}}function ar(e,t,n,r,i,s,a){const o=this.getKeyForAutomaticLookahead(r,i);let l=this.firstAfterRepMap[o];if(void 0===l){const e=this.getCurrRuleFullName();l=new s(this.getGAstProductions()[e],i).startWalking(),this.firstAfterRepMap[o]=l}let c=l.token,u=l.occurrence;const d=l.isEndOfRule;1===this.RULE_STACK.length&&d&&void 0===c&&(c=Xt,u=1),void 0!==c&&void 0!==u&&this.shouldInRepetitionRecoveryBeTried(c,u,a)&&this.tryInRepetitionRecovery(e,t,n,c)}const or=1024,lr=1280,cr=1536;function ur(e,t,n){return n|t|e}class dr{constructor(e){var t;this.maxLookahead=null!==(t=null==e?void 0:e.maxLookahead)&&void 0!==t?t:Lr.maxLookahead}validate(e){const t=this.validateNoLeftRecursion(e.rules);if((0,s.A)(t)){const n=this.validateEmptyOrAlternatives(e.rules),r=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),i=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...t,...n,...r,...i]}return t}validateNoLeftRecursion(e){return(0,nn.A)(e,e=>Gn(e,e,en))}validateEmptyOrAlternatives(e){return(0,nn.A)(e,e=>function(e,t){const n=new Bn;e.accept(n);const r=n.alternations;return(0,nn.A)(r,n=>{const r=un(n.definition);return(0,nn.A)(r,(r,i)=>{const a=An([r],[],kt,1);return(0,s.A)(a)?[{message:t.buildEmptyAlternationError({topLevelRule:e,alternation:n,emptyChoiceIdx:i}),type:Or.NONE_LAST_EMPTY_ALT,ruleName:e.name,occurrence:n.idx,alternative:i+1}]:[]})})}(e,en))}validateAmbiguousAlternationAlternatives(e,t){return(0,nn.A)(e,e=>jn(e,t,en))}validateSomeNonEmptyLookaheadPath(e,t){return function(e,t,n){const i=[];return(0,r.A)(e,e=>{const a=new Vn;e.accept(a);const o=a.allProductions;(0,r.A)(o,r=>{const a=$n(r),o=r.maxLookahead||t,l=On(r.idx,e,a,o)[0];if((0,s.A)((0,he.A)(l))){const t=n.buildEmptyRepetitionError({topLevelRule:e,repetition:r});i.push({message:t,type:Or.NO_NON_EMPTY_LOOKAHEAD,ruleName:e.name})}})}),i}(e,t,en)}buildLookaheadForAlternation(e){return function(e,t,n,r,i,s){const a=bn(e,t,n);return s(a,r,Pn(a)?xt:kt,i)}(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,kn)}buildLookaheadForOptional(e){return function(e,t,n,r,i,s){const a=On(e,t,i,n),o=Pn(a)?xt:kt;return s(a[0],o,r)}(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,$n(e.prodType),xn)}}const hr=new class extends z{constructor(){super(...arguments),this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}reset(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}}visitOption(e){this.dslMethods.option.push(e)}visitRepetitionWithSeparator(e){this.dslMethods.repetitionWithSeparator.push(e)}visitRepetitionMandatory(e){this.dslMethods.repetitionMandatory.push(e)}visitRepetitionMandatoryWithSeparator(e){this.dslMethods.repetitionMandatoryWithSeparator.push(e)}visitRepetition(e){this.dslMethods.repetition.push(e)}visitAlternation(e){this.dslMethods.alternation.push(e)}};function fr(e,t){!0===isNaN(e.startOffset)?(e.startOffset=t.startOffset,e.endOffset=t.endOffset):e.endOffset<t.endOffset==!0&&(e.endOffset=t.endOffset)}function pr(e,t){!0===isNaN(e.startOffset)?(e.startOffset=t.startOffset,e.startColumn=t.startColumn,e.startLine=t.startLine,e.endOffset=t.endOffset,e.endColumn=t.endColumn,e.endLine=t.endLine):e.endOffset<t.endOffset==!0&&(e.endOffset=t.endOffset,e.endColumn=t.endColumn,e.endLine=t.endLine)}function mr(e,t){Object.defineProperty(e,"name",{enumerable:!1,configurable:!0,writable:!1,value:t})}function gr(e,t){const n=(0,A.A)(e),r=n.length;for(let i=0;i<r;i++){const r=e[n[i]],s=r.length;for(let e=0;e<s;e++){const n=r[e];void 0===n.tokenTypeIdx&&this[n.name](n.children,t)}}}function yr(e,t){const n=function(){};mr(n,e+"BaseSemantics");const r={visit:function(e,t){if((0,Q.A)(e)&&(e=e[0]),!(0,ge.A)(e))return this[e.name](e.children,t)},validateVisitor:function(){const e=function(e,t){const n=function(e,t){const n=(0,Se.A)(t,t=>!1===(0,Ee.A)(e[t])),r=(0,a.A)(n,t=>({msg:`Missing visitor method: <${t}> on ${e.constructor.name} CST Visitor.`,type:Tr.MISSING_METHOD,methodName:t}));return De(r)}(e,t);return n}(this,t);if(!(0,s.A)(e)){const t=(0,a.A)(e,e=>e.msg);throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>:\n\t${t.join("\n\n").replace(/\n/g,"\n\t")}`)}}};return(n.prototype=r).constructor=n,n._RULE_NAMES=t,n}var Tr;!function(e){e[e.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",e[e.MISSING_METHOD=1]="MISSING_METHOD"}(Tr||(Tr={}));var Ar=n(49084);const vr={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(vr);const Rr=!0,$r=Math.pow(2,8)-1,Er=Yt({name:"RECORDING_PHASE_TOKEN",pattern:Mt.NA});Nt([Er]);const kr=qt(Er,"This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",-1,-1,-1,-1,-1,-1);Object.freeze(kr);const xr={name:"This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",children:{}};function Ir(e,t,n,r=!1){Cr(n);const i=(0,$t.A)(this.recordingProdStack),s=(0,Ee.A)(t)?t:t.DEF,a=new e({definition:[],idx:n});return r&&(a.separator=t.SEP),(0,o.A)(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD),this.recordingProdStack.push(a),s.call(this),i.definition.push(a),this.recordingProdStack.pop(),vr}function Sr(e,t){Cr(t);const n=(0,$t.A)(this.recordingProdStack),i=!1===(0,Q.A)(e),s=!1===i?e:e.DEF,a=new V({definition:[],idx:t,ignoreAmbiguities:i&&!0===e.IGNORE_AMBIGUITIES});(0,o.A)(e,"MAX_LOOKAHEAD")&&(a.maxLookahead=e.MAX_LOOKAHEAD);const l=J(s,e=>(0,Ee.A)(e.GATE));return a.hasPredicates=l,n.definition.push(a),(0,r.A)(s,e=>{const t=new U({definition:[]});a.definition.push(t),(0,o.A)(e,"IGNORE_AMBIGUITIES")?t.ignoreAmbiguities=e.IGNORE_AMBIGUITIES:(0,o.A)(e,"GATE")&&(t.ignoreAmbiguities=!0),this.recordingProdStack.push(t),e.ALT.call(this),this.recordingProdStack.pop()}),vr}function Nr(e){return 0===e?"":`${e}`}function Cr(e){if(e<0||e>$r){const t=new Error(`Invalid DSL Method idx value: <${e}>\n\tIdx value must be a none negative value smaller than ${$r+1}`);throw t.KNOWN_RECORDER_ERROR=!0,t}}const wr=qt(Xt,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(wr);const Lr=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Zt,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),br=Object.freeze({recoveryValueFunc:()=>{},resyncEnabled:!0});var Or,_r;function Pr(e=void 0){return function(){return e}}!function(e){e[e.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",e[e.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",e[e.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",e[e.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",e[e.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",e[e.LEFT_RECURSION=5]="LEFT_RECURSION",e[e.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",e[e.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",e[e.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",e[e.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",e[e.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",e[e.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",e[e.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",e[e.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"}(Or||(Or={}));class Mr{static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated.\t\nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",()=>{let e;this.selfAnalysisDone=!0;const t=this.className;this.TRACE_INIT("toFastProps",()=>{c(this)}),this.TRACE_INIT("Grammar Recording",()=>{try{this.enableRecording(),(0,r.A)(this.definedRulesNames,e=>{const t=this[e].originalGrammarAction;let n;this.TRACE_INIT(`${e} Rule`,()=>{n=this.topLevelRuleRecord(e,t)}),this.gastProductionsCache[e]=n})}finally{this.disableRecording()}});let n=[];if(this.TRACE_INIT("Grammar Resolving",()=>{n=Hn({rules:(0,i.A)(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)}),this.TRACE_INIT("Grammar Validations",()=>{if((0,s.A)(n)&&!1===this.skipValidations){const n=(e={rules:(0,i.A)(this.gastProductionsCache),tokenTypes:(0,i.A)(this.tokensMap),errMsgProvider:en,grammarName:t},Mn((e=(0,Te.A)(e,{errMsgProvider:en})).rules,e.tokenTypes,e.errMsgProvider,e.grammarName)),r=function(e){const t=e.lookaheadStrategy.validate({rules:e.rules,tokenTypes:e.tokenTypes,grammarName:e.grammarName});return(0,a.A)(t,e=>Object.assign({type:Or.CUSTOM_LOOKAHEAD_VALIDATION},e))}({lookaheadStrategy:this.lookaheadStrategy,rules:(0,i.A)(this.gastProductionsCache),tokenTypes:(0,i.A)(this.tokensMap),grammarName:t});this.definitionErrors=this.definitionErrors.concat(n,r)}var e}),(0,s.A)(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",()=>{const e=function(e){const t={};return(0,r.A)(e,e=>{const n=new me(e).startWalking();R(t,n)}),t}((0,i.A)(this.gastProductionsCache));this.resyncFollows=e}),this.TRACE_INIT("ComputeLookaheadFunctions",()=>{var e,t;null===(t=(e=this.lookaheadStrategy).initialize)||void 0===t||t.call(e,{rules:(0,i.A)(this.gastProductionsCache)}),this.preComputeLookaheadFunctions((0,i.A)(this.gastProductionsCache))})),!Mr.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,s.A)(this.definitionErrors))throw e=(0,a.A)(this.definitionErrors,e=>e.message),new Error(`Parser Definition Errors detected:\n ${e.join("\n-------------------------------\n")}`)})}constructor(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;const n=this;if(n.initErrorHandler(t),n.initLexerAdapter(),n.initLooksAhead(t),n.initRecognizerEngine(e,t),n.initRecoverable(t),n.initTreeBuilder(t),n.initContentAssist(),n.initGastRecorder(t),n.initPerformanceTracer(t),(0,o.A)(t,"ignoredIssues"))throw new Error("The <ignoredIssues> IParserConfig property has been deprecated.\n\tPlease use the <IGNORE_AMBIGUITIES> flag on the relevant DSL method instead.\n\tSee: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\n\tFor further details.");this.skipValidations=(0,o.A)(t,"skipValidations")?t.skipValidations:Lr.skipValidations}}Mr.DEFER_DEFINITION_ERRORS_HANDLING=!1,_r=Mr,[class{initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,o.A)(e,"recoveryEnabled")?e.recoveryEnabled:Lr.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=ar)}getTokenToInsert(e){const t=qt(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,t,n,r){const i=this.findReSyncTokenType(),s=this.exportLexerState(),a=[];let o=!1;const l=this.LA(1);let c=this.LA(1);const u=()=>{const e=this.LA(0),t=this.errorMessageProvider.buildMismatchTokenMessage({expected:r,actual:l,previous:e,ruleName:this.getCurrRuleFullName()}),n=new Jn(t,l,this.LA(0));n.resyncedTokens=un(a),this.SAVE_ERROR(n)};for(;!o;){if(this.tokenMatcher(c,r))return void u();if(n.call(this))return u(),void e.apply(this,t);this.tokenMatcher(c,i)?o=!0:(c=this.SKIP_TOKEN(),this.addToResyncTokens(c,a))}this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,t,n){return!1!==n&&!this.tokenMatcher(this.LA(1),e)&&!this.isBackTracking()&&!this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t))}getFollowsForInRuleRecovery(e,t){const n=this.getCurrentGrammarPath(e,t);return this.getNextPossibleTokenTypes(n)}tryInRuleRecovery(e,t){if(this.canRecoverWithSingleTokenInsertion(e,t))return this.getTokenToInsert(e);if(this.canRecoverWithSingleTokenDeletion(e)){const e=this.SKIP_TOKEN();return this.consumeToken(),e}throw new sr("sad sad panda")}canPerformInRuleRecovery(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,t){if(!this.canTokenTypeBeInsertedInRecovery(e))return!1;if((0,s.A)(t))return!1;const n=this.LA(1);return void 0!==(0,Fe.A)(t,e=>this.tokenMatcher(n,e))}canRecoverWithSingleTokenDeletion(e){return!!this.canTokenTypeBeDeletedInRecovery(e)&&this.tokenMatcher(this.LA(2),e)}isInCurrentRuleReSyncSet(e){const t=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(t);return ne(n,e)}findReSyncTokenType(){const e=this.flattenFollowSet();let t=this.LA(1),n=2;for(;;){const r=(0,Fe.A)(e,e=>Qt(t,e));if(void 0!==r)return r;t=this.LA(n),n++}}getCurrFollowKey(){if(1===this.RULE_STACK.length)return rr;const e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){const e=this.RULE_STACK,t=this.RULE_OCCURRENCE_STACK;return(0,a.A)(e,(n,r)=>0===r?rr:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:t[r],inRule:this.shortRuleNameToFullName(e[r-1])})}flattenFollowSet(){const e=(0,a.A)(this.buildFullFollowKeyStack(),e=>this.getFollowSetFromFollowKey(e));return(0,he.A)(e)}getFollowSetFromFollowKey(e){if(e===rr)return[Xt];const t=e.ruleName+e.idxInCallingRule+pe+e.inRule;return this.resyncFollows[t]}addToResyncTokens(e,t){return this.tokenMatcher(e,Xt)||t.push(e),t}reSyncTo(e){const t=[];let n=this.LA(1);for(;!1===this.tokenMatcher(n,e);)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,t);return un(t)}attemptInRepetitionRecovery(e,t,n,r,i,s,a){}getCurrentGrammarPath(e,t){return{ruleStack:this.getHumanReadableRuleStack(),occurrenceStack:(0,l.A)(this.RULE_OCCURRENCE_STACK),lastTok:e,lastTokOccurrence:t}}getHumanReadableRuleStack(){return(0,a.A)(this.RULE_STACK,e=>this.shortRuleNameToFullName(e))}},class{initLooksAhead(e){this.dynamicTokensEnabled=(0,o.A)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Lr.dynamicTokensEnabled,this.maxLookahead=(0,o.A)(e,"maxLookahead")?e.maxLookahead:Lr.maxLookahead,this.lookaheadStrategy=(0,o.A)(e,"lookaheadStrategy")?e.lookaheadStrategy:new dr({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){(0,r.A)(e,e=>{this.TRACE_INIT(`${e.name} Rule Lookahead`,()=>{const{alternation:t,repetition:n,option:i,repetitionMandatory:s,repetitionMandatoryWithSeparator:a,repetitionWithSeparator:o}=function(e){hr.reset(),e.accept(hr);const t=hr.dslMethods;return hr.reset(),t}(e);(0,r.A)(t,t=>{const n=0===t.idx?"":t.idx;this.TRACE_INIT(`${oe(t)}${n}`,()=>{const n=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:t.idx,rule:e,maxLookahead:t.maxLookahead||this.maxLookahead,hasPredicates:t.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),r=ur(this.fullRuleNameToShort[e.name],256,t.idx);this.setLaFuncCache(r,n)})}),(0,r.A)(n,t=>{this.computeLookaheadFunc(e,t.idx,768,"Repetition",t.maxLookahead,oe(t))}),(0,r.A)(i,t=>{this.computeLookaheadFunc(e,t.idx,512,"Option",t.maxLookahead,oe(t))}),(0,r.A)(s,t=>{this.computeLookaheadFunc(e,t.idx,or,"RepetitionMandatory",t.maxLookahead,oe(t))}),(0,r.A)(a,t=>{this.computeLookaheadFunc(e,t.idx,cr,"RepetitionMandatoryWithSeparator",t.maxLookahead,oe(t))}),(0,r.A)(o,t=>{this.computeLookaheadFunc(e,t.idx,lr,"RepetitionWithSeparator",t.maxLookahead,oe(t))})})})}computeLookaheadFunc(e,t,n,r,i,s){this.TRACE_INIT(`${s}${0===t?"":t}`,()=>{const s=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:t,rule:e,maxLookahead:i||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:r}),a=ur(this.fullRuleNameToShort[e.name],n,t);this.setLaFuncCache(a,s)})}getKeyForAutomaticLookahead(e,t){return ur(this.getLastExplicitRuleShortName(),e,t)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,t){this.lookAheadFuncsCache.set(e,t)}},class{initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,o.A)(e,"nodeLocationTracking")?e.nodeLocationTracking:Lr.nodeLocationTracking,this.outputCst)if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=pr,this.setNodeLocationFromNode=pr,this.cstPostRule=Rt.A,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Rt.A,this.setNodeLocationFromNode=Rt.A,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=fr,this.setNodeLocationFromNode=fr,this.cstPostRule=Rt.A,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Rt.A,this.setNodeLocationFromNode=Rt.A,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else{if(!/none/i.test(this.nodeLocationTracking))throw Error(`Invalid <nodeLocationTracking> config option: "${e.nodeLocationTracking}"`);this.setNodeLocationFromToken=Rt.A,this.setNodeLocationFromNode=Rt.A,this.cstPostRule=Rt.A,this.setInitialNodeLocation=Rt.A}else this.cstInvocationStateUpdate=Rt.A,this.cstFinallyStateUpdate=Rt.A,this.cstPostTerminal=Rt.A,this.cstPostNonTerminal=Rt.A,this.cstPostRule=Rt.A}setInitialNodeLocationOnlyOffsetRecovery(e){e.location={startOffset:NaN,endOffset:NaN}}setInitialNodeLocationOnlyOffsetRegular(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}}setInitialNodeLocationFullRecovery(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}}setInitialNodeLocationFullRegular(e){const t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){const t={name:e,children:Object.create(null)};this.setInitialNodeLocation(t),this.CST_STACK.push(t)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){const t=this.LA(0),n=e.location;n.startOffset<=t.startOffset==1?(n.endOffset=t.endOffset,n.endLine=t.endLine,n.endColumn=t.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){const t=this.LA(0),n=e.location;n.startOffset<=t.startOffset==1?n.endOffset=t.endOffset:n.startOffset=NaN}cstPostTerminal(e,t){const n=this.CST_STACK[this.CST_STACK.length-1];var r,i,s;i=t,s=e,void 0===(r=n).children[s]?r.children[s]=[i]:r.children[s].push(i),this.setNodeLocationFromToken(n.location,t)}cstPostNonTerminal(e,t){const n=this.CST_STACK[this.CST_STACK.length-1];!function(e,t,n){void 0===e.children[t]?e.children[t]=[n]:e.children[t].push(n)}(n,t,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if((0,ge.A)(this.baseCstVisitorConstructor)){const e=yr(this.className,(0,A.A)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if((0,ge.A)(this.baseCstVisitorWithDefaultsConstructor)){const e=function(e,t,n){const i=function(){};mr(i,e+"BaseSemanticsWithDefaults");const s=Object.create(n.prototype);return(0,r.A)(t,e=>{s[e]=gr}),(i.prototype=s).constructor=i,i}(this.className,(0,A.A)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){const e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){const e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){const e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}},class{initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(!0!==this.selfAnalysisDone)throw Error("Missing <performSelfAnalysis> invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length}get input(){return this.tokVector}SKIP_TOKEN(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):wr}LA(e){const t=this.currIdx+e;return t<0||this.tokVectorLength<=t?wr:this.tokVector[t]}consumeToken(){this.currIdx++}exportLexerState(){return this.currIdx}importLexerState(e){this.currIdx=e}resetLexerState(){this.currIdx=-1}moveToTerminatedState(){this.currIdx=this.tokVector.length-1}getLexerPosition(){return this.exportLexerState()}},class{initRecognizerEngine(e,t){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=xt,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,o.A)(t,"serializedGrammar"))throw Error("The Parser's configuration can no longer contain a <serializedGrammar> property.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\n\tFor Further details.");if((0,Q.A)(e)){if((0,s.A)(e))throw Error("A Token Vocabulary cannot be empty.\n\tNote that the first argument for the parser constructor\n\tis no longer a Token vector (since v4.0).");if("number"==typeof e[0].startOffset)throw Error("The Parser constructor no longer accepts a token vector as the first argument.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\n\tFor Further details.")}if((0,Q.A)(e))this.tokensMap=(0,Ie.A)(e,(e,t)=>(e[t.name]=t,e),{});else if((0,o.A)(e,"modes")&&se((0,he.A)((0,i.A)(e.modes)),bt)){const t=(0,he.A)((0,i.A)(e.modes)),n=de(t);this.tokensMap=(0,Ie.A)(n,(e,t)=>(e[t.name]=t,e),{})}else{if(!(0,Ar.A)(e))throw new Error("<tokensDictionary> argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap=(0,l.A)(e)}this.tokensMap.EOF=Xt;const n=(0,o.A)(e,"modes")?(0,he.A)((0,i.A)(e.modes)):(0,i.A)(e),r=se(n,e=>(0,s.A)(e.categoryMatches));this.tokenMatcher=r?xt:kt,Nt((0,i.A)(this.tokensMap))}defineRule(e,t,n){if(this.selfAnalysisDone)throw Error(`Grammar rule <${e}> may not be defined after the 'performSelfAnalysis' method has been called'\nMake sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);const r=(0,o.A)(n,"resyncEnabled")?n.resyncEnabled:br.resyncEnabled,i=(0,o.A)(n,"recoveryValueFunc")?n.recoveryValueFunc:br.recoveryValueFunc,s=this.ruleShortNameIdx<<12;let a;return this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s,a=!0===this.outputCst?function(...n){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx),t.apply(this,n);const r=this.CST_STACK[this.CST_STACK.length-1];return this.cstPostRule(r),r}catch(a){return this.invokeRuleCatch(a,r,i)}finally{this.ruleFinallyStateUpdate()}}:function(...n){try{return this.ruleInvocationStateUpdate(s,e,this.subruleIdx),t.apply(this,n)}catch(a){return this.invokeRuleCatch(a,r,i)}finally{this.ruleFinallyStateUpdate()}},Object.assign(a,{ruleName:e,originalGrammarAction:t})}invokeRuleCatch(e,t,n){const r=1===this.RULE_STACK.length,i=t&&!this.isBackTracking()&&this.recoveryEnabled;if(Qn(e)){const t=e;if(i){const r=this.findReSyncTokenType();if(this.isInCurrentRuleReSyncSet(r)){if(t.resyncedTokens=this.reSyncTo(r),this.outputCst){const e=this.CST_STACK[this.CST_STACK.length-1];return e.recoveredNode=!0,e}return n(e)}if(this.outputCst){const e=this.CST_STACK[this.CST_STACK.length-1];e.recoveredNode=!0,t.partialCstResult=e}throw t}if(r)return this.moveToTerminatedState(),n(e);throw t}throw e}optionInternal(e,t){const n=this.getKeyForAutomaticLookahead(512,t);return this.optionInternalLogic(e,t,n)}optionInternalLogic(e,t,n){let r,i=this.getLaFuncFromCache(n);if("function"!=typeof e){r=e.DEF;const t=e.GATE;if(void 0!==t){const e=i;i=()=>t.call(this)&&e.call(this)}}else r=e;if(!0===i.call(this))return r.call(this)}atLeastOneInternal(e,t){const n=this.getKeyForAutomaticLookahead(or,e);return this.atLeastOneInternalLogic(e,t,n)}atLeastOneInternalLogic(e,t,n){let r,i=this.getLaFuncFromCache(n);if("function"!=typeof t){r=t.DEF;const e=t.GATE;if(void 0!==e){const t=i;i=()=>e.call(this)&&t.call(this)}}else r=t;if(!0!==i.call(this))throw this.raiseEarlyExitException(e,Rn.REPETITION_MANDATORY,t.ERR_MSG);{let e=this.doSingleRepetition(r);for(;!0===i.call(this)&&!0===e;)e=this.doSingleRepetition(r)}this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,t],i,or,e,gn)}atLeastOneSepFirstInternal(e,t){const n=this.getKeyForAutomaticLookahead(cr,e);this.atLeastOneSepFirstInternalLogic(e,t,n)}atLeastOneSepFirstInternalLogic(e,t,n){const r=t.DEF,i=t.SEP;if(!0!==this.getLaFuncFromCache(n).call(this))throw this.raiseEarlyExitException(e,Rn.REPETITION_MANDATORY_WITH_SEPARATOR,t.ERR_MSG);{r.call(this);const t=()=>this.tokenMatcher(this.LA(1),i);for(;!0===this.tokenMatcher(this.LA(1),i);)this.CONSUME(i),r.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,i,t,r,yn],t,cr,e,yn)}}manyInternal(e,t){const n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,t,n)}manyInternalLogic(e,t,n){let r,i=this.getLaFuncFromCache(n);if("function"!=typeof t){r=t.DEF;const e=t.GATE;if(void 0!==e){const t=i;i=()=>e.call(this)&&t.call(this)}}else r=t;let s=!0;for(;!0===i.call(this)&&!0===s;)s=this.doSingleRepetition(r);this.attemptInRepetitionRecovery(this.manyInternal,[e,t],i,768,e,pn,s)}manySepFirstInternal(e,t){const n=this.getKeyForAutomaticLookahead(lr,e);this.manySepFirstInternalLogic(e,t,n)}manySepFirstInternalLogic(e,t,n){const r=t.DEF,i=t.SEP;if(!0===this.getLaFuncFromCache(n).call(this)){r.call(this);const t=()=>this.tokenMatcher(this.LA(1),i);for(;!0===this.tokenMatcher(this.LA(1),i);)this.CONSUME(i),r.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,i,t,r,mn],t,lr,e,mn)}}repetitionSepSecondInternal(e,t,n,r,i){for(;n();)this.CONSUME(t),r.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,t,n,r,i],n,cr,e,i)}doSingleRepetition(e){const t=this.getLexerPosition();return e.call(this),this.getLexerPosition()>t}orInternal(e,t){const n=this.getKeyForAutomaticLookahead(256,t),r=(0,Q.A)(e)?e:e.DEF,i=this.getLaFuncFromCache(n).call(this,r);if(void 0!==i)return r[i].ALT.call(this);this.raiseNoAltException(t,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),0===this.RULE_STACK.length&&!1===this.isAtEndOfInput()){const e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new tr(t,e))}}subruleInternal(e,t,n){let r;try{const i=void 0!==n?n.ARGS:void 0;return this.subruleIdx=t,r=e.apply(this,i),this.cstPostNonTerminal(r,void 0!==n&&void 0!==n.LABEL?n.LABEL:e.ruleName),r}catch(i){throw this.subruleInternalError(i,n,e.ruleName)}}subruleInternalError(e,t,n){throw Qn(e)&&void 0!==e.partialCstResult&&(this.cstPostNonTerminal(e.partialCstResult,void 0!==t&&void 0!==t.LABEL?t.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,t,n){let r;try{const t=this.LA(1);!0===this.tokenMatcher(t,e)?(this.consumeToken(),r=t):this.consumeInternalError(e,t,n)}catch(i){r=this.consumeInternalRecovery(e,t,i)}return this.cstPostTerminal(void 0!==n&&void 0!==n.LABEL?n.LABEL:e.name,r),r}consumeInternalError(e,t,n){let r;const i=this.LA(0);throw r=void 0!==n&&n.ERR_MSG?n.ERR_MSG:this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:i,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Jn(r,t,i))}consumeInternalRecovery(e,t,n){if(!this.recoveryEnabled||"MismatchedTokenException"!==n.name||this.isBackTracking())throw n;{const i=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,i)}catch(r){throw r.name===ir?n:r}}}saveRecogState(){const e=this.errors,t=(0,l.A)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:t,CST_STACK:this.CST_STACK}}reloadRecogState(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK}ruleInvocationStateUpdate(e,t,n){this.RULE_OCCURRENCE_STACK.push(n),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(t)}isBackTracking(){return 0!==this.isBackTrackingStack.length}getCurrRuleFullName(){const e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),Xt)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}},class{ACTION(e){return e.call(this)}consume(e,t,n){return this.consumeInternal(t,e,n)}subrule(e,t,n){return this.subruleInternal(t,e,n)}option(e,t){return this.optionInternal(t,e)}or(e,t){return this.orInternal(t,e)}many(e,t){return this.manyInternal(e,t)}atLeastOne(e,t){return this.atLeastOneInternal(e,t)}CONSUME(e,t){return this.consumeInternal(e,0,t)}CONSUME1(e,t){return this.consumeInternal(e,1,t)}CONSUME2(e,t){return this.consumeInternal(e,2,t)}CONSUME3(e,t){return this.consumeInternal(e,3,t)}CONSUME4(e,t){return this.consumeInternal(e,4,t)}CONSUME5(e,t){return this.consumeInternal(e,5,t)}CONSUME6(e,t){return this.consumeInternal(e,6,t)}CONSUME7(e,t){return this.consumeInternal(e,7,t)}CONSUME8(e,t){return this.consumeInternal(e,8,t)}CONSUME9(e,t){return this.consumeInternal(e,9,t)}SUBRULE(e,t){return this.subruleInternal(e,0,t)}SUBRULE1(e,t){return this.subruleInternal(e,1,t)}SUBRULE2(e,t){return this.subruleInternal(e,2,t)}SUBRULE3(e,t){return this.subruleInternal(e,3,t)}SUBRULE4(e,t){return this.subruleInternal(e,4,t)}SUBRULE5(e,t){return this.subruleInternal(e,5,t)}SUBRULE6(e,t){return this.subruleInternal(e,6,t)}SUBRULE7(e,t){return this.subruleInternal(e,7,t)}SUBRULE8(e,t){return this.subruleInternal(e,8,t)}SUBRULE9(e,t){return this.subruleInternal(e,9,t)}OPTION(e){return this.optionInternal(e,0)}OPTION1(e){return this.optionInternal(e,1)}OPTION2(e){return this.optionInternal(e,2)}OPTION3(e){return this.optionInternal(e,3)}OPTION4(e){return this.optionInternal(e,4)}OPTION5(e){return this.optionInternal(e,5)}OPTION6(e){return this.optionInternal(e,6)}OPTION7(e){return this.optionInternal(e,7)}OPTION8(e){return this.optionInternal(e,8)}OPTION9(e){return this.optionInternal(e,9)}OR(e){return this.orInternal(e,0)}OR1(e){return this.orInternal(e,1)}OR2(e){return this.orInternal(e,2)}OR3(e){return this.orInternal(e,3)}OR4(e){return this.orInternal(e,4)}OR5(e){return this.orInternal(e,5)}OR6(e){return this.orInternal(e,6)}OR7(e){return this.orInternal(e,7)}OR8(e){return this.orInternal(e,8)}OR9(e){return this.orInternal(e,9)}MANY(e){this.manyInternal(0,e)}MANY1(e){this.manyInternal(1,e)}MANY2(e){this.manyInternal(2,e)}MANY3(e){this.manyInternal(3,e)}MANY4(e){this.manyInternal(4,e)}MANY5(e){this.manyInternal(5,e)}MANY6(e){this.manyInternal(6,e)}MANY7(e){this.manyInternal(7,e)}MANY8(e){this.manyInternal(8,e)}MANY9(e){this.manyInternal(9,e)}MANY_SEP(e){this.manySepFirstInternal(0,e)}MANY_SEP1(e){this.manySepFirstInternal(1,e)}MANY_SEP2(e){this.manySepFirstInternal(2,e)}MANY_SEP3(e){this.manySepFirstInternal(3,e)}MANY_SEP4(e){this.manySepFirstInternal(4,e)}MANY_SEP5(e){this.manySepFirstInternal(5,e)}MANY_SEP6(e){this.manySepFirstInternal(6,e)}MANY_SEP7(e){this.manySepFirstInternal(7,e)}MANY_SEP8(e){this.manySepFirstInternal(8,e)}MANY_SEP9(e){this.manySepFirstInternal(9,e)}AT_LEAST_ONE(e){this.atLeastOneInternal(0,e)}AT_LEAST_ONE1(e){return this.atLeastOneInternal(1,e)}AT_LEAST_ONE2(e){this.atLeastOneInternal(2,e)}AT_LEAST_ONE3(e){this.atLeastOneInternal(3,e)}AT_LEAST_ONE4(e){this.atLeastOneInternal(4,e)}AT_LEAST_ONE5(e){this.atLeastOneInternal(5,e)}AT_LEAST_ONE6(e){this.atLeastOneInternal(6,e)}AT_LEAST_ONE7(e){this.atLeastOneInternal(7,e)}AT_LEAST_ONE8(e){this.atLeastOneInternal(8,e)}AT_LEAST_ONE9(e){this.atLeastOneInternal(9,e)}AT_LEAST_ONE_SEP(e){this.atLeastOneSepFirstInternal(0,e)}AT_LEAST_ONE_SEP1(e){this.atLeastOneSepFirstInternal(1,e)}AT_LEAST_ONE_SEP2(e){this.atLeastOneSepFirstInternal(2,e)}AT_LEAST_ONE_SEP3(e){this.atLeastOneSepFirstInternal(3,e)}AT_LEAST_ONE_SEP4(e){this.atLeastOneSepFirstInternal(4,e)}AT_LEAST_ONE_SEP5(e){this.atLeastOneSepFirstInternal(5,e)}AT_LEAST_ONE_SEP6(e){this.atLeastOneSepFirstInternal(6,e)}AT_LEAST_ONE_SEP7(e){this.atLeastOneSepFirstInternal(7,e)}AT_LEAST_ONE_SEP8(e){this.atLeastOneSepFirstInternal(8,e)}AT_LEAST_ONE_SEP9(e){this.atLeastOneSepFirstInternal(9,e)}RULE(e,t,n=br){if(ne(this.definedRulesNames,e)){const t={message:en.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:Or.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(t)}this.definedRulesNames.push(e);const r=this.defineRule(e,t,n);return this[e]=r,r}OVERRIDE_RULE(e,t,n=br){const r=function(e,t,n){const r=[];let i;return ne(t,e)||(i=`Invalid rule override, rule: ->${e}<- cannot be overridden in the grammar: ->${n}<-as it is not defined in any of the super grammars `,r.push({message:i,type:Or.INVALID_RULE_OVERRIDE,ruleName:e})),r}(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(r);const i=this.defineRule(e,t,n);return this[e]=i,i}BACKTRACK(e,t){return function(){this.isBackTrackingStack.push(1);const n=this.saveRecogState();try{return e.apply(this,t),!0}catch(r){if(Qn(r))return!1;throw r}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return e=(0,i.A)(this.gastProductionsCache),(0,a.A)(e,W);var e}},class{initErrorHandler(e){this._errors=[],this.errorMessageProvider=(0,o.A)(e,"errorMessageProvider")?e.errorMessageProvider:Lr.errorMessageProvider}SAVE_ERROR(e){if(Qn(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,l.A)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return(0,l.A)(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,t,n){const r=this.getCurrRuleFullName(),i=On(e,this.getGAstProductions()[r],t,this.maxLookahead)[0],s=[];for(let o=1;o<=this.maxLookahead;o++)s.push(this.LA(o));const a=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:i,actual:s,previous:this.LA(0),customUserDescription:n,ruleName:r});throw this.SAVE_ERROR(new nr(a,this.LA(1),this.LA(0)))}raiseNoAltException(e,t){const n=this.getCurrRuleFullName(),r=bn(e,this.getGAstProductions()[n],this.maxLookahead),i=[];for(let o=1;o<=this.maxLookahead;o++)i.push(this.LA(o));const s=this.LA(0),a=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:r,actual:i,previous:s,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new er(a,this.LA(1),s))}},class{initContentAssist(){}computeContentAssist(e,t){const n=this.gastProductionsCache[e];if((0,ge.A)(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return An([n],t,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){const t=Ue(e.ruleStack),n=this.getGAstProductions()[t];return new hn(n,e).startWalking()}},class{initGastRecorder(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1}enableRecording(){this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",()=>{for(let e=0;e<10;e++){const t=e>0?e:"";this[`CONSUME${t}`]=function(t,n){return this.consumeInternalRecord(t,e,n)},this[`SUBRULE${t}`]=function(t,n){return this.subruleInternalRecord(t,e,n)},this[`OPTION${t}`]=function(t){return this.optionInternalRecord(t,e)},this[`OR${t}`]=function(t){return this.orInternalRecord(t,e)},this[`MANY${t}`]=function(t){this.manyInternalRecord(e,t)},this[`MANY_SEP${t}`]=function(t){this.manySepFirstInternalRecord(e,t)},this[`AT_LEAST_ONE${t}`]=function(t){this.atLeastOneInternalRecord(e,t)},this[`AT_LEAST_ONE_SEP${t}`]=function(t){this.atLeastOneSepFirstInternalRecord(e,t)}}this.consume=function(e,t,n){return this.consumeInternalRecord(t,e,n)},this.subrule=function(e,t,n){return this.subruleInternalRecord(t,e,n)},this.option=function(e,t){return this.optionInternalRecord(t,e)},this.or=function(e,t){return this.orInternalRecord(t,e)},this.many=function(e,t){this.manyInternalRecord(e,t)},this.atLeastOne=function(e,t){this.atLeastOneInternalRecord(e,t)},this.ACTION=this.ACTION_RECORD,this.BACKTRACK=this.BACKTRACK_RECORD,this.LA=this.LA_RECORD})}disableRecording(){this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",()=>{const e=this;for(let t=0;t<10;t++){const n=t>0?t:"";delete e[`CONSUME${n}`],delete e[`SUBRULE${n}`],delete e[`OPTION${n}`],delete e[`OR${n}`],delete e[`MANY${n}`],delete e[`MANY_SEP${n}`],delete e[`AT_LEAST_ONE${n}`],delete e[`AT_LEAST_ONE_SEP${n}`]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})}ACTION_RECORD(e){}BACKTRACK_RECORD(e,t){return()=>!0}LA_RECORD(e){return wr}topLevelRuleRecord(e,t){try{const n=new D({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),t.call(this),this.recordingProdStack.pop(),n}catch(n){if(!0!==n.KNOWN_RECORDER_ERROR)try{n.message=n.message+'\n\t This error was thrown during the "grammar recording phase" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording'}catch(r){throw n}throw n}}optionInternalRecord(e,t){return Ir.call(this,F,e,t)}atLeastOneInternalRecord(e,t){Ir.call(this,G,t,e)}atLeastOneSepFirstInternalRecord(e,t){Ir.call(this,K,t,e,Rr)}manyInternalRecord(e,t){Ir.call(this,B,t,e)}manySepFirstInternalRecord(e,t){Ir.call(this,j,t,e,Rr)}orInternalRecord(e,t){return Sr.call(this,e,t)}subruleInternalRecord(e,t,n){if(Cr(t),!e||!1===(0,o.A)(e,"ruleName")){const n=new Error(`<SUBRULE${Nr(t)}> argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}>\n inside top level rule: <${this.recordingProdStack[0].name}>`);throw n.KNOWN_RECORDER_ERROR=!0,n}const r=(0,$t.A)(this.recordingProdStack),i=e.ruleName,s=new M({idx:t,nonTerminalName:i,label:null==n?void 0:n.LABEL,referencedRule:void 0});return r.definition.push(s),this.outputCst?xr:vr}consumeInternalRecord(e,t,n){if(Cr(t),!wt(e)){const n=new Error(`<CONSUME${Nr(t)}> argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}>\n inside top level rule: <${this.recordingProdStack[0].name}>`);throw n.KNOWN_RECORDER_ERROR=!0,n}const r=(0,$t.A)(this.recordingProdStack),i=new H({idx:t,terminalType:e,label:null==n?void 0:n.LABEL});return r.definition.push(i),kr}},class{initPerformanceTracer(e){if((0,o.A)(e,"traceInitPerf")){const t=e.traceInitPerf,n="number"==typeof t;this.traceInitMaxIdent=n?t:1/0,this.traceInitPerf=n?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Lr.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,t){if(!0===this.traceInitPerf){this.traceInitIndent++;const n=new Array(this.traceInitIndent+1).join("\t");this.traceInitIndent<this.traceInitMaxIdent&&console.log(`${n}--\x3e <${e}>`);const{time:r,value:i}=Et(t),s=r>10?console.warn:console.log;return this.traceInitIndent<this.traceInitMaxIdent&&s(`${n}<-- <${e}> time: ${r}ms`),this.traceInitIndent--,i}return t()}}].forEach(e=>{const t=e.prototype;Object.getOwnPropertyNames(t).forEach(n=>{if("constructor"===n)return;const r=Object.getOwnPropertyDescriptor(t,n);r&&(r.get||r.set)?Object.defineProperty(_r.prototype,n,r):_r.prototype[n]=e.prototype[n]})});class Dr extends Mr{constructor(e,t=Lr){const n=(0,l.A)(t);n.outputCst=!1,super(e,n)}}},40436:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=t.Event=void 0;const r=n(406);var i;!function(e){const t={dispose(){}};e.None=function(){return t}}(i||(t.Event=i={}));class s{add(e,t=null,n){this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(t),Array.isArray(n)&&n.push({dispose:()=>this.remove(e,t)})}remove(e,t=null){if(!this._callbacks)return;let n=!1;for(let r=0,i=this._callbacks.length;r<i;r++)if(this._callbacks[r]===e){if(this._contexts[r]===t)return this._callbacks.splice(r,1),void this._contexts.splice(r,1);n=!0}if(n)throw new Error("When adding a listener with a context, you should remove it with the same context")}invoke(...e){if(!this._callbacks)return[];const t=[],n=this._callbacks.slice(0),i=this._contexts.slice(0);for(let a=0,o=n.length;a<o;a++)try{t.push(n[a].apply(i[a],e))}catch(s){(0,r.default)().console.error(s)}return t}isEmpty(){return!this._callbacks||0===this._callbacks.length}dispose(){this._callbacks=void 0,this._contexts=void 0}}class a{constructor(e){this._options=e}get event(){return this._event||(this._event=(e,t,n)=>{this._callbacks||(this._callbacks=new s),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,t);const r={dispose:()=>{this._callbacks&&(this._callbacks.remove(e,t),r.dispose=a._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))}};return Array.isArray(n)&&n.push(r),r}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}}t.Emitter=a,a._noop=function(){}},46018:(e,t,n)=>{n.d(t,{f:()=>c});var r=n(60349),i=n(96103),s=n(95846),a=n(8158),o=class extends r.mR{static{(0,r.K2)(this,"RadarTokenBuilder")}constructor(){super(["radar-beta"])}},l={parser:{TokenBuilder:(0,r.K2)(()=>new o,"TokenBuilder"),ValueConverter:(0,r.K2)(()=>new r.Tm,"ValueConverter")}};function c(e=i.D){const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.YP,l);return t.ServiceRegistry.register(n),{shared:t,Radar:n}}(0,r.K2)(c,"createRadarServices")},48663:(e,t,n)=>{n.d(t,{A:()=>r});const r=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},49948:(e,t,n)=>{n.d(t,{Ao:()=>h,Nt:()=>d,PC:()=>f,TH:()=>i,Yv:()=>u,lU:()=>l});var r=n(11921);const i=/\r?\n/gm,s=new r.H;class a extends r.z{constructor(){super(...arguments),this.isStarting=!0,this.endRegexpStack=[],this.multiline=!1}get endRegex(){return this.endRegexpStack.join("")}reset(e){this.multiline=!1,this.regex=e,this.startRegexp="",this.isStarting=!0,this.endRegexpStack=[]}visitGroup(e){e.quantifier&&(this.isStarting=!1,this.endRegexpStack=[])}visitCharacter(e){const t=String.fromCharCode(e.value);if(this.multiline||"\n"!==t||(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{const e=d(t);this.endRegexpStack.push(e),this.isStarting&&(this.startRegexp+=e)}}visitSet(e){if(!this.multiline){const t=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(t);this.multiline=Boolean("\n".match(n))}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{const t=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(t),this.isStarting&&(this.startRegexp+=t)}}visitChildren(e){if("Group"===e.type){if(e.quantifier)return}super.visitChildren(e)}}const o=new a;function l(e){try{return"string"==typeof e&&(e=new RegExp(e)),e=e.toString(),o.reset(e),o.visit(s.pattern(e)),o.multiline}catch(t){return!1}}const c="\f\n\r\t\v \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000\ufeff".split("");function u(e){const t="string"==typeof e?new RegExp(e):e;return c.some(e=>t.test(e))}function d(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function h(e){return Array.prototype.map.call(e,e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:d(e)).join("")}function f(e,t){const n=function(e){"string"==typeof e&&(e=new RegExp(e));const t=e,n=e.source;let r=0;function i(){let e,s="";function a(e){s+=n.substr(r,e),r+=e}function o(e){s+="(?:"+n.substr(r,e)+"|$)",r+=e}for(;r<n.length;)switch(n[r]){case"\\":switch(n[r+1]){case"c":o(3);break;case"x":o(4);break;case"u":t.unicode?"{"===n[r+2]?o(n.indexOf("}",r)-r+1):o(6):o(2);break;case"p":case"P":t.unicode?o(n.indexOf("}",r)-r+1):o(2);break;case"k":o(n.indexOf(">",r)-r+1);break;default:o(2)}break;case"[":e=/\[(?:\\.|.)*?\]/g,e.lastIndex=r,e=e.exec(n)||[],o(e[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":a(1);break;case"{":e=/\{\d+,?\d*\}/g,e.lastIndex=r,e=e.exec(n),e?a(e[0].length):o(1);break;case"(":if("?"===n[r+1])switch(n[r+2]){case":":s+="(?:",r+=3,s+=i()+"|$)";break;case"=":s+="(?=",r+=3,s+=i()+")";break;case"!":e=r,r+=3,i(),s+=n.substr(e,r-e);break;case"<":switch(n[r+3]){case"=":case"!":e=r,r+=4,i(),s+=n.substr(e,r-e);break;default:a(n.indexOf(">",r)-r+1),s+=i()+"|$)"}}else a(1),s+=i()+"|$)";break;case")":return++r,s;default:o(1)}return s}return new RegExp(i(),e.flags)}(e),r=t.match(n);return!!r&&r[0].length>0}},50249:(e,t,n)=>{n.d(t,{b:()=>c});var r=n(60349),i=n(96103),s=n(95846),a=n(8158),o=class extends r.mR{static{(0,r.K2)(this,"GitGraphTokenBuilder")}constructor(){super(["gitGraph"])}},l={parser:{TokenBuilder:(0,r.K2)(()=>new o,"TokenBuilder"),ValueConverter:(0,r.K2)(()=>new r.Tm,"ValueConverter")}};function c(e=i.D){const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.eZ,l);return t.ServiceRegistry.register(n),{shared:t,GitGraph:n}}(0,r.K2)(c,"createGitGraphServices")},50586:(e,t,n)=>{n.d(t,{A:()=>a});var r=n(80565),i=n(95526),s=n(97427);const a=function(e){return"string"==typeof e||!(0,i.A)(e)&&(0,s.A)(e)&&"[object String]"==(0,r.A)(e)}},52540:(e,t,n)=>{n.d(t,{A:()=>a});var r=Object.prototype.hasOwnProperty;const i=function(e,t){return null!=e&&r.call(e,t)};var s=n(96923);const a=function(e,t){return null!=e&&(0,s.A)(e,t,i)}},55216:(e,t,n)=>{var r;n.d(t,{A:()=>s,r:()=>i}),(()=>{var e={470:e=>{function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function n(e,t){for(var n,r="",i=0,s=-1,a=0,o=0;o<=e.length;++o){if(o<e.length)n=e.charCodeAt(o);else{if(47===n)break;n=47}if(47===n){if(s===o-1||1===a);else if(s!==o-1&&2===a){if(r.length<2||2!==i||46!==r.charCodeAt(r.length-1)||46!==r.charCodeAt(r.length-2))if(r.length>2){var l=r.lastIndexOf("/");if(l!==r.length-1){-1===l?(r="",i=0):i=(r=r.slice(0,l)).length-1-r.lastIndexOf("/"),s=o,a=0;continue}}else if(2===r.length||1===r.length){r="",i=0,s=o,a=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(s+1,o):r=e.slice(s+1,o),i=o-s-1;s=o,a=0}else 46===n&&-1!==a?++a:a=-1}return r}var r={resolve:function(){for(var e,r="",i=!1,s=arguments.length-1;s>=-1&&!i;s--){var a;s>=0?a=arguments[s]:(void 0===e&&(e=process.cwd()),a=e),t(a),0!==a.length&&(r=a+"/"+r,i=47===a.charCodeAt(0))}return r=n(r,!i),i?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(e){if(t(e),0===e.length)return".";var r=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=n(e,!r)).length||r||(e="."),e.length>0&&i&&(e+="/"),r?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,n=0;n<arguments.length;++n){var i=arguments[n];t(i),i.length>0&&(void 0===e?e=i:e+="/"+i)}return void 0===e?".":r.normalize(e)},relative:function(e,n){if(t(e),t(n),e===n)return"";if((e=r.resolve(e))===(n=r.resolve(n)))return"";for(var i=1;i<e.length&&47===e.charCodeAt(i);++i);for(var s=e.length,a=s-i,o=1;o<n.length&&47===n.charCodeAt(o);++o);for(var l=n.length-o,c=a<l?a:l,u=-1,d=0;d<=c;++d){if(d===c){if(l>c){if(47===n.charCodeAt(o+d))return n.slice(o+d+1);if(0===d)return n.slice(o+d)}else a>c&&(47===e.charCodeAt(i+d)?u=d:0===d&&(u=0));break}var h=e.charCodeAt(i+d);if(h!==n.charCodeAt(o+d))break;47===h&&(u=d)}var f="";for(d=i+u+1;d<=s;++d)d!==s&&47!==e.charCodeAt(d)||(0===f.length?f+="..":f+="/..");return f.length>0?f+n.slice(o+u):(o+=u,47===n.charCodeAt(o)&&++o,n.slice(o))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var n=e.charCodeAt(0),r=47===n,i=-1,s=!0,a=e.length-1;a>=1;--a)if(47===(n=e.charCodeAt(a))){if(!s){i=a;break}}else s=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');t(e);var r,i=0,s=-1,a=!0;if(void 0!==n&&n.length>0&&n.length<=e.length){if(n.length===e.length&&n===e)return"";var o=n.length-1,l=-1;for(r=e.length-1;r>=0;--r){var c=e.charCodeAt(r);if(47===c){if(!a){i=r+1;break}}else-1===l&&(a=!1,l=r+1),o>=0&&(c===n.charCodeAt(o)?-1==--o&&(s=r):(o=-1,s=l))}return i===s?s=l:-1===s&&(s=e.length),e.slice(i,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){i=r+1;break}}else-1===s&&(a=!1,s=r+1);return-1===s?"":e.slice(i,s)},extname:function(e){t(e);for(var n=-1,r=0,i=-1,s=!0,a=0,o=e.length-1;o>=0;--o){var l=e.charCodeAt(o);if(47!==l)-1===i&&(s=!1,i=o+1),46===l?-1===n?n=o:1!==a&&(a=1):-1!==n&&(a=-1);else if(!s){r=o+1;break}}return-1===n||-1===i||0===a||1===a&&n===i-1&&n===r+1?"":e.slice(n,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+"/"+r:r}(0,e)},parse:function(e){t(e);var n={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return n;var r,i=e.charCodeAt(0),s=47===i;s?(n.root="/",r=1):r=0;for(var a=-1,o=0,l=-1,c=!0,u=e.length-1,d=0;u>=r;--u)if(47!==(i=e.charCodeAt(u)))-1===l&&(c=!1,l=u+1),46===i?-1===a?a=u:1!==d&&(d=1):-1!==a&&(d=-1);else if(!c){o=u+1;break}return-1===a||-1===l||0===d||1===d&&a===l-1&&a===o+1?-1!==l&&(n.base=n.name=0===o&&s?e.slice(1,l):e.slice(o,l)):(0===o&&s?(n.name=e.slice(1,a),n.base=e.slice(1,l)):(n.name=e.slice(o,a),n.base=e.slice(o,l)),n.ext=e.slice(a,l)),o>0?n.dir=e.slice(0,o-1):s&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};r.posix=r,e.exports=r}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{let e;if(n.r(i),n.d(i,{URI:()=>u,Utils:()=>k}),"object"==typeof process)e="win32"===process.platform;else if("object"==typeof navigator){let t=navigator.userAgent;e=t.indexOf("Windows")>=0}const t=/^\w[\w\d+.-]*$/,r=/^\//,s=/^\/\//;function a(e,n){if(!e.scheme&&n)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${e.authority}", path: "${e.path}", query: "${e.query}", fragment: "${e.fragment}"}`);if(e.scheme&&!t.test(e.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(e.path)if(e.authority){if(!r.test(e.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character')}else if(s.test(e.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}const o="",l="/",c=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class u{static isUri(e){return e instanceof u||!!e&&"string"==typeof e.authority&&"string"==typeof e.fragment&&"string"==typeof e.path&&"string"==typeof e.query&&"string"==typeof e.scheme&&"string"==typeof e.fsPath&&"function"==typeof e.with&&"function"==typeof e.toString}scheme;authority;path;query;fragment;constructor(e,t,n,r,i,s=!1){"object"==typeof e?(this.scheme=e.scheme||o,this.authority=e.authority||o,this.path=e.path||o,this.query=e.query||o,this.fragment=e.fragment||o):(this.scheme=function(e,t){return e||t?e:"file"}(e,s),this.authority=t||o,this.path=function(e,t){switch(e){case"https":case"http":case"file":t?t[0]!==l&&(t=l+t):t=l}return t}(this.scheme,n||o),this.query=r||o,this.fragment=i||o,a(this,s))}get fsPath(){return g(this,!1)}with(e){if(!e)return this;let{scheme:t,authority:n,path:r,query:i,fragment:s}=e;return void 0===t?t=this.scheme:null===t&&(t=o),void 0===n?n=this.authority:null===n&&(n=o),void 0===r?r=this.path:null===r&&(r=o),void 0===i?i=this.query:null===i&&(i=o),void 0===s?s=this.fragment:null===s&&(s=o),t===this.scheme&&n===this.authority&&r===this.path&&i===this.query&&s===this.fragment?this:new h(t,n,r,i,s)}static parse(e,t=!1){const n=c.exec(e);return n?new h(n[2]||o,v(n[4]||o),v(n[5]||o),v(n[7]||o),v(n[9]||o),t):new h(o,o,o,o,o)}static file(t){let n=o;if(e&&(t=t.replace(/\\/g,l)),t[0]===l&&t[1]===l){const e=t.indexOf(l,2);-1===e?(n=t.substring(2),t=l):(n=t.substring(2,e),t=t.substring(e)||l)}return new h("file",n,t,o,o)}static from(e){const t=new h(e.scheme,e.authority,e.path,e.query,e.fragment);return a(t,!0),t}toString(e=!1){return y(this,e)}toJSON(){return this}static revive(e){if(e){if(e instanceof u)return e;{const t=new h(e);return t._formatted=e.external,t._fsPath=e._sep===d?e.fsPath:null,t}}return e}}const d=e?1:void 0;class h extends u{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=g(this,!1)),this._fsPath}toString(e=!1){return e?y(this,!0):(this._formatted||(this._formatted=y(this,!1)),this._formatted)}toJSON(){const e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath,e._sep=d),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e}}const f={58:"%3A",47:"%2F",63:"%3F",35:"%23",91:"%5B",93:"%5D",64:"%40",33:"%21",36:"%24",38:"%26",39:"%27",40:"%28",41:"%29",42:"%2A",43:"%2B",44:"%2C",59:"%3B",61:"%3D",32:"%20"};function p(e,t,n){let r,i=-1;for(let s=0;s<e.length;s++){const a=e.charCodeAt(s);if(a>=97&&a<=122||a>=65&&a<=90||a>=48&&a<=57||45===a||46===a||95===a||126===a||t&&47===a||n&&91===a||n&&93===a||n&&58===a)-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),void 0!==r&&(r+=e.charAt(s));else{void 0===r&&(r=e.substr(0,s));const t=f[a];void 0!==t?(-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),r+=t):-1===i&&(i=s)}}return-1!==i&&(r+=encodeURIComponent(e.substring(i))),void 0!==r?r:e}function m(e){let t;for(let n=0;n<e.length;n++){const r=e.charCodeAt(n);35===r||63===r?(void 0===t&&(t=e.substr(0,n)),t+=f[r]):void 0!==t&&(t+=e[n])}return void 0!==t?t:e}function g(t,n){let r;return r=t.authority&&t.path.length>1&&"file"===t.scheme?`//${t.authority}${t.path}`:47===t.path.charCodeAt(0)&&(t.path.charCodeAt(1)>=65&&t.path.charCodeAt(1)<=90||t.path.charCodeAt(1)>=97&&t.path.charCodeAt(1)<=122)&&58===t.path.charCodeAt(2)?n?t.path.substr(1):t.path[1].toLowerCase()+t.path.substr(2):t.path,e&&(r=r.replace(/\//g,"\\")),r}function y(e,t){const n=t?m:p;let r="",{scheme:i,authority:s,path:a,query:o,fragment:c}=e;if(i&&(r+=i,r+=":"),(s||"file"===i)&&(r+=l,r+=l),s){let e=s.indexOf("@");if(-1!==e){const t=s.substr(0,e);s=s.substr(e+1),e=t.lastIndexOf(":"),-1===e?r+=n(t,!1,!1):(r+=n(t.substr(0,e),!1,!1),r+=":",r+=n(t.substr(e+1),!1,!0)),r+="@"}s=s.toLowerCase(),e=s.lastIndexOf(":"),-1===e?r+=n(s,!1,!0):(r+=n(s.substr(0,e),!1,!0),r+=s.substr(e))}if(a){if(a.length>=3&&47===a.charCodeAt(0)&&58===a.charCodeAt(2)){const e=a.charCodeAt(1);e>=65&&e<=90&&(a=`/${String.fromCharCode(e+32)}:${a.substr(3)}`)}else if(a.length>=2&&58===a.charCodeAt(1)){const e=a.charCodeAt(0);e>=65&&e<=90&&(a=`${String.fromCharCode(e+32)}:${a.substr(2)}`)}r+=n(a,!0,!1)}return o&&(r+="?",r+=n(o,!1,!1)),c&&(r+="#",r+=t?c:p(c,!1,!1)),r}function T(e){try{return decodeURIComponent(e)}catch{return e.length>3?e.substr(0,3)+T(e.substr(3)):e}}const A=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function v(e){return e.match(A)?e.replace(A,e=>T(e)):e}var R=n(470);const $=R.posix||R,E="/";var k;!function(e){e.joinPath=function(e,...t){return e.with({path:$.join(e.path,...t)})},e.resolvePath=function(e,...t){let n=e.path,r=!1;n[0]!==E&&(n=E+n,r=!0);let i=$.resolve(n,...t);return r&&i[0]===E&&!e.authority&&(i=i.substring(1)),e.with({path:i})},e.dirname=function(e){if(0===e.path.length||e.path===E)return e;let t=$.dirname(e.path);return 1===t.length&&46===t.charCodeAt(0)&&(t=""),e.with({path:t})},e.basename=function(e){return $.basename(e.path)},e.extname=function(e){return $.extname(e.path)}}(k||(k={}))})(),r=i})();const{URI:i,Utils:s}=r},60129:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(49759);const i=function(e){return(null==e?0:e.length)?(0,r.A)(e,1):[]}},60349:(e,t,n)=>{n.d(t,{mR:()=>xe,dg:()=>Ee,jE:()=>Te,Tm:()=>ke,eZ:()=>Ae,e5:()=>me,sr:()=>pe,AM:()=>ge,KX:()=>ye,YP:()=>ve,eV:()=>Re,K2:()=>m});var r=n(64913),i=n(8158),s=n(95846),a=n(34813),o=n(96103),l=n(55216);const c={Grammar:()=>{},LanguageMetaData:()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"})},u={AstReflection:()=>new a.QX};function d(e){var t;const n=function(){const e=(0,s.WQ)((0,i.u)(o.D),u),t=(0,s.WQ)((0,i.t)({shared:e}),c);return e.ServiceRegistry.register(t),t}(),r=n.serializer.JsonSerializer.deserialize(e);return n.shared.workspace.LangiumDocumentFactory.fromModel(r,l.r.parse(`memory://${null!==(t=r.name)&&void 0!==t?t:"grammar"}.langium`)),r}var h=n(12223),f=n(89212),p=Object.defineProperty,m=(e,t)=>p(e,"name",{value:t,configurable:!0}),g="Statement",y="Architecture";m(function(e){return J.isInstance(e,y)},"isArchitecture");var T="Axis",A="Branch";m(function(e){return J.isInstance(e,A)},"isBranch");var v="Checkout",R="CherryPicking",$="ClassDefStatement",E="Commit";m(function(e){return J.isInstance(e,E)},"isCommit");var k="Curve",x="Edge",I="Entry",S="GitGraph";m(function(e){return J.isInstance(e,S)},"isGitGraph");var N="Group",C="Info";m(function(e){return J.isInstance(e,C)},"isInfo");var w="Item",L="Junction",b="Merge";m(function(e){return J.isInstance(e,b)},"isMerge");var O="Option",_="Packet";m(function(e){return J.isInstance(e,_)},"isPacket");var P="PacketBlock";m(function(e){return J.isInstance(e,P)},"isPacketBlock");var M="Pie";m(function(e){return J.isInstance(e,M)},"isPie");var D="PieSection";m(function(e){return J.isInstance(e,D)},"isPieSection");var U="Radar",F="Service",G="Treemap";m(function(e){return J.isInstance(e,G)},"isTreemap");var K,B,j,V,H,W,z,Y="TreemapRow",X="Direction",q="Leaf",Q="Section",Z=class extends r.kD{static{m(this,"MermaidAstReflection")}getAllTypes(){return[y,T,A,v,R,$,E,k,X,x,I,S,N,C,w,L,q,b,O,_,P,M,D,U,Q,F,g,G,Y]}computeIsSubtype(e,t){switch(e){case A:case v:case R:case E:case b:return this.isSubtype(g,t);case X:return this.isSubtype(S,t);case q:case Q:return this.isSubtype(w,t);default:return!1}}getReferenceType(e){const t=`${e.container.$type}:${e.property}`;if("Entry:axis"===t)return T;throw new Error(`${t} is not a valid reference id.`)}getTypeMetaData(e){switch(e){case y:return{name:y,properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case T:return{name:T,properties:[{name:"label"},{name:"name"}]};case A:return{name:A,properties:[{name:"name"},{name:"order"}]};case v:return{name:v,properties:[{name:"branch"}]};case R:return{name:R,properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case $:return{name:$,properties:[{name:"className"},{name:"styleText"}]};case E:return{name:E,properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case k:return{name:k,properties:[{name:"entries",defaultValue:[]},{name:"label"},{name:"name"}]};case x:return{name:x,properties:[{name:"lhsDir"},{name:"lhsGroup",defaultValue:!1},{name:"lhsId"},{name:"lhsInto",defaultValue:!1},{name:"rhsDir"},{name:"rhsGroup",defaultValue:!1},{name:"rhsId"},{name:"rhsInto",defaultValue:!1},{name:"title"}]};case I:return{name:I,properties:[{name:"axis"},{name:"value"}]};case S:return{name:S,properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case N:return{name:N,properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case C:return{name:C,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case w:return{name:w,properties:[{name:"classSelector"},{name:"name"}]};case L:return{name:L,properties:[{name:"id"},{name:"in"}]};case b:return{name:b,properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case O:return{name:O,properties:[{name:"name"},{name:"value",defaultValue:!1}]};case _:return{name:_,properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case P:return{name:P,properties:[{name:"bits"},{name:"end"},{name:"label"},{name:"start"}]};case M:return{name:M,properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case D:return{name:D,properties:[{name:"label"},{name:"value"}]};case U:return{name:U,properties:[{name:"accDescr"},{name:"accTitle"},{name:"axes",defaultValue:[]},{name:"curves",defaultValue:[]},{name:"options",defaultValue:[]},{name:"title"}]};case F:return{name:F,properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case G:return{name:G,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"},{name:"TreemapRows",defaultValue:[]}]};case Y:return{name:Y,properties:[{name:"indent"},{name:"item"}]};case X:return{name:X,properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};case q:return{name:q,properties:[{name:"classSelector"},{name:"name"},{name:"value"}]};case Q:return{name:Q,properties:[{name:"classSelector"},{name:"name"}]};default:return{name:e,properties:[]}}}},J=new Z,ee=m(()=>K??(K=d('{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@7"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|\'([^\'\\\\\\\\]|\\\\\\\\.)*\'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}')),"InfoGrammar"),te=m(()=>B??(B=d('{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"packet-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}],"cardinality":"?"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"+"},{"$type":"Assignment","feature":"bits","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]}]},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|\'([^\'\\\\\\\\]|\\\\\\\\.)*\'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}')),"PacketGrammar"),ne=m(()=>j??(j=d('{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PieSection","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@8"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@9"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|\'([^\'\\\\\\\\]|\\\\\\\\.)*\'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}')),"PieGrammar"),re=m(()=>V??(V=d('{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"groups","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Assignment","feature":"services","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Assignment","feature":"junctions","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Assignment","feature":"edges","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"LeftPort","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"lhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"RightPort","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"rhsDir","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}},{"$type":"Keyword","value":":"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Arrow","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Assignment","feature":"lhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"--"},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Group","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"group"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Service","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"service"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@28"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@29"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Junction","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"junction"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Edge","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"lhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"ARROW_DIRECTION","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"L"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"R"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"T"}}]},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"B"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_GROUP","definition":{"$type":"RegexToken","regex":"/\\\\{group\\\\}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARROW_INTO","definition":{"$type":"RegexToken","regex":"/<|>/"},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@18"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@19"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|\'([^\'\\\\\\\\]|\\\\\\\\.)*\'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"ARCH_ICON","definition":{"$type":"RegexToken","regex":"/\\\\([\\\\w-:]+\\\\)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TITLE","definition":{"$type":"RegexToken","regex":"/\\\\[[\\\\w ]+\\\\]/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}')),"ArchitectureGrammar"),ie=m(()=>H??(H=d('{"$type":"Grammar","isDeclared":true,"name":"GitGraph","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"Keyword","value":":"}]},{"$type":"Keyword","value":"gitGraph:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"gitGraph"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Direction","definition":{"$type":"Assignment","feature":"dir","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"LR"},{"$type":"Keyword","value":"TB"},{"$type":"Keyword","value":"BT"}]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Commit","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"commit"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Branch","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"branch"},{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Merge","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"merge"},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"type:"},{"$type":"Assignment","feature":"type","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"NORMAL"},{"$type":"Keyword","value":"REVERSE"},{"$type":"Keyword","value":"HIGHLIGHT"}]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Checkout","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"checkout"},{"$type":"Keyword","value":"switch"}]},{"$type":"Assignment","feature":"branch","operator":"=","terminal":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@24"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"CherryPicking","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"cherry-pick"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@14"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|\'([^\'\\\\\\\\]|\\\\\\\\.)*\'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false},{"$type":"TerminalRule","name":"REFERENCE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\\\w([-\\\\./\\\\w]*[-\\\\w])?/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"interfaces":[],"types":[],"usedGrammars":[]}')),"GitGraphGrammar"),se=m(()=>W??(W=d('{"$type":"Grammar","isDeclared":true,"name":"Radar","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":"radar-beta:"},{"$type":"Group","elements":[{"$type":"Keyword","value":"radar-beta"},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Label","definition":{"$type":"Group","elements":[{"$type":"Keyword","value":"["},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}},{"$type":"Keyword","value":"]"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Axis","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Curve","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Keyword","value":"}"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"Entries","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@2"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Option","definition":{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"showLegend"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"ticks"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"max"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"min"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"Keyword","value":"graticule"}},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"GRATICULE","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"circle"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"polygon"}}]},"fragment":false,"hidden":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"FLOAT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+\\\\.[0-9]+(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/0|[1-9][0-9]*(?!\\\\.)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@15"}},{"$type":"TerminalRuleCall","rule":{"$ref":"#/rules@16"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/\\"([^\\"\\\\\\\\]|\\\\\\\\.)*\\"|\'([^\'\\\\\\\\]|\\\\\\\\.)*\'/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[\\\\w]([-\\\\w]*\\\\w)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WHITESPACE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"YAML","definition":{"$type":"RegexToken","regex":"/---[\\\\t ]*\\\\r?\\\\n(?:[\\\\S\\\\s]*?\\\\r?\\\\n)?---(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"DIRECTIVE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%{[\\\\S\\\\s]*?}%%(?:\\\\r?\\\\n|(?!\\\\S))/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"SINGLE_LINE_COMMENT","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*%%[^\\\\n\\\\r]*/"},"fragment":false}],"interfaces":[{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@2"}}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"types":[],"usedGrammars":[]}')),"RadarGrammar"),ae=m(()=>z??(z=d('{"$type":"Grammar","isDeclared":true,"name":"Treemap","rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"BOOLEAN","type":{"$type":"ReturnType","name":"boolean"},"definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"true"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"false"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_DESCR","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accDescr(?:[\\\\t ]*:([^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)|\\\\s*{([^}]*)})/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ACC_TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*accTitle[\\\\t ]*:(?:[^\\\\n\\\\r]*?(?=%%)|[^\\\\n\\\\r]*)/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"TITLE","definition":{"$type":"RegexToken","regex":"/[\\\\t ]*title(?:[\\\\t ][^\\\\n\\\\r]*?(?=%%)|[\\\\t ][^\\\\n\\\\r]*|)/"},"fragment":false,"hidden":false},{"$type":"ParserRule","entry":true,"name":"Treemap","returnType":{"$ref":"#/interfaces@4"},"definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[]},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"TreemapRows","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]}}],"cardinality":"*"}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"TREEMAP_KEYWORD","definition":{"$type":"TerminalAlternatives","elements":[{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap-beta"}},{"$type":"CharacterRange","left":{"$type":"Keyword","value":"treemap"}}]},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"CLASS_DEF","definition":{"$type":"RegexToken","regex":"/classDef\\\\s+([a-zA-Z_][a-zA-Z0-9_]+)(?:\\\\s+([^;\\\\r\\\\n]*))?(?:;)?/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STYLE_SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":::"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"SEPARATOR","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":":"}},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"COMMA","definition":{"$type":"CharacterRange","left":{"$type":"Keyword","value":","}},"fragment":false,"hidden":false},{"$type":"TerminalRule","hidden":true,"name":"WS","definition":{"$type":"RegexToken","regex":"/[ \\\\t]+/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"ML_COMMENT","definition":{"$type":"RegexToken","regex":"/\\\\%\\\\%[^\\\\n]*/"},"fragment":false},{"$type":"TerminalRule","hidden":true,"name":"NL","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"fragment":false},{"$type":"ParserRule","name":"TreemapRow","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"indent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"item","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"ClassDef","dataType":"string","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@7"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Item","returnType":{"$ref":"#/interfaces@0"},"definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Section","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Leaf","returnType":{"$ref":"#/interfaces@2"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"name","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@23"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[],"cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@22"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]},{"$type":"Assignment","feature":"classSelector","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}],"cardinality":"?"}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INDENTATION","definition":{"$type":"RegexToken","regex":"/[ \\\\t]{1,}/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ID2","definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9_]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"NUMBER2","definition":{"$type":"RegexToken","regex":"/[0-9_\\\\.\\\\,]+/"},"fragment":false,"hidden":false},{"$type":"ParserRule","name":"MyNumber","dataType":"number","definition":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"STRING2","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|\'[^\']*\'/"},"fragment":false,"hidden":false}],"interfaces":[{"$type":"Interface","name":"Item","attributes":[{"$type":"TypeAttribute","name":"name","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"classSelector","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Section","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[]},{"$type":"Interface","name":"Leaf","superTypes":[{"$ref":"#/interfaces@0"}],"attributes":[{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}]},{"$type":"Interface","name":"ClassDefStatement","attributes":[{"$type":"TypeAttribute","name":"className","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false},{"$type":"TypeAttribute","name":"styleText","type":{"$type":"SimpleType","primitiveType":"string"},"isOptional":false}],"superTypes":[]},{"$type":"Interface","name":"Treemap","attributes":[{"$type":"TypeAttribute","name":"TreemapRows","type":{"$type":"ArrayType","elementType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@14"}}},"isOptional":false},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[],"$comment":"/**\\n * Treemap grammar for Langium\\n * Converted from mindmap grammar\\n *\\n * The ML_COMMENT and NL hidden terminals handle whitespace, comments, and newlines\\n * before the treemap keyword, allowing for empty lines and comments before the\\n * treemap declaration.\\n */"}')),"TreemapGrammar"),oe={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},le={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ce={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ue={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},de={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},he={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},fe={languageId:"treemap",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},pe={AstReflection:m(()=>new Z,"AstReflection")},me={Grammar:m(()=>ee(),"Grammar"),LanguageMetaData:m(()=>oe,"LanguageMetaData"),parser:{}},ge={Grammar:m(()=>te(),"Grammar"),LanguageMetaData:m(()=>le,"LanguageMetaData"),parser:{}},ye={Grammar:m(()=>ne(),"Grammar"),LanguageMetaData:m(()=>ce,"LanguageMetaData"),parser:{}},Te={Grammar:m(()=>re(),"Grammar"),LanguageMetaData:m(()=>ue,"LanguageMetaData"),parser:{}},Ae={Grammar:m(()=>ie(),"Grammar"),LanguageMetaData:m(()=>de,"LanguageMetaData"),parser:{}},ve={Grammar:m(()=>se(),"Grammar"),LanguageMetaData:m(()=>he,"LanguageMetaData"),parser:{}},Re={Grammar:m(()=>ae(),"Grammar"),LanguageMetaData:m(()=>fe,"LanguageMetaData"),parser:{}},$e={ACC_DESCR:/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/accTitle[\t ]*:([^\n\r]*)/,TITLE:/title([\t ][^\n\r]*|)/},Ee=class extends h.d{static{m(this,"AbstractMermaidValueConverter")}runConverter(e,t,n){let r=this.runCommonConverter(e,t,n);return void 0===r&&(r=this.runCustomConverter(e,t,n)),void 0===r?super.runConverter(e,t,n):r}runCommonConverter(e,t,n){const r=$e[e.name];if(void 0===r)return;const i=r.exec(t);return null!==i?void 0!==i[1]?i[1].trim().replace(/[\t ]{2,}/gm," "):void 0!==i[2]?i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,"\n"):void 0:void 0}},ke=class extends Ee{static{m(this,"CommonValueConverter")}runCustomConverter(e,t,n){}},xe=class extends f.Q{static{m(this,"AbstractMermaidTokenBuilder")}constructor(e){super(),this.keywords=new Set(e)}buildKeywordTokens(e,t,n){const r=super.buildKeywordTokens(e,t,n);return r.forEach(e=>{this.keywords.has(e.name)&&void 0!==e.PATTERN&&(e.PATTERN=new RegExp(e.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))}),r}};(class extends xe{static{m(this,"CommonTokenBuilder")}})},64350:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(98020);const i=function(e){return(0,r.A)(e,4)}},64561:(e,t,n)=>{n.d(t,{DM:()=>p,OP:()=>m,SD:()=>a,Uo:()=>d,VN:()=>u,XG:()=>o,YE:()=>l,cQ:()=>c,jm:()=>h});var r=n(64913),i=n(93897),s=n(67567);function a(e){for(const[t,n]of Object.entries(e))t.startsWith("$")||(Array.isArray(n)?n.forEach((n,i)=>{(0,r.ng)(n)&&(n.$container=e,n.$containerProperty=t,n.$containerIndex=i)}):(0,r.ng)(n)&&(n.$container=e,n.$containerProperty=t))}function o(e,t){let n=e;for(;n;){if(t(n))return n;n=n.$container}}function l(e){const t=c(e).$document;if(!t)throw new Error("AST node has no document.");return t}function c(e){for(;e.$container;)e=e.$container;return e}function u(e,t){if(!e)throw new Error("Node must be an AstNode.");const n=null==t?void 0:t.range;return new i.fq(()=>({keys:Object.keys(e),keyIndex:0,arrayIndex:0}),t=>{for(;t.keyIndex<t.keys.length;){const i=t.keys[t.keyIndex];if(!i.startsWith("$")){const s=e[i];if((0,r.ng)(s)){if(t.keyIndex++,f(s,n))return{done:!1,value:s}}else if(Array.isArray(s)){for(;t.arrayIndex<s.length;){const e=s[t.arrayIndex++];if((0,r.ng)(e)&&f(e,n))return{done:!1,value:e}}t.arrayIndex=0}}t.keyIndex++}return i.Rf})}function d(e,t){if(!e)throw new Error("Root node must be an AstNode.");return new i.Vj(e,e=>u(e,t))}function h(e,t){if(!e)throw new Error("Root node must be an AstNode.");return(null==t?void 0:t.range)&&!f(e,t.range)?new i.Vj(e,()=>[]):new i.Vj(e,e=>u(e,t),{includeRoot:!0})}function f(e,t){var n;if(!t)return!0;const r=null===(n=e.$cstNode)||void 0===n?void 0:n.range;return!!r&&(0,s.r4)(r,t)}function p(e){return new i.fq(()=>({keys:Object.keys(e),keyIndex:0,arrayIndex:0}),t=>{for(;t.keyIndex<t.keys.length;){const n=t.keys[t.keyIndex];if(!n.startsWith("$")){const i=e[n];if((0,r.A_)(i))return t.keyIndex++,{done:!1,value:{reference:i,container:e,property:n}};if(Array.isArray(i)){for(;t.arrayIndex<i.length;){const s=t.arrayIndex++,a=i[s];if((0,r.A_)(a))return{done:!1,value:{reference:a,container:e,property:n,index:s}}}t.arrayIndex=0}}t.keyIndex++}return i.Rf})}function m(e,t){const n=e.getTypeMetaData(t.$type),r=t;for(const i of n.properties)void 0!==i.defaultValue&&void 0===r[i.name]&&(r[i.name]=g(i.defaultValue))}function g(e){return Array.isArray(e)?[...e.map(g)]:e}},64620:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(49759),i=n(72185);const s=function(e,t){return(0,r.A)((0,i.A)(e,t),1)}},64913:(e,t,n)=>{function r(e){return"object"==typeof e&&null!==e&&"string"==typeof e.$type}function i(e){return"object"==typeof e&&null!==e&&"string"==typeof e.$refText}function s(e){return"object"==typeof e&&null!==e&&"string"==typeof e.name&&"string"==typeof e.type&&"string"==typeof e.path}function a(e){return"object"==typeof e&&null!==e&&r(e.container)&&i(e.reference)&&"string"==typeof e.message}n.d(t,{A_:()=>i,FC:()=>c,Nr:()=>s,Zl:()=>a,br:()=>u,kD:()=>o,mD:()=>l,ng:()=>r});class o{constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,t){return r(e)&&this.isSubtype(e.$type,t)}isSubtype(e,t){if(e===t)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});const r=n[t];if(void 0!==r)return r;{const r=this.computeIsSubtype(e,t);return n[t]=r,r}}getAllSubTypes(e){const t=this.allSubtypes[e];if(t)return t;{const t=this.getAllTypes(),n=[];for(const r of t)this.isSubtype(r,e)&&n.push(r);return this.allSubtypes[e]=n,n}}}function l(e){return"object"==typeof e&&null!==e&&Array.isArray(e.content)}function c(e){return"object"==typeof e&&null!==e&&"object"==typeof e.tokenType}function u(e){return l(e)&&"string"==typeof e.fullText}},67567:(e,t,n)=>{n.d(t,{El:()=>d,NS:()=>a,SX:()=>c,pO:()=>o,r4:()=>u,v:()=>h,wf:()=>l});var r,i=n(64913),s=n(93897);function a(e){return new s.Vj(e,e=>(0,i.mD)(e)?e.content:[],{includeRoot:!0})}function o(e,t){for(;e.container;)if((e=e.container)===t)return!0;return!1}function l(e){return{start:{character:e.startColumn-1,line:e.startLine-1},end:{character:e.endColumn,line:e.endLine-1}}}function c(e){if(!e)return;const{offset:t,end:n,range:r}=e;return{range:r,offset:t,end:n,length:n-t}}function u(e,t){const n=function(e,t){if(e.end.line<t.start.line||e.end.line===t.start.line&&e.end.character<=t.start.character)return r.Before;if(e.start.line>t.end.line||e.start.line===t.end.line&&e.start.character>=t.end.character)return r.After;const n=e.start.line>t.start.line||e.start.line===t.start.line&&e.start.character>=t.start.character,i=e.end.line<t.end.line||e.end.line===t.end.line&&e.end.character<=t.end.character;return n&&i?r.Inside:n?r.OverlapBack:i?r.OverlapFront:r.Outside}(e,t);return n>r.After}!function(e){e[e.Before=0]="Before",e[e.After=1]="After",e[e.OverlapFront=2]="OverlapFront",e[e.OverlapBack=3]="OverlapBack",e[e.Inside=4]="Inside",e[e.Outside=5]="Outside"}(r||(r={}));const d=/^[\w\p{L}]$/u;function h(e,t){if(e){const n=function(e,t=!0){for(;e.container;){const n=e.container;let r=n.content.indexOf(e);for(;r>0;){r--;const e=n.content[r];if(t||!e.hidden)return e}e=n}return}(e,!0);if(n&&f(n,t))return n;if((0,i.br)(e)){for(let n=e.content.findIndex(e=>!e.hidden)-1;n>=0;n--){const r=e.content[n];if(f(r,t))return r}}}}function f(e,t){return(0,i.FC)(e)&&t.includes(e.tokenType.name)}},71159:(e,t,n)=>{n.d(t,{A:()=>u});var r=n(80499),i=n(63406),s=n(60870),a=n(31408),o=n(49084),l=n(31528);const c=function(e,t,n,r){if(!(0,o.A)(e))return e;for(var c=-1,u=(t=(0,s.A)(t,e)).length,d=u-1,h=e;null!=h&&++c<u;){var f=(0,l.A)(t[c]),p=n;if("__proto__"===f||"constructor"===f||"prototype"===f)return e;if(c!=d){var m=h[f];void 0===(p=r?r(m,f,h):void 0)&&(p=(0,o.A)(m)?m:(0,a.A)(t[c+1])?[]:{})}(0,i.A)(h,f,p),h=h[f]}return e};const u=function(e,t,n){for(var i=-1,a=t.length,o={};++i<a;){var l=t[i],u=(0,r.A)(e,l);n(u,l)&&c(o,(0,s.A)(l,e),u)}return o}},72185:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(22663),i=n(76095),s=n(31361),a=n(95526);const o=function(e,t){return((0,a.A)(e)?r.A:s.A)(e,(0,i.A)(t,3))}},73311:(e,t,n)=>{n.d(t,{d:()=>f});var r=n(60349),i=n(96103),s=n(95846),a=n(8158),o=class extends r.mR{static{(0,r.K2)(this,"TreemapTokenBuilder")}constructor(){super(["treemap"])}},l=/classDef\s+([A-Z_a-z]\w+)(?:\s+([^\n\r;]*))?;?/,c=class extends r.dg{static{(0,r.K2)(this,"TreemapValueConverter")}runCustomConverter(e,t,n){if("NUMBER2"===e.name)return parseFloat(t.replace(/,/g,""));if("SEPARATOR"===e.name)return t.substring(1,t.length-1);if("STRING2"===e.name)return t.substring(1,t.length-1);if("INDENTATION"===e.name)return t.length;if("ClassDef"===e.name){if("string"!=typeof t)return t;const e=l.exec(t);if(e)return{$type:"ClassDefStatement",className:e[1],styleText:e[2]||void 0}}}};function u(e){const t=e.validation.TreemapValidator,n=e.validation.ValidationRegistry;if(n){const e={Treemap:t.checkSingleRoot.bind(t)};n.register(e,t)}}(0,r.K2)(u,"registerValidationChecks");var d=class{static{(0,r.K2)(this,"TreemapValidator")}checkSingleRoot(e,t){let n;for(const r of e.TreemapRows)r.item&&(void 0===n&&void 0===r.indent?n=0:(void 0===r.indent||void 0!==n&&n>=parseInt(r.indent,10))&&t("error","Multiple root nodes are not allowed in a treemap.",{node:r,property:"item"}))}},h={parser:{TokenBuilder:(0,r.K2)(()=>new o,"TokenBuilder"),ValueConverter:(0,r.K2)(()=>new c,"ValueConverter")},validation:{TreemapValidator:(0,r.K2)(()=>new d,"TreemapValidator")}};function f(e=i.D){const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.eV,h);return t.ServiceRegistry.register(n),u(n),{shared:t,Treemap:n}}(0,r.K2)(f,"createTreemapServices")},77109:(e,t,n)=>{n.d(t,{S:()=>u});var r=n(60349),i=n(96103),s=n(95846),a=n(8158),o=class extends r.mR{static{(0,r.K2)(this,"ArchitectureTokenBuilder")}constructor(){super(["architecture"])}},l=class extends r.dg{static{(0,r.K2)(this,"ArchitectureValueConverter")}runCustomConverter(e,t,n){return"ARCH_ICON"===e.name?t.replace(/[()]/g,"").trim():"ARCH_TEXT_ICON"===e.name?t.replace(/["()]/g,""):"ARCH_TITLE"===e.name?t.replace(/[[\]]/g,"").trim():void 0}},c={parser:{TokenBuilder:(0,r.K2)(()=>new o,"TokenBuilder"),ValueConverter:(0,r.K2)(()=>new l,"ValueConverter")}};function u(e=i.D){const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.jE,c);return t.ServiceRegistry.register(n),{shared:t,Architecture:n}}(0,r.K2)(u,"createArchitectureServices")},78137:(e,t)=>{function n(e){return"string"==typeof e||e instanceof String}function r(e){return Array.isArray(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.stringArray=t.array=t.func=t.error=t.number=t.string=t.boolean=void 0,t.boolean=function(e){return!0===e||!1===e},t.string=n,t.number=function(e){return"number"==typeof e||e instanceof Number},t.error=function(e){return e instanceof Error},t.func=function(e){return"function"==typeof e},t.array=r,t.stringArray=function(e){return r(e)&&e.every(e=>n(e))}},81066:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(97001);const i=function(e){var t=(0,r.A)(e),n=t%1;return t==t?n?t-n:t:0}},89212:(e,t,n)=>{n.d(t,{Q:()=>c});var r=n(38817),i=n(34813),s=n(64561),a=n(29520),o=n(49948),l=n(93897);class c{constructor(){this.diagnostics=[]}buildTokens(e,t){const n=(0,l.Td)((0,a.YV)(e,!1)),r=this.buildTerminalTokens(n),i=this.buildKeywordTokens(n,r,t);return r.forEach(e=>{const t=e.PATTERN;"object"==typeof t&&t&&"test"in t&&(0,o.Yv)(t)?i.unshift(e):i.push(e)}),i}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){const e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(i.rE).filter(e=>!e.fragment).map(e=>this.buildTerminalToken(e)).toArray()}buildTerminalToken(e){const t=(0,a.S)(e),n=this.requiresCustomPattern(t)?this.regexPatternFunction(t):t,i={name:e.name,PATTERN:n};return"function"==typeof n&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=(0,o.Yv)(t)?r.JG.SKIPPED:"hidden"),i}requiresCustomPattern(e){return!(!e.flags.includes("u")&&!e.flags.includes("s"))||!(!e.source.includes("?<=")&&!e.source.includes("?<!"))}regexPatternFunction(e){const t=new RegExp(e,e.flags+"y");return(e,n)=>{t.lastIndex=n;return t.exec(e)}}buildKeywordTokens(e,t,n){return e.filter(i.s7).flatMap(e=>(0,s.Uo)(e).filter(i.wb)).distinct(e=>e.value).toArray().sort((e,t)=>t.value.length-e.value.length).map(e=>this.buildKeywordToken(e,t,Boolean(null==n?void 0:n.caseInsensitive)))}buildKeywordToken(e,t,n){const r=this.buildKeywordPattern(e,n),i={name:e.value,PATTERN:r,LONGER_ALT:this.findLongerAlt(e,t)};return"function"==typeof r&&(i.LINE_BREAKS=!0),i}buildKeywordPattern(e,t){return t?new RegExp((0,o.Ao)(e.value)):e.value}findLongerAlt(e,t){return t.reduce((t,n)=>{const r=null==n?void 0:n.PATTERN;return(null==r?void 0:r.source)&&(0,o.PC)("^"+r.source+"$",e.value)&&t.push(n),t},[])}}},93897:(e,t,n)=>{n.d(t,{B5:()=>a,Rf:()=>o,Td:()=>l,Vj:()=>c,fq:()=>r,iD:()=>u});class r{constructor(e,t){this.startFn=e,this.nextFn=t}iterator(){const e={state:this.startFn(),next:()=>this.nextFn(e.state),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){const e=this.iterator();return Boolean(e.next().done)}count(){const e=this.iterator();let t=0,n=e.next();for(;!n.done;)t++,n=e.next();return t}toArray(){const e=[],t=this.iterator();let n;do{n=t.next(),void 0!==n.value&&e.push(n.value)}while(!n.done);return e}toSet(){return new Set(this)}toMap(e,t){const n=this.map(n=>[e?e(n):n,t?t(n):n]);return new Map(n)}toString(){return this.join()}concat(e){return new r(()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()}),e=>{let t;if(!e.firstDone){do{if(t=this.nextFn(e.first),!t.done)return t}while(!t.done);e.firstDone=!0}do{if(t=e.iterator.next(),!t.done)return t}while(!t.done);return o})}join(e=","){const t=this.iterator();let n,r="",s=!1;do{n=t.next(),n.done||(s&&(r+=e),r+=i(n.value)),s=!0}while(!n.done);return r}indexOf(e,t=0){const n=this.iterator();let r=0,i=n.next();for(;!i.done;){if(r>=t&&i.value===e)return r;i=n.next(),r++}return-1}every(e){const t=this.iterator();let n=t.next();for(;!n.done;){if(!e(n.value))return!1;n=t.next()}return!0}some(e){const t=this.iterator();let n=t.next();for(;!n.done;){if(e(n.value))return!0;n=t.next()}return!1}forEach(e){const t=this.iterator();let n=0,r=t.next();for(;!r.done;)e(r.value,n),r=t.next(),n++}map(e){return new r(this.startFn,t=>{const{done:n,value:r}=this.nextFn(t);return n?o:{done:!1,value:e(r)}})}filter(e){return new r(this.startFn,t=>{let n;do{if(n=this.nextFn(t),!n.done&&e(n.value))return n}while(!n.done);return o})}nonNullable(){return this.filter(e=>null!=e)}reduce(e,t){const n=this.iterator();let r=t,i=n.next();for(;!i.done;)r=void 0===r?i.value:e(r,i.value),i=n.next();return r}reduceRight(e,t){return this.recursiveReduce(this.iterator(),e,t)}recursiveReduce(e,t,n){const r=e.next();if(r.done)return n;const i=this.recursiveReduce(e,t,n);return void 0===i?r.value:t(i,r.value)}find(e){const t=this.iterator();let n=t.next();for(;!n.done;){if(e(n.value))return n.value;n=t.next()}}findIndex(e){const t=this.iterator();let n=0,r=t.next();for(;!r.done;){if(e(r.value))return n;r=t.next(),n++}return-1}includes(e){const t=this.iterator();let n=t.next();for(;!n.done;){if(n.value===e)return!0;n=t.next()}return!1}flatMap(e){return new r(()=>({this:this.startFn()}),t=>{do{if(t.iterator){const e=t.iterator.next();if(!e.done)return e;t.iterator=void 0}const{done:n,value:r}=this.nextFn(t.this);if(!n){const n=e(r);if(!s(n))return{done:!1,value:n};t.iterator=n[Symbol.iterator]()}}while(t.iterator);return o})}flat(e){if(void 0===e&&(e=1),e<=0)return this;const t=e>1?this.flat(e-1):this;return new r(()=>({this:t.startFn()}),e=>{do{if(e.iterator){const t=e.iterator.next();if(!t.done)return t;e.iterator=void 0}const{done:n,value:r}=t.nextFn(e.this);if(!n){if(!s(r))return{done:!1,value:r};e.iterator=r[Symbol.iterator]()}}while(e.iterator);return o})}head(){const e=this.iterator().next();if(!e.done)return e.value}tail(e=1){return new r(()=>{const t=this.startFn();for(let n=0;n<e;n++){if(this.nextFn(t).done)return t}return t},this.nextFn)}limit(e){return new r(()=>({size:0,state:this.startFn()}),t=>(t.size++,t.size>e?o:this.nextFn(t.state)))}distinct(e){return new r(()=>({set:new Set,internalState:this.startFn()}),t=>{let n;do{if(n=this.nextFn(t.internalState),!n.done){const r=e?e(n.value):n.value;if(!t.set.has(r))return t.set.add(r),n}}while(!n.done);return o})}exclude(e,t){const n=new Set;for(const r of e){const e=t?t(r):r;n.add(e)}return this.filter(e=>{const r=t?t(e):e;return!n.has(r)})}}function i(e){return"string"==typeof e?e:void 0===e?"undefined":"function"==typeof e.toString?e.toString():Object.prototype.toString.call(e)}function s(e){return!!e&&"function"==typeof e[Symbol.iterator]}const a=new r(()=>{},()=>o),o=Object.freeze({done:!0,value:void 0});function l(...e){if(1===e.length){const t=e[0];if(t instanceof r)return t;if(s(t))return new r(()=>t[Symbol.iterator](),e=>e.next());if("number"==typeof t.length)return new r(()=>({index:0}),e=>e.index<t.length?{done:!1,value:t[e.index++]}:o)}return e.length>1?new r(()=>({collIndex:0,arrIndex:0}),t=>{do{if(t.iterator){const e=t.iterator.next();if(!e.done)return e;t.iterator=void 0}if(t.array){if(t.arrIndex<t.array.length)return{done:!1,value:t.array[t.arrIndex++]};t.array=void 0,t.arrIndex=0}if(t.collIndex<e.length){const n=e[t.collIndex++];s(n)?t.iterator=n[Symbol.iterator]():n&&"number"==typeof n.length&&(t.array=n)}}while(t.iterator||t.array||t.collIndex<e.length);return o}):a}class c extends r{constructor(e,t,n){super(()=>({iterators:(null==n?void 0:n.includeRoot)?[[e][Symbol.iterator]()]:[t(e)[Symbol.iterator]()],pruned:!1}),e=>{for(e.pruned&&(e.iterators.pop(),e.pruned=!1);e.iterators.length>0;){const n=e.iterators[e.iterators.length-1].next();if(!n.done)return e.iterators.push(t(n.value)[Symbol.iterator]()),n;e.iterators.pop()}return o})}iterator(){const e={state:this.startFn(),next:()=>this.nextFn(e.state),prune:()=>{e.state.pruned=!0},[Symbol.iterator]:()=>e};return e}}var u;!function(e){e.sum=function(e){return e.reduce((e,t)=>e+t,0)},e.product=function(e){return e.reduce((e,t)=>e*t,0)},e.min=function(e){return e.reduce((e,t)=>Math.min(e,t))},e.max=function(e){return e.reduce((e,t)=>Math.max(e,t))}}(u||(u={}))},95846:(e,t,n)=>{var r;function i(e,t,n,r,i,s,o,l,u){return a([e,t,n,r,i,s,o,l,u].reduce(c,{}))}n.d(t,{WQ:()=>i}),function(e){e.merge=(e,t)=>c(c({},e),t)}(r||(r={}));const s=Symbol("isProxy");function a(e,t){const n=new Proxy({},{deleteProperty:()=>!1,set:()=>{throw new Error("Cannot set property on injected service container")},get:(r,i)=>i===s||l(r,i,e,t||n),getOwnPropertyDescriptor:(r,i)=>(l(r,i,e,t||n),Object.getOwnPropertyDescriptor(r,i)),has:(t,n)=>n in e,ownKeys:()=>[...Object.getOwnPropertyNames(e)]});return n}const o=Symbol();function l(e,t,n,r){if(t in e){if(e[t]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:e[t]});if(e[t]===o)throw new Error('Cycle detected. Please make "'+String(t)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return e[t]}if(t in n){const s=n[t];e[t]=o;try{e[t]="function"==typeof s?s(r):a(s,r)}catch(i){throw e[t]=i instanceof Error?i:void 0,i}return e[t]}}function c(e,t){if(t)for(const[n,r]of Object.entries(t))if(void 0!==r){const t=e[n];e[n]=null!==t&&null!==r&&"object"==typeof t&&"object"==typeof r?c(t,r):r}return e}},96103:(e,t,n)=>{n.d(t,{D:()=>i});class r{readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}}const i={fileSystemProvider:()=>new r}},97001:(e,t,n)=>{n.d(t,{A:()=>m});var r=/\s/;const i=function(e){for(var t=e.length;t--&&r.test(e.charAt(t)););return t};var s=/^\s+/;const a=function(e){return e?e.slice(0,i(e)+1).replace(s,""):e};var o=n(49084),l=n(13027),c=/^[-+]0x[0-9a-f]+$/i,u=/^0b[01]+$/i,d=/^0o[0-7]+$/i,h=parseInt;const f=function(e){if("number"==typeof e)return e;if((0,l.A)(e))return NaN;if((0,o.A)(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=(0,o.A)(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=a(e);var n=u.test(e);return n||d.test(e)?h(e.slice(2),n?2:8):c.test(e)?NaN:+e};var p=1/0;const m=function(e){return e?(e=f(e))===p||e===-1/0?17976931348623157e292*(e<0?-1:1):e==e?e:0:0===e?e:0}},99339:(e,t,n)=>{n.d(t,{qg:()=>a});n(50249),n(23741),n(12345),n(21963),n(77109),n(46018),n(73311);var r=n(60349),i={},s={info:(0,r.K2)(async()=>{const{createInfoServices:e}=await n.e(6007).then(n.bind(n,6007)),t=e().Info.parser.LangiumParser;i.info=t},"info"),packet:(0,r.K2)(async()=>{const{createPacketServices:e}=await n.e(9130).then(n.bind(n,99130)),t=e().Packet.parser.LangiumParser;i.packet=t},"packet"),pie:(0,r.K2)(async()=>{const{createPieServices:e}=await n.e(2400).then(n.bind(n,72400)),t=e().Pie.parser.LangiumParser;i.pie=t},"pie"),architecture:(0,r.K2)(async()=>{const{createArchitectureServices:e}=await n.e(8055).then(n.bind(n,98055)),t=e().Architecture.parser.LangiumParser;i.architecture=t},"architecture"),gitGraph:(0,r.K2)(async()=>{const{createGitGraphServices:e}=await n.e(4852).then(n.bind(n,64852)),t=e().GitGraph.parser.LangiumParser;i.gitGraph=t},"gitGraph"),radar:(0,r.K2)(async()=>{const{createRadarServices:e}=await n.e(8132).then(n.bind(n,98132)),t=e().Radar.parser.LangiumParser;i.radar=t},"radar"),treemap:(0,r.K2)(async()=>{const{createTreemapServices:e}=await n.e(7306).then(n.bind(n,57306)),t=e().Treemap.parser.LangiumParser;i.treemap=t},"treemap")};async function a(e,t){const n=s[e];if(!n)throw new Error(`Unknown diagram type: ${e}`);i[e]||await n();const r=i[e].parse(t);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new o(r);return r.value}(0,r.K2)(a,"parse");var o=class extends Error{constructor(e){super(`Parsing failed: ${e.lexerErrors.map(e=>e.message).join("\n")} ${e.parserErrors.map(e=>e.message).join("\n")}`),this.result=e}static{(0,r.K2)(this,"MermaidParseError")}}}}]); \ No newline at end of file diff --git a/assets/js/9402.3e4174f5.js b/assets/js/9402.3e4174f5.js new file mode 100644 index 0000000000..4a6e79d8dd --- /dev/null +++ b/assets/js/9402.3e4174f5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9402],{19402:(e,t,r)=>{r.d(t,{default:()=>rn});class a{constructor(e,t,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=t,this.end=r}static range(e,t){return t?e&&e.loc&&t.loc&&e.loc.lexer===t.loc.lexer?new a(e.loc.lexer,e.loc.start,t.loc.end):null:e&&e.loc}}class n{constructor(e,t){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=t}range(e,t){return new n(t,a.range(this,e))}}class i{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var r,a,n="KaTeX parse error: "+e,o=t&&t.loc;if(o&&o.start<=o.end){var s=o.lexer.input;r=o.start,a=o.end,r===s.length?n+=" at end of input: ":n+=" at position "+(r+1)+": ";var l=s.slice(r,a).replace(/[^]/g,"$&\u0332");n+=(r>15?"\u2026"+s.slice(r-15,r):s.slice(0,r))+l+(a+15<s.length?s.slice(a,a+15)+"\u2026":s.slice(a))}var h=new Error(n);return h.name="ParseError",h.__proto__=i.prototype,h.position=r,null!=r&&null!=a&&(h.length=a-r),h.rawMessage=e,h}}i.prototype.__proto__=Error.prototype;var o=/([A-Z])/g,s={"&":"&",">":">","<":"<",'"':""","'":"'"},l=/[&><"']/g;var h=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},m={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(l,e=>s[e])},hyphenate:function(e){return e.replace(o,"-$1").toLowerCase()},getBaseElem:h,isCharacterBox:function(e){var t=h(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"}},c={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format <type>"},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color <color>",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro <def>",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness <size>",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size <n>",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand <n>",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function p(e){if(e.default)return e.default;var t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!=typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}class u{constructor(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},c)if(c.hasOwnProperty(t)){var r=c[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:p(r)}}reportNonstrict(e,t,r){var a=this.strict;if("function"==typeof a&&(a=a(e,t,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new i("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===a?"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){var a=this.strict;if("function"==typeof a)try{a=a(e,t,r)}catch(n){a="error"}return!(!a||"ignore"===a)&&(!0===a||"error"===a||("warn"===a?("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!=typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]"),!1)))}isTrusted(e){if(e.url&&!e.protocol){var t=m.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}var r="function"==typeof this.trust?this.trust(e):this.trust;return Boolean(r)}}class d{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return g[f[this.id]]}sub(){return g[v[this.id]]}fracNum(){return g[b[this.id]]}fracDen(){return g[y[this.id]]}cramp(){return g[x[this.id]]}text(){return g[w[this.id]]}isTight(){return this.size>=2}}var g=[new d(0,0,!1),new d(1,0,!0),new d(2,1,!1),new d(3,1,!0),new d(4,2,!1),new d(5,2,!0),new d(6,3,!1),new d(7,3,!0)],f=[4,5,4,5,6,7,6,7],v=[5,5,5,5,7,7,7,7],b=[2,3,4,5,6,7,6,7],y=[3,3,5,5,7,7,7,7],x=[1,1,3,3,5,5,7,7],w=[0,1,2,3,2,3,2,3],k={DISPLAY:g[0],TEXT:g[2],SCRIPT:g[4],SCRIPTSCRIPT:g[6]},S=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var M=[];function z(e){for(var t=0;t<M.length;t+=2)if(e>=M[t]&&e<=M[t+1])return!0;return!1}S.forEach(e=>e.blocks.forEach(e=>M.push(...e)));var A=80,T={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class B{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return m.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),t=0;t<this.children.length;t++)e.appendChild(this.children[t].toNode());return e}toMarkup(){for(var e="",t=0;t<this.children.length;t++)e+=this.children[t].toMarkup();return e}toText(){return this.children.map(e=>e.toText()).join("")}}var C={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},N={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},q={"\xc5":"A","\xd0":"D","\xde":"o","\xe5":"a","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function I(e,t,r){if(!C[t])throw new Error("Font metrics not found for font: "+t+".");var a=e.charCodeAt(0),n=C[t][a];if(!n&&e[0]in q&&(a=q[e[0]].charCodeAt(0),n=C[t][a]),n||"text"!==r||z(a)&&(n=C[t][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var R={};var H=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],O=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],E=function(e,t){return t.size<2?e:H[e-1][t.size-1]};class L{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||L.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=O[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new L(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:E(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:O[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=E(L.BASESIZE,e);return this.size===t&&this.textSize===L.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==L.BASESIZE?["sizing","reset-size"+this.size,"size"+L.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=function(e){var t;if(!R[t=e>=5?0:e>=3?1:2]){var r=R[t]={cssEmPerMu:N.quad[t]/18};for(var a in N)N.hasOwnProperty(a)&&(r[a]=N[a][t])}return R[t]}(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}L.BASESIZE=6;var D={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},V={ex:!0,em:!0,mu:!0},P=function(e){return"string"!=typeof e&&(e=e.unit),e in D||e in V||"ex"===e},F=function(e,t){var r;if(e.unit in D)r=D[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var a;if(a=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=a.fontMetrics().xHeight;else{if("em"!==e.unit)throw new i("Invalid unit: '"+e.unit+"'");r=a.fontMetrics().quad}a!==t&&(r*=a.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},G=function(e){return+e.toFixed(4)+"em"},U=function(e){return e.filter(e=>e).join(" ")},Y=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");var a=t.getColor();a&&(this.style.color=a)}},X=function(e){var t=document.createElement(e);for(var r in t.className=U(this.classes),this.style)this.style.hasOwnProperty(r)&&(t.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&t.setAttribute(a,this.attributes[a]);for(var n=0;n<this.children.length;n++)t.appendChild(this.children[n].toNode());return t},W=/[\s"'>/=\x00-\x1f]/,_=function(e){var t="<"+e;this.classes.length&&(t+=' class="'+m.escape(U(this.classes))+'"');var r="";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=m.hyphenate(a)+":"+this.style[a]+";");for(var n in r&&(t+=' style="'+m.escape(r)+'"'),this.attributes)if(this.attributes.hasOwnProperty(n)){if(W.test(n))throw new i("Invalid attribute name '"+n+"'");t+=" "+n+'="'+m.escape(this.attributes[n])+'"'}t+=">";for(var o=0;o<this.children.length;o++)t+=this.children[o].toMarkup();return t+="</"+e+">"};class j{constructor(e,t,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,Y.call(this,e,r,a),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return m.contains(this.classes,e)}toNode(){return X.call(this,"span")}toMarkup(){return _.call(this,"span")}}class ${constructor(e,t,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,Y.call(this,t,a),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return m.contains(this.classes,e)}toNode(){return X.call(this,"a")}toMarkup(){return _.call(this,"a")}}class Z{constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return m.contains(this.classes,e)}toNode(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){var e='<img src="'+m.escape(this.src)+'" alt="'+m.escape(this.alt)+'"',t="";for(var r in this.style)this.style.hasOwnProperty(r)&&(t+=m.hyphenate(r)+":"+this.style[r]+";");return t&&(e+=' style="'+m.escape(t)+'"'),e+="'/>"}}var K={"\xee":"\u0131\u0302","\xef":"\u0131\u0308","\xed":"\u0131\u0301","\xec":"\u0131\u0300"};class J{constructor(e,t,r,a,n,i,o,s){this.text=void 0,this.height=void 0,this.depth=void 0,this.italic=void 0,this.skew=void 0,this.width=void 0,this.maxFontSize=void 0,this.classes=void 0,this.style=void 0,this.text=e,this.height=t||0,this.depth=r||0,this.italic=a||0,this.skew=n||0,this.width=i||0,this.classes=o||[],this.style=s||{},this.maxFontSize=0;var l=function(e){for(var t=0;t<S.length;t++)for(var r=S[t],a=0;a<r.blocks.length;a++){var n=r.blocks[a];if(e>=n[0]&&e<=n[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=K[this.text])}hasClass(e){return m.contains(this.classes,e)}toNode(){var e=document.createTextNode(this.text),t=null;for(var r in this.italic>0&&((t=document.createElement("span")).style.marginRight=G(this.italic)),this.classes.length>0&&((t=t||document.createElement("span")).className=U(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e}toMarkup(){var e=!1,t="<span";this.classes.length&&(e=!0,t+=' class="',t+=m.escape(U(this.classes)),t+='"');var r="";for(var a in this.italic>0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(a)&&(r+=m.hyphenate(a)+":"+this.style[a]+";");r&&(e=!0,t+=' style="'+m.escape(r)+'"');var n=m.escape(this.text);return e?(t+=">",t+=n,t+="</span>"):n}}class Q{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r<this.children.length;r++)e.appendChild(this.children[r].toNode());return e}toMarkup(){var e='<svg xmlns="http://www.w3.org/2000/svg"';for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&(e+=" "+t+'="'+m.escape(this.attributes[t])+'"');e+=">";for(var r=0;r<this.children.length;r++)e+=this.children[r].toMarkup();return e+="</svg>"}}class ee{constructor(e,t){this.pathName=void 0,this.alternate=void 0,this.pathName=e,this.alternate=t}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","path");return this.alternate?e.setAttribute("d",this.alternate):e.setAttribute("d",T[this.pathName]),e}toMarkup(){return this.alternate?'<path d="'+m.escape(this.alternate)+'"/>':'<path d="'+m.escape(T[this.pathName])+'"/>'}}class te{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e}toMarkup(){var e="<line";for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&(e+=" "+t+'="'+m.escape(this.attributes[t])+'"');return e+="/>"}}function re(e){if(e instanceof J)return e;throw new Error("Expected symbolNode but got "+String(e)+".")}var ae={bin:1,close:1,inner:1,open:1,punct:1,rel:1},ne={"accent-token":1,mathord:1,"op-token":1,spacing:1,textord:1},ie={math:{},text:{}};function oe(e,t,r,a,n,i){ie[e][n]={font:t,group:r,replace:a},i&&a&&(ie[e][a]=ie[e][n])}var se="math",le="text",he="main",me="ams",ce="accent-token",pe="bin",ue="close",de="inner",ge="mathord",fe="op-token",ve="open",be="punct",ye="rel",xe="spacing",we="textord";oe(se,he,ye,"\u2261","\\equiv",!0),oe(se,he,ye,"\u227a","\\prec",!0),oe(se,he,ye,"\u227b","\\succ",!0),oe(se,he,ye,"\u223c","\\sim",!0),oe(se,he,ye,"\u22a5","\\perp"),oe(se,he,ye,"\u2aaf","\\preceq",!0),oe(se,he,ye,"\u2ab0","\\succeq",!0),oe(se,he,ye,"\u2243","\\simeq",!0),oe(se,he,ye,"\u2223","\\mid",!0),oe(se,he,ye,"\u226a","\\ll",!0),oe(se,he,ye,"\u226b","\\gg",!0),oe(se,he,ye,"\u224d","\\asymp",!0),oe(se,he,ye,"\u2225","\\parallel"),oe(se,he,ye,"\u22c8","\\bowtie",!0),oe(se,he,ye,"\u2323","\\smile",!0),oe(se,he,ye,"\u2291","\\sqsubseteq",!0),oe(se,he,ye,"\u2292","\\sqsupseteq",!0),oe(se,he,ye,"\u2250","\\doteq",!0),oe(se,he,ye,"\u2322","\\frown",!0),oe(se,he,ye,"\u220b","\\ni",!0),oe(se,he,ye,"\u221d","\\propto",!0),oe(se,he,ye,"\u22a2","\\vdash",!0),oe(se,he,ye,"\u22a3","\\dashv",!0),oe(se,he,ye,"\u220b","\\owns"),oe(se,he,be,".","\\ldotp"),oe(se,he,be,"\u22c5","\\cdotp"),oe(se,he,we,"#","\\#"),oe(le,he,we,"#","\\#"),oe(se,he,we,"&","\\&"),oe(le,he,we,"&","\\&"),oe(se,he,we,"\u2135","\\aleph",!0),oe(se,he,we,"\u2200","\\forall",!0),oe(se,he,we,"\u210f","\\hbar",!0),oe(se,he,we,"\u2203","\\exists",!0),oe(se,he,we,"\u2207","\\nabla",!0),oe(se,he,we,"\u266d","\\flat",!0),oe(se,he,we,"\u2113","\\ell",!0),oe(se,he,we,"\u266e","\\natural",!0),oe(se,he,we,"\u2663","\\clubsuit",!0),oe(se,he,we,"\u2118","\\wp",!0),oe(se,he,we,"\u266f","\\sharp",!0),oe(se,he,we,"\u2662","\\diamondsuit",!0),oe(se,he,we,"\u211c","\\Re",!0),oe(se,he,we,"\u2661","\\heartsuit",!0),oe(se,he,we,"\u2111","\\Im",!0),oe(se,he,we,"\u2660","\\spadesuit",!0),oe(se,he,we,"\xa7","\\S",!0),oe(le,he,we,"\xa7","\\S"),oe(se,he,we,"\xb6","\\P",!0),oe(le,he,we,"\xb6","\\P"),oe(se,he,we,"\u2020","\\dag"),oe(le,he,we,"\u2020","\\dag"),oe(le,he,we,"\u2020","\\textdagger"),oe(se,he,we,"\u2021","\\ddag"),oe(le,he,we,"\u2021","\\ddag"),oe(le,he,we,"\u2021","\\textdaggerdbl"),oe(se,he,ue,"\u23b1","\\rmoustache",!0),oe(se,he,ve,"\u23b0","\\lmoustache",!0),oe(se,he,ue,"\u27ef","\\rgroup",!0),oe(se,he,ve,"\u27ee","\\lgroup",!0),oe(se,he,pe,"\u2213","\\mp",!0),oe(se,he,pe,"\u2296","\\ominus",!0),oe(se,he,pe,"\u228e","\\uplus",!0),oe(se,he,pe,"\u2293","\\sqcap",!0),oe(se,he,pe,"\u2217","\\ast"),oe(se,he,pe,"\u2294","\\sqcup",!0),oe(se,he,pe,"\u25ef","\\bigcirc",!0),oe(se,he,pe,"\u2219","\\bullet",!0),oe(se,he,pe,"\u2021","\\ddagger"),oe(se,he,pe,"\u2240","\\wr",!0),oe(se,he,pe,"\u2a3f","\\amalg"),oe(se,he,pe,"&","\\And"),oe(se,he,ye,"\u27f5","\\longleftarrow",!0),oe(se,he,ye,"\u21d0","\\Leftarrow",!0),oe(se,he,ye,"\u27f8","\\Longleftarrow",!0),oe(se,he,ye,"\u27f6","\\longrightarrow",!0),oe(se,he,ye,"\u21d2","\\Rightarrow",!0),oe(se,he,ye,"\u27f9","\\Longrightarrow",!0),oe(se,he,ye,"\u2194","\\leftrightarrow",!0),oe(se,he,ye,"\u27f7","\\longleftrightarrow",!0),oe(se,he,ye,"\u21d4","\\Leftrightarrow",!0),oe(se,he,ye,"\u27fa","\\Longleftrightarrow",!0),oe(se,he,ye,"\u21a6","\\mapsto",!0),oe(se,he,ye,"\u27fc","\\longmapsto",!0),oe(se,he,ye,"\u2197","\\nearrow",!0),oe(se,he,ye,"\u21a9","\\hookleftarrow",!0),oe(se,he,ye,"\u21aa","\\hookrightarrow",!0),oe(se,he,ye,"\u2198","\\searrow",!0),oe(se,he,ye,"\u21bc","\\leftharpoonup",!0),oe(se,he,ye,"\u21c0","\\rightharpoonup",!0),oe(se,he,ye,"\u2199","\\swarrow",!0),oe(se,he,ye,"\u21bd","\\leftharpoondown",!0),oe(se,he,ye,"\u21c1","\\rightharpoondown",!0),oe(se,he,ye,"\u2196","\\nwarrow",!0),oe(se,he,ye,"\u21cc","\\rightleftharpoons",!0),oe(se,me,ye,"\u226e","\\nless",!0),oe(se,me,ye,"\ue010","\\@nleqslant"),oe(se,me,ye,"\ue011","\\@nleqq"),oe(se,me,ye,"\u2a87","\\lneq",!0),oe(se,me,ye,"\u2268","\\lneqq",!0),oe(se,me,ye,"\ue00c","\\@lvertneqq"),oe(se,me,ye,"\u22e6","\\lnsim",!0),oe(se,me,ye,"\u2a89","\\lnapprox",!0),oe(se,me,ye,"\u2280","\\nprec",!0),oe(se,me,ye,"\u22e0","\\npreceq",!0),oe(se,me,ye,"\u22e8","\\precnsim",!0),oe(se,me,ye,"\u2ab9","\\precnapprox",!0),oe(se,me,ye,"\u2241","\\nsim",!0),oe(se,me,ye,"\ue006","\\@nshortmid"),oe(se,me,ye,"\u2224","\\nmid",!0),oe(se,me,ye,"\u22ac","\\nvdash",!0),oe(se,me,ye,"\u22ad","\\nvDash",!0),oe(se,me,ye,"\u22ea","\\ntriangleleft"),oe(se,me,ye,"\u22ec","\\ntrianglelefteq",!0),oe(se,me,ye,"\u228a","\\subsetneq",!0),oe(se,me,ye,"\ue01a","\\@varsubsetneq"),oe(se,me,ye,"\u2acb","\\subsetneqq",!0),oe(se,me,ye,"\ue017","\\@varsubsetneqq"),oe(se,me,ye,"\u226f","\\ngtr",!0),oe(se,me,ye,"\ue00f","\\@ngeqslant"),oe(se,me,ye,"\ue00e","\\@ngeqq"),oe(se,me,ye,"\u2a88","\\gneq",!0),oe(se,me,ye,"\u2269","\\gneqq",!0),oe(se,me,ye,"\ue00d","\\@gvertneqq"),oe(se,me,ye,"\u22e7","\\gnsim",!0),oe(se,me,ye,"\u2a8a","\\gnapprox",!0),oe(se,me,ye,"\u2281","\\nsucc",!0),oe(se,me,ye,"\u22e1","\\nsucceq",!0),oe(se,me,ye,"\u22e9","\\succnsim",!0),oe(se,me,ye,"\u2aba","\\succnapprox",!0),oe(se,me,ye,"\u2246","\\ncong",!0),oe(se,me,ye,"\ue007","\\@nshortparallel"),oe(se,me,ye,"\u2226","\\nparallel",!0),oe(se,me,ye,"\u22af","\\nVDash",!0),oe(se,me,ye,"\u22eb","\\ntriangleright"),oe(se,me,ye,"\u22ed","\\ntrianglerighteq",!0),oe(se,me,ye,"\ue018","\\@nsupseteqq"),oe(se,me,ye,"\u228b","\\supsetneq",!0),oe(se,me,ye,"\ue01b","\\@varsupsetneq"),oe(se,me,ye,"\u2acc","\\supsetneqq",!0),oe(se,me,ye,"\ue019","\\@varsupsetneqq"),oe(se,me,ye,"\u22ae","\\nVdash",!0),oe(se,me,ye,"\u2ab5","\\precneqq",!0),oe(se,me,ye,"\u2ab6","\\succneqq",!0),oe(se,me,ye,"\ue016","\\@nsubseteqq"),oe(se,me,pe,"\u22b4","\\unlhd"),oe(se,me,pe,"\u22b5","\\unrhd"),oe(se,me,ye,"\u219a","\\nleftarrow",!0),oe(se,me,ye,"\u219b","\\nrightarrow",!0),oe(se,me,ye,"\u21cd","\\nLeftarrow",!0),oe(se,me,ye,"\u21cf","\\nRightarrow",!0),oe(se,me,ye,"\u21ae","\\nleftrightarrow",!0),oe(se,me,ye,"\u21ce","\\nLeftrightarrow",!0),oe(se,me,ye,"\u25b3","\\vartriangle"),oe(se,me,we,"\u210f","\\hslash"),oe(se,me,we,"\u25bd","\\triangledown"),oe(se,me,we,"\u25ca","\\lozenge"),oe(se,me,we,"\u24c8","\\circledS"),oe(se,me,we,"\xae","\\circledR"),oe(le,me,we,"\xae","\\circledR"),oe(se,me,we,"\u2221","\\measuredangle",!0),oe(se,me,we,"\u2204","\\nexists"),oe(se,me,we,"\u2127","\\mho"),oe(se,me,we,"\u2132","\\Finv",!0),oe(se,me,we,"\u2141","\\Game",!0),oe(se,me,we,"\u2035","\\backprime"),oe(se,me,we,"\u25b2","\\blacktriangle"),oe(se,me,we,"\u25bc","\\blacktriangledown"),oe(se,me,we,"\u25a0","\\blacksquare"),oe(se,me,we,"\u29eb","\\blacklozenge"),oe(se,me,we,"\u2605","\\bigstar"),oe(se,me,we,"\u2222","\\sphericalangle",!0),oe(se,me,we,"\u2201","\\complement",!0),oe(se,me,we,"\xf0","\\eth",!0),oe(le,he,we,"\xf0","\xf0"),oe(se,me,we,"\u2571","\\diagup"),oe(se,me,we,"\u2572","\\diagdown"),oe(se,me,we,"\u25a1","\\square"),oe(se,me,we,"\u25a1","\\Box"),oe(se,me,we,"\u25ca","\\Diamond"),oe(se,me,we,"\xa5","\\yen",!0),oe(le,me,we,"\xa5","\\yen",!0),oe(se,me,we,"\u2713","\\checkmark",!0),oe(le,me,we,"\u2713","\\checkmark"),oe(se,me,we,"\u2136","\\beth",!0),oe(se,me,we,"\u2138","\\daleth",!0),oe(se,me,we,"\u2137","\\gimel",!0),oe(se,me,we,"\u03dd","\\digamma",!0),oe(se,me,we,"\u03f0","\\varkappa"),oe(se,me,ve,"\u250c","\\@ulcorner",!0),oe(se,me,ue,"\u2510","\\@urcorner",!0),oe(se,me,ve,"\u2514","\\@llcorner",!0),oe(se,me,ue,"\u2518","\\@lrcorner",!0),oe(se,me,ye,"\u2266","\\leqq",!0),oe(se,me,ye,"\u2a7d","\\leqslant",!0),oe(se,me,ye,"\u2a95","\\eqslantless",!0),oe(se,me,ye,"\u2272","\\lesssim",!0),oe(se,me,ye,"\u2a85","\\lessapprox",!0),oe(se,me,ye,"\u224a","\\approxeq",!0),oe(se,me,pe,"\u22d6","\\lessdot"),oe(se,me,ye,"\u22d8","\\lll",!0),oe(se,me,ye,"\u2276","\\lessgtr",!0),oe(se,me,ye,"\u22da","\\lesseqgtr",!0),oe(se,me,ye,"\u2a8b","\\lesseqqgtr",!0),oe(se,me,ye,"\u2251","\\doteqdot"),oe(se,me,ye,"\u2253","\\risingdotseq",!0),oe(se,me,ye,"\u2252","\\fallingdotseq",!0),oe(se,me,ye,"\u223d","\\backsim",!0),oe(se,me,ye,"\u22cd","\\backsimeq",!0),oe(se,me,ye,"\u2ac5","\\subseteqq",!0),oe(se,me,ye,"\u22d0","\\Subset",!0),oe(se,me,ye,"\u228f","\\sqsubset",!0),oe(se,me,ye,"\u227c","\\preccurlyeq",!0),oe(se,me,ye,"\u22de","\\curlyeqprec",!0),oe(se,me,ye,"\u227e","\\precsim",!0),oe(se,me,ye,"\u2ab7","\\precapprox",!0),oe(se,me,ye,"\u22b2","\\vartriangleleft"),oe(se,me,ye,"\u22b4","\\trianglelefteq"),oe(se,me,ye,"\u22a8","\\vDash",!0),oe(se,me,ye,"\u22aa","\\Vvdash",!0),oe(se,me,ye,"\u2323","\\smallsmile"),oe(se,me,ye,"\u2322","\\smallfrown"),oe(se,me,ye,"\u224f","\\bumpeq",!0),oe(se,me,ye,"\u224e","\\Bumpeq",!0),oe(se,me,ye,"\u2267","\\geqq",!0),oe(se,me,ye,"\u2a7e","\\geqslant",!0),oe(se,me,ye,"\u2a96","\\eqslantgtr",!0),oe(se,me,ye,"\u2273","\\gtrsim",!0),oe(se,me,ye,"\u2a86","\\gtrapprox",!0),oe(se,me,pe,"\u22d7","\\gtrdot"),oe(se,me,ye,"\u22d9","\\ggg",!0),oe(se,me,ye,"\u2277","\\gtrless",!0),oe(se,me,ye,"\u22db","\\gtreqless",!0),oe(se,me,ye,"\u2a8c","\\gtreqqless",!0),oe(se,me,ye,"\u2256","\\eqcirc",!0),oe(se,me,ye,"\u2257","\\circeq",!0),oe(se,me,ye,"\u225c","\\triangleq",!0),oe(se,me,ye,"\u223c","\\thicksim"),oe(se,me,ye,"\u2248","\\thickapprox"),oe(se,me,ye,"\u2ac6","\\supseteqq",!0),oe(se,me,ye,"\u22d1","\\Supset",!0),oe(se,me,ye,"\u2290","\\sqsupset",!0),oe(se,me,ye,"\u227d","\\succcurlyeq",!0),oe(se,me,ye,"\u22df","\\curlyeqsucc",!0),oe(se,me,ye,"\u227f","\\succsim",!0),oe(se,me,ye,"\u2ab8","\\succapprox",!0),oe(se,me,ye,"\u22b3","\\vartriangleright"),oe(se,me,ye,"\u22b5","\\trianglerighteq"),oe(se,me,ye,"\u22a9","\\Vdash",!0),oe(se,me,ye,"\u2223","\\shortmid"),oe(se,me,ye,"\u2225","\\shortparallel"),oe(se,me,ye,"\u226c","\\between",!0),oe(se,me,ye,"\u22d4","\\pitchfork",!0),oe(se,me,ye,"\u221d","\\varpropto"),oe(se,me,ye,"\u25c0","\\blacktriangleleft"),oe(se,me,ye,"\u2234","\\therefore",!0),oe(se,me,ye,"\u220d","\\backepsilon"),oe(se,me,ye,"\u25b6","\\blacktriangleright"),oe(se,me,ye,"\u2235","\\because",!0),oe(se,me,ye,"\u22d8","\\llless"),oe(se,me,ye,"\u22d9","\\gggtr"),oe(se,me,pe,"\u22b2","\\lhd"),oe(se,me,pe,"\u22b3","\\rhd"),oe(se,me,ye,"\u2242","\\eqsim",!0),oe(se,he,ye,"\u22c8","\\Join"),oe(se,me,ye,"\u2251","\\Doteq",!0),oe(se,me,pe,"\u2214","\\dotplus",!0),oe(se,me,pe,"\u2216","\\smallsetminus"),oe(se,me,pe,"\u22d2","\\Cap",!0),oe(se,me,pe,"\u22d3","\\Cup",!0),oe(se,me,pe,"\u2a5e","\\doublebarwedge",!0),oe(se,me,pe,"\u229f","\\boxminus",!0),oe(se,me,pe,"\u229e","\\boxplus",!0),oe(se,me,pe,"\u22c7","\\divideontimes",!0),oe(se,me,pe,"\u22c9","\\ltimes",!0),oe(se,me,pe,"\u22ca","\\rtimes",!0),oe(se,me,pe,"\u22cb","\\leftthreetimes",!0),oe(se,me,pe,"\u22cc","\\rightthreetimes",!0),oe(se,me,pe,"\u22cf","\\curlywedge",!0),oe(se,me,pe,"\u22ce","\\curlyvee",!0),oe(se,me,pe,"\u229d","\\circleddash",!0),oe(se,me,pe,"\u229b","\\circledast",!0),oe(se,me,pe,"\u22c5","\\centerdot"),oe(se,me,pe,"\u22ba","\\intercal",!0),oe(se,me,pe,"\u22d2","\\doublecap"),oe(se,me,pe,"\u22d3","\\doublecup"),oe(se,me,pe,"\u22a0","\\boxtimes",!0),oe(se,me,ye,"\u21e2","\\dashrightarrow",!0),oe(se,me,ye,"\u21e0","\\dashleftarrow",!0),oe(se,me,ye,"\u21c7","\\leftleftarrows",!0),oe(se,me,ye,"\u21c6","\\leftrightarrows",!0),oe(se,me,ye,"\u21da","\\Lleftarrow",!0),oe(se,me,ye,"\u219e","\\twoheadleftarrow",!0),oe(se,me,ye,"\u21a2","\\leftarrowtail",!0),oe(se,me,ye,"\u21ab","\\looparrowleft",!0),oe(se,me,ye,"\u21cb","\\leftrightharpoons",!0),oe(se,me,ye,"\u21b6","\\curvearrowleft",!0),oe(se,me,ye,"\u21ba","\\circlearrowleft",!0),oe(se,me,ye,"\u21b0","\\Lsh",!0),oe(se,me,ye,"\u21c8","\\upuparrows",!0),oe(se,me,ye,"\u21bf","\\upharpoonleft",!0),oe(se,me,ye,"\u21c3","\\downharpoonleft",!0),oe(se,he,ye,"\u22b6","\\origof",!0),oe(se,he,ye,"\u22b7","\\imageof",!0),oe(se,me,ye,"\u22b8","\\multimap",!0),oe(se,me,ye,"\u21ad","\\leftrightsquigarrow",!0),oe(se,me,ye,"\u21c9","\\rightrightarrows",!0),oe(se,me,ye,"\u21c4","\\rightleftarrows",!0),oe(se,me,ye,"\u21a0","\\twoheadrightarrow",!0),oe(se,me,ye,"\u21a3","\\rightarrowtail",!0),oe(se,me,ye,"\u21ac","\\looparrowright",!0),oe(se,me,ye,"\u21b7","\\curvearrowright",!0),oe(se,me,ye,"\u21bb","\\circlearrowright",!0),oe(se,me,ye,"\u21b1","\\Rsh",!0),oe(se,me,ye,"\u21ca","\\downdownarrows",!0),oe(se,me,ye,"\u21be","\\upharpoonright",!0),oe(se,me,ye,"\u21c2","\\downharpoonright",!0),oe(se,me,ye,"\u21dd","\\rightsquigarrow",!0),oe(se,me,ye,"\u21dd","\\leadsto"),oe(se,me,ye,"\u21db","\\Rrightarrow",!0),oe(se,me,ye,"\u21be","\\restriction"),oe(se,he,we,"\u2018","`"),oe(se,he,we,"$","\\$"),oe(le,he,we,"$","\\$"),oe(le,he,we,"$","\\textdollar"),oe(se,he,we,"%","\\%"),oe(le,he,we,"%","\\%"),oe(se,he,we,"_","\\_"),oe(le,he,we,"_","\\_"),oe(le,he,we,"_","\\textunderscore"),oe(se,he,we,"\u2220","\\angle",!0),oe(se,he,we,"\u221e","\\infty",!0),oe(se,he,we,"\u2032","\\prime"),oe(se,he,we,"\u25b3","\\triangle"),oe(se,he,we,"\u0393","\\Gamma",!0),oe(se,he,we,"\u0394","\\Delta",!0),oe(se,he,we,"\u0398","\\Theta",!0),oe(se,he,we,"\u039b","\\Lambda",!0),oe(se,he,we,"\u039e","\\Xi",!0),oe(se,he,we,"\u03a0","\\Pi",!0),oe(se,he,we,"\u03a3","\\Sigma",!0),oe(se,he,we,"\u03a5","\\Upsilon",!0),oe(se,he,we,"\u03a6","\\Phi",!0),oe(se,he,we,"\u03a8","\\Psi",!0),oe(se,he,we,"\u03a9","\\Omega",!0),oe(se,he,we,"A","\u0391"),oe(se,he,we,"B","\u0392"),oe(se,he,we,"E","\u0395"),oe(se,he,we,"Z","\u0396"),oe(se,he,we,"H","\u0397"),oe(se,he,we,"I","\u0399"),oe(se,he,we,"K","\u039a"),oe(se,he,we,"M","\u039c"),oe(se,he,we,"N","\u039d"),oe(se,he,we,"O","\u039f"),oe(se,he,we,"P","\u03a1"),oe(se,he,we,"T","\u03a4"),oe(se,he,we,"X","\u03a7"),oe(se,he,we,"\xac","\\neg",!0),oe(se,he,we,"\xac","\\lnot"),oe(se,he,we,"\u22a4","\\top"),oe(se,he,we,"\u22a5","\\bot"),oe(se,he,we,"\u2205","\\emptyset"),oe(se,me,we,"\u2205","\\varnothing"),oe(se,he,ge,"\u03b1","\\alpha",!0),oe(se,he,ge,"\u03b2","\\beta",!0),oe(se,he,ge,"\u03b3","\\gamma",!0),oe(se,he,ge,"\u03b4","\\delta",!0),oe(se,he,ge,"\u03f5","\\epsilon",!0),oe(se,he,ge,"\u03b6","\\zeta",!0),oe(se,he,ge,"\u03b7","\\eta",!0),oe(se,he,ge,"\u03b8","\\theta",!0),oe(se,he,ge,"\u03b9","\\iota",!0),oe(se,he,ge,"\u03ba","\\kappa",!0),oe(se,he,ge,"\u03bb","\\lambda",!0),oe(se,he,ge,"\u03bc","\\mu",!0),oe(se,he,ge,"\u03bd","\\nu",!0),oe(se,he,ge,"\u03be","\\xi",!0),oe(se,he,ge,"\u03bf","\\omicron",!0),oe(se,he,ge,"\u03c0","\\pi",!0),oe(se,he,ge,"\u03c1","\\rho",!0),oe(se,he,ge,"\u03c3","\\sigma",!0),oe(se,he,ge,"\u03c4","\\tau",!0),oe(se,he,ge,"\u03c5","\\upsilon",!0),oe(se,he,ge,"\u03d5","\\phi",!0),oe(se,he,ge,"\u03c7","\\chi",!0),oe(se,he,ge,"\u03c8","\\psi",!0),oe(se,he,ge,"\u03c9","\\omega",!0),oe(se,he,ge,"\u03b5","\\varepsilon",!0),oe(se,he,ge,"\u03d1","\\vartheta",!0),oe(se,he,ge,"\u03d6","\\varpi",!0),oe(se,he,ge,"\u03f1","\\varrho",!0),oe(se,he,ge,"\u03c2","\\varsigma",!0),oe(se,he,ge,"\u03c6","\\varphi",!0),oe(se,he,pe,"\u2217","*",!0),oe(se,he,pe,"+","+"),oe(se,he,pe,"\u2212","-",!0),oe(se,he,pe,"\u22c5","\\cdot",!0),oe(se,he,pe,"\u2218","\\circ",!0),oe(se,he,pe,"\xf7","\\div",!0),oe(se,he,pe,"\xb1","\\pm",!0),oe(se,he,pe,"\xd7","\\times",!0),oe(se,he,pe,"\u2229","\\cap",!0),oe(se,he,pe,"\u222a","\\cup",!0),oe(se,he,pe,"\u2216","\\setminus",!0),oe(se,he,pe,"\u2227","\\land"),oe(se,he,pe,"\u2228","\\lor"),oe(se,he,pe,"\u2227","\\wedge",!0),oe(se,he,pe,"\u2228","\\vee",!0),oe(se,he,we,"\u221a","\\surd"),oe(se,he,ve,"\u27e8","\\langle",!0),oe(se,he,ve,"\u2223","\\lvert"),oe(se,he,ve,"\u2225","\\lVert"),oe(se,he,ue,"?","?"),oe(se,he,ue,"!","!"),oe(se,he,ue,"\u27e9","\\rangle",!0),oe(se,he,ue,"\u2223","\\rvert"),oe(se,he,ue,"\u2225","\\rVert"),oe(se,he,ye,"=","="),oe(se,he,ye,":",":"),oe(se,he,ye,"\u2248","\\approx",!0),oe(se,he,ye,"\u2245","\\cong",!0),oe(se,he,ye,"\u2265","\\ge"),oe(se,he,ye,"\u2265","\\geq",!0),oe(se,he,ye,"\u2190","\\gets"),oe(se,he,ye,">","\\gt",!0),oe(se,he,ye,"\u2208","\\in",!0),oe(se,he,ye,"\ue020","\\@not"),oe(se,he,ye,"\u2282","\\subset",!0),oe(se,he,ye,"\u2283","\\supset",!0),oe(se,he,ye,"\u2286","\\subseteq",!0),oe(se,he,ye,"\u2287","\\supseteq",!0),oe(se,me,ye,"\u2288","\\nsubseteq",!0),oe(se,me,ye,"\u2289","\\nsupseteq",!0),oe(se,he,ye,"\u22a8","\\models"),oe(se,he,ye,"\u2190","\\leftarrow",!0),oe(se,he,ye,"\u2264","\\le"),oe(se,he,ye,"\u2264","\\leq",!0),oe(se,he,ye,"<","\\lt",!0),oe(se,he,ye,"\u2192","\\rightarrow",!0),oe(se,he,ye,"\u2192","\\to"),oe(se,me,ye,"\u2271","\\ngeq",!0),oe(se,me,ye,"\u2270","\\nleq",!0),oe(se,he,xe,"\xa0","\\ "),oe(se,he,xe,"\xa0","\\space"),oe(se,he,xe,"\xa0","\\nobreakspace"),oe(le,he,xe,"\xa0","\\ "),oe(le,he,xe,"\xa0"," "),oe(le,he,xe,"\xa0","\\space"),oe(le,he,xe,"\xa0","\\nobreakspace"),oe(se,he,xe,null,"\\nobreak"),oe(se,he,xe,null,"\\allowbreak"),oe(se,he,be,",",","),oe(se,he,be,";",";"),oe(se,me,pe,"\u22bc","\\barwedge",!0),oe(se,me,pe,"\u22bb","\\veebar",!0),oe(se,he,pe,"\u2299","\\odot",!0),oe(se,he,pe,"\u2295","\\oplus",!0),oe(se,he,pe,"\u2297","\\otimes",!0),oe(se,he,we,"\u2202","\\partial",!0),oe(se,he,pe,"\u2298","\\oslash",!0),oe(se,me,pe,"\u229a","\\circledcirc",!0),oe(se,me,pe,"\u22a1","\\boxdot",!0),oe(se,he,pe,"\u25b3","\\bigtriangleup"),oe(se,he,pe,"\u25bd","\\bigtriangledown"),oe(se,he,pe,"\u2020","\\dagger"),oe(se,he,pe,"\u22c4","\\diamond"),oe(se,he,pe,"\u22c6","\\star"),oe(se,he,pe,"\u25c3","\\triangleleft"),oe(se,he,pe,"\u25b9","\\triangleright"),oe(se,he,ve,"{","\\{"),oe(le,he,we,"{","\\{"),oe(le,he,we,"{","\\textbraceleft"),oe(se,he,ue,"}","\\}"),oe(le,he,we,"}","\\}"),oe(le,he,we,"}","\\textbraceright"),oe(se,he,ve,"{","\\lbrace"),oe(se,he,ue,"}","\\rbrace"),oe(se,he,ve,"[","\\lbrack",!0),oe(le,he,we,"[","\\lbrack",!0),oe(se,he,ue,"]","\\rbrack",!0),oe(le,he,we,"]","\\rbrack",!0),oe(se,he,ve,"(","\\lparen",!0),oe(se,he,ue,")","\\rparen",!0),oe(le,he,we,"<","\\textless",!0),oe(le,he,we,">","\\textgreater",!0),oe(se,he,ve,"\u230a","\\lfloor",!0),oe(se,he,ue,"\u230b","\\rfloor",!0),oe(se,he,ve,"\u2308","\\lceil",!0),oe(se,he,ue,"\u2309","\\rceil",!0),oe(se,he,we,"\\","\\backslash"),oe(se,he,we,"\u2223","|"),oe(se,he,we,"\u2223","\\vert"),oe(le,he,we,"|","\\textbar",!0),oe(se,he,we,"\u2225","\\|"),oe(se,he,we,"\u2225","\\Vert"),oe(le,he,we,"\u2225","\\textbardbl"),oe(le,he,we,"~","\\textasciitilde"),oe(le,he,we,"\\","\\textbackslash"),oe(le,he,we,"^","\\textasciicircum"),oe(se,he,ye,"\u2191","\\uparrow",!0),oe(se,he,ye,"\u21d1","\\Uparrow",!0),oe(se,he,ye,"\u2193","\\downarrow",!0),oe(se,he,ye,"\u21d3","\\Downarrow",!0),oe(se,he,ye,"\u2195","\\updownarrow",!0),oe(se,he,ye,"\u21d5","\\Updownarrow",!0),oe(se,he,fe,"\u2210","\\coprod"),oe(se,he,fe,"\u22c1","\\bigvee"),oe(se,he,fe,"\u22c0","\\bigwedge"),oe(se,he,fe,"\u2a04","\\biguplus"),oe(se,he,fe,"\u22c2","\\bigcap"),oe(se,he,fe,"\u22c3","\\bigcup"),oe(se,he,fe,"\u222b","\\int"),oe(se,he,fe,"\u222b","\\intop"),oe(se,he,fe,"\u222c","\\iint"),oe(se,he,fe,"\u222d","\\iiint"),oe(se,he,fe,"\u220f","\\prod"),oe(se,he,fe,"\u2211","\\sum"),oe(se,he,fe,"\u2a02","\\bigotimes"),oe(se,he,fe,"\u2a01","\\bigoplus"),oe(se,he,fe,"\u2a00","\\bigodot"),oe(se,he,fe,"\u222e","\\oint"),oe(se,he,fe,"\u222f","\\oiint"),oe(se,he,fe,"\u2230","\\oiiint"),oe(se,he,fe,"\u2a06","\\bigsqcup"),oe(se,he,fe,"\u222b","\\smallint"),oe(le,he,de,"\u2026","\\textellipsis"),oe(se,he,de,"\u2026","\\mathellipsis"),oe(le,he,de,"\u2026","\\ldots",!0),oe(se,he,de,"\u2026","\\ldots",!0),oe(se,he,de,"\u22ef","\\@cdots",!0),oe(se,he,de,"\u22f1","\\ddots",!0),oe(se,he,we,"\u22ee","\\varvdots"),oe(le,he,we,"\u22ee","\\varvdots"),oe(se,he,ce,"\u02ca","\\acute"),oe(se,he,ce,"\u02cb","\\grave"),oe(se,he,ce,"\xa8","\\ddot"),oe(se,he,ce,"~","\\tilde"),oe(se,he,ce,"\u02c9","\\bar"),oe(se,he,ce,"\u02d8","\\breve"),oe(se,he,ce,"\u02c7","\\check"),oe(se,he,ce,"^","\\hat"),oe(se,he,ce,"\u20d7","\\vec"),oe(se,he,ce,"\u02d9","\\dot"),oe(se,he,ce,"\u02da","\\mathring"),oe(se,he,ge,"\ue131","\\@imath"),oe(se,he,ge,"\ue237","\\@jmath"),oe(se,he,we,"\u0131","\u0131"),oe(se,he,we,"\u0237","\u0237"),oe(le,he,we,"\u0131","\\i",!0),oe(le,he,we,"\u0237","\\j",!0),oe(le,he,we,"\xdf","\\ss",!0),oe(le,he,we,"\xe6","\\ae",!0),oe(le,he,we,"\u0153","\\oe",!0),oe(le,he,we,"\xf8","\\o",!0),oe(le,he,we,"\xc6","\\AE",!0),oe(le,he,we,"\u0152","\\OE",!0),oe(le,he,we,"\xd8","\\O",!0),oe(le,he,ce,"\u02ca","\\'"),oe(le,he,ce,"\u02cb","\\`"),oe(le,he,ce,"\u02c6","\\^"),oe(le,he,ce,"\u02dc","\\~"),oe(le,he,ce,"\u02c9","\\="),oe(le,he,ce,"\u02d8","\\u"),oe(le,he,ce,"\u02d9","\\."),oe(le,he,ce,"\xb8","\\c"),oe(le,he,ce,"\u02da","\\r"),oe(le,he,ce,"\u02c7","\\v"),oe(le,he,ce,"\xa8",'\\"'),oe(le,he,ce,"\u02dd","\\H"),oe(le,he,ce,"\u25ef","\\textcircled");var ke={"--":!0,"---":!0,"``":!0,"''":!0};oe(le,he,we,"\u2013","--",!0),oe(le,he,we,"\u2013","\\textendash"),oe(le,he,we,"\u2014","---",!0),oe(le,he,we,"\u2014","\\textemdash"),oe(le,he,we,"\u2018","`",!0),oe(le,he,we,"\u2018","\\textquoteleft"),oe(le,he,we,"\u2019","'",!0),oe(le,he,we,"\u2019","\\textquoteright"),oe(le,he,we,"\u201c","``",!0),oe(le,he,we,"\u201c","\\textquotedblleft"),oe(le,he,we,"\u201d","''",!0),oe(le,he,we,"\u201d","\\textquotedblright"),oe(se,he,we,"\xb0","\\degree",!0),oe(le,he,we,"\xb0","\\degree"),oe(le,he,we,"\xb0","\\textdegree",!0),oe(se,he,we,"\xa3","\\pounds"),oe(se,he,we,"\xa3","\\mathsterling",!0),oe(le,he,we,"\xa3","\\pounds"),oe(le,he,we,"\xa3","\\textsterling",!0),oe(se,me,we,"\u2720","\\maltese"),oe(le,me,we,"\u2720","\\maltese");for(var Se='0123456789/@."',Me=0;Me<14;Me++){var ze=Se.charAt(Me);oe(se,he,we,ze,ze)}for(var Ae='0123456789!@*()-=+";:?/.,',Te=0;Te<25;Te++){var Be=Ae.charAt(Te);oe(le,he,we,Be,Be)}for(var Ce="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Ne=0;Ne<52;Ne++){var qe=Ce.charAt(Ne);oe(se,he,ge,qe,qe),oe(le,he,we,qe,qe)}oe(se,me,we,"C","\u2102"),oe(le,me,we,"C","\u2102"),oe(se,me,we,"H","\u210d"),oe(le,me,we,"H","\u210d"),oe(se,me,we,"N","\u2115"),oe(le,me,we,"N","\u2115"),oe(se,me,we,"P","\u2119"),oe(le,me,we,"P","\u2119"),oe(se,me,we,"Q","\u211a"),oe(le,me,we,"Q","\u211a"),oe(se,me,we,"R","\u211d"),oe(le,me,we,"R","\u211d"),oe(se,me,we,"Z","\u2124"),oe(le,me,we,"Z","\u2124"),oe(se,he,ge,"h","\u210e"),oe(le,he,ge,"h","\u210e");for(var Ie="",Re=0;Re<52;Re++){var He=Ce.charAt(Re);oe(se,he,ge,He,Ie=String.fromCharCode(55349,56320+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56372+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56424+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56580+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56684+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56736+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56788+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56840+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56944+Re)),oe(le,he,we,He,Ie),Re<26&&(oe(se,he,ge,He,Ie=String.fromCharCode(55349,56632+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56476+Re)),oe(le,he,we,He,Ie))}oe(se,he,ge,"k",Ie=String.fromCharCode(55349,56668)),oe(le,he,we,"k",Ie);for(var Oe=0;Oe<10;Oe++){var Ee=Oe.toString();oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57294+Oe)),oe(le,he,we,Ee,Ie),oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57314+Oe)),oe(le,he,we,Ee,Ie),oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57324+Oe)),oe(le,he,we,Ee,Ie),oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57334+Oe)),oe(le,he,we,Ee,Ie)}for(var Le="\xd0\xde\xfe",De=0;De<3;De++){var Ve=Le.charAt(De);oe(se,he,ge,Ve,Ve),oe(le,he,we,Ve,Ve)}var Pe=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathnormal","textit","Math-Italic"],["mathnormal","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],Fe=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],Ge=function(e,t,r){return ie[r][e]&&ie[r][e].replace&&(e=ie[r][e].replace),{value:e,metrics:I(e,t,r)}},Ue=function(e,t,r,a,n){var i,o=Ge(e,t,r),s=o.metrics;if(e=o.value,s){var l=s.italic;("text"===r||a&&"mathit"===a.font)&&(l=0),i=new J(e,s.height,s.depth,l,s.skew,s.width,n)}else"undefined"!=typeof console&&console.warn("No character metrics for '"+e+"' in style '"+t+"' and mode '"+r+"'"),i=new J(e,0,0,0,0,0,n);if(a){i.maxFontSize=a.sizeMultiplier,a.style.isTight()&&i.classes.push("mtight");var h=a.getColor();h&&(i.style.color=h)}return i},Ye=(e,t)=>{if(U(e.classes)!==U(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){var r=e.classes[0];if("mbin"===r||"mord"===r)return!1}for(var a in e.style)if(e.style.hasOwnProperty(a)&&e.style[a]!==t.style[a])return!1;for(var n in t.style)if(t.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;return!0},Xe=function(e){for(var t=0,r=0,a=0,n=0;n<e.children.length;n++){var i=e.children[n];i.height>t&&(t=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>a&&(a=i.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=a},We=function(e,t,r,a){var n=new j(e,t,r,a);return Xe(n),n},_e=(e,t,r,a)=>new j(e,t,r,a),je=function(e){var t=new B(e);return Xe(t),t},$e=function(e,t,r){var a="";switch(e){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=e}return a+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},Ze={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ke={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Je={fontMap:Ze,makeSymbol:Ue,mathsym:function(e,t,r,a){return void 0===a&&(a=[]),"boldsymbol"===r.font&&Ge(e,"Main-Bold",t).metrics?Ue(e,"Main-Bold",t,r,a.concat(["mathbf"])):"\\"===e||"main"===ie[t][e].font?Ue(e,"Main-Regular",t,r,a):Ue(e,"AMS-Regular",t,r,a.concat(["amsrm"]))},makeSpan:We,makeSvgSpan:_e,makeLineSpan:function(e,t,r){var a=We([e],[],t);return a.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),a.style.borderBottomWidth=G(a.height),a.maxFontSize=1,a},makeAnchor:function(e,t,r,a){var n=new $(e,t,r,a);return Xe(n),n},makeFragment:je,wrapFragment:function(e,t){return e instanceof B?We([],[e],t):e},makeVList:function(e,t){for(var{children:r,depth:a}=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],a=-t[0].shift-t[0].elem.depth,n=a,i=1;i<t.length;i++){var o=-t[i].shift-n-t[i].elem.depth,s=o-(t[i-1].elem.height+t[i-1].elem.depth);n+=o,r.push({type:"kern",size:s}),r.push(t[i])}return{children:r,depth:a}}var l;if("top"===e.positionType){for(var h=e.positionData,m=0;m<e.children.length;m++){var c=e.children[m];h-="kern"===c.type?c.size:c.elem.height+c.elem.depth}l=h}else if("bottom"===e.positionType)l=-e.positionData;else{var p=e.children[0];if("elem"!==p.type)throw new Error('First child must have type "elem".');if("shift"===e.positionType)l=-p.elem.depth-e.positionData;else{if("firstBaseline"!==e.positionType)throw new Error("Invalid positionType "+e.positionType+".");l=-p.elem.depth}}return{children:e.children,depth:l}}(e),n=0,i=0;i<r.length;i++){var o=r[i];if("elem"===o.type){var s=o.elem;n=Math.max(n,s.maxFontSize,s.height)}}n+=2;var l=We(["pstrut"],[]);l.style.height=G(n);for(var h=[],m=a,c=a,p=a,u=0;u<r.length;u++){var d=r[u];if("kern"===d.type)p+=d.size;else{var g=d.elem,f=d.wrapperClasses||[],v=d.wrapperStyle||{},b=We(f,[l,g],void 0,v);b.style.top=G(-n-p-g.depth),d.marginLeft&&(b.style.marginLeft=d.marginLeft),d.marginRight&&(b.style.marginRight=d.marginRight),h.push(b),p+=g.height+g.depth}m=Math.min(m,p),c=Math.max(c,p)}var y,x=We(["vlist"],h);if(x.style.height=G(c),m<0){var w=We([],[]),k=We(["vlist"],[w]);k.style.height=G(-m);var S=We(["vlist-s"],[new J("\u200b")]);y=[We(["vlist-r"],[x,S]),We(["vlist-r"],[k])]}else y=[We(["vlist-r"],[x])];var M=We(["vlist-t"],y);return 2===y.length&&M.classes.push("vlist-t2"),M.height=c,M.depth=-m,M},makeOrd:function(e,t,r){var a=e.mode,n=e.text,o=["mord"],s="math"===a||"text"===a&&t.font,l=s?t.font:t.fontFamily,h="",m="";if(55349===n.charCodeAt(0)&&([h,m]=function(e,t){var r=1024*(e.charCodeAt(0)-55296)+(e.charCodeAt(1)-56320)+65536,a="math"===t?0:1;if(119808<=r&&r<120484){var n=Math.floor((r-119808)/26);return[Pe[n][2],Pe[n][a]]}if(120782<=r&&r<=120831){var o=Math.floor((r-120782)/10);return[Fe[o][2],Fe[o][a]]}if(120485===r||120486===r)return[Pe[0][2],Pe[0][a]];if(120486<r&&r<120782)return["",""];throw new i("Unsupported character: "+e)}(n,a)),h.length>0)return Ue(n,h,a,t,o.concat(m));if(l){var c,p;if("boldsymbol"===l){var u=function(e,t,r,a,n){return"textord"!==n&&Ge(e,"Math-BoldItalic",t).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(n,a,0,0,r);c=u.fontName,p=[u.fontClass]}else s?(c=Ze[l].fontName,p=[l]):(c=$e(l,t.fontWeight,t.fontShape),p=[l,t.fontWeight,t.fontShape]);if(Ge(n,c,a).metrics)return Ue(n,c,a,t,o.concat(p));if(ke.hasOwnProperty(n)&&"Typewriter"===c.slice(0,10)){for(var d=[],g=0;g<n.length;g++)d.push(Ue(n[g],c,a,t,o.concat(p)));return je(d)}}if("mathord"===r)return Ue(n,"Math-Italic",a,t,o.concat(["mathnormal"]));if("textord"===r){var f=ie[a][n]&&ie[a][n].font;if("ams"===f){var v=$e("amsrm",t.fontWeight,t.fontShape);return Ue(n,v,a,t,o.concat("amsrm",t.fontWeight,t.fontShape))}if("main"!==f&&f){var b=$e(f,t.fontWeight,t.fontShape);return Ue(n,b,a,t,o.concat(b,t.fontWeight,t.fontShape))}var y=$e("textrm",t.fontWeight,t.fontShape);return Ue(n,y,a,t,o.concat(t.fontWeight,t.fontShape))}throw new Error("unexpected type: "+r+" in makeOrd")},makeGlue:(e,t)=>{var r=We(["mspace"],[],t),a=F(e,t);return r.style.marginRight=G(a),r},staticSvg:function(e,t){var[r,a,n]=Ke[e],i=new ee(r),o=new Q([i],{width:G(a),height:G(n),style:"width:"+G(a),viewBox:"0 0 "+1e3*a+" "+1e3*n,preserveAspectRatio:"xMinYMin"}),s=_e(["overlay"],[o],t);return s.height=n,s.style.height=G(n),s.style.width=G(a),s},svgData:Ke,tryCombineChars:e=>{for(var t=0;t<e.length-1;t++){var r=e[t],a=e[t+1];r instanceof J&&a instanceof J&&Ye(r,a)&&(r.text+=a.text,r.height=Math.max(r.height,a.height),r.depth=Math.max(r.depth,a.depth),r.italic=a.italic,e.splice(t+1,1),t--)}return e}},Qe={number:3,unit:"mu"},et={number:4,unit:"mu"},tt={number:5,unit:"mu"},rt={mord:{mop:Qe,mbin:et,mrel:tt,minner:Qe},mop:{mord:Qe,mop:Qe,mrel:tt,minner:Qe},mbin:{mord:et,mop:et,mopen:et,minner:et},mrel:{mord:tt,mop:tt,mopen:tt,minner:tt},mopen:{},mclose:{mop:Qe,mbin:et,mrel:tt,minner:Qe},mpunct:{mord:Qe,mop:Qe,mrel:tt,mopen:Qe,mclose:Qe,mpunct:Qe,minner:Qe},minner:{mord:Qe,mop:Qe,mbin:et,mrel:tt,mopen:Qe,mpunct:Qe,minner:Qe}},at={mord:{mop:Qe},mop:{mord:Qe,mop:Qe},mbin:{},mrel:{},mopen:{},mclose:{mop:Qe},mpunct:{},minner:{mop:Qe}},nt={},it={},ot={};function st(e){for(var{type:t,names:r,props:a,handler:n,htmlBuilder:i,mathmlBuilder:o}=e,s={type:t,numArgs:a.numArgs,argTypes:a.argTypes,allowedInArgument:!!a.allowedInArgument,allowedInText:!!a.allowedInText,allowedInMath:void 0===a.allowedInMath||a.allowedInMath,numOptionalArgs:a.numOptionalArgs||0,infix:!!a.infix,primitive:!!a.primitive,handler:n},l=0;l<r.length;++l)nt[r[l]]=s;t&&(i&&(it[t]=i),o&&(ot[t]=o))}function lt(e){var{type:t,htmlBuilder:r,mathmlBuilder:a}=e;st({type:t,names:[],props:{numArgs:0},handler(){throw new Error("Should never be called.")},htmlBuilder:r,mathmlBuilder:a})}var ht=function(e){return"ordgroup"===e.type&&1===e.body.length?e.body[0]:e},mt=function(e){return"ordgroup"===e.type?e.body:[e]},ct=Je.makeSpan,pt=["leftmost","mbin","mopen","mrel","mop","mpunct"],ut=["rightmost","mrel","mclose","mpunct"],dt={display:k.DISPLAY,text:k.TEXT,script:k.SCRIPT,scriptscript:k.SCRIPTSCRIPT},gt={mord:"mord",mop:"mop",mbin:"mbin",mrel:"mrel",mopen:"mopen",mclose:"mclose",mpunct:"mpunct",minner:"minner"},ft=function(e,t,r,a){void 0===a&&(a=[null,null]);for(var n=[],i=0;i<e.length;i++){var o=kt(e[i],t);if(o instanceof B){var s=o.children;n.push(...s)}else n.push(o)}if(Je.tryCombineChars(n),!r)return n;var l=t;if(1===e.length){var h=e[0];"sizing"===h.type?l=t.havingSize(h.size):"styling"===h.type&&(l=t.havingStyle(dt[h.style]))}var c=ct([a[0]||"leftmost"],[],t),p=ct([a[1]||"rightmost"],[],t),u="root"===r;return vt(n,(e,t)=>{var r=t.classes[0],a=e.classes[0];"mbin"===r&&m.contains(ut,a)?t.classes[0]="mord":"mbin"===a&&m.contains(pt,r)&&(e.classes[0]="mord")},{node:c},p,u),vt(n,(e,t)=>{var r=xt(t),a=xt(e),n=r&&a?e.hasClass("mtight")?at[r][a]:rt[r][a]:null;if(n)return Je.makeGlue(n,l)},{node:c},p,u),n},vt=function e(t,r,a,n,i){n&&t.push(n);for(var o=0;o<t.length;o++){var s=t[o],l=bt(s);if(l)e(l.children,r,a,null,i);else{var h=!s.hasClass("mspace");if(h){var m=r(s,a.node);m&&(a.insertAfter?a.insertAfter(m):(t.unshift(m),o++))}h?a.node=s:i&&s.hasClass("newline")&&(a.node=ct(["leftmost"])),a.insertAfter=(e=>r=>{t.splice(e+1,0,r),o++})(o)}}n&&t.pop()},bt=function(e){return e instanceof B||e instanceof $||e instanceof j&&e.hasClass("enclosing")?e:null},yt=function e(t,r){var a=bt(t);if(a){var n=a.children;if(n.length){if("right"===r)return e(n[n.length-1],"right");if("left"===r)return e(n[0],"left")}}return t},xt=function(e,t){return e?(t&&(e=yt(e,t)),gt[e.classes[0]]||null):null},wt=function(e,t){var r=["nulldelimiter"].concat(e.baseSizingClasses());return ct(t.concat(r))},kt=function(e,t,r){if(!e)return ct();if(it[e.type]){var a=it[e.type](e,t);if(r&&t.size!==r.size){a=ct(t.sizingClasses(r),[a],t);var n=t.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new i("Got group of unknown type: '"+e.type+"'")};function St(e,t){var r=ct(["base"],e,t),a=ct(["strut"]);return a.style.height=G(r.height+r.depth),r.depth&&(a.style.verticalAlign=G(-r.depth)),r.children.unshift(a),r}function Mt(e,t){var r=null;1===e.length&&"tag"===e[0].type&&(r=e[0].tag,e=e[0].body);var a,n=ft(e,t,"root");2===n.length&&n[1].hasClass("tag")&&(a=n.pop());for(var i,o=[],s=[],l=0;l<n.length;l++)if(s.push(n[l]),n[l].hasClass("mbin")||n[l].hasClass("mrel")||n[l].hasClass("allowbreak")){for(var h=!1;l<n.length-1&&n[l+1].hasClass("mspace")&&!n[l+1].hasClass("newline");)l++,s.push(n[l]),n[l].hasClass("nobreak")&&(h=!0);h||(o.push(St(s,t)),s=[])}else n[l].hasClass("newline")&&(s.pop(),s.length>0&&(o.push(St(s,t)),s=[]),o.push(n[l]));s.length>0&&o.push(St(s,t)),r?((i=St(ft(r,t,!0))).classes=["tag"],o.push(i)):a&&o.push(a);var m=ct(["katex-html"],o);if(m.setAttribute("aria-hidden","true"),i){var c=i.children[0];c.style.height=G(m.height+m.depth),m.depth&&(c.style.verticalAlign=G(-m.depth))}return m}function zt(e){return new B(e)}class At{constructor(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=U(this.classes));for(var r=0;r<this.children.length;r++)if(this.children[r]instanceof Tt&&this.children[r+1]instanceof Tt){for(var a=this.children[r].toText()+this.children[++r].toText();this.children[r+1]instanceof Tt;)a+=this.children[++r].toText();e.appendChild(new Tt(a).toNode())}else e.appendChild(this.children[r].toNode());return e}toMarkup(){var e="<"+this.type;for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&(e+=" "+t+'="',e+=m.escape(this.attributes[t]),e+='"');this.classes.length>0&&(e+=' class ="'+m.escape(U(this.classes))+'"'),e+=">";for(var r=0;r<this.children.length;r++)e+=this.children[r].toMarkup();return e+="</"+this.type+">"}toText(){return this.children.map(e=>e.toText()).join("")}}class Tt{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return m.escape(this.toText())}toText(){return this.text}}var Bt={MathNode:At,TextNode:Tt,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",G(this.width)),e}toMarkup(){return this.character?"<mtext>"+this.character+"</mtext>":'<mspace width="'+G(this.width)+'"/>'}toText(){return this.character?this.character:" "}},newDocumentFragment:zt},Ct=function(e,t,r){return!ie[t][e]||!ie[t][e].replace||55349===e.charCodeAt(0)||ke.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=ie[t][e].replace),new Bt.TextNode(e)},Nt=function(e){return 1===e.length?e[0]:new Bt.MathNode("mrow",e)},qt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var a=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathsfit"===r)return"sans-serif-italic";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var n=e.text;return m.contains(["\\imath","\\jmath"],n)?null:(ie[a][n]&&ie[a][n].replace&&(n=ie[a][n].replace),I(n,Je.fontMap[r].fontName,a)?Je.fontMap[r].variant:null)};function It(e){if(!e)return!1;if("mi"===e.type&&1===e.children.length){var t=e.children[0];return t instanceof Tt&&"."===t.text}if("mo"===e.type&&1===e.children.length&&"true"===e.getAttribute("separator")&&"0em"===e.getAttribute("lspace")&&"0em"===e.getAttribute("rspace")){var r=e.children[0];return r instanceof Tt&&","===r.text}return!1}var Rt=function(e,t,r){if(1===e.length){var a=Ot(e[0],t);return r&&a instanceof At&&"mo"===a.type&&(a.setAttribute("lspace","0em"),a.setAttribute("rspace","0em")),[a]}for(var n,i=[],o=0;o<e.length;o++){var s=Ot(e[o],t);if(s instanceof At&&n instanceof At){if("mtext"===s.type&&"mtext"===n.type&&s.getAttribute("mathvariant")===n.getAttribute("mathvariant")){n.children.push(...s.children);continue}if("mn"===s.type&&"mn"===n.type){n.children.push(...s.children);continue}if(It(s)&&"mn"===n.type){n.children.push(...s.children);continue}if("mn"===s.type&&It(n))s.children=[...n.children,...s.children],i.pop();else if(("msup"===s.type||"msub"===s.type)&&s.children.length>=1&&("mn"===n.type||It(n))){var l=s.children[0];l instanceof At&&"mn"===l.type&&(l.children=[...n.children,...l.children],i.pop())}else if("mi"===n.type&&1===n.children.length){var h=n.children[0];if(h instanceof Tt&&"\u0338"===h.text&&("mo"===s.type||"mi"===s.type||"mn"===s.type)){var m=s.children[0];m instanceof Tt&&m.text.length>0&&(m.text=m.text.slice(0,1)+"\u0338"+m.text.slice(1),i.pop())}}}i.push(s),n=s}return i},Ht=function(e,t,r){return Nt(Rt(e,t,r))},Ot=function(e,t){if(!e)return new Bt.MathNode("mrow");if(ot[e.type])return ot[e.type](e,t);throw new i("Got group of unknown type: '"+e.type+"'")};function Et(e,t,r,a,n){var i,o=Rt(e,r);i=1===o.length&&o[0]instanceof At&&m.contains(["mrow","mtable"],o[0].type)?o[0]:new Bt.MathNode("mrow",o);var s=new Bt.MathNode("annotation",[new Bt.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var l=new Bt.MathNode("semantics",[i,s]),h=new Bt.MathNode("math",[l]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&h.setAttribute("display","block");var c=n?"katex":"katex-mathml";return Je.makeSpan([c],[h])}var Lt=function(e){return new L({style:e.displayMode?k.DISPLAY:k.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Dt=function(e,t){if(t.displayMode){var r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Je.makeSpan(r,[e])}return e},Vt={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Pt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ft=function(e,t,r,a,n){var i,o=e.height+e.depth+r+a;if(/fbox|color|angl/.test(t)){if(i=Je.makeSpan(["stretchy",t],[],n),"fbox"===t){var s=n.color&&n.getColor();s&&(i.style.borderColor=s)}}else{var l=[];/^[bx]cancel$/.test(t)&&l.push(new te({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&l.push(new te({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new Q(l,{width:"100%",height:G(o)});i=Je.makeSvgSpan([],[h],n)}return i.height=o,i.style.height=G(o),i},Gt=function(e){var t=new Bt.MathNode("mo",[new Bt.TextNode(Vt[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Ut=function(e,t){var{span:r,minWidth:a,height:n}=function(){var r=4e5,a=e.label.slice(1);if(m.contains(["widehat","widecheck","widetilde","utilde"],a)){var n,i,o,s="ordgroup"===(d=e.base).type?d.body.length:1;if(s>5)"widehat"===a||"widecheck"===a?(n=420,r=2364,o=.42,i=a+"4"):(n=312,r=2340,o=.34,i="tilde4");else{var l=[1,1,2,2,3,3][s];"widehat"===a||"widecheck"===a?(r=[0,1062,2364,2364,2364][l],n=[0,239,300,360,420][l],o=[0,.24,.3,.3,.36,.42][l],i=a+l):(r=[0,600,1033,2339,2340][l],n=[0,260,286,306,312][l],o=[0,.26,.286,.3,.306,.34][l],i="tilde"+l)}var h=new ee(i),c=new Q([h],{width:"100%",height:G(o),viewBox:"0 0 "+r+" "+n,preserveAspectRatio:"none"});return{span:Je.makeSvgSpan([],[c],t),minWidth:0,height:o}}var p,u,d,g=[],f=Pt[a],[v,b,y]=f,x=y/1e3,w=v.length;if(1===w)p=["hide-tail"],u=[f[3]];else if(2===w)p=["halfarrow-left","halfarrow-right"],u=["xMinYMin","xMaxYMin"];else{if(3!==w)throw new Error("Correct katexImagesData or update code here to support\n "+w+" children.");p=["brace-left","brace-center","brace-right"],u=["xMinYMin","xMidYMin","xMaxYMin"]}for(var k=0;k<w;k++){var S=new ee(v[k]),M=new Q([S],{width:"400em",height:G(x),viewBox:"0 0 "+r+" "+y,preserveAspectRatio:u[k]+" slice"}),z=Je.makeSvgSpan([p[k]],[M],t);if(1===w)return{span:z,minWidth:b,height:x};z.style.height=G(x),g.push(z)}return{span:Je.makeSpan(["stretchy"],g,t),minWidth:b,height:x}}();return r.height=n,r.style.height=G(n),a>0&&(r.style.minWidth=G(a)),r};function Yt(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Xt(e){var t=Wt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Wt(e){return e&&("atom"===e.type||ne.hasOwnProperty(e.type))?e:null}var _t=(e,t)=>{var r,a,n;e&&"supsub"===e.type?(r=(a=Yt(e.base,"accent")).base,e.base=r,n=function(e){if(e instanceof j)return e;throw new Error("Expected span<HtmlDomNode> but got "+String(e)+".")}(kt(e,t)),e.base=a):r=(a=Yt(e,"accent")).base;var i=kt(r,t.havingCrampedStyle()),o=0;if(a.isShifty&&m.isCharacterBox(r)){var s=m.getBaseElem(r);o=re(kt(s,t.havingCrampedStyle())).skew}var l,h="\\c"===a.label,c=h?i.height+i.depth:Math.min(i.height,t.fontMetrics().xHeight);if(a.isStretchy)l=Ut(a,t),l=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:l,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+G(2*o)+")",marginLeft:G(2*o)}:void 0}]},t);else{var p,u;"\\vec"===a.label?(p=Je.staticSvg("vec",t),u=Je.svgData.vec[1]):((p=re(p=Je.makeOrd({mode:a.mode,text:a.label},t,"textord"))).italic=0,u=p.width,h&&(c+=p.depth)),l=Je.makeSpan(["accent-body"],[p]);var d="\\textcircled"===a.label;d&&(l.classes.push("accent-full"),c=i.height);var g=o;d||(g-=u/2),l.style.left=G(g),"\\textcircled"===a.label&&(l.style.top=".2em"),l=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-c},{type:"elem",elem:l}]},t)}var f=Je.makeSpan(["mord","accent"],[l],t);return n?(n.children[0]=f,n.height=Math.max(f.height,n.height),n.classes[0]="mord",n):f},jt=(e,t)=>{var r=e.isStretchy?Gt(e.label):new Bt.MathNode("mo",[Ct(e.label,e.mode)]),a=new Bt.MathNode("mover",[Ot(e.base,t),r]);return a.setAttribute("accent","true"),a},$t=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map(e=>"\\"+e).join("|"));st({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{var r=ht(t[0]),a=!$t.test(e.funcName),n=!a||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:_t,mathmlBuilder:jt}),st({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{var r=t[0],a=e.parser.mode;return"math"===a&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),a="text"),{type:"accent",mode:a,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:_t,mathmlBuilder:jt}),st({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0];return{type:"accentUnder",mode:r.mode,label:a,base:n}},htmlBuilder:(e,t)=>{var r=kt(e.base,t),a=Ut(e,t),n="\\utilde"===e.label?.12:0,i=Je.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:r}]},t);return Je.makeSpan(["mord","accentunder"],[i],t)},mathmlBuilder:(e,t)=>{var r=Gt(e.label),a=new Bt.MathNode("munder",[Ot(e.base,t),r]);return a.setAttribute("accentunder","true"),a}});var Zt=e=>{var t=new Bt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};st({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:a,funcName:n}=e;return{type:"xArrow",mode:a.mode,label:n,body:t[0],below:r[0]}},htmlBuilder(e,t){var r,a=t.style,n=t.havingStyle(a.sup()),i=Je.wrapFragment(kt(e.body,n,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";i.classes.push(o+"-arrow-pad"),e.below&&(n=t.havingStyle(a.sub()),(r=Je.wrapFragment(kt(e.below,n,t),t)).classes.push(o+"-arrow-pad"));var s,l=Ut(e,t),h=-t.fontMetrics().axisHeight+.5*l.height,m=-t.fontMetrics().axisHeight-.5*l.height-.111;if((i.depth>.25||"\\xleftequilibrium"===e.label)&&(m-=i.depth),r){var c=-t.fontMetrics().axisHeight+r.height+.5*l.height+.111;s=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h},{type:"elem",elem:r,shift:c}]},t)}else s=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h}]},t);return s.children[0].children[0].children[1].classes.push("svg-align"),Je.makeSpan(["mrel","x-arrow"],[s],t)},mathmlBuilder(e,t){var r,a=Gt(e.label);if(a.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var n=Zt(Ot(e.body,t));if(e.below){var i=Zt(Ot(e.below,t));r=new Bt.MathNode("munderover",[a,i,n])}else r=new Bt.MathNode("mover",[a,n])}else if(e.below){var o=Zt(Ot(e.below,t));r=new Bt.MathNode("munder",[a,o])}else r=Zt(),r=new Bt.MathNode("mover",[a,r]);return r}});var Kt=Je.makeSpan;function Jt(e,t){var r=ft(e.body,t,!0);return Kt([e.mclass],r,t)}function Qt(e,t){var r,a=Rt(e.body,t);return"minner"===e.mclass?r=new Bt.MathNode("mpadded",a):"mord"===e.mclass?e.isCharacterBox?(r=a[0]).type="mi":r=new Bt.MathNode("mi",a):(e.isCharacterBox?(r=a[0]).type="mo":r=new Bt.MathNode("mo",a),"mbin"===e.mclass?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):"mpunct"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):"mopen"===e.mclass||"mclose"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0em"):"minner"===e.mclass&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}st({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(e,t){var{parser:r,funcName:a}=e,n=t[0];return{type:"mclass",mode:r.mode,mclass:"m"+a.slice(5),body:mt(n),isCharacterBox:m.isCharacterBox(n)}},htmlBuilder:Jt,mathmlBuilder:Qt});var er=e=>{var t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};st({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){var{parser:r}=e;return{type:"mclass",mode:r.mode,mclass:er(t[0]),body:mt(t[1]),isCharacterBox:m.isCharacterBox(t[1])}}}),st({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){var r,{parser:a,funcName:n}=e,i=t[1],o=t[0];r="\\stackrel"!==n?er(i):"mrel";var s={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:mt(i)},l={type:"supsub",mode:o.mode,base:s,sup:"\\underset"===n?null:o,sub:"\\underset"===n?o:null};return{type:"mclass",mode:a.mode,mclass:r,body:[l],isCharacterBox:m.isCharacterBox(l)}},htmlBuilder:Jt,mathmlBuilder:Qt}),st({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"pmb",mode:r.mode,mclass:er(t[0]),body:mt(t[0])}},htmlBuilder(e,t){var r=ft(e.body,t,!0),a=Je.makeSpan([e.mclass],r,t);return a.style.textShadow="0.02em 0.01em 0.04px",a},mathmlBuilder(e,t){var r=Rt(e.body,t),a=new Bt.MathNode("mstyle",r);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var tr={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},rr=()=>({type:"styling",body:[],mode:"math",style:"display"}),ar=e=>"textord"===e.type&&"@"===e.text,nr=(e,t)=>("mathord"===e.type||"atom"===e.type)&&e.text===t;function ir(e,t,r){var a=tr[e];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(a,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var n={type:"atom",text:a,mode:"math",family:"rel"},i={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[n],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[i],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}st({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:a}=e;return{type:"cdlabel",mode:r.mode,side:a.slice(4),label:t[0]}},htmlBuilder(e,t){var r=t.havingStyle(t.style.sup()),a=Je.wrapFragment(kt(e.label,r,t),t);return a.classes.push("cd-label-"+e.side),a.style.bottom=G(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(e,t){var r=new Bt.MathNode("mrow",[Ot(e.label,t)]);return(r=new Bt.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Bt.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),st({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){var{parser:r}=e;return{type:"cdlabelparent",mode:r.mode,fragment:t[0]}},htmlBuilder(e,t){var r=Je.wrapFragment(kt(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder:(e,t)=>new Bt.MathNode("mrow",[Ot(e.fragment,t)])}),st({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){for(var{parser:r}=e,a=Yt(t[0],"ordgroup").body,n="",o=0;o<a.length;o++){n+=Yt(a[o],"textord").text}var s,l=parseInt(n);if(isNaN(l))throw new i("\\@char has non-numeric argument "+n);if(l<0||l>=1114111)throw new i("\\@char with invalid code point "+n);return l<=65535?s=String.fromCharCode(l):(l-=65536,s=String.fromCharCode(55296+(l>>10),56320+(1023&l))),{type:"textord",mode:r.mode,text:s}}});var or=(e,t)=>{var r=ft(e.body,t.withColor(e.color),!1);return Je.makeFragment(r)},sr=(e,t)=>{var r=Rt(e.body,t.withColor(e.color)),a=new Bt.MathNode("mstyle",r);return a.setAttribute("mathcolor",e.color),a};st({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){var{parser:r}=e,a=Yt(t[0],"color-token").color,n=t[1];return{type:"color",mode:r.mode,color:a,body:mt(n)}},htmlBuilder:or,mathmlBuilder:sr}),st({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){var{parser:r,breakOnTokenText:a}=e,n=Yt(t[0],"color-token").color;r.gullet.macros.set("\\current@color",n);var i=r.parseExpression(!0,a);return{type:"color",mode:r.mode,color:n,body:i}},htmlBuilder:or,mathmlBuilder:sr}),st({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){var{parser:a}=e,n="["===a.gullet.future().text?a.parseSizeGroup(!0):null,i=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:a.mode,newLine:i,size:n&&Yt(n,"size").value}},htmlBuilder(e,t){var r=Je.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=G(F(e.size,t)))),r},mathmlBuilder(e,t){var r=new Bt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",G(F(e.size,t)))),r}});var lr={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},hr=e=>{var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new i("Expected a control sequence",e);return t},mr=(e,t,r,a)=>{var n=e.gullet.macros.get(r.text);null==n&&(r.noexpand=!0,n={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,n,a)};st({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:t,funcName:r}=e;t.consumeSpaces();var a=t.fetch();if(lr[a.text])return"\\global"!==r&&"\\\\globallong"!==r||(a.text=lr[a.text]),Yt(t.parseFunction(),"internal");throw new i("Invalid token after macro prefix",a)}}),st({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,a=t.gullet.popToken(),n=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new i("Expected a control sequence",a);for(var o,s=0,l=[[]];"{"!==t.gullet.future().text;)if("#"===(a=t.gullet.popToken()).text){if("{"===t.gullet.future().text){o=t.gullet.future(),l[s].push("{");break}if(a=t.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new i('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new i('Argument number "'+a.text+'" out of order');s++,l.push([])}else{if("EOF"===a.text)throw new i("Expected a macro definition");l[s].push(a.text)}var{tokens:h}=t.gullet.consumeArg();return o&&h.unshift(o),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h)).reverse(),t.gullet.macros.set(n,{tokens:h,numArgs:s,delimiters:l},r===lr[r]),{type:"internal",mode:t.mode}}}),st({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,a=hr(t.gullet.popToken());t.gullet.consumeSpaces();var n=(e=>{var t=e.gullet.popToken();return"="===t.text&&" "===(t=e.gullet.popToken()).text&&(t=e.gullet.popToken()),t})(t);return mr(t,a,n,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),st({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,a=hr(t.gullet.popToken()),n=t.gullet.popToken(),i=t.gullet.popToken();return mr(t,a,i,"\\\\globalfuture"===r),t.gullet.pushToken(i),t.gullet.pushToken(n),{type:"internal",mode:t.mode}}});var cr=function(e,t,r){var a=I(ie.math[e]&&ie.math[e].replace||e,t,r);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return a},pr=function(e,t,r,a){var n=r.havingBaseStyle(t),i=Je.makeSpan(a.concat(n.sizingClasses(r)),[e],r),o=n.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=n.sizeMultiplier,i},ur=function(e,t,r){var a=t.havingBaseStyle(r),n=(1-t.sizeMultiplier/a.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=G(n),e.height-=n,e.depth+=n},dr=function(e,t,r,a,n,i){var o=function(e,t,r,a){return Je.makeSymbol(e,"Size"+t+"-Regular",r,a)}(e,t,n,a),s=pr(Je.makeSpan(["delimsizing","size"+t],[o],a),k.TEXT,a,i);return r&&ur(s,a,k.TEXT),s},gr=function(e,t,r){var a;return a="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:Je.makeSpan(["delimsizinginner",a],[Je.makeSpan([],[Je.makeSymbol(e,t,r)])])}},fr=function(e,t,r){var a=C["Size4-Regular"][e.charCodeAt(0)]?C["Size4-Regular"][e.charCodeAt(0)][4]:C["Size1-Regular"][e.charCodeAt(0)][4],n=new ee("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),i=new Q([n],{width:G(a),height:G(t),style:"width:"+G(a),viewBox:"0 0 "+1e3*a+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),o=Je.makeSvgSpan([],[i],r);return o.height=t,o.style.height=G(t),o.style.width=G(a),{type:"elem",elem:o}},vr={type:"kern",size:-.008},br=["|","\\lvert","\\rvert","\\vert"],yr=["\\|","\\lVert","\\rVert","\\Vert"],xr=function(e,t,r,a,n,i){var o,s,l,h,c="",p=0;o=l=h=e,s=null;var u="Size1-Regular";"\\uparrow"===e?l=h="\u23d0":"\\Uparrow"===e?l=h="\u2016":"\\downarrow"===e?o=l="\u23d0":"\\Downarrow"===e?o=l="\u2016":"\\updownarrow"===e?(o="\\uparrow",l="\u23d0",h="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",l="\u2016",h="\\Downarrow"):m.contains(br,e)?(l="\u2223",c="vert",p=333):m.contains(yr,e)?(l="\u2225",c="doublevert",p=556):"["===e||"\\lbrack"===e?(o="\u23a1",l="\u23a2",h="\u23a3",u="Size4-Regular",c="lbrack",p=667):"]"===e||"\\rbrack"===e?(o="\u23a4",l="\u23a5",h="\u23a6",u="Size4-Regular",c="rbrack",p=667):"\\lfloor"===e||"\u230a"===e?(l=o="\u23a2",h="\u23a3",u="Size4-Regular",c="lfloor",p=667):"\\lceil"===e||"\u2308"===e?(o="\u23a1",l=h="\u23a2",u="Size4-Regular",c="lceil",p=667):"\\rfloor"===e||"\u230b"===e?(l=o="\u23a5",h="\u23a6",u="Size4-Regular",c="rfloor",p=667):"\\rceil"===e||"\u2309"===e?(o="\u23a4",l=h="\u23a5",u="Size4-Regular",c="rceil",p=667):"("===e||"\\lparen"===e?(o="\u239b",l="\u239c",h="\u239d",u="Size4-Regular",c="lparen",p=875):")"===e||"\\rparen"===e?(o="\u239e",l="\u239f",h="\u23a0",u="Size4-Regular",c="rparen",p=875):"\\{"===e||"\\lbrace"===e?(o="\u23a7",s="\u23a8",h="\u23a9",l="\u23aa",u="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="\u23ab",s="\u23ac",h="\u23ad",l="\u23aa",u="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(o="\u23a7",h="\u23a9",l="\u23aa",u="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(o="\u23ab",h="\u23ad",l="\u23aa",u="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(o="\u23a7",h="\u23ad",l="\u23aa",u="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(o="\u23ab",h="\u23a9",l="\u23aa",u="Size4-Regular");var d=cr(o,u,n),g=d.height+d.depth,f=cr(l,u,n),v=f.height+f.depth,b=cr(h,u,n),y=b.height+b.depth,x=0,w=1;if(null!==s){var S=cr(s,u,n);x=S.height+S.depth,w=2}var M=g+y+x,z=M+Math.max(0,Math.ceil((t-M)/(w*v)))*w*v,A=a.fontMetrics().axisHeight;r&&(A*=a.sizeMultiplier);var T=z/2-A,B=[];if(c.length>0){var C=z-g-y,N=Math.round(1e3*z),q=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v1759 h347 v-84\nH403z M403 1759 V0 H319 V1759 v"+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v"+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z\nM367 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v"+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+" v1715 h263 v84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+" v1799 H0 v-84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v602 h84z\nM403 1759 V0 H319 V1759 v"+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v602 h84z\nM347 1759 V0 h-84 V1759 v"+t+" v602 h84z";case"lparen":return"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\n-36,557 l0,"+(t+84)+"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\nl0,-"+(t+92)+"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z";case"rparen":return"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,"+(t+9)+"\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\nl0,-"+(t+144)+"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z";default:throw new Error("Unknown stretchy delimiter.")}}(c,Math.round(1e3*C)),I=new ee(c,q),R=(p/1e3).toFixed(3)+"em",H=(N/1e3).toFixed(3)+"em",O=new Q([I],{width:R,height:H,viewBox:"0 0 "+p+" "+N}),E=Je.makeSvgSpan([],[O],a);E.height=N/1e3,E.style.width=R,E.style.height=H,B.push({type:"elem",elem:E})}else{if(B.push(gr(h,u,n)),B.push(vr),null===s){var L=z-g-y+.016;B.push(fr(l,L,a))}else{var D=(z-g-y-x)/2+.016;B.push(fr(l,D,a)),B.push(vr),B.push(gr(s,u,n)),B.push(vr),B.push(fr(l,D,a))}B.push(vr),B.push(gr(o,u,n))}var V=a.havingBaseStyle(k.TEXT),P=Je.makeVList({positionType:"bottom",positionData:T,children:B},V);return pr(Je.makeSpan(["delimsizing","mult"],[P],V),k.TEXT,a,i)},wr=.08,kr=function(e,t,r,a,n){var i=function(e,t,r){t*=1e3;var a="";switch(e){case"sqrtMain":a=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize1":a=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize2":a=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize3":a=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize4":a=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,A);break;case"sqrtTall":a=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,A,r)}return a}(e,a,r),o=new ee(e,i),s=new Q([o],{width:"400em",height:G(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Je.makeSvgSpan(["hide-tail"],[s],n)},Sr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],Mr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],zr=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Ar=[0,1.2,1.8,2.4,3],Tr=[{type:"small",style:k.SCRIPTSCRIPT},{type:"small",style:k.SCRIPT},{type:"small",style:k.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],Br=[{type:"small",style:k.SCRIPTSCRIPT},{type:"small",style:k.SCRIPT},{type:"small",style:k.TEXT},{type:"stack"}],Cr=[{type:"small",style:k.SCRIPTSCRIPT},{type:"small",style:k.SCRIPT},{type:"small",style:k.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Nr=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},qr=function(e,t,r,a){for(var n=Math.min(2,3-a.style.size);n<r.length&&"stack"!==r[n].type;n++){var i=cr(e,Nr(r[n]),"math"),o=i.height+i.depth;if("small"===r[n].type&&(o*=a.havingBaseStyle(r[n].style).sizeMultiplier),o>t)return r[n]}return r[r.length-1]},Ir=function(e,t,r,a,n,i){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=m.contains(zr,e)?Tr:m.contains(Sr,e)?Cr:Br;var s=qr(e,t,o,a);return"small"===s.type?function(e,t,r,a,n,i){var o=Je.makeSymbol(e,"Main-Regular",n,a),s=pr(o,t,a,i);return r&&ur(s,a,t),s}(e,s.style,r,a,n,i):"large"===s.type?dr(e,s.size,r,a,n,i):xr(e,t,r,a,n,i)},Rr={sqrtImage:function(e,t){var r,a,n=t.havingBaseSizing(),i=qr("\\surd",e*n.sizeMultiplier,Cr,n),o=n.sizeMultiplier,s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(e<1?o=1:e<1.4&&(o=.7),h=(1+s)/o,(r=kr("sqrtMain",l=(1+s+wr)/o,m=1e3+1e3*s+80,s,t)).style.minWidth="0.853em",a=.833/o):"large"===i.type?(m=1080*Ar[i.size],h=(Ar[i.size]+s)/o,l=(Ar[i.size]+s+wr)/o,(r=kr("sqrtSize"+i.size,l,m,s,t)).style.minWidth="1.02em",a=1/o):(l=e+s+wr,h=e+s,m=Math.floor(1e3*e+s)+80,(r=kr("sqrtTall",l,m,s,t)).style.minWidth="0.742em",a=1.056),r.height=h,r.style.height=G(l),{span:r,advanceWidth:a,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,a,n){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),m.contains(Sr,e)||m.contains(zr,e))return dr(e,t,!1,r,a,n);if(m.contains(Mr,e))return xr(e,Ar[t],!1,r,a,n);throw new i("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:Ar,customSizedDelim:Ir,leftRightDelim:function(e,t,r,a,n,i){var o=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return Ir(e,h,!0,a,n,i)}},Hr={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Or=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Er(e,t){var r=Wt(e);if(r&&m.contains(Or,r.text))return r;throw new i(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function Lr(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}st({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>{var r=Er(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Hr[e.funcName].size,mclass:Hr[e.funcName].mclass,delim:r.text}},htmlBuilder:(e,t)=>"."===e.delim?Je.makeSpan([e.mclass]):Rr.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{var t=[];"."!==e.delim&&t.push(Ct(e.delim,e.mode));var r=new Bt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var a=G(Rr.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",a),r.setAttribute("maxsize",a),r}}),st({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!=typeof r)throw new i("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Er(t[0],e).text,color:r}}}),st({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=Er(t[0],e),a=e.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var i=Yt(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:(e,t)=>{Lr(e);for(var r,a,n=ft(e.body,t,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l<n.length;l++)n[l].isMiddle?s=!0:(i=Math.max(n[l].height,i),o=Math.max(n[l].depth,o));if(i*=t.sizeMultiplier,o*=t.sizeMultiplier,r="."===e.left?wt(t,["mopen"]):Rr.leftRightDelim(e.left,i,o,t,e.mode,["mopen"]),n.unshift(r),s)for(var h=1;h<n.length;h++){var m=n[h].isMiddle;m&&(n[h]=Rr.leftRightDelim(m.delim,i,o,m.options,e.mode,[]))}if("."===e.right)a=wt(t,["mclose"]);else{var c=e.rightColor?t.withColor(e.rightColor):t;a=Rr.leftRightDelim(e.right,i,o,c,e.mode,["mclose"])}return n.push(a),Je.makeSpan(["minner"],n,t)},mathmlBuilder:(e,t)=>{Lr(e);var r=Rt(e.body,t);if("."!==e.left){var a=new Bt.MathNode("mo",[Ct(e.left,e.mode)]);a.setAttribute("fence","true"),r.unshift(a)}if("."!==e.right){var n=new Bt.MathNode("mo",[Ct(e.right,e.mode)]);n.setAttribute("fence","true"),e.rightColor&&n.setAttribute("mathcolor",e.rightColor),r.push(n)}return Nt(r)}}),st({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=Er(t[0],e);if(!e.parser.leftrightDepth)throw new i("\\middle without preceding \\left",r);return{type:"middle",mode:e.parser.mode,delim:r.text}},htmlBuilder:(e,t)=>{var r;if("."===e.delim)r=wt(t,[]);else{r=Rr.sizedDelim(e.delim,1,t,e.mode,[]);var a={delim:e.delim,options:t};r.isMiddle=a}return r},mathmlBuilder:(e,t)=>{var r="\\vert"===e.delim||"|"===e.delim?Ct("|","text"):Ct(e.delim,e.mode),a=new Bt.MathNode("mo",[r]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Dr=(e,t)=>{var r,a,n,i=Je.wrapFragment(kt(e.body,t),t),o=e.label.slice(1),s=t.sizeMultiplier,l=0,h=m.isCharacterBox(e.body);if("sout"===o)(r=Je.makeSpan(["stretchy","sout"])).height=t.fontMetrics().defaultRuleThickness/s,l=-.5*t.fontMetrics().xHeight;else if("phase"===o){var c=F({number:.6,unit:"pt"},t),p=F({number:.35,unit:"ex"},t);s/=t.havingBaseSizing().sizeMultiplier;var u=i.height+i.depth+c+p;i.style.paddingLeft=G(u/2+c);var d=Math.floor(1e3*u*s),g="M400000 "+(a=d)+" H0 L"+a/2+" 0 l65 45 L145 "+(a-80)+" H400000z",f=new Q([new ee("phase",g)],{width:"400em",height:G(d/1e3),viewBox:"0 0 400000 "+d,preserveAspectRatio:"xMinYMin slice"});(r=Je.makeSvgSpan(["hide-tail"],[f],t)).style.height=G(u),l=i.depth+c+p}else{/cancel/.test(o)?h||i.classes.push("cancel-pad"):"angl"===o?i.classes.push("anglpad"):i.classes.push("boxpad");var v=0,b=0,y=0;/box/.test(o)?(y=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),b=v=t.fontMetrics().fboxsep+("colorbox"===o?0:y)):"angl"===o?(v=4*(y=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness)),b=Math.max(0,.25-i.depth)):b=v=h?.2:0,r=Ft(i,o,v,b,t),/fbox|boxed|fcolorbox/.test(o)?(r.style.borderStyle="solid",r.style.borderWidth=G(y)):"angl"===o&&.049!==y&&(r.style.borderTopWidth=G(y),r.style.borderRightWidth=G(y)),l=i.depth+b,e.backgroundColor&&(r.style.backgroundColor=e.backgroundColor,e.borderColor&&(r.style.borderColor=e.borderColor))}if(e.backgroundColor)n=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:l},{type:"elem",elem:i,shift:0}]},t);else{var x=/cancel|phase/.test(o)?["svg-align"]:[];n=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:0},{type:"elem",elem:r,shift:l,wrapperClasses:x}]},t)}return/cancel/.test(o)&&(n.height=i.height,n.depth=i.depth),/cancel/.test(o)&&!h?Je.makeSpan(["mord","cancel-lap"],[n],t):Je.makeSpan(["mord"],[n],t)},Vr=(e,t)=>{var r=0,a=new Bt.MathNode(e.label.indexOf("colorbox")>-1?"mpadded":"menclose",[Ot(e.body,t)]);switch(e.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\phase":a.setAttribute("notation","phasorangle");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\angl":a.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*r+"pt"),a.setAttribute("height","+"+2*r+"pt"),a.setAttribute("lspace",r+"pt"),a.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){var n=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(e.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&a.setAttribute("mathbackground",e.backgroundColor),a};st({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){var{parser:a,funcName:n}=e,i=Yt(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:i,body:o}},htmlBuilder:Dr,mathmlBuilder:Vr}),st({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(e,t,r){var{parser:a,funcName:n}=e,i=Yt(t[0],"color-token").color,o=Yt(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:Dr,mathmlBuilder:Vr}),st({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\fbox",body:t[0]}}}),st({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:a}=e,n=t[0];return{type:"enclose",mode:r.mode,label:a,body:n}},htmlBuilder:Dr,mathmlBuilder:Vr}),st({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(e,t){var{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\angl",body:t[0]}}});var Pr={};function Fr(e){for(var{type:t,names:r,props:a,handler:n,htmlBuilder:i,mathmlBuilder:o}=e,s={type:t,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n},l=0;l<r.length;++l)Pr[r[l]]=s;i&&(it[t]=i),o&&(ot[t]=o)}var Gr={};function Ur(e,t){Gr[e]=t}function Yr(e){var t=[];e.consumeSpaces();var r=e.fetch().text;for("\\relax"===r&&(e.consume(),e.consumeSpaces(),r=e.fetch().text);"\\hline"===r||"\\hdashline"===r;)e.consume(),t.push("\\hdashline"===r),e.consumeSpaces(),r=e.fetch().text;return t}var Xr=e=>{if(!e.parser.settings.displayMode)throw new i("{"+e.envName+"} can be used only in display mode.")};function Wr(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function _r(e,t,r){var{hskipBeforeAndAfter:a,addJot:o,cols:s,arraystretch:l,colSeparationType:h,autoTag:m,singleRow:c,emptySingleRow:p,maxNumCols:u,leqno:d}=t;if(e.gullet.beginGroup(),c||e.gullet.macros.set("\\cr","\\\\\\relax"),!l){var g=e.gullet.expandMacroAsText("\\arraystretch");if(null==g)l=1;else if(!(l=parseFloat(g))||l<0)throw new i("Invalid \\arraystretch: "+g)}e.gullet.beginGroup();var f=[],v=[f],b=[],y=[],x=null!=m?[]:void 0;function w(){m&&e.gullet.macros.set("\\@eqnsw","1",!0)}function k(){x&&(e.gullet.macros.get("\\df@tag")?(x.push(e.subparse([new n("\\df@tag")])),e.gullet.macros.set("\\df@tag",void 0,!0)):x.push(Boolean(m)&&"1"===e.gullet.macros.get("\\@eqnsw")))}for(w(),y.push(Yr(e));;){var S=e.parseExpression(!1,c?"\\end":"\\\\");e.gullet.endGroup(),e.gullet.beginGroup(),S={type:"ordgroup",mode:e.mode,body:S},r&&(S={type:"styling",mode:e.mode,style:r,body:[S]}),f.push(S);var M=e.fetch().text;if("&"===M){if(u&&f.length===u){if(c||h)throw new i("Too many tab characters: &",e.nextToken);e.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}e.consume()}else{if("\\end"===M){k(),1===f.length&&"styling"===S.type&&0===S.body[0].body.length&&(v.length>1||!p)&&v.pop(),y.length<v.length+1&&y.push([]);break}if("\\\\"!==M)throw new i("Expected & or \\\\ or \\cr or \\end",e.nextToken);e.consume();var z=void 0;" "!==e.gullet.future().text&&(z=e.parseSizeGroup(!0)),b.push(z?z.value:null),k(),y.push(Yr(e)),f=[],v.push(f),w()}}return e.gullet.endGroup(),e.gullet.endGroup(),{type:"array",mode:e.mode,addJot:o,arraystretch:l,body:v,cols:s,rowGaps:b,hskipBeforeAndAfter:a,hLinesBeforeRow:y,colSeparationType:h,tags:x,leqno:d}}function jr(e){return"d"===e.slice(0,1)?"display":"text"}var $r=function(e,t){var r,a,n=e.body.length,o=e.hLinesBeforeRow,s=0,l=new Array(n),h=[],c=Math.max(t.fontMetrics().arrayRuleWidth,t.minRuleThickness),p=1/t.fontMetrics().ptPerEm,u=5*p;e.colSeparationType&&"small"===e.colSeparationType&&(u=t.havingStyle(k.SCRIPT).sizeMultiplier/t.sizeMultiplier*.2778);var d="CD"===e.colSeparationType?F({number:3,unit:"ex"},t):12*p,g=3*p,f=e.arraystretch*d,v=.7*f,b=.3*f,y=0;function x(e){for(var t=0;t<e.length;++t)t>0&&(y+=.25),h.push({pos:y,isDashed:e[t]})}for(x(o[0]),r=0;r<e.body.length;++r){var w=e.body[r],S=v,M=b;s<w.length&&(s=w.length);var z=new Array(w.length);for(a=0;a<w.length;++a){var A=kt(w[a],t);M<A.depth&&(M=A.depth),S<A.height&&(S=A.height),z[a]=A}var T=e.rowGaps[r],B=0;T&&(B=F(T,t))>0&&(M<(B+=b)&&(M=B),B=0),e.addJot&&(M+=g),z.height=S,z.depth=M,y+=S,z.pos=y,y+=M+B,l[r]=z,x(o[r+1])}var C,N,q=y/2+t.fontMetrics().axisHeight,I=e.cols||[],R=[],H=[];if(e.tags&&e.tags.some(e=>e))for(r=0;r<n;++r){var O=l[r],E=O.pos-q,L=e.tags[r],D=void 0;(D=!0===L?Je.makeSpan(["eqn-num"],[],t):!1===L?Je.makeSpan([],[],t):Je.makeSpan([],ft(L,t,!0),t)).depth=O.depth,D.height=O.height,H.push({type:"elem",elem:D,shift:E})}for(a=0,N=0;a<s||N<I.length;++a,++N){for(var V=I[N]||{},P=!0;"separator"===V.type;){if(P||((C=Je.makeSpan(["arraycolsep"],[])).style.width=G(t.fontMetrics().doubleRuleSep),R.push(C)),"|"!==V.separator&&":"!==V.separator)throw new i("Invalid separator type: "+V.separator);var U="|"===V.separator?"solid":"dashed",Y=Je.makeSpan(["vertical-separator"],[],t);Y.style.height=G(y),Y.style.borderRightWidth=G(c),Y.style.borderRightStyle=U,Y.style.margin="0 "+G(-c/2);var X=y-q;X&&(Y.style.verticalAlign=G(-X)),R.push(Y),V=I[++N]||{},P=!1}if(!(a>=s)){var W=void 0;(a>0||e.hskipBeforeAndAfter)&&0!==(W=m.deflt(V.pregap,u))&&((C=Je.makeSpan(["arraycolsep"],[])).style.width=G(W),R.push(C));var _=[];for(r=0;r<n;++r){var j=l[r],$=j[a];if($){var Z=j.pos-q;$.depth=j.depth,$.height=j.height,_.push({type:"elem",elem:$,shift:Z})}}_=Je.makeVList({positionType:"individualShift",children:_},t),_=Je.makeSpan(["col-align-"+(V.align||"c")],[_]),R.push(_),(a<s-1||e.hskipBeforeAndAfter)&&0!==(W=m.deflt(V.postgap,u))&&((C=Je.makeSpan(["arraycolsep"],[])).style.width=G(W),R.push(C))}}if(l=Je.makeSpan(["mtable"],R),h.length>0){for(var K=Je.makeLineSpan("hline",t,c),J=Je.makeLineSpan("hdashline",t,c),Q=[{type:"elem",elem:l,shift:0}];h.length>0;){var ee=h.pop(),te=ee.pos-q;ee.isDashed?Q.push({type:"elem",elem:J,shift:te}):Q.push({type:"elem",elem:K,shift:te})}l=Je.makeVList({positionType:"individualShift",children:Q},t)}if(0===H.length)return Je.makeSpan(["mord"],[l],t);var re=Je.makeVList({positionType:"individualShift",children:H},t);return re=Je.makeSpan(["tag"],[re],t),Je.makeFragment([l,re])},Zr={c:"center ",l:"left ",r:"right "},Kr=function(e,t){for(var r=[],a=new Bt.MathNode("mtd",[],["mtr-glue"]),n=new Bt.MathNode("mtd",[],["mml-eqn-num"]),i=0;i<e.body.length;i++){for(var o=e.body[i],s=[],l=0;l<o.length;l++)s.push(new Bt.MathNode("mtd",[Ot(o[l],t)]));e.tags&&e.tags[i]&&(s.unshift(a),s.push(a),e.leqno?s.unshift(n):s.push(n)),r.push(new Bt.MathNode("mtr",s))}var h=new Bt.MathNode("mtable",r),m=.5===e.arraystretch?.1:.16+e.arraystretch-1+(e.addJot?.09:0);h.setAttribute("rowspacing",G(m));var c="",p="";if(e.cols&&e.cols.length>0){var u=e.cols,d="",g=!1,f=0,v=u.length;"separator"===u[0].type&&(c+="top ",f=1),"separator"===u[u.length-1].type&&(c+="bottom ",v-=1);for(var b=f;b<v;b++)"align"===u[b].type?(p+=Zr[u[b].align],g&&(d+="none "),g=!0):"separator"===u[b].type&&g&&(d+="|"===u[b].separator?"solid ":"dashed ",g=!1);h.setAttribute("columnalign",p.trim()),/[sd]/.test(d)&&h.setAttribute("columnlines",d.trim())}if("align"===e.colSeparationType){for(var y=e.cols||[],x="",w=1;w<y.length;w++)x+=w%2?"0em ":"1em ";h.setAttribute("columnspacing",x.trim())}else"alignat"===e.colSeparationType||"gather"===e.colSeparationType?h.setAttribute("columnspacing","0em"):"small"===e.colSeparationType?h.setAttribute("columnspacing","0.2778em"):"CD"===e.colSeparationType?h.setAttribute("columnspacing","0.5em"):h.setAttribute("columnspacing","1em");var k="",S=e.hLinesBeforeRow;c+=S[0].length>0?"left ":"",c+=S[S.length-1].length>0?"right ":"";for(var M=1;M<S.length-1;M++)k+=0===S[M].length?"none ":S[M][0]?"dashed ":"solid ";return/[sd]/.test(k)&&h.setAttribute("rowlines",k.trim()),""!==c&&(h=new Bt.MathNode("menclose",[h])).setAttribute("notation",c.trim()),e.arraystretch&&e.arraystretch<1&&(h=new Bt.MathNode("mstyle",[h])).setAttribute("scriptlevel","1"),h},Jr=function(e,t){-1===e.envName.indexOf("ed")&&Xr(e);var r,a=[],n=e.envName.indexOf("at")>-1?"alignat":"align",o="split"===e.envName,s=_r(e.parser,{cols:a,addJot:!0,autoTag:o?void 0:Wr(e.envName),emptySingleRow:!0,colSeparationType:n,maxNumCols:o?2:void 0,leqno:e.parser.settings.leqno},"display"),l=0,h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var m="",c=0;c<t[0].body.length;c++){m+=Yt(t[0].body[c],"textord").text}r=Number(m),l=2*r}var p=!l;s.body.forEach(function(e){for(var t=1;t<e.length;t+=2){var a=Yt(e[t],"styling");Yt(a.body[0],"ordgroup").body.unshift(h)}if(p)l<e.length&&(l=e.length);else{var n=e.length/2;if(r<n)throw new i("Too many math in a row: expected "+r+", but got "+n,e[0])}});for(var u=0;u<l;++u){var d="r",g=0;u%2==1?d="l":u>0&&p&&(g=1),a[u]={type:"align",align:d,pregap:g,postgap:0}}return s.colSeparationType=p?"align":"alignat",s};Fr({type:"array",names:["array","darray"],props:{numArgs:1},handler(e,t){var r=(Wt(t[0])?[t[0]]:Yt(t[0],"ordgroup").body).map(function(e){var t=Xt(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new i("Unknown column alignment: "+t,e)}),a={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return _r(e.parser,a,jr(e.envName))},htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){var n=e.parser;if(n.consumeSpaces(),"["===n.fetch().text){if(n.consume(),n.consumeSpaces(),r=n.fetch().text,-1==="lcr".indexOf(r))throw new i("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:r}]}}var o=_r(e.parser,a,jr(e.envName)),s=Math.max(0,...o.body.map(e=>e.length));return o.cols=new Array(s).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[o],left:t[0],right:t[1],rightColor:void 0}:o},htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){var t=_r(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){var r=(Wt(t[0])?[t[0]]:Yt(t[0],"ordgroup").body).map(function(e){var t=Xt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new i("Unknown column alignment: "+t,e)});if(r.length>1)throw new i("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=_r(e.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new i("{subarray} can contain only one column");return a},htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(e){var t=_r(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},jr(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Jr,htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(e){m.contains(["gather","gather*"],e.envName)&&Xr(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Wr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return _r(e.parser,t,"display")},htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Jr,htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(e){Xr(e);var t={autoTag:Wr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return _r(e.parser,t,"display")},htmlBuilder:$r,mathmlBuilder:Kr}),Fr({type:"array",names:["CD"],props:{numArgs:0},handler:e=>(Xr(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new i("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var a=[],n=[a],o=0;o<t.length;o++){for(var s=t[o],l=rr(),h=0;h<s.length;h++)if(ar(s[h])){a.push(l);var m=Xt(s[h+=1]).text,c=new Array(2);if(c[0]={type:"ordgroup",mode:"math",body:[]},c[1]={type:"ordgroup",mode:"math",body:[]},"=|.".indexOf(m)>-1);else{if(!("<>AV".indexOf(m)>-1))throw new i('Expected one of "<>AV=|." after @',s[h]);for(var p=0;p<2;p++){for(var u=!0,d=h+1;d<s.length;d++){if(nr(s[d],m)){u=!1,h=d;break}if(ar(s[d]))throw new i("Missing a "+m+" character to complete a CD arrow.",s[d]);c[p].body.push(s[d])}if(u)throw new i("Missing a "+m+" character to complete a CD arrow.",s[h])}}var g={type:"styling",body:[ir(m,c,e)],mode:"math",style:"display"};a.push(g),l=rr()}else l.body.push(s[h]);o%2==0?a.push(l):a.shift(),a=[],n.push(a)}return e.gullet.endGroup(),e.gullet.endGroup(),{type:"array",mode:"math",body:n,arraystretch:1,addJot:!0,rowGaps:[null],cols:new Array(n[0].length).fill({type:"align",align:"c",pregap:.25,postgap:.25}),colSeparationType:"CD",hLinesBeforeRow:new Array(n.length+1).fill([])}}(e.parser)),htmlBuilder:$r,mathmlBuilder:Kr}),Ur("\\nonumber","\\gdef\\@eqnsw{0}"),Ur("\\notag","\\nonumber"),st({type:"text",names:["\\hline","\\hdashline"],props:{numArgs:0,allowedInText:!0,allowedInMath:!0},handler(e,t){throw new i(e.funcName+" valid only within array environment")}});var Qr=Pr;st({type:"environment",names:["\\begin","\\end"],props:{numArgs:1,argTypes:["text"]},handler(e,t){var{parser:r,funcName:a}=e,n=t[0];if("ordgroup"!==n.type)throw new i("Invalid environment name",n);for(var o="",s=0;s<n.body.length;++s)o+=Yt(n.body[s],"textord").text;if("\\begin"===a){if(!Qr.hasOwnProperty(o))throw new i("No such environment: "+o,n);var l=Qr[o],{args:h,optArgs:m}=r.parseArguments("\\begin{"+o+"}",l),c={mode:r.mode,envName:o,parser:r},p=l.handler(c,h,m);r.expect("\\end",!1);var u=r.nextToken,d=Yt(r.parseFunction(),"environment");if(d.name!==o)throw new i("Mismatch: \\begin{"+o+"} matched by \\end{"+d.name+"}",u);return p}return{type:"environment",mode:r.mode,name:o,nameGroup:n}}});var ea=(e,t)=>{var r=e.font,a=t.withFont(r);return kt(e.body,a)},ta=(e,t)=>{var r=e.font,a=t.withFont(r);return Ot(e.body,a)},ra={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};st({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=ht(t[0]),i=a;return i in ra&&(i=ra[i]),{type:"font",mode:r.mode,font:i.slice(1),body:n}},htmlBuilder:ea,mathmlBuilder:ta}),st({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{var{parser:r}=e,a=t[0],n=m.isCharacterBox(a);return{type:"mclass",mode:r.mode,mclass:er(a),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:a}],isCharacterBox:n}}}),st({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{parser:r,funcName:a,breakOnTokenText:n}=e,{mode:i}=r,o=r.parseExpression(!0,n);return{type:"font",mode:i,font:"math"+a.slice(1),body:{type:"ordgroup",mode:r.mode,body:o}}},htmlBuilder:ea,mathmlBuilder:ta});var aa=(e,t)=>{var r=t;return"display"===e?r=r.id>=k.SCRIPT.id?r.text():k.DISPLAY:"text"===e&&r.size===k.DISPLAY.size?r=k.TEXT:"script"===e?r=k.SCRIPT:"scriptscript"===e&&(r=k.SCRIPTSCRIPT),r},na=(e,t)=>{var r,a=aa(e.size,t.style),n=a.fracNum(),i=a.fracDen();r=t.havingStyle(n);var o=kt(e.numer,r,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height<s?s:o.height,o.depth=o.depth<l?l:o.depth}r=t.havingStyle(i);var h,m,c,p,u,d,g,f,v,b,y=kt(e.denom,r,t);if(e.hasBarLine?(e.barSize?(m=F(e.barSize,t),h=Je.makeLineSpan("frac-line",t,m)):h=Je.makeLineSpan("frac-line",t),m=h.height,c=h.height):(h=null,m=0,c=t.fontMetrics().defaultRuleThickness),a.size===k.DISPLAY.size||"display"===e.size?(p=t.fontMetrics().num1,u=m>0?3*c:7*c,d=t.fontMetrics().denom1):(m>0?(p=t.fontMetrics().num2,u=c):(p=t.fontMetrics().num3,u=3*c),d=t.fontMetrics().denom2),h){var x=t.fontMetrics().axisHeight;p-o.depth-(x+.5*m)<u&&(p+=u-(p-o.depth-(x+.5*m))),x-.5*m-(y.height-d)<u&&(d+=u-(x-.5*m-(y.height-d)));var w=-(x-.5*m);g=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:y,shift:d},{type:"elem",elem:h,shift:w},{type:"elem",elem:o,shift:-p}]},t)}else{var S=p-o.depth-(y.height-d);S<u&&(p+=.5*(u-S),d+=.5*(u-S)),g=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:y,shift:d},{type:"elem",elem:o,shift:-p}]},t)}return r=t.havingStyle(a),g.height*=r.sizeMultiplier/t.sizeMultiplier,g.depth*=r.sizeMultiplier/t.sizeMultiplier,f=a.size===k.DISPLAY.size?t.fontMetrics().delim1:a.size===k.SCRIPTSCRIPT.size?t.havingStyle(k.SCRIPT).fontMetrics().delim2:t.fontMetrics().delim2,v=null==e.leftDelim?wt(t,["mopen"]):Rr.customSizedDelim(e.leftDelim,f,!0,t.havingStyle(a),e.mode,["mopen"]),b=e.continued?Je.makeSpan([]):null==e.rightDelim?wt(t,["mclose"]):Rr.customSizedDelim(e.rightDelim,f,!0,t.havingStyle(a),e.mode,["mclose"]),Je.makeSpan(["mord"].concat(r.sizingClasses(t)),[v,Je.makeSpan(["mfrac"],[g]),b],t)},ia=(e,t)=>{var r=new Bt.MathNode("mfrac",[Ot(e.numer,t),Ot(e.denom,t)]);if(e.hasBarLine){if(e.barSize){var a=F(e.barSize,t);r.setAttribute("linethickness",G(a))}}else r.setAttribute("linethickness","0px");var n=aa(e.size,t.style);if(n.size!==t.style.size){r=new Bt.MathNode("mstyle",[r]);var i=n.size===k.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",i),r.setAttribute("scriptlevel","0")}if(null!=e.leftDelim||null!=e.rightDelim){var o=[];if(null!=e.leftDelim){var s=new Bt.MathNode("mo",[new Bt.TextNode(e.leftDelim.replace("\\",""))]);s.setAttribute("fence","true"),o.push(s)}if(o.push(r),null!=e.rightDelim){var l=new Bt.MathNode("mo",[new Bt.TextNode(e.rightDelim.replace("\\",""))]);l.setAttribute("fence","true"),o.push(l)}return Nt(o)}return r};st({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{var r,{parser:a,funcName:n}=e,i=t[0],o=t[1],s=null,l=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,s="(",l=")";break;case"\\\\bracefrac":r=!1,s="\\{",l="\\}";break;case"\\\\brackfrac":r=!1,s="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text"}return{type:"genfrac",mode:a.mode,continued:!1,numer:i,denom:o,hasBarLine:r,leftDelim:s,rightDelim:l,size:h,barSize:null}},htmlBuilder:na,mathmlBuilder:ia}),st({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0],i=t[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:n,denom:i,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),st({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){var t,{parser:r,funcName:a,token:n}=e;switch(a){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:n}}});var oa=["display","text","script","scriptscript"],sa=function(e){var t=null;return e.length>0&&(t="."===(t=e)?null:t),t};st({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){var r,{parser:a}=e,n=t[4],i=t[5],o=ht(t[0]),s="atom"===o.type&&"open"===o.family?sa(o.text):null,l=ht(t[1]),h="atom"===l.type&&"close"===l.family?sa(l.text):null,m=Yt(t[2],"size"),c=null;r=!!m.isBlank||(c=m.value).number>0;var p="auto",u=t[3];if("ordgroup"===u.type){if(u.body.length>0){var d=Yt(u.body[0],"textord");p=oa[Number(d.text)]}}else u=Yt(u,"textord"),p=oa[Number(u.text)];return{type:"genfrac",mode:a.mode,numer:n,denom:i,continued:!1,hasBarLine:r,barSize:c,leftDelim:s,rightDelim:h,size:p}},htmlBuilder:na,mathmlBuilder:ia}),st({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(e,t){var{parser:r,funcName:a,token:n}=e;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Yt(t[0],"size").value,token:n}}}),st({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0],i=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Yt(t[1],"infix").size),o=t[2],s=i.number>0;return{type:"genfrac",mode:r.mode,numer:n,denom:o,continued:!1,hasBarLine:s,barSize:i,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:na,mathmlBuilder:ia});var la=(e,t)=>{var r,a,n=t.style;"supsub"===e.type?(r=e.sup?kt(e.sup,t.havingStyle(n.sup()),t):kt(e.sub,t.havingStyle(n.sub()),t),a=Yt(e.base,"horizBrace")):a=Yt(e,"horizBrace");var i,o=kt(a.base,t.havingBaseStyle(k.DISPLAY)),s=Ut(a,t);if(a.isOver?(i=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(i=Je.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Je.makeSpan(["mord",a.isOver?"mover":"munder"],[i],t);i=a.isOver?Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},t):Je.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},t)}return Je.makeSpan(["mord",a.isOver?"mover":"munder"],[i],t)};st({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:a}=e;return{type:"horizBrace",mode:r.mode,label:a,isOver:/^\\over/.test(a),base:t[0]}},htmlBuilder:la,mathmlBuilder:(e,t)=>{var r=Gt(e.label);return new Bt.MathNode(e.isOver?"mover":"munder",[Ot(e.base,t),r])}}),st({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[1],n=Yt(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:r.mode,href:n,body:mt(a)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{var r=ft(e.body,t,!1);return Je.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{var r=Ht(e.body,t);return r instanceof At||(r=new At("mrow",[r])),r.setAttribute("href",e.href),r}}),st({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=Yt(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:a}))return r.formatUnsupportedCmd("\\url");for(var n=[],i=0;i<a.length;i++){var o=a[i];"~"===o&&(o="\\textasciitilde"),n.push({type:"textord",mode:"text",text:o})}var s={type:"text",mode:r.mode,font:"\\texttt",body:n};return{type:"href",mode:r.mode,href:a,body:mt(s)}}}),st({type:"hbox",names:["\\hbox"],props:{numArgs:1,argTypes:["text"],allowedInText:!0,primitive:!0},handler(e,t){var{parser:r}=e;return{type:"hbox",mode:r.mode,body:mt(t[0])}},htmlBuilder(e,t){var r=ft(e.body,t,!1);return Je.makeFragment(r)},mathmlBuilder:(e,t)=>new Bt.MathNode("mrow",Rt(e.body,t))}),st({type:"html",names:["\\htmlClass","\\htmlId","\\htmlStyle","\\htmlData"],props:{numArgs:2,argTypes:["raw","original"],allowedInText:!0},handler:(e,t)=>{var r,{parser:a,funcName:n,token:o}=e,s=Yt(t[0],"raw").string,l=t[1];a.settings.strict&&a.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var h={};switch(n){case"\\htmlClass":h.class=s,r={command:"\\htmlClass",class:s};break;case"\\htmlId":h.id=s,r={command:"\\htmlId",id:s};break;case"\\htmlStyle":h.style=s,r={command:"\\htmlStyle",style:s};break;case"\\htmlData":for(var m=s.split(","),c=0;c<m.length;c++){var p=m[c].split("=");if(2!==p.length)throw new i("Error parsing key-value for \\htmlData");h["data-"+p[0].trim()]=p[1].trim()}r={command:"\\htmlData",attributes:h};break;default:throw new Error("Unrecognized html command")}return a.settings.isTrusted(r)?{type:"html",mode:a.mode,attributes:h,body:mt(l)}:a.formatUnsupportedCmd(n)},htmlBuilder:(e,t)=>{var r=ft(e.body,t,!1),a=["enclosing"];e.attributes.class&&a.push(...e.attributes.class.trim().split(/\s+/));var n=Je.makeSpan(a,r,t);for(var i in e.attributes)"class"!==i&&e.attributes.hasOwnProperty(i)&&n.setAttribute(i,e.attributes[i]);return n},mathmlBuilder:(e,t)=>Ht(e.body,t)}),st({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e;return{type:"htmlmathml",mode:r.mode,html:mt(t[0]),mathml:mt(t[1])}},htmlBuilder:(e,t)=>{var r=ft(e.html,t,!1);return Je.makeFragment(r)},mathmlBuilder:(e,t)=>Ht(e.mathml,t)});var ha=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new i("Invalid size: '"+e+"' in \\includegraphics");var r={number:+(t[1]+t[2]),unit:t[3]};if(!P(r))throw new i("Invalid unit: '"+r.unit+"' in \\includegraphics.");return r};st({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(e,t,r)=>{var{parser:a}=e,n={number:0,unit:"em"},o={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var h=Yt(r[0],"raw").string.split(","),m=0;m<h.length;m++){var c=h[m].split("=");if(2===c.length){var p=c[1].trim();switch(c[0].trim()){case"alt":l=p;break;case"width":n=ha(p);break;case"height":o=ha(p);break;case"totalheight":s=ha(p);break;default:throw new i("Invalid key: '"+c[0]+"' in \\includegraphics.")}}}var u=Yt(t[0],"url").url;return""===l&&(l=(l=(l=u).replace(/^.*[\\/]/,"")).substring(0,l.lastIndexOf("."))),a.settings.isTrusted({command:"\\includegraphics",url:u})?{type:"includegraphics",mode:a.mode,alt:l,width:n,height:o,totalheight:s,src:u}:a.formatUnsupportedCmd("\\includegraphics")},htmlBuilder:(e,t)=>{var r=F(e.height,t),a=0;e.totalheight.number>0&&(a=F(e.totalheight,t)-r);var n=0;e.width.number>0&&(n=F(e.width,t));var i={height:G(r+a)};n>0&&(i.width=G(n)),a>0&&(i.verticalAlign=G(-a));var o=new Z(e.src,e.alt,i);return o.height=r,o.depth=a,o},mathmlBuilder:(e,t)=>{var r=new Bt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);var a=F(e.height,t),n=0;if(e.totalheight.number>0&&(n=F(e.totalheight,t)-a,r.setAttribute("valign",G(-n))),r.setAttribute("height",G(a+n)),e.width.number>0){var i=F(e.width,t);r.setAttribute("width",G(i))}return r.setAttribute("src",e.src),r}}),st({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(e,t){var{parser:r,funcName:a}=e,n=Yt(t[0],"size");if(r.settings.strict){var i="m"===a[1],o="mu"===n.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, not "+n.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:n.value}},htmlBuilder:(e,t)=>Je.makeGlue(e.dimension,t),mathmlBuilder(e,t){var r=F(e.dimension,t);return new Bt.SpaceNode(r)}}),st({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0];return{type:"lap",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:(e,t)=>{var r;"clap"===e.alignment?(r=Je.makeSpan([],[kt(e.body,t)]),r=Je.makeSpan(["inner"],[r],t)):r=Je.makeSpan(["inner"],[kt(e.body,t)]);var a=Je.makeSpan(["fix"],[]),n=Je.makeSpan([e.alignment],[r,a],t),i=Je.makeSpan(["strut"]);return i.style.height=G(n.height+n.depth),n.depth&&(i.style.verticalAlign=G(-n.depth)),n.children.unshift(i),n=Je.makeSpan(["thinbox"],[n],t),Je.makeSpan(["mord","vbox"],[n],t)},mathmlBuilder:(e,t)=>{var r=new Bt.MathNode("mpadded",[Ot(e.body,t)]);if("rlap"!==e.alignment){var a="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",a+"width")}return r.setAttribute("width","0px"),r}}),st({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){var{funcName:r,parser:a}=e,n=a.mode;a.switchMode("math");var i="\\("===r?"\\)":"$",o=a.parseExpression(!1,i);return a.expect(i),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:o}}}),st({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new i("Mismatched "+e.funcName)}});var ma=(e,t)=>{switch(t.style.size){case k.DISPLAY.size:return e.display;case k.TEXT.size:return e.text;case k.SCRIPT.size:return e.script;case k.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};st({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>{var{parser:r}=e;return{type:"mathchoice",mode:r.mode,display:mt(t[0]),text:mt(t[1]),script:mt(t[2]),scriptscript:mt(t[3])}},htmlBuilder:(e,t)=>{var r=ma(e,t),a=ft(r,t,!1);return Je.makeFragment(a)},mathmlBuilder:(e,t)=>{var r=ma(e,t);return Ht(r,t)}});var ca=(e,t,r,a,n,i,o)=>{e=Je.makeSpan([],[e]);var s,l,h,c=r&&m.isCharacterBox(r);if(t){var p=kt(t,a.havingStyle(n.sup()),a);l={elem:p,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-p.depth)}}if(r){var u=kt(r,a.havingStyle(n.sub()),a);s={elem:u,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-u.height)}}if(l&&s){var d=a.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+e.depth+o;h=Je.makeVList({positionType:"bottom",positionData:d,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:G(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:G(i)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(s){var g=e.height-o;h=Je.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:G(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e}]},a)}else{if(!l)return e;var f=e.depth+o;h=Je.makeVList({positionType:"bottom",positionData:f,children:[{type:"elem",elem:e},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:G(i)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}var v=[h];if(s&&0!==i&&!c){var b=Je.makeSpan(["mspace"],[],a);b.style.marginRight=G(i),v.unshift(b)}return Je.makeSpan(["mop","op-limits"],v,a)},pa=["\\smallint"],ua=(e,t)=>{var r,a,n,i=!1;"supsub"===e.type?(r=e.sup,a=e.sub,n=Yt(e.base,"op"),i=!0):n=Yt(e,"op");var o,s=t.style,l=!1;if(s.size===k.DISPLAY.size&&n.symbol&&!m.contains(pa,n.name)&&(l=!0),n.symbol){var h=l?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==n.name&&"\\oiiint"!==n.name||(c=n.name.slice(1),n.name="oiint"===c?"\\iint":"\\iiint"),o=Je.makeSymbol(n.name,h,"math",t,["mop","op-symbol",l?"large-op":"small-op"]),c.length>0){var p=o.italic,u=Je.staticSvg(c+"Size"+(l?"2":"1"),t);o=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:u,shift:l?.08:0}]},t),n.name="\\"+c,o.classes.unshift("mop"),o.italic=p}}else if(n.body){var d=ft(n.body,t,!0);1===d.length&&d[0]instanceof J?(o=d[0]).classes[0]="mop":o=Je.makeSpan(["mop"],d,t)}else{for(var g=[],f=1;f<n.name.length;f++)g.push(Je.mathsym(n.name[f],n.mode,t));o=Je.makeSpan(["mop"],g,t)}var v=0,b=0;return(o instanceof J||"\\oiint"===n.name||"\\oiiint"===n.name)&&!n.suppressBaseShift&&(v=(o.height-o.depth)/2-t.fontMetrics().axisHeight,b=o.italic),i?ca(o,r,a,t,s,b,v):(v&&(o.style.position="relative",o.style.top=G(v)),o)},da=(e,t)=>{var r;if(e.symbol)r=new At("mo",[Ct(e.name,e.mode)]),m.contains(pa,e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new At("mo",Rt(e.body,t));else{r=new At("mi",[new Tt(e.name.slice(1))]);var a=new At("mo",[Ct("\u2061","text")]);r=e.parentIsSupSub?new At("mrow",[r,a]):zt([r,a])}return r},ga={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};st({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=a;return 1===n.length&&(n=ga[n]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:ua,mathmlBuilder:da}),st({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:mt(a)}},htmlBuilder:ua,mathmlBuilder:da});var fa={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};st({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:ua,mathmlBuilder:da}),st({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:ua,mathmlBuilder:da}),st({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e,a=r;return 1===a.length&&(a=fa[a]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:ua,mathmlBuilder:da});var va=(e,t)=>{var r,a,n,i,o=!1;if("supsub"===e.type?(r=e.sup,a=e.sub,n=Yt(e.base,"operatorname"),o=!0):n=Yt(e,"operatorname"),n.body.length>0){for(var s=n.body.map(e=>{var t=e.text;return"string"==typeof t?{type:"textord",mode:e.mode,text:t}:e}),l=ft(s,t.withFont("mathrm"),!0),h=0;h<l.length;h++){var m=l[h];m instanceof J&&(m.text=m.text.replace(/\u2212/,"-").replace(/\u2217/,"*"))}i=Je.makeSpan(["mop"],l,t)}else i=Je.makeSpan(["mop"],[],t);return o?ca(i,r,a,t,t.style,0,0):i};function ba(e,t,r){for(var a=ft(e,t,!1),n=t.sizeMultiplier/r.sizeMultiplier,i=0;i<a.length;i++){var o=a[i].classes.indexOf("sizing");o<0?Array.prototype.push.apply(a[i].classes,t.sizingClasses(r)):a[i].classes[o+1]==="reset-size"+t.size&&(a[i].classes[o+1]="reset-size"+r.size),a[i].height*=n,a[i].depth*=n}return Je.makeFragment(a)}st({type:"operatorname",names:["\\operatorname@","\\operatornamewithlimits"],props:{numArgs:1},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0];return{type:"operatorname",mode:r.mode,body:mt(n),alwaysHandleSupSub:"\\operatornamewithlimits"===a,limits:!1,parentIsSupSub:!1}},htmlBuilder:va,mathmlBuilder:(e,t)=>{for(var r=Rt(e.body,t.withFont("mathrm")),a=!0,n=0;n<r.length;n++){var i=r[n];if(i instanceof Bt.SpaceNode);else if(i instanceof Bt.MathNode)switch(i.type){case"mi":case"mn":case"ms":case"mspace":case"mtext":break;case"mo":var o=i.children[0];1===i.children.length&&o instanceof Bt.TextNode?o.text=o.text.replace(/\u2212/,"-").replace(/\u2217/,"*"):a=!1;break;default:a=!1}else a=!1}if(a){var s=r.map(e=>e.toText()).join("");r=[new Bt.TextNode(s)]}var l=new Bt.MathNode("mi",r);l.setAttribute("mathvariant","normal");var h=new Bt.MathNode("mo",[Ct("\u2061","text")]);return e.parentIsSupSub?new Bt.MathNode("mrow",[l,h]):Bt.newDocumentFragment([l,h])}}),Ur("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),lt({type:"ordgroup",htmlBuilder:(e,t)=>e.semisimple?Je.makeFragment(ft(e.body,t,!1)):Je.makeSpan(["mord"],ft(e.body,t,!0),t),mathmlBuilder:(e,t)=>Ht(e.body,t,!0)}),st({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){var{parser:r}=e,a=t[0];return{type:"overline",mode:r.mode,body:a}},htmlBuilder(e,t){var r=kt(e.body,t.havingCrampedStyle()),a=Je.makeLineSpan("overline-line",t),n=t.fontMetrics().defaultRuleThickness,i=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]},t);return Je.makeSpan(["mord","overline"],[i],t)},mathmlBuilder(e,t){var r=new Bt.MathNode("mo",[new Bt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new Bt.MathNode("mover",[Ot(e.body,t),r]);return a.setAttribute("accent","true"),a}}),st({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"phantom",mode:r.mode,body:mt(a)}},htmlBuilder:(e,t)=>{var r=ft(e.body,t.withPhantom(),!1);return Je.makeFragment(r)},mathmlBuilder:(e,t)=>{var r=Rt(e.body,t);return new Bt.MathNode("mphantom",r)}}),st({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"hphantom",mode:r.mode,body:a}},htmlBuilder:(e,t)=>{var r=Je.makeSpan([],[kt(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a<r.children.length;a++)r.children[a].height=0,r.children[a].depth=0;return r=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},t),Je.makeSpan(["mord"],[r],t)},mathmlBuilder:(e,t)=>{var r=Rt(mt(e.body),t),a=new Bt.MathNode("mphantom",r),n=new Bt.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}}),st({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"vphantom",mode:r.mode,body:a}},htmlBuilder:(e,t)=>{var r=Je.makeSpan(["inner"],[kt(e.body,t.withPhantom())]),a=Je.makeSpan(["fix"],[]);return Je.makeSpan(["mord","rlap"],[r,a],t)},mathmlBuilder:(e,t)=>{var r=Rt(mt(e.body),t),a=new Bt.MathNode("mphantom",r),n=new Bt.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}}),st({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){var{parser:r}=e,a=Yt(t[0],"size").value,n=t[1];return{type:"raisebox",mode:r.mode,dy:a,body:n}},htmlBuilder(e,t){var r=kt(e.body,t),a=F(e.dy,t);return Je.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){var r=new Bt.MathNode("mpadded",[Ot(e.body,t)]),a=e.dy.number+e.dy.unit;return r.setAttribute("voffset",a),r}}),st({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0,allowedInArgument:!0},handler(e){var{parser:t}=e;return{type:"internal",mode:t.mode}}}),st({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(e,t,r){var{parser:a}=e,n=r[0],i=Yt(t[0],"size"),o=Yt(t[1],"size");return{type:"rule",mode:a.mode,shift:n&&Yt(n,"size").value,width:i.value,height:o.value}},htmlBuilder(e,t){var r=Je.makeSpan(["mord","rule"],[],t),a=F(e.width,t),n=F(e.height,t),i=e.shift?F(e.shift,t):0;return r.style.borderRightWidth=G(a),r.style.borderTopWidth=G(n),r.style.bottom=G(i),r.width=a,r.height=n+i,r.depth=-i,r.maxFontSize=1.125*n*t.sizeMultiplier,r},mathmlBuilder(e,t){var r=F(e.width,t),a=F(e.height,t),n=e.shift?F(e.shift,t):0,i=t.color&&t.getColor()||"black",o=new Bt.MathNode("mspace");o.setAttribute("mathbackground",i),o.setAttribute("width",G(r)),o.setAttribute("height",G(a));var s=new Bt.MathNode("mpadded",[o]);return n>=0?s.setAttribute("height",G(n)):(s.setAttribute("height",G(n)),s.setAttribute("depth",G(-n))),s.setAttribute("voffset",G(n)),s}});var ya=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];st({type:"sizing",names:ya,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{breakOnTokenText:r,funcName:a,parser:n}=e,i=n.parseExpression(!1,r);return{type:"sizing",mode:n.mode,size:ya.indexOf(a)+1,body:i}},htmlBuilder:(e,t)=>{var r=t.havingSize(e.size);return ba(e.body,r,t)},mathmlBuilder:(e,t)=>{var r=t.havingSize(e.size),a=Rt(e.body,r),n=new Bt.MathNode("mstyle",a);return n.setAttribute("mathsize",G(r.sizeMultiplier)),n}}),st({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{var{parser:a}=e,n=!1,i=!1,o=r[0]&&Yt(r[0],"ordgroup");if(o)for(var s="",l=0;l<o.body.length;++l){if("t"===(s=o.body[l].text))n=!0;else{if("b"!==s){n=!1,i=!1;break}i=!0}}else n=!0,i=!0;var h=t[0];return{type:"smash",mode:a.mode,body:h,smashHeight:n,smashDepth:i}},htmlBuilder:(e,t)=>{var r=Je.makeSpan([],[kt(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(var a=0;a<r.children.length;a++)r.children[a].height=0;if(e.smashDepth&&(r.depth=0,r.children))for(var n=0;n<r.children.length;n++)r.children[n].depth=0;var i=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r}]},t);return Je.makeSpan(["mord"],[i],t)},mathmlBuilder:(e,t)=>{var r=new Bt.MathNode("mpadded",[Ot(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}}),st({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:a}=e,n=r[0],i=t[0];return{type:"sqrt",mode:a.mode,body:i,index:n}},htmlBuilder(e,t){var r=kt(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=Je.wrapFragment(r,t);var a=t.fontMetrics().defaultRuleThickness,n=a;t.style.id<k.TEXT.id&&(n=t.fontMetrics().xHeight);var i=a+n/4,o=r.height+r.depth+i+a,{span:s,ruleWidth:l,advanceWidth:h}=Rr.sqrtImage(o,t),m=s.height-l;m>r.height+r.depth+i&&(i=(i+m-r.height-r.depth)/2);var c=s.height-r.height-i-l;r.style.paddingLeft=G(h);var p=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+c)},{type:"elem",elem:s},{type:"kern",size:l}]},t);if(e.index){var u=t.havingStyle(k.SCRIPTSCRIPT),d=kt(e.index,u,t),g=.6*(p.height-p.depth),f=Je.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:d}]},t),v=Je.makeSpan(["root"],[f]);return Je.makeSpan(["mord","sqrt"],[v,p],t)}return Je.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder(e,t){var{body:r,index:a}=e;return a?new Bt.MathNode("mroot",[Ot(r,t),Ot(a,t)]):new Bt.MathNode("msqrt",[Ot(r,t)])}});var xa={display:k.DISPLAY,text:k.TEXT,script:k.SCRIPT,scriptscript:k.SCRIPTSCRIPT};st({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){var{breakOnTokenText:r,funcName:a,parser:n}=e,i=n.parseExpression(!0,r),o=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:o,body:i}},htmlBuilder(e,t){var r=xa[e.style],a=t.havingStyle(r).withFont("");return ba(e.body,a,t)},mathmlBuilder(e,t){var r=xa[e.style],a=t.havingStyle(r),n=Rt(e.body,a),i=new Bt.MathNode("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});lt({type:"supsub",htmlBuilder(e,t){var r=function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===k.DISPLAY.size||r.alwaysHandleSupSub)?ua:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===k.DISPLAY.size||r.limits)?va:null:"accent"===r.type?m.isCharacterBox(r.base)?_t:null:"horizBrace"===r.type&&!e.sub===r.isOver?la:null:null}(e,t);if(r)return r(e,t);var a,n,i,{base:o,sup:s,sub:l}=e,h=kt(o,t),c=t.fontMetrics(),p=0,u=0,d=o&&m.isCharacterBox(o);if(s){var g=t.havingStyle(t.style.sup());a=kt(s,g,t),d||(p=h.height-g.fontMetrics().supDrop*g.sizeMultiplier/t.sizeMultiplier)}if(l){var f=t.havingStyle(t.style.sub());n=kt(l,f,t),d||(u=h.depth+f.fontMetrics().subDrop*f.sizeMultiplier/t.sizeMultiplier)}i=t.style===k.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;var v,b=t.sizeMultiplier,y=G(.5/c.ptPerEm/b),x=null;if(n){var w=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(h instanceof J||w)&&(x=G(-h.italic))}if(a&&n){p=Math.max(p,i,a.depth+.25*c.xHeight),u=Math.max(u,c.sub2);var S=4*c.defaultRuleThickness;if(p-a.depth-(n.height-u)<S){u=S-(p-a.depth)+n.height;var M=.8*c.xHeight-(p-a.depth);M>0&&(p+=M,u-=M)}var z=[{type:"elem",elem:n,shift:u,marginRight:y,marginLeft:x},{type:"elem",elem:a,shift:-p,marginRight:y}];v=Je.makeVList({positionType:"individualShift",children:z},t)}else if(n){u=Math.max(u,c.sub1,n.height-.8*c.xHeight);var A=[{type:"elem",elem:n,marginLeft:x,marginRight:y}];v=Je.makeVList({positionType:"shift",positionData:u,children:A},t)}else{if(!a)throw new Error("supsub must have either sup or sub.");p=Math.max(p,i,a.depth+.25*c.xHeight),v=Je.makeVList({positionType:"shift",positionData:-p,children:[{type:"elem",elem:a,marginRight:y}]},t)}var T=xt(h,"right")||"mord";return Je.makeSpan([T],[h,Je.makeSpan(["msupsub"],[v])],t)},mathmlBuilder(e,t){var r,a=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(a=!0,r=e.base.isOver),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);var n,i=[Ot(e.base,t)];if(e.sub&&i.push(Ot(e.sub,t)),e.sup&&i.push(Ot(e.sup,t)),a)n=r?"mover":"munder";else if(e.sub)if(e.sup){var o=e.base;n=o&&"op"===o.type&&o.limits&&t.style===k.DISPLAY||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(t.style===k.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=e.base;n=s&&"op"===s.type&&s.limits&&(t.style===k.DISPLAY||s.alwaysHandleSupSub)||s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||t.style===k.DISPLAY)?"munder":"msub"}else{var l=e.base;n=l&&"op"===l.type&&l.limits&&(t.style===k.DISPLAY||l.alwaysHandleSupSub)||l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||t.style===k.DISPLAY)?"mover":"msup"}return new Bt.MathNode(n,i)}}),lt({type:"atom",htmlBuilder:(e,t)=>Je.mathsym(e.text,e.mode,t,["m"+e.family]),mathmlBuilder(e,t){var r=new Bt.MathNode("mo",[Ct(e.text,e.mode)]);if("bin"===e.family){var a=qt(e,t);"bold-italic"===a&&r.setAttribute("mathvariant",a)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});var wa={mi:"italic",mn:"normal",mtext:"normal"};lt({type:"mathord",htmlBuilder:(e,t)=>Je.makeOrd(e,t,"mathord"),mathmlBuilder(e,t){var r=new Bt.MathNode("mi",[Ct(e.text,e.mode,t)]),a=qt(e,t)||"italic";return a!==wa[r.type]&&r.setAttribute("mathvariant",a),r}}),lt({type:"textord",htmlBuilder:(e,t)=>Je.makeOrd(e,t,"textord"),mathmlBuilder(e,t){var r,a=Ct(e.text,e.mode,t),n=qt(e,t)||"normal";return r="text"===e.mode?new Bt.MathNode("mtext",[a]):/[0-9]/.test(e.text)?new Bt.MathNode("mn",[a]):"\\prime"===e.text?new Bt.MathNode("mo",[a]):new Bt.MathNode("mi",[a]),n!==wa[r.type]&&r.setAttribute("mathvariant",n),r}});var ka={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},Sa={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};lt({type:"spacing",htmlBuilder(e,t){if(Sa.hasOwnProperty(e.text)){var r=Sa[e.text].className||"";if("text"===e.mode){var a=Je.makeOrd(e,t,"textord");return a.classes.push(r),a}return Je.makeSpan(["mspace",r],[Je.mathsym(e.text,e.mode,t)],t)}if(ka.hasOwnProperty(e.text))return Je.makeSpan(["mspace",ka[e.text]],[],t);throw new i('Unknown type of space "'+e.text+'"')},mathmlBuilder(e,t){if(!Sa.hasOwnProperty(e.text)){if(ka.hasOwnProperty(e.text))return new Bt.MathNode("mspace");throw new i('Unknown type of space "'+e.text+'"')}return new Bt.MathNode("mtext",[new Bt.TextNode("\xa0")])}});var Ma=()=>{var e=new Bt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};lt({type:"tag",mathmlBuilder(e,t){var r=new Bt.MathNode("mtable",[new Bt.MathNode("mtr",[Ma(),new Bt.MathNode("mtd",[Ht(e.body,t)]),Ma(),new Bt.MathNode("mtd",[Ht(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var za={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Aa={"\\textbf":"textbf","\\textmd":"textmd"},Ta={"\\textit":"textit","\\textup":"textup"},Ba=(e,t)=>{var r=e.font;return r?za[r]?t.withTextFontFamily(za[r]):Aa[r]?t.withTextFontWeight(Aa[r]):"\\emph"===r?"textit"===t.fontShape?t.withTextFontShape("textup"):t.withTextFontShape("textit"):t.withTextFontShape(Ta[r]):t};st({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){var{parser:r,funcName:a}=e,n=t[0];return{type:"text",mode:r.mode,body:mt(n),font:a}},htmlBuilder(e,t){var r=Ba(e,t),a=ft(e.body,r,!0);return Je.makeSpan(["mord","text"],a,r)},mathmlBuilder(e,t){var r=Ba(e,t);return Ht(e.body,r)}}),st({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"underline",mode:r.mode,body:t[0]}},htmlBuilder(e,t){var r=kt(e.body,t),a=Je.makeLineSpan("underline-line",t),n=t.fontMetrics().defaultRuleThickness,i=Je.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:r}]},t);return Je.makeSpan(["mord","underline"],[i],t)},mathmlBuilder(e,t){var r=new Bt.MathNode("mo",[new Bt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new Bt.MathNode("munder",[Ot(e.body,t),r]);return a.setAttribute("accentunder","true"),a}}),st({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){var{parser:r}=e;return{type:"vcenter",mode:r.mode,body:t[0]}},htmlBuilder(e,t){var r=kt(e.body,t),a=t.fontMetrics().axisHeight,n=.5*(r.height-a-(r.depth+a));return Je.makeVList({positionType:"shift",positionData:n,children:[{type:"elem",elem:r}]},t)},mathmlBuilder:(e,t)=>new Bt.MathNode("mpadded",[Ot(e.body,t)],["vcenter"])}),st({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new i("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(e,t){for(var r=Ca(e),a=[],n=t.havingStyle(t.style.text()),i=0;i<r.length;i++){var o=r[i];"~"===o&&(o="\\textasciitilde"),a.push(Je.makeSymbol(o,"Typewriter-Regular",e.mode,n,["mord","texttt"]))}return Je.makeSpan(["mord","text"].concat(n.sizingClasses(t)),Je.tryCombineChars(a),n)},mathmlBuilder(e,t){var r=new Bt.TextNode(Ca(e)),a=new Bt.MathNode("mtext",[r]);return a.setAttribute("mathvariant","monospace"),a}});var Ca=e=>e.body.replace(/ /g,e.star?"\u2423":"\xa0"),Na=nt,qa="[ \r\n\t]",Ia="(\\\\[a-zA-Z@]+)"+qa+"*",Ra="[\u0300-\u036f]",Ha=new RegExp(Ra+"+$"),Oa="("+qa+"+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff]"+Ra+"*|[\ud800-\udbff][\udc00-\udfff]"+Ra+"*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|"+Ia+"|\\\\[^\ud800-\udfff])";class Ea{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp(Oa,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new n("EOF",new a(this,t,t));var r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new i("Unexpected character: '"+e[t]+"'",new n(e[t],new a(this,t,t+1)));var o=r[6]||r[3]||(r[2]?"\\ ":" ");if(14===this.catcodes[o]){var s=e.indexOf("\n",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}return new n(o,new a(this,t,this.tokenRegex.lastIndex))}}class La{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new i("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,r){if(void 0===r&&(r=!1),r){for(var a=0;a<this.undefStack.length;a++)delete this.undefStack[a][e];this.undefStack.length>0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(e)&&(n[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t}}var Da=Gr;Ur("\\noexpand",function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}}),Ur("\\expandafter",function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}}),Ur("\\@firstoftwo",function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}}),Ur("\\@secondoftwo",function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}}),Ur("\\@ifnextchar",function(e){var t=e.consumeArgs(3);e.consumeSpaces();var r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}}),Ur("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Ur("\\TextOrMath",function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}});var Va={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Ur("\\char",function(e){var t,r=e.popToken(),a="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if("\\"===(r=e.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new i("\\char` missing argument");a=r.text.charCodeAt(0)}else t=10;if(t){if(null==(a=Va[r.text])||a>=t)throw new i("Invalid base-"+t+" digit "+r.text);for(var n;null!=(n=Va[e.future().text])&&n<t;)a*=t,a+=n,e.popToken()}return"\\@char{"+a+"}"});var Pa=(e,t,r,a)=>{var n=e.consumeArg().tokens;if(1!==n.length)throw new i("\\newcommand's first argument must be a macro name");var o=n[0].text,s=e.isDefined(o);if(s&&!t)throw new i("\\newcommand{"+o+"} attempting to redefine "+o+"; use \\renewcommand");if(!s&&!r)throw new i("\\renewcommand{"+o+"} when command "+o+" does not yet exist; use \\newcommand");var l=0;if(1===(n=e.consumeArg().tokens).length&&"["===n[0].text){for(var h="",m=e.expandNextToken();"]"!==m.text&&"EOF"!==m.text;)h+=m.text,m=e.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new i("Invalid number of arguments: "+h);l=parseInt(h),n=e.consumeArg().tokens}return s&&a||e.macros.set(o,{tokens:n,numArgs:l}),""};Ur("\\newcommand",e=>Pa(e,!1,!0,!1)),Ur("\\renewcommand",e=>Pa(e,!0,!1,!1)),Ur("\\providecommand",e=>Pa(e,!0,!0,!0)),Ur("\\message",e=>{var t=e.consumeArgs(1)[0];return console.log(t.reverse().map(e=>e.text).join("")),""}),Ur("\\errmessage",e=>{var t=e.consumeArgs(1)[0];return console.error(t.reverse().map(e=>e.text).join("")),""}),Ur("\\show",e=>{var t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),Na[r],ie.math[r],ie.text[r]),""}),Ur("\\bgroup","{"),Ur("\\egroup","}"),Ur("~","\\nobreakspace"),Ur("\\lq","`"),Ur("\\rq","'"),Ur("\\aa","\\r a"),Ur("\\AA","\\r A"),Ur("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),Ur("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),Ur("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),Ur("\u212c","\\mathscr{B}"),Ur("\u2130","\\mathscr{E}"),Ur("\u2131","\\mathscr{F}"),Ur("\u210b","\\mathscr{H}"),Ur("\u2110","\\mathscr{I}"),Ur("\u2112","\\mathscr{L}"),Ur("\u2133","\\mathscr{M}"),Ur("\u211b","\\mathscr{R}"),Ur("\u212d","\\mathfrak{C}"),Ur("\u210c","\\mathfrak{H}"),Ur("\u2128","\\mathfrak{Z}"),Ur("\\Bbbk","\\Bbb{k}"),Ur("\xb7","\\cdotp"),Ur("\\llap","\\mathllap{\\textrm{#1}}"),Ur("\\rlap","\\mathrlap{\\textrm{#1}}"),Ur("\\clap","\\mathclap{\\textrm{#1}}"),Ur("\\mathstrut","\\vphantom{(}"),Ur("\\underbar","\\underline{\\text{#1}}"),Ur("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),Ur("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),Ur("\\ne","\\neq"),Ur("\u2260","\\neq"),Ur("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),Ur("\u2209","\\notin"),Ur("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),Ur("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),Ur("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),Ur("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),Ur("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),Ur("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),Ur("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),Ur("\u27c2","\\perp"),Ur("\u203c","\\mathclose{!\\mkern-0.8mu!}"),Ur("\u220c","\\notni"),Ur("\u231c","\\ulcorner"),Ur("\u231d","\\urcorner"),Ur("\u231e","\\llcorner"),Ur("\u231f","\\lrcorner"),Ur("\xa9","\\copyright"),Ur("\xae","\\textregistered"),Ur("\ufe0f","\\textregistered"),Ur("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),Ur("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),Ur("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),Ur("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),Ur("\\vdots","{\\varvdots\\rule{0pt}{15pt}}"),Ur("\u22ee","\\vdots"),Ur("\\varGamma","\\mathit{\\Gamma}"),Ur("\\varDelta","\\mathit{\\Delta}"),Ur("\\varTheta","\\mathit{\\Theta}"),Ur("\\varLambda","\\mathit{\\Lambda}"),Ur("\\varXi","\\mathit{\\Xi}"),Ur("\\varPi","\\mathit{\\Pi}"),Ur("\\varSigma","\\mathit{\\Sigma}"),Ur("\\varUpsilon","\\mathit{\\Upsilon}"),Ur("\\varPhi","\\mathit{\\Phi}"),Ur("\\varPsi","\\mathit{\\Psi}"),Ur("\\varOmega","\\mathit{\\Omega}"),Ur("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),Ur("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),Ur("\\boxed","\\fbox{$\\displaystyle{#1}$}"),Ur("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),Ur("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),Ur("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;"),Ur("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}"),Ur("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var Fa={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Ur("\\dots",function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in Fa?t=Fa[r]:("\\not"===r.slice(0,4)||r in ie.math&&m.contains(["bin","rel"],ie.math[r].group))&&(t="\\dotsb"),t});var Ga={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Ur("\\dotso",function(e){return e.future().text in Ga?"\\ldots\\,":"\\ldots"}),Ur("\\dotsc",function(e){var t=e.future().text;return t in Ga&&","!==t?"\\ldots\\,":"\\ldots"}),Ur("\\cdots",function(e){return e.future().text in Ga?"\\@cdots\\,":"\\@cdots"}),Ur("\\dotsb","\\cdots"),Ur("\\dotsm","\\cdots"),Ur("\\dotsi","\\!\\cdots"),Ur("\\dotsx","\\ldots\\,"),Ur("\\DOTSI","\\relax"),Ur("\\DOTSB","\\relax"),Ur("\\DOTSX","\\relax"),Ur("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Ur("\\,","\\tmspace+{3mu}{.1667em}"),Ur("\\thinspace","\\,"),Ur("\\>","\\mskip{4mu}"),Ur("\\:","\\tmspace+{4mu}{.2222em}"),Ur("\\medspace","\\:"),Ur("\\;","\\tmspace+{5mu}{.2777em}"),Ur("\\thickspace","\\;"),Ur("\\!","\\tmspace-{3mu}{.1667em}"),Ur("\\negthinspace","\\!"),Ur("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Ur("\\negthickspace","\\tmspace-{5mu}{.277em}"),Ur("\\enspace","\\kern.5em "),Ur("\\enskip","\\hskip.5em\\relax"),Ur("\\quad","\\hskip1em\\relax"),Ur("\\qquad","\\hskip2em\\relax"),Ur("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Ur("\\tag@paren","\\tag@literal{({#1})}"),Ur("\\tag@literal",e=>{if(e.macros.get("\\df@tag"))throw new i("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"}),Ur("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Ur("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Ur("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Ur("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Ur("\\newline","\\\\\\relax"),Ur("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var Ua=G(C["Main-Regular"]["T".charCodeAt(0)][1]-.7*C["Main-Regular"]["A".charCodeAt(0)][1]);Ur("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Ua+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Ur("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Ua+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Ur("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Ur("\\@hspace","\\hskip #1\\relax"),Ur("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Ur("\\ordinarycolon",":"),Ur("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Ur("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Ur("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Ur("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Ur("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Ur("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Ur("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Ur("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Ur("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Ur("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Ur("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Ur("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Ur("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Ur("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Ur("\u2237","\\dblcolon"),Ur("\u2239","\\eqcolon"),Ur("\u2254","\\coloneqq"),Ur("\u2255","\\eqqcolon"),Ur("\u2a74","\\Coloneqq"),Ur("\\ratio","\\vcentcolon"),Ur("\\coloncolon","\\dblcolon"),Ur("\\colonequals","\\coloneqq"),Ur("\\coloncolonequals","\\Coloneqq"),Ur("\\equalscolon","\\eqqcolon"),Ur("\\equalscoloncolon","\\Eqqcolon"),Ur("\\colonminus","\\coloneq"),Ur("\\coloncolonminus","\\Coloneq"),Ur("\\minuscolon","\\eqcolon"),Ur("\\minuscoloncolon","\\Eqcolon"),Ur("\\coloncolonapprox","\\Colonapprox"),Ur("\\coloncolonsim","\\Colonsim"),Ur("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Ur("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Ur("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Ur("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Ur("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Ur("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Ur("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Ur("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Ur("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Ur("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Ur("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Ur("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Ur("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Ur("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Ur("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Ur("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Ur("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Ur("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Ur("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Ur("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Ur("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Ur("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Ur("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Ur("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Ur("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Ur("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Ur("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Ur("\\imath","\\html@mathml{\\@imath}{\u0131}"),Ur("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Ur("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Ur("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Ur("\u27e6","\\llbracket"),Ur("\u27e7","\\rrbracket"),Ur("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Ur("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Ur("\u2983","\\lBrace"),Ur("\u2984","\\rBrace"),Ur("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Ur("\u29b5","\\minuso"),Ur("\\darr","\\downarrow"),Ur("\\dArr","\\Downarrow"),Ur("\\Darr","\\Downarrow"),Ur("\\lang","\\langle"),Ur("\\rang","\\rangle"),Ur("\\uarr","\\uparrow"),Ur("\\uArr","\\Uparrow"),Ur("\\Uarr","\\Uparrow"),Ur("\\N","\\mathbb{N}"),Ur("\\R","\\mathbb{R}"),Ur("\\Z","\\mathbb{Z}"),Ur("\\alef","\\aleph"),Ur("\\alefsym","\\aleph"),Ur("\\Alpha","\\mathrm{A}"),Ur("\\Beta","\\mathrm{B}"),Ur("\\bull","\\bullet"),Ur("\\Chi","\\mathrm{X}"),Ur("\\clubs","\\clubsuit"),Ur("\\cnums","\\mathbb{C}"),Ur("\\Complex","\\mathbb{C}"),Ur("\\Dagger","\\ddagger"),Ur("\\diamonds","\\diamondsuit"),Ur("\\empty","\\emptyset"),Ur("\\Epsilon","\\mathrm{E}"),Ur("\\Eta","\\mathrm{H}"),Ur("\\exist","\\exists"),Ur("\\harr","\\leftrightarrow"),Ur("\\hArr","\\Leftrightarrow"),Ur("\\Harr","\\Leftrightarrow"),Ur("\\hearts","\\heartsuit"),Ur("\\image","\\Im"),Ur("\\infin","\\infty"),Ur("\\Iota","\\mathrm{I}"),Ur("\\isin","\\in"),Ur("\\Kappa","\\mathrm{K}"),Ur("\\larr","\\leftarrow"),Ur("\\lArr","\\Leftarrow"),Ur("\\Larr","\\Leftarrow"),Ur("\\lrarr","\\leftrightarrow"),Ur("\\lrArr","\\Leftrightarrow"),Ur("\\Lrarr","\\Leftrightarrow"),Ur("\\Mu","\\mathrm{M}"),Ur("\\natnums","\\mathbb{N}"),Ur("\\Nu","\\mathrm{N}"),Ur("\\Omicron","\\mathrm{O}"),Ur("\\plusmn","\\pm"),Ur("\\rarr","\\rightarrow"),Ur("\\rArr","\\Rightarrow"),Ur("\\Rarr","\\Rightarrow"),Ur("\\real","\\Re"),Ur("\\reals","\\mathbb{R}"),Ur("\\Reals","\\mathbb{R}"),Ur("\\Rho","\\mathrm{P}"),Ur("\\sdot","\\cdot"),Ur("\\sect","\\S"),Ur("\\spades","\\spadesuit"),Ur("\\sub","\\subset"),Ur("\\sube","\\subseteq"),Ur("\\supe","\\supseteq"),Ur("\\Tau","\\mathrm{T}"),Ur("\\thetasym","\\vartheta"),Ur("\\weierp","\\wp"),Ur("\\Zeta","\\mathrm{Z}"),Ur("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Ur("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Ur("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Ur("\\bra","\\mathinner{\\langle{#1}|}"),Ur("\\ket","\\mathinner{|{#1}\\rangle}"),Ur("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Ur("\\Bra","\\left\\langle#1\\right|"),Ur("\\Ket","\\left|#1\\right\\rangle");var Ya=e=>t=>{var r=t.consumeArg().tokens,a=t.consumeArg().tokens,n=t.consumeArg().tokens,i=t.consumeArg().tokens,o=t.macros.get("|"),s=t.macros.get("\\|");t.macros.beginGroup();var l=t=>r=>{e&&(r.macros.set("|",o),n.length&&r.macros.set("\\|",s));var i=t;!t&&n.length&&("|"===r.future().text&&(r.popToken(),i=!0));return{tokens:i?n:a,numArgs:0}};t.macros.set("|",l(!1)),n.length&&t.macros.set("\\|",l(!0));var h=t.consumeArg().tokens,m=t.expandTokens([...i,...h,...r]);return t.macros.endGroup(),{tokens:m.reverse(),numArgs:0}};Ur("\\bra@ket",Ya(!1)),Ur("\\bra@set",Ya(!0)),Ur("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),Ur("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),Ur("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),Ur("\\angln","{\\angl n}"),Ur("\\blue","\\textcolor{##6495ed}{#1}"),Ur("\\orange","\\textcolor{##ffa500}{#1}"),Ur("\\pink","\\textcolor{##ff00af}{#1}"),Ur("\\red","\\textcolor{##df0030}{#1}"),Ur("\\green","\\textcolor{##28ae7b}{#1}"),Ur("\\gray","\\textcolor{gray}{#1}"),Ur("\\purple","\\textcolor{##9d38bd}{#1}"),Ur("\\blueA","\\textcolor{##ccfaff}{#1}"),Ur("\\blueB","\\textcolor{##80f6ff}{#1}"),Ur("\\blueC","\\textcolor{##63d9ea}{#1}"),Ur("\\blueD","\\textcolor{##11accd}{#1}"),Ur("\\blueE","\\textcolor{##0c7f99}{#1}"),Ur("\\tealA","\\textcolor{##94fff5}{#1}"),Ur("\\tealB","\\textcolor{##26edd5}{#1}"),Ur("\\tealC","\\textcolor{##01d1c1}{#1}"),Ur("\\tealD","\\textcolor{##01a995}{#1}"),Ur("\\tealE","\\textcolor{##208170}{#1}"),Ur("\\greenA","\\textcolor{##b6ffb0}{#1}"),Ur("\\greenB","\\textcolor{##8af281}{#1}"),Ur("\\greenC","\\textcolor{##74cf70}{#1}"),Ur("\\greenD","\\textcolor{##1fab54}{#1}"),Ur("\\greenE","\\textcolor{##0d923f}{#1}"),Ur("\\goldA","\\textcolor{##ffd0a9}{#1}"),Ur("\\goldB","\\textcolor{##ffbb71}{#1}"),Ur("\\goldC","\\textcolor{##ff9c39}{#1}"),Ur("\\goldD","\\textcolor{##e07d10}{#1}"),Ur("\\goldE","\\textcolor{##a75a05}{#1}"),Ur("\\redA","\\textcolor{##fca9a9}{#1}"),Ur("\\redB","\\textcolor{##ff8482}{#1}"),Ur("\\redC","\\textcolor{##f9685d}{#1}"),Ur("\\redD","\\textcolor{##e84d39}{#1}"),Ur("\\redE","\\textcolor{##bc2612}{#1}"),Ur("\\maroonA","\\textcolor{##ffbde0}{#1}"),Ur("\\maroonB","\\textcolor{##ff92c6}{#1}"),Ur("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Ur("\\maroonD","\\textcolor{##ca337c}{#1}"),Ur("\\maroonE","\\textcolor{##9e034e}{#1}"),Ur("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Ur("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Ur("\\purpleC","\\textcolor{##aa87ff}{#1}"),Ur("\\purpleD","\\textcolor{##7854ab}{#1}"),Ur("\\purpleE","\\textcolor{##543b78}{#1}"),Ur("\\mintA","\\textcolor{##f5f9e8}{#1}"),Ur("\\mintB","\\textcolor{##edf2df}{#1}"),Ur("\\mintC","\\textcolor{##e0e5cc}{#1}"),Ur("\\grayA","\\textcolor{##f6f7f7}{#1}"),Ur("\\grayB","\\textcolor{##f0f1f2}{#1}"),Ur("\\grayC","\\textcolor{##e3e5e6}{#1}"),Ur("\\grayD","\\textcolor{##d6d8da}{#1}"),Ur("\\grayE","\\textcolor{##babec2}{#1}"),Ur("\\grayF","\\textcolor{##888d93}{#1}"),Ur("\\grayG","\\textcolor{##626569}{#1}"),Ur("\\grayH","\\textcolor{##3b3e40}{#1}"),Ur("\\grayI","\\textcolor{##21242c}{#1}"),Ur("\\kaBlue","\\textcolor{##314453}{#1}"),Ur("\\kaGreen","\\textcolor{##71B307}{#1}");var Xa={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class Wa{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new La(Da,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new Ea(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,r,a;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),({tokens:a,end:r}=this.consumeArg(["]"]))}else({tokens:a,start:t,end:r}=this.consumeArg());return this.pushToken(new n("EOF",r.loc)),this.pushTokens(a),t.range(r,"")}consumeSpaces(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}}consumeArg(e){var t=[],r=e&&e.length>0;r||this.consumeSpaces();var a,n=this.future(),o=0,s=0;do{if(a=this.popToken(),t.push(a),"{"===a.text)++o;else if("}"===a.text){if(-1===--o)throw new i("Extra }",a)}else if("EOF"===a.text)throw new i("Unexpected end of input in a macro argument, expected '"+(e&&r?e[s]:"}")+"'",a);if(e&&r)if((0===o||1===o&&"{"===e[s])&&a.text===e[s]){if(++s===e.length){t.splice(-s,s);break}}else s=0}while(0!==o||r);return"{"===n.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:a}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new i("The length of delimiters doesn't match the number of args!");for(var r=t[0],a=0;a<r.length;a++){var n=this.popToken();if(r[a]!==n.text)throw new i("Use of the macro doesn't match its definition",n)}}for(var o=[],s=0;s<e;s++)o.push(this.consumeArg(t&&t[s+1]).tokens);return o}countExpansion(e){if(this.expansionCount+=e,this.expansionCount>this.settings.maxExpand)throw new i("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),r=t.text,a=t.noexpand?null:this._getExpansion(r);if(null==a||e&&a.unexpandable){if(e&&null==a&&"\\"===r[0]&&!this.isDefined(r))throw new i("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);var n=a.tokens,o=this.consumeArgs(a.numArgs,a.delimiters);if(a.numArgs)for(var s=(n=n.slice()).length-1;s>=0;--s){var l=n[s];if("#"===l.text){if(0===s)throw new i("Incomplete placeholder at end of macro body",l);if("#"===(l=n[--s]).text)n.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new i("Not a valid argument number",l);n.splice(s,2,...o[+l.text-1])}}}return this.pushTokens(n),n.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(!1===this.expandOnce()){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new n(e)]):void 0}expandTokens(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){var a=this.stack.pop();a.treatAsRelax&&(a.noexpand=!1,a.treatAsRelax=!1),t.push(a)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t?t.map(e=>e.text).join(""):t}_getExpansion(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var r=this.lexer.catcodes[e];if(null!=r&&13!==r)return}var a="function"==typeof t?t(this):t;if("string"==typeof a){var n=0;if(-1!==a.indexOf("#"))for(var i=a.replace(/##/g,"");-1!==i.indexOf("#"+(n+1));)++n;for(var o=new Ea(a,this.settings),s=[],l=o.lex();"EOF"!==l.text;)s.push(l),l=o.lex();return s.reverse(),{tokens:s,numArgs:n}}return a}isDefined(e){return this.macros.has(e)||Na.hasOwnProperty(e)||ie.math.hasOwnProperty(e)||ie.text.hasOwnProperty(e)||Xa.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return null!=t?"string"==typeof t||"function"==typeof t||!t.unexpandable:Na.hasOwnProperty(e)&&!Na[e].primitive}}var _a=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,ja=Object.freeze({"\u208a":"+","\u208b":"-","\u208c":"=","\u208d":"(","\u208e":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1d62":"i","\u2c7c":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209a":"p","\u1d63":"r","\u209b":"s","\u209c":"t","\u1d64":"u","\u1d65":"v","\u2093":"x","\u1d66":"\u03b2","\u1d67":"\u03b3","\u1d68":"\u03c1","\u1d69":"\u03d5","\u1d6a":"\u03c7","\u207a":"+","\u207b":"-","\u207c":"=","\u207d":"(","\u207e":")","\u2070":"0","\xb9":"1","\xb2":"2","\xb3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1d2c":"A","\u1d2e":"B","\u1d30":"D","\u1d31":"E","\u1d33":"G","\u1d34":"H","\u1d35":"I","\u1d36":"J","\u1d37":"K","\u1d38":"L","\u1d39":"M","\u1d3a":"N","\u1d3c":"O","\u1d3e":"P","\u1d3f":"R","\u1d40":"T","\u1d41":"U","\u2c7d":"V","\u1d42":"W","\u1d43":"a","\u1d47":"b","\u1d9c":"c","\u1d48":"d","\u1d49":"e","\u1da0":"f","\u1d4d":"g","\u02b0":"h","\u2071":"i","\u02b2":"j","\u1d4f":"k","\u02e1":"l","\u1d50":"m","\u207f":"n","\u1d52":"o","\u1d56":"p","\u02b3":"r","\u02e2":"s","\u1d57":"t","\u1d58":"u","\u1d5b":"v","\u02b7":"w","\u02e3":"x","\u02b8":"y","\u1dbb":"z","\u1d5d":"\u03b2","\u1d5e":"\u03b3","\u1d5f":"\u03b4","\u1d60":"\u03d5","\u1d61":"\u03c7","\u1dbf":"\u03b8"}),$a={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},Za={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"};class Ka{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Wa(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new i("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new n("}")),this.gullet.pushTokens(e);var r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r}parseExpression(e,t){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var a=this.fetch();if(-1!==Ka.endOfExpression.indexOf(a.text))break;if(t&&a.text===t)break;if(e&&Na[a.text]&&Na[a.text].infix)break;var n=this.parseAtom(t);if(!n)break;"internal"!==n.type&&r.push(n)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(e){for(var t,r=-1,a=0;a<e.length;a++)if("infix"===e[a].type){if(-1!==r)throw new i("only one infix operator per group",e[a].token);r=a,t=e[a].replaceWith}if(-1!==r&&t){var n,o,s=e.slice(0,r),l=e.slice(r+1);return n=1===s.length&&"ordgroup"===s[0].type?s[0]:{type:"ordgroup",mode:this.mode,body:s},o=1===l.length&&"ordgroup"===l[0].type?l[0]:{type:"ordgroup",mode:this.mode,body:l},["\\\\abovefrac"===t?this.callFunction(t,[n,e[r],o],[]):this.callFunction(t,[n,o],[])]}return e}handleSupSubscript(e){var t,r=this.fetch(),a=r.text;this.consume(),this.consumeSpaces();do{var n;t=this.parseGroup(e)}while("internal"===(null==(n=t)?void 0:n.type));if(!t)throw new i("Expected group after '"+a+"'",r);return t}formatUnsupportedCmd(e){for(var t=[],r=0;r<e.length;r++)t.push({type:"textord",mode:"text",text:e[r]});var a={type:"text",mode:this.mode,body:t};return{type:"color",mode:this.mode,color:this.settings.errorColor,body:[a]}}parseAtom(e){var t,r,a=this.parseGroup("atom",e);if("internal"===(null==a?void 0:a.type))return a;if("text"===this.mode)return a;for(;;){this.consumeSpaces();var o=this.fetch();if("\\limits"===o.text||"\\nolimits"===o.text){if(a&&"op"===a.type){var s="\\limits"===o.text;a.limits=s,a.alwaysHandleSupSub=!0}else{if(!a||"operatorname"!==a.type)throw new i("Limit controls must follow a math operator",o);a.alwaysHandleSupSub&&(a.limits="\\limits"===o.text)}this.consume()}else if("^"===o.text){if(t)throw new i("Double superscript",o);t=this.handleSupSubscript("superscript")}else if("_"===o.text){if(r)throw new i("Double subscript",o);r=this.handleSupSubscript("subscript")}else if("'"===o.text){if(t)throw new i("Double superscript",o);var l={type:"textord",mode:this.mode,text:"\\prime"},h=[l];for(this.consume();"'"===this.fetch().text;)h.push(l),this.consume();"^"===this.fetch().text&&h.push(this.handleSupSubscript("superscript")),t={type:"ordgroup",mode:this.mode,body:h}}else{if(!ja[o.text])break;var m=_a.test(o.text),c=[];for(c.push(new n(ja[o.text])),this.consume();;){var p=this.fetch().text;if(!ja[p])break;if(_a.test(p)!==m)break;c.unshift(new n(ja[p])),this.consume()}var u=this.subparse(c);m?r={type:"ordgroup",mode:"math",body:u}:t={type:"ordgroup",mode:"math",body:u}}}return t||r?{type:"supsub",mode:this.mode,base:a,sup:t,sub:r}:a}parseFunction(e,t){var r=this.fetch(),a=r.text,n=Na[a];if(!n)return null;if(this.consume(),t&&"atom"!==t&&!n.allowedInArgument)throw new i("Got function '"+a+"' with no arguments"+(t?" as "+t:""),r);if("text"===this.mode&&!n.allowedInText)throw new i("Can't use function '"+a+"' in text mode",r);if("math"===this.mode&&!1===n.allowedInMath)throw new i("Can't use function '"+a+"' in math mode",r);var{args:o,optArgs:s}=this.parseArguments(a,n);return this.callFunction(a,o,s,r,e)}callFunction(e,t,r,a,n){var o={funcName:e,parser:this,token:a,breakOnTokenText:n},s=Na[e];if(s&&s.handler)return s.handler(o,t,r);throw new i("No function handler for "+e)}parseArguments(e,t){var r=t.numArgs+t.numOptionalArgs;if(0===r)return{args:[],optArgs:[]};for(var a=[],n=[],o=0;o<r;o++){var s=t.argTypes&&t.argTypes[o],l=o<t.numOptionalArgs;(t.primitive&&null==s||"sqrt"===t.type&&1===o&&null==n[0])&&(s="primitive");var h=this.parseGroupOfType("argument to '"+e+"'",s,l);if(l)n.push(h);else{if(null==h)throw new i("Null argument, please report this as a bug");a.push(h)}}return{args:a,optArgs:n}}parseGroupOfType(e,t,r){switch(t){case"color":return this.parseColorGroup(r);case"size":return this.parseSizeGroup(r);case"url":return this.parseUrlGroup(r);case"math":case"text":return this.parseArgumentGroup(r,t);case"hbox":var a=this.parseArgumentGroup(r,"text");return null!=a?{type:"styling",mode:a.mode,body:[a],style:"text"}:null;case"raw":var n=this.parseStringGroup("raw",r);return null!=n?{type:"raw",mode:"text",string:n.text}:null;case"primitive":if(r)throw new i("A primitive argument cannot be optional");var o=this.parseGroup(e);if(null==o)throw new i("Expected group as "+e,this.fetch());return o;case"original":case null:case void 0:return this.parseArgumentGroup(r);default:throw new i("Unknown group type as "+e,this.fetch())}}consumeSpaces(){for(;" "===this.fetch().text;)this.consume()}parseStringGroup(e,t){var r=this.gullet.scanArgument(t);if(null==r)return null;for(var a,n="";"EOF"!==(a=this.fetch()).text;)n+=a.text,this.consume();return this.consume(),r.text=n,r}parseRegexGroup(e,t){for(var r,a=this.fetch(),n=a,o="";"EOF"!==(r=this.fetch()).text&&e.test(o+r.text);)o+=(n=r).text,this.consume();if(""===o)throw new i("Invalid "+t+": '"+a.text+"'",a);return a.range(n,o)}parseColorGroup(e){var t=this.parseStringGroup("color",e);if(null==t)return null;var r=/^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(t.text);if(!r)throw new i("Invalid color: '"+t.text+"'",t);var a=r[0];return/^[0-9a-f]{6}$/i.test(a)&&(a="#"+a),{type:"color-token",mode:this.mode,color:a}}parseSizeGroup(e){var t,r=!1;if(this.gullet.consumeSpaces(),!(t=e||"{"===this.gullet.future().text?this.parseStringGroup("size",e):this.parseRegexGroup(/^[-+]? *(?:$|\d+|\d+\.\d*|\.\d*) *[a-z]{0,2} *$/,"size")))return null;e||0!==t.text.length||(t.text="0pt",r=!0);var a=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(t.text);if(!a)throw new i("Invalid size: '"+t.text+"'",t);var n={number:+(a[1]+a[2]),unit:a[3]};if(!P(n))throw new i("Invalid unit: '"+n.unit+"'",t);return{type:"size",mode:this.mode,value:n,isBlank:r}}parseUrlGroup(e){this.gullet.lexer.setCatcode("%",13),this.gullet.lexer.setCatcode("~",12);var t=this.parseStringGroup("url",e);if(this.gullet.lexer.setCatcode("%",14),this.gullet.lexer.setCatcode("~",13),null==t)return null;var r=t.text.replace(/\\([#$%&~_^{}])/g,"$1");return{type:"url",mode:this.mode,url:r}}parseArgumentGroup(e,t){var r=this.gullet.scanArgument(e);if(null==r)return null;var a=this.mode;t&&this.switchMode(t),this.gullet.beginGroup();var n=this.parseExpression(!1,"EOF");this.expect("EOF"),this.gullet.endGroup();var i={type:"ordgroup",mode:this.mode,loc:r.loc,body:n};return t&&this.switchMode(a),i}parseGroup(e,t){var r,n=this.fetch(),o=n.text;if("{"===o||"\\begingroup"===o){this.consume();var s="{"===o?"}":"\\endgroup";this.gullet.beginGroup();var l=this.parseExpression(!1,s),h=this.fetch();this.expect(s),this.gullet.endGroup(),r={type:"ordgroup",mode:this.mode,loc:a.range(n,h),body:l,semisimple:"\\begingroup"===o||void 0}}else if(null==(r=this.parseFunction(t,e)||this.parseSymbol())&&"\\"===o[0]&&!Xa.hasOwnProperty(o)){if(this.settings.throwOnError)throw new i("Undefined control sequence: "+o,n);r=this.formatUnsupportedCmd(o),this.consume()}return r}formLigatures(e){for(var t=e.length-1,r=0;r<t;++r){var n=e[r],i=n.text;"-"===i&&"-"===e[r+1].text&&(r+1<t&&"-"===e[r+2].text?(e.splice(r,3,{type:"textord",mode:"text",loc:a.range(n,e[r+2]),text:"---"}),t-=2):(e.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,e[r+1]),text:"--"}),t-=1)),"'"!==i&&"`"!==i||e[r+1].text!==i||(e.splice(r,2,{type:"textord",mode:"text",loc:a.range(n,e[r+1]),text:i+i}),t-=1)}}parseSymbol(){var e=this.fetch(),t=e.text;if(/^\\verb[^a-zA-Z]/.test(t)){this.consume();var r=t.slice(5),n="*"===r.charAt(0);if(n&&(r=r.slice(1)),r.length<2||r.charAt(0)!==r.slice(-1))throw new i("\\verb assertion failed --\n please report what input caused this bug");return{type:"verb",mode:"text",body:r=r.slice(1,-1),star:n}}Za.hasOwnProperty(t[0])&&!ie[this.mode][t[0]]&&(this.settings.strict&&"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Accented Unicode text character "'+t[0]+'" used in math mode',e),t=Za[t[0]]+t.slice(1));var o,s=Ha.exec(t);if(s&&("i"===(t=t.substring(0,s.index))?t="\u0131":"j"===t&&(t="\u0237")),ie[this.mode][t]){this.settings.strict&&"math"===this.mode&&Le.indexOf(t)>=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var l,h=ie[this.mode][t].group,m=a.range(e);if(ae.hasOwnProperty(h)){var c=h;l={type:"atom",mode:this.mode,family:c,loc:m,text:t}}else l={type:h,mode:this.mode,loc:m,text:t};o=l}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(z(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),o={type:"textord",mode:"text",loc:a.range(e),text:t}}if(this.consume(),s)for(var p=0;p<s[0].length;p++){var u=s[0][p];if(!$a[u])throw new i("Unknown accent ' "+u+"'",e);var d=$a[u][this.mode]||$a[u].text;if(!d)throw new i("Accent "+u+" unsupported in "+this.mode+" mode",e);o={type:"accent",mode:this.mode,loc:a.range(e),label:d,isStretchy:!1,isShifty:!0,base:o}}return o}}Ka.endOfExpression=["}","\\endgroup","\\end","\\right","&"];var Ja=function(e,t){if(!("string"==typeof e||e instanceof String))throw new TypeError("KaTeX can only parse string typed expression");var r=new Ka(e,t);delete r.gullet.macros.current["\\df@tag"];var a=r.parse();if(delete r.gullet.macros.current["\\current@color"],delete r.gullet.macros.current["\\color"],r.gullet.macros.get("\\df@tag")){if(!t.displayMode)throw new i("\\tag works only in display equations");a=[{type:"tag",mode:"text",body:a,tag:r.subparse([new n("\\df@tag")])}]}return a},Qa=function(e,t,r){t.textContent="";var a=tn(e,r).toNode();t.appendChild(a)};"undefined"!=typeof document&&"CSS1Compat"!==document.compatMode&&("undefined"!=typeof console&&console.warn("Warning: KaTeX doesn't work in quirks mode. Make sure your website has a suitable doctype."),Qa=function(){throw new i("KaTeX doesn't work in quirks mode.")});var en=function(e,t,r){if(r.throwOnError||!(e instanceof i))throw e;var a=Je.makeSpan(["katex-error"],[new J(t)]);return a.setAttribute("title",e.toString()),a.setAttribute("style","color:"+r.errorColor),a},tn=function(e,t){var r=new u(t);try{return function(e,t,r){var a,n=Lt(r);if("mathml"===r.output)return Et(e,t,n,r.displayMode,!0);if("html"===r.output){var i=Mt(e,n);a=Je.makeSpan(["katex"],[i])}else{var o=Et(e,t,n,r.displayMode,!1),s=Mt(e,n);a=Je.makeSpan(["katex"],[o,s])}return Dt(a,r)}(Ja(e,r),e,r)}catch(a){return en(a,e,r)}},rn={version:"0.16.22",render:Qa,renderToString:function(e,t){return tn(e,t).toMarkup()},ParseError:i,SETTINGS_SCHEMA:c,__parse:function(e,t){var r=new u(t);return Ja(e,r)},__renderToDomTree:tn,__renderToHTMLTree:function(e,t){var r=new u(t);try{return function(e,t,r){var a=Mt(e,Lt(r)),n=Je.makeSpan(["katex"],[a]);return Dt(n,r)}(Ja(e,r),0,r)}catch(a){return en(a,e,r)}},__setFontMetrics:function(e,t){C[e]=t},__defineSymbol:oe,__defineFunction:st,__defineMacro:Ur,__domTree:{Span:j,Anchor:$,SymbolNode:J,SvgNode:Q,PathNode:ee,LineNode:te}}}}]); \ No newline at end of file diff --git a/assets/js/9469bd80.82882490.js b/assets/js/9469bd80.82882490.js new file mode 100644 index 0000000000..a6ac9746b6 --- /dev/null +++ b/assets/js/9469bd80.82882490.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4661],{1966:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.11.0/rules/android/disable_resources.md","sourceDirName":"rules/android","slug":"/rules/android/disable_resources","permalink":"/ModuleCheck/docs/0.11.0/rules/android/disable_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/android/disable_resources.md","tags":[],"version":"0.11.0","frontMatter":{"id":"disable_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.11.0/rules/android/disable_viewbinding"}}');var o=r(23420),d=r(65404);const i={id:"disable_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,c={},a=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/9478d12a.78d0819f.js b/assets/js/9478d12a.78d0819f.js new file mode 100644 index 0000000000..8786fb516e --- /dev/null +++ b/assets/js/9478d12a.78d0819f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1815],{37997:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.11.3/rules/kapt/custom_kapt_matchers.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/kapt/custom_kapt_matchers.md","tags":[],"version":"0.11.3","frontMatter":{"id":"custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies"}}');var o=s(23420),r=s(65404);const a={id:"custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},c=void 0,i={},u=[];function l(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,o.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>c});var n=s(36672);const o={},r=n.createContext(o);function a(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/94dc3e5f.4a4a88a1.js b/assets/js/94dc3e5f.4a4a88a1.js new file mode 100644 index 0000000000..6ddefb7a60 --- /dev/null +++ b/assets/js/94dc3e5f.4a4a88a1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6446],{5009:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/docs/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/next/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/suppressing-findings.mdx","tags":[],"version":"current","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/next/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/next/ci-workflow"}}');var s=t(23420),a=t(65404),i=t(83796),o=t(7357);const l={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},u=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,s.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,s.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inherited-dependency /Users/<you>/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky must-be-api /Users/<you>/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unused-dependency /Users/<you>/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{value:"Kotlin",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("must-be-api") // don\'t switch anything to an api config\ndependencies {\n\n @Suppress("unused-dependency") // don\'t comment out or delete this dependency\n implementation(project(":unused-lib"))\n\n @Suppress("inherited-dependency") // don\'t add dependencies which are inherited from this library\n implementation(project(":leaky"))\n}\n'})})}),(0,s.jsx)(o.A,{value:"Groovy",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection must-be-api\ndependencies {\n\n // don\'t comment out or delete this dependency\n //noinspection unused-dependency\n implementation(project(":unused-lib"))\n\n // don\'t add dependencies which are inherited from this library\n //noinspection inherited-dependency\n implementation(project(":leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const s={tabItem:"tabItem_qogc"};var a=t(23420);function i({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},83796:(e,n,t)=>{t.d(n,{A:()=>j});var r=t(36672),s=t(13526),a=t(58797),i=t(85291),o=t(52245),l=t(32342),u=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,a=p(e),[i,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[u,d]=f({queryString:t,groupId:s}),[m,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=u??m;return h({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&l(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,a]),tabValues:a}}var b=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),u=e=>{const n=e.currentTarget,s=o.indexOf(n),a=i[s].value;a!==t&&(l(n),r(a))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function x(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function j(e){const n=(0,b.A)();return(0,v.jsx)(x,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/99547feb.0f4e43ef.js b/assets/js/99547feb.0f4e43ef.js new file mode 100644 index 0000000000..796fa8e24b --- /dev/null +++ b/assets/js/99547feb.0f4e43ef.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3388],{46539:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.10.0/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_plugins","permalink":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/sorting/sort_plugins.md","tags":[],"version":"0.10.0","frontMatter":{"id":"sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Rules","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.10.0/rules/android/disable_resources"}}');var r=t(23420),o=t(65404);const i={id:"sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const r={},o=n.createContext(r);function i(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/997.782da1dd.js b/assets/js/997.782da1dd.js new file mode 100644 index 0000000000..86b6010a09 --- /dev/null +++ b/assets/js/997.782da1dd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[997],{70997:(e,c,k)=>{k.r(c)}}]); \ No newline at end of file diff --git a/assets/js/99cbfc76.b0a2d548.js b/assets/js/99cbfc76.b0a2d548.js new file mode 100644 index 0000000000..fd85e60b43 --- /dev/null +++ b/assets/js/99cbfc76.b0a2d548.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6288],{7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const s={tabItem:"tabItem_qogc"};var a=t(23420);function i({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},83796:(e,n,t)=>{t.d(n,{A:()=>x});var r=t(36672),s=t(13526),a=t(58797),i=t(85291),o=t(52245),l=t(32342),u=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,a=p(e),[i,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[u,d]=f({queryString:t,groupId:s}),[m,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=u??m;return h({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&l(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,a]),tabValues:a}}var b=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),u=e=>{const n=e.currentTarget,s=o.indexOf(n),a=i[s].value;a!==t&&(l(n),r(a))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function x(e){const n=(0,b.A)();return(0,v.jsx)(w,{...e,children:d(e.children)},String(n))}},94082:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/versioned_docs/version-0.12.2/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/0.12.2/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/suppressing-findings.mdx","tags":[],"version":"0.12.2","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.2/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.2/ci-workflow"}}');var s=t(23420),a=t(65404),i=t(83796),o=t(7357);const l={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},u=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,s.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,s.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{value:"Kotlin",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("must-be-api") // don\'t switch anything to an api config\ndependencies {\n\n@Suppress("unused-dependency") // don\'t comment out or delete this dependency\nimplementation(project(":unused-lib"))\n\n@Suppress("inherited-dependency") // don\'t add dependencies which are inherited from this library\nimplementation(project(":leaky"))\n}\n'})})}),(0,s.jsx)(o.A,{value:"Groovy",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection must-be-api\ndependencies {\n\n// don\'t comment out or delete this dependency\n//noinspection unused-dependency\nimplementation(project(":unused-lib"))\n\n// don\'t add dependencies which are inherited from this library\n//noinspection inherited-dependency\nimplementation(project(":leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}}}]); \ No newline at end of file diff --git a/assets/js/9ae4b911.287c9823.js b/assets/js/9ae4b911.287c9823.js new file mode 100644 index 0000000000..064578d8e9 --- /dev/null +++ b/assets/js/9ae4b911.287c9823.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[763],{65404:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>l});var t=o(36672);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}},97181:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.12.0/rules/compiler/could_use_anvil_factory.md","sourceDirName":"rules/compiler","slug":"/rules/compiler/could_use_anvil_factory","permalink":"/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/compiler/could_use_anvil_factory.md","tags":[],"version":"0.12.0","frontMatter":{"id":"could_use_anvil_factory","title":"Could Use Anvil Factory","sidebar_label":"Could Use Anvil Factory"},"sidebar":"Docs","previous":{"title":"Depths","permalink":"/ModuleCheck/docs/0.12.0/rules/depths"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor"}}');var r=o(23420),s=o(65404);const i={id:"could_use_anvil_factory",title:"Could Use Anvil Factory",sidebar_label:"Could Use Anvil Factory"},l=void 0,c={},a=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or\nSubcomponents, and it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}}}]); \ No newline at end of file diff --git a/assets/js/9e2bab8c.72214067.js b/assets/js/9e2bab8c.72214067.js new file mode 100644 index 0000000000..b1f34b6fc5 --- /dev/null +++ b/assets/js/9e2bab8c.72214067.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9063],{18324:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.12.5","label":"0.12.5","banner":null,"badge":true,"noIndex":false,"className":"docs-version-0.12.5","isLast":true,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/rules/unused_dependency","docId":"rules/unused_dependency","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/rules/redundant_dependency","docId":"rules/redundant_dependency","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/rules/overshot_dependency","docId":"rules/overshot_dependency","unlisted":false},{"type":"link","label":"Project Depth","href":"/ModuleCheck/docs/rules/project_depth","docId":"rules/project_depth","unlisted":false},{"type":"category","label":"Compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory Generation","href":"/ModuleCheck/docs/rules/use_anvil_factory_generation","docId":"rules/compiler/use_anvil_factory_generation","unlisted":false},{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/rules/unused_kapt_processor","docId":"rules/compiler/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/rules/unused_kapt_plugin","docId":"rules/compiler/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/rules/custom_kapt_matchers","docId":"rules/compiler/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/rules/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/rules/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/rules/disable_android_resources","docId":"rules/android/disable_android_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/rules/disable_view_binding","docId":"rules/android/disable_view_binding","unlisted":false},{"type":"link","label":"Unused Kotlin Android Extensions","href":"/ModuleCheck/docs/rules/unused_kotlin_android_extensions","docId":"rules/android/unused_kotlin_android_extensions","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"<Tabs groupId=\\"language\\"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"Dependencies","sidebar":"Docs"},"rules/android/disable_android_resources":{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_view_binding":{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/android/unused_kotlin_android_extensions":{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","sidebar":"Docs"},"rules/compiler/custom_kapt_matchers":{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/compiler/unused_kapt_plugin":{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","sidebar":"Docs"},"rules/compiler/unused_kapt_processor":{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/compiler/use_anvil_factory_generation":{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/overshot_dependency":{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","sidebar":"Docs"},"rules/project_depth":{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","sidebar":"Docs"},"rules/redundant_dependency":{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused_dependency":{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/a06cff9c.68c9ad11.js b/assets/js/a06cff9c.68c9ad11.js new file mode 100644 index 0000000000..e07a224b7e --- /dev/null +++ b/assets/js/a06cff9c.68c9ad11.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8705],{24941:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>s,default:()=>a,frontMatter:()=>i,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.11.2/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.11.2/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/inherited_dependency.md","tags":[],"version":"0.11.2","frontMatter":{"id":"inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.2/rules/must_be_api"},"next":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory"}}');var o=d(23420),c=d(65404);const i={id:"inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},s=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,c.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleB"}),", and ",(0,o.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,o.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,o.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,o.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,o.jsx)(n.code,{children:":moduleA"})," -> ",(0,o.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>i,x:()=>s});var t=d(36672);const o={},c=t.createContext(o);function i(e){const n=t.useContext(c);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(c.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a180cea5.12b75376.js b/assets/js/a180cea5.12b75376.js new file mode 100644 index 0000000000..1521c01fea --- /dev/null +++ b/assets/js/a180cea5.12b75376.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5251],{34669:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>r});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/docs/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/next/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/ci_workflow.md","tags":[],"version":"current","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/next/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/next/rules/unused_dependency"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,c={},r=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheckAuto):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew moduleCheckAuto --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a2d99d88.6f240b05.js b/assets/js/a2d99d88.6f240b05.js new file mode 100644 index 0000000000..400c66e54e --- /dev/null +++ b/assets/js/a2d99d88.6f240b05.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8628],{7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const s={tabItem:"tabItem_qogc"};var a=t(23420);function i({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},83796:(e,n,t)=>{t.d(n,{A:()=>w});var r=t(36672),s=t(13526),a=t(58797),i=t(85291),o=t(52245),u=t(32342),l=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,l.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,u.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,a=p(e),[i,u]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[l,d]=f({queryString:t,groupId:s}),[m,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=l??m;return h({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&u(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);u(e),d(e),b(e)},[d,b,a]),tabValues:a}}var b=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:u}=(0,a.a_)(),l=e=>{const n=e.currentTarget,s=o.indexOf(n),a=i[s].value;a!==t&&(u(n),r(a))},c=e=>{let n=null;switch(e.key){case"Enter":l(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:l,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function w(e){const n=(0,b.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}},85672:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>l,default:()=>h,frontMatter:()=>u,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/versioned_docs/version-0.12.0/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/0.12.0/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/suppressing-findings.mdx","tags":[],"version":"0.12.0","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.0/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.0/ci-workflow"}}');var s=t(23420),a=t(65404),i=t(83796),o=t(7357);const u={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},l=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,s.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,s.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inheritedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky mustBeApi /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unusedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{value:"Kotlin",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("mustBeApi") // don\'t switch anything to an api config\ndependencies {\n\n @Suppress("unusedDependency") // don\'t comment out or delete this dependency\n implementation(project(":unused-lib"))\n\n @Suppress("inheritedDependency") // don\'t add dependencies which are inherited from this fat jar\n implementation(project(":fat-and-leaky"))\n}\n'})})}),(0,s.jsx)(o.A,{value:"Groovy",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection mustBeApi\ndependencies {\n\n // don\'t comment out or delete this dependency\n //noinspection unusedDependency\n implementation(project(":unused-lib"))\n\n // don\'t add dependencies which are inherited from this fat jar\n //noinspection inheritedDependency\n implementation(project(":fat-and-leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}}}]); \ No newline at end of file diff --git a/assets/js/a35aa088.66e7e35f.js b/assets/js/a35aa088.66e7e35f.js new file mode 100644 index 0000000000..42d6479f89 --- /dev/null +++ b/assets/js/a35aa088.66e7e35f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[750],{4620:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.12.0/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/0.12.0/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/ci_workflow.md","tags":[],"version":"0.12.0","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.0/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/unused"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheckAuto):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew moduleCheckAuto --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a4b1a9b8.e83ba81c.js b/assets/js/a4b1a9b8.e83ba81c.js new file mode 100644 index 0000000000..288e6f3053 --- /dev/null +++ b/assets/js/a4b1a9b8.e83ba81c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8783],{65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var s=t(36672);const o={},d=s.createContext(o);function r(e){const n=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(d.Provider,{value:n},e.children)}},67556:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>a,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","source":"@site/versioned_docs/version-0.12.1/rules/overshot_dependency.md","sourceDirName":"rules","slug":"/rules/overshot_dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/overshot_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/overshot_dependency.md","tags":[],"version":"0.12.1","frontMatter":{"id":"overshot_dependency","slug":"/rules/overshot_dependency","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Docs","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/redundant_dependency"},"next":{"title":"Project Depth","permalink":"/ModuleCheck/docs/0.12.1/rules/project_depth"}}');var o=t(23420),d=t(65404);const r={id:"overshot_dependency",slug:"/rules/overshot_dependency",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},c=void 0,i={},l=[];function u(e){const n={code:"code",em:"em",p:"p",pre:"pre",strong:"strong",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(n.p,{children:"Finds project dependencies which aren't used by the declaring configuration, but are used by a\ndependent, downstream configuration."}),"\n",(0,o.jsxs)(n.p,{children:["For instance, assume that ",(0,o.jsx)(n.code,{children:":moduleB"})," declares an ",(0,o.jsx)(n.code,{children:"implementation"})," dependency upon ",(0,o.jsx)(n.code,{children:":moduleA"}),"."]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n implementation(project(":moduleA"))\n}\n'})}),"\n",(0,o.jsxs)(n.p,{children:["If ",(0,o.jsx)(n.code,{children:":moduleB"})," doesn't actually use ",(0,o.jsx)(n.code,{children:":moduleA"})," in its ",(0,o.jsx)(n.code,{children:"main"})," source, but it ",(0,o.jsx)(n.em,{children:"does"})," use it in ",(0,o.jsx)(n.code,{children:"test"}),"\nsource, it's an ",(0,o.jsx)(n.strong,{children:"overshot dependency"}),". The declaration should be changed to\nuse ",(0,o.jsx)(n.code,{children:"testImplementation"}),":"]}),"\n",(0,o.jsx)(n.pre,{children:(0,o.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n testImplementation(project(":moduleA"))\n}\n'})})]})}function a(e={}){const{wrapper:n}={...(0,d.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/a4e2bd41.6d1296f7.js b/assets/js/a4e2bd41.6d1296f7.js new file mode 100644 index 0000000000..d3acbe3c6e --- /dev/null +++ b/assets/js/a4e2bd41.6d1296f7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[406],{32088:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>c,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"","source":"@site/versioned_docs/version-0.10.0/rules/kapt/unused_kapt_plugin.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/kapt/unused_kapt_plugin.md","tags":[],"version":"0.10.0","frontMatter":{"id":"unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Rules","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers"}}');var u=n(23420),o=n(65404);const r={id:"unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},a=void 0,i={},l=[];function p(e){return(0,u.jsx)(u.Fragment,{})}function c(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,u.jsx)(t,{...e,children:(0,u.jsx)(p,{...e})}):p()}},65404:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>a});var s=n(36672);const u={},o=s.createContext(u);function r(e){const t=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(u):e.components||u:r(e.components),s.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a559ab1c.eb18048e.js b/assets/js/a559ab1c.eb18048e.js new file mode 100644 index 0000000000..4a50ac693d --- /dev/null +++ b/assets/js/a559ab1c.eb18048e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[286],{65404:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var o=s(36672);const t={},i=o.createContext(t);function r(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(i.Provider,{value:n},e.children)}},86729:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.11.1/rules/kapt/unused_kapt_processor.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/kapt/unused_kapt_processor.md","tags":[],"version":"0.11.1","frontMatter":{"id":"unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin"}}');var t=s(23420),i=s(65404);const r={id:"unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,d={},c=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/a5f1db42.7e5dd1b3.js b/assets/js/a5f1db42.7e5dd1b3.js new file mode 100644 index 0000000000..4a94ab0e53 --- /dev/null +++ b/assets/js/a5f1db42.7e5dd1b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7454],{7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const s={tabItem:"tabItem_qogc"};var a=t(23420);function i({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},66592:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/versioned_docs/version-0.12.4/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/0.12.4/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/suppressing-findings.mdx","tags":[],"version":"0.12.4","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.4/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.4/ci-workflow"}}');var s=t(23420),a=t(65404),i=t(83796),o=t(7357);const l={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},u=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,s.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,s.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{value:"Kotlin",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("must-be-api") // don\'t switch anything to an api config\ndependencies {\n\n @Suppress("unused-dependency") // don\'t comment out or delete this dependency\n implementation(project(":unused-lib"))\n\n @Suppress("inherited-dependency") // don\'t add dependencies which are inherited from this library\n implementation(project(":leaky"))\n}\n'})})}),(0,s.jsx)(o.A,{value:"Groovy",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection must-be-api\ndependencies {\n\n // don\'t comment out or delete this dependency\n //noinspection unused-dependency\n implementation(project(":unused-lib"))\n\n // don\'t add dependencies which are inherited from this library\n //noinspection inherited-dependency\n implementation(project(":leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}},83796:(e,n,t)=>{t.d(n,{A:()=>x});var r=t(36672),s=t(13526),a=t(58797),i=t(85291),o=t(52245),l=t(32342),u=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,a=p(e),[i,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[u,d]=f({queryString:t,groupId:s}),[m,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=u??m;return h({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&l(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,a]),tabValues:a}}var b=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),u=e=>{const n=e.currentTarget,s=o.indexOf(n),a=i[s].value;a!==t&&(l(n),r(a))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function x(e){const n=(0,b.A)();return(0,v.jsx)(w,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/a5fc5a0e.d705654f.js b/assets/js/a5fc5a0e.d705654f.js new file mode 100644 index 0000000000..ef50510e1c --- /dev/null +++ b/assets/js/a5fc5a0e.d705654f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4663],{65404:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(36672);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}},82454:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.11.3/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_dependencies","permalink":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/sorting/sort_dependencies.md","tags":[],"version":"0.11.3","frontMatter":{"id":"sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins"}}');var o=n(23420),r=n(65404);const i={id:"sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l()}}}]); \ No newline at end of file diff --git a/assets/js/a7456010.f7ae1996.js b/assets/js/a7456010.f7ae1996.js new file mode 100644 index 0000000000..b14c775440 --- /dev/null +++ b/assets/js/a7456010.f7ae1996.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1235],{88552:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-pages","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/a7bd4aaa.4676842a.js b/assets/js/a7bd4aaa.4676842a.js new file mode 100644 index 0000000000..7b18d91a42 --- /dev/null +++ b/assets/js/a7bd4aaa.4676842a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7098],{72538:(e,n,s)=>{s.r(n),s.d(n,{default:()=>d});s(36672);var r=s(6617),o=s(56747),c=s(40827),t=s(26271),i=s(12505),u=s(23420);function l(e){const{version:n}=e;return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(i.A,{version:n.version,tag:(0,o.k)(n.pluginId,n.version)}),(0,u.jsx)(r.be,{children:n.noIndex&&(0,u.jsx)("meta",{name:"robots",content:"noindex, nofollow"})})]})}function a(e){const{version:n,route:s}=e;return(0,u.jsx)(r.e3,{className:n.className,children:(0,u.jsx)(c.n,{version:n,children:(0,t.v)(s.routes)})})}function d(e){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(l,{...e}),(0,u.jsx)(a,{...e})]})}}}]); \ No newline at end of file diff --git a/assets/js/a8ed45e8.71f7c343.js b/assets/js/a8ed45e8.71f7c343.js new file mode 100644 index 0000000000..9a5ee5e514 --- /dev/null +++ b/assets/js/a8ed45e8.71f7c343.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3149],{17547:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>i,contentTitle:()=>r,default:()=>a,frontMatter:()=>o,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.11.1/rules/unused.md","sourceDirName":"rules","slug":"/rules/unused","permalink":"/ModuleCheck/docs/0.11.1/rules/unused","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/unused.md","tags":[],"version":"0.11.1","frontMatter":{"id":"unused","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.1/configuration"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.1/rules/must_be_api"}}');var d=s(23420),u=s(65404);const o={id:"unused",title:"Unused Dependency",sidebar_label:"Unused Dependency"},r=void 0,i={},c=[];function l(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,d.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>r});var t=s(36672);const d={},u=t.createContext(d);function o(e){const n=t.useContext(u);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:o(e.components),t.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/a94703ab.be6278a0.js b/assets/js/a94703ab.be6278a0.js new file mode 100644 index 0000000000..26e023b6b3 --- /dev/null +++ b/assets/js/a94703ab.be6278a0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9048],{16816:(e,t,n)=>{n.r(t),n.d(t,{default:()=>pe});var a=n(36672),o=n(13526),i=n(6617),s=n(84862),r=n(74366),c=n(24179),l=n(53499),d=n(58797),u=n(27019);const m={backToTopButton:"backToTopButton_N7e4",backToTopButtonShow:"backToTopButtonShow_xOSK"};var h=n(23420);function b(){const{shown:e,scrollToTop:t}=function({threshold:e}){const[t,n]=(0,a.useState)(!1),o=(0,a.useRef)(!1),{startScroll:i,cancelScroll:s}=(0,d.gk)();return(0,d.Mq)(({scrollY:t},a)=>{const i=a?.scrollY;i&&(o.current?o.current=!1:t>=i?(s(),n(!1)):t<e?n(!1):t+window.innerHeight<document.documentElement.scrollHeight&&n(!0))}),(0,u.$)(e=>{e.location.hash&&(o.current=!0,n(!1))}),{shown:t,scrollToTop:()=>i(0)}}({threshold:300});return(0,h.jsx)("button",{"aria-label":(0,l.T)({id:"theme.BackToTopButton.buttonAriaLabel",message:"Scroll back to top",description:"The ARIA label for the back to top button"}),className:(0,o.A)("clean-btn",s.G.common.backToTopButton,m.backToTopButton,e&&m.backToTopButtonShow),type:"button",onClick:t})}var p=n(87014),x=n(85291),f=n(96320),j=n(67797),g=n(86643);function v(e){return(0,h.jsx)("svg",{width:"20",height:"20","aria-hidden":"true",...e,children:(0,h.jsxs)("g",{fill:"#7a7a7a",children:[(0,h.jsx)("path",{d:"M9.992 10.023c0 .2-.062.399-.172.547l-4.996 7.492a.982.982 0 01-.828.454H1c-.55 0-1-.453-1-1 0-.2.059-.403.168-.551l4.629-6.942L.168 3.078A.939.939 0 010 2.528c0-.548.45-.997 1-.997h2.996c.352 0 .649.18.828.45L9.82 9.472c.11.148.172.347.172.55zm0 0"}),(0,h.jsx)("path",{d:"M19.98 10.023c0 .2-.058.399-.168.547l-4.996 7.492a.987.987 0 01-.828.454h-3c-.547 0-.996-.453-.996-1 0-.2.059-.403.168-.551l4.625-6.942-4.625-6.945a.939.939 0 01-.168-.55 1 1 0 01.996-.997h3c.348 0 .649.18.828.45l4.996 7.492c.11.148.168.347.168.55zm0 0"})]})})}const _="collapseSidebarButton_tTaE",A="collapseSidebarButtonIcon_aVw4";function C({onClick:e}){return(0,h.jsx)("button",{type:"button",title:(0,l.T)({id:"theme.docs.sidebar.collapseButtonTitle",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),"aria-label":(0,l.T)({id:"theme.docs.sidebar.collapseButtonAriaLabel",message:"Collapse sidebar",description:"The title attribute for collapse button of doc sidebar"}),className:(0,o.A)("button button--secondary button--outline",_),onClick:e,children:(0,h.jsx)(v,{className:A})})}var k=n(71850),S=n(92471);const T=Symbol("EmptyContext"),N=a.createContext(T);function I({children:e}){const[t,n]=(0,a.useState)(null),o=(0,a.useMemo)(()=>({expandedItem:t,setExpandedItem:n}),[t]);return(0,h.jsx)(N.Provider,{value:o,children:e})}var y=n(90317),w=n(91548),B=n(75150),L=n(64407);function E({collapsed:e,categoryLabel:t,onClick:n}){return(0,h.jsx)("button",{"aria-label":e?(0,l.T)({id:"theme.DocSidebarItem.expandCategoryAriaLabel",message:"Expand sidebar category '{label}'",description:"The ARIA label to expand the sidebar category"},{label:t}):(0,l.T)({id:"theme.DocSidebarItem.collapseCategoryAriaLabel",message:"Collapse sidebar category '{label}'",description:"The ARIA label to collapse the sidebar category"},{label:t}),"aria-expanded":!e,type:"button",className:"clean-btn menu__caret",onClick:n})}function M({item:e,onItemClick:t,activePath:n,level:i,index:c,...l}){const{items:d,label:u,collapsible:m,className:b,href:p}=e,{docs:{sidebar:{autoCollapseCategories:x}}}=(0,j.p)(),f=function(e){const t=(0,L.A)();return(0,a.useMemo)(()=>e.href&&!e.linkUnlisted?e.href:!t&&e.collapsible?(0,r.Nr)(e):void 0,[e,t])}(e),g=(0,r.w8)(e,n),v=(0,w.ys)(p,n),{collapsed:_,setCollapsed:A}=(0,y.u)({initialState:()=>!!m&&(!g&&e.collapsed)}),{expandedItem:C,setExpandedItem:k}=function(){const e=(0,a.useContext)(N);if(e===T)throw new S.dV("DocSidebarItemsExpandedStateProvider");return e}(),I=(e=!_)=>{k(e?null:c),A(e)};return function({isActive:e,collapsed:t,updateCollapsed:n}){const o=(0,S.ZC)(e);(0,a.useEffect)(()=>{e&&!o&&t&&n(!1)},[e,o,t,n])}({isActive:g,collapsed:_,updateCollapsed:I}),(0,a.useEffect)(()=>{m&&null!=C&&C!==c&&x&&A(!0)},[m,C,c,A,x]),(0,h.jsxs)("li",{className:(0,o.A)(s.G.docs.docSidebarItemCategory,s.G.docs.docSidebarItemCategoryLevel(i),"menu__list-item",{"menu__list-item--collapsed":_},b),children:[(0,h.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":v}),children:[(0,h.jsx)(B.A,{className:(0,o.A)("menu__link",{"menu__link--sublist":m,"menu__link--sublist-caret":!p&&m,"menu__link--active":g}),onClick:m?n=>{t?.(e),p?v?(n.preventDefault(),I()):I(!1):(n.preventDefault(),I())}:()=>{t?.(e)},"aria-current":v?"page":void 0,role:m&&!p?"button":void 0,"aria-expanded":m&&!p?!_:void 0,href:m?f??"#":f,...l,children:u}),p&&m&&(0,h.jsx)(E,{collapsed:_,categoryLabel:u,onClick:e=>{e.preventDefault(),I()}})]}),(0,h.jsx)(y.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:_,children:(0,h.jsx)(V,{items:d,tabIndex:_?-1:0,onItemClick:t,activePath:n,level:i+1})})]})}var H=n(4518),G=n(8804);const R="menuExternalLink_bkjJ";function D({item:e,onItemClick:t,activePath:n,level:a,index:i,...c}){const{href:l,label:d,className:u,autoAddBaseUrl:m}=e,b=(0,r.w8)(e,n),p=(0,H.A)(l);return(0,h.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(a),"menu__list-item",u),children:(0,h.jsxs)(B.A,{className:(0,o.A)("menu__link",!p&&R,{"menu__link--active":b}),autoAddBaseUrl:m,"aria-current":b?"page":void 0,to:l,...p&&{onClick:t?()=>t(e):void 0},...c,children:[d,!p&&(0,h.jsx)(G.A,{})]})},d)}const P="menuHtmlItem_SDir";function W({item:e,level:t,index:n}){const{value:a,defaultStyle:i,className:r}=e;return(0,h.jsx)("li",{className:(0,o.A)(s.G.docs.docSidebarItemLink,s.G.docs.docSidebarItemLinkLevel(t),i&&[P,"menu__list-item"],r),dangerouslySetInnerHTML:{__html:a}},n)}function F({item:e,...t}){switch(e.type){case"category":return(0,h.jsx)(M,{item:e,...t});case"html":return(0,h.jsx)(W,{item:e,...t});default:return(0,h.jsx)(D,{item:e,...t})}}function U({items:e,...t}){const n=(0,r.Y)(e,t.activePath);return(0,h.jsx)(I,{children:n.map((e,n)=>(0,h.jsx)(F,{item:e,index:n,...t},n))})}const V=(0,a.memo)(U),O="menu_Ug5w",Y="menuWithAnnouncementBar_U9It";function z({path:e,sidebar:t,className:n}){const i=function(){const{isActive:e}=(0,k.M)(),[t,n]=(0,a.useState)(e);return(0,d.Mq)(({scrollY:t})=>{e&&n(0===t)},[e]),e&&t}();return(0,h.jsx)("nav",{"aria-label":(0,l.T)({id:"theme.docs.sidebar.navAriaLabel",message:"Docs sidebar",description:"The ARIA label for the sidebar navigation"}),className:(0,o.A)("menu thin-scrollbar",O,i&&Y,n),children:(0,h.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,h.jsx)(V,{items:t,activePath:e,level:1})})})}const q="sidebar_kIjR",J="sidebarWithHideableNavbar_BO_l",K="sidebarHidden_XfJk",X="sidebarLogo_ag23";function Q({path:e,sidebar:t,onCollapse:n,isHidden:a}){const{navbar:{hideOnScroll:i},docs:{sidebar:{hideable:s}}}=(0,j.p)();return(0,h.jsxs)("div",{className:(0,o.A)(q,i&&J,a&&K),children:[i&&(0,h.jsx)(g.A,{tabIndex:-1,className:X}),(0,h.jsx)(z,{path:e,sidebar:t}),s&&(0,h.jsx)(C,{onClick:n})]})}const Z=a.memo(Q);var $=n(98099),ee=n(83386);const te=({sidebar:e,path:t})=>{const n=(0,ee.M)();return(0,h.jsx)("ul",{className:(0,o.A)(s.G.docs.docSidebarMenu,"menu__list"),children:(0,h.jsx)(V,{items:e,activePath:t,onItemClick:e=>{"category"===e.type&&e.href&&n.toggle(),"link"===e.type&&n.toggle()},level:1})})};function ne(e){return(0,h.jsx)($.GX,{component:te,props:e})}const ae=a.memo(ne);function oe(e){const t=(0,f.l)(),n="desktop"===t||"ssr"===t,a="mobile"===t;return(0,h.jsxs)(h.Fragment,{children:[n&&(0,h.jsx)(Z,{...e}),a&&(0,h.jsx)(ae,{...e})]})}const ie={expandButton:"expandButton_Chnj",expandButtonIcon:"expandButtonIcon_ukA1"};function se({toggleSidebar:e}){return(0,h.jsx)("div",{className:ie.expandButton,title:(0,l.T)({id:"theme.docs.sidebar.expandButtonTitle",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),"aria-label":(0,l.T)({id:"theme.docs.sidebar.expandButtonAriaLabel",message:"Expand sidebar",description:"The ARIA label and title attribute for expand button of doc sidebar"}),tabIndex:0,role:"button",onKeyDown:e,onClick:e,children:(0,h.jsx)(v,{className:ie.expandButtonIcon})})}const re={docSidebarContainer:"docSidebarContainer_LiYE",docSidebarContainerHidden:"docSidebarContainerHidden_FBNp",sidebarViewport:"sidebarViewport_yu1D"};function ce({children:e}){const t=(0,c.t)();return(0,h.jsx)(a.Fragment,{children:e},t?.name??"noSidebar")}function le({sidebar:e,hiddenSidebarContainer:t,setHiddenSidebarContainer:n}){const{pathname:i}=(0,x.zy)(),[r,c]=(0,a.useState)(!1),l=(0,a.useCallback)(()=>{r&&c(!1),!r&&(0,p.O)()&&c(!0),n(e=>!e)},[n,r]);return(0,h.jsx)("aside",{className:(0,o.A)(s.G.docs.docSidebarContainer,re.docSidebarContainer,t&&re.docSidebarContainerHidden),onTransitionEnd:e=>{e.currentTarget.classList.contains(re.docSidebarContainer)&&t&&c(!0)},children:(0,h.jsx)(ce,{children:(0,h.jsxs)("div",{className:(0,o.A)(re.sidebarViewport,r&&re.sidebarViewportHidden),children:[(0,h.jsx)(oe,{sidebar:e,path:i,onCollapse:l,isHidden:r}),r&&(0,h.jsx)(se,{toggleSidebar:l})]})})})}const de={docMainContainer:"docMainContainer_hwfy",docMainContainerEnhanced:"docMainContainerEnhanced_Aqm8",docItemWrapperEnhanced:"docItemWrapperEnhanced_MOcI"};function ue({hiddenSidebarContainer:e,children:t}){const n=(0,c.t)();return(0,h.jsx)("main",{className:(0,o.A)(de.docMainContainer,(e||!n)&&de.docMainContainerEnhanced),children:(0,h.jsx)("div",{className:(0,o.A)("container padding-top--md padding-bottom--lg",de.docItemWrapper,e&&de.docItemWrapperEnhanced),children:t})})}const me={docRoot:"docRoot_Y0MQ",docsWrapper:"docsWrapper_O5Uu"};function he({children:e}){const t=(0,c.t)(),[n,o]=(0,a.useState)(!1);return(0,h.jsxs)("div",{className:me.docsWrapper,children:[(0,h.jsx)(b,{}),(0,h.jsxs)("div",{className:me.docRoot,children:[t&&(0,h.jsx)(le,{sidebar:t.items,hiddenSidebarContainer:n,setHiddenSidebarContainer:o}),(0,h.jsx)(ue,{hiddenSidebarContainer:n,children:e})]})]})}var be=n(86417);function pe(e){const t=(0,r.B5)(e);if(!t)return(0,h.jsx)(be.A,{});const{docElement:n,sidebarName:a,sidebarItems:l}=t;return(0,h.jsx)(i.e3,{className:(0,o.A)(s.G.page.docsDocPage),children:(0,h.jsx)(c.V,{name:a,items:l,children:(0,h.jsx)(he,{children:n})})})}},86417:(e,t,n)=>{n.d(t,{A:()=>r});n(36672);var a=n(13526),o=n(53499),i=n(33555),s=n(23420);function r({className:e}){return(0,s.jsx)("main",{className:(0,a.A)("container margin-vert--xl",e),children:(0,s.jsx)("div",{className:"row",children:(0,s.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,s.jsx)(i.A,{as:"h1",className:"hero__title",children:(0,s.jsx)(o.A,{id:"theme.NotFound.title",description:"The title of the 404 page",children:"Page Not Found"})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p1",description:"The first paragraph of the 404 page",children:"We could not find what you were looking for."})}),(0,s.jsx)("p",{children:(0,s.jsx)(o.A,{id:"theme.NotFound.p2",description:"The 2nd paragraph of the 404 page",children:"Please contact the owner of the site that linked you to the original URL and let them know their link is broken."})})]})})})}}}]); \ No newline at end of file diff --git a/assets/js/aad83134.e45bf932.js b/assets/js/aad83134.e45bf932.js new file mode 100644 index 0000000000..af08495ab0 --- /dev/null +++ b/assets/js/aad83134.e45bf932.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6644],{65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}},91584:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.12.3/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/0.12.3/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/ci_workflow.md","tags":[],"version":"0.12.3","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.3/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_dependency"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheckAuto):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew moduleCheckAuto --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/aba21aa0.98fa788f.js b/assets/js/aba21aa0.98fa788f.js new file mode 100644 index 0000000000..41e1c0edf5 --- /dev/null +++ b/assets/js/aba21aa0.98fa788f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5742],{27093:e=>{e.exports=JSON.parse('{"name":"docusaurus-plugin-content-docs","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/abdba85e.26e5806f.js b/assets/js/abdba85e.26e5806f.js new file mode 100644 index 0000000000..934a29e068 --- /dev/null +++ b/assets/js/abdba85e.26e5806f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9961],{65404:(e,n,d)=>{d.d(n,{R:()=>i,x:()=>s});var t=d(36672);const o={},c=t.createContext(o);function i(e){const n=t.useContext(c);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(c.Provider,{value:n},e.children)}},82212:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>s,default:()=>a,frontMatter:()=>i,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.11.0/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.11.0/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/inherited_dependency.md","tags":[],"version":"0.11.0","frontMatter":{"id":"inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.0/rules/must_be_api"},"next":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory"}}');var o=d(23420),c=d(65404);const i={id:"inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},s=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,c.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleB"}),", and ",(0,o.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,o.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,o.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,o.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,o.jsx)(n.code,{children:":moduleA"})," -> ",(0,o.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/ac2458d6.80ddf71a.js b/assets/js/ac2458d6.80ddf71a.js new file mode 100644 index 0000000000..affdd073e2 --- /dev/null +++ b/assets/js/ac2458d6.80ddf71a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[80],{16538:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.11.1/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_plugins","permalink":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/sorting/sort_plugins.md","tags":[],"version":"0.11.1","frontMatter":{"id":"sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.1/rules/android/disable_resources"}}');var o=t(23420),r=t(65404);const i={id:"sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const o={},r=n.createContext(o);function i(e){const s=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b00e7a90.a49b6a39.js b/assets/js/b00e7a90.a49b6a39.js new file mode 100644 index 0000000000..c6bd786a14 --- /dev/null +++ b/assets/js/b00e7a90.a49b6a39.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[463],{65404:(e,n,s)=>{s.d(n,{R:()=>u,x:()=>r});var t=s(36672);const d={},o=t.createContext(d);function u(e){const n=t.useContext(o);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:u(e.components),t.createElement(o.Provider,{value:n},e.children)}},74269:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>r,default:()=>a,frontMatter:()=>u,metadata:()=>t,toc:()=>i});const t=JSON.parse('{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.11.2/rules/unused.md","sourceDirName":"rules","slug":"/rules/unused","permalink":"/ModuleCheck/docs/0.11.2/rules/unused","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/unused.md","tags":[],"version":"0.11.2","frontMatter":{"id":"unused","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.11.2/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.2/rules/must_be_api"}}');var d=s(23420),o=s(65404);const u={id:"unused",title:"Unused Dependency",sidebar_label:"Unused Dependency"},r=void 0,c={},i=[];function l(e){const n={p:"p",...(0,o.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,d.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/b1002bca.79ed64df.js b/assets/js/b1002bca.79ed64df.js new file mode 100644 index 0000000000..c1a8224b00 --- /dev/null +++ b/assets/js/b1002bca.79ed64df.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9152],{7357:(e,n,r)=>{r.d(n,{A:()=>s});r(36672);var a=r(13526);const l={tabItem:"tabItem_qogc"};var t=r(23420);function s({children:e,hidden:n,className:r}){return(0,t.jsx)("div",{role:"tabpanel",className:(0,a.A)(l.tabItem,r),hidden:n,children:e})}},26626:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","source":"@site/versioned_docs/version-0.11.3/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.11.3/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/quickstart.mdx","tags":[],"version":"0.11.3","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.3/configuration"}}');var l=r(23420),t=r(65404),s=r(83796),o=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},u=void 0,c={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.admonition,{type:"note",children:(0,l.jsx)(n.p,{children:"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin."})}),"\n",(0,l.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:"// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.11.2"\n}\n'})})]}),(0,l.jsxs)(o.A,{value:"Groovy",children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.11.2'\n}\n"})})]})]}),"\n",(0,l.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,l.jsx)(n.p,{children:"all checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,l.jsx)(n.p,{children:"kapt checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckKapt\n"})}),"\n",(0,l.jsx)(n.p,{children:"sorts"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,l.jsx)(n.p,{children:"unused"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gardlew moduleCheckUnused\n"})}),"\n",(0,l.jsx)(n.p,{children:"redundant"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckRedundant\n"})}),"\n",(0,l.jsx)(n.p,{children:"overshot"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckOvershot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,l.jsxs)(n.p,{children:["See ",(0,l.jsx)(n.a,{href:"/ModuleCheck/docs/0.11.3/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,l.jsx)(n.p,{children:"--or--"}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,l.jsx)(o.A,{value:"Groovy",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var a=r(36672);const l={},t=a.createContext(l);function s(e){const n=a.useContext(t);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(t.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>w});var a=r(36672),l=r(13526),t=r(58797),s=r(85291),o=r(52245),i=r(32342),u=r(45223),c=r(1771);function d(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:a}})=>({value:e,label:n,attributes:r,default:a}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),l=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(l),(0,a.useCallback)(e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})},[l,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:l}=e,t=h(e),[s,i]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t})),[u,d]=g({queryString:r,groupId:l}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,l]=(0,c.Dv)(n);return[r,(0,a.useCallback)(e=>{n&&l.set(e)},[n,l])]}({groupId:l}),v=(()=>{const e=u??m;return p({value:e,tabValues:t})?e:null})();(0,o.A)(()=>{v&&i(v)},[v]);return{selectedValue:s,selectValue:(0,a.useCallback)(e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)},[d,f,t]),tabValues:t}}var f=r(64407);const v={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var b=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:a,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,t.a_)(),u=e=>{const n=e.currentTarget,l=o.indexOf(n),t=s[l].value;t!==r&&(i(n),a(t))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,b.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...a,className:(0,l.A)("tabs__item",v.tabItem,a?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const t=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=t.find(e=>e.props.value===r);return e?(0,a.cloneElement)(e,{className:(0,l.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:t.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,b.jsxs)("div",{className:(0,l.A)("tabs-container",v.tabList),children:[(0,b.jsx)(x,{...n,...e}),(0,b.jsx)(k,{...n,...e})]})}function w(e){const n=(0,f.A)();return(0,b.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/b1c76d35.8ff8d553.js b/assets/js/b1c76d35.8ff8d553.js new file mode 100644 index 0000000000..44fb8e6276 --- /dev/null +++ b/assets/js/b1c76d35.8ff8d553.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5264],{23049:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.12.2/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sort_plugins","permalink":"/ModuleCheck/docs/0.12.2/rules/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/sorting/sort_plugins.md","tags":[],"version":"0.12.2","frontMatter":{"id":"sort_plugins","slug":"/rules/sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.2/rules/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.2/rules/disable_android_resources"}}');var r=t(23420),o=t(65404);const i={id:"sort_plugins",slug:"/rules/sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const r={},o=n.createContext(r);function i(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b20814c1.bdea7f12.js b/assets/js/b20814c1.bdea7f12.js new file mode 100644 index 0000000000..d41a0ad5f4 --- /dev/null +++ b/assets/js/b20814c1.bdea7f12.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[704],{43569:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.11.3","label":"0.11.3","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.11.3","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.11.3/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.11.3/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/0.11.3/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/0.11.3/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.11.3/rules/unused","docId":"rules/unused","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.11.3/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.11.3/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"category","label":"compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory","href":"/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory","docId":"rules/compiler/could_use_anvil_factory","unlisted":false}],"collapsible":true},{"type":"category","label":"Kapt","collapsed":false,"items":[{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor","docId":"rules/kapt/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin","docId":"rules/kapt/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers","docId":"rules/kapt/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.11.3/rules/android/disable_resources","docId":"rules/android/disable_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.11.3/rules/android/disable_viewbinding","docId":"rules/android/disable_viewbinding","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","sidebar":"Docs"},"rules/android/disable_resources":{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_viewbinding":{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/compiler/could_use_anvil_factory":{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/kapt/custom_kapt_matchers":{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/kapt/unused_kapt_plugin":{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","sidebar":"Docs"},"rules/kapt/unused_kapt_processor":{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused":{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/b28afb00.b441d887.js b/assets/js/b28afb00.b441d887.js new file mode 100644 index 0000000000..57f03a5551 --- /dev/null +++ b/assets/js/b28afb00.b441d887.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4590],{12773:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","source":"@site/versioned_docs/version-0.12.3/rules/redundant_dependency.md","sourceDirName":"rules","slug":"/rules/redundant_dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/redundant_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/redundant_dependency.md","tags":[],"version":"0.12.3","frontMatter":{"id":"redundant_dependency","slug":"/rules/redundant_dependency","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/inherited_dependency"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/overshot_dependency"}}');var i=d(23420),s=d(65404);const r={id:"redundant_dependency",slug:"/rules/redundant_dependency",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},a=void 0,l={},c=[];function o(e){const n={a:"a",admonition:"admonition",code:"code",mermaid:"mermaid",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.p,{children:"This rule creates a brittle dependency graph, because some necessary dependencies are only provided\ntransitively by other dependencies. Any manual changes to dependencies can have unexpected\nconsequences downstream."}),(0,i.jsxs)(n.p,{children:["This rule is ",(0,i.jsx)(n.strong,{children:"not recommended"})," and disabled by default, but it's still available for those who\nwant to keep their build files as small as possible."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finds project dependencies which are declared as ",(0,i.jsx)(n.code,{children:"api"})," in other dependency projects, but also\ndeclared in the current project. These dependencies can be removed without actually breaking the\nbuild, since they're still provided by an upstream dependency through the ",(0,i.jsx)(n.code,{children:"api"})," configuration."]}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n subgraph sg_redundant [A redundant graph]\n direction TB\n\n lib1_redundant(:lib-1):::depth0\n lib2_redundant(:lib-2):::depth1\n app_redundant(:app):::depth2\n\n app_redundant --\x3e |api| lib1_redundant\n app_redundant --\x3e |api| lib2_redundant\n\n lib2_redundant --\x3e |api| lib1_redundant\n end\n\n subgraph sg_minimalist [A graph with no redundancy]\n direction TB\n\n lib1_minimalist(:lib-1):::depth0\n lib2_minimalist(:lib-2):::depth1\n app_minimalist(:app):::depth2\n\n app_minimalist --\x3e |api| lib2_minimalist\n\n lib2_minimalist --\x3e |api| lib1_minimalist\n end\n\n style sg_redundant fill:#C66,stroke:#000,color:#FFF\n style sg_minimalist fill:#696,stroke:#000,color:#FFF\n\n sg_redundant --\x3e |./gradlew moduleCheck| sg_minimalist\n"}),"\n",(0,i.jsxs)(n.p,{children:["This is the opposite of the ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.3/rules/inherited_dependency",children:"inherited dependency"})," rule, which ensures a stable graph by explicitly\ndeclaring each dependency. ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.3/rules/inherited_dependency",children:"Inherited dependency"})," is enabled by default, and is the recommended\napproach. Both rules may not be enabled at the same time."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>r,x:()=>a});var t=d(36672);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b35da6ab.ea19e28b.js b/assets/js/b35da6ab.ea19e28b.js new file mode 100644 index 0000000000..e9d48ee149 --- /dev/null +++ b/assets/js/b35da6ab.ea19e28b.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6601],{7357:(e,n,r)=>{r.d(n,{A:()=>l});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var s=r(23420);function l({children:e,hidden:n,className:r}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},20954:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>i,default:()=>p,frontMatter:()=>c,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"Dependencies","source":"@site/versioned_docs/version-0.12.4/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.12.4/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/quickstart.mdx","tags":[],"version":"0.12.4","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.4/configuration"}}');var a=r(23420),s=r(65404),l=r(83796),o=r(7357);const c={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},i=void 0,u={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven("https://oss.sonatype.org/content/repositories/snapshots/")\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.12.4"\n}\n'})})]}),(0,a.jsxs)(o.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven {\n url "https://oss.sonatype.org/content/repositories/snapshots"\n }\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.12.4'\n}\n"})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,a.jsx)(n.p,{children:"all checks"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,a.jsx)(n.p,{children:"all checks with auto-correct"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"check sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,a.jsx)(n.p,{children:"apply sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"report depths of each module"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckDepths\n"})}),"\n",(0,a.jsx)(n.p,{children:"generate (module-only) dependency graphs"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckGraphs\n"})}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.4/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(l.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>l,x:()=>o});var t=r(36672);const a={},s=t.createContext(a);function l(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:l(e.components),t.createElement(s.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(36672),a=r(13526),s=r(58797),l=r(85291),o=r(52245),c=r(32342),i=r(45223),u=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,i.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,l.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,c.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,s=h(e),[l,c]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:s})),[i,d]=g({queryString:r,groupId:a}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{b&&c(b)},[b]);return{selectedValue:l,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);c(e),d(e),f(e)},[d,f,s]),tabValues:s}}var f=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:t,tabValues:l}){const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,s.a_)(),i=e=>{const n=e.currentTarget,a=o.indexOf(n),s=l[a].value;s!==r&&(c(n),t(s))},u=e=>{let n=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:l.map(({value:e,label:n,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:u,onClick:i,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/b3a16c5b.d3c71a1c.js b/assets/js/b3a16c5b.d3c71a1c.js new file mode 100644 index 0000000000..8926c356bd --- /dev/null +++ b/assets/js/b3a16c5b.d3c71a1c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2520],{38196:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>l,contentTitle:()=>d,default:()=>c,frontMatter:()=>t,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"","source":"@site/versioned_docs/version-0.10.0/rules/android/disable_resources.md","sourceDirName":"rules/android","slug":"/rules/android/disable_resources","permalink":"/ModuleCheck/docs/0.10.0/rules/android/disable_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/android/disable_resources.md","tags":[],"version":"0.10.0","frontMatter":{"id":"disable_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Rules","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.10.0/rules/android/disable_viewbinding"}}');var n=r(23420),i=r(65404);const t={id:"disable_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},d=void 0,l={},u=[];function a(e){return(0,n.jsx)(n.Fragment,{})}function c(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,n.jsx)(s,{...e,children:(0,n.jsx)(a,{...e})}):a()}},65404:(e,s,r)=>{r.d(s,{R:()=>t,x:()=>d});var o=r(36672);const n={},i=o.createContext(n);function t(e){const s=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function d(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:t(e.components),o.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/b7c223ee.81ebafcd.js b/assets/js/b7c223ee.81ebafcd.js new file mode 100644 index 0000000000..4a51dec68c --- /dev/null +++ b/assets/js/b7c223ee.81ebafcd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6678],{65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}},80766:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.12.2/rules/android/disable_android_resources.md","sourceDirName":"rules/android","slug":"/rules/disable_android_resources","permalink":"/ModuleCheck/docs/0.12.2/rules/disable_android_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/android/disable_android_resources.md","tags":[],"version":"0.12.2","frontMatter":{"id":"disable_android_resources","slug":"/rules/disable_android_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.2/rules/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.2/rules/disable_view_binding"}}');var o=r(23420),d=r(65404);const i={id:"disable_android_resources",slug:"/rules/disable_android_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,a={},c=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/ba3d50d9.6fdc1a92.js b/assets/js/ba3d50d9.6fdc1a92.js new file mode 100644 index 0000000000..b4cd37678d --- /dev/null +++ b/assets/js/ba3d50d9.6fdc1a92.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8463],{25708:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.11.0/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_plugins","permalink":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/sorting/sort_plugins.md","tags":[],"version":"0.11.0","frontMatter":{"id":"sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.0/rules/android/disable_resources"}}');var o=t(23420),r=t(65404);const i={id:"sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const o={},r=n.createContext(o);function i(e){const s=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/bc73dc9d.2ff94511.js b/assets/js/bc73dc9d.2ff94511.js new file mode 100644 index 0000000000..d0452c351a --- /dev/null +++ b/assets/js/bc73dc9d.2ff94511.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1895],{7357:(e,n,r)=>{r.d(n,{A:()=>s});r(36672);var a=r(13526);const l={tabItem:"tabItem_qogc"};var t=r(23420);function s({children:e,hidden:n,className:r}){return(0,t.jsx)("div",{role:"tabpanel",className:(0,a.A)(l.tabItem,r),hidden:n,children:e})}},65404:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var a=r(36672);const l={},t=a.createContext(l);function s(e){const n=a.useContext(t);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(t.Provider,{value:n},e.children)}},74509:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","source":"@site/versioned_docs/version-0.11.1/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.11.1/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/quickstart.mdx","tags":[],"version":"0.11.1","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.1/configuration"}}');var l=r(23420),t=r(65404),s=r(83796),o=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},u=void 0,c={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.admonition,{type:"note",children:(0,l.jsx)(n.p,{children:"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin."})}),"\n",(0,l.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:"// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.11.0"\n}\n'})})]}),(0,l.jsxs)(o.A,{value:"Groovy",children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.11.0'\n}\n"})})]})]}),"\n",(0,l.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,l.jsx)(n.p,{children:"all checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,l.jsx)(n.p,{children:"kapt checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckKapt\n"})}),"\n",(0,l.jsx)(n.p,{children:"sorts"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,l.jsx)(n.p,{children:"unused"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gardlew moduleCheckUnused\n"})}),"\n",(0,l.jsx)(n.p,{children:"redundant"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckRedundant\n"})}),"\n",(0,l.jsx)(n.p,{children:"overshot"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckOvershot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,l.jsxs)(n.p,{children:["See ",(0,l.jsx)(n.a,{href:"/ModuleCheck/docs/0.11.1/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nconfigure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,l.jsx)(n.p,{children:"--or--"}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,l.jsx)(o.A,{value:"Groovy",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:'// top-level build.gradle\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},83796:(e,n,r)=>{r.d(n,{A:()=>w});var a=r(36672),l=r(13526),t=r(58797),s=r(85291),o=r(52245),i=r(32342),u=r(45223),c=r(1771);function d(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:a}})=>({value:e,label:n,attributes:r,default:a}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),l=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(l),(0,a.useCallback)(e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})},[l,r])]}function f(e){const{defaultValue:n,queryString:r=!1,groupId:l}=e,t=h(e),[s,i]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t})),[u,d]=g({queryString:r,groupId:l}),[f,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,l]=(0,c.Dv)(n);return[r,(0,a.useCallback)(e=>{n&&l.set(e)},[n,l])]}({groupId:l}),v=(()=>{const e=u??f;return p({value:e,tabValues:t})?e:null})();(0,o.A)(()=>{v&&i(v)},[v]);return{selectedValue:s,selectValue:(0,a.useCallback)(e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),m(e)},[d,m,t]),tabValues:t}}var m=r(64407);const v={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var b=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:a,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,t.a_)(),u=e=>{const n=e.currentTarget,l=o.indexOf(n),t=s[l].value;t!==r&&(i(n),a(t))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,b.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...a,className:(0,l.A)("tabs__item",v.tabItem,a?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const t=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=t.find(e=>e.props.value===r);return e?(0,a.cloneElement)(e,{className:(0,l.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:t.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=f(e);return(0,b.jsxs)("div",{className:(0,l.A)("tabs-container",v.tabList),children:[(0,b.jsx)(x,{...n,...e}),(0,b.jsx)(k,{...n,...e})]})}function w(e){const n=(0,m.A)();return(0,b.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/bc7e3c4b.a8fbf2c4.js b/assets/js/bc7e3c4b.a8fbf2c4.js new file mode 100644 index 0000000000..154d83faae --- /dev/null +++ b/assets/js/bc7e3c4b.a8fbf2c4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[362],{65404:(e,n,d)=>{d.d(n,{R:()=>i,x:()=>s});var t=d(36672);const o={},c=t.createContext(o);function i(e){const n=t.useContext(c);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function s(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),t.createElement(c.Provider,{value:n},e.children)}},86257:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>s,default:()=>a,frontMatter:()=>i,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.11.1/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.11.1/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/inherited_dependency.md","tags":[],"version":"0.11.1","frontMatter":{"id":"inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.11.1/rules/must_be_api"},"next":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory"}}');var o=d(23420),c=d(65404);const i={id:"inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},s=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,c.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(n.p,{children:["Assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleB"}),", and ",(0,o.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,o.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,o.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,o.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,o.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,o.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,o.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,o.jsx)(n.code,{children:":moduleA"})," -> ",(0,o.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,c.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/bd7e05cf.d916accd.js b/assets/js/bd7e05cf.d916accd.js new file mode 100644 index 0000000000..4aba9836cb --- /dev/null +++ b/assets/js/bd7e05cf.d916accd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7187],{30738:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>s,toc:()=>u});const s=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.11.2/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_dependencies","permalink":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/sorting/sort_dependencies.md","tags":[],"version":"0.11.2","frontMatter":{"id":"sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins"}}');var o=n(23420),r=n(65404);const i={id:"sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l()}},65404:(e,t,n)=>{n.d(t,{R:()=>i,x:()=>c});var s=n(36672);const o={},r=s.createContext(o);function i(e){const t=s.useContext(r);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),s.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/be81e05d.7a86ef3f.js b/assets/js/be81e05d.7a86ef3f.js new file mode 100644 index 0000000000..f197912522 --- /dev/null +++ b/assets/js/be81e05d.7a86ef3f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1917],{39033:(e,i,n)=>{n.r(i),n.d(i,{assets:()=>a,contentTitle:()=>o,default:()=>u,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"","source":"@site/versioned_docs/version-0.10.0/rules/android/disable_viewbinding.md","sourceDirName":"rules/android","slug":"/rules/android/disable_viewbinding","permalink":"/ModuleCheck/docs/0.10.0/rules/android/disable_viewbinding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/android/disable_viewbinding.md","tags":[],"version":"0.10.0","frontMatter":{"id":"disable_viewbinding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Rules","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.10.0/rules/android/disable_resources"}}');var t=n(23420),d=n(65404);const r={id:"disable_viewbinding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},o=void 0,a={},l=[];function c(e){return(0,t.jsx)(t.Fragment,{})}function u(e={}){const{wrapper:i}={...(0,d.R)(),...e.components};return i?(0,t.jsx)(i,{...e,children:(0,t.jsx)(c,{...e})}):c()}},65404:(e,i,n)=>{n.d(i,{R:()=>r,x:()=>o});var s=n(36672);const t={},d=s.createContext(t);function r(e){const i=s.useContext(d);return s.useMemo(function(){return"function"==typeof e?e(i):{...i,...e}},[i,e])}function o(e){let i;return i=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),s.createElement(d.Provider,{value:i},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c0050a27.1fdf8fd2.js b/assets/js/c0050a27.1fdf8fd2.js new file mode 100644 index 0000000000..32fca6ef02 --- /dev/null +++ b/assets/js/c0050a27.1fdf8fd2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6087],{60862:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.12.1","label":"0.12.1","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.12.1","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.12.1/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.12.1/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/0.12.1/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/0.12.1/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.12.1/rules/unused_dependency","docId":"rules/unused_dependency","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.12.1/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.12.1/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/0.12.1/rules/redundant_dependency","docId":"rules/redundant_dependency","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/0.12.1/rules/overshot_dependency","docId":"rules/overshot_dependency","unlisted":false},{"type":"link","label":"Project Depth","href":"/ModuleCheck/docs/0.12.1/rules/project_depth","docId":"rules/project_depth","unlisted":false},{"type":"category","label":"Compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory Generation","href":"/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation","docId":"rules/compiler/use_anvil_factory_generation","unlisted":false},{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor","docId":"rules/compiler/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin","docId":"rules/compiler/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers","docId":"rules/compiler/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.12.1/rules/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.12.1/rules/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.12.1/rules/disable_android_resources","docId":"rules/android/disable_android_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.12.1/rules/disable_view_binding","docId":"rules/android/disable_view_binding","unlisted":false},{"type":"link","label":"Unused Kotlin Android Extensions","href":"/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensions","docId":"rules/android/unused_kotlin_android_extensions","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"Dependencies","sidebar":"Docs"},"rules/android/disable_android_resources":{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_view_binding":{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/android/unused_kotlin_android_extensions":{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","sidebar":"Docs"},"rules/compiler/custom_kapt_matchers":{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/compiler/unused_kapt_plugin":{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","sidebar":"Docs"},"rules/compiler/unused_kapt_processor":{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/compiler/use_anvil_factory_generation":{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/overshot_dependency":{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","sidebar":"Docs"},"rules/project_depth":{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","sidebar":"Docs"},"rules/redundant_dependency":{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused_dependency":{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/c07a004a.065ecca1.js b/assets/js/c07a004a.065ecca1.js new file mode 100644 index 0000000000..f82e2f70e9 --- /dev/null +++ b/assets/js/c07a004a.065ecca1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4687],{7357:(e,n,r)=>{r.d(n,{A:()=>s});r(36672);var a=r(13526);const l={tabItem:"tabItem_qogc"};var t=r(23420);function s({children:e,hidden:n,className:r}){return(0,t.jsx)("div",{role:"tabpanel",className:(0,a.A)(l.tabItem,r),hidden:n,children:e})}},51456:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>p,frontMatter:()=>i,metadata:()=>a,toc:()=>d});const a=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","source":"@site/versioned_docs/version-0.11.0/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.11.0/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/quickstart.mdx","tags":[],"version":"0.11.0","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.0/configuration"}}');var l=r(23420),t=r(65404),s=r(83796),o=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},u=void 0,c={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",admonition:"admonition",code:"code",h2:"h2",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(n.admonition,{type:"note",children:(0,l.jsx)(n.p,{children:"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin."})}),"\n",(0,l.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:"// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.11.0"\n}\n'})})]}),(0,l.jsxs)(o.A,{value:"Groovy",children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n }\n}\n"})}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.11.0'\n}\n"})})]})]}),"\n",(0,l.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,l.jsx)(n.p,{children:"all checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,l.jsx)(n.p,{children:"kapt checks"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckKapt\n"})}),"\n",(0,l.jsx)(n.p,{children:"sorts"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,l.jsx)(n.p,{children:"unused"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gardlew moduleCheckUnused\n"})}),"\n",(0,l.jsx)(n.p,{children:"redundant"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckRedundant\n"})}),"\n",(0,l.jsx)(n.p,{children:"overshot"}),"\n",(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckOvershot\n"})}),"\n",(0,l.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,l.jsxs)(n.p,{children:["See ",(0,l.jsx)(n.a,{href:"/ModuleCheck/docs/0.11.0/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,l.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,l.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nconfigure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,l.jsx)(n.p,{children:"--or--"}),(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,l.jsx)(o.A,{value:"Groovy",children:(0,l.jsx)(n.pre,{children:(0,l.jsx)(n.code,{className:"language-groovy",children:'// top-level build.gradle\n\nmoduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,l.jsx)(n,{...e,children:(0,l.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var a=r(36672);const l={},t=a.createContext(l);function s(e){const n=a.useContext(t);return a.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(l):e.components||l:s(e.components),a.createElement(t.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>w});var a=r(36672),l=r(13526),t=r(58797),s=r(85291),o=r(52245),i=r(32342),u=r(45223),c=r(1771);function d(e){return a.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,a.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,a.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:a}})=>({value:e,label:n,attributes:r,default:a}))}(r);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),l=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(l),(0,a.useCallback)(e=>{if(!l)return;const n=new URLSearchParams(r.location.search);n.set(l,e),r.replace({...r.location,search:n.toString()})},[l,r])]}function f(e){const{defaultValue:n,queryString:r=!1,groupId:l}=e,t=h(e),[s,i]=(0,a.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:t})),[u,d]=g({queryString:r,groupId:l}),[f,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,l]=(0,c.Dv)(n);return[r,(0,a.useCallback)(e=>{n&&l.set(e)},[n,l])]}({groupId:l}),v=(()=>{const e=u??f;return p({value:e,tabValues:t})?e:null})();(0,o.A)(()=>{v&&i(v)},[v]);return{selectedValue:s,selectValue:(0,a.useCallback)(e=>{if(!p({value:e,tabValues:t}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),m(e)},[d,m,t]),tabValues:t}}var m=r(64407);const v={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var b=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:a,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,t.a_)(),u=e=>{const n=e.currentTarget,l=o.indexOf(n),t=s[l].value;t!==r&&(i(n),a(t))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,b.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,l.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:a})=>(0,b.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...a,className:(0,l.A)("tabs__item",v.tabItem,a?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const t=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=t.find(e=>e.props.value===r);return e?(0,a.cloneElement)(e,{className:(0,l.A)("margin-top--md",e.props.className)}):null}return(0,b.jsx)("div",{className:"margin-top--md",children:t.map((e,n)=>(0,a.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=f(e);return(0,b.jsxs)("div",{className:(0,l.A)("tabs-container",v.tabList),children:[(0,b.jsx)(x,{...n,...e}),(0,b.jsx)(k,{...n,...e})]})}function w(e){const n=(0,m.A)();return(0,b.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/c10c208b.a6ca7316.js b/assets/js/c10c208b.a6ca7316.js new file mode 100644 index 0000000000..48ce40e1a3 --- /dev/null +++ b/assets/js/c10c208b.a6ca7316.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2132],{65404:(e,n,s)=>{s.d(n,{R:()=>r,x:()=>a});var o=s(36672);const t={},i=o.createContext(t);function r(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:r(e.components),o.createElement(i.Provider,{value:n},e.children)}},98428:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>d,contentTitle:()=>a,default:()=>u,frontMatter:()=>r,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.11.3/rules/kapt/unused_kapt_processor.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/kapt/unused_kapt_processor.md","tags":[],"version":"0.11.3","frontMatter":{"id":"unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory","permalink":"/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin"}}');var t=s(23420),i=s(65404);const r={id:"unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,d={},c=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/c141421f.484a90c2.js b/assets/js/c141421f.484a90c2.js new file mode 100644 index 0000000000..1e0639575e --- /dev/null +++ b/assets/js/c141421f.484a90c2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[957],{40936:e=>{e.exports=JSON.parse('{"name":"docusaurus-theme-search-algolia","id":"default"}')}}]); \ No newline at end of file diff --git a/assets/js/c1600862.f5c16495.js b/assets/js/c1600862.f5c16495.js new file mode 100644 index 0000000000..2a262835ea --- /dev/null +++ b/assets/js/c1600862.f5c16495.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3641],{2501:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","source":"@site/docs/rules/redundant_dependency.md","sourceDirName":"rules","slug":"/rules/redundant_dependency","permalink":"/ModuleCheck/docs/next/rules/redundant_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/redundant_dependency.md","tags":[],"version":"current","frontMatter":{"id":"redundant_dependency","slug":"/rules/redundant_dependency","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/next/rules/inherited_dependency"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/next/rules/overshot_dependency"}}');var i=d(23420),r=d(65404);const s={id:"redundant_dependency",slug:"/rules/redundant_dependency",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},a=void 0,l={},c=[];function o(e){const n={a:"a",admonition:"admonition",code:"code",mermaid:"mermaid",p:"p",strong:"strong",...(0,r.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.p,{children:"This rule creates a brittle dependency graph, because some necessary dependencies are only provided\ntransitively by other dependencies. Any manual changes to dependencies can have unexpected\nconsequences downstream."}),(0,i.jsxs)(n.p,{children:["This rule is ",(0,i.jsx)(n.strong,{children:"not recommended"})," and disabled by default, but it's still available for those who\nwant to keep their build files as small as possible."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finds project dependencies which are declared as ",(0,i.jsx)(n.code,{children:"api"})," in other dependency projects, but also\ndeclared in the current project. These dependencies can be removed without actually breaking the\nbuild, since they're still provided by an upstream dependency through the ",(0,i.jsx)(n.code,{children:"api"})," configuration."]}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n subgraph sg_redundant [A redundant graph]\n direction TB\n\n lib1_redundant(:lib-1):::depth0\n lib2_redundant(:lib-2):::depth1\n app_redundant(:app):::depth2\n\n app_redundant --\x3e |api| lib1_redundant\n app_redundant --\x3e |api| lib2_redundant\n\n lib2_redundant --\x3e |api| lib1_redundant\n end\n\n subgraph sg_minimalist [A graph with no redundancy]\n direction TB\n\n lib1_minimalist(:lib-1):::depth0\n lib2_minimalist(:lib-2):::depth1\n app_minimalist(:app):::depth2\n\n app_minimalist --\x3e |api| lib2_minimalist\n\n lib2_minimalist --\x3e |api| lib1_minimalist\n end\n\n style sg_redundant fill:#C66,stroke:#000,color:#FFF\n style sg_minimalist fill:#696,stroke:#000,color:#FFF\n\n sg_redundant --\x3e |./gradlew moduleCheck| sg_minimalist\n"}),"\n",(0,i.jsxs)(n.p,{children:["This is the opposite of the ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/next/rules/inherited_dependency",children:"inherited dependency"})," rule, which ensures a stable graph by explicitly\ndeclaring each dependency. ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/next/rules/inherited_dependency",children:"Inherited dependency"})," is enabled by default, and is the recommended\napproach. Both rules may not be enabled at the same time."]})]})}function p(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>s,x:()=>a});var t=d(36672);const i={},r=t.createContext(i);function s(e){const n=t.useContext(r);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:s(e.components),t.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c2414a18.a5185bc2.js b/assets/js/c2414a18.a5185bc2.js new file mode 100644 index 0000000000..c9eea80bf5 --- /dev/null +++ b/assets/js/c2414a18.a5185bc2.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8043],{65404:(e,t,s)=>{s.d(t,{R:()=>c,x:()=>a});var o=s(36672);const n={},r=o.createContext(n);function c(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),o.createElement(r.Provider,{value:t},e.children)}},65787:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.12.3/rules/compiler/custom_kapt_matchers.md","sourceDirName":"rules/compiler","slug":"/rules/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/compiler/custom_kapt_matchers.md","tags":[],"version":"0.12.3","frontMatter":{"id":"custom_kapt_matchers","slug":"/rules/custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.3/rules/sort_dependencies"}}');var n=s(23420),r=s(65404);const c={id:"custom_kapt_matchers",slug:"/rules/custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},a=void 0,i={},l=[];function u(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,n.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/c4025719.ae817c79.js b/assets/js/c4025719.ae817c79.js new file mode 100644 index 0000000000..b613b51a5e --- /dev/null +++ b/assets/js/c4025719.ae817c79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2406],{65404:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>r});var o=s(36672);const t={},i=o.createContext(t);function d(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(i.Provider,{value:n},e.children)}},90773:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>d,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","source":"@site/versioned_docs/version-0.12.4/rules/android/unused_kotlin_android_extensions.md","sourceDirName":"rules/android","slug":"/rules/unused_kotlin_android_extensions","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/android/unused_kotlin_android_extensions.md","tags":[],"version":"0.12.4","frontMatter":{"id":"unused_kotlin_android_extensions","slug":"/rules/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","sidebar_label":"Unused Kotlin Android Extensions"},"sidebar":"Docs","previous":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.4/rules/disable_view_binding"}}');var t=s(23420),i=s(65404);const d={id:"unused_kotlin_android_extensions",slug:"/rules/unused_kotlin_android_extensions",title:"Unused Kotlin Android Extensions",sidebar_label:"Unused Kotlin Android Extensions"},r=void 0,u={},l=[];function a(e){const n={p:"p",...(0,i.R)(),...e.components};return(0,t.jsx)(n.p,{children:"Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any\nsynthetic imports or deprecated @Parcelize annotation"})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/c4b5a5df.f6e20324.js b/assets/js/c4b5a5df.f6e20324.js new file mode 100644 index 0000000000..aaacf022f9 --- /dev/null +++ b/assets/js/c4b5a5df.f6e20324.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2581],{42683:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.12.3/rules/android/disable_android_resources.md","sourceDirName":"rules/android","slug":"/rules/disable_android_resources","permalink":"/ModuleCheck/docs/0.12.3/rules/disable_android_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/android/disable_android_resources.md","tags":[],"version":"0.12.3","frontMatter":{"id":"disable_android_resources","slug":"/rules/disable_android_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.3/rules/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.3/rules/disable_view_binding"}}');var o=r(23420),d=r(65404);const i={id:"disable_android_resources",slug:"/rules/disable_android_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,a={},c=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c4f5d8e4.2d0ebcc3.js b/assets/js/c4f5d8e4.2d0ebcc3.js new file mode 100644 index 0000000000..c53e9558ba --- /dev/null +++ b/assets/js/c4f5d8e4.2d0ebcc3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2634],{28292:(e,s,r)=>{r.r(s),r.d(s,{default:()=>j});r(36672);var a=r(13526),c=r(64381),t=r(75150),l=r(56562),i=r(42977);const o="heroBanner_UJJx",n="buttons_pzbO",h="badges_T7Sn",d="features_keug",m="featureImage_yA8i",u="heroSlogan_kIIh",g="gettingStartedButton_mhEX";var p=r(23420);const x=[{title:"Tree shaking",imageUrl:"img/modulecheck_diagram.png",description:(0,p.jsxs)(p.Fragment,{children:["Blah blah blah.",(0,p.jsx)("br",{}),(0,p.jsx)("br",{}),"More text.",(0,p.jsx)("br",{}),(0,p.jsx)("br",{})]})}];function b({imageUrl:e,title:s,description:r}){const a=(0,i.Ay)(e);return(0,p.jsx)("div",{children:a&&(0,p.jsx)("div",{className:"text--center",children:(0,p.jsx)("img",{className:m,src:a,alt:s})})})}const j=function(){const e=(0,l.A)(),{siteConfig:s={}}=e;return(0,p.jsxs)(c.A,{title:`${s.title}`,description:"Fast Gradle dependency graph validation",children:[(0,p.jsx)("header",{className:(0,a.A)("hero hero--primary",o),children:(0,p.jsxs)("div",{className:"container",children:[(0,p.jsxs)("p",{className:(0,a.A)(u),children:[(0,p.jsx)("strong",{children:"ModuleCheck"})," removes unused module dependencies from your gradle project."]}),(0,p.jsxs)("div",{className:n,children:[(0,p.jsx)(t.A,{className:(0,a.A)("button button--outline button--secondary button--lg",g),to:(0,i.Ay)("docs"),children:"Get Started"}),"\xa0\xa0\xa0\xa0\xa0\xa0"]})]})}),(0,p.jsx)("main",{children:(0,p.jsx)("div",{className:h,children:(0,p.jsxs)("div",{className:"container",children:[(0,p.jsx)("a",{href:"https://search.maven.org/search?q=g:com.rickbusarow.modulecheck",children:(0,p.jsx)("img",{src:"https://img.shields.io/maven-central/v/com.rickbusarow.modulecheck/modulecheck-api.svg?label=release&style=for-the-badge&color=aa0055",alt:"version badge"})}),"\xa0",(0,p.jsx)("a",{href:"https://plugins.gradle.org/plugin/com.rickbusarow.module-check",children:(0,p.jsx)("img",{src:"https://img.shields.io/gradle-plugin-portal/v/com.rickbusarow.module-check?style=for-the-badge",alt:"Gradle Plugin Portal"})}),"\xa0",(0,p.jsx)("a",{href:"https://oss.sonatype.org/#nexus-search;quick~com.rickbusarow.modulecheck",children:(0,p.jsx)("img",{src:"https://img.shields.io/nexus/s/com.rickbusarow.modulecheck/modulecheck-api?label=snapshots&server=https%3A%2F%2Foss.sonatype.org&style=for-the-badge",alt:"Snapshot"})}),"\xa0",(0,p.jsx)("a",{href:"https://github.com/rbusarow/ModuleCheck/blob/main/LICENSE",children:(0,p.jsx)("img",{src:"https://img.shields.io/badge/license-apache2.0-blue?style=for-the-badge",alt:"license"})})]})})}),(0,p.jsx)("main",{children:(0,p.jsx)("section",{className:d,children:(0,p.jsx)("div",{className:"container",children:x.map((e,s)=>(0,p.jsx)(b,{...e},s))})})})]})}}}]); \ No newline at end of file diff --git a/assets/js/c5b979b0.ec745dfa.js b/assets/js/c5b979b0.ec745dfa.js new file mode 100644 index 0000000000..7d38a0aed1 --- /dev/null +++ b/assets/js/c5b979b0.ec745dfa.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5734],{14198:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>l,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/docs/rules/compiler/custom_kapt_matchers.md","sourceDirName":"rules/compiler","slug":"/rules/custom_kapt_matchers","permalink":"/ModuleCheck/docs/next/rules/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/compiler/custom_kapt_matchers.md","tags":[],"version":"current","frontMatter":{"id":"custom_kapt_matchers","slug":"/rules/custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/next/rules/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/next/rules/sort_dependencies"}}');var o=s(23420),r=s(65404);const c={id:"custom_kapt_matchers",slug:"/rules/custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},a=void 0,l={},u=[];function i(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,o.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(i,{...e})}):i(e)}},65404:(e,t,s)=>{s.d(t,{R:()=>c,x:()=>a});var n=s(36672);const o={},r=n.createContext(o);function c(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:c(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c5f63adb.a5f2c02f.js b/assets/js/c5f63adb.a5f2c02f.js new file mode 100644 index 0000000000..ed0ef937e3 --- /dev/null +++ b/assets/js/c5f63adb.a5f2c02f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2133],{24772:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>l,frontMatter:()=>i,metadata:()=>o,toc:()=>u});const o=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.11.1/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.11.1/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/configuration.mdx","tags":[],"version":"0.11.1","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.11.1/"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.1/rules/unused"}}');var s=t(23420),r=t(65404);const i={id:"configuration",sidebar_label:"Configuration"},a=void 0,c={},u=[];function d(e){const n={code:"code",pre:"pre",...(0,r.R)(),...e.components};return(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:'plugins {\n id("com.rickbusarow.module-check") version "0.11.0"\n}\n\nmoduleCheck {\n\n autoCorrect = true // default is true\n deleteUnused = true // default is false\n\n checks {\n overshotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedImplementation = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n ignoreAll.set(setOf(":app"))\n\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})}function l(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(d,{...e})}):d(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>a});var o=t(36672);const s={},r=o.createContext(s);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c7222430.7a1609fd.js b/assets/js/c7222430.7a1609fd.js new file mode 100644 index 0000000000..5837b87b78 --- /dev/null +++ b/assets/js/c7222430.7a1609fd.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3361],{49477:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","source":"@site/versioned_docs/version-0.12.2/rules/compiler/unused_kapt_plugin.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/compiler/unused_kapt_plugin.md","tags":[],"version":"0.12.2","frontMatter":{"id":"unused_kapt_plugin","slug":"/rules/unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers"}}');var o=t(23420),u=t(65404);const r={id:"unused_kapt_plugin",slug:"/rules/unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,l={},c=[];function p(e){const n={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(n.p,{children:["If there are no ",(0,o.jsx)(n.code,{children:"kapt"}),"/",(0,o.jsx)(n.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in\napplying the ",(0,o.jsx)(n.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function d(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>i});var s=t(36672);const o={},u=s.createContext(o);function r(e){const n=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c83ce79b.05c17cb8.js b/assets/js/c83ce79b.05c17cb8.js new file mode 100644 index 0000000000..0f5e2ad5e3 --- /dev/null +++ b/assets/js/c83ce79b.05c17cb8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8141],{9745:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.12.0/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.12.0/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/must_be_api.md","tags":[],"version":"0.12.0","frontMatter":{"id":"must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/unused"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c846d7aa.eb80452a.js b/assets/js/c846d7aa.eb80452a.js new file mode 100644 index 0000000000..ae648a3e23 --- /dev/null +++ b/assets/js/c846d7aa.eb80452a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4193],{25493:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.11.1/rules/compiler/could_use_anvil_factory.md","sourceDirName":"rules/compiler","slug":"/rules/compiler/could_use_anvil_factory","permalink":"/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/compiler/could_use_anvil_factory.md","tags":[],"version":"0.11.1","frontMatter":{"id":"could_use_anvil_factory","title":"Could Use Anvil Factory","sidebar_label":"Could Use Anvil Factory"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.1/rules/inherited_dependency"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor"}}');var r=o(23420),s=o(65404);const i={id:"could_use_anvil_factory",title:"Could Use Anvil Factory",sidebar_label:"Could Use Anvil Factory"},c=void 0,l={},a=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents,\nand it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},65404:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(36672);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c902409b.ea48d292.js b/assets/js/c902409b.ea48d292.js new file mode 100644 index 0000000000..9aff419dac --- /dev/null +++ b/assets/js/c902409b.ea48d292.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5184],{45590:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.11.3/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/0.11.3/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/ci_workflow.md","tags":[],"version":"0.11.3","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.11.3/suppressing-findings"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.3/rules/unused"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheck):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '11'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew modulecheck --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/c989d589.94d486a6.js b/assets/js/c989d589.94d486a6.js new file mode 100644 index 0000000000..d0316b1289 --- /dev/null +++ b/assets/js/c989d589.94d486a6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9082],{65404:(e,n,d)=>{d.d(n,{R:()=>o,x:()=>c});var t=d(36672);const s={},i=t.createContext(s);function o(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),t.createElement(i.Provider,{value:n},e.children)}},70856:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>t,toc:()=>l});const t=JSON.parse('{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","source":"@site/versioned_docs/version-0.12.2/rules/inherited_dependency.md","sourceDirName":"rules","slug":"/rules/inherited_dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/inherited_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/inherited_dependency.md","tags":[],"version":"0.12.2","frontMatter":{"id":"inherited_dependency","slug":"/rules/inherited_dependency","title":"Inherited Dependency","sidebar_label":"Inherited Dependency"},"sidebar":"Docs","previous":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.2/rules/must_be_api"},"next":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.12.2/rules/redundant_dependency"}}');var s=d(23420),i=d(65404);const o={id:"inherited_dependency",slug:"/rules/inherited_dependency",title:"Inherited Dependency",sidebar_label:"Inherited Dependency"},c=void 0,r={},l=[];function u(e){const n={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["Assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleB"}),", and ",(0,s.jsx)(n.code,{children:":moduleB"})," depends upon ",(0,s.jsx)(n.code,{children:":moduleC"})," via\nan ",(0,s.jsx)(n.code,{children:"api"})," configuration. Also assume that ",(0,s.jsx)(n.code,{children:":moduleA"})," uses something from ",(0,s.jsx)(n.code,{children:":moduleC"}),", but doesn't\nhave an explicit dependency for it. It just inherits that dependency from ",(0,s.jsx)(n.code,{children:":moduleB"}),"."]}),"\n",(0,s.jsxs)(n.p,{children:["ModuleCheck will recommend adding a direct, explicit dependency for ",(0,s.jsx)(n.code,{children:":moduleA"})," -> ",(0,s.jsx)(n.code,{children:":moduleC"}),"."]})]})}function a(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/ca3e6c65.ecb85b48.js b/assets/js/ca3e6c65.ecb85b48.js new file mode 100644 index 0000000000..655ac0b7ce --- /dev/null +++ b/assets/js/ca3e6c65.ecb85b48.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1601],{29689:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>c,default:()=>u,frontMatter:()=>i,metadata:()=>t,toc:()=>a});const t=JSON.parse('{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.11.3/rules/compiler/could_use_anvil_factory.md","sourceDirName":"rules/compiler","slug":"/rules/compiler/could_use_anvil_factory","permalink":"/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/compiler/could_use_anvil_factory.md","tags":[],"version":"0.11.3","frontMatter":{"id":"could_use_anvil_factory","title":"Could Use Anvil Factory","sidebar_label":"Could Use Anvil Factory"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.3/rules/inherited_dependency"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor"}}');var r=o(23420),s=o(65404);const i={id:"could_use_anvil_factory",title:"Could Use Anvil Factory",sidebar_label:"Could Use Anvil Factory"},c=void 0,l={},a=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,s.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents,\nand it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},65404:(e,n,o)=>{o.d(n,{R:()=>i,x:()=>c});var t=o(36672);const r={},s=t.createContext(r);function i(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ca460041.6b486372.js b/assets/js/ca460041.6b486372.js new file mode 100644 index 0000000000..10a3e9d28e --- /dev/null +++ b/assets/js/ca460041.6b486372.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1084],{24762:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/docs/rules/android/disable_android_resources.md","sourceDirName":"rules/android","slug":"/rules/disable_android_resources","permalink":"/ModuleCheck/docs/next/rules/disable_android_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/android/disable_android_resources.md","tags":[],"version":"current","frontMatter":{"id":"disable_android_resources","slug":"/rules/disable_android_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/next/rules/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/next/rules/disable_view_binding"}}');var d=r(23420),o=r(65404);const i={id:"disable_android_resources",slug:"/rules/disable_android_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,a={},c=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,d.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,d.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,d.jsx)(s.pre,{children:(0,d.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,d.jsx)(s,{...e,children:(0,d.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const d={},o=n.createContext(d);function i(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ca873730.cbd84d65.js b/assets/js/ca873730.cbd84d65.js new file mode 100644 index 0000000000..8a1542e8c2 --- /dev/null +++ b/assets/js/ca873730.cbd84d65.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4559],{7357:(e,t,n)=>{n.d(t,{A:()=>o});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var s=n(23420);function o({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},35252:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.12.4/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.12.4/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/configuration.mdx","tags":[],"version":"0.12.4","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.12.4/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.4/suppressing-findings"}}');var a=n(23420),s=n(65404),o=n(83796),u=n(7357);const l={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function f(e){const t={code:"code",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(o.A,{children:[(0,a.jsx)(u.A,{value:"Kotlin",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'plugins {\n id("com.rickbusarow.module-check") version "0.12.4"\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n trace = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalCodeGenerators = listOf(\n modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n name = "My Processor",\n generatorMavenCoordinates = "my-project.codegen:processor",\n annotationNames = listOf(\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(u.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'plugins {\n id \'com.rickbusarow.module-check\' version \'0.12.4\'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n trace = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = [\':test:core-jvm\', \':test:core-android\']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [\':app\']\n\n additionalCodeGenerators = [\n new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n \'My Processor\',\n \'my-project.codegen:processor\',\n [\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n it.enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n it.outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(f,{...e})}):f(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>u});var r=n(36672);const a={},s=r.createContext(a);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:t},e.children)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),s=n(58797),o=n(85291),u=n(52245),l=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function f(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,n])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,s=f(e),[o,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),g=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,u.A)(()=>{g&&l(g)},[g]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var b=n(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var y=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:o}){const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,s.a_)(),i=e=>{const t=e.currentTarget,a=u.indexOf(t),s=o[a].value;s!==n&&(l(t),r(s))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:o.map(({value:e,label:t,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{u.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,y.jsx)(v,{...t,...e}),(0,y.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,y.jsx)(j,{...e,children:d(e.children)},String(t))}}}]); \ No newline at end of file diff --git a/assets/js/ca8e7b55.318cc4bc.js b/assets/js/ca8e7b55.318cc4bc.js new file mode 100644 index 0000000000..6546c271ab --- /dev/null +++ b/assets/js/ca8e7b55.318cc4bc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3867],{138:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.11.2/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.11.2/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/must_be_api.md","tags":[],"version":"0.11.2","frontMatter":{"id":"must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.2/rules/unused"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.2/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cb00cd0b.c5dbd77c.js b/assets/js/cb00cd0b.c5dbd77c.js new file mode 100644 index 0000000000..5bf168c77b --- /dev/null +++ b/assets/js/cb00cd0b.c5dbd77c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3263],{62768:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>o,toc:()=>i});const o=JSON.parse('{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"","source":"@site/versioned_docs/version-0.10.0/rules/kapt/custom_kapt_matchers.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/kapt/custom_kapt_matchers.md","tags":[],"version":"0.10.0","frontMatter":{"id":"custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Rules","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies"}}');var r=s(23420),n=s(65404);const a={id:"custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},c=void 0,u={},i=[];function l(e){return(0,r.jsx)(r.Fragment,{})}function p(e={}){const{wrapper:t}={...(0,n.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l()}},65404:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>c});var o=s(36672);const r={},n=o.createContext(r);function a(e){const t=o.useContext(n);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:a(e.components),o.createElement(n.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cb4f58ba.46f93e40.js b/assets/js/cb4f58ba.46f93e40.js new file mode 100644 index 0000000000..1cd104b56b --- /dev/null +++ b/assets/js/cb4f58ba.46f93e40.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4074],{65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>l});var o=t(36672);const s={},a=o.createContext(s);function i(e){const n=o.useContext(a);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function l(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),o.createElement(a.Provider,{value:n},e.children)}},75686:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>r,contentTitle:()=>l,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>c});const o=JSON.parse('{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","source":"@site/versioned_docs/version-0.11.2/ci_workflow.md","sourceDirName":".","slug":"/ci-workflow","permalink":"/ModuleCheck/docs/0.11.2/ci-workflow","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/ci_workflow.md","tags":[],"version":"0.11.2","frontMatter":{"id":"ci-workflow","sidebar_label":"CI Workflow","title":"CI Workflow"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.11.2/configuration"},"next":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.2/rules/unused"}}');var s=t(23420),a=t(65404);const i={id:"ci-workflow",sidebar_label:"CI Workflow",title:"CI Workflow"},l=void 0,r={},c=[{value:"Using CI over git hooks",id:"using-ci-over-git-hooks",level:3},{value:"Example Flow chart",id:"example-flow-chart",level:3},{value:"Example GitHub Action",id:"example-github-action",level:3}];function h(e){const n={a:"a",code:"code",h3:"h3",mermaid:"mermaid",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and\nautomatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to\napply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run.\nThis is similar to a git pre-commit hook, except the work is delegated to a build server."}),"\n",(0,s.jsx)(n.h3,{id:"using-ci-over-git-hooks",children:"Using CI over git hooks"}),"\n",(0,s.jsx)(n.p,{children:"The traditional method for applying changes automatically is with a git hook, such as pre-commit or\npre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor\ndeveloper experience. With a CI task, the execution is done automatically and asynchronously, while\nthe developer is already moving on to something else."}),"\n",(0,s.jsx)(n.p,{children:"A git hook also technically doesn't guarantee that a task is executed before code is checked in to a\nmain branch, since there's no guarantee that a hook is enabled. With CI, the task will output a\nstatus check. If a branch protection rule is enabled, that status check can be required. This will\nthen guarantee that the task has run (successfully) before any code is checked in to the protected\nbranch."}),"\n",(0,s.jsx)(n.h3,{id:"example-flow-chart",children:"Example Flow chart"}),"\n",(0,s.jsxs)(n.p,{children:['This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The\ncancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an\n"optimistic" workflow, in that it assumes that the ',(0,s.jsx)(n.code,{children:"modulecheck"})," task will not generate changes\nwhich would trigger a restart."]}),"\n",(0,s.jsx)(n.mermaid,{value:'flowchart TB\n Start(CI Start):::good --\x3e mGraph\n Start --\x3e tGraph\n Start --\x3e cGraph\n\n subgraph mGraph [runner 1]\n direction TB\n ModuleCheck(./gradlew moduleCheck):::code --\x3e ChangesModuleCheck\n ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --\x3e CommitModuleCheck(Commit changes and push):::stop\n ChangesModuleCheck --- noM[no]:::lineLabel --\x3e EndModuleCheck("#10003;"):::good\n end\n\n subgraph tGraph [runner 2]\n direction TB\n Tests(./gradlew test):::code --\x3e EndTests("#10003;"):::good\n end\n\n subgraph cGraph [runner 3]\n direction TB\n Cancel(Cancel previous CI run):::code\n end\n\n style tGraph fill:#EEE,stroke:#000\n style cGraph fill:#EEE,stroke:#000\n style mGraph fill:#EEE,stroke:#000\n\n classDef good fill:#0B0,stroke:#000\n classDef stop fill:#E33,stroke:#000\n\n classDef code fill:#AAA,stroke:#000\n\n style ChangesModuleCheck fill:#CD1,stroke:#000\n\n classDef lineLabel fill:#FFF,stroke:#FFF'}),"\n",(0,s.jsx)(n.h3,{id:"example-github-action",children:"Example GitHub Action"}),"\n",(0,s.jsxs)(n.p,{children:["Here's an Action which will run ModuleCheck, then commit any changes\nusing ",(0,s.jsx)(n.a,{href:"https://github.com/stefanzweifel/git-auto-commit-action",children:"Stefanzweifel's auto-commit"}),". This\nrequires a personal access token secret, or the commit step will fail."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-yaml",metastring:"title=.github/workflows.module-check.yml",children:"name: ModuleCheck\n\non:\n pull_request:\n\njobs:\n\n cancel-stale-jobs:\n name: Cancel stale jobs\n runs-on: ubuntu-latest\n\n steps:\n # cancel previous jobs\n - name: Cancel Previous Runs\n uses: styfle/cancel-workflow-action@0.9.0\n env:\n GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'\n\n ModuleCheck:\n name: ModuleCheck\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n # Must use a personal access token in order to commit changes\n token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n # performs tree-shaking on the Gradle dependency graph\n - name: modulecheck\n run: ./gradlew modulecheck --no-daemon\n\n # If ModuleCheck generated changes, commit and push those changes.\n # If there are no changes, then this is a no-op.\n - name: commit changes\n uses: stefanzweifel/git-auto-commit-action@v4\n with:\n commit_message: Apply ModuleCheck changes\n commit_options: '--no-verify --signoff'\n\n tests:\n name: Unit tests\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v2\n with:\n ref: ${{ github.event.pull_request.head.ref }}\n token: ${{ secrets.GITHUB_TOKEN }}\n fetch-depth: 0\n\n - name: Set up JDK\n uses : actions/setup-java@v2\n with :\n distribution : 'temurin'\n java-version : '14'\n\n - name: all tests\n run: ./gradlew test --no-daemon\n"})})]})}function u(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(h,{...e})}):h(e)}}}]); \ No newline at end of file diff --git a/assets/js/cbb899e4.e69a7ee6.js b/assets/js/cbb899e4.e69a7ee6.js new file mode 100644 index 0000000000..7d52811d1a --- /dev/null +++ b/assets/js/cbb899e4.e69a7ee6.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5235],{7357:(e,t,n)=>{n.d(t,{A:()=>o});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var s=n(23420);function o({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},65404:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>u});var r=n(36672);const a={},s=r.createContext(a);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:t},e.children)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),s=n(58797),o=n(85291),u=n(52245),l=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function f(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,n])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,s=f(e),[o,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),g=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,u.A)(()=>{g&&l(g)},[g]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var b=n(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var y=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:o}){const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,s.a_)(),i=e=>{const t=e.currentTarget,a=u.indexOf(t),s=o[a].value;s!==n&&(l(t),r(s))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:o.map(({value:e,label:t,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{u.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,y.jsx)(v,{...t,...e}),(0,y.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,y.jsx)(j,{...e,children:d(e.children)},String(t))}},94266:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/docs/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/next/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/configuration.mdx","tags":[],"version":"current","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/next/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/next/suppressing-findings"}}');var a=n(23420),s=n(65404),o=n(83796),u=n(7357);const l={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function f(e){const t={code:"code",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(o.A,{children:[(0,a.jsx)(u.A,{value:"Kotlin",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:"title = root/build.gradle.kts",children:'plugins {\n id("com.rickbusarow.module-check")\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n trace = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalCodeGenerators = listOf(\n modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n name = "My Processor",\n generatorMavenCoordinates = "my-project.codegen:processor",\n annotationNames = listOf(\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(u.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:"title = root/build.gradle",children:'plugins {\n id \'com.rickbusarow.module-check\'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n trace = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = [\':test:core-jvm\', \':test:core-android\']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [\':app\']\n\n additionalCodeGenerators = [\n new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n \'My Processor\',\n \'my-project.codegen:processor\',\n [\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n it.enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n it.outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n\n}\n'})})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(f,{...e})}):f(e)}}}]); \ No newline at end of file diff --git a/assets/js/cbe609e8.3d5c44f1.js b/assets/js/cbe609e8.3d5c44f1.js new file mode 100644 index 0000000000..81c78b0ada --- /dev/null +++ b/assets/js/cbe609e8.3d5c44f1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9991],{30094:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>i,contentTitle:()=>c,default:()=>a,frontMatter:()=>r,metadata:()=>s,toc:()=>l});const s=JSON.parse('{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","source":"@site/docs/rules/overshot_dependency.md","sourceDirName":"rules","slug":"/rules/overshot_dependency","permalink":"/ModuleCheck/docs/next/rules/overshot_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/overshot_dependency.md","tags":[],"version":"current","frontMatter":{"id":"overshot_dependency","slug":"/rules/overshot_dependency","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Docs","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/next/rules/redundant_dependency"},"next":{"title":"Project Depth","permalink":"/ModuleCheck/docs/next/rules/project_depth"}}');var d=t(23420),o=t(65404);const r={id:"overshot_dependency",slug:"/rules/overshot_dependency",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},c=void 0,i={},l=[];function u(e){const n={code:"code",em:"em",p:"p",pre:"pre",strong:"strong",...(0,o.R)(),...e.components};return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(n.p,{children:"Finds project dependencies which aren't used by the declaring configuration, but are used by a\ndependent, downstream configuration."}),"\n",(0,d.jsxs)(n.p,{children:["For instance, assume that ",(0,d.jsx)(n.code,{children:":moduleB"})," declares an ",(0,d.jsx)(n.code,{children:"implementation"})," dependency upon ",(0,d.jsx)(n.code,{children:":moduleA"}),"."]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n implementation(project(":moduleA"))\n}\n'})}),"\n",(0,d.jsxs)(n.p,{children:["If ",(0,d.jsx)(n.code,{children:":moduleB"})," doesn't actually use ",(0,d.jsx)(n.code,{children:":moduleA"})," in its ",(0,d.jsx)(n.code,{children:"main"})," source, but it ",(0,d.jsx)(n.em,{children:"does"})," use it in ",(0,d.jsx)(n.code,{children:"test"}),"\nsource, it's an ",(0,d.jsx)(n.strong,{children:"overshot dependency"}),". The declaration should be changed to\nuse ",(0,d.jsx)(n.code,{children:"testImplementation"}),":"]}),"\n",(0,d.jsx)(n.pre,{children:(0,d.jsx)(n.code,{className:"language-kotlin",metastring:'title="moduleB/build.gradle.kts"',children:'dependencies {\n testImplementation(project(":moduleA"))\n}\n'})})]})}function a(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,d.jsx)(n,{...e,children:(0,d.jsx)(u,{...e})}):u(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>c});var s=t(36672);const d={},o=s.createContext(d);function r(e){const n=s.useContext(o);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(d):e.components||d:r(e.components),s.createElement(o.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cc640607.57d48479.js b/assets/js/cc640607.57d48479.js new file mode 100644 index 0000000000..9ab70003f1 --- /dev/null +++ b/assets/js/cc640607.57d48479.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5050],{10850:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>u,contentTitle:()=>r,default:()=>c,frontMatter:()=>d,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","source":"@site/versioned_docs/version-0.12.2/rules/android/unused_kotlin_android_extensions.md","sourceDirName":"rules/android","slug":"/rules/unused_kotlin_android_extensions","permalink":"/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensions","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.2/rules/android/unused_kotlin_android_extensions.md","tags":[],"version":"0.12.2","frontMatter":{"id":"unused_kotlin_android_extensions","slug":"/rules/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","sidebar_label":"Unused Kotlin Android Extensions"},"sidebar":"Docs","previous":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.2/rules/disable_view_binding"}}');var t=s(23420),i=s(65404);const d={id:"unused_kotlin_android_extensions",slug:"/rules/unused_kotlin_android_extensions",title:"Unused Kotlin Android Extensions",sidebar_label:"Unused Kotlin Android Extensions"},r=void 0,u={},l=[];function a(e){const n={p:"p",...(0,i.R)(),...e.components};return(0,t.jsx)(n.p,{children:"Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any\nsynthetic imports or deprecated @Parcelize annotation"})}function c(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(a,{...e})}):a(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>d,x:()=>r});var o=s(36672);const t={},i=o.createContext(t);function d(e){const n=o.useContext(i);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:d(e.components),o.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cd2aa5fe.11b87afe.js b/assets/js/cd2aa5fe.11b87afe.js new file mode 100644 index 0000000000..6fed4aa078 --- /dev/null +++ b/assets/js/cd2aa5fe.11b87afe.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2376],{35358:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.12.3/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sort_plugins","permalink":"/ModuleCheck/docs/0.12.3/rules/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/sorting/sort_plugins.md","tags":[],"version":"0.12.3","frontMatter":{"id":"sort_plugins","slug":"/rules/sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.3/rules/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.3/rules/disable_android_resources"}}');var r=t(23420),o=t(65404);const i={id:"sort_plugins",slug:"/rules/sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const r={},o=n.createContext(r);function i(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/cd6f4c97.d2deb129.js b/assets/js/cd6f4c97.d2deb129.js new file mode 100644 index 0000000000..93cde31a8a --- /dev/null +++ b/assets/js/cd6f4c97.d2deb129.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1381],{36641:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.12.3/rules/compiler/unused_kapt_processor.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/compiler/unused_kapt_processor.md","tags":[],"version":"0.12.3","frontMatter":{"id":"unused_kapt_processor","slug":"/rules/unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin"}}');var t=s(23420),r=s(65404);const i={id:"unused_kapt_processor",slug:"/rules/unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,c={},d=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(36672);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ce0be35a.84e31a7d.js b/assets/js/ce0be35a.84e31a7d.js new file mode 100644 index 0000000000..e0f22f33c7 --- /dev/null +++ b/assets/js/ce0be35a.84e31a7d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9303],{65404:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var s=n(36672);const o={},u=s.createContext(o);function r(e){const t=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:t},e.children)}},70400:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","source":"@site/versioned_docs/version-0.12.0/rules/kapt/unused_kapt_plugin.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/kapt/unused_kapt_plugin.md","tags":[],"version":"0.12.0","frontMatter":{"id":"unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers"}}');var o=n(23420),u=n(65404);const r={id:"unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,a={},p=[];function c(e){const t={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(t.p,{children:["If there are no ",(0,o.jsx)(t.code,{children:"kapt"}),"/",(0,o.jsx)(t.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in\napplying the ",(0,o.jsx)(t.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function d(e={}){const{wrapper:t}={...(0,u.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/d05f0a7d.ebcd5ef9.js b/assets/js/d05f0a7d.ebcd5ef9.js new file mode 100644 index 0000000000..85d02ee54d --- /dev/null +++ b/assets/js/d05f0a7d.ebcd5ef9.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9230],{18678:(e,t,o)=>{o.r(t),o.d(t,{assets:()=>d,contentTitle:()=>u,default:()=>a,frontMatter:()=>c,metadata:()=>n,toc:()=>i});const n=JSON.parse('{"id":"rules/overshot","title":"Overshot Dependency","description":"","source":"@site/versioned_docs/version-0.10.0/rules/overshot.md","sourceDirName":"rules","slug":"/rules/overshot","permalink":"/ModuleCheck/docs/0.10.0/rules/overshot","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/overshot.md","tags":[],"version":"0.10.0","frontMatter":{"id":"overshot","title":"Overshot Dependency","sidebar_label":"Overshot Dependency"},"sidebar":"Rules","previous":{"title":"Redundant Dependency","permalink":"/ModuleCheck/docs/0.10.0/rules/redundant"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor"}}');var s=o(23420),r=o(65404);const c={id:"overshot",title:"Overshot Dependency",sidebar_label:"Overshot Dependency"},u=void 0,d={},i=[];function l(e){return(0,s.jsx)(s.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,s.jsx)(t,{...e,children:(0,s.jsx)(l,{...e})}):l()}},65404:(e,t,o)=>{o.d(t,{R:()=>c,x:()=>u});var n=o(36672);const s={},r=n.createContext(s);function c(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:c(e.components),n.createElement(r.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d1cdaf24.c592a7cf.js b/assets/js/d1cdaf24.c592a7cf.js new file mode 100644 index 0000000000..6b09fb4b5f --- /dev/null +++ b/assets/js/d1cdaf24.c592a7cf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4996],{68800:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.12.3","label":"0.12.3","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.12.3","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.12.3/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.12.3/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/0.12.3/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/0.12.3/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.12.3/rules/unused_dependency","docId":"rules/unused_dependency","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.12.3/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.12.3/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/0.12.3/rules/redundant_dependency","docId":"rules/redundant_dependency","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/0.12.3/rules/overshot_dependency","docId":"rules/overshot_dependency","unlisted":false},{"type":"link","label":"Project Depth","href":"/ModuleCheck/docs/0.12.3/rules/project_depth","docId":"rules/project_depth","unlisted":false},{"type":"category","label":"Compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory Generation","href":"/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation","docId":"rules/compiler/use_anvil_factory_generation","unlisted":false},{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor","docId":"rules/compiler/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin","docId":"rules/compiler/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers","docId":"rules/compiler/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.12.3/rules/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.12.3/rules/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.12.3/rules/disable_android_resources","docId":"rules/android/disable_android_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.12.3/rules/disable_view_binding","docId":"rules/android/disable_view_binding","unlisted":false},{"type":"link","label":"Unused Kotlin Android Extensions","href":"/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensions","docId":"rules/android/unused_kotlin_android_extensions","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"Dependencies","sidebar":"Docs"},"rules/android/disable_android_resources":{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_view_binding":{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/android/unused_kotlin_android_extensions":{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","sidebar":"Docs"},"rules/compiler/custom_kapt_matchers":{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/compiler/unused_kapt_plugin":{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","sidebar":"Docs"},"rules/compiler/unused_kapt_processor":{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/compiler/use_anvil_factory_generation":{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/overshot_dependency":{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","sidebar":"Docs"},"rules/project_depth":{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","sidebar":"Docs"},"rules/redundant_dependency":{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused_dependency":{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/d2866892.4829f6b3.js b/assets/js/d2866892.4829f6b3.js new file mode 100644 index 0000000000..9d39472b84 --- /dev/null +++ b/assets/js/d2866892.4829f6b3.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1900],{5168:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.12.1/rules/compiler/unused_kapt_processor.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/compiler/unused_kapt_processor.md","tags":[],"version":"0.12.1","frontMatter":{"id":"unused_kapt_processor","slug":"/rules/unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin"}}');var t=s(23420),r=s(65404);const i={id:"unused_kapt_processor",slug:"/rules/unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,c={},d=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(36672);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d425c21a.2155e74e.js b/assets/js/d425c21a.2155e74e.js new file mode 100644 index 0000000000..0844024e50 --- /dev/null +++ b/assets/js/d425c21a.2155e74e.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5673],{64533:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>d,toc:()=>i});const d=JSON.parse('{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.12.4/rules/unused_dependency.md","sourceDirName":"rules","slug":"/rules/unused_dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/unused_dependency.md","tags":[],"version":"0.12.4","frontMatter":{"id":"unused_dependency","slug":"/rules/unused_dependency","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.4/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/0.12.4/rules/must_be_api"}}');var t=s(23420),u=s(65404);const o={id:"unused_dependency",slug:"/rules/unused_dependency",title:"Unused Dependency",sidebar_label:"Unused Dependency"},c=void 0,r={},i=[];function l(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,t.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var d=s(36672);const t={},u=d.createContext(t);function o(e){const n=d.useContext(u);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),d.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d4bc87de.eb870da7.js b/assets/js/d4bc87de.eb870da7.js new file mode 100644 index 0000000000..8111530726 --- /dev/null +++ b/assets/js/d4bc87de.eb870da7.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3832],{86646:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.11.2","label":"0.11.2","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.11.2","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.11.2/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.11.2/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/0.11.2/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.11.2/rules/unused","docId":"rules/unused","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.11.2/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.11.2/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"category","label":"compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory","href":"/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory","docId":"rules/compiler/could_use_anvil_factory","unlisted":false}],"collapsible":true},{"type":"category","label":"Kapt","collapsed":false,"items":[{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor","docId":"rules/kapt/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin","docId":"rules/kapt/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers","docId":"rules/kapt/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.11.2/rules/android/disable_resources","docId":"rules/android/disable_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.11.2/rules/android/disable_viewbinding","docId":"rules/android/disable_viewbinding","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.","sidebar":"Docs"},"rules/android/disable_resources":{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_viewbinding":{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/compiler/could_use_anvil_factory":{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/kapt/custom_kapt_matchers":{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/kapt/unused_kapt_plugin":{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","sidebar":"Docs"},"rules/kapt/unused_kapt_processor":{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused":{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/d51efe31.c9fce7be.js b/assets/js/d51efe31.c9fce7be.js new file mode 100644 index 0000000000..30f3efa855 --- /dev/null +++ b/assets/js/d51efe31.c9fce7be.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[183],{7357:(e,n,r)=>{r.d(n,{A:()=>s});r(36672);var t=r(13526);const a={tabItem:"tabItem_qogc"};var l=r(23420);function s({children:e,hidden:n,className:r}){return(0,l.jsx)("div",{role:"tabpanel",className:(0,t.A)(a.tabItem,r),hidden:n,children:e})}},27923:(e,n,r)=>{r.r(n),r.d(n,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>i,metadata:()=>t,toc:()=>d});const t=JSON.parse('{"id":"quickstart","title":"Quick Start","description":"Dependencies","source":"@site/versioned_docs/version-0.12.3/quickstart.mdx","sourceDirName":".","slug":"/","permalink":"/ModuleCheck/docs/0.12.3/","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/quickstart.mdx","tags":[],"version":"0.12.3","frontMatter":{"id":"quickstart","title":"Quick Start","sidebar_label":"Quick Start","slug":"/"},"sidebar":"Docs","next":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.3/configuration"}}');var a=r(23420),l=r(65404),s=r(83796),o=r(7357);const i={id:"quickstart",title:"Quick Start",sidebar_label:"Quick Start",slug:"/"},c=void 0,u={},d=[{value:"Dependencies",id:"dependencies",level:2},{value:"Tasks",id:"tasks",level:2},{value:"Configuration",id:"configuration",level:2}];function h(e){const n={a:"a",code:"code",h2:"h2",p:"p",pre:"pre",...(0,l.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.h2,{id:"dependencies",children:"Dependencies"}),"\n",(0,a.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// settings.gradle.kts\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven("https://oss.sonatype.org/content/repositories/snapshots/")\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",children:'// top-level build.gradle.kts\n\nplugins {\n id("com.rickbusarow.module-check") version "0.12.3"\n}\n'})})]}),(0,a.jsxs)(o.A,{value:"Groovy",children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:'// settings.gradle\n\npluginManagement {\n repositories {\n gradlePluginPortal()\n // Add for SNAPSHOT builds\n maven {\n url "https://oss.sonatype.org/content/repositories/snapshots"\n }\n }\n}\n'})}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",children:"// top-level build.gradle\n\nplugins {\n id 'com.rickbusarow.module-check' version '0.12.3'\n}\n"})})]})]}),"\n",(0,a.jsx)(n.h2,{id:"tasks",children:"Tasks"}),"\n",(0,a.jsx)(n.p,{children:"all checks"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheck\n"})}),"\n",(0,a.jsx)(n.p,{children:"all checks with auto-correct"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"check sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPlugins moduleCheckSortDependencies\n"})}),"\n",(0,a.jsx)(n.p,{children:"apply sorting"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto\n"})}),"\n",(0,a.jsx)(n.p,{children:"report depths of each module"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckDepths\n"})}),"\n",(0,a.jsx)(n.p,{children:"generate (module-only) dependency graphs"}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-shell",children:"./gradlew moduleCheckGraphs\n"})}),"\n",(0,a.jsx)(n.h2,{id:"configuration",children:"Configuration"}),"\n",(0,a.jsxs)(n.p,{children:["See ",(0,a.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.3/configuration",children:"configuration"})," for a full list of options."]}),"\n",(0,a.jsxs)(s.A,{children:[(0,a.jsxs)(o.A,{value:"Kotlin",default:!0,children:[(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})}),(0,a.jsx)(n.p,{children:"--or--"}),(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})]}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'moduleCheck {\n\n alwaysIgnore.set(setOf(":app"))\n\n checks {\n redundant.set(false)\n }\n}\n'})})})]})]})}function p(e={}){const{wrapper:n}={...(0,l.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(h,{...e})}):h(e)}},65404:(e,n,r)=>{r.d(n,{R:()=>s,x:()=>o});var t=r(36672);const a={},l=t.createContext(a);function s(e){const n=t.useContext(l);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),t.createElement(l.Provider,{value:n},e.children)}},83796:(e,n,r)=>{r.d(n,{A:()=>y});var t=r(36672),a=r(13526),l=r(58797),s=r(85291),o=r(52245),i=r(32342),c=r(45223),u=r(1771);function d(e){return t.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,t.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function h(e){const{values:n,children:r}=e;return(0,t.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:r,default:t}})=>({value:e,label:n,attributes:r,default:t}))}(r);return function(e){const n=(0,c.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,r])}function p({value:e,tabValues:n}){return n.some(n=>n.value===e)}function g({queryString:e=!1,groupId:n}){const r=(0,s.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,i.aZ)(a),(0,t.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(r.location.search);n.set(a,e),r.replace({...r.location,search:n.toString()})},[a,r])]}function m(e){const{defaultValue:n,queryString:r=!1,groupId:a}=e,l=h(e),[s,i]=(0,t.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const r=n.find(e=>e.default)??n[0];if(!r)throw new Error("Unexpected error: 0 tabValues");return r.value}({defaultValue:n,tabValues:l})),[c,d]=g({queryString:r,groupId:a}),[m,f]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[r,a]=(0,u.Dv)(n);return[r,(0,t.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),b=(()=>{const e=c??m;return p({value:e,tabValues:l})?e:null})();(0,o.A)(()=>{b&&i(b)},[b]);return{selectedValue:s,selectValue:(0,t.useCallback)(e=>{if(!p({value:e,tabValues:l}))throw new Error(`Can't select invalid tab value=${e}`);i(e),d(e),f(e)},[d,f,l]),tabValues:l}}var f=r(64407);const b={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=r(23420);function x({className:e,block:n,selectedValue:r,selectValue:t,tabValues:s}){const o=[],{blockElementScrollPositionUntilNextRender:i}=(0,l.a_)(),c=e=>{const n=e.currentTarget,a=o.indexOf(n),l=s[a].value;l!==r&&(i(n),t(l))},u=e=>{let n=null;switch(e.key){case"Enter":c(e);break;case"ArrowRight":{const r=o.indexOf(e.currentTarget)+1;n=o[r]??o[0];break}case"ArrowLeft":{const r=o.indexOf(e.currentTarget)-1;n=o[r]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:s.map(({value:e,label:n,attributes:t})=>(0,v.jsx)("li",{role:"tab",tabIndex:r===e?0:-1,"aria-selected":r===e,ref:e=>{o.push(e)},onKeyDown:u,onClick:c,...t,className:(0,a.A)("tabs__item",b.tabItem,t?.className,{"tabs__item--active":r===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:r}){const l=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=l.find(e=>e.props.value===r);return e?(0,t.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:l.map((e,n)=>(0,t.cloneElement)(e,{key:n,hidden:e.props.value!==r}))})}function j(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",b.tabList),children:[(0,v.jsx)(x,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function y(e){const n=(0,f.A)();return(0,v.jsx)(j,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/d69a7b0b.901336c8.js b/assets/js/d69a7b0b.901336c8.js new file mode 100644 index 0000000000..902a808f42 --- /dev/null +++ b/assets/js/d69a7b0b.901336c8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4410],{6137:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","source":"@site/versioned_docs/version-0.12.3/rules/project_depth.md","sourceDirName":"rules","slug":"/rules/project_depth","permalink":"/ModuleCheck/docs/0.12.3/rules/project_depth","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/project_depth.md","tags":[],"version":"0.12.3","frontMatter":{"id":"project_depth","slug":"/rules/project_depth","title":"Project Depth","sidebar_label":"Project Depth"},"sidebar":"Docs","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/overshot_dependency"},"next":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation"}}');var r=l(23420),t=l(65404);const d={id:"project_depth",slug:"/rules/project_depth",title:"Project Depth",sidebar_label:"Project Depth"},i=void 0,c={},o=[{value:"Dependencies and Build Concurrency",id:"dependencies-and-build-concurrency",level:3},{value:"Depth",id:"depth",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",mermaid:"mermaid",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"TL;DR - Low depth values mean faster builds and better all-around scalability."}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["It's often useful to think of module dependencies as a directed tree\nor ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Directed_acyclic_graph",children:"directed acyclic graph"}),". If a module is a\nnode, then each module dependency is a child node, and the dependencies of those dependencies are\ngrand-child nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["This is especially useful when thinking about ",(0,r.jsx)(n.strong,{children:"build performance"}),", because the parent-child\nrelationship is clear: ",(0,r.jsx)(n.em,{children:"child nodes must build before parent nodes"}),"."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(:app):::depth2\n\n screen1(:screen-1):::depth1\n screen2(:screen-2):::depth1\n\n lib1(:lib-1):::depth0\n lib2(:lib-2):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n\n screen1 --\x3e lib1\n screen1 --\x3e lib2\n screen2 --\x3e lib2"}),"\n",(0,r.jsx)(n.p,{children:"In the above example,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," must be built before ",(0,r.jsx)(n.code,{children:":screen-1"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-2"})," must be build before ",(0,r.jsx)(n.code,{children:":screen-2"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":screen-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," must be built before ",(0,r.jsx)(n.code,{children:":app"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build\nbefore their parents."}),"\n",(0,r.jsx)(n.h3,{id:"dependencies-and-build-concurrency",children:"Dependencies and Build Concurrency"}),"\n",(0,r.jsx)(n.p,{children:"Individual module builds are always done single-threaded, but multiple modules may build in parallel\nso long as no module in the set depends upon another module in that set. In the above graph,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":scren-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The maximum number of parallel module builds is determined by the structure of the dependency graph\nand the number of available processor cores on the machine which is performing the build."}),"\n",(0,r.jsx)(n.h3,{id:"depth",children:"Depth"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Depth"})," refers to the maximum number of edges between a module and each of its leaf nodes in the\nproject dependency graph."]}),"\n",(0,r.jsx)(n.p,{children:"Low depth values indicate a shallow or flat project structure with loose (or no) coupling between\nmodules. In a full build, these projects scale well with hardware upgrades because they're able to\nbuild all those independent modules in parallel."}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n subgraph sg [A shallow graph]\n direction TB\n\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 2):::depth2\n\n screen1(depth: 1):::depth1\n screen2(depth: 1):::depth1\n screen3(depth: 1):::depth1\n screen4(depth: 1):::depth1\n\n lib1(depth: 0):::depth0\n lib2(depth: 0):::depth0\n lib3(depth: 0):::depth0\n lib4(depth: 0):::depth0\n lib5(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e lib1\n screen1 --\x3e lib4\n\n screen2 --\x3e lib1\n screen2 --\x3e lib3\n screen2 --\x3e lib4\n\n screen3 --\x3e lib2\n screen3 --\x3e lib3\n screen3 --\x3e lib4\n\n screen4 --\x3e lib3\n screen4 --\x3e lib5\n\n end\n\n style sg opacity:0.0\n"}),"\n",(0,r.jsxs)(n.p,{children:['On the other hand, "deep" projects do not offer many opportunities for parallelization. They have\nproject dependencies which must be built ',(0,r.jsx)(n.em,{children:"sequentially"}),". They also perform poorly in incremental\nbuilds, because a single change to even a mid-level module invalidates cached builds for half of the\nproject."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n style sg opacity:0.0\n subgraph sg [A deep graph]\n direction TB\n\n classDef depth6 fill:#800,stroke:#000,color:#FFF\n classDef depth5 fill:#A50,stroke:#000,color:#FFF\n classDef depth4 fill:#C0B,stroke:#000,color:#000\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 6):::depth6\n\n screen1(depth: 5):::depth5\n screen2(depth: 5):::depth5\n\n screen3(depth: 4):::depth4\n screen4(depth: 4):::depth4\n\n lib1(depth: 3):::depth3\n lib2(depth: 3):::depth3\n\n lib3(depth: 2):::depth2\n lib4(depth: 2):::depth2\n\n lib5(depth: 1):::depth1\n\n lib6(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e screen3\n screen1 --\x3e screen4\n\n screen2 --\x3e screen4\n\n screen3 --\x3e lib1\n screen3 --\x3e lib2\n\n screen4 --\x3e lib1\n screen4 --\x3e lib4\n\n lib1 --\x3e lib3\n lib1 --\x3e lib4\n\n lib2 --\x3e lib3\n\n lib3 --\x3e lib5\n lib4 --\x3e lib5\n\n lib5 --\x3e lib6\n\n end\n"})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},65404:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>i});var s=l(36672);const r={},t=s.createContext(r);function d(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/d968e4da.5e728ea5.js b/assets/js/d968e4da.5e728ea5.js new file mode 100644 index 0000000000..f133ae159b --- /dev/null +++ b/assets/js/d968e4da.5e728ea5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5326],{65404:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var d=i(36672);const s={},t=d.createContext(s);function o(e){const n=d.useContext(t);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),d.createElement(t.Provider,{value:n},e.children)}},65452:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>a});const d=JSON.parse('{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.12.4/rules/android/disable_view_binding.md","sourceDirName":"rules/android","slug":"/rules/disable_view_binding","permalink":"/ModuleCheck/docs/0.12.4/rules/disable_view_binding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/android/disable_view_binding.md","tags":[],"version":"0.12.4","frontMatter":{"id":"disable_view_binding","slug":"/rules/disable_view_binding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.4/rules/disable_android_resources"},"next":{"title":"Unused Kotlin Android Extensions","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensions"}}');var s=i(23420),t=i(65404);const o={id:"disable_view_binding",slug:"/rules/disable_view_binding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,l={},a=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/dc7f0b30.6d808dd0.js b/assets/js/dc7f0b30.6d808dd0.js new file mode 100644 index 0000000000..14cad64b1a --- /dev/null +++ b/assets/js/dc7f0b30.6d808dd0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8296],{38200:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>c,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>a});const n=JSON.parse('{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.11.3/rules/android/disable_resources.md","sourceDirName":"rules/android","slug":"/rules/android/disable_resources","permalink":"/ModuleCheck/docs/0.11.3/rules/android/disable_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/android/disable_resources.md","tags":[],"version":"0.11.3","frontMatter":{"id":"disable_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.11.3/rules/android/disable_viewbinding"}}');var o=r(23420),d=r(65404);const i={id:"disable_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,c={},a=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/de297161.ef4d0adf.js b/assets/js/de297161.ef4d0adf.js new file mode 100644 index 0000000000..b31d2e04fa --- /dev/null +++ b/assets/js/de297161.ef4d0adf.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1658],{63148:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>c,contentTitle:()=>a,default:()=>u,frontMatter:()=>i,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","source":"@site/versioned_docs/version-0.12.5/rules/compiler/unused_kapt_processor.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_processor","permalink":"/ModuleCheck/docs/rules/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/compiler/unused_kapt_processor.md","tags":[],"version":"0.12.5","frontMatter":{"id":"unused_kapt_processor","slug":"/rules/unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Docs","previous":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/rules/use_anvil_factory_generation"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/rules/unused_kapt_plugin"}}');var t=s(23420),r=s(65404);const i={id:"unused_kapt_processor",slug:"/rules/unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},a=void 0,c={},d=[];function l(e){const n={code:"code",em:"em",li:"li",p:"p",ul:"ul",...(0,r.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Annotation processors act upon a defined set of annotations. If an annotation processor is\nsufficiently popular and its api is stable, then it's relatively simple to define a list of\nannotations to search for. For instance, Dagger looks for the following annotations:"}),"\n",(0,t.jsxs)(n.ul,{children:["\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"javax.inject.Inject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Binds"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Module"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoMap"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.multibindings.IntoSet"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.BindsInstance"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.Component"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.Assisted"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedInject"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"dagger.assisted.AssistedFactory"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.ContributesTo"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeComponent"})}),"\n",(0,t.jsx)(n.li,{children:(0,t.jsx)(n.code,{children:"com.squareup.anvil.annotations.MergeSubomponent"})}),"\n"]}),"\n",(0,t.jsxs)(n.p,{children:["If a module has the Dagger ",(0,t.jsx)(n.code,{children:"kapt"})," dependency, and that module ",(0,t.jsx)(n.em,{children:"does not"})," have one of the above\nannotations somewhere, then Dagger isn't actually doing anything and can be removed."]}),"\n",(0,t.jsx)(n.p,{children:"This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of\nannotations for any processor may change. If this rule gives a false-positive finding because of a\nnew annotation, please open an issue and/or pull request."})]})}function u(e={}){const{wrapper:n}={...(0,r.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>i,x:()=>a});var o=s(36672);const t={},r=o.createContext(t);function i(e){const n=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:i(e.components),o.createElement(r.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/de406b5e.777d18f0.js b/assets/js/de406b5e.777d18f0.js new file mode 100644 index 0000000000..86ff434fb4 --- /dev/null +++ b/assets/js/de406b5e.777d18f0.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6364],{9930:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.11.2/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_plugins","permalink":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/sorting/sort_plugins.md","tags":[],"version":"0.11.2","frontMatter":{"id":"sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.2/rules/android/disable_resources"}}');var o=t(23420),r=t(65404);const i={id:"sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const o={},r=n.createContext(o);function i(e){const s=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/df248b36.3e0b0a95.js b/assets/js/df248b36.3e0b0a95.js new file mode 100644 index 0000000000..226458cf93 --- /dev/null +++ b/assets/js/df248b36.3e0b0a95.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1686],{65404:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var s=n(36672);const o={},u=s.createContext(o);function r(e){const t=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:t},e.children)}},84629:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","source":"@site/versioned_docs/version-0.11.1/rules/kapt/unused_kapt_plugin.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.1/rules/kapt/unused_kapt_plugin.md","tags":[],"version":"0.11.1","frontMatter":{"id":"unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers"}}');var o=n(23420),u=n(65404);const r={id:"unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,a={},p=[];function c(e){const t={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(t.p,{children:["If there are no ",(0,o.jsx)(t.code,{children:"kapt"}),"/",(0,o.jsx)(t.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in applying\nthe ",(0,o.jsx)(t.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function l(e={}){const{wrapper:t}={...(0,u.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/e0474f93.a9c558dc.js b/assets/js/e0474f93.a9c558dc.js new file mode 100644 index 0000000000..237612550f --- /dev/null +++ b/assets/js/e0474f93.a9c558dc.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8861],{5919:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.12.5/rules/android/disable_android_resources.md","sourceDirName":"rules/android","slug":"/rules/disable_android_resources","permalink":"/ModuleCheck/docs/rules/disable_android_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/android/disable_android_resources.md","tags":[],"version":"0.12.5","frontMatter":{"id":"disable_android_resources","slug":"/rules/disable_android_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/rules/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/rules/disable_view_binding"}}');var o=r(23420),d=r(65404);const i={id:"disable_android_resources",slug:"/rules/disable_android_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,a={},c=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e0a1aa17.e9aa4f41.js b/assets/js/e0a1aa17.e9aa4f41.js new file mode 100644 index 0000000000..0467d48fa2 --- /dev/null +++ b/assets/js/e0a1aa17.e9aa4f41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2304],{12069:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>o});const t=JSON.parse('{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","source":"@site/versioned_docs/version-0.12.0/rules/redundant_dependency.md","sourceDirName":"rules","slug":"/rules/redundant_dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/redundant_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.0/rules/redundant_dependency.md","tags":[],"version":"0.12.0","frontMatter":{"id":"redundant_dependency","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/inherited_dependency"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.0/rules/overshot_dependency"}}');var i=d(23420),s=d(65404);const r={id:"redundant_dependency",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},a=void 0,l={},o=[];function c(e){const n={a:"a",admonition:"admonition",code:"code",mermaid:"mermaid",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.p,{children:"This rule creates a brittle dependency graph, because some necessary dependencies are only provided\ntransitively by other dependencies. Any manual changes to dependencies can have unexpected\nconsequences downstream."}),(0,i.jsxs)(n.p,{children:["This rule is ",(0,i.jsx)(n.strong,{children:"not recommended"})," and disabled by default, but it's still available for those who\nwant to keep their build files as small as possible."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finds project dependencies which are declared as ",(0,i.jsx)(n.code,{children:"api"})," in other dependency projects, but also\ndeclared in the current project. These dependencies can be removed without actually breaking the\nbuild, since they're still provided by an upstream dependency through the ",(0,i.jsx)(n.code,{children:"api"})," configuration."]}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n subgraph sg_redundant [A redundant graph]\n direction TB\n\n lib1_redundant(:lib-1):::depth0\n lib2_redundant(:lib-2):::depth1\n app_redundant(:app):::depth2\n\n app_redundant --\x3e |api| lib1_redundant\n app_redundant --\x3e |api| lib2_redundant\n\n lib2_redundant --\x3e |api| lib1_redundant\n end\n\n subgraph sg_minimalist [A graph with no redundancy]\n direction TB\n\n lib1_minimalist(:lib-1):::depth0\n lib2_minimalist(:lib-2):::depth1\n app_minimalist(:app):::depth2\n\n app_minimalist --\x3e |api| lib2_minimalist\n\n lib2_minimalist --\x3e |api| lib1_minimalist\n end\n\n style sg_redundant fill:#C66,stroke:#000,color:#FFF\n style sg_minimalist fill:#696,stroke:#000,color:#FFF\n\n sg_redundant --\x3e |./gradlew moduleCheck| sg_minimalist\n"}),"\n",(0,i.jsxs)(n.p,{children:["This is the opposite of the ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.0/rules/inherited_dependency",children:"inherited dependency"})," rule, which ensures a stable graph by explicitly\ndeclaring each dependency. ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.0/rules/inherited_dependency",children:"Inherited dependency"})," is enabled by default, and is the recommended\napproach. Both rules may not be enabled at the same time."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(c,{...e})}):c(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>r,x:()=>a});var t=d(36672);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e12d7f74.b33a1f87.js b/assets/js/e12d7f74.b33a1f87.js new file mode 100644 index 0000000000..2f3a3ef7cb --- /dev/null +++ b/assets/js/e12d7f74.b33a1f87.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9369],{62659:(e,n,d)=>{d.r(n),d.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>p,frontMatter:()=>r,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","source":"@site/versioned_docs/version-0.12.4/rules/redundant_dependency.md","sourceDirName":"rules","slug":"/rules/redundant_dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/redundant_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/redundant_dependency.md","tags":[],"version":"0.12.4","frontMatter":{"id":"redundant_dependency","slug":"/rules/redundant_dependency","title":"Redundant Dependency","sidebar_label":"Redundant Dependency"},"sidebar":"Docs","previous":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/inherited_dependency"},"next":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/overshot_dependency"}}');var i=d(23420),s=d(65404);const r={id:"redundant_dependency",slug:"/rules/redundant_dependency",title:"Redundant Dependency",sidebar_label:"Redundant Dependency"},a=void 0,l={},c=[];function o(e){const n={a:"a",admonition:"admonition",code:"code",mermaid:"mermaid",p:"p",strong:"strong",...(0,s.R)(),...e.components};return(0,i.jsxs)(i.Fragment,{children:[(0,i.jsxs)(n.admonition,{type:"caution",children:[(0,i.jsx)(n.p,{children:"This rule creates a brittle dependency graph, because some necessary dependencies are only provided\ntransitively by other dependencies. Any manual changes to dependencies can have unexpected\nconsequences downstream."}),(0,i.jsxs)(n.p,{children:["This rule is ",(0,i.jsx)(n.strong,{children:"not recommended"})," and disabled by default, but it's still available for those who\nwant to keep their build files as small as possible."]})]}),"\n",(0,i.jsxs)(n.p,{children:["Finds project dependencies which are declared as ",(0,i.jsx)(n.code,{children:"api"})," in other dependency projects, but also\ndeclared in the current project. These dependencies can be removed without actually breaking the\nbuild, since they're still provided by an upstream dependency through the ",(0,i.jsx)(n.code,{children:"api"})," configuration."]}),"\n",(0,i.jsx)(n.mermaid,{value:"flowchart LR\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n subgraph sg_redundant [A redundant graph]\n direction TB\n\n lib1_redundant(:lib-1):::depth0\n lib2_redundant(:lib-2):::depth1\n app_redundant(:app):::depth2\n\n app_redundant --\x3e |api| lib1_redundant\n app_redundant --\x3e |api| lib2_redundant\n\n lib2_redundant --\x3e |api| lib1_redundant\n end\n\n subgraph sg_minimalist [A graph with no redundancy]\n direction TB\n\n lib1_minimalist(:lib-1):::depth0\n lib2_minimalist(:lib-2):::depth1\n app_minimalist(:app):::depth2\n\n app_minimalist --\x3e |api| lib2_minimalist\n\n lib2_minimalist --\x3e |api| lib1_minimalist\n end\n\n style sg_redundant fill:#C66,stroke:#000,color:#FFF\n style sg_minimalist fill:#696,stroke:#000,color:#FFF\n\n sg_redundant --\x3e |./gradlew moduleCheck| sg_minimalist\n"}),"\n",(0,i.jsxs)(n.p,{children:["This is the opposite of the ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.4/rules/inherited_dependency",children:"inherited dependency"})," rule, which ensures a stable graph by explicitly\ndeclaring each dependency. ",(0,i.jsx)(n.a,{href:"/ModuleCheck/docs/0.12.4/rules/inherited_dependency",children:"Inherited dependency"})," is enabled by default, and is the recommended\napproach. Both rules may not be enabled at the same time."]})]})}function p(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,i.jsx)(n,{...e,children:(0,i.jsx)(o,{...e})}):o(e)}},65404:(e,n,d)=>{d.d(n,{R:()=>r,x:()=>a});var t=d(36672);const i={},s=t.createContext(i);function r(e){const n=t.useContext(s);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(i):e.components||i:r(e.components),t.createElement(s.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e4603b0e.3e5343b8.js b/assets/js/e4603b0e.3e5343b8.js new file mode 100644 index 0000000000..271492d0d1 --- /dev/null +++ b/assets/js/e4603b0e.3e5343b8.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[3108],{7357:(e,t,n)=>{n.d(t,{A:()=>s});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var o=n(23420);function s({children:e,hidden:t,className:n}){return(0,o.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},22513:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>u,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"<Tabs groupId=\\"language\\"","source":"@site/versioned_docs/version-0.12.5/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/configuration.mdx","tags":[],"version":"0.12.5","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/suppressing-findings"}}');var a=n(23420),o=n(65404),s=n(83796),l=n(7357);const u={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function f(e){const t={code:"code",pre:"pre",...(0,o.R)(),...e.components};return(0,a.jsxs)(s.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsx)(l.A,{value:"Kotlin",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'plugins {\n id("com.rickbusarow.module-check") version "0.13.0-SNAPSHOT"\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalCodeGenerators = listOf(\n modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n name = "My Processor",\n generatorMavenCoordinates = "my-project.codegen:processor",\n annotationNames = listOf(\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(l.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'plugins {\n id \'com.rickbusarow.module-check\' version \'0.13.0-SNAPSHOT\'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = [\':test:core-jvm\', \':test:core-android\']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [\':app\']\n\n additionalCodeGenerators = [\n new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n \'My Processor\',\n \'my-project.codegen:processor\',\n [\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n it.enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n it.outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n\n}\n'})})})]})}function p(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(f,{...e})}):f(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>s,x:()=>l});var r=n(36672);const a={},o=r.createContext(a);function s(e){const t=r.useContext(o);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function l(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:s(e.components),r.createElement(o.Provider,{value:t},e.children)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),o=n(58797),s=n(85291),l=n(52245),u=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function f(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,n])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,s.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,u.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,o=f(e),[s,u]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:o})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),g=(()=>{const e=i??m;return p({value:e,tabValues:o})?e:null})();(0,l.A)(()=>{g&&u(g)},[g]);return{selectedValue:s,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:o}))throw new Error(`Can't select invalid tab value=${e}`);u(e),d(e),b(e)},[d,b,o]),tabValues:o}}var b=n(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var y=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:s}){const l=[],{blockElementScrollPositionUntilNextRender:u}=(0,o.a_)(),i=e=>{const t=e.currentTarget,a=l.indexOf(t),o=s[a].value;o!==n&&(u(t),r(o))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=l.indexOf(e.currentTarget)+1;t=l[n]??l[0];break}case"ArrowLeft":{const n=l.indexOf(e.currentTarget)-1;t=l[n]??l[l.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:s.map(({value:e,label:t,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{l.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const o=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=o.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:o.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,y.jsx)(v,{...t,...e}),(0,y.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,y.jsx)(j,{...e,children:d(e.children)},String(t))}}}]); \ No newline at end of file diff --git a/assets/js/e480558e.6da81ca1.js b/assets/js/e480558e.6da81ca1.js new file mode 100644 index 0000000000..8dc1d44262 --- /dev/null +++ b/assets/js/e480558e.6da81ca1.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7107],{65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>i});var s=t(36672);const o={},u=s.createContext(o);function r(e){const n=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:n},e.children)}},78397:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","source":"@site/versioned_docs/version-0.12.1/rules/compiler/unused_kapt_plugin.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/compiler/unused_kapt_plugin.md","tags":[],"version":"0.12.1","frontMatter":{"id":"unused_kapt_plugin","slug":"/rules/unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers"}}');var o=t(23420),u=t(65404);const r={id:"unused_kapt_plugin",slug:"/rules/unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,l={},c=[];function p(e){const n={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(n.p,{children:["If there are no ",(0,o.jsx)(n.code,{children:"kapt"}),"/",(0,o.jsx)(n.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in\napplying the ",(0,o.jsx)(n.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function d(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}}}]); \ No newline at end of file diff --git a/assets/js/e4d3d2e1.0520673c.js b/assets/js/e4d3d2e1.0520673c.js new file mode 100644 index 0000000000..9b14feb0fd --- /dev/null +++ b/assets/js/e4d3d2e1.0520673c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1647],{65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}},79013:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.11.0/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.11.0/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/must_be_api.md","tags":[],"version":"0.11.0","frontMatter":{"id":"must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.11.0/rules/unused"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.11.0/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/e4f0c0bc.660ed59a.js b/assets/js/e4f0c0bc.660ed59a.js new file mode 100644 index 0000000000..572eab6e79 --- /dev/null +++ b/assets/js/e4f0c0bc.660ed59a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1338],{61546:(e,n,s)=>{s.r(n),s.d(n,{assets:()=>r,contentTitle:()=>c,default:()=>a,frontMatter:()=>o,metadata:()=>d,toc:()=>i});const d=JSON.parse('{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","source":"@site/versioned_docs/version-0.12.5/rules/unused_dependency.md","sourceDirName":"rules","slug":"/rules/unused_dependency","permalink":"/ModuleCheck/docs/rules/unused_dependency","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/unused_dependency.md","tags":[],"version":"0.12.5","frontMatter":{"id":"unused_dependency","slug":"/rules/unused_dependency","title":"Unused Dependency","sidebar_label":"Unused Dependency"},"sidebar":"Docs","previous":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/ci-workflow"},"next":{"title":"Must Be Api","permalink":"/ModuleCheck/docs/rules/must_be_api"}}');var t=s(23420),u=s(65404);const o={id:"unused_dependency",slug:"/rules/unused_dependency",title:"Unused Dependency",sidebar_label:"Unused Dependency"},c=void 0,r={},i=[];function l(e){const n={p:"p",...(0,u.R)(),...e.components};return(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(n.p,{children:"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead\nof building modules concurrently, Gradle must wait until the dependency module is built before\nbeginning to build the dependent one."}),"\n",(0,t.jsx)(n.p,{children:"ModuleCheck determines whether a dependency is unused by looking for all fully qualified names\ndeclared in its API, then searching the dependent module's code for references to any of those\nnames. If there are no references, the dependency module is considered to be unused."})]})}function a(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,t.jsx)(n,{...e,children:(0,t.jsx)(l,{...e})}):l(e)}},65404:(e,n,s)=>{s.d(n,{R:()=>o,x:()=>c});var d=s(36672);const t={},u=d.createContext(t);function o(e){const n=d.useContext(u);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function c(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(t):e.components||t:o(e.components),d.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e5eedb42.302cbb8a.js b/assets/js/e5eedb42.302cbb8a.js new file mode 100644 index 0000000000..7780447afc --- /dev/null +++ b/assets/js/e5eedb42.302cbb8a.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9568],{59921:(e,s,r)=>{r.r(s),r.d(s,{assets:()=>a,contentTitle:()=>t,default:()=>u,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","source":"@site/versioned_docs/version-0.12.4/rules/android/disable_android_resources.md","sourceDirName":"rules/android","slug":"/rules/disable_android_resources","permalink":"/ModuleCheck/docs/0.12.4/rules/disable_android_resources","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/android/disable_android_resources.md","tags":[],"version":"0.12.4","frontMatter":{"id":"disable_android_resources","slug":"/rules/disable_android_resources","title":"Disable Android Resources","sidebar_label":"Disable Android Resources"},"sidebar":"Docs","previous":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.4/rules/sort_plugins"},"next":{"title":"Disable ViewBinding","permalink":"/ModuleCheck/docs/0.12.4/rules/disable_view_binding"}}');var o=r(23420),d=r(65404);const i={id:"disable_android_resources",slug:"/rules/disable_android_resources",title:"Disable Android Resources",sidebar_label:"Disable Android Resources"},t=void 0,a={},c=[];function l(e){const s={code:"code",p:"p",pre:"pre",...(0,d.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsxs)(s.p,{children:["If an Android module doesn't actually have any resources in the ",(0,o.jsx)(s.code,{children:"src/__/res"})," directory,\nthen ",(0,o.jsx)(s.code,{children:"android.buildFeatures.androidResources"})," can be disabled."]}),"\n",(0,o.jsx)(s.pre,{children:(0,o.jsx)(s.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n androidResource = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:s}={...(0,d.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}},65404:(e,s,r)=>{r.d(s,{R:()=>i,x:()=>t});var n=r(36672);const o={},d=n.createContext(o);function i(e){const s=n.useContext(d);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function t(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(d.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e69e4b95.4f61ca79.js b/assets/js/e69e4b95.4f61ca79.js new file mode 100644 index 0000000000..3a7dffa6cb --- /dev/null +++ b/assets/js/e69e4b95.4f61ca79.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2880],{55079:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>l,contentTitle:()=>r,default:()=>u,frontMatter:()=>o,metadata:()=>d,toc:()=>a});const d=JSON.parse('{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/docs/rules/android/disable_view_binding.md","sourceDirName":"rules/android","slug":"/rules/disable_view_binding","permalink":"/ModuleCheck/docs/next/rules/disable_view_binding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/docs/rules/android/disable_view_binding.md","tags":[],"version":"current","frontMatter":{"id":"disable_view_binding","slug":"/rules/disable_view_binding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/next/rules/disable_android_resources"},"next":{"title":"Unused Kotlin Android Extensions","permalink":"/ModuleCheck/docs/next/rules/unused_kotlin_android_extensions"}}');var s=i(23420),t=i(65404);const o={id:"disable_view_binding",slug:"/rules/disable_view_binding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,l={},a=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,t.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}},65404:(e,n,i)=>{i.d(n,{R:()=>o,x:()=>r});var d=i(36672);const s={},t=d.createContext(s);function o(e){const n=d.useContext(t);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:o(e.components),d.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e7f8ca4b.e49f8895.js b/assets/js/e7f8ca4b.e49f8895.js new file mode 100644 index 0000000000..32d505efc1 --- /dev/null +++ b/assets/js/e7f8ca4b.e49f8895.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[575],{50353:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>d,contentTitle:()=>c,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","source":"@site/versioned_docs/version-0.12.3/rules/sorting/sort_dependencies.md","sourceDirName":"rules/sorting","slug":"/rules/sort_dependencies","permalink":"/ModuleCheck/docs/0.12.3/rules/sort_dependencies","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/sorting/sort_dependencies.md","tags":[],"version":"0.12.3","frontMatter":{"id":"sort_dependencies","slug":"/rules/sort_dependencies","title":"Sort Dependencies","sidebar_label":"Sort Dependencies"},"sidebar":"Docs","previous":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers"},"next":{"title":"Sort Plugins","permalink":"/ModuleCheck/docs/0.12.3/rules/sort_plugins"}}');var r=s(23420),o=s(65404);const i={id:"sort_dependencies",slug:"/rules/sort_dependencies",title:"Sort Dependencies",sidebar_label:"Sort Dependencies"},c=void 0,d={},u=[];function l(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:t}={...(0,o.R)(),...e.components};return t?(0,r.jsx)(t,{...e,children:(0,r.jsx)(l,{...e})}):l()}},65404:(e,t,s)=>{s.d(t,{R:()=>i,x:()=>c});var n=s(36672);const r={},o=n.createContext(r);function i(e){const t=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/e819ef22.1f7644ac.js b/assets/js/e819ef22.1f7644ac.js new file mode 100644 index 0000000000..c03cdb54b1 --- /dev/null +++ b/assets/js/e819ef22.1f7644ac.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[247],{16240:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.12.0","label":"0.12.0","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.12.0","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.12.0/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.12.0/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/0.12.0/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/0.12.0/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.12.0/rules/unused","docId":"rules/unused","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.12.0/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.12.0/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/0.12.0/rules/redundant_dependency","docId":"rules/redundant_dependency","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/0.12.0/rules/overshot_dependency","docId":"rules/overshot_dependency","unlisted":false},{"type":"link","label":"Depths","href":"/ModuleCheck/docs/0.12.0/rules/depths","docId":"rules/depths","unlisted":false},{"type":"category","label":"Compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory","href":"/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory","docId":"rules/compiler/could_use_anvil_factory","unlisted":false}],"collapsible":true},{"type":"category","label":"Kapt","collapsed":false,"items":[{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor","docId":"rules/kapt/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin","docId":"rules/kapt/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers","docId":"rules/kapt/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.12.0/rules/android/disable_resources","docId":"rules/android/disable_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding","docId":"rules/android/disable_viewbinding","unlisted":false},{"type":"link","label":"Unused Kotlin Android Extensions","href":"/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensions","docId":"rules/android/unused_kotlin_android_extensions","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"Dependencies","sidebar":"Docs"},"rules/android/disable_resources":{"id":"rules/android/disable_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_viewbinding":{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/android/unused_kotlin_android_extensions":{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","sidebar":"Docs"},"rules/compiler/could_use_anvil_factory":{"id":"rules/compiler/could_use_anvil_factory","title":"Could Use Anvil Factory","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/depths":{"id":"rules/depths","title":"Depths","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/kapt/custom_kapt_matchers":{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/kapt/unused_kapt_plugin":{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","sidebar":"Docs"},"rules/kapt/unused_kapt_processor":{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/overshot_dependency":{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","sidebar":"Docs"},"rules/redundant_dependency":{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused":{"id":"rules/unused","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/e8303188.d53d0160.js b/assets/js/e8303188.d53d0160.js new file mode 100644 index 0000000000..51c7ee7de4 --- /dev/null +++ b/assets/js/e8303188.d53d0160.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6545],{65404:(e,n,i)=>{i.d(n,{R:()=>t,x:()=>r});var d=i(36672);const s={},o=d.createContext(s);function t(e){const n=d.useContext(o);return d.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function r(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:t(e.components),d.createElement(o.Provider,{value:n},e.children)}},89097:(e,n,i)=>{i.r(n),i.d(n,{assets:()=>a,contentTitle:()=>r,default:()=>u,frontMatter:()=>t,metadata:()=>d,toc:()=>l});const d=JSON.parse('{"id":"rules/android/disable_viewbinding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","source":"@site/versioned_docs/version-0.11.3/rules/android/disable_viewbinding.md","sourceDirName":"rules/android","slug":"/rules/android/disable_viewbinding","permalink":"/ModuleCheck/docs/0.11.3/rules/android/disable_viewbinding","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/android/disable_viewbinding.md","tags":[],"version":"0.11.3","frontMatter":{"id":"disable_viewbinding","title":"Disable ViewBinding","sidebar_label":"Disable ViewBinding"},"sidebar":"Docs","previous":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.3/rules/android/disable_resources"}}');var s=i(23420),o=i(65404);const t={id:"disable_viewbinding",title:"Disable ViewBinding",sidebar_label:"Disable ViewBinding"},r=void 0,a={},l=[];function c(e){const n={code:"code",p:"p",pre:"pre",...(0,o.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsxs)(n.p,{children:["If an Android module has ",(0,s.jsx)(n.code,{children:"viewBinding"})," enabled, but doesn't contribute any generated ",(0,s.jsx)(n.code,{children:"____Binding"}),"\nobjects from layout files which are actually used, then ",(0,s.jsx)(n.code,{children:"viewBinding"})," can be disabled."]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",children:"android {\n buildFeatures {\n viewBinding = false\n }\n}\n"})})]})}function u(e={}){const{wrapper:n}={...(0,o.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(c,{...e})}):c(e)}}}]); \ No newline at end of file diff --git a/assets/js/eadc19b4.06a401e4.js b/assets/js/eadc19b4.06a401e4.js new file mode 100644 index 0000000000..57b039c939 --- /dev/null +++ b/assets/js/eadc19b4.06a401e4.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2946],{65404:(e,t,s)=>{s.d(t,{R:()=>a,x:()=>c});var n=s(36672);const o={},r=n.createContext(o);function a(e){const t=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function c(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:a(e.components),n.createElement(r.Provider,{value:t},e.children)}},94064:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>c,default:()=>p,frontMatter:()=>a,metadata:()=>n,toc:()=>u});const n=JSON.parse('{"id":"rules/kapt/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.11.0/rules/kapt/custom_kapt_matchers.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.0/rules/kapt/custom_kapt_matchers.md","tags":[],"version":"0.11.0","frontMatter":{"id":"custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies"}}');var o=s(23420),r=s(65404);const a={id:"custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},c=void 0,i={},u=[];function l(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,o.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,o.jsx)(t.pre,{children:(0,o.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function p(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(l,{...e})}):l(e)}}}]); \ No newline at end of file diff --git a/assets/js/eb10ccf4.83c5f603.js b/assets/js/eb10ccf4.83c5f603.js new file mode 100644 index 0000000000..5b63c5d74e --- /dev/null +++ b/assets/js/eb10ccf4.83c5f603.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[629],{49642:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.12.1/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sort_plugins","permalink":"/ModuleCheck/docs/0.12.1/rules/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/sorting/sort_plugins.md","tags":[],"version":"0.12.1","frontMatter":{"id":"sort_plugins","slug":"/rules/sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.1/rules/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.12.1/rules/disable_android_resources"}}');var r=t(23420),o=t(65404);const i={id:"sort_plugins",slug:"/rules/sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,r.jsx)(r.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,o.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const r={},o=n.createContext(r);function i(e){const s=n.useContext(o);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:i(e.components),n.createElement(o.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/eb678835.77a07c94.js b/assets/js/eb678835.77a07c94.js new file mode 100644 index 0000000000..58199c8790 --- /dev/null +++ b/assets/js/eb678835.77a07c94.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7671],{5277:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>l,contentTitle:()=>i,default:()=>d,frontMatter:()=>r,metadata:()=>s,toc:()=>c});const s=JSON.parse('{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","source":"@site/versioned_docs/version-0.12.5/rules/compiler/unused_kapt_plugin.md","sourceDirName":"rules/compiler","slug":"/rules/unused_kapt_plugin","permalink":"/ModuleCheck/docs/rules/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/compiler/unused_kapt_plugin.md","tags":[],"version":"0.12.5","frontMatter":{"id":"unused_kapt_plugin","slug":"/rules/unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/rules/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/rules/custom_kapt_matchers"}}');var o=t(23420),u=t(65404);const r={id:"unused_kapt_plugin",slug:"/rules/unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,l={},c=[];function p(e){const n={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(n.p,{children:["If there are no ",(0,o.jsx)(n.code,{children:"kapt"}),"/",(0,o.jsx)(n.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in\napplying the ",(0,o.jsx)(n.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function d(e={}){const{wrapper:n}={...(0,u.R)(),...e.components};return n?(0,o.jsx)(n,{...e,children:(0,o.jsx)(p,{...e})}):p(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>r,x:()=>i});var s=t(36672);const o={},u=s.createContext(o);function r(e){const n=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ede96f45.33a1ab35.js b/assets/js/ede96f45.33a1ab35.js new file mode 100644 index 0000000000..77d7ca13b7 --- /dev/null +++ b/assets/js/ede96f45.33a1ab35.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1007],{7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const s={tabItem:"tabItem_qogc"};var a=t(23420);function i({children:e,hidden:n,className:t}){return(0,a.jsx)("div",{role:"tabpanel",className:(0,r.A)(s.tabItem,t),hidden:n,children:e})}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const s={},a=r.createContext(s);function i(e){const n=r.useContext(a);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(s):e.components||s:i(e.components),r.createElement(a.Provider,{value:n},e.children)}},83796:(e,n,t)=>{t.d(n,{A:()=>x});var r=t(36672),s=t(13526),a=t(58797),i=t(85291),o=t(52245),l=t(32342),u=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),s=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(s),(0,r.useCallback)(e=>{if(!s)return;const n=new URLSearchParams(t.location.search);n.set(s,e),t.replace({...t.location,search:n.toString()})},[s,t])]}function m(e){const{defaultValue:n,queryString:t=!1,groupId:s}=e,a=p(e),[i,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:a})),[u,d]=f({queryString:t,groupId:s}),[m,b]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,s]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&s.set(e)},[n,s])]}({groupId:s}),g=(()=>{const e=u??m;return h({value:e,tabValues:a})?e:null})();(0,o.A)(()=>{g&&l(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:a}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,a]),tabValues:a}}var b=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,a.a_)(),u=e=>{const n=e.currentTarget,s=o.indexOf(n),a=i[s].value;a!==t&&(l(n),r(a))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,s.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...r,className:(0,s.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const a=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=a.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,s.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:a.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=m(e);return(0,v.jsxs)("div",{className:(0,s.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function x(e){const n=(0,b.A)();return(0,v.jsx)(w,{...e,children:d(e.children)},String(n))}},95838:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/versioned_docs/version-0.12.3/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/0.12.3/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/suppressing-findings.mdx","tags":[],"version":"0.12.3","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/0.12.3/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/0.12.3/ci-workflow"}}');var s=t(23420),a=t(65404),i=t(83796),o=t(7357);const l={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},u=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,a.R)(),...e.components};return(0,s.jsxs)(s.Fragment,{children:[(0,s.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,s.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,s.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,s.jsxs)(i.A,{children:[(0,s.jsx)(o.A,{value:"Kotlin",default:!0,children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("must-be-api") // don\'t switch anything to an api config\ndependencies {\n\n @Suppress("unused-dependency") // don\'t comment out or delete this dependency\n implementation(project(":unused-lib"))\n\n @Suppress("inherited-dependency") // don\'t add dependencies which are inherited from this library\n implementation(project(":leaky"))\n}\n'})})}),(0,s.jsx)(o.A,{value:"Groovy",children:(0,s.jsx)(n.pre,{children:(0,s.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection must-be-api\ndependencies {\n\n // don\'t comment out or delete this dependency\n //noinspection unused-dependency\n implementation(project(":unused-lib"))\n\n // don\'t add dependencies which are inherited from this library\n //noinspection inherited-dependency\n implementation(project(":leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,a.R)(),...e.components};return n?(0,s.jsx)(n,{...e,children:(0,s.jsx)(p,{...e})}):p(e)}}}]); \ No newline at end of file diff --git a/assets/js/ef09bccd.a990ad2c.js b/assets/js/ef09bccd.a990ad2c.js new file mode 100644 index 0000000000..fb8d7afaef --- /dev/null +++ b/assets/js/ef09bccd.a990ad2c.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6823],{17135:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.12.3/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.12.3/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.3/rules/must_be_api.md","tags":[],"version":"0.12.3","frontMatter":{"id":"must_be_api","slug":"/rules/must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/unused_dependency"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.3/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",slug:"/rules/must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}},65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/ef46515e.0b72d5b5.js b/assets/js/ef46515e.0b72d5b5.js new file mode 100644 index 0000000000..10af18ed5e --- /dev/null +++ b/assets/js/ef46515e.0b72d5b5.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[2852],{7357:(e,t,n)=>{n.d(t,{A:()=>o});n(36672);var r=n(13526);const a={tabItem:"tabItem_qogc"};var s=n(23420);function o({children:e,hidden:t,className:n}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,n),hidden:t,children:e})}},58114:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"configuration","title":"configuration","description":"","source":"@site/versioned_docs/version-0.12.1/configuration.mdx","sourceDirName":".","slug":"/configuration","permalink":"/ModuleCheck/docs/0.12.1/configuration","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/configuration.mdx","tags":[],"version":"0.12.1","frontMatter":{"id":"configuration","sidebar_label":"Configuration"},"sidebar":"Docs","previous":{"title":"Quick Start","permalink":"/ModuleCheck/docs/0.12.1/"},"next":{"title":"Suppressing Findings","permalink":"/ModuleCheck/docs/0.12.1/suppressing-findings"}}');var a=n(23420),s=n(65404),o=n(83796),u=n(7357);const l={id:"configuration",sidebar_label:"Configuration"},i=void 0,c={},d=[];function f(e){const t={code:"code",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(o.A,{children:[(0,a.jsx)(u.A,{value:"Kotlin",default:!0,children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-kotlin",metastring:'title="root/build.gradle.kts"',children:'plugins {\n id("com.rickbusarow.module-check") version "0.12.1"\n}\n\nmoduleCheck {\n\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = setOf(":app")\n\n additionalCodeGenerators = listOf(\n modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n name = "My Processor",\n generatorMavenCoordinates = "my-project.codegen:processor",\n annotationNames = listOf(\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n )\n )\n )\n\n reports {\n checkstyle {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n enabled = true // default is false\n outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n}\n'})})}),(0,a.jsx)(u.A,{value:"Groovy",children:(0,a.jsx)(t.pre,{children:(0,a.jsx)(t.code,{className:"language-groovy",metastring:'title="root/build.gradle"',children:'plugins {\n id \'com.rickbusarow.module-check\' version \'0.12.1\'\n}\n\nmoduleCheck {\n deleteUnused = true // default is false\n\n checks {\n overShotDependency = true // default is true\n redundantDependency = false // default is false\n unusedDependency = true // default is true\n mustBeApi = true // default is true\n inheritedDependency = true // default is true\n sortDependencies = false // default is false\n sortPlugins = false // default is false\n unusedKapt = true // default is true\n anvilFactoryGeneration = true // default is true\n disableAndroidResources = false // default is false\n disableViewBinding = false // default is false\n unusedKotlinAndroidExtensions = false // default is false\n depths = false // default is false\n }\n\n // allow these modules to be declared as dependency anywhere,\n // regardless of whether they\'re used\n ignoreUnusedFinding = [\':test:core-jvm\', \':test:core-android\']\n\n // do not check the dependencies of these modules.\n // in this case, :app could declare any module it wants without issue\n doNotCheck = [\':app\']\n\n additionalCodeGenerators = [\n new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(\n \'My Processor\',\n \'my-project.codegen:processor\',\n [\n "myproject.MyInject",\n "myproject.MyInject.Factory",\n "myproject.MyInjectParam",\n "myproject.MyInjectModule"\n ]\n )\n ]\n\n reports {\n checkstyle {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"\n }\n sarif {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"\n }\n depths {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"\n }\n graphs {\n it.enabled = true // default is false\n // The root directory of all generated graphs. If set, directories will be created\n // for each module, mirroring the structure of the project. If this property is null,\n // graphs will be created in the `build/reports/modulecheck/graphs/` relative\n // directory of each project.\n it.outputDir = "${project.buildDir}/reports/modulecheck/graphs"\n }\n text {\n it.enabled = true // default is false\n it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt"\n }\n }\n\n}\n'})})})]})}function p(e={}){const{wrapper:t}={...(0,s.R)(),...e.components};return t?(0,a.jsx)(t,{...e,children:(0,a.jsx)(f,{...e})}):f(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>o,x:()=>u});var r=n(36672);const a={},s=r.createContext(a);function o(e){const t=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function u(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:o(e.components),r.createElement(s.Provider,{value:t},e.children)}},83796:(e,t,n)=>{n.d(t,{A:()=>w});var r=n(36672),a=n(13526),s=n(58797),o=n(85291),u=n(52245),l=n(32342),i=n(45223),c=n(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:t}=e;return!!t&&"object"==typeof t&&"value"in t}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function f(e){const{values:t,children:n}=e;return(0,r.useMemo)(()=>{const e=t??function(e){return d(e).map(({props:{value:e,label:t,attributes:n,default:r}})=>({value:e,label:t,attributes:n,default:r}))}(n);return function(e){const t=(0,i.XI)(e,(e,t)=>e.value===t.value);if(t.length>0)throw new Error(`Docusaurus error: Duplicate values "${t.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[t,n])}function p({value:e,tabValues:t}){return t.some(t=>t.value===e)}function h({queryString:e=!1,groupId:t}){const n=(0,o.W6)(),a=function({queryString:e=!1,groupId:t}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:e,groupId:t});return[(0,l.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const t=new URLSearchParams(n.location.search);t.set(a,e),n.replace({...n.location,search:t.toString()})},[a,n])]}function m(e){const{defaultValue:t,queryString:n=!1,groupId:a}=e,s=f(e),[o,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:t}){if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!p({value:e,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:t,tabValues:s})),[i,d]=h({queryString:n,groupId:a}),[m,b]=function({groupId:e}){const t=function(e){return e?`docusaurus.tab.${e}`:null}(e),[n,a]=(0,c.Dv)(t);return[n,(0,r.useCallback)(e=>{t&&a.set(e)},[t,a])]}({groupId:a}),g=(()=>{const e=i??m;return p({value:e,tabValues:s})?e:null})();(0,u.A)(()=>{g&&l(g)},[g]);return{selectedValue:o,selectValue:(0,r.useCallback)(e=>{if(!p({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),b(e)},[d,b,s]),tabValues:s}}var b=n(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var y=n(23420);function v({className:e,block:t,selectedValue:n,selectValue:r,tabValues:o}){const u=[],{blockElementScrollPositionUntilNextRender:l}=(0,s.a_)(),i=e=>{const t=e.currentTarget,a=u.indexOf(t),s=o[a].value;s!==n&&(l(t),r(s))},c=e=>{let t=null;switch(e.key){case"Enter":i(e);break;case"ArrowRight":{const n=u.indexOf(e.currentTarget)+1;t=u[n]??u[0];break}case"ArrowLeft":{const n=u.indexOf(e.currentTarget)-1;t=u[n]??u[u.length-1];break}}t?.focus()};return(0,y.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":t},e),children:o.map(({value:e,label:t,attributes:r})=>(0,y.jsx)("li",{role:"tab",tabIndex:n===e?0:-1,"aria-selected":n===e,ref:e=>{u.push(e)},onKeyDown:c,onClick:i,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":n===e}),children:t??e},e))})}function k({lazy:e,children:t,selectedValue:n}){const s=(Array.isArray(t)?t:[t]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===n);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,y.jsx)("div",{className:"margin-top--md",children:s.map((e,t)=>(0,r.cloneElement)(e,{key:t,hidden:e.props.value!==n}))})}function j(e){const t=m(e);return(0,y.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,y.jsx)(v,{...t,...e}),(0,y.jsx)(k,{...t,...e})]})}function w(e){const t=(0,b.A)();return(0,y.jsx)(j,{...e,children:d(e.children)},String(t))}}}]); \ No newline at end of file diff --git a/assets/js/f354998b.75ea0a3d.js b/assets/js/f354998b.75ea0a3d.js new file mode 100644 index 0000000000..bb1c3a37ff --- /dev/null +++ b/assets/js/f354998b.75ea0a3d.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6673],{45247:(e,n,l)=>{l.r(n),l.d(n,{assets:()=>c,contentTitle:()=>i,default:()=>p,frontMatter:()=>d,metadata:()=>s,toc:()=>o});const s=JSON.parse('{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","source":"@site/versioned_docs/version-0.12.4/rules/project_depth.md","sourceDirName":"rules","slug":"/rules/project_depth","permalink":"/ModuleCheck/docs/0.12.4/rules/project_depth","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/project_depth.md","tags":[],"version":"0.12.4","frontMatter":{"id":"project_depth","slug":"/rules/project_depth","title":"Project Depth","sidebar_label":"Project Depth"},"sidebar":"Docs","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.12.4/rules/overshot_dependency"},"next":{"title":"Could Use Anvil Factory Generation","permalink":"/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation"}}');var r=l(23420),t=l(65404);const d={id:"project_depth",slug:"/rules/project_depth",title:"Project Depth",sidebar_label:"Project Depth"},i=void 0,c={},o=[{value:"Dependencies and Build Concurrency",id:"dependencies-and-build-concurrency",level:3},{value:"Depth",id:"depth",level:3}];function h(e){const n={a:"a",code:"code",em:"em",h3:"h3",hr:"hr",li:"li",mermaid:"mermaid",p:"p",strong:"strong",ul:"ul",...(0,t.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(n.p,{children:"TL;DR - Low depth values mean faster builds and better all-around scalability."}),"\n",(0,r.jsx)(n.hr,{}),"\n",(0,r.jsxs)(n.p,{children:["It's often useful to think of module dependencies as a directed tree\nor ",(0,r.jsx)(n.a,{href:"https://en.wikipedia.org/wiki/Directed_acyclic_graph",children:"directed acyclic graph"}),". If a module is a\nnode, then each module dependency is a child node, and the dependencies of those dependencies are\ngrand-child nodes."]}),"\n",(0,r.jsxs)(n.p,{children:["This is especially useful when thinking about ",(0,r.jsx)(n.strong,{children:"build performance"}),", because the parent-child\nrelationship is clear: ",(0,r.jsx)(n.em,{children:"child nodes must build before parent nodes"}),"."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(:app):::depth2\n\n screen1(:screen-1):::depth1\n screen2(:screen-2):::depth1\n\n lib1(:lib-1):::depth0\n lib2(:lib-2):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n\n screen1 --\x3e lib1\n screen1 --\x3e lib2\n screen2 --\x3e lib2"}),"\n",(0,r.jsx)(n.p,{children:"In the above example,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," must be built before ",(0,r.jsx)(n.code,{children:":screen-1"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-2"})," must be build before ",(0,r.jsx)(n.code,{children:":screen-2"}),"."]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":screen-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," must be built before ",(0,r.jsx)(n.code,{children:":app"}),"."]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build\nbefore their parents."}),"\n",(0,r.jsx)(n.h3,{id:"dependencies-and-build-concurrency",children:"Dependencies and Build Concurrency"}),"\n",(0,r.jsx)(n.p,{children:"Individual module builds are always done single-threaded, but multiple modules may build in parallel\nso long as no module in the set depends upon another module in that set. In the above graph,"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":lib-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":lib-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n",(0,r.jsxs)(n.li,{children:[(0,r.jsx)(n.code,{children:":scren-1"})," and ",(0,r.jsx)(n.code,{children:":screen-2"})," may build in parallel"]}),"\n"]}),"\n",(0,r.jsx)(n.p,{children:"The maximum number of parallel module builds is determined by the structure of the dependency graph\nand the number of available processor cores on the machine which is performing the build."}),"\n",(0,r.jsx)(n.h3,{id:"depth",children:"Depth"}),"\n",(0,r.jsxs)(n.p,{children:[(0,r.jsx)(n.strong,{children:"Depth"})," refers to the maximum number of edges between a module and each of its leaf nodes in the\nproject dependency graph."]}),"\n",(0,r.jsx)(n.p,{children:"Low depth values indicate a shallow or flat project structure with loose (or no) coupling between\nmodules. In a full build, these projects scale well with hardware upgrades because they're able to\nbuild all those independent modules in parallel."}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n subgraph sg [A shallow graph]\n direction TB\n\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 2):::depth2\n\n screen1(depth: 1):::depth1\n screen2(depth: 1):::depth1\n screen3(depth: 1):::depth1\n screen4(depth: 1):::depth1\n\n lib1(depth: 0):::depth0\n lib2(depth: 0):::depth0\n lib3(depth: 0):::depth0\n lib4(depth: 0):::depth0\n lib5(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e lib1\n screen1 --\x3e lib4\n\n screen2 --\x3e lib1\n screen2 --\x3e lib3\n screen2 --\x3e lib4\n\n screen3 --\x3e lib2\n screen3 --\x3e lib3\n screen3 --\x3e lib4\n\n screen4 --\x3e lib3\n screen4 --\x3e lib5\n\n end\n\n style sg opacity:0.0\n"}),"\n",(0,r.jsxs)(n.p,{children:['On the other hand, "deep" projects do not offer many opportunities for parallelization. They have\nproject dependencies which must be built ',(0,r.jsx)(n.em,{children:"sequentially"}),". They also perform poorly in incremental\nbuilds, because a single change to even a mid-level module invalidates cached builds for half of the\nproject."]}),"\n",(0,r.jsx)(n.mermaid,{value:"flowchart TB\n\n style sg opacity:0.0\n subgraph sg [A deep graph]\n direction TB\n\n classDef depth6 fill:#800,stroke:#000,color:#FFF\n classDef depth5 fill:#A50,stroke:#000,color:#FFF\n classDef depth4 fill:#C0B,stroke:#000,color:#000\n classDef depth3 fill:#F7B,stroke:#000,color:#000\n classDef depth2 fill:#BBF,stroke:#000,color:#000\n classDef depth1 fill:#B9B,stroke:#000,color:#000\n classDef depth0 fill:#FBB,stroke:#000,color:#000\n\n linkStyle default stroke-width:2px,fill:none,stroke:green;\n\n app(depth: 6):::depth6\n\n screen1(depth: 5):::depth5\n screen2(depth: 5):::depth5\n\n screen3(depth: 4):::depth4\n screen4(depth: 4):::depth4\n\n lib1(depth: 3):::depth3\n lib2(depth: 3):::depth3\n\n lib3(depth: 2):::depth2\n lib4(depth: 2):::depth2\n\n lib5(depth: 1):::depth1\n\n lib6(depth: 0):::depth0\n\n app --\x3e screen1\n app --\x3e screen2\n app --\x3e screen3\n app --\x3e screen4\n\n screen1 --\x3e screen3\n screen1 --\x3e screen4\n\n screen2 --\x3e screen4\n\n screen3 --\x3e lib1\n screen3 --\x3e lib2\n\n screen4 --\x3e lib1\n screen4 --\x3e lib4\n\n lib1 --\x3e lib3\n lib1 --\x3e lib4\n\n lib2 --\x3e lib3\n\n lib3 --\x3e lib5\n lib4 --\x3e lib5\n\n lib5 --\x3e lib6\n\n end\n"})]})}function p(e={}){const{wrapper:n}={...(0,t.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},65404:(e,n,l)=>{l.d(n,{R:()=>d,x:()=>i});var s=l(36672);const r={},t=s.createContext(r);function d(e){const n=s.useContext(t);return s.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function i(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:d(e.components),s.createElement(t.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f399bb6f.cf5dbf41.js b/assets/js/f399bb6f.cf5dbf41.js new file mode 100644 index 0000000000..0e23f9e505 --- /dev/null +++ b/assets/js/f399bb6f.cf5dbf41.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[6884],{62826:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>a,contentTitle:()=>i,default:()=>l,frontMatter:()=>r,metadata:()=>s,toc:()=>p});const s=JSON.parse('{"id":"rules/kapt/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in applying","source":"@site/versioned_docs/version-0.11.2/rules/kapt/unused_kapt_plugin.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_plugin","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.2/rules/kapt/unused_kapt_plugin.md","tags":[],"version":"0.11.2","frontMatter":{"id":"unused_kapt_plugin","title":"Unused Kapt Plugin","sidebar_label":"Unused Kapt Plugin"},"sidebar":"Docs","previous":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor"},"next":{"title":"Custom Kapt Matchers","permalink":"/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers"}}');var o=n(23420),u=n(65404);const r={id:"unused_kapt_plugin",title:"Unused Kapt Plugin",sidebar_label:"Unused Kapt Plugin"},i=void 0,a={},p=[];function c(e){const t={code:"code",p:"p",...(0,u.R)(),...e.components};return(0,o.jsxs)(t.p,{children:["If there are no ",(0,o.jsx)(t.code,{children:"kapt"}),"/",(0,o.jsx)(t.code,{children:"kaptTest"}),"/etc. processor dependencies in a module, there's no point in applying\nthe ",(0,o.jsx)(t.code,{children:"org.jetbrains.kotlin.kapt"})," plugin."]})}function l(e={}){const{wrapper:t}={...(0,u.R)(),...e.components};return t?(0,o.jsx)(t,{...e,children:(0,o.jsx)(c,{...e})}):c(e)}},65404:(e,t,n)=>{n.d(t,{R:()=>r,x:()=>i});var s=n(36672);const o={},u=s.createContext(o);function r(e){const t=s.useContext(u);return s.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function i(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:r(e.components),s.createElement(u.Provider,{value:t},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/f435945d.9f0f3574.js b/assets/js/f435945d.9f0f3574.js new file mode 100644 index 0000000000..6034461035 --- /dev/null +++ b/assets/js/f435945d.9f0f3574.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[7509],{7357:(e,n,t)=>{t.d(n,{A:()=>i});t(36672);var r=t(13526);const a={tabItem:"tabItem_qogc"};var s=t(23420);function i({children:e,hidden:n,className:t}){return(0,s.jsx)("div",{role:"tabpanel",className:(0,r.A)(a.tabItem,t),hidden:n,children:e})}},52767:(e,n,t)=>{t.r(n),t.d(n,{assets:()=>c,contentTitle:()=>u,default:()=>h,frontMatter:()=>l,metadata:()=>r,toc:()=>d});const r=JSON.parse('{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","source":"@site/versioned_docs/version-0.12.5/suppressing-findings.mdx","sourceDirName":".","slug":"/suppressing-findings","permalink":"/ModuleCheck/docs/suppressing-findings","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/suppressing-findings.mdx","tags":[],"version":"0.12.5","frontMatter":{"id":"suppressing-findings","title":"Suppressing Findings","sidebar_label":"Suppressing Findings"},"sidebar":"Docs","previous":{"title":"Configuration","permalink":"/ModuleCheck/docs/configuration"},"next":{"title":"CI Workflow","permalink":"/ModuleCheck/docs/ci-workflow"}}');var a=t(23420),s=t(65404),i=t(83796),o=t(7357);const l={id:"suppressing-findings",title:"Suppressing Findings",sidebar_label:"Suppressing Findings"},u=void 0,c={},d=[];function p(e){const n={code:"code",p:"p",pre:"pre",...(0,s.R)(),...e.components};return(0,a.jsxs)(a.Fragment,{children:[(0,a.jsx)(n.p,{children:"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool."}),"\n",(0,a.jsxs)(n.p,{children:["The name of the check to disable can be found in the ",(0,a.jsx)(n.code,{children:"name"})," column of console output:"]}),"\n",(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{children:"> Task :moduleCheck\nModuleCheck found 3 issues in 6.157 seconds\n\n:app\n dependency name build file\n :fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):\n :unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):\n\n"})}),"\n",(0,a.jsxs)(i.A,{groupId:"language",defaultValue:"Kotlin",values:[{label:"Kotlin",value:"Kotlin"},{label:"Groovy",value:"Groovy"}],children:[(0,a.jsx)(o.A,{value:"Kotlin",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-kotlin",metastring:'title="build.gradle.kts"',children:'@Suppress("must-be-api") // don\'t switch anything to an api config\ndependencies {\n\n @Suppress("unused-dependency") // don\'t comment out or delete this dependency\n implementation(project(":unused-lib"))\n\n @Suppress("inherited-dependency") // don\'t add dependencies which are inherited from this library\n implementation(project(":leaky"))\n}\n'})})}),(0,a.jsx)(o.A,{value:"Groovy",children:(0,a.jsx)(n.pre,{children:(0,a.jsx)(n.code,{className:"language-groovy",metastring:'title="build.gradle"',children:'// don\'t switch anything to an api config\n//noinspection must-be-api\ndependencies {\n\n // don\'t comment out or delete this dependency\n //noinspection unused-dependency\n implementation(project(":unused-lib"))\n\n // don\'t add dependencies which are inherited from this library\n //noinspection inherited-dependency\n implementation(project(":leaky"))\n}\n'})})})]})]})}function h(e={}){const{wrapper:n}={...(0,s.R)(),...e.components};return n?(0,a.jsx)(n,{...e,children:(0,a.jsx)(p,{...e})}):p(e)}},65404:(e,n,t)=>{t.d(n,{R:()=>i,x:()=>o});var r=t(36672);const a={},s=r.createContext(a);function i(e){const n=r.useContext(s);return r.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function o(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(a):e.components||a:i(e.components),r.createElement(s.Provider,{value:n},e.children)}},83796:(e,n,t)=>{t.d(n,{A:()=>x});var r=t(36672),a=t(13526),s=t(58797),i=t(85291),o=t(52245),l=t(32342),u=t(45223),c=t(1771);function d(e){return r.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,r.isValidElement)(e)&&function(e){const{props:n}=e;return!!n&&"object"==typeof n&&"value"in n}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:n,children:t}=e;return(0,r.useMemo)(()=>{const e=n??function(e){return d(e).map(({props:{value:e,label:n,attributes:t,default:r}})=>({value:e,label:n,attributes:t,default:r}))}(t);return function(e){const n=(0,u.XI)(e,(e,n)=>e.value===n.value);if(n.length>0)throw new Error(`Docusaurus error: Duplicate values "${n.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[n,t])}function h({value:e,tabValues:n}){return n.some(n=>n.value===e)}function f({queryString:e=!1,groupId:n}){const t=(0,i.W6)(),a=function({queryString:e=!1,groupId:n}){if("string"==typeof e)return e;if(!1===e)return null;if(!0===e&&!n)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return n??null}({queryString:e,groupId:n});return[(0,l.aZ)(a),(0,r.useCallback)(e=>{if(!a)return;const n=new URLSearchParams(t.location.search);n.set(a,e),t.replace({...t.location,search:n.toString()})},[a,t])]}function b(e){const{defaultValue:n,queryString:t=!1,groupId:a}=e,s=p(e),[i,l]=(0,r.useState)(()=>function({defaultValue:e,tabValues:n}){if(0===n.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(e){if(!h({value:e,tabValues:n}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${e}" but none of its children has the corresponding value. Available values are: ${n.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return e}const t=n.find(e=>e.default)??n[0];if(!t)throw new Error("Unexpected error: 0 tabValues");return t.value}({defaultValue:n,tabValues:s})),[u,d]=f({queryString:t,groupId:a}),[b,m]=function({groupId:e}){const n=function(e){return e?`docusaurus.tab.${e}`:null}(e),[t,a]=(0,c.Dv)(n);return[t,(0,r.useCallback)(e=>{n&&a.set(e)},[n,a])]}({groupId:a}),g=(()=>{const e=u??b;return h({value:e,tabValues:s})?e:null})();(0,o.A)(()=>{g&&l(g)},[g]);return{selectedValue:i,selectValue:(0,r.useCallback)(e=>{if(!h({value:e,tabValues:s}))throw new Error(`Can't select invalid tab value=${e}`);l(e),d(e),m(e)},[d,m,s]),tabValues:s}}var m=t(64407);const g={tabList:"tabList_KWM2",tabItem:"tabItem_qGQB"};var v=t(23420);function y({className:e,block:n,selectedValue:t,selectValue:r,tabValues:i}){const o=[],{blockElementScrollPositionUntilNextRender:l}=(0,s.a_)(),u=e=>{const n=e.currentTarget,a=o.indexOf(n),s=i[a].value;s!==t&&(l(n),r(s))},c=e=>{let n=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;n=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;n=o[t]??o[o.length-1];break}}n?.focus()};return(0,v.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,a.A)("tabs",{"tabs--block":n},e),children:i.map(({value:e,label:n,attributes:r})=>(0,v.jsx)("li",{role:"tab",tabIndex:t===e?0:-1,"aria-selected":t===e,ref:e=>{o.push(e)},onKeyDown:c,onClick:u,...r,className:(0,a.A)("tabs__item",g.tabItem,r?.className,{"tabs__item--active":t===e}),children:n??e},e))})}function k({lazy:e,children:n,selectedValue:t}){const s=(Array.isArray(n)?n:[n]).filter(Boolean);if(e){const e=s.find(e=>e.props.value===t);return e?(0,r.cloneElement)(e,{className:(0,a.A)("margin-top--md",e.props.className)}):null}return(0,v.jsx)("div",{className:"margin-top--md",children:s.map((e,n)=>(0,r.cloneElement)(e,{key:n,hidden:e.props.value!==t}))})}function w(e){const n=b(e);return(0,v.jsxs)("div",{className:(0,a.A)("tabs-container",g.tabList),children:[(0,v.jsx)(y,{...n,...e}),(0,v.jsx)(k,{...n,...e})]})}function x(e){const n=(0,m.A)();return(0,v.jsx)(w,{...e,children:d(e.children)},String(n))}}}]); \ No newline at end of file diff --git a/assets/js/f9546978.0ec94175.js b/assets/js/f9546978.0ec94175.js new file mode 100644 index 0000000000..8fa5ff250a --- /dev/null +++ b/assets/js/f9546978.0ec94175.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4025],{65404:(e,t,s)=>{s.d(t,{R:()=>c,x:()=>a});var o=s(36672);const n={},r=o.createContext(n);function c(e){const t=o.useContext(r);return o.useMemo(function(){return"function"==typeof e?e(t):{...t,...e}},[t,e])}function a(e){let t;return t=e.disableParentContext?"function"==typeof e.components?e.components(n):e.components||n:c(e.components),o.createElement(r.Provider,{value:t},e.children)}},97905:(e,t,s)=>{s.r(t),s.d(t,{assets:()=>i,contentTitle:()=>a,default:()=>m,frontMatter:()=>c,metadata:()=>o,toc:()=>l});const o=JSON.parse('{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","source":"@site/versioned_docs/version-0.12.4/rules/compiler/custom_kapt_matchers.md","sourceDirName":"rules/compiler","slug":"/rules/custom_kapt_matchers","permalink":"/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.4/rules/compiler/custom_kapt_matchers.md","tags":[],"version":"0.12.4","frontMatter":{"id":"custom_kapt_matchers","slug":"/rules/custom_kapt_matchers","title":"Custom Kapt Matchers","sidebar_label":"Custom Kapt Matchers"},"sidebar":"Docs","previous":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin"},"next":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.12.4/rules/sort_dependencies"}}');var n=s(23420),r=s(65404);const c={id:"custom_kapt_matchers",slug:"/rules/custom_kapt_matchers",title:"Custom Kapt Matchers",sidebar_label:"Custom Kapt Matchers"},a=void 0,i={},l=[];function u(e){const t={code:"code",p:"p",pre:"pre",...(0,r.R)(),...e.components};return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(t.p,{children:"It's simple to add a custom matcher for an internal-use annotation processor."}),"\n",(0,n.jsx)(t.p,{children:"Just define a list of regex strings for all of the fully qualified names of its annotations."}),"\n",(0,n.jsx)(t.pre,{children:(0,n.jsx)(t.code,{className:"language-kotlin",children:'moduleCheck {\n additionalKaptMatchers.set(\n listOf(\n modulecheck.api.KaptMatcher(\n name = "MyProcessor",\n processor = "my-project.codegen:processor",\n annotationImports = listOf(\n "myproject\\\\.\\\\*",\n "myproject\\\\.MyInject",\n "myproject\\\\.MyInject\\\\.Factory",\n "myproject\\\\.MyInjectParam",\n "myproject\\\\.MyInjectModule"\n )\n )\n )\n )\n}\n'})})]})}function m(e={}){const{wrapper:t}={...(0,r.R)(),...e.components};return t?(0,n.jsx)(t,{...e,children:(0,n.jsx)(u,{...e})}):u(e)}}}]); \ No newline at end of file diff --git a/assets/js/f963ac8e.5450a01f.js b/assets/js/f963ac8e.5450a01f.js new file mode 100644 index 0000000000..ddea0ddc9b --- /dev/null +++ b/assets/js/f963ac8e.5450a01f.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[9440],{37588:(e,n,o)=>{o.r(n),o.d(n,{assets:()=>l,contentTitle:()=>a,default:()=>u,frontMatter:()=>s,metadata:()=>t,toc:()=>c});const t=JSON.parse('{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","source":"@site/versioned_docs/version-0.12.5/rules/compiler/use_anvil_factory_generation.md","sourceDirName":"rules/compiler","slug":"/rules/use_anvil_factory_generation","permalink":"/ModuleCheck/docs/rules/use_anvil_factory_generation","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.5/rules/compiler/use_anvil_factory_generation.md","tags":[],"version":"0.12.5","frontMatter":{"id":"use_anvil_factory_generation","slug":"/rules/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","sidebar_label":"Could Use Anvil Factory Generation"},"sidebar":"Docs","previous":{"title":"Project Depth","permalink":"/ModuleCheck/docs/rules/project_depth"},"next":{"title":"Unused Kapt Processor","permalink":"/ModuleCheck/docs/rules/unused_kapt_processor"}}');var r=o(23420),i=o(65404);const s={id:"use_anvil_factory_generation",slug:"/rules/use_anvil_factory_generation",title:"Could Use Anvil Factory Generation",sidebar_label:"Could Use Anvil Factory Generation"},a=void 0,l={},c=[];function d(e){const n={a:"a",code:"code",li:"li",p:"p",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(n.p,{children:["Anvil's ",(0,r.jsx)(n.a,{href:"https://github.com/square/anvil#dagger-factory-generation",children:"factory generation"})," is faster\nthan Dagger's generation using Kapt. However, it doesn't support generating Components or\nSubcomponents, and it doesn't work in Java code."]}),"\n",(0,r.jsx)(n.p,{children:"This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation."}),"\n",(0,r.jsx)(n.p,{children:"Criteria:"}),"\n",(0,r.jsxs)(n.ul,{children:["\n",(0,r.jsx)(n.li,{children:"Anvil plugin applied with a version greater than 2.0.11"}),"\n",(0,r.jsx)(n.li,{children:"Anvil's factory generation isn't already enabled (nothing to do in this case)"}),"\n",(0,r.jsxs)(n.li,{children:["No ",(0,r.jsx)(n.code,{children:"@MergeComponent"}),", ",(0,r.jsx)(n.code,{children:"@MergeSubcomponent"}),", ",(0,r.jsx)(n.code,{children:"@Component"})," or ",(0,r.jsx)(n.code,{children:"@Subcomponent"})," annotations"]}),"\n",(0,r.jsxs)(n.li,{children:["No Dagger annotations in ",(0,r.jsx)(n.code,{children:".java"})," files"]}),"\n"]})]})}function u(e={}){const{wrapper:n}={...(0,i.R)(),...e.components};return n?(0,r.jsx)(n,{...e,children:(0,r.jsx)(d,{...e})}):d(e)}},65404:(e,n,o)=>{o.d(n,{R:()=>s,x:()=>a});var t=o(36672);const r={},i=t.createContext(r);function s(e){const n=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(n):{...n,...e}},[n,e])}function a(e){let n;return n=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:s(e.components),t.createElement(i.Provider,{value:n},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fb031341.984994de.js b/assets/js/fb031341.984994de.js new file mode 100644 index 0000000000..5b36803d0b --- /dev/null +++ b/assets/js/fb031341.984994de.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5397],{19282:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>u,contentTitle:()=>l,default:()=>a,frontMatter:()=>i,metadata:()=>n,toc:()=>c});const n=JSON.parse('{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","source":"@site/versioned_docs/version-0.11.3/rules/sorting/sort_plugins.md","sourceDirName":"rules/sorting","slug":"/rules/sorting/sort_plugins","permalink":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.11.3/rules/sorting/sort_plugins.md","tags":[],"version":"0.11.3","frontMatter":{"id":"sort_plugins","title":"Sort Plugins","sidebar_label":"Sort Plugins"},"sidebar":"Docs","previous":{"title":"Sort Dependencies","permalink":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies"},"next":{"title":"Disable Android Resources","permalink":"/ModuleCheck/docs/0.11.3/rules/android/disable_resources"}}');var o=t(23420),r=t(65404);const i={id:"sort_plugins",title:"Sort Plugins",sidebar_label:"Sort Plugins"},l=void 0,u={},c=[];function d(e){return(0,o.jsx)(o.Fragment,{})}function a(e={}){const{wrapper:s}={...(0,r.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(d,{...e})}):d()}},65404:(e,s,t)=>{t.d(s,{R:()=>i,x:()=>l});var n=t(36672);const o={},r=n.createContext(o);function i(e){const s=n.useContext(r);return n.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function l(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:i(e.components),n.createElement(r.Provider,{value:s},e.children)}}}]); \ No newline at end of file diff --git a/assets/js/fde89899.a1e49d64.js b/assets/js/fde89899.a1e49d64.js new file mode 100644 index 0000000000..b20067cb17 --- /dev/null +++ b/assets/js/fde89899.a1e49d64.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[4719],{36442:e=>{e.exports=JSON.parse('{"version":{"pluginId":"default","version":"0.12.2","label":"0.12.2","banner":"unmaintained","badge":true,"noIndex":false,"className":"docs-version-0.12.2","isLast":false,"docsSidebars":{"Docs":[{"type":"link","label":"Quick Start","href":"/ModuleCheck/docs/0.12.2/","docId":"quickstart","unlisted":false},{"type":"link","label":"Configuration","href":"/ModuleCheck/docs/0.12.2/configuration","docId":"configuration","unlisted":false},{"type":"link","label":"Suppressing Findings","href":"/ModuleCheck/docs/0.12.2/suppressing-findings","docId":"suppressing-findings","unlisted":false},{"type":"link","label":"CI Workflow","href":"/ModuleCheck/docs/0.12.2/ci-workflow","docId":"ci-workflow","unlisted":false},{"type":"category","label":"Rules","collapsed":false,"items":[{"type":"link","label":"Unused Dependency","href":"/ModuleCheck/docs/0.12.2/rules/unused_dependency","docId":"rules/unused_dependency","unlisted":false},{"type":"link","label":"Must Be Api","href":"/ModuleCheck/docs/0.12.2/rules/must_be_api","docId":"rules/must_be_api","unlisted":false},{"type":"link","label":"Inherited Dependency","href":"/ModuleCheck/docs/0.12.2/rules/inherited_dependency","docId":"rules/inherited_dependency","unlisted":false},{"type":"link","label":"Redundant Dependency","href":"/ModuleCheck/docs/0.12.2/rules/redundant_dependency","docId":"rules/redundant_dependency","unlisted":false},{"type":"link","label":"Overshot Dependency","href":"/ModuleCheck/docs/0.12.2/rules/overshot_dependency","docId":"rules/overshot_dependency","unlisted":false},{"type":"link","label":"Project Depth","href":"/ModuleCheck/docs/0.12.2/rules/project_depth","docId":"rules/project_depth","unlisted":false},{"type":"category","label":"Compiler","collapsed":false,"items":[{"type":"link","label":"Could Use Anvil Factory Generation","href":"/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation","docId":"rules/compiler/use_anvil_factory_generation","unlisted":false},{"type":"link","label":"Unused Kapt Processor","href":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor","docId":"rules/compiler/unused_kapt_processor","unlisted":false},{"type":"link","label":"Unused Kapt Plugin","href":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin","docId":"rules/compiler/unused_kapt_plugin","unlisted":false},{"type":"link","label":"Custom Kapt Matchers","href":"/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers","docId":"rules/compiler/custom_kapt_matchers","unlisted":false}],"collapsible":true},{"type":"category","label":"Sorting","collapsed":false,"items":[{"type":"link","label":"Sort Dependencies","href":"/ModuleCheck/docs/0.12.2/rules/sort_dependencies","docId":"rules/sorting/sort_dependencies","unlisted":false},{"type":"link","label":"Sort Plugins","href":"/ModuleCheck/docs/0.12.2/rules/sort_plugins","docId":"rules/sorting/sort_plugins","unlisted":false}],"collapsible":true},{"type":"category","label":"Android","collapsed":false,"items":[{"type":"link","label":"Disable Android Resources","href":"/ModuleCheck/docs/0.12.2/rules/disable_android_resources","docId":"rules/android/disable_android_resources","unlisted":false},{"type":"link","label":"Disable ViewBinding","href":"/ModuleCheck/docs/0.12.2/rules/disable_view_binding","docId":"rules/android/disable_view_binding","unlisted":false},{"type":"link","label":"Unused Kotlin Android Extensions","href":"/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensions","docId":"rules/android/unused_kotlin_android_extensions","unlisted":false}],"collapsible":true}],"collapsible":true}]},"docs":{"ci-workflow":{"id":"ci-workflow","title":"CI Workflow","description":"ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and","sidebar":"Docs"},"configuration":{"id":"configuration","title":"configuration","description":"","sidebar":"Docs"},"quickstart":{"id":"quickstart","title":"Quick Start","description":"Dependencies","sidebar":"Docs"},"rules/android/disable_android_resources":{"id":"rules/android/disable_android_resources","title":"Disable Android Resources","description":"If an Android module doesn\'t actually have any resources in the src//res directory,","sidebar":"Docs"},"rules/android/disable_view_binding":{"id":"rules/android/disable_view_binding","title":"Disable ViewBinding","description":"If an Android module has viewBinding enabled, but doesn\'t contribute any generated Binding","sidebar":"Docs"},"rules/android/unused_kotlin_android_extensions":{"id":"rules/android/unused_kotlin_android_extensions","title":"Unused Kotlin Android Extensions","description":"Finds modules which have deprecated Kotlin Android Extensions enabled, but don\'t actually use any","sidebar":"Docs"},"rules/compiler/custom_kapt_matchers":{"id":"rules/compiler/custom_kapt_matchers","title":"Custom Kapt Matchers","description":"It\'s simple to add a custom matcher for an internal-use annotation processor.","sidebar":"Docs"},"rules/compiler/unused_kapt_plugin":{"id":"rules/compiler/unused_kapt_plugin","title":"Unused Kapt Plugin","description":"If there are no kapt/kaptTest/etc. processor dependencies in a module, there\'s no point in","sidebar":"Docs"},"rules/compiler/unused_kapt_processor":{"id":"rules/compiler/unused_kapt_processor","title":"Unused Kapt Processor","description":"Annotation processors act upon a defined set of annotations. If an annotation processor is","sidebar":"Docs"},"rules/compiler/use_anvil_factory_generation":{"id":"rules/compiler/use_anvil_factory_generation","title":"Could Use Anvil Factory Generation","description":"Anvil\'s factory generation is faster","sidebar":"Docs"},"rules/inherited_dependency":{"id":"rules/inherited_dependency","title":"Inherited Dependency","description":"Assume thatmoduleB, andmoduleC via","sidebar":"Docs"},"rules/must_be_api":{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","sidebar":"Docs"},"rules/overshot_dependency":{"id":"rules/overshot_dependency","title":"Overshot Dependency","description":"Finds project dependencies which aren\'t used by the declaring configuration, but are used by a","sidebar":"Docs"},"rules/project_depth":{"id":"rules/project_depth","title":"Project Depth","description":"TL;DR - Low depth values mean faster builds and better all-around scalability.","sidebar":"Docs"},"rules/redundant_dependency":{"id":"rules/redundant_dependency","title":"Redundant Dependency","description":"This rule creates a brittle dependency graph, because some necessary dependencies are only provided","sidebar":"Docs"},"rules/sorting/sort_dependencies":{"id":"rules/sorting/sort_dependencies","title":"Sort Dependencies","description":"","sidebar":"Docs"},"rules/sorting/sort_plugins":{"id":"rules/sorting/sort_plugins","title":"Sort Plugins","description":"","sidebar":"Docs"},"rules/unused_dependency":{"id":"rules/unused_dependency","title":"Unused Dependency","description":"Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead","sidebar":"Docs"},"suppressing-findings":{"id":"suppressing-findings","title":"Suppressing Findings","description":"You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.","sidebar":"Docs"}}}}')}}]); \ No newline at end of file diff --git a/assets/js/ff366317.3645d264.js b/assets/js/ff366317.3645d264.js new file mode 100644 index 0000000000..243666a592 --- /dev/null +++ b/assets/js/ff366317.3645d264.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[1349],{65404:(e,s,n)=>{n.d(s,{R:()=>d,x:()=>r});var t=n(36672);const o={},i=t.createContext(o);function d(e){const s=t.useContext(i);return t.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function r(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(o):e.components||o:d(e.components),t.createElement(i.Provider,{value:s},e.children)}},86811:(e,s,n)=>{n.r(s),n.d(s,{assets:()=>c,contentTitle:()=>r,default:()=>l,frontMatter:()=>d,metadata:()=>t,toc:()=>u});const t=JSON.parse('{"id":"rules/must_be_api","title":"Must Be Api","description":"Dependencies are considered to be part of a module\'s public \\"ABI\\" if that module exposes some aspect","source":"@site/versioned_docs/version-0.12.1/rules/must_be_api.md","sourceDirName":"rules","slug":"/rules/must_be_api","permalink":"/ModuleCheck/docs/0.12.1/rules/must_be_api","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.12.1/rules/must_be_api.md","tags":[],"version":"0.12.1","frontMatter":{"id":"must_be_api","slug":"/rules/must_be_api","title":"Must Be Api","sidebar_label":"Must Be Api"},"sidebar":"Docs","previous":{"title":"Unused Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/unused_dependency"},"next":{"title":"Inherited Dependency","permalink":"/ModuleCheck/docs/0.12.1/rules/inherited_dependency"}}');var o=n(23420),i=n(65404);const d={id:"must_be_api",slug:"/rules/must_be_api",title:"Must Be Api",sidebar_label:"Must Be Api"},r=void 0,c={},u=[];function a(e){const s={code:"code",p:"p",...(0,i.R)(),...e.components};return(0,o.jsxs)(o.Fragment,{children:[(0,o.jsx)(s.p,{children:'Dependencies are considered to be part of a module\'s public "ABI" if that module exposes some aspect\nof the dependency in its own API.'}),"\n",(0,o.jsxs)(s.p,{children:["For instance, if a ",(0,o.jsx)(s.code,{children:":moduleA"})," extends a class/interface from ",(0,o.jsx)(s.code,{children:":moduleB"}),", or takes a type\nfrom ",(0,o.jsx)(s.code,{children:":moduleB"})," as a function parameter, then any consumer of ",(0,o.jsx)(s.code,{children:":moduleA"}),"'s API must also have a\ndependency upon ",(0,o.jsx)(s.code,{children:":moduleB"}),". In scenarios like this, the dependency module(s) should be declared\nusing Gradle's ",(0,o.jsx)(s.code,{children:"api"})," configuration."]})]})}function l(e={}){const{wrapper:s}={...(0,i.R)(),...e.components};return s?(0,o.jsx)(s,{...e,children:(0,o.jsx)(a,{...e})}):a(e)}}}]); \ No newline at end of file diff --git a/assets/js/ffeead90.0bf02578.js b/assets/js/ffeead90.0bf02578.js new file mode 100644 index 0000000000..758fe5a4b9 --- /dev/null +++ b/assets/js/ffeead90.0bf02578.js @@ -0,0 +1 @@ +"use strict";(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[5817],{65404:(e,s,t)=>{t.d(s,{R:()=>u,x:()=>c});var o=t(36672);const r={},n=o.createContext(r);function u(e){const s=o.useContext(n);return o.useMemo(function(){return"function"==typeof e?e(s):{...s,...e}},[s,e])}function c(e){let s;return s=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:u(e.components),o.createElement(n.Provider,{value:s},e.children)}},74280:(e,s,t)=>{t.r(s),t.d(s,{assets:()=>a,contentTitle:()=>c,default:()=>i,frontMatter:()=>u,metadata:()=>o,toc:()=>d});const o=JSON.parse('{"id":"rules/kapt/unused_kapt_processor","title":"Unused Kapt Processor","description":"","source":"@site/versioned_docs/version-0.10.0/rules/kapt/unused_kapt_processor.md","sourceDirName":"rules/kapt","slug":"/rules/kapt/unused_kapt_processor","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor","draft":false,"unlisted":false,"editUrl":"https://github.com/rbusarow/ModuleCheck/blob/main/website/versioned_docs/version-0.10.0/rules/kapt/unused_kapt_processor.md","tags":[],"version":"0.10.0","frontMatter":{"id":"unused_kapt_processor","title":"Unused Kapt Processor","sidebar_label":"Unused Kapt Processor"},"sidebar":"Rules","previous":{"title":"Overshot Dependency","permalink":"/ModuleCheck/docs/0.10.0/rules/overshot"},"next":{"title":"Unused Kapt Plugin","permalink":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin"}}');var r=t(23420),n=t(65404);const u={id:"unused_kapt_processor",title:"Unused Kapt Processor",sidebar_label:"Unused Kapt Processor"},c=void 0,a={},d=[];function p(e){return(0,r.jsx)(r.Fragment,{})}function i(e={}){const{wrapper:s}={...(0,n.R)(),...e.components};return s?(0,r.jsx)(s,{...e,children:(0,r.jsx)(p,{...e})}):p()}}}]); \ No newline at end of file diff --git a/assets/js/main.6722e00e.js b/assets/js/main.6722e00e.js new file mode 100644 index 0000000000..0aae37dc45 --- /dev/null +++ b/assets/js/main.6722e00e.js @@ -0,0 +1,2 @@ +/*! For license information please see main.6722e00e.js.LICENSE.txt */ +(self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[]).push([[8792],{1771:(e,t,n)=>{"use strict";n.d(t,{Wf:()=>u,Dv:()=>d});var r=n(36672);const o=JSON.parse('{"N":"localStorage","M":""}'),a=o.N;function s({key:e,oldValue:t,newValue:n,storage:r}){if(t===n)return;const o=document.createEvent("StorageEvent");o.initStorageEvent("storage",!1,!1,e,t,n,window.location.href,r),window.dispatchEvent(o)}function i(e=a){if("undefined"==typeof window)throw new Error("Browser storage is not available on Node.js/Docusaurus SSR process.");if("none"===e)return null;try{return window[e]}catch(n){return t=n,c||(console.warn("Docusaurus browser storage is not available.\nPossible reasons: running Docusaurus in an iframe, in an incognito browser session, or using too strict browser privacy settings.",t),c=!0),null}var t}let c=!1;const l={get:()=>null,set:()=>{},del:()=>{},listen:()=>()=>{}};function u(e,t){const n=`${e}${o.M}`;if("undefined"==typeof window)return function(e){function t(){throw new Error(`Illegal storage API usage for storage key "${e}".\nDocusaurus storage APIs are not supposed to be called on the server-rendering process.\nPlease only call storage APIs in effects and event handlers.`)}return{get:t,set:t,del:t,listen:t}}(n);const r=i(t?.persistence);return null===r?l:{get:()=>{try{return r.getItem(n)}catch(e){return console.error(`Docusaurus storage error, can't get key=${n}`,e),null}},set:e=>{try{const t=r.getItem(n);r.setItem(n,e),s({key:n,oldValue:t,newValue:e,storage:r})}catch(t){console.error(`Docusaurus storage error, can't set ${n}=${e}`,t)}},del:()=>{try{const e=r.getItem(n);r.removeItem(n),s({key:n,oldValue:e,newValue:null,storage:r})}catch(e){console.error(`Docusaurus storage error, can't delete key=${n}`,e)}},listen:e=>{try{const t=t=>{t.storageArea===r&&t.key===n&&e(t)};return window.addEventListener("storage",t),()=>window.removeEventListener("storage",t)}catch(t){return console.error(`Docusaurus storage error, can't listen for changes of key=${n}`,t),()=>{}}}}}function d(e,t){const[n]=(0,r.useState)(()=>null===e?l:u(e,t)),o=(0,r.useCallback)(e=>"undefined"==typeof window?()=>{}:n.listen(e),[n]);return[(0,r.useSyncExternalStore)(o,()=>n.get(),()=>null),n]}},1870:(e,t)=>{"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.fragment");function o(e,t,r){var o=null;if(void 0!==r&&(o=""+r),void 0!==t.key&&(o=""+t.key),"key"in t)for(var a in r={},t)"key"!==a&&(r[a]=t[a]);else r=t;return t=r.ref,{$$typeof:n,type:e,key:o,ref:void 0!==t?t:null,props:r}}t.Fragment=r,t.jsx=o,t.jsxs=o},2736:(e,t,n)=>{e.exports=n(16186)()},3025:(e,t,n)=>{"use strict";function r(e,t){return void 0!==e&&void 0!==t&&new RegExp(e,"gi").test(t)}n.d(t,{G:()=>r})},3416:(e,t,n)=>{"use strict";n.d(t,{My:()=>k,f4:()=>Y});var r,o,a=n(36672),s=n(13526),i=Object.create,c=Object.defineProperty,l=Object.defineProperties,u=Object.getOwnPropertyDescriptor,d=Object.getOwnPropertyDescriptors,p=Object.getOwnPropertyNames,f=Object.getOwnPropertySymbols,h=Object.getPrototypeOf,m=Object.prototype.hasOwnProperty,g=Object.prototype.propertyIsEnumerable,b=(e,t,n)=>t in e?c(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,y=(e,t)=>{for(var n in t||(t={}))m.call(t,n)&&b(e,n,t[n]);if(f)for(var n of f(t))g.call(t,n)&&b(e,n,t[n]);return e},v=(e,t)=>l(e,d(t)),_=(e,t)=>{var n={};for(var r in e)m.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&f)for(var r of f(e))t.indexOf(r)<0&&g.call(e,r)&&(n[r]=e[r]);return n},k=((e,t,n)=>(n=null!=e?i(h(e)):{},((e,t,n,r)=>{if(t&&"object"==typeof t||"function"==typeof t)for(let o of p(t))m.call(e,o)||o===n||c(e,o,{get:()=>t[o],enumerable:!(r=u(t,o))||r.enumerable});return e})(!t&&e&&e.__esModule?n:c(n,"default",{value:e,enumerable:!0}),e)))((r={"../../node_modules/.pnpm/prismjs@1.29.0_patch_hash=vrxx3pzkik6jpmgpayxfjunetu/node_modules/prismjs/prism.js"(e,t){var n=function(){var e=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,n={},r={util:{encode:function e(t){return t instanceof o?new o(t.type,e(t.content),t.alias):Array.isArray(t)?t.map(e):t.replace(/&/g,"&").replace(/</g,"<").replace(/\u00a0/g," ")},type:function(e){return Object.prototype.toString.call(e).slice(8,-1)},objId:function(e){return e.__id||Object.defineProperty(e,"__id",{value:++t}),e.__id},clone:function e(t,n){var o,a;switch(n=n||{},r.util.type(t)){case"Object":if(a=r.util.objId(t),n[a])return n[a];for(var s in o={},n[a]=o,t)t.hasOwnProperty(s)&&(o[s]=e(t[s],n));return o;case"Array":return a=r.util.objId(t),n[a]?n[a]:(o=[],n[a]=o,t.forEach(function(t,r){o[r]=e(t,n)}),o);default:return t}},getLanguage:function(t){for(;t;){var n=e.exec(t.className);if(n)return n[1].toLowerCase();t=t.parentElement}return"none"},setLanguage:function(t,n){t.className=t.className.replace(RegExp(e,"gi"),""),t.classList.add("language-"+n)},isActive:function(e,t,n){for(var r="no-"+t;e;){var o=e.classList;if(o.contains(t))return!0;if(o.contains(r))return!1;e=e.parentElement}return!!n}},languages:{plain:n,plaintext:n,text:n,txt:n,extend:function(e,t){var n=r.util.clone(r.languages[e]);for(var o in t)n[o]=t[o];return n},insertBefore:function(e,t,n,o){var a=(o=o||r.languages)[e],s={};for(var i in a)if(a.hasOwnProperty(i)){if(i==t)for(var c in n)n.hasOwnProperty(c)&&(s[c]=n[c]);n.hasOwnProperty(i)||(s[i]=a[i])}var l=o[e];return o[e]=s,r.languages.DFS(r.languages,function(t,n){n===l&&t!=e&&(this[t]=s)}),s},DFS:function e(t,n,o,a){a=a||{};var s=r.util.objId;for(var i in t)if(t.hasOwnProperty(i)){n.call(t,i,t[i],o||i);var c=t[i],l=r.util.type(c);"Object"!==l||a[s(c)]?"Array"!==l||a[s(c)]||(a[s(c)]=!0,e(c,n,i,a)):(a[s(c)]=!0,e(c,n,null,a))}}},plugins:{},highlight:function(e,t,n){var a={code:e,grammar:t,language:n};if(r.hooks.run("before-tokenize",a),!a.grammar)throw new Error('The language "'+a.language+'" has no grammar.');return a.tokens=r.tokenize(a.code,a.grammar),r.hooks.run("after-tokenize",a),o.stringify(r.util.encode(a.tokens),a.language)},tokenize:function(e,t){var n=t.rest;if(n){for(var r in n)t[r]=n[r];delete t.rest}var o=new i;return c(o,o.head,e),s(e,o,t,o.head,0),function(e){for(var t=[],n=e.head.next;n!==e.tail;)t.push(n.value),n=n.next;return t}(o)},hooks:{all:{},add:function(e,t){var n=r.hooks.all;n[e]=n[e]||[],n[e].push(t)},run:function(e,t){var n=r.hooks.all[e];if(n&&n.length)for(var o,a=0;o=n[a++];)o(t)}},Token:o};function o(e,t,n,r){this.type=e,this.content=t,this.alias=n,this.length=0|(r||"").length}function a(e,t,n,r){e.lastIndex=t;var o=e.exec(n);if(o&&r&&o[1]){var a=o[1].length;o.index+=a,o[0]=o[0].slice(a)}return o}function s(e,t,n,i,u,d){for(var p in n)if(n.hasOwnProperty(p)&&n[p]){var f=n[p];f=Array.isArray(f)?f:[f];for(var h=0;h<f.length;++h){if(d&&d.cause==p+","+h)return;var m=f[h],g=m.inside,b=!!m.lookbehind,y=!!m.greedy,v=m.alias;if(y&&!m.pattern.global){var _=m.pattern.toString().match(/[imsuy]*$/)[0];m.pattern=RegExp(m.pattern.source,_+"g")}for(var k=m.pattern||m,w=i.next,C=u;w!==t.tail&&!(d&&C>=d.reach);C+=w.value.length,w=w.next){var x=w.value;if(t.length>e.length)return;if(!(x instanceof o)){var S,M=1;if(y){if(!(S=a(k,C,e,b))||S.index>=e.length)break;var E=S.index,O=S.index+S[0].length,A=C;for(A+=w.value.length;E>=A;)A+=(w=w.next).value.length;if(C=A-=w.value.length,w.value instanceof o)continue;for(var j=w;j!==t.tail&&(A<O||"string"==typeof j.value);j=j.next)M++,A+=j.value.length;M--,x=e.slice(C,A),S.index-=C}else if(!(S=a(k,0,x,b)))continue;E=S.index;var D=S[0],P=x.slice(0,E),T=x.slice(E+D.length),I=C+x.length;d&&I>d.reach&&(d.reach=I);var N=w.prev;if(P&&(N=c(t,N,P),C+=P.length),l(t,N,M),w=c(t,N,new o(p,g?r.tokenize(D,g):D,v,D)),T&&c(t,w,T),M>1){var L={cause:p+","+h,reach:I};s(e,t,n,w.prev,C,L),d&&L.reach>d.reach&&(d.reach=L.reach)}}}}}}function i(){var e={value:null,prev:null,next:null},t={value:null,prev:e,next:null};e.next=t,this.head=e,this.tail=t,this.length=0}function c(e,t,n){var r=t.next,o={value:n,prev:t,next:r};return t.next=o,r.prev=o,e.length++,o}function l(e,t,n){for(var r=t.next,o=0;o<n&&r!==e.tail;o++)r=r.next;t.next=r,r.prev=t,e.length-=o}return o.stringify=function e(t,n){if("string"==typeof t)return t;if(Array.isArray(t)){var o="";return t.forEach(function(t){o+=e(t,n)}),o}var a={type:t.type,content:e(t.content,n),tag:"span",classes:["token",t.type],attributes:{},language:n},s=t.alias;s&&(Array.isArray(s)?Array.prototype.push.apply(a.classes,s):a.classes.push(s)),r.hooks.run("wrap",a);var i="";for(var c in a.attributes)i+=" "+c+'="'+(a.attributes[c]||"").replace(/"/g,""")+'"';return"<"+a.tag+' class="'+a.classes.join(" ")+'"'+i+">"+a.content+"</"+a.tag+">"},r}();t.exports=n,n.default=n}},function(){return o||(0,r[p(r)[0]])((o={exports:{}}).exports,o),o.exports})());k.languages.markup={comment:{pattern:/<!--(?:(?!<!--)[\s\S])*?-->/,greedy:!0},prolog:{pattern:/<\?[\s\S]+?\?>/,greedy:!0},doctype:{pattern:/<!DOCTYPE(?:[^>"'[\]]|"[^"]*"|'[^']*')+(?:\[(?:[^<"'\]]|"[^"]*"|'[^']*'|<(?!!--)|<!--(?:[^-]|-(?!->))*-->)*\]\s*)?>/i,greedy:!0,inside:{"internal-subset":{pattern:/(^[^\[]*\[)[\s\S]+(?=\]>$)/,lookbehind:!0,greedy:!0,inside:null},string:{pattern:/"[^"]*"|'[^']*'/,greedy:!0},punctuation:/^<!|>$|[[\]]/,"doctype-tag":/^DOCTYPE/i,name:/[^\s<>'"]+/}},cdata:{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,greedy:!0},tag:{pattern:/<\/?(?!\d)[^\s>\/=$<%]+(?:\s(?:\s*[^\s>\/=]+(?:\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))|(?=[\s/>])))+)?\s*\/?>/,greedy:!0,inside:{tag:{pattern:/^<\/?[^\s>\/]+/,inside:{punctuation:/^<\/?/,namespace:/^[^\s>\/:]+:/}},"special-attr":[],"attr-value":{pattern:/=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+)/,inside:{punctuation:[{pattern:/^=/,alias:"attr-equals"},{pattern:/^(\s*)["']|["']$/,lookbehind:!0}]}},punctuation:/\/?>/,"attr-name":{pattern:/[^\s>\/]+/,inside:{namespace:/^[^\s>\/:]+:/}}}},entity:[{pattern:/&[\da-z]{1,8};/i,alias:"named-entity"},/&#x?[\da-f]{1,8};/i]},k.languages.markup.tag.inside["attr-value"].inside.entity=k.languages.markup.entity,k.languages.markup.doctype.inside["internal-subset"].inside=k.languages.markup,k.hooks.add("wrap",function(e){"entity"===e.type&&(e.attributes.title=e.content.replace(/&/,"&"))}),Object.defineProperty(k.languages.markup.tag,"addInlined",{value:function(e,t){var n;(t=((n=((n={})["language-"+t]={pattern:/(^<!\[CDATA\[)[\s\S]+?(?=\]\]>$)/i,lookbehind:!0,inside:k.languages[t]},n.cdata=/^<!\[CDATA\[|\]\]>$/i,{"included-cdata":{pattern:/<!\[CDATA\[[\s\S]*?\]\]>/i,inside:n}}))["language-"+t]={pattern:/[\s\S]+/,inside:k.languages[t]},{}))[e]={pattern:RegExp(/(<__[^>]*>)(?:<!\[CDATA\[(?:[^\]]|\](?!\]>))*\]\]>|(?!<!\[CDATA\[)[\s\S])*?(?=<\/__>)/.source.replace(/__/g,function(){return e}),"i"),lookbehind:!0,greedy:!0,inside:n},k.languages.insertBefore("markup","cdata",t)}}),Object.defineProperty(k.languages.markup.tag,"addAttribute",{value:function(e,t){k.languages.markup.tag.inside["special-attr"].push({pattern:RegExp(/(^|["'\s])/.source+"(?:"+e+")"+/\s*=\s*(?:"[^"]*"|'[^']*'|[^\s'">=]+(?=[\s>]))/.source,"i"),lookbehind:!0,inside:{"attr-name":/^[^\s=]+/,"attr-value":{pattern:/=[\s\S]+/,inside:{value:{pattern:/(^=\s*(["']|(?!["'])))\S[\s\S]*(?=\2$)/,lookbehind:!0,alias:[t,"language-"+t],inside:k.languages[t]},punctuation:[{pattern:/^=/,alias:"attr-equals"},/"|'/]}}}})}}),k.languages.html=k.languages.markup,k.languages.mathml=k.languages.markup,k.languages.svg=k.languages.markup,k.languages.xml=k.languages.extend("markup",{}),k.languages.ssml=k.languages.xml,k.languages.atom=k.languages.xml,k.languages.rss=k.languages.xml,function(e){var t={pattern:/\\[\\(){}[\]^$+*?|.]/,alias:"escape"},n=/\\(?:x[\da-fA-F]{2}|u[\da-fA-F]{4}|u\{[\da-fA-F]+\}|0[0-7]{0,2}|[123][0-7]{2}|c[a-zA-Z]|.)/,r="(?:[^\\\\-]|"+n.source+")",o=(r=RegExp(r+"-"+r),{pattern:/(<|')[^<>']+(?=[>']$)/,lookbehind:!0,alias:"variable"});e.languages.regex={"char-class":{pattern:/((?:^|[^\\])(?:\\\\)*)\[(?:[^\\\]]|\\[\s\S])*\]/,lookbehind:!0,inside:{"char-class-negation":{pattern:/(^\[)\^/,lookbehind:!0,alias:"operator"},"char-class-punctuation":{pattern:/^\[|\]$/,alias:"punctuation"},range:{pattern:r,inside:{escape:n,"range-punctuation":{pattern:/-/,alias:"operator"}}},"special-escape":t,"char-set":{pattern:/\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},escape:n}},"special-escape":t,"char-set":{pattern:/\.|\\[wsd]|\\p\{[^{}]+\}/i,alias:"class-name"},backreference:[{pattern:/\\(?![123][0-7]{2})[1-9]/,alias:"keyword"},{pattern:/\\k<[^<>']+>/,alias:"keyword",inside:{"group-name":o}}],anchor:{pattern:/[$^]|\\[ABbGZz]/,alias:"function"},escape:n,group:[{pattern:/\((?:\?(?:<[^<>']+>|'[^<>']+'|[>:]|<?[=!]|[idmnsuxU]+(?:-[idmnsuxU]+)?:?))?/,alias:"punctuation",inside:{"group-name":o}},{pattern:/\)/,alias:"punctuation"}],quantifier:{pattern:/(?:[+*?]|\{\d+(?:,\d*)?\})[?+]?/,alias:"number"},alternation:{pattern:/\|/,alias:"keyword"}}}(k),k.languages.clike={comment:[{pattern:/(^|[^\\])\/\*[\s\S]*?(?:\*\/|$)/,lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/(["'])(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,greedy:!0},"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|trait)\s+|\bcatch\s+\()[\w.\\]+/i,lookbehind:!0,inside:{punctuation:/[.\\]/}},keyword:/\b(?:break|catch|continue|do|else|finally|for|function|if|in|instanceof|new|null|return|throw|try|while)\b/,boolean:/\b(?:false|true)\b/,function:/\b\w+(?=\()/,number:/\b0x[\da-f]+\b|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?/i,operator:/[<>]=?|[!=]=?=?|--?|\+\+?|&&?|\|\|?|[?*/~^%]/,punctuation:/[{}[\];(),.:]/},k.languages.javascript=k.languages.extend("clike",{"class-name":[k.languages.clike["class-name"],{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$A-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\.(?:constructor|prototype))/,lookbehind:!0}],keyword:[{pattern:/((?:^|\})\s*)catch\b/,lookbehind:!0},{pattern:/(^|[^.]|\.\.\.\s*)\b(?:as|assert(?=\s*\{)|async(?=\s*(?:function\b|\(|[$\w\xA0-\uFFFF]|$))|await|break|case|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally(?=\s*(?:\{|$))|for|from(?=\s*(?:['"]|$))|function|(?:get|set)(?=\s*(?:[#\[$\w\xA0-\uFFFF]|$))|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)\b/,lookbehind:!0}],function:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*(?:\.\s*(?:apply|bind|call)\s*)?\()/,number:{pattern:RegExp(/(^|[^\w$])/.source+"(?:"+/NaN|Infinity/.source+"|"+/0[bB][01]+(?:_[01]+)*n?/.source+"|"+/0[oO][0-7]+(?:_[0-7]+)*n?/.source+"|"+/0[xX][\dA-Fa-f]+(?:_[\dA-Fa-f]+)*n?/.source+"|"+/\d+(?:_\d+)*n/.source+"|"+/(?:\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\.\d+(?:_\d+)*)(?:[Ee][+-]?\d+(?:_\d+)*)?/.source+")"+/(?![\w$])/.source),lookbehind:!0},operator:/--|\+\+|\*\*=?|=>|&&=?|\|\|=?|[!=]==|<<=?|>>>?=?|[-+*/%&|^!=<>]=?|\.{3}|\?\?=?|\?\.?|[~:]/}),k.languages.javascript["class-name"][0].pattern=/(\b(?:class|extends|implements|instanceof|interface|new)\s+)[\w.\\]+/,k.languages.insertBefore("javascript","keyword",{regex:{pattern:RegExp(/((?:^|[^$\w\xA0-\uFFFF."'\])\s]|\b(?:return|yield))\s*)/.source+/\//.source+"(?:"+/(?:\[(?:[^\]\\\r\n]|\\.)*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}/.source+"|"+/(?:\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.|\[(?:[^[\]\\\r\n]|\\.)*\])*\])*\]|\\.|[^/\\\[\r\n])+\/[dgimyus]{0,7}v[dgimyus]{0,7}/.source+")"+/(?=(?:\s|\/\*(?:[^*]|\*(?!\/))*\*\/)*(?:$|[\r\n,.;:})\]]|\/\/))/.source),lookbehind:!0,greedy:!0,inside:{"regex-source":{pattern:/^(\/)[\s\S]+(?=\/[a-z]*$)/,lookbehind:!0,alias:"language-regex",inside:k.languages.regex},"regex-delimiter":/^\/|\/$/,"regex-flags":/^[a-z]+$/}},"function-variable":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*[=:]\s*(?:async\s*)?(?:\bfunction\b|(?:\((?:[^()]|\([^()]*\))*\)|(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/,alias:"function"},parameter:[{pattern:/(function(?:\s+(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)?\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\))/,lookbehind:!0,inside:k.languages.javascript},{pattern:/(^|[^$\w\xA0-\uFFFF])(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=>)/i,lookbehind:!0,inside:k.languages.javascript},{pattern:/(\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*=>)/,lookbehind:!0,inside:k.languages.javascript},{pattern:/((?:\b|\s|^)(?!(?:as|async|await|break|case|catch|class|const|continue|debugger|default|delete|do|else|enum|export|extends|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|new|null|of|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|undefined|var|void|while|with|yield)(?![$\w\xA0-\uFFFF]))(?:(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*)\(\s*|\]\s*\(\s*)(?!\s)(?:[^()\s]|\s+(?![\s)])|\([^()]*\))+(?=\s*\)\s*\{)/,lookbehind:!0,inside:k.languages.javascript}],constant:/\b[A-Z](?:[A-Z_]|\dx?)*\b/}),k.languages.insertBefore("javascript","string",{hashbang:{pattern:/^#!.*/,greedy:!0,alias:"comment"},"template-string":{pattern:/`(?:\\[\s\S]|\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}|(?!\$\{)[^\\`])*`/,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$\{(?:[^{}]|\{(?:[^{}]|\{[^}]*\})*\})+\}/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{|\}$/,alias:"punctuation"},rest:k.languages.javascript}},string:/[\s\S]+/}},"string-property":{pattern:/((?:^|[,{])[ \t]*)(["'])(?:\\(?:\r\n|[\s\S])|(?!\2)[^\\\r\n])*\2(?=\s*:)/m,lookbehind:!0,greedy:!0,alias:"property"}}),k.languages.insertBefore("javascript","operator",{"literal-property":{pattern:/((?:^|[,{])[ \t]*)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*:)/m,lookbehind:!0,alias:"property"}}),k.languages.markup&&(k.languages.markup.tag.addInlined("script","javascript"),k.languages.markup.tag.addAttribute(/on(?:abort|blur|change|click|composition(?:end|start|update)|dblclick|error|focus(?:in|out)?|key(?:down|up)|load|mouse(?:down|enter|leave|move|out|over|up)|reset|resize|scroll|select|slotchange|submit|unload|wheel)/.source,"javascript")),k.languages.js=k.languages.javascript,k.languages.actionscript=k.languages.extend("javascript",{keyword:/\b(?:as|break|case|catch|class|const|default|delete|do|dynamic|each|else|extends|final|finally|for|function|get|if|implements|import|in|include|instanceof|interface|internal|is|namespace|native|new|null|override|package|private|protected|public|return|set|static|super|switch|this|throw|try|typeof|use|var|void|while|with)\b/,operator:/\+\+|--|(?:[+\-*\/%^]|&&?|\|\|?|<<?|>>?>?|[!=]=?)=?|[~?@]/}),k.languages.actionscript["class-name"].alias="function",delete k.languages.actionscript.parameter,delete k.languages.actionscript["literal-property"],k.languages.markup&&k.languages.insertBefore("actionscript","string",{xml:{pattern:/(^|[^.])<\/?\w+(?:\s+[^\s>\/=]+=("|')(?:\\[\s\S]|(?!\2)[^\\])*\2)*\s*\/?>/,lookbehind:!0,inside:k.languages.markup}}),function(e){var t=/#(?!\{).+/,n={pattern:/#\{[^}]+\}/,alias:"variable"};e.languages.coffeescript=e.languages.extend("javascript",{comment:t,string:[{pattern:/'(?:\\[\s\S]|[^\\'])*'/,greedy:!0},{pattern:/"(?:\\[\s\S]|[^\\"])*"/,greedy:!0,inside:{interpolation:n}}],keyword:/\b(?:and|break|by|catch|class|continue|debugger|delete|do|each|else|extend|extends|false|finally|for|if|in|instanceof|is|isnt|let|loop|namespace|new|no|not|null|of|off|on|or|own|return|super|switch|then|this|throw|true|try|typeof|undefined|unless|until|when|while|window|with|yes|yield)\b/,"class-member":{pattern:/@(?!\d)\w+/,alias:"variable"}}),e.languages.insertBefore("coffeescript","comment",{"multiline-comment":{pattern:/###[\s\S]+?###/,alias:"comment"},"block-regex":{pattern:/\/{3}[\s\S]*?\/{3}/,alias:"regex",inside:{comment:t,interpolation:n}}}),e.languages.insertBefore("coffeescript","string",{"inline-javascript":{pattern:/`(?:\\[\s\S]|[^\\`])*`/,inside:{delimiter:{pattern:/^`|`$/,alias:"punctuation"},script:{pattern:/[\s\S]+/,alias:"language-javascript",inside:e.languages.javascript}}},"multiline-string":[{pattern:/'''[\s\S]*?'''/,greedy:!0,alias:"string"},{pattern:/"""[\s\S]*?"""/,greedy:!0,alias:"string",inside:{interpolation:n}}]}),e.languages.insertBefore("coffeescript","keyword",{property:/(?!\d)\w+(?=\s*:(?!:))/}),delete e.languages.coffeescript["template-string"],e.languages.coffee=e.languages.coffeescript}(k),function(e){var t=e.languages.javadoclike={parameter:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*@(?:arg|arguments|param)\s+)\w+/m,lookbehind:!0},keyword:{pattern:/(^[\t ]*(?:\/{3}|\*|\/\*\*)\s*|\{)@[a-z][a-zA-Z-]+\b/m,lookbehind:!0},punctuation:/[{}]/};Object.defineProperty(t,"addSupport",{value:function(t,n){(t="string"==typeof t?[t]:t).forEach(function(t){var r=function(e){e.inside||(e.inside={}),e.inside.rest=n},o="doc-comment";if(a=e.languages[t]){var a,s=a[o];if((s=s||(a=e.languages.insertBefore(t,"comment",{"doc-comment":{pattern:/(^|[^\\])\/\*\*[^/][\s\S]*?(?:\*\/|$)/,lookbehind:!0,alias:"comment"}}))[o])instanceof RegExp&&(s=a[o]={pattern:s}),Array.isArray(s))for(var i=0,c=s.length;i<c;i++)s[i]instanceof RegExp&&(s[i]={pattern:s[i]}),r(s[i]);else r(s)}})}}),t.addSupport(["java","javascript","php"],t)}(k),function(e){var t=/(?:"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n])*')/;(t=(e.languages.css={comment:/\/\*[\s\S]*?\*\//,atrule:{pattern:RegExp("@[\\w-](?:"+/[^;{\s"']|\s+(?!\s)/.source+"|"+t.source+")*?"+/(?:;|(?=\s*\{))/.source),inside:{rule:/^@[\w-]+/,"selector-function-argument":{pattern:/(\bselector\s*\(\s*(?![\s)]))(?:[^()\s]|\s+(?![\s)])|\((?:[^()]|\([^()]*\))*\))+(?=\s*\))/,lookbehind:!0,alias:"selector"},keyword:{pattern:/(^|[^\w-])(?:and|not|only|or)(?![\w-])/,lookbehind:!0}}},url:{pattern:RegExp("\\burl\\((?:"+t.source+"|"+/(?:[^\\\r\n()"']|\\[\s\S])*/.source+")\\)","i"),greedy:!0,inside:{function:/^url/i,punctuation:/^\(|\)$/,string:{pattern:RegExp("^"+t.source+"$"),alias:"url"}}},selector:{pattern:RegExp("(^|[{}\\s])[^{}\\s](?:[^{};\"'\\s]|\\s+(?![\\s{])|"+t.source+")*(?=\\s*\\{)"),lookbehind:!0},string:{pattern:t,greedy:!0},property:{pattern:/(^|[^-\w\xA0-\uFFFF])(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*(?=\s*:)/i,lookbehind:!0},important:/!important\b/i,function:{pattern:/(^|[^-a-z0-9])[-a-z0-9]+(?=\()/i,lookbehind:!0},punctuation:/[(){};:,]/},e.languages.css.atrule.inside.rest=e.languages.css,e.languages.markup))&&(t.tag.addInlined("style","css"),t.tag.addAttribute("style","css"))}(k),function(e){var t=/("|')(?:\\(?:\r\n|[\s\S])|(?!\1)[^\\\r\n])*\1/,n=(t=(e.languages.css.selector={pattern:e.languages.css.selector.pattern,lookbehind:!0,inside:t={"pseudo-element":/:(?:after|before|first-letter|first-line|selection)|::[-\w]+/,"pseudo-class":/:[-\w]+/,class:/\.[-\w]+/,id:/#[-\w]+/,attribute:{pattern:RegExp("\\[(?:[^[\\]\"']|"+t.source+")*\\]"),greedy:!0,inside:{punctuation:/^\[|\]$/,"case-sensitivity":{pattern:/(\s)[si]$/i,lookbehind:!0,alias:"keyword"},namespace:{pattern:/^(\s*)(?:(?!\s)[-*\w\xA0-\uFFFF])*\|(?!=)/,lookbehind:!0,inside:{punctuation:/\|$/}},"attr-name":{pattern:/^(\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+/,lookbehind:!0},"attr-value":[t,{pattern:/(=\s*)(?:(?!\s)[-\w\xA0-\uFFFF])+(?=\s*$)/,lookbehind:!0}],operator:/[|~*^$]?=/}},"n-th":[{pattern:/(\(\s*)[+-]?\d*[\dn](?:\s*[+-]\s*\d+)?(?=\s*\))/,lookbehind:!0,inside:{number:/[\dn]+/,operator:/[+-]/}},{pattern:/(\(\s*)(?:even|odd)(?=\s*\))/i,lookbehind:!0}],combinator:/>|\+|~|\|\|/,punctuation:/[(),]/}},e.languages.css.atrule.inside["selector-function-argument"].inside=t,e.languages.insertBefore("css","property",{variable:{pattern:/(^|[^-\w\xA0-\uFFFF])--(?!\s)[-_a-z\xA0-\uFFFF](?:(?!\s)[-\w\xA0-\uFFFF])*/i,lookbehind:!0}}),{pattern:/(\b\d+)(?:%|[a-z]+(?![\w-]))/,lookbehind:!0}),{pattern:/(^|[^\w.-])-?(?:\d+(?:\.\d+)?|\.\d+)/,lookbehind:!0});e.languages.insertBefore("css","function",{operator:{pattern:/(\s)[+\-*\/](?=\s)/,lookbehind:!0},hexcode:{pattern:/\B#[\da-f]{3,8}\b/i,alias:"color"},color:[{pattern:/(^|[^\w-])(?:AliceBlue|AntiqueWhite|Aqua|Aquamarine|Azure|Beige|Bisque|Black|BlanchedAlmond|Blue|BlueViolet|Brown|BurlyWood|CadetBlue|Chartreuse|Chocolate|Coral|CornflowerBlue|Cornsilk|Crimson|Cyan|DarkBlue|DarkCyan|DarkGoldenRod|DarkGr[ae]y|DarkGreen|DarkKhaki|DarkMagenta|DarkOliveGreen|DarkOrange|DarkOrchid|DarkRed|DarkSalmon|DarkSeaGreen|DarkSlateBlue|DarkSlateGr[ae]y|DarkTurquoise|DarkViolet|DeepPink|DeepSkyBlue|DimGr[ae]y|DodgerBlue|FireBrick|FloralWhite|ForestGreen|Fuchsia|Gainsboro|GhostWhite|Gold|GoldenRod|Gr[ae]y|Green|GreenYellow|HoneyDew|HotPink|IndianRed|Indigo|Ivory|Khaki|Lavender|LavenderBlush|LawnGreen|LemonChiffon|LightBlue|LightCoral|LightCyan|LightGoldenRodYellow|LightGr[ae]y|LightGreen|LightPink|LightSalmon|LightSeaGreen|LightSkyBlue|LightSlateGr[ae]y|LightSteelBlue|LightYellow|Lime|LimeGreen|Linen|Magenta|Maroon|MediumAquaMarine|MediumBlue|MediumOrchid|MediumPurple|MediumSeaGreen|MediumSlateBlue|MediumSpringGreen|MediumTurquoise|MediumVioletRed|MidnightBlue|MintCream|MistyRose|Moccasin|NavajoWhite|Navy|OldLace|Olive|OliveDrab|Orange|OrangeRed|Orchid|PaleGoldenRod|PaleGreen|PaleTurquoise|PaleVioletRed|PapayaWhip|PeachPuff|Peru|Pink|Plum|PowderBlue|Purple|RebeccaPurple|Red|RosyBrown|RoyalBlue|SaddleBrown|Salmon|SandyBrown|SeaGreen|SeaShell|Sienna|Silver|SkyBlue|SlateBlue|SlateGr[ae]y|Snow|SpringGreen|SteelBlue|Tan|Teal|Thistle|Tomato|Transparent|Turquoise|Violet|Wheat|White|WhiteSmoke|Yellow|YellowGreen)(?![\w-])/i,lookbehind:!0},{pattern:/\b(?:hsl|rgb)\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*\)\B|\b(?:hsl|rgb)a\(\s*\d{1,3}\s*,\s*\d{1,3}%?\s*,\s*\d{1,3}%?\s*,\s*(?:0|0?\.\d+|1)\s*\)\B/i,inside:{unit:t,number:n,function:/[\w-]+(?=\()/,punctuation:/[(),]/}}],entity:/\\[\da-f]{1,8}/i,unit:t,number:n})}(k),function(e){var t=/[*&][^\s[\]{},]+/,n=/!(?:<[\w\-%#;/?:@&=+$,.!~*'()[\]]+>|(?:[a-zA-Z\d-]*!)?[\w\-%#;/?:@&=+$.~*'()]+)?/,r="(?:"+n.source+"(?:[ \t]+"+t.source+")?|"+t.source+"(?:[ \t]+"+n.source+")?)",o=/(?:[^\s\x00-\x08\x0e-\x1f!"#%&'*,\-:>?@[\]`{|}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]|[?:-]<PLAIN>)(?:[ \t]*(?:(?![#:])<PLAIN>|:<PLAIN>))*/.source.replace(/<PLAIN>/g,function(){return/[^\s\x00-\x08\x0e-\x1f,[\]{}\x7f-\x84\x86-\x9f\ud800-\udfff\ufffe\uffff]/.source}),a=/"(?:[^"\\\r\n]|\\.)*"|'(?:[^'\\\r\n]|\\.)*'/.source;function s(e,t){t=(t||"").replace(/m/g,"")+"m";var n=/([:\-,[{]\s*(?:\s<<prop>>[ \t]+)?)(?:<<value>>)(?=[ \t]*(?:$|,|\]|\}|(?:[\r\n]\s*)?#))/.source.replace(/<<prop>>/g,function(){return r}).replace(/<<value>>/g,function(){return e});return RegExp(n,t)}e.languages.yaml={scalar:{pattern:RegExp(/([\-:]\s*(?:\s<<prop>>[ \t]+)?[|>])[ \t]*(?:((?:\r?\n|\r)[ \t]+)\S[^\r\n]*(?:\2[^\r\n]+)*)/.source.replace(/<<prop>>/g,function(){return r})),lookbehind:!0,alias:"string"},comment:/#.*/,key:{pattern:RegExp(/((?:^|[:\-,[{\r\n?])[ \t]*(?:<<prop>>[ \t]+)?)<<key>>(?=\s*:\s)/.source.replace(/<<prop>>/g,function(){return r}).replace(/<<key>>/g,function(){return"(?:"+o+"|"+a+")"})),lookbehind:!0,greedy:!0,alias:"atrule"},directive:{pattern:/(^[ \t]*)%.+/m,lookbehind:!0,alias:"important"},datetime:{pattern:s(/\d{4}-\d\d?-\d\d?(?:[tT]|[ \t]+)\d\d?:\d{2}:\d{2}(?:\.\d*)?(?:[ \t]*(?:Z|[-+]\d\d?(?::\d{2})?))?|\d{4}-\d{2}-\d{2}|\d\d?:\d{2}(?::\d{2}(?:\.\d*)?)?/.source),lookbehind:!0,alias:"number"},boolean:{pattern:s(/false|true/.source,"i"),lookbehind:!0,alias:"important"},null:{pattern:s(/null|~/.source,"i"),lookbehind:!0,alias:"important"},string:{pattern:s(a),lookbehind:!0,greedy:!0},number:{pattern:s(/[+-]?(?:0x[\da-f]+|0o[0-7]+|(?:\d+(?:\.\d*)?|\.\d+)(?:e[+-]?\d+)?|\.inf|\.nan)/.source,"i"),lookbehind:!0},tag:n,important:t,punctuation:/---|[:[\]{}\-,|>?]|\.\.\./},e.languages.yml=e.languages.yaml}(k),function(e){var t=/(?:\\.|[^\\\n\r]|(?:\n|\r\n?)(?![\r\n]))/.source;function n(e){return e=e.replace(/<inner>/g,function(){return t}),RegExp(/((?:^|[^\\])(?:\\{2})*)/.source+"(?:"+e+")")}var r=/(?:\\.|``(?:[^`\r\n]|`(?!`))+``|`[^`\r\n]+`|[^\\|\r\n`])+/.source,o=/\|?__(?:\|__)+\|?(?:(?:\n|\r\n?)|(?![\s\S]))/.source.replace(/__/g,function(){return r}),a=/\|?[ \t]*:?-{3,}:?[ \t]*(?:\|[ \t]*:?-{3,}:?[ \t]*)+\|?(?:\n|\r\n?)/.source,s=(e.languages.markdown=e.languages.extend("markup",{}),e.languages.insertBefore("markdown","prolog",{"front-matter-block":{pattern:/(^(?:\s*[\r\n])?)---(?!.)[\s\S]*?[\r\n]---(?!.)/,lookbehind:!0,greedy:!0,inside:{punctuation:/^---|---$/,"front-matter":{pattern:/\S+(?:\s+\S+)*/,alias:["yaml","language-yaml"],inside:e.languages.yaml}}},blockquote:{pattern:/^>(?:[\t ]*>)*/m,alias:"punctuation"},table:{pattern:RegExp("^"+o+a+"(?:"+o+")*","m"),inside:{"table-data-rows":{pattern:RegExp("^("+o+a+")(?:"+o+")*$"),lookbehind:!0,inside:{"table-data":{pattern:RegExp(r),inside:e.languages.markdown},punctuation:/\|/}},"table-line":{pattern:RegExp("^("+o+")"+a+"$"),lookbehind:!0,inside:{punctuation:/\||:?-{3,}:?/}},"table-header-row":{pattern:RegExp("^"+o+"$"),inside:{"table-header":{pattern:RegExp(r),alias:"important",inside:e.languages.markdown},punctuation:/\|/}}}},code:[{pattern:/((?:^|\n)[ \t]*\n|(?:^|\r\n?)[ \t]*\r\n?)(?: {4}|\t).+(?:(?:\n|\r\n?)(?: {4}|\t).+)*/,lookbehind:!0,alias:"keyword"},{pattern:/^```[\s\S]*?^```$/m,greedy:!0,inside:{"code-block":{pattern:/^(```.*(?:\n|\r\n?))[\s\S]+?(?=(?:\n|\r\n?)^```$)/m,lookbehind:!0},"code-language":{pattern:/^(```).+/,lookbehind:!0},punctuation:/```/}}],title:[{pattern:/\S.*(?:\n|\r\n?)(?:==+|--+)(?=[ \t]*$)/m,alias:"important",inside:{punctuation:/==+$|--+$/}},{pattern:/(^\s*)#.+/m,lookbehind:!0,alias:"important",inside:{punctuation:/^#+|#+$/}}],hr:{pattern:/(^\s*)([*-])(?:[\t ]*\2){2,}(?=\s*$)/m,lookbehind:!0,alias:"punctuation"},list:{pattern:/(^\s*)(?:[*+-]|\d+\.)(?=[\t ].)/m,lookbehind:!0,alias:"punctuation"},"url-reference":{pattern:/!?\[[^\]]+\]:[\t ]+(?:\S+|<(?:\\.|[^>\\])+>)(?:[\t ]+(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\)))?/,inside:{variable:{pattern:/^(!?\[)[^\]]+/,lookbehind:!0},string:/(?:"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|\((?:\\.|[^)\\])*\))$/,punctuation:/^[\[\]!:]|[<>]/},alias:"url"},bold:{pattern:n(/\b__(?:(?!_)<inner>|_(?:(?!_)<inner>)+_)+__\b|\*\*(?:(?!\*)<inner>|\*(?:(?!\*)<inner>)+\*)+\*\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^..)[\s\S]+(?=..$)/,lookbehind:!0,inside:{}},punctuation:/\*\*|__/}},italic:{pattern:n(/\b_(?:(?!_)<inner>|__(?:(?!_)<inner>)+__)+_\b|\*(?:(?!\*)<inner>|\*\*(?:(?!\*)<inner>)+\*\*)+\*/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^.)[\s\S]+(?=.$)/,lookbehind:!0,inside:{}},punctuation:/[*_]/}},strike:{pattern:n(/(~~?)(?:(?!~)<inner>)+\2/.source),lookbehind:!0,greedy:!0,inside:{content:{pattern:/(^~~?)[\s\S]+(?=\1$)/,lookbehind:!0,inside:{}},punctuation:/~~?/}},"code-snippet":{pattern:/(^|[^\\`])(?:``[^`\r\n]+(?:`[^`\r\n]+)*``(?!`)|`[^`\r\n]+`(?!`))/,lookbehind:!0,greedy:!0,alias:["code","keyword"]},url:{pattern:n(/!?\[(?:(?!\])<inner>)+\](?:\([^\s)]+(?:[\t ]+"(?:\\.|[^"\\])*")?\)|[ \t]?\[(?:(?!\])<inner>)+\])/.source),lookbehind:!0,greedy:!0,inside:{operator:/^!/,content:{pattern:/(^\[)[^\]]+(?=\])/,lookbehind:!0,inside:{}},variable:{pattern:/(^\][ \t]?\[)[^\]]+(?=\]$)/,lookbehind:!0},url:{pattern:/(^\]\()[^\s)]+/,lookbehind:!0},string:{pattern:/(^[ \t]+)"(?:\\.|[^"\\])*"(?=\)$)/,lookbehind:!0}}}}),["url","bold","italic","strike"].forEach(function(t){["url","bold","italic","strike","code-snippet"].forEach(function(n){t!==n&&(e.languages.markdown[t].inside.content.inside[n]=e.languages.markdown[n])})}),e.hooks.add("after-tokenize",function(e){"markdown"!==e.language&&"md"!==e.language||function e(t){if(t&&"string"!=typeof t)for(var n=0,r=t.length;n<r;n++){var o,a=t[n];"code"!==a.type?e(a.content):(o=a.content[1],a=a.content[3],o&&a&&"code-language"===o.type&&"code-block"===a.type&&"string"==typeof o.content&&(o=o.content.replace(/\b#/g,"sharp").replace(/\b\+\+/g,"pp"),o="language-"+(o=(/[a-z][\w-]*/i.exec(o)||[""])[0].toLowerCase()),a.alias?"string"==typeof a.alias?a.alias=[a.alias,o]:a.alias.push(o):a.alias=[o]))}}(e.tokens)}),e.hooks.add("wrap",function(t){if("code-block"===t.type){for(var n="",r=0,o=t.classes.length;r<o;r++){var a=t.classes[r];if(a=/language-(.+)/.exec(a)){n=a[1];break}}var l,u=e.languages[n];u?t.content=e.highlight(t.content.replace(s,"").replace(/&(\w{1,8}|#x?[\da-f]{1,8});/gi,function(e,t){var n;return"#"===(t=t.toLowerCase())[0]?(n="x"===t[1]?parseInt(t.slice(2),16):Number(t.slice(1)),c(n)):i[t]||e}),u,n):n&&"none"!==n&&e.plugins.autoloader&&(l="md-"+(new Date).valueOf()+"-"+Math.floor(1e16*Math.random()),t.attributes.id=l,e.plugins.autoloader.loadLanguages(n,function(){var t=document.getElementById(l);t&&(t.innerHTML=e.highlight(t.textContent,e.languages[n],n))}))}}),RegExp(e.languages.markup.tag.pattern.source,"gi")),i={amp:"&",lt:"<",gt:">",quot:'"'},c=String.fromCodePoint||String.fromCharCode;e.languages.md=e.languages.markdown}(k),k.languages.graphql={comment:/#.*/,description:{pattern:/(?:"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*")(?=\s*[a-z_])/i,greedy:!0,alias:"string",inside:{"language-markdown":{pattern:/(^"(?:"")?)(?!\1)[\s\S]+(?=\1$)/,lookbehind:!0,inside:k.languages.markdown}}},string:{pattern:/"""(?:[^"]|(?!""")")*"""|"(?:\\.|[^\\"\r\n])*"/,greedy:!0},number:/(?:\B-|\b)\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,boolean:/\b(?:false|true)\b/,variable:/\$[a-z_]\w*/i,directive:{pattern:/@[a-z_]\w*/i,alias:"function"},"attr-name":{pattern:/\b[a-z_]\w*(?=\s*(?:\((?:[^()"]|"(?:\\.|[^\\"\r\n])*")*\))?:)/i,greedy:!0},"atom-input":{pattern:/\b[A-Z]\w*Input\b/,alias:"class-name"},scalar:/\b(?:Boolean|Float|ID|Int|String)\b/,constant:/\b[A-Z][A-Z_\d]*\b/,"class-name":{pattern:/(\b(?:enum|implements|interface|on|scalar|type|union)\s+|&\s*|:\s*|\[)[A-Z_]\w*/,lookbehind:!0},fragment:{pattern:/(\bfragment\s+|\.{3}\s*(?!on\b))[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-mutation":{pattern:/(\bmutation\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},"definition-query":{pattern:/(\bquery\s+)[a-zA-Z_]\w*/,lookbehind:!0,alias:"function"},keyword:/\b(?:directive|enum|extend|fragment|implements|input|interface|mutation|on|query|repeatable|scalar|schema|subscription|type|union)\b/,operator:/[!=|&]|\.{3}/,"property-query":/\w+(?=\s*\()/,object:/\w+(?=\s*\{)/,punctuation:/[!(){}\[\]:=,]/,property:/\w+/},k.hooks.add("after-tokenize",function(e){if("graphql"===e.language)for(var t=e.tokens.filter(function(e){return"string"!=typeof e&&"comment"!==e.type&&"scalar"!==e.type}),n=0;n<t.length;){var r=t[n++];if("keyword"===r.type&&"mutation"===r.content){var o=[];if(d(["definition-mutation","punctuation"])&&"("===u(1).content){n+=2;var a=p(/^\($/,/^\)$/);if(-1===a)continue;for(;n<a;n++){var s=u(0);"variable"===s.type&&(f(s,"variable-input"),o.push(s.content))}n=a+1}if(d(["punctuation","property-query"])&&"{"===u(0).content&&(n++,f(u(0),"property-mutation"),0<o.length)){var i=p(/^\{$/,/^\}$/);if(-1!==i)for(var c=n;c<i;c++){var l=t[c];"variable"===l.type&&0<=o.indexOf(l.content)&&f(l,"variable-input")}}}}function u(e){return t[n+e]}function d(e,t){t=t||0;for(var n=0;n<e.length;n++){var r=u(n+t);if(!r||r.type!==e[n])return}return 1}function p(e,r){for(var o=1,a=n;a<t.length;a++){var s=t[a],i=s.content;if("punctuation"===s.type&&"string"==typeof i)if(e.test(i))o++;else if(r.test(i)&&0===--o)return a}return-1}function f(e,t){var n=e.alias;n?Array.isArray(n)||(e.alias=n=[n]):e.alias=n=[],n.push(t)}}),k.languages.sql={comment:{pattern:/(^|[^\\])(?:\/\*[\s\S]*?\*\/|(?:--|\/\/|#).*)/,lookbehind:!0},variable:[{pattern:/@(["'`])(?:\\[\s\S]|(?!\1)[^\\])+\1/,greedy:!0},/@[\w.$]+/],string:{pattern:/(^|[^@\\])("|')(?:\\[\s\S]|(?!\2)[^\\]|\2\2)*\2/,greedy:!0,lookbehind:!0},identifier:{pattern:/(^|[^@\\])`(?:\\[\s\S]|[^`\\]|``)*`/,greedy:!0,lookbehind:!0,inside:{punctuation:/^`|`$/}},function:/\b(?:AVG|COUNT|FIRST|FORMAT|LAST|LCASE|LEN|MAX|MID|MIN|MOD|NOW|ROUND|SUM|UCASE)(?=\s*\()/i,keyword:/\b(?:ACTION|ADD|AFTER|ALGORITHM|ALL|ALTER|ANALYZE|ANY|APPLY|AS|ASC|AUTHORIZATION|AUTO_INCREMENT|BACKUP|BDB|BEGIN|BERKELEYDB|BIGINT|BINARY|BIT|BLOB|BOOL|BOOLEAN|BREAK|BROWSE|BTREE|BULK|BY|CALL|CASCADED?|CASE|CHAIN|CHAR(?:ACTER|SET)?|CHECK(?:POINT)?|CLOSE|CLUSTERED|COALESCE|COLLATE|COLUMNS?|COMMENT|COMMIT(?:TED)?|COMPUTE|CONNECT|CONSISTENT|CONSTRAINT|CONTAINS(?:TABLE)?|CONTINUE|CONVERT|CREATE|CROSS|CURRENT(?:_DATE|_TIME|_TIMESTAMP|_USER)?|CURSOR|CYCLE|DATA(?:BASES?)?|DATE(?:TIME)?|DAY|DBCC|DEALLOCATE|DEC|DECIMAL|DECLARE|DEFAULT|DEFINER|DELAYED|DELETE|DELIMITERS?|DENY|DESC|DESCRIBE|DETERMINISTIC|DISABLE|DISCARD|DISK|DISTINCT|DISTINCTROW|DISTRIBUTED|DO|DOUBLE|DROP|DUMMY|DUMP(?:FILE)?|DUPLICATE|ELSE(?:IF)?|ENABLE|ENCLOSED|END|ENGINE|ENUM|ERRLVL|ERRORS|ESCAPED?|EXCEPT|EXEC(?:UTE)?|EXISTS|EXIT|EXPLAIN|EXTENDED|FETCH|FIELDS|FILE|FILLFACTOR|FIRST|FIXED|FLOAT|FOLLOWING|FOR(?: EACH ROW)?|FORCE|FOREIGN|FREETEXT(?:TABLE)?|FROM|FULL|FUNCTION|GEOMETRY(?:COLLECTION)?|GLOBAL|GOTO|GRANT|GROUP|HANDLER|HASH|HAVING|HOLDLOCK|HOUR|IDENTITY(?:COL|_INSERT)?|IF|IGNORE|IMPORT|INDEX|INFILE|INNER|INNODB|INOUT|INSERT|INT|INTEGER|INTERSECT|INTERVAL|INTO|INVOKER|ISOLATION|ITERATE|JOIN|KEYS?|KILL|LANGUAGE|LAST|LEAVE|LEFT|LEVEL|LIMIT|LINENO|LINES|LINESTRING|LOAD|LOCAL|LOCK|LONG(?:BLOB|TEXT)|LOOP|MATCH(?:ED)?|MEDIUM(?:BLOB|INT|TEXT)|MERGE|MIDDLEINT|MINUTE|MODE|MODIFIES|MODIFY|MONTH|MULTI(?:LINESTRING|POINT|POLYGON)|NATIONAL|NATURAL|NCHAR|NEXT|NO|NONCLUSTERED|NULLIF|NUMERIC|OFF?|OFFSETS?|ON|OPEN(?:DATASOURCE|QUERY|ROWSET)?|OPTIMIZE|OPTION(?:ALLY)?|ORDER|OUT(?:ER|FILE)?|OVER|PARTIAL|PARTITION|PERCENT|PIVOT|PLAN|POINT|POLYGON|PRECEDING|PRECISION|PREPARE|PREV|PRIMARY|PRINT|PRIVILEGES|PROC(?:EDURE)?|PUBLIC|PURGE|QUICK|RAISERROR|READS?|REAL|RECONFIGURE|REFERENCES|RELEASE|RENAME|REPEAT(?:ABLE)?|REPLACE|REPLICATION|REQUIRE|RESIGNAL|RESTORE|RESTRICT|RETURN(?:ING|S)?|REVOKE|RIGHT|ROLLBACK|ROUTINE|ROW(?:COUNT|GUIDCOL|S)?|RTREE|RULE|SAVE(?:POINT)?|SCHEMA|SECOND|SELECT|SERIAL(?:IZABLE)?|SESSION(?:_USER)?|SET(?:USER)?|SHARE|SHOW|SHUTDOWN|SIMPLE|SMALLINT|SNAPSHOT|SOME|SONAME|SQL|START(?:ING)?|STATISTICS|STATUS|STRIPED|SYSTEM_USER|TABLES?|TABLESPACE|TEMP(?:ORARY|TABLE)?|TERMINATED|TEXT(?:SIZE)?|THEN|TIME(?:STAMP)?|TINY(?:BLOB|INT|TEXT)|TOP?|TRAN(?:SACTIONS?)?|TRIGGER|TRUNCATE|TSEQUAL|TYPES?|UNBOUNDED|UNCOMMITTED|UNDEFINED|UNION|UNIQUE|UNLOCK|UNPIVOT|UNSIGNED|UPDATE(?:TEXT)?|USAGE|USE|USER|USING|VALUES?|VAR(?:BINARY|CHAR|CHARACTER|YING)|VIEW|WAITFOR|WARNINGS|WHEN|WHERE|WHILE|WITH(?: ROLLUP|IN)?|WORK|WRITE(?:TEXT)?|YEAR)\b/i,boolean:/\b(?:FALSE|NULL|TRUE)\b/i,number:/\b0x[\da-f]+\b|\b\d+(?:\.\d*)?|\B\.\d+\b/i,operator:/[-+*\/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?|\b(?:AND|BETWEEN|DIV|ILIKE|IN|IS|LIKE|NOT|OR|REGEXP|RLIKE|SOUNDS LIKE|XOR)\b/i,punctuation:/[;[\]()`,.]/},function(e){var t=e.languages.javascript["template-string"],n=t.pattern.source,r=t.inside.interpolation,o=r.inside["interpolation-punctuation"],a=r.pattern.source;function s(t,r){if(e.languages[t])return{pattern:RegExp("((?:"+r+")\\s*)"+n),lookbehind:!0,greedy:!0,inside:{"template-punctuation":{pattern:/^`|`$/,alias:"string"},"embedded-code":{pattern:/[\s\S]+/,alias:t}}}}function i(t,n,r){return t={code:t,grammar:n,language:r},e.hooks.run("before-tokenize",t),t.tokens=e.tokenize(t.code,t.grammar),e.hooks.run("after-tokenize",t),t.tokens}function c(t,n,s){var c=e.tokenize(t,{interpolation:{pattern:RegExp(a),lookbehind:!0}}),l=0,u={},d=(c=i(c.map(function(e){if("string"==typeof e)return e;var n,r;for(e=e.content;-1!==t.indexOf((r=l++,n="___"+s.toUpperCase()+"_"+r+"___")););return u[n]=e,n}).join(""),n,s),Object.keys(u));return l=0,function t(n){for(var a=0;a<n.length;a++){if(l>=d.length)return;var s,c,p,f,h,m,g,b=n[a];"string"==typeof b||"string"==typeof b.content?(s=d[l],-1!==(g=(m="string"==typeof b?b:b.content).indexOf(s))&&(++l,c=m.substring(0,g),h=u[s],p=void 0,(f={})["interpolation-punctuation"]=o,3===(f=e.tokenize(h,f)).length&&((p=[1,1]).push.apply(p,i(f[1],e.languages.javascript,"javascript")),f.splice.apply(f,p)),p=new e.Token("interpolation",f,r.alias,h),f=m.substring(g+s.length),h=[],c&&h.push(c),h.push(p),f&&(t(m=[f]),h.push.apply(h,m)),"string"==typeof b?(n.splice.apply(n,[a,1].concat(h)),a+=h.length-1):b.content=h)):(g=b.content,Array.isArray(g)?t(g):t([g]))}}(c),new e.Token(s,c,"language-"+s,t)}e.languages.javascript["template-string"]=[s("css",/\b(?:styled(?:\([^)]*\))?(?:\s*\.\s*\w+(?:\([^)]*\))*)*|css(?:\s*\.\s*(?:global|resolve))?|createGlobalStyle|keyframes)/.source),s("html",/\bhtml|\.\s*(?:inner|outer)HTML\s*\+?=/.source),s("svg",/\bsvg/.source),s("markdown",/\b(?:markdown|md)/.source),s("graphql",/\b(?:gql|graphql(?:\s*\.\s*experimental)?)/.source),s("sql",/\bsql/.source),t].filter(Boolean);var l={javascript:!0,js:!0,typescript:!0,ts:!0,jsx:!0,tsx:!0};function u(e){return"string"==typeof e?e:Array.isArray(e)?e.map(u).join(""):u(e.content)}e.hooks.add("after-tokenize",function(t){t.language in l&&function t(n){for(var r=0,o=n.length;r<o;r++){var a,s,i,l=n[r];"string"!=typeof l&&(a=l.content,Array.isArray(a)?"template-string"===l.type?(l=a[1],3===a.length&&"string"!=typeof l&&"embedded-code"===l.type&&(s=u(l),l=l.alias,l=Array.isArray(l)?l[0]:l,i=e.languages[l])&&(a[1]=c(s,i,l))):t(a):"string"!=typeof a&&t([a]))}}(t.tokens)})}(k),function(e){e.languages.typescript=e.languages.extend("javascript",{"class-name":{pattern:/(\b(?:class|extends|implements|instanceof|interface|new|type)\s+)(?!keyof\b)(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?:\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>)?/,lookbehind:!0,greedy:!0,inside:null},builtin:/\b(?:Array|Function|Promise|any|boolean|console|never|number|string|symbol|unknown)\b/}),e.languages.typescript.keyword.push(/\b(?:abstract|declare|is|keyof|readonly|require)\b/,/\b(?:asserts|infer|interface|module|namespace|type)\b(?=\s*(?:[{_$a-zA-Z\xA0-\uFFFF]|$))/,/\btype\b(?=\s*(?:[\{*]|$))/),delete e.languages.typescript.parameter,delete e.languages.typescript["literal-property"];var t=e.languages.extend("typescript",{});delete t["class-name"],e.languages.typescript["class-name"].inside=t,e.languages.insertBefore("typescript","function",{decorator:{pattern:/@[$\w\xA0-\uFFFF]+/,inside:{at:{pattern:/^@/,alias:"operator"},function:/^[\s\S]+/}},"generic-function":{pattern:/#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>(?=\s*\()/,greedy:!0,inside:{function:/^#?(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:t}}}}),e.languages.ts=e.languages.typescript}(k),function(e){var t=e.languages.javascript,n=/\{(?:[^{}]|\{(?:[^{}]|\{[^{}]*\})*\})+\}/.source,r="(@(?:arg|argument|param|property)\\s+(?:"+n+"\\s+)?)";e.languages.jsdoc=e.languages.extend("javadoclike",{parameter:{pattern:RegExp(r+/(?:(?!\s)[$\w\xA0-\uFFFF.])+(?=\s|$)/.source),lookbehind:!0,inside:{punctuation:/\./}}}),e.languages.insertBefore("jsdoc","keyword",{"optional-parameter":{pattern:RegExp(r+/\[(?:(?!\s)[$\w\xA0-\uFFFF.])+(?:=[^[\]]+)?\](?=\s|$)/.source),lookbehind:!0,inside:{parameter:{pattern:/(^\[)[$\w\xA0-\uFFFF\.]+/,lookbehind:!0,inside:{punctuation:/\./}},code:{pattern:/(=)[\s\S]*(?=\]$)/,lookbehind:!0,inside:t,alias:"language-javascript"},punctuation:/[=[\]]/}},"class-name":[{pattern:RegExp(/(@(?:augments|class|extends|interface|memberof!?|template|this|typedef)\s+(?:<TYPE>\s+)?)[A-Z]\w*(?:\.[A-Z]\w*)*/.source.replace(/<TYPE>/g,function(){return n})),lookbehind:!0,inside:{punctuation:/\./}},{pattern:RegExp("(@[a-z]+\\s+)"+n),lookbehind:!0,inside:{string:t.string,number:t.number,boolean:t.boolean,keyword:e.languages.typescript.keyword,operator:/=>|\.\.\.|[&|?:*]/,punctuation:/[.,;=<>{}()[\]]/}}],example:{pattern:/(@example\s+(?!\s))(?:[^@\s]|\s+(?!\s))+?(?=\s*(?:\*\s*)?(?:@\w|\*\/))/,lookbehind:!0,inside:{code:{pattern:/^([\t ]*(?:\*\s*)?)\S.*$/m,lookbehind:!0,inside:t,alias:"language-javascript"}}}}),e.languages.javadoclike.addSupport("javascript",e.languages.jsdoc)}(k),function(e){e.languages.flow=e.languages.extend("javascript",{}),e.languages.insertBefore("flow","keyword",{type:[{pattern:/\b(?:[Bb]oolean|Function|[Nn]umber|[Ss]tring|[Ss]ymbol|any|mixed|null|void)\b/,alias:"class-name"}]}),e.languages.flow["function-variable"].pattern=/(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*(?=\s*=\s*(?:function\b|(?:\([^()]*\)(?:\s*:\s*\w+)?|(?!\s)[_$a-z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*)\s*=>))/i,delete e.languages.flow.parameter,e.languages.insertBefore("flow","operator",{"flow-punctuation":{pattern:/\{\||\|\}/,alias:"punctuation"}}),Array.isArray(e.languages.flow.keyword)||(e.languages.flow.keyword=[e.languages.flow.keyword]),e.languages.flow.keyword.unshift({pattern:/(^|[^$]\b)(?:Class|declare|opaque|type)\b(?!\$)/,lookbehind:!0},{pattern:/(^|[^$]\B)\$(?:Diff|Enum|Exact|Keys|ObjMap|PropertyType|Record|Shape|Subtype|Supertype|await)\b(?!\$)/,lookbehind:!0})}(k),k.languages.n4js=k.languages.extend("javascript",{keyword:/\b(?:Array|any|boolean|break|case|catch|class|const|constructor|continue|debugger|declare|default|delete|do|else|enum|export|extends|false|finally|for|from|function|get|if|implements|import|in|instanceof|interface|let|module|new|null|number|package|private|protected|public|return|set|static|string|super|switch|this|throw|true|try|typeof|var|void|while|with|yield)\b/}),k.languages.insertBefore("n4js","constant",{annotation:{pattern:/@+\w+/,alias:"operator"}}),k.languages.n4jsd=k.languages.n4js,function(e){function t(e,t){return RegExp(e.replace(/<ID>/g,function(){return/(?!\s)[_$a-zA-Z\xA0-\uFFFF](?:(?!\s)[$\w\xA0-\uFFFF])*/.source}),t)}e.languages.insertBefore("javascript","function-variable",{"method-variable":{pattern:RegExp("(\\.\\s*)"+e.languages.javascript["function-variable"].pattern.source),lookbehind:!0,alias:["function-variable","method","function","property-access"]}}),e.languages.insertBefore("javascript","function",{method:{pattern:RegExp("(\\.\\s*)"+e.languages.javascript.function.source),lookbehind:!0,alias:["function","property-access"]}}),e.languages.insertBefore("javascript","constant",{"known-class-name":[{pattern:/\b(?:(?:Float(?:32|64)|(?:Int|Uint)(?:8|16|32)|Uint8Clamped)?Array|ArrayBuffer|BigInt|Boolean|DataView|Date|Error|Function|Intl|JSON|(?:Weak)?(?:Map|Set)|Math|Number|Object|Promise|Proxy|Reflect|RegExp|String|Symbol|WebAssembly)\b/,alias:"class-name"},{pattern:/\b(?:[A-Z]\w*)Error\b/,alias:"class-name"}]}),e.languages.insertBefore("javascript","keyword",{imports:{pattern:t(/(\bimport\b\s*)(?:<ID>(?:\s*,\s*(?:\*\s*as\s+<ID>|\{[^{}]*\}))?|\*\s*as\s+<ID>|\{[^{}]*\})(?=\s*\bfrom\b)/.source),lookbehind:!0,inside:e.languages.javascript},exports:{pattern:t(/(\bexport\b\s*)(?:\*(?:\s*as\s+<ID>)?(?=\s*\bfrom\b)|\{[^{}]*\})/.source),lookbehind:!0,inside:e.languages.javascript}}),e.languages.javascript.keyword.unshift({pattern:/\b(?:as|default|export|from|import)\b/,alias:"module"},{pattern:/\b(?:await|break|catch|continue|do|else|finally|for|if|return|switch|throw|try|while|yield)\b/,alias:"control-flow"},{pattern:/\bnull\b/,alias:["null","nil"]},{pattern:/\bundefined\b/,alias:"nil"}),e.languages.insertBefore("javascript","operator",{spread:{pattern:/\.{3}/,alias:"operator"},arrow:{pattern:/=>/,alias:"operator"}}),e.languages.insertBefore("javascript","punctuation",{"property-access":{pattern:t(/(\.\s*)#?<ID>/.source),lookbehind:!0},"maybe-class-name":{pattern:/(^|[^$\w\xA0-\uFFFF])[A-Z][$\w\xA0-\uFFFF]+/,lookbehind:!0},dom:{pattern:/\b(?:document|(?:local|session)Storage|location|navigator|performance|window)\b/,alias:"variable"},console:{pattern:/\bconsole(?=\s*\.)/,alias:"class-name"}});for(var n=["function","function-variable","method","method-variable","property-access"],r=0;r<n.length;r++){var o=n[r],a=e.languages.javascript[o];o=(a="RegExp"===e.util.type(a)?e.languages.javascript[o]={pattern:a}:a).inside||{};(a.inside=o)["maybe-class-name"]=/^[A-Z][\s\S]*/}}(k),function(e){var t=e.util.clone(e.languages.javascript),n=/(?:\s|\/\/.*(?!.)|\/\*(?:[^*]|\*(?!\/))\*\/)/.source,r=/(?:\{(?:\{(?:\{[^{}]*\}|[^{}])*\}|[^{}])*\})/.source,o=/(?:\{<S>*\.{3}(?:[^{}]|<BRACES>)*\})/.source;function a(e,t){return e=e.replace(/<S>/g,function(){return n}).replace(/<BRACES>/g,function(){return r}).replace(/<SPREAD>/g,function(){return o}),RegExp(e,t)}function s(t){for(var n=[],r=0;r<t.length;r++){var o=t[r],a=!1;"string"!=typeof o&&("tag"===o.type&&o.content[0]&&"tag"===o.content[0].type?"</"===o.content[0].content[0].content?0<n.length&&n[n.length-1].tagName===i(o.content[0].content[1])&&n.pop():"/>"!==o.content[o.content.length-1].content&&n.push({tagName:i(o.content[0].content[1]),openedBraces:0}):0<n.length&&"punctuation"===o.type&&"{"===o.content?n[n.length-1].openedBraces++:0<n.length&&0<n[n.length-1].openedBraces&&"punctuation"===o.type&&"}"===o.content?n[n.length-1].openedBraces--:a=!0),(a||"string"==typeof o)&&0<n.length&&0===n[n.length-1].openedBraces&&(a=i(o),r<t.length-1&&("string"==typeof t[r+1]||"plain-text"===t[r+1].type)&&(a+=i(t[r+1]),t.splice(r+1,1)),0<r&&("string"==typeof t[r-1]||"plain-text"===t[r-1].type)&&(a=i(t[r-1])+a,t.splice(r-1,1),r--),t[r]=new e.Token("plain-text",a,null,a)),o.content&&"string"!=typeof o.content&&s(o.content)}}o=a(o).source,e.languages.jsx=e.languages.extend("markup",t),e.languages.jsx.tag.pattern=a(/<\/?(?:[\w.:-]+(?:<S>+(?:[\w.:$-]+(?:=(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s{'"/>=]+|<BRACES>))?|<SPREAD>))*<S>*\/?)?>/.source),e.languages.jsx.tag.inside.tag.pattern=/^<\/?[^\s>\/]*/,e.languages.jsx.tag.inside["attr-value"].pattern=/=(?!\{)(?:"(?:\\[\s\S]|[^\\"])*"|'(?:\\[\s\S]|[^\\'])*'|[^\s'">]+)/,e.languages.jsx.tag.inside.tag.inside["class-name"]=/^[A-Z]\w*(?:\.[A-Z]\w*)*$/,e.languages.jsx.tag.inside.comment=t.comment,e.languages.insertBefore("inside","attr-name",{spread:{pattern:a(/<SPREAD>/.source),inside:e.languages.jsx}},e.languages.jsx.tag),e.languages.insertBefore("inside","special-attr",{script:{pattern:a(/=<BRACES>/.source),alias:"language-javascript",inside:{"script-punctuation":{pattern:/^=(?=\{)/,alias:"punctuation"},rest:e.languages.jsx}}},e.languages.jsx.tag);var i=function(e){return e?"string"==typeof e?e:"string"==typeof e.content?e.content:e.content.map(i).join(""):""};e.hooks.add("after-tokenize",function(e){"jsx"!==e.language&&"tsx"!==e.language||s(e.tokens)})}(k),function(e){var t=e.util.clone(e.languages.typescript);(t=(e.languages.tsx=e.languages.extend("jsx",t),delete e.languages.tsx.parameter,delete e.languages.tsx["literal-property"],e.languages.tsx.tag)).pattern=RegExp(/(^|[^\w$]|(?=<\/))/.source+"(?:"+t.pattern.source+")",t.pattern.flags),t.lookbehind=!0}(k),k.languages.swift={comment:{pattern:/(^|[^\\:])(?:\/\/.*|\/\*(?:[^/*]|\/(?!\*)|\*(?!\/)|\/\*(?:[^*]|\*(?!\/))*\*\/)*\*\/)/,lookbehind:!0,greedy:!0},"string-literal":[{pattern:RegExp(/(^|[^"#])/.source+"(?:"+/"(?:\\(?:\((?:[^()]|\([^()]*\))*\)|\r\n|[^(])|[^\\\r\n"])*"/.source+"|"+/"""(?:\\(?:\((?:[^()]|\([^()]*\))*\)|[^(])|[^\\"]|"(?!""))*"""/.source+")"+/(?!["#])/.source),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\\($/,alias:"punctuation"},punctuation:/\\(?=[\r\n])/,string:/[\s\S]+/}},{pattern:RegExp(/(^|[^"#])(#+)/.source+"(?:"+/"(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|\r\n|[^#])|[^\\\r\n])*?"/.source+"|"+/"""(?:\\(?:#+\((?:[^()]|\([^()]*\))*\)|[^#])|[^\\])*?"""/.source+")\\2"),lookbehind:!0,greedy:!0,inside:{interpolation:{pattern:/(\\#+\()(?:[^()]|\([^()]*\))*(?=\))/,lookbehind:!0,inside:null},"interpolation-punctuation":{pattern:/^\)|\\#+\($/,alias:"punctuation"},string:/[\s\S]+/}}],directive:{pattern:RegExp(/#/.source+"(?:"+/(?:elseif|if)\b/.source+"(?:[ \t]*"+/(?:![ \t]*)?(?:\b\w+\b(?:[ \t]*\((?:[^()]|\([^()]*\))*\))?|\((?:[^()]|\([^()]*\))*\))(?:[ \t]*(?:&&|\|\|))?/.source+")+|"+/(?:else|endif)\b/.source+")"),alias:"property",inside:{"directive-name":/^#\w+/,boolean:/\b(?:false|true)\b/,number:/\b\d+(?:\.\d+)*\b/,operator:/!|&&|\|\||[<>]=?/,punctuation:/[(),]/}},literal:{pattern:/#(?:colorLiteral|column|dsohandle|file(?:ID|Literal|Path)?|function|imageLiteral|line)\b/,alias:"constant"},"other-directive":{pattern:/#\w+\b/,alias:"property"},attribute:{pattern:/@\w+/,alias:"atrule"},"function-definition":{pattern:/(\bfunc\s+)\w+/,lookbehind:!0,alias:"function"},label:{pattern:/\b(break|continue)\s+\w+|\b[a-zA-Z_]\w*(?=\s*:\s*(?:for|repeat|while)\b)/,lookbehind:!0,alias:"important"},keyword:/\b(?:Any|Protocol|Self|Type|actor|as|assignment|associatedtype|associativity|async|await|break|case|catch|class|continue|convenience|default|defer|deinit|didSet|do|dynamic|else|enum|extension|fallthrough|fileprivate|final|for|func|get|guard|higherThan|if|import|in|indirect|infix|init|inout|internal|is|isolated|lazy|left|let|lowerThan|mutating|none|nonisolated|nonmutating|open|operator|optional|override|postfix|precedencegroup|prefix|private|protocol|public|repeat|required|rethrows|return|right|safe|self|set|some|static|struct|subscript|super|switch|throw|throws|try|typealias|unowned|unsafe|var|weak|where|while|willSet)\b/,boolean:/\b(?:false|true)\b/,nil:{pattern:/\bnil\b/,alias:"constant"},"short-argument":/\$\d+\b/,omit:{pattern:/\b_\b/,alias:"keyword"},number:/\b(?:[\d_]+(?:\.[\de_]+)?|0x[a-f0-9_]+(?:\.[a-f0-9p_]+)?|0b[01_]+|0o[0-7_]+)\b/i,"class-name":/\b[A-Z](?:[A-Z_\d]*[a-z]\w*)?\b/,function:/\b[a-z_]\w*(?=\s*\()/i,constant:/\b(?:[A-Z_]{2,}|k[A-Z][A-Za-z_]+)\b/,operator:/[-+*/%=!<>&|^~?]+|\.[.\-+*/%=!<>&|^~?]+/,punctuation:/[{}[\]();,.:\\]/},k.languages.swift["string-literal"].forEach(function(e){e.inside.interpolation.inside=k.languages.swift}),function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(k),k.languages.c=k.languages.extend("clike",{comment:{pattern:/\/\/(?:[^\r\n\\]|\\(?:\r\n?|\n|(?![\r\n])))*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},"class-name":{pattern:/(\b(?:enum|struct)\s+(?:__attribute__\s*\(\([\s\S]*?\)\)\s*)?)\w+|\b[a-z]\w*_t\b/,lookbehind:!0},keyword:/\b(?:_Alignas|_Alignof|_Atomic|_Bool|_Complex|_Generic|_Imaginary|_Noreturn|_Static_assert|_Thread_local|__attribute__|asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|inline|int|long|register|return|short|signed|sizeof|static|struct|switch|typedef|typeof|union|unsigned|void|volatile|while)\b/,function:/\b[a-z_]\w*(?=\s*\()/i,number:/(?:\b0x(?:[\da-f]+(?:\.[\da-f]*)?|\.[\da-f]+)(?:p[+-]?\d+)?|(?:\b\d+(?:\.\d*)?|\B\.\d+)(?:e[+-]?\d+)?)[ful]{0,4}/i,operator:/>>=?|<<=?|->|([-+&|:])\1|[?:~]|[-+*/%&|^!=<>]=?/}),k.languages.insertBefore("c","string",{char:{pattern:/'(?:\\(?:\r\n|[\s\S])|[^'\\\r\n]){0,32}'/,greedy:!0}}),k.languages.insertBefore("c","string",{macro:{pattern:/(^[\t ]*)#\s*[a-z](?:[^\r\n\\/]|\/(?!\*)|\/\*(?:[^*]|\*(?!\/))*\*\/|\\(?:\r\n|[\s\S]))*/im,lookbehind:!0,greedy:!0,alias:"property",inside:{string:[{pattern:/^(#\s*include\s*)<[^>]+>/,lookbehind:!0},k.languages.c.string],char:k.languages.c.char,comment:k.languages.c.comment,"macro-name":[{pattern:/(^#\s*define\s+)\w+\b(?!\()/i,lookbehind:!0},{pattern:/(^#\s*define\s+)\w+\b(?=\()/i,lookbehind:!0,alias:"function"}],directive:{pattern:/^(#\s*)[a-z]+/,lookbehind:!0,alias:"keyword"},"directive-hash":/^#/,punctuation:/##|\\(?=[\r\n])/,expression:{pattern:/\S[\s\S]*/,inside:k.languages.c}}}}),k.languages.insertBefore("c","function",{constant:/\b(?:EOF|NULL|SEEK_CUR|SEEK_END|SEEK_SET|__DATE__|__FILE__|__LINE__|__TIMESTAMP__|__TIME__|__func__|stderr|stdin|stdout)\b/}),delete k.languages.c.boolean,k.languages.objectivec=k.languages.extend("c",{string:{pattern:/@?"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"/,greedy:!0},keyword:/\b(?:asm|auto|break|case|char|const|continue|default|do|double|else|enum|extern|float|for|goto|if|in|inline|int|long|register|return|self|short|signed|sizeof|static|struct|super|switch|typedef|typeof|union|unsigned|void|volatile|while)\b|(?:@interface|@end|@implementation|@protocol|@class|@public|@protected|@private|@property|@try|@catch|@finally|@throw|@synthesize|@dynamic|@selector)\b/,operator:/-[->]?|\+\+?|!=?|<<?=?|>>?=?|==?|&&?|\|\|?|[~^%?*\/@]/}),delete k.languages.objectivec["class-name"],k.languages.objc=k.languages.objectivec,k.languages.reason=k.languages.extend("clike",{string:{pattern:/"(?:\\(?:\r\n|[\s\S])|[^\\\r\n"])*"/,greedy:!0},"class-name":/\b[A-Z]\w*/,keyword:/\b(?:and|as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|for|fun|function|functor|if|in|include|inherit|initializer|lazy|let|method|module|mutable|new|nonrec|object|of|open|or|private|rec|sig|struct|switch|then|to|try|type|val|virtual|when|while|with)\b/,operator:/\.{3}|:[:=]|\|>|->|=(?:==?|>)?|<=?|>=?|[|^?'#!~`]|[+\-*\/]\.?|\b(?:asr|land|lor|lsl|lsr|lxor|mod)\b/}),k.languages.insertBefore("reason","class-name",{char:{pattern:/'(?:\\x[\da-f]{2}|\\o[0-3][0-7][0-7]|\\\d{3}|\\.|[^'\\\r\n])'/,greedy:!0},constructor:/\b[A-Z]\w*\b(?!\s*\.)/,label:{pattern:/\b[a-z]\w*(?=::)/,alias:"symbol"}}),delete k.languages.reason.function,function(e){for(var t=/\/\*(?:[^*/]|\*(?!\/)|\/(?!\*)|<self>)*\*\//.source,n=0;n<2;n++)t=t.replace(/<self>/g,function(){return t});t=t.replace(/<self>/g,function(){return/[^\s\S]/.source}),e.languages.rust={comment:[{pattern:RegExp(/(^|[^\\])/.source+t),lookbehind:!0,greedy:!0},{pattern:/(^|[^\\:])\/\/.*/,lookbehind:!0,greedy:!0}],string:{pattern:/b?"(?:\\[\s\S]|[^\\"])*"|b?r(#*)"(?:[^"]|"(?!\1))*"\1/,greedy:!0},char:{pattern:/b?'(?:\\(?:x[0-7][\da-fA-F]|u\{(?:[\da-fA-F]_*){1,6}\}|.)|[^\\\r\n\t'])'/,greedy:!0},attribute:{pattern:/#!?\[(?:[^\[\]"]|"(?:\\[\s\S]|[^\\"])*")*\]/,greedy:!0,alias:"attr-name",inside:{string:null}},"closure-params":{pattern:/([=(,:]\s*|\bmove\s*)\|[^|]*\||\|[^|]*\|(?=\s*(?:\{|->))/,lookbehind:!0,greedy:!0,inside:{"closure-punctuation":{pattern:/^\||\|$/,alias:"punctuation"},rest:null}},"lifetime-annotation":{pattern:/'\w+/,alias:"symbol"},"fragment-specifier":{pattern:/(\$\w+:)[a-z]+/,lookbehind:!0,alias:"punctuation"},variable:/\$\w+/,"function-definition":{pattern:/(\bfn\s+)\w+/,lookbehind:!0,alias:"function"},"type-definition":{pattern:/(\b(?:enum|struct|trait|type|union)\s+)\w+/,lookbehind:!0,alias:"class-name"},"module-declaration":[{pattern:/(\b(?:crate|mod)\s+)[a-z][a-z_\d]*/,lookbehind:!0,alias:"namespace"},{pattern:/(\b(?:crate|self|super)\s*)::\s*[a-z][a-z_\d]*\b(?:\s*::(?:\s*[a-z][a-z_\d]*\s*::)*)?/,lookbehind:!0,alias:"namespace",inside:{punctuation:/::/}}],keyword:[/\b(?:Self|abstract|as|async|await|become|box|break|const|continue|crate|do|dyn|else|enum|extern|final|fn|for|if|impl|in|let|loop|macro|match|mod|move|mut|override|priv|pub|ref|return|self|static|struct|super|trait|try|type|typeof|union|unsafe|unsized|use|virtual|where|while|yield)\b/,/\b(?:bool|char|f(?:32|64)|[ui](?:8|16|32|64|128|size)|str)\b/],function:/\b[a-z_]\w*(?=\s*(?:::\s*<|\())/,macro:{pattern:/\b\w+!/,alias:"property"},constant:/\b[A-Z_][A-Z_\d]+\b/,"class-name":/\b[A-Z]\w*\b/,namespace:{pattern:/(?:\b[a-z][a-z_\d]*\s*::\s*)*\b[a-z][a-z_\d]*\s*::(?!\s*<)/,inside:{punctuation:/::/}},number:/\b(?:0x[\dA-Fa-f](?:_?[\dA-Fa-f])*|0o[0-7](?:_?[0-7])*|0b[01](?:_?[01])*|(?:(?:\d(?:_?\d)*)?\.)?\d(?:_?\d)*(?:[Ee][+-]?\d+)?)(?:_?(?:f32|f64|[iu](?:8|16|32|64|size)?))?\b/,boolean:/\b(?:false|true)\b/,punctuation:/->|\.\.=|\.{1,3}|::|[{}[\];(),:]/,operator:/[-+*\/%!^]=?|=[=>]?|&[&=]?|\|[|=]?|<<?=?|>>?=?|[@?]/},e.languages.rust["closure-params"].inside.rest=e.languages.rust,e.languages.rust.attribute.inside.string=e.languages.rust.string}(k),k.languages.go=k.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"|`[^`]*`/,lookbehind:!0,greedy:!0},keyword:/\b(?:break|case|chan|const|continue|default|defer|else|fallthrough|for|func|go(?:to)?|if|import|interface|map|package|range|return|select|struct|switch|type|var)\b/,boolean:/\b(?:_|false|iota|nil|true)\b/,number:[/\b0(?:b[01_]+|o[0-7_]+)i?\b/i,/\b0x(?:[a-f\d_]+(?:\.[a-f\d_]*)?|\.[a-f\d_]+)(?:p[+-]?\d+(?:_\d+)*)?i?(?!\w)/i,/(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?[\d_]+)?i?(?!\w)/i],operator:/[*\/%^!=]=?|\+[=+]?|-[=-]?|\|[=|]?|&(?:=|&|\^=?)?|>(?:>=?|=)?|<(?:<=?|=|-)?|:=|\.\.\./,builtin:/\b(?:append|bool|byte|cap|close|complex|complex(?:64|128)|copy|delete|error|float(?:32|64)|u?int(?:8|16|32|64)?|imag|len|make|new|panic|print(?:ln)?|real|recover|rune|string|uintptr)\b/}),k.languages.insertBefore("go","string",{char:{pattern:/'(?:\\.|[^'\\\r\n]){0,10}'/,greedy:!0}}),delete k.languages.go["class-name"],function(e){var t=/\b(?:alignas|alignof|asm|auto|bool|break|case|catch|char|char16_t|char32_t|char8_t|class|co_await|co_return|co_yield|compl|concept|const|const_cast|consteval|constexpr|constinit|continue|decltype|default|delete|do|double|dynamic_cast|else|enum|explicit|export|extern|final|float|for|friend|goto|if|import|inline|int|int16_t|int32_t|int64_t|int8_t|long|module|mutable|namespace|new|noexcept|nullptr|operator|override|private|protected|public|register|reinterpret_cast|requires|return|short|signed|sizeof|static|static_assert|static_cast|struct|switch|template|this|thread_local|throw|try|typedef|typeid|typename|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|using|virtual|void|volatile|wchar_t|while)\b/,n=/\b(?!<keyword>)\w+(?:\s*\.\s*\w+)*\b/.source.replace(/<keyword>/g,function(){return t.source});e.languages.cpp=e.languages.extend("c",{"class-name":[{pattern:RegExp(/(\b(?:class|concept|enum|struct|typename)\s+)(?!<keyword>)\w+/.source.replace(/<keyword>/g,function(){return t.source})),lookbehind:!0},/\b[A-Z]\w*(?=\s*::\s*\w+\s*\()/,/\b[A-Z_]\w*(?=\s*::\s*~\w+\s*\()/i,/\b\w+(?=\s*<(?:[^<>]|<(?:[^<>]|<[^<>]*>)*>)*>\s*::\s*\w+\s*\()/],keyword:t,number:{pattern:/(?:\b0b[01']+|\b0x(?:[\da-f']+(?:\.[\da-f']*)?|\.[\da-f']+)(?:p[+-]?[\d']+)?|(?:\b[\d']+(?:\.[\d']*)?|\B\.[\d']+)(?:e[+-]?[\d']+)?)[ful]{0,4}/i,greedy:!0},operator:/>>=?|<<=?|->|--|\+\+|&&|\|\||[?:~]|<=>|[-+*/%&|^!=<>]=?|\b(?:and|and_eq|bitand|bitor|not|not_eq|or|or_eq|xor|xor_eq)\b/,boolean:/\b(?:false|true)\b/}),e.languages.insertBefore("cpp","string",{module:{pattern:RegExp(/(\b(?:import|module)\s+)/.source+"(?:"+/"(?:\\(?:\r\n|[\s\S])|[^"\\\r\n])*"|<[^<>\r\n]*>/.source+"|"+/<mod-name>(?:\s*:\s*<mod-name>)?|:\s*<mod-name>/.source.replace(/<mod-name>/g,function(){return n})+")"),lookbehind:!0,greedy:!0,inside:{string:/^[<"][\s\S]+/,operator:/:/,punctuation:/\./}},"raw-string":{pattern:/R"([^()\\ ]{0,16})\([\s\S]*?\)\1"/,alias:"string",greedy:!0}}),e.languages.insertBefore("cpp","keyword",{"generic-function":{pattern:/\b(?!operator\b)[a-z_]\w*\s*<(?:[^<>]|<[^<>]*>)*>(?=\s*\()/i,inside:{function:/^\w+/,generic:{pattern:/<[\s\S]+/,alias:"class-name",inside:e.languages.cpp}}}}),e.languages.insertBefore("cpp","operator",{"double-colon":{pattern:/::/,alias:"punctuation"}}),e.languages.insertBefore("cpp","class-name",{"base-clause":{pattern:/(\b(?:class|struct)\s+\w+\s*:\s*)[^;{}"'\s]+(?:\s+[^;{}"'\s]+)*(?=\s*[;{])/,lookbehind:!0,greedy:!0,inside:e.languages.extend("cpp",{})}}),e.languages.insertBefore("inside","double-colon",{"class-name":/\b[a-z_]\w*\b(?!\s*::)/i},e.languages.cpp["base-clause"])}(k),k.languages.python={comment:{pattern:/(^|[^\\])#.*/,lookbehind:!0,greedy:!0},"string-interpolation":{pattern:/(?:f|fr|rf)(?:("""|''')[\s\S]*?\1|("|')(?:\\.|(?!\2)[^\\\r\n])*\2)/i,greedy:!0,inside:{interpolation:{pattern:/((?:^|[^{])(?:\{\{)*)\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}]|\{(?!\{)(?:[^{}])+\})+\})+\}/,lookbehind:!0,inside:{"format-spec":{pattern:/(:)[^:(){}]+(?=\}$)/,lookbehind:!0},"conversion-option":{pattern:/![sra](?=[:}]$)/,alias:"punctuation"},rest:null}},string:/[\s\S]+/}},"triple-quoted-string":{pattern:/(?:[rub]|br|rb)?("""|''')[\s\S]*?\1/i,greedy:!0,alias:"string"},string:{pattern:/(?:[rub]|br|rb)?("|')(?:\\.|(?!\1)[^\\\r\n])*\1/i,greedy:!0},function:{pattern:/((?:^|\s)def[ \t]+)[a-zA-Z_]\w*(?=\s*\()/g,lookbehind:!0},"class-name":{pattern:/(\bclass\s+)\w+/i,lookbehind:!0},decorator:{pattern:/(^[\t ]*)@\w+(?:\.\w+)*/m,lookbehind:!0,alias:["annotation","punctuation"],inside:{punctuation:/\./}},keyword:/\b(?:_(?=\s*:)|and|as|assert|async|await|break|case|class|continue|def|del|elif|else|except|exec|finally|for|from|global|if|import|in|is|lambda|match|nonlocal|not|or|pass|print|raise|return|try|while|with|yield)\b/,builtin:/\b(?:__import__|abs|all|any|apply|ascii|basestring|bin|bool|buffer|bytearray|bytes|callable|chr|classmethod|cmp|coerce|compile|complex|delattr|dict|dir|divmod|enumerate|eval|execfile|file|filter|float|format|frozenset|getattr|globals|hasattr|hash|help|hex|id|input|int|intern|isinstance|issubclass|iter|len|list|locals|long|map|max|memoryview|min|next|object|oct|open|ord|pow|property|range|raw_input|reduce|reload|repr|reversed|round|set|setattr|slice|sorted|staticmethod|str|sum|super|tuple|type|unichr|unicode|vars|xrange|zip)\b/,boolean:/\b(?:False|None|True)\b/,number:/\b0(?:b(?:_?[01])+|o(?:_?[0-7])+|x(?:_?[a-f0-9])+)\b|(?:\b\d+(?:_\d+)*(?:\.(?:\d+(?:_\d+)*)?)?|\B\.\d+(?:_\d+)*)(?:e[+-]?\d+(?:_\d+)*)?j?(?!\w)/i,operator:/[-+%=]=?|!=|:=|\*\*?=?|\/\/?=?|<[<=>]?|>[=>]?|[&|^~]/,punctuation:/[{}[\];(),.:]/},k.languages.python["string-interpolation"].inside.interpolation.inside.rest=k.languages.python,k.languages.py=k.languages.python,k.languages.json={property:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?=\s*:)/,lookbehind:!0,greedy:!0},string:{pattern:/(^|[^\\])"(?:\\.|[^\\"\r\n])*"(?!\s*:)/,lookbehind:!0,greedy:!0},comment:{pattern:/\/\/.*|\/\*[\s\S]*?(?:\*\/|$)/,greedy:!0},number:/-?\b\d+(?:\.\d+)?(?:e[+-]?\d+)?\b/i,punctuation:/[{}[\],]/,operator:/:/,boolean:/\b(?:false|true)\b/,null:{pattern:/\bnull\b/,alias:"keyword"}},k.languages.webmanifest=k.languages.json;((e,t)=>{for(var n in t)c(e,n,{get:t[n],enumerable:!0})})({},{dracula:()=>w,duotoneDark:()=>C,duotoneLight:()=>x,github:()=>S,gruvboxMaterialDark:()=>U,gruvboxMaterialLight:()=>q,jettwaveDark:()=>F,jettwaveLight:()=>z,nightOwl:()=>M,nightOwlLight:()=>E,oceanicNext:()=>j,okaidia:()=>D,oneDark:()=>B,oneLight:()=>$,palenight:()=>P,shadesOfPurple:()=>T,synthwave84:()=>I,ultramin:()=>N,vsDark:()=>L,vsLight:()=>R});var w={plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},C={plain:{backgroundColor:"#2a2734",color:"#9a86fd"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#6c6783"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#e09142"}},{types:["property","function"],style:{color:"#9a86fd"}},{types:["tag-id","selector","atrule-id"],style:{color:"#eeebff"}},{types:["attr-name"],style:{color:"#c4b9fe"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule","placeholder","variable"],style:{color:"#ffcc99"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#c4b9fe"}}]},x={plain:{backgroundColor:"#faf8f5",color:"#728fcb"},styles:[{types:["comment","prolog","doctype","cdata","punctuation"],style:{color:"#b6ad9a"}},{types:["namespace"],style:{opacity:.7}},{types:["tag","operator","number"],style:{color:"#063289"}},{types:["property","function"],style:{color:"#b29762"}},{types:["tag-id","selector","atrule-id"],style:{color:"#2d2006"}},{types:["attr-name"],style:{color:"#896724"}},{types:["boolean","string","entity","url","attr-value","keyword","control","directive","unit","statement","regex","atrule"],style:{color:"#728fcb"}},{types:["placeholder","variable"],style:{color:"#93abdc"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"#896724"}}]},S={plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},M={plain:{color:"#d6deeb",backgroundColor:"#011627"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(99, 119, 119)",fontStyle:"italic"}},{types:["string","url"],style:{color:"rgb(173, 219, 103)"}},{types:["variable"],style:{color:"rgb(214, 222, 235)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation"],style:{color:"rgb(199, 146, 234)"}},{types:["selector","doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(255, 203, 139)"}},{types:["tag","operator","keyword"],style:{color:"rgb(127, 219, 202)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["property"],style:{color:"rgb(128, 203, 196)"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}}]},E={plain:{color:"#403f53",backgroundColor:"#FBFBFB"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)",fontStyle:"italic"}},{types:["inserted","attr-name"],style:{color:"rgb(72, 118, 214)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(152, 159, 177)",fontStyle:"italic"}},{types:["string","builtin","char","constant","url"],style:{color:"rgb(72, 118, 214)"}},{types:["variable"],style:{color:"rgb(201, 103, 101)"}},{types:["number"],style:{color:"rgb(170, 9, 130)"}},{types:["punctuation"],style:{color:"rgb(153, 76, 195)"}},{types:["function","selector","doctype"],style:{color:"rgb(153, 76, 195)",fontStyle:"italic"}},{types:["class-name"],style:{color:"rgb(17, 17, 17)"}},{types:["tag"],style:{color:"rgb(153, 76, 195)"}},{types:["operator","property","keyword","namespace"],style:{color:"rgb(12, 150, 155)"}},{types:["boolean"],style:{color:"rgb(188, 84, 84)"}}]},O="#c5a5c5",A="#8dc891",j={plain:{backgroundColor:"#282c34",color:"#ffffff"},styles:[{types:["attr-name"],style:{color:O}},{types:["attr-value"],style:{color:A}},{types:["comment","block-comment","prolog","doctype","cdata","shebang"],style:{color:"#999999"}},{types:["property","number","function-name","constant","symbol","deleted"],style:{color:"#5a9bcf"}},{types:["boolean"],style:{color:"#ff8b50"}},{types:["tag"],style:{color:"#fc929e"}},{types:["string"],style:{color:A}},{types:["punctuation"],style:{color:A}},{types:["selector","char","builtin","inserted"],style:{color:"#D8DEE9"}},{types:["function"],style:{color:"#79b6f2"}},{types:["operator","entity","url","variable"],style:{color:"#d7deea"}},{types:["keyword"],style:{color:O}},{types:["atrule","class-name"],style:{color:"#FAC863"}},{types:["important"],style:{fontWeight:"400"}},{types:["bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}}]},D={plain:{color:"#f8f8f2",backgroundColor:"#272822"},styles:[{types:["changed"],style:{color:"rgb(162, 191, 252)",fontStyle:"italic"}},{types:["deleted"],style:{color:"#f92672",fontStyle:"italic"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)",fontStyle:"italic"}},{types:["comment"],style:{color:"#8292a2",fontStyle:"italic"}},{types:["string","url"],style:{color:"#a6e22e"}},{types:["variable"],style:{color:"#f8f8f2"}},{types:["number"],style:{color:"#ae81ff"}},{types:["builtin","char","constant","function","class-name"],style:{color:"#e6db74"}},{types:["punctuation"],style:{color:"#f8f8f2"}},{types:["selector","doctype"],style:{color:"#a6e22e",fontStyle:"italic"}},{types:["tag","operator","keyword"],style:{color:"#66d9ef"}},{types:["boolean"],style:{color:"#ae81ff"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)",opacity:.7}},{types:["tag","property"],style:{color:"#f92672"}},{types:["attr-name"],style:{color:"#a6e22e !important"}},{types:["doctype"],style:{color:"#8292a2"}},{types:["rule"],style:{color:"#e6db74"}}]},P={plain:{color:"#bfc7d5",backgroundColor:"#292d3e"},styles:[{types:["comment"],style:{color:"rgb(105, 112, 152)",fontStyle:"italic"}},{types:["string","inserted"],style:{color:"rgb(195, 232, 141)"}},{types:["number"],style:{color:"rgb(247, 140, 108)"}},{types:["builtin","char","constant","function"],style:{color:"rgb(130, 170, 255)"}},{types:["punctuation","selector"],style:{color:"rgb(199, 146, 234)"}},{types:["variable"],style:{color:"rgb(191, 199, 213)"}},{types:["class-name","attr-name"],style:{color:"rgb(255, 203, 107)"}},{types:["tag","deleted"],style:{color:"rgb(255, 85, 114)"}},{types:["operator"],style:{color:"rgb(137, 221, 255)"}},{types:["boolean"],style:{color:"rgb(255, 88, 116)"}},{types:["keyword"],style:{fontStyle:"italic"}},{types:["doctype"],style:{color:"rgb(199, 146, 234)",fontStyle:"italic"}},{types:["namespace"],style:{color:"rgb(178, 204, 214)"}},{types:["url"],style:{color:"rgb(221, 221, 221)"}}]},T={plain:{color:"#9EFEFF",backgroundColor:"#2D2A55"},styles:[{types:["changed"],style:{color:"rgb(255, 238, 128)"}},{types:["deleted"],style:{color:"rgba(239, 83, 80, 0.56)"}},{types:["inserted"],style:{color:"rgb(173, 219, 103)"}},{types:["comment"],style:{color:"rgb(179, 98, 255)",fontStyle:"italic"}},{types:["punctuation"],style:{color:"rgb(255, 255, 255)"}},{types:["constant"],style:{color:"rgb(255, 98, 140)"}},{types:["string","url"],style:{color:"rgb(165, 255, 144)"}},{types:["variable"],style:{color:"rgb(255, 238, 128)"}},{types:["number","boolean"],style:{color:"rgb(255, 98, 140)"}},{types:["attr-name"],style:{color:"rgb(255, 180, 84)"}},{types:["keyword","operator","property","namespace","tag","selector","doctype"],style:{color:"rgb(255, 157, 0)"}},{types:["builtin","char","constant","function","class-name"],style:{color:"rgb(250, 208, 0)"}}]},I={plain:{backgroundColor:"linear-gradient(to bottom, #2a2139 75%, #34294f)",backgroundImage:"#34294f",color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"},styles:[{types:["comment","block-comment","prolog","doctype","cdata"],style:{color:"#495495",fontStyle:"italic"}},{types:["punctuation"],style:{color:"#ccc"}},{types:["tag","attr-name","namespace","number","unit","hexcode","deleted"],style:{color:"#e2777a"}},{types:["property","selector"],style:{color:"#72f1b8",textShadow:"0 0 2px #100c0f, 0 0 10px #257c5575, 0 0 35px #21272475"}},{types:["function-name"],style:{color:"#6196cc"}},{types:["boolean","selector-id","function"],style:{color:"#fdfdfd",textShadow:"0 0 2px #001716, 0 0 3px #03edf975, 0 0 5px #03edf975, 0 0 8px #03edf975"}},{types:["class-name","maybe-class-name","builtin"],style:{color:"#fff5f6",textShadow:"0 0 2px #000, 0 0 10px #fc1f2c75, 0 0 5px #fc1f2c75, 0 0 25px #fc1f2c75"}},{types:["constant","symbol"],style:{color:"#f92aad",textShadow:"0 0 2px #100c0f, 0 0 5px #dc078e33, 0 0 10px #fff3"}},{types:["important","atrule","keyword","selector-class"],style:{color:"#f4eee4",textShadow:"0 0 2px #393a33, 0 0 8px #f39f0575, 0 0 2px #f39f0575"}},{types:["string","char","attr-value","regex","variable"],style:{color:"#f87c32"}},{types:["parameter"],style:{fontStyle:"italic"}},{types:["entity","url"],style:{color:"#67cdcc"}},{types:["operator"],style:{color:"ffffffee"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["entity"],style:{cursor:"help"}},{types:["inserted"],style:{color:"green"}}]},N={plain:{color:"#282a2e",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(197, 200, 198)"}},{types:["string","number","builtin","variable"],style:{color:"rgb(150, 152, 150)"}},{types:["class-name","function","tag","attr-name"],style:{color:"rgb(40, 42, 46)"}}]},L={plain:{color:"#9CDCFE",backgroundColor:"#1E1E1E"},styles:[{types:["prolog"],style:{color:"rgb(0, 0, 128)"}},{types:["comment"],style:{color:"rgb(106, 153, 85)"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"rgb(86, 156, 214)"}},{types:["number","inserted"],style:{color:"rgb(181, 206, 168)"}},{types:["constant"],style:{color:"rgb(100, 102, 149)"}},{types:["attr-name","variable"],style:{color:"rgb(156, 220, 254)"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"rgb(206, 145, 120)"}},{types:["selector"],style:{color:"rgb(215, 186, 125)"}},{types:["tag"],style:{color:"rgb(78, 201, 176)"}},{types:["tag"],languages:["markup"],style:{color:"rgb(86, 156, 214)"}},{types:["punctuation","operator"],style:{color:"rgb(212, 212, 212)"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"rgb(220, 220, 170)"}},{types:["class-name"],style:{color:"rgb(78, 201, 176)"}},{types:["char"],style:{color:"rgb(209, 105, 105)"}}]},R={plain:{color:"#000000",backgroundColor:"#ffffff"},styles:[{types:["comment"],style:{color:"rgb(0, 128, 0)"}},{types:["builtin"],style:{color:"rgb(0, 112, 193)"}},{types:["number","variable","inserted"],style:{color:"rgb(9, 134, 88)"}},{types:["operator"],style:{color:"rgb(0, 0, 0)"}},{types:["constant","char"],style:{color:"rgb(129, 31, 63)"}},{types:["tag"],style:{color:"rgb(128, 0, 0)"}},{types:["attr-name"],style:{color:"rgb(255, 0, 0)"}},{types:["deleted","string"],style:{color:"rgb(163, 21, 21)"}},{types:["changed","punctuation"],style:{color:"rgb(4, 81, 165)"}},{types:["function","keyword"],style:{color:"rgb(0, 0, 255)"}},{types:["class-name"],style:{color:"rgb(38, 127, 153)"}}]},F={plain:{color:"#f8fafc",backgroundColor:"#011627"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#569CD6"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#f8fafc"}},{types:["attr-name","variable"],style:{color:"#9CDCFE"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#cbd5e1"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#D4D4D4"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#7dd3fc"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},z={plain:{color:"#0f172a",backgroundColor:"#f1f5f9"},styles:[{types:["prolog"],style:{color:"#000080"}},{types:["comment"],style:{color:"#6A9955"}},{types:["builtin","changed","keyword","interpolation-punctuation"],style:{color:"#0c4a6e"}},{types:["number","inserted"],style:{color:"#B5CEA8"}},{types:["constant"],style:{color:"#0f172a"}},{types:["attr-name","variable"],style:{color:"#0c4a6e"}},{types:["deleted","string","attr-value","template-punctuation"],style:{color:"#64748b"}},{types:["selector"],style:{color:"#D7BA7D"}},{types:["tag"],style:{color:"#0ea5e9"}},{types:["tag"],languages:["markup"],style:{color:"#0ea5e9"}},{types:["punctuation","operator"],style:{color:"#475569"}},{types:["punctuation"],languages:["markup"],style:{color:"#808080"}},{types:["function"],style:{color:"#0e7490"}},{types:["class-name"],style:{color:"#0ea5e9"}},{types:["char"],style:{color:"#D16969"}}]},B={plain:{backgroundColor:"hsl(220, 13%, 18%)",color:"hsl(220, 14%, 71%)",textShadow:"0 1px rgba(0, 0, 0, 0.3)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(220, 10%, 40%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(220, 14%, 71%)"}},{types:["attr-name","class-name","maybe-class-name","boolean","constant","number","atrule"],style:{color:"hsl(29, 54%, 61%)"}},{types:["keyword"],style:{color:"hsl(286, 60%, 67%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(355, 65%, 65%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value"],style:{color:"hsl(95, 38%, 62%)"}},{types:["variable","operator","function"],style:{color:"hsl(207, 82%, 66%)"}},{types:["url"],style:{color:"hsl(187, 47%, 55%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(220, 14%, 71%)"}}]},$={plain:{backgroundColor:"hsl(230, 1%, 98%)",color:"hsl(230, 8%, 24%)"},styles:[{types:["comment","prolog","cdata"],style:{color:"hsl(230, 4%, 64%)"}},{types:["doctype","punctuation","entity"],style:{color:"hsl(230, 8%, 24%)"}},{types:["attr-name","class-name","boolean","constant","number","atrule"],style:{color:"hsl(35, 99%, 36%)"}},{types:["keyword"],style:{color:"hsl(301, 63%, 40%)"}},{types:["property","tag","symbol","deleted","important"],style:{color:"hsl(5, 74%, 59%)"}},{types:["selector","string","char","builtin","inserted","regex","attr-value","punctuation"],style:{color:"hsl(119, 34%, 47%)"}},{types:["variable","operator","function"],style:{color:"hsl(221, 87%, 60%)"}},{types:["url"],style:{color:"hsl(198, 99%, 37%)"}},{types:["deleted"],style:{textDecorationLine:"line-through"}},{types:["inserted"],style:{textDecorationLine:"underline"}},{types:["italic"],style:{fontStyle:"italic"}},{types:["important","bold"],style:{fontWeight:"bold"}},{types:["important"],style:{color:"hsl(230, 8%, 24%)"}}]},U={plain:{color:"#ebdbb2",backgroundColor:"#292828"},styles:[{types:["imports","class-name","maybe-class-name","constant","doctype","builtin","function"],style:{color:"#d8a657"}},{types:["property-access"],style:{color:"#7daea3"}},{types:["tag"],style:{color:"#e78a4e"}},{types:["attr-name","char","url","regex"],style:{color:"#a9b665"}},{types:["attr-value","string"],style:{color:"#89b482"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#ea6962"}},{types:["entity","number","symbol"],style:{color:"#d3869b"}}]},q={plain:{color:"#654735",backgroundColor:"#f9f5d7"},styles:[{types:["delimiter","boolean","keyword","selector","important","atrule","property","variable","deleted"],style:{color:"#af2528"}},{types:["imports","class-name","maybe-class-name","constant","doctype","builtin"],style:{color:"#b4730e"}},{types:["string","attr-value"],style:{color:"#477a5b"}},{types:["property-access"],style:{color:"#266b79"}},{types:["function","attr-name","char","url"],style:{color:"#72761e"}},{types:["tag"],style:{color:"#b94c07"}},{types:["comment","prolog","cdata","operator","inserted"],style:{color:"#a89984"}},{types:["entity","number","symbol"],style:{color:"#924f79"}}]},H=/\r\n|\r|\n/,V=e=>{0===e.length?e.push({types:["plain"],content:"\n",empty:!0}):1===e.length&&""===e[0].content&&(e[0].content="\n",e[0].empty=!0)},W=(e,t)=>{const n=e.length;return n>0&&e[n-1]===t?e:e.concat(t)},G=e=>{const t=[[]],n=[e],r=[0],o=[e.length];let a=0,s=0,i=[];const c=[i];for(;s>-1;){for(;(a=r[s]++)<o[s];){let e,l=t[s];const u=n[s][a];if("string"==typeof u?(l=s>0?l:["plain"],e=u):(l=W(l,u.type),u.alias&&(l=W(l,u.alias)),e=u.content),"string"!=typeof e){s++,t.push(l),n.push(e),r.push(0),o.push(e.length);continue}const d=e.split(H),p=d.length;i.push({types:l,content:d[0]});for(let t=1;t<p;t++)V(i),c.push(i=[]),i.push({types:l,content:d[t]})}s--,t.pop(),n.pop(),r.pop(),o.pop()}return V(i),c},K=(e,t)=>{const{plain:n}=e,r=e.styles.reduce((e,n)=>{const{languages:r,style:o}=n;return r&&!r.includes(t)||n.types.forEach(t=>{const n=y(y({},e[t]),o);e[t]=n}),e},{});return r.root=n,r.plain=v(y({},n),{backgroundColor:void 0}),r},Q=({children:e,language:t,code:n,theme:r,prism:o})=>{const i=t.toLowerCase(),c=K(r,i),l=(e=>(0,a.useCallback)(t=>{var n=t,{className:r,style:o,line:a}=n,i=_(n,["className","style","line"]);const c=v(y({},i),{className:(0,s.A)("token-line",r)});return"object"==typeof e&&"plain"in e&&(c.style=e.plain),"object"==typeof o&&(c.style=y(y({},c.style||{}),o)),c},[e]))(c),u=(e=>{const t=(0,a.useCallback)(({types:t,empty:n})=>{if(null!=e)return 1===t.length&&"plain"===t[0]?null!=n?{display:"inline-block"}:void 0:1===t.length&&null!=n?e[t[0]]:Object.assign(null!=n?{display:"inline-block"}:{},...t.map(t=>e[t]))},[e]);return(0,a.useCallback)(e=>{var n=e,{token:r,className:o,style:a}=n,i=_(n,["token","className","style"]);const c=v(y({},i),{className:(0,s.A)("token",...r.types,o),children:r.content,style:t(r)});return null!=a&&(c.style=y(y({},c.style||{}),a)),c},[t])})(c),d=(({prism:e,code:t,grammar:n,language:r})=>(0,a.useMemo)(()=>{if(null==n)return G([t]);const o={code:t,grammar:n,language:r,tokens:[]};return e.hooks.run("before-tokenize",o),o.tokens=e.tokenize(t,n),e.hooks.run("after-tokenize",o),G(o.tokens)},[t,n,r,e]))({prism:o,language:i,code:n,grammar:o.languages[i]});return e({tokens:d,className:`prism-code language-${i}`,style:null!=c?c.root:{},getLineProps:l,getTokenProps:u})},Y=e=>(0,a.createElement)(Q,v(y({},e),{prism:e.prism||k,theme:e.theme||L,code:e.code,language:e.language}))},4518:(e,t,n)=>{"use strict";function r(e){return/^(?:\w*:|\/\/)/.test(e)}function o(e){return void 0!==e&&!r(e)}n.d(t,{A:()=>o,z:()=>r})},4784:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>r});const r={title:"ModuleCheck",tagline:"Fast dependency graph linting for Gradle projects",url:"https://rbusarow.github.io",baseUrl:"/ModuleCheck/",onBrokenLinks:"throw",onBrokenMarkdownLinks:"throw",favicon:"img/favicon.ico",markdown:{mermaid:!0,format:"mdx",mdx1Compat:{comments:!0,admonitions:!0,headingIds:!0},anchors:{maintainCase:!1}},themes:["@docusaurus/theme-mermaid"],organizationName:"rickbusarow",projectName:"ModuleCheck",presets:[["classic",{docs:{remarkPlugins:[null],sidebarPath:"./sidebars.js",editUrl:"https://github.com/rbusarow/ModuleCheck/blob/main/website"},blog:{showReadingTime:!0,editUrl:"https://github.com/rbusarow/ModuleCheck"},theme:{customCss:"./src/css/custom.css"}}]],themeConfig:{docs:{sidebar:{hideable:!0,autoCollapseCategories:!1},versionPersistence:"localStorage"},colorMode:{defaultMode:"light",disableSwitch:!1,respectPrefersColorScheme:!0},navbar:{title:"ModuleCheck",logo:{alt:"ModuleCheck Logo",src:"img/logo.png"},items:[{type:"doc",docId:"quickstart",label:"Docs",position:"left"},{to:"changelog",label:"ChangeLog",position:"left"},{to:"migrations",label:"Migrations",position:"left"},{type:"docsVersionDropdown",position:"left",dropdownActiveClassDisabled:!0,dropdownItemsAfter:[{to:"/changelog",label:"CHANGELOG"}],dropdownItemsBefore:[]},{label:"Api",href:"pathname:///api/index.html",position:"left"},{label:"GitHub",href:"https://github.com/rbusarow/ModuleCheck",position:"right"}],hideOnScroll:!1},footer:{copyright:"Copyright \xa9 2025 Rick Busarow, Built with Docusaurus.",style:"light",links:[]},mermaid:{theme:{light:"neutral",dark:"dark"},options:{}},prism:{theme:{plain:{color:"#393A34",backgroundColor:"#f6f8fa"},styles:[{types:["comment","prolog","doctype","cdata"],style:{color:"#999988",fontStyle:"italic"}},{types:["namespace"],style:{opacity:.7}},{types:["string","attr-value"],style:{color:"#e3116c"}},{types:["punctuation","operator"],style:{color:"#393A34"}},{types:["entity","url","symbol","number","boolean","variable","constant","property","regex","inserted"],style:{color:"#36acaa"}},{types:["atrule","keyword","attr-name","selector"],style:{color:"#00a4db"}},{types:["function","deleted","tag"],style:{color:"#d73a49"}},{types:["function-variable"],style:{color:"#6f42c1"}},{types:["tag","selector","keyword"],style:{color:"#00009f"}}]},darkTheme:{plain:{color:"#F8F8F2",backgroundColor:"#282A36"},styles:[{types:["prolog","constant","builtin"],style:{color:"rgb(189, 147, 249)"}},{types:["inserted","function"],style:{color:"rgb(80, 250, 123)"}},{types:["deleted"],style:{color:"rgb(255, 85, 85)"}},{types:["changed"],style:{color:"rgb(255, 184, 108)"}},{types:["punctuation","symbol"],style:{color:"rgb(248, 248, 242)"}},{types:["string","char","tag","selector"],style:{color:"rgb(255, 121, 198)"}},{types:["keyword","variable"],style:{color:"rgb(189, 147, 249)",fontStyle:"italic"}},{types:["comment"],style:{color:"rgb(98, 114, 164)"}},{types:["attr-name"],style:{color:"rgb(241, 250, 140)"}}]},additionalLanguages:["kotlin","groovy","java"],magicComments:[{className:"theme-code-block-highlighted-line",line:"highlight-next-line",block:{start:"highlight-start",end:"highlight-end"}}]},algolia:{appId:"D6Z21RYLG1",apiKey:"2b25d0dd3470c3fdbe2ffa4e3299b0e9",indexName:"modulecheck",contextualSearch:!0,searchParameters:{},searchPagePath:"search"},blog:{sidebar:{groupByYear:!0}},metadata:[],tableOfContents:{minHeadingLevel:2,maxHeadingLevel:3}},baseUrlIssueBanner:!0,i18n:{defaultLocale:"en",path:"i18n",locales:["en"],localeConfigs:{}},future:{v4:{removeLegacyPostBuildHeadAttribute:!1,useCssCascadeLayers:!1},experimental_faster:{swcJsLoader:!1,swcJsMinimizer:!1,swcHtmlMinimizer:!1,lightningCssMinimizer:!1,mdxCrossCompilerCache:!1,rspackBundler:!1,rspackPersistentCache:!1,ssgWorkerThreads:!1},experimental_storage:{type:"localStorage",namespace:!1},experimental_router:"browser"},onBrokenAnchors:"warn",onDuplicateRoutes:"warn",staticDirectories:["static"],customFields:{},plugins:[],scripts:[],headTags:[],stylesheets:[],clientModules:[],titleDelimiter:"|",noIndex:!1}},5482:(e,t,n)=>{"use strict";n.r(t),n.d(t,{__addDisposableResource:()=>N,__assign:()=>a,__asyncDelegator:()=>S,__asyncGenerator:()=>x,__asyncValues:()=>M,__await:()=>C,__awaiter:()=>h,__classPrivateFieldGet:()=>P,__classPrivateFieldIn:()=>I,__classPrivateFieldSet:()=>T,__createBinding:()=>g,__decorate:()=>i,__disposeResources:()=>R,__esDecorate:()=>l,__exportStar:()=>b,__extends:()=>o,__generator:()=>m,__importDefault:()=>D,__importStar:()=>j,__makeTemplateObject:()=>E,__metadata:()=>f,__param:()=>c,__propKey:()=>d,__read:()=>v,__rest:()=>s,__rewriteRelativeImportExtension:()=>F,__runInitializers:()=>u,__setFunctionName:()=>p,__spread:()=>_,__spreadArray:()=>w,__spreadArrays:()=>k,__values:()=>y,default:()=>z});var r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])},r(e,t)};function o(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var a=function(){return a=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)};function s(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function i(e,t,n,r){var o,a=arguments.length,s=a<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,r);else for(var i=e.length-1;i>=0;i--)(o=e[i])&&(s=(a<3?o(s):a>3?o(t,n,s):o(t,n))||s);return a>3&&s&&Object.defineProperty(t,n,s),s}function c(e,t){return function(n,r){t(n,r,e)}}function l(e,t,n,r,o,a){function s(e){if(void 0!==e&&"function"!=typeof e)throw new TypeError("Function expected");return e}for(var i,c=r.kind,l="getter"===c?"get":"setter"===c?"set":"value",u=!t&&e?r.static?e:e.prototype:null,d=t||(u?Object.getOwnPropertyDescriptor(u,r.name):{}),p=!1,f=n.length-1;f>=0;f--){var h={};for(var m in r)h[m]="access"===m?{}:r[m];for(var m in r.access)h.access[m]=r.access[m];h.addInitializer=function(e){if(p)throw new TypeError("Cannot add initializers after decoration has completed");a.push(s(e||null))};var g=(0,n[f])("accessor"===c?{get:d.get,set:d.set}:d[l],h);if("accessor"===c){if(void 0===g)continue;if(null===g||"object"!=typeof g)throw new TypeError("Object expected");(i=s(g.get))&&(d.get=i),(i=s(g.set))&&(d.set=i),(i=s(g.init))&&o.unshift(i)}else(i=s(g))&&("field"===c?o.unshift(i):d[l]=i)}u&&Object.defineProperty(u,r.name,d),p=!0}function u(e,t,n){for(var r=arguments.length>2,o=0;o<t.length;o++)n=r?t[o].call(e,n):t[o].call(e);return r?n:void 0}function d(e){return"symbol"==typeof e?e:"".concat(e)}function p(e,t,n){return"symbol"==typeof t&&(t=t.description?"[".concat(t.description,"]"):""),Object.defineProperty(e,"name",{configurable:!0,value:n?"".concat(n," ",t):t})}function f(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}function h(e,t,n,r){return new(n||(n=Promise))(function(o,a){function s(e){try{c(r.next(e))}catch(t){a(t)}}function i(e){try{c(r.throw(e))}catch(t){a(t)}}function c(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n(function(e){e(t)})).then(s,i)}c((r=r.apply(e,t||[])).next())})}function m(e,t){var n,r,o,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]},s=Object.create(("function"==typeof Iterator?Iterator:Object).prototype);return s.next=i(0),s.throw=i(1),s.return=i(2),"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function i(i){return function(c){return function(i){if(n)throw new TypeError("Generator is already executing.");for(;s&&(s=0,i[0]&&(a=0)),a;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,r=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!(o=a.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(c){i=[6,c],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,c])}}}var g=Object.create?function(e,t,n,r){void 0===r&&(r=n);var o=Object.getOwnPropertyDescriptor(t,n);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[n]}}),Object.defineProperty(e,r,o)}:function(e,t,n,r){void 0===r&&(r=n),e[r]=t[n]};function b(e,t){for(var n in e)"default"===n||Object.prototype.hasOwnProperty.call(t,n)||g(t,e,n)}function y(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function v(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,a=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=a.next()).done;)s.push(r.value)}catch(i){o={error:i}}finally{try{r&&!r.done&&(n=a.return)&&n.call(a)}finally{if(o)throw o.error}}return s}function _(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(v(arguments[t]));return e}function k(){for(var e=0,t=0,n=arguments.length;t<n;t++)e+=arguments[t].length;var r=Array(e),o=0;for(t=0;t<n;t++)for(var a=arguments[t],s=0,i=a.length;s<i;s++,o++)r[o]=a[s];return r}function w(e,t,n){if(n||2===arguments.length)for(var r,o=0,a=t.length;o<a;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}function C(e){return this instanceof C?(this.v=e,this):new C(e)}function x(e,t,n){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var r,o=n.apply(e,t||[]),a=[];return r=Object.create(("function"==typeof AsyncIterator?AsyncIterator:Object).prototype),s("next"),s("throw"),s("return",function(e){return function(t){return Promise.resolve(t).then(e,l)}}),r[Symbol.asyncIterator]=function(){return this},r;function s(e,t){o[e]&&(r[e]=function(t){return new Promise(function(n,r){a.push([e,t,n,r])>1||i(e,t)})},t&&(r[e]=t(r[e])))}function i(e,t){try{(n=o[e](t)).value instanceof C?Promise.resolve(n.value.v).then(c,l):u(a[0][2],n)}catch(r){u(a[0][3],r)}var n}function c(e){i("next",e)}function l(e){i("throw",e)}function u(e,t){e(t),a.shift(),a.length&&i(a[0][0],a[0][1])}}function S(e){var t,n;return t={},r("next"),r("throw",function(e){throw e}),r("return"),t[Symbol.iterator]=function(){return this},t;function r(r,o){t[r]=e[r]?function(t){return(n=!n)?{value:C(e[r](t)),done:!1}:o?o(t):t}:o}}function M(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t,n=e[Symbol.asyncIterator];return n?n.call(e):(e=y(e),t={},r("next"),r("throw"),r("return"),t[Symbol.asyncIterator]=function(){return this},t);function r(n){t[n]=e[n]&&function(t){return new Promise(function(r,o){(function(e,t,n,r){Promise.resolve(r).then(function(t){e({value:t,done:n})},t)})(r,o,(t=e[n](t)).done,t.value)})}}}function E(e,t){return Object.defineProperty?Object.defineProperty(e,"raw",{value:t}):e.raw=t,e}var O=Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t},A=function(e){return A=Object.getOwnPropertyNames||function(e){var t=[];for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[t.length]=n);return t},A(e)};function j(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var n=A(e),r=0;r<n.length;r++)"default"!==n[r]&&g(t,e,n[r]);return O(t,e),t}function D(e){return e&&e.__esModule?e:{default:e}}function P(e,t,n,r){if("a"===n&&!r)throw new TypeError("Private accessor was defined without a getter");if("function"==typeof t?e!==t||!r:!t.has(e))throw new TypeError("Cannot read private member from an object whose class did not declare it");return"m"===n?r:"a"===n?r.call(e):r?r.value:t.get(e)}function T(e,t,n,r,o){if("m"===r)throw new TypeError("Private method is not writable");if("a"===r&&!o)throw new TypeError("Private accessor was defined without a setter");if("function"==typeof t?e!==t||!o:!t.has(e))throw new TypeError("Cannot write private member to an object whose class did not declare it");return"a"===r?o.call(e,n):o?o.value=n:t.set(e,n),n}function I(e,t){if(null===t||"object"!=typeof t&&"function"!=typeof t)throw new TypeError("Cannot use 'in' operator on non-object");return"function"==typeof e?t===e:e.has(t)}function N(e,t,n){if(null!=t){if("object"!=typeof t&&"function"!=typeof t)throw new TypeError("Object expected.");var r,o;if(n){if(!Symbol.asyncDispose)throw new TypeError("Symbol.asyncDispose is not defined.");r=t[Symbol.asyncDispose]}if(void 0===r){if(!Symbol.dispose)throw new TypeError("Symbol.dispose is not defined.");r=t[Symbol.dispose],n&&(o=r)}if("function"!=typeof r)throw new TypeError("Object not disposable.");o&&(r=function(){try{o.call(this)}catch(e){return Promise.reject(e)}}),e.stack.push({value:t,dispose:r,async:n})}else n&&e.stack.push({async:!0});return t}var L="function"==typeof SuppressedError?SuppressedError:function(e,t,n){var r=new Error(n);return r.name="SuppressedError",r.error=e,r.suppressed=t,r};function R(e){function t(t){e.error=e.hasError?new L(t,e.error,"An error was suppressed during disposal."):t,e.hasError=!0}var n,r=0;return function o(){for(;n=e.stack.pop();)try{if(!n.async&&1===r)return r=0,e.stack.push(n),Promise.resolve().then(o);if(n.dispose){var a=n.dispose.call(n.value);if(n.async)return r|=2,Promise.resolve(a).then(o,function(e){return t(e),o()})}else r|=1}catch(s){t(s)}if(1===r)return e.hasError?Promise.reject(e.error):Promise.resolve();if(e.hasError)throw e.error}()}function F(e,t){return"string"==typeof e&&/^\.\.?\//.test(e)?e.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i,function(e,n,r,o,a){return n?t?".jsx":".js":!r||o&&a?r+o+"."+a.toLowerCase()+"js":e}):e}const z={__extends:o,__assign:a,__rest:s,__decorate:i,__param:c,__esDecorate:l,__runInitializers:u,__propKey:d,__setFunctionName:p,__metadata:f,__awaiter:h,__generator:m,__createBinding:g,__exportStar:b,__values:y,__read:v,__spread:_,__spreadArrays:k,__spreadArray:w,__await:C,__asyncGenerator:x,__asyncDelegator:S,__asyncValues:M,__makeTemplateObject:E,__importStar:j,__importDefault:D,__classPrivateFieldGet:P,__classPrivateFieldSet:T,__classPrivateFieldIn:I,__addDisposableResource:N,__disposeResources:R,__rewriteRelativeImportExtension:F}},5526:e=>{e.exports=Array.isArray||function(e){return"[object Array]"==Object.prototype.toString.call(e)}},6617:(e,t,n)=>{"use strict";n.d(t,{Jx:()=>b,be:()=>h,e3:()=>g});var r=n(36672),o=n(13526),a=n(33412),s=n(85339),i=n(42977),c=n(7590),l=n(23420);function u({title:e}){const t=(0,c.s$)().format(e);return(0,l.jsxs)(a.A,{children:[(0,l.jsx)("title",{children:t}),(0,l.jsx)("meta",{property:"og:title",content:t})]})}function d({description:e}){return(0,l.jsxs)(a.A,{children:[(0,l.jsx)("meta",{name:"description",content:e}),(0,l.jsx)("meta",{property:"og:description",content:e})]})}function p({image:e}){const{withBaseUrl:t}=(0,i.hH)(),n=t(e,{absolute:!0});return(0,l.jsxs)(a.A,{children:[(0,l.jsx)("meta",{property:"og:image",content:n}),(0,l.jsx)("meta",{name:"twitter:image",content:n})]})}function f({keywords:e}){return(0,l.jsx)(a.A,{children:(0,l.jsx)("meta",{name:"keywords",content:Array.isArray(e)?e.join(","):e})})}function h({title:e,description:t,keywords:n,image:r,children:o}){return(0,l.jsxs)(l.Fragment,{children:[e&&(0,l.jsx)(u,{title:e}),t&&(0,l.jsx)(d,{description:t}),n&&(0,l.jsx)(f,{keywords:n}),r&&(0,l.jsx)(p,{image:r}),o&&(0,l.jsx)(a.A,{children:o})]})}const m=r.createContext(void 0);function g({className:e,children:t}){const n=r.useContext(m),s=(0,o.A)(n,e);return(0,l.jsxs)(m.Provider,{value:s,children:[(0,l.jsx)(a.A,{children:(0,l.jsx)("html",{className:s})}),t]})}function b({children:e}){const t=(0,s.A)(),n=`plugin-${t.plugin.name.replace(/docusaurus-(?:plugin|theme)-(?:content-)?/gi,"")}`;const r=`plugin-id-${t.plugin.id}`;return(0,l.jsx)(g,{className:(0,o.A)(n,r),children:e})}},7590:(e,t,n)=>{"use strict";n.d(t,{AL:()=>u,s$:()=>d});var r=n(36672),o=n(56562),a=n(85339),s=n(92471),i=n(23420);const c=({title:e,siteTitle:t,titleDelimiter:n})=>{const r=e?.trim();return r&&r!==t?`${r} ${n} ${t}`:t},l=(0,r.createContext)(null);function u({formatter:e,children:t}){return(0,i.jsx)(l.Provider,{value:e,children:t})}function d(){const e=function(){const e=(0,r.useContext)(l);if(null===e)throw new s.dV("TitleFormatterProvider");return e}(),{siteConfig:t}=(0,o.A)(),{title:n,titleDelimiter:i}=t,{plugin:u}=(0,a.A)();return{format:t=>e({title:t,siteTitle:n,titleDelimiter:i,plugin:u,defaultFormatter:c})}}},7753:(e,t,n)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addTrailingSlash=o,t.default=function(e,t){const{trailingSlash:n,baseUrl:r}=t;if(e.startsWith("#"))return e;if(void 0===n)return e;const[s]=e.split(/[#?]/),i="/"===s||s===r?s:(c=s,l=n,l?o(c):a(c));var c,l;return e.replace(s,i)},t.addLeadingSlash=function(e){return(0,r.addPrefix)(e,"/")},t.removeTrailingSlash=a;const r=n(91908);function o(e){return e.endsWith("/")?e:`${e}/`}function a(e){return(0,r.removeSuffix)(e,"/")}},7953:(e,t,n)=>{"use strict";n.d(t,{W:()=>r});const r="default"},8682:(e,t,n)=>{"use strict";var r=n(3416),o=n(4784);!function(e){const{themeConfig:{prism:t}}=o.default,{additionalLanguages:r}=t,a=globalThis.Prism;globalThis.Prism=e,r.forEach(e=>{"php"===e&&n(88020),n(65777)(`./prism-${e}`)}),delete globalThis.Prism,void 0!==a&&(globalThis.Prism=e)}(r.My)},8804:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});n(36672);const r={iconExternalLink:"iconExternalLink_bfN_"};var o=n(23420);const a="#theme-svg-external-link";function s({width:e=13.5,height:t=13.5}){return(0,o.jsx)("svg",{width:e,height:t,"aria-hidden":"true",className:r.iconExternalLink,children:(0,o.jsx)("use",{href:a})})}},10809:(e,t,n)=>{"use strict";function r(e,t){return r=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},r(e,t)}function o(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,r(e,t)}n.d(t,{A:()=>o})},12380:(e,t,n)=>{"use strict";n.d(t,{VQ:()=>g,XK:()=>v,g1:()=>y});var r=n(36672),o=n(72408),a=n(7953),s=n(67797),i=n(1771),c=n(92471),l=n(23420);const u=e=>`docs-preferred-version-${e}`,d={save:(e,t,n)=>{(0,i.Wf)(u(e),{persistence:t}).set(n)},read:(e,t)=>(0,i.Wf)(u(e),{persistence:t}).get(),clear:(e,t)=>{(0,i.Wf)(u(e),{persistence:t}).del()}},p=e=>Object.fromEntries(e.map(e=>[e,{preferredVersionName:null}]));const f=r.createContext(null);function h(){const e=(0,o.Gy)(),t=(0,s.p)().docs.versionPersistence,n=(0,r.useMemo)(()=>Object.keys(e),[e]),[a,i]=(0,r.useState)(()=>p(n));(0,r.useEffect)(()=>{i(function({pluginIds:e,versionPersistence:t,allDocsData:n}){function r(e){const r=d.read(e,t);return n[e].versions.some(e=>e.name===r)?{preferredVersionName:r}:(d.clear(e,t),{preferredVersionName:null})}return Object.fromEntries(e.map(e=>[e,r(e)]))}({allDocsData:e,versionPersistence:t,pluginIds:n}))},[e,t,n]);return[a,(0,r.useMemo)(()=>({savePreferredVersion:function(e,n){d.save(e,t,n),i(t=>({...t,[e]:{preferredVersionName:n}}))}}),[t])]}function m({children:e}){const t=h();return(0,l.jsx)(f.Provider,{value:t,children:e})}function g({children:e}){return(0,l.jsx)(m,{children:e})}function b(){const e=(0,r.useContext)(f);if(!e)throw new c.dV("DocsPreferredVersionContextProvider");return e}function y(e=a.W){const t=(0,o.ht)(e),[n,s]=b(),{preferredVersionName:i}=n[e];return{preferredVersion:t.versions.find(e=>e.name===i)??null,savePreferredVersionName:(0,r.useCallback)(t=>{s.savePreferredVersion(e,t)},[s,e])}}function v(){const e=(0,o.Gy)(),[t]=b();function n(n){const r=e[n],{preferredVersionName:o}=t[n];return r.versions.find(e=>e.name===o)??null}const r=Object.keys(e);return Object.fromEntries(r.map(e=>[e,n(e)]))}},12505:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(36672);var r=n(33412),o=n(23420);function a({locale:e,version:t,tag:n}){const a=e;return(0,o.jsxs)(r.A,{children:[e&&(0,o.jsx)("meta",{name:"docusaurus_locale",content:e}),t&&(0,o.jsx)("meta",{name:"docusaurus_version",content:t}),n&&(0,o.jsx)("meta",{name:"docusaurus_tag",content:n}),a&&(0,o.jsx)("meta",{name:"docsearch:language",content:a}),t&&(0,o.jsx)("meta",{name:"docsearch:version",content:t}),n&&(0,o.jsx)("meta",{name:"docsearch:docusaurus_tag",content:n})]})}},13526:(e,t,n)=>{"use strict";function r(e){var t,n,o="";if("string"==typeof e||"number"==typeof e)o+=e;else if("object"==typeof e)if(Array.isArray(e)){var a=e.length;for(t=0;t<a;t++)e[t]&&(n=r(e[t]))&&(o&&(o+=" "),o+=n)}else for(n in e)e[n]&&(o&&(o+=" "),o+=n);return o}n.d(t,{A:()=>o});const o=function(){for(var e,t,n=0,o="",a=arguments.length;n<a;n++)(e=arguments[n])&&(t=r(e))&&(o&&(o+=" "),o+=t);return o}},14952:(e,t,n)=>{"use strict";n.d(t,{w:()=>o,J:()=>a});var r=n(36672);const o="navigation-with-keyboard";function a(){(0,r.useEffect)(()=>{function e(e){"keydown"===e.type&&"Tab"===e.key&&document.body.classList.add(o),"mousedown"===e.type&&document.body.classList.remove(o)}return document.addEventListener("keydown",e),document.addEventListener("mousedown",e),()=>{document.body.classList.remove(o),document.removeEventListener("keydown",e),document.removeEventListener("mousedown",e)}},[])}},16186:(e,t,n)=>{"use strict";var r=n(62985);function o(){}function a(){}a.resetWarningCache=o,e.exports=function(){function e(e,t,n,o,a,s){if(s!==r){var i=new Error("Calling PropTypes validators directly is not supported by the `prop-types` package. Use PropTypes.checkPropTypes() to call them. Read more at http://fb.me/use-check-prop-types");throw i.name="Invariant Violation",i}}function t(){return e}e.isRequired=e;var n={array:e,bigint:e,bool:e,func:e,number:e,object:e,string:e,symbol:e,any:e,arrayOf:t,element:e,elementType:e,instanceOf:t,node:e,objectOf:t,oneOf:t,oneOfType:t,shape:t,exact:t,checkPropTypes:a,resetWarningCache:o};return n.PropTypes=n,n}},17882:(e,t,n)=>{"use strict";n.d(t,{o:()=>s});var r=n(56562),o=n(85291),a=n(95758);function s(){const{siteConfig:{baseUrl:e,url:t,trailingSlash:n},i18n:{defaultLocale:s,currentLocale:i}}=(0,r.A)(),{pathname:c}=(0,o.zy)(),l=(0,a.Ks)(c,{trailingSlash:n,baseUrl:e}),u=i===s?e:e.replace(`/${i}/`,"/"),d=l.replace(e,"");return{createUrl:function({locale:e,fullyQualified:n}){return`${n?t:""}${function(e){return e===s?`${u}`:`${u}${e}/`}(e)}${d}`}}}},20601:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r="undefined"!=typeof window&&"document"in window&&"createElement"in window.document,o={canUseDOM:r,canUseEventListeners:r&&("addEventListener"in window||"attachEvent"in window),canUseIntersectionObserver:r&&"IntersectionObserver"in window,canUseViewport:r&&"screen"in window}},21189:(e,t,n)=>{"use strict";n.d(t,{o:()=>a,x:()=>s});var r=n(36672),o=n(23420);const a=r.createContext(!1);function s({children:e}){const[t,n]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{n(!0)},[]),(0,o.jsx)(a.Provider,{value:t,children:e})}},22654:e=>{"use strict";e.exports={}},23420:(e,t,n)=>{"use strict";e.exports=n(1870)},24179:(e,t,n)=>{"use strict";n.d(t,{V:()=>c,t:()=>l});var r=n(36672),o=n(92471),a=n(23420);const s=Symbol("EmptyContext"),i=r.createContext(s);function c({children:e,name:t,items:n}){const o=(0,r.useMemo)(()=>t&&n?{name:t,items:n}:null,[t,n]);return(0,a.jsx)(i.Provider,{value:o,children:e})}function l(){const e=(0,r.useContext)(i);if(e===s)throw new o.dV("DocsSidebarProvider");return e}},24962:(e,t,n)=>{"use strict";n.d(t,{C:()=>r});const r="default"},25385:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=!0,o="Invariant failed";function a(e,t){if(!e){if(r)throw new Error(o);var n="function"==typeof t?t():t,a=n?"".concat(o,": ").concat(n):o;throw new Error(a)}}},26271:(e,t,n)=>{"use strict";n.d(t,{u:()=>s,v:()=>i});var r=n(85291),o=n(70811),a=n(36672);function s(e,t,n){return void 0===n&&(n=[]),e.some(function(e){var o=e.path?(0,r.B6)(t,e):n.length?n[n.length-1].match:r.Ix.computeRootMatch(t);return o&&(n.push({route:e,match:o}),e.routes&&s(e.routes,t,n)),o}),n}function i(e,t,n){return void 0===t&&(t={}),void 0===n&&(n={}),e?a.createElement(r.dO,n,e.map(function(e,n){return a.createElement(r.qh,{key:e.key||n,path:e.path,exact:e.exact,strict:e.strict,render:function(n){return e.render?e.render((0,o.A)({},n,{},t,{route:e})):a.createElement(e.component,(0,o.A)({},n,t,{route:e}))}})})):null}},27019:(e,t,n)=>{"use strict";n.d(t,{$:()=>s});var r=n(36672),o=n(85291),a=n(92471);function s(e){const t=(0,o.zy)(),n=(0,a.ZC)(t),s=(0,a._q)(e);(0,r.useEffect)(()=>{n&&t!==n&&s({location:t,previousLocation:n})},[s,t,n])}},27099:(e,t,n)=>{"use strict";n.r(t)},29283:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});var r=n(36672),o=n(13526),a=n(64407),s=n(43062);const i={themedComponent:"themedComponent_kh6W","themedComponent--light":"themedComponent--light_h03h","themedComponent--dark":"themedComponent--dark_QNPN"};var c=n(23420);function l({className:e,children:t}){const n=(0,a.A)(),{colorMode:l}=(0,s.G)();return(0,c.jsx)(c.Fragment,{children:(n?"dark"===l?["dark"]:["light"]:["light","dark"]).map(n=>{const a=t({theme:n,className:(0,o.A)(e,i.themedComponent,i[`themedComponent--${n}`])});return(0,c.jsx)(r.Fragment,{children:a},n)})})}function u(e){const{sources:t,className:n,alt:r,...o}=e;return(0,c.jsx)(l,{className:n,children:({theme:e,className:n})=>(0,c.jsx)("img",{src:t[e],alt:r,className:n,...o})})}},29597:e=>{"use strict";e.exports=function(e,t,n,r,o,a,s,i){if(!e){var c;if(void 0===t)c=new Error("Minified exception occurred; use the non-minified dev environment for the full error message and additional helpful warnings.");else{var l=[n,r,o,a,s,i],u=0;(c=new Error(t.replace(/%s/g,function(){return l[u++]}))).name="Invariant Violation"}throw c.framesToPop=1,c}}},30691:(e,t,n)=>{"use strict";var r=n(36672),o=n(42396),a=n(97398),s=n(58212),i=n(4784),c=n(20601);const l=[n(97057),n(8682),n(79048),n(27099)];var u=n(50552),d=n(85291),p=n(26271),f=n(23420);function h({children:e}){return(0,f.jsx)(f.Fragment,{children:e})}var m=n(7590);const g=e=>e.defaultFormatter(e);function b({children:e}){return(0,f.jsx)(m.AL,{formatter:g,children:e})}function y({children:e}){return(0,f.jsx)(b,{children:e})}var v=n(33412),_=n(56562),k=n(42977),w=n(67797),C=n(6617),x=n(17882),S=n(14952),M=n(24962),E=n(95758),O=n(12505);function A(){const{i18n:{currentLocale:e,defaultLocale:t,localeConfigs:n}}=(0,_.A)(),r=(0,x.o)(),o=n[e].htmlLang,a=e=>e.replace("-","_");return(0,f.jsxs)(v.A,{children:[Object.entries(n).map(([e,{htmlLang:t}])=>(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:e,fullyQualified:!0}),hrefLang:t},e)),(0,f.jsx)("link",{rel:"alternate",href:r.createUrl({locale:t,fullyQualified:!0}),hrefLang:"x-default"}),(0,f.jsx)("meta",{property:"og:locale",content:a(o)}),Object.values(n).filter(e=>o!==e.htmlLang).map(e=>(0,f.jsx)("meta",{property:"og:locale:alternate",content:a(e.htmlLang)},`meta-og-${e.htmlLang}`))]})}function j({permalink:e}){const{siteConfig:{url:t}}=(0,_.A)(),n=function(){const{siteConfig:{url:e,baseUrl:t,trailingSlash:n}}=(0,_.A)(),{pathname:r}=(0,d.zy)();return e+(0,E.Ks)((0,k.Ay)(r),{trailingSlash:n,baseUrl:t})}(),r=e?`${t}${e}`:n;return(0,f.jsxs)(v.A,{children:[(0,f.jsx)("meta",{property:"og:url",content:r}),(0,f.jsx)("link",{rel:"canonical",href:r})]})}function D(){const{i18n:{currentLocale:e}}=(0,_.A)(),{metadata:t,image:n}=(0,w.p)();return(0,f.jsxs)(f.Fragment,{children:[(0,f.jsxs)(v.A,{children:[(0,f.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,f.jsx)("body",{className:S.w})]}),n&&(0,f.jsx)(C.be,{image:n}),(0,f.jsx)(j,{}),(0,f.jsx)(A,{}),(0,f.jsx)(O.A,{tag:M.C,locale:e}),(0,f.jsx)(v.A,{children:t.map((e,t)=>(0,f.jsx)("meta",{...e},t))})]})}const P=new Map;var T=n(21189),I=n(47367),N=n(52245);function L(e,...t){const n=l.map(n=>{const r=n.default?.[e]??n[e];return r?.(...t)});return()=>n.forEach(e=>e?.())}const R=function({children:e,location:t,previousLocation:n}){return(0,N.A)(()=>{n!==t&&(!function({location:e,previousLocation:t}){if(!t)return;const n=e.pathname===t.pathname,r=e.hash===t.hash,o=e.search===t.search;if(n&&r&&!o)return;const{hash:a}=e;if(a){const e=decodeURIComponent(a.substring(1)),t=document.getElementById(e);t?.scrollIntoView()}else window.scrollTo(0,0)}({location:t,previousLocation:n}),L("onRouteDidUpdate",{previousLocation:n,location:t}))},[n,t]),e};function F(e){const t=Array.from(new Set([e,decodeURI(e)])).map(e=>(0,p.u)(u.A,e)).flat();return Promise.all(t.map(e=>e.route.component.preload?.()))}class z extends r.Component{previousLocation;routeUpdateCleanupCb;constructor(e){super(e),this.previousLocation=null,this.routeUpdateCleanupCb=c.A.canUseDOM?L("onRouteUpdate",{previousLocation:null,location:this.props.location}):()=>{},this.state={nextRouteHasLoaded:!0}}shouldComponentUpdate(e,t){if(e.location===this.props.location)return t.nextRouteHasLoaded;const n=e.location;return this.previousLocation=this.props.location,this.setState({nextRouteHasLoaded:!1}),this.routeUpdateCleanupCb=L("onRouteUpdate",{previousLocation:this.previousLocation,location:n}),F(n.pathname).then(()=>{this.routeUpdateCleanupCb(),this.setState({nextRouteHasLoaded:!0})}).catch(e=>{console.warn(e),window.location.reload()}),!1}render(){const{children:e,location:t}=this.props;return(0,f.jsx)(R,{previousLocation:this.previousLocation,location:t,children:(0,f.jsx)(d.qh,{location:t,render:()=>e})})}}const B=z,$="__docusaurus-base-url-issue-banner-suggestion-container";function U(e){return`\ndocument.addEventListener('DOMContentLoaded', function maybeInsertBanner() {\n var shouldInsert = typeof window['docusaurus'] === 'undefined';\n shouldInsert && insertBanner();\n});\n\nfunction insertBanner() {\n var bannerContainer = document.createElement('div');\n bannerContainer.id = '__docusaurus-base-url-issue-banner-container';\n var bannerHtml = ${JSON.stringify(function(e){return`\n<div id="__docusaurus-base-url-issue-banner" style="border: thick solid red; background-color: rgb(255, 230, 179); margin: 20px; padding: 20px; font-size: 20px;">\n <p style="font-weight: bold; font-size: 30px;">Your Docusaurus site did not load properly.</p>\n <p>A very common reason is a wrong site <a href="https://docusaurus.io/docs/docusaurus.config.js/#baseUrl" style="font-weight: bold;">baseUrl configuration</a>.</p>\n <p>Current configured baseUrl = <span style="font-weight: bold; color: red;">${e}</span> ${"/"===e?" (default value)":""}</p>\n <p>We suggest trying baseUrl = <span id="${$}" style="font-weight: bold; color: green;"></span></p>\n</div>\n`}(e)).replace(/</g,"\\<")};\n bannerContainer.innerHTML = bannerHtml;\n document.body.prepend(bannerContainer);\n var suggestionContainer = document.getElementById('${$}');\n var actualHomePagePath = window.location.pathname;\n var suggestedBaseUrl = actualHomePagePath.substr(-1) === '/'\n ? actualHomePagePath\n : actualHomePagePath + '/';\n suggestionContainer.innerHTML = suggestedBaseUrl;\n}\n`}function q(){const{siteConfig:{baseUrl:e}}=(0,_.A)();return(0,f.jsx)(f.Fragment,{children:!c.A.canUseDOM&&(0,f.jsx)(v.A,{children:(0,f.jsx)("script",{children:U(e)})})})}function H(){const{siteConfig:{baseUrl:e,baseUrlIssueBanner:t}}=(0,_.A)(),{pathname:n}=(0,d.zy)();return t&&n===e?(0,f.jsx)(q,{}):null}function V(){const{siteConfig:{favicon:e,title:t,noIndex:n},i18n:{currentLocale:r,localeConfigs:o}}=(0,_.A)(),a=(0,k.Ay)(e),{htmlLang:s,direction:i}=o[r];return(0,f.jsxs)(v.A,{children:[(0,f.jsx)("html",{lang:s,dir:i}),(0,f.jsx)("title",{children:t}),(0,f.jsx)("meta",{property:"og:title",content:t}),(0,f.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1.0"}),n&&(0,f.jsx)("meta",{name:"robots",content:"noindex, nofollow"}),e&&(0,f.jsx)("link",{rel:"icon",href:a})]})}var W=n(51728),G=n(64407);function K(){const e=(0,G.A)();return(0,f.jsx)(v.A,{children:(0,f.jsx)("html",{"data-has-hydrated":e})})}const Q=(0,p.v)(u.A);function Y(){const e=function(e){if(P.has(e.pathname))return{...e,pathname:P.get(e.pathname)};if((0,p.u)(u.A,e.pathname).some(({route:e})=>!0===e.exact))return P.set(e.pathname,e.pathname),e;const t=e.pathname.trim().replace(/(?:\/index)?\.html$/,"")||"/";return P.set(e.pathname,t),{...e,pathname:t}}((0,d.zy)());return(0,f.jsx)(B,{location:e,children:Q})}function Z(){return(0,f.jsx)(W.A,{children:(0,f.jsx)(I.l,{children:(0,f.jsxs)(T.x,{children:[(0,f.jsx)(h,{children:(0,f.jsxs)(y,{children:[(0,f.jsx)(V,{}),(0,f.jsx)(D,{}),(0,f.jsx)(H,{}),(0,f.jsx)(Y,{})]})}),(0,f.jsx)(K,{})]})})})}var X=n(84054);const J=function(e){try{return document.createElement("link").relList.supports(e)}catch{return!1}}("prefetch")?function(e){return new Promise((t,n)=>{if("undefined"==typeof document)return void n();const r=document.createElement("link");r.setAttribute("rel","prefetch"),r.setAttribute("href",e),r.onload=()=>t(),r.onerror=()=>n();const o=document.getElementsByTagName("head")[0]??document.getElementsByName("script")[0]?.parentNode;o?.appendChild(r)})}:function(e){return new Promise((t,n)=>{const r=new XMLHttpRequest;r.open("GET",e,!0),r.withCredentials=!0,r.onload=()=>{200===r.status?t():n()},r.send(null)})};var ee=n(36849);const te=new Set,ne=new Set,re=()=>navigator.connection?.effectiveType.includes("2g")||navigator.connection?.saveData,oe={prefetch:e=>{if(!(e=>!re()&&!ne.has(e)&&!te.has(e))(e))return!1;te.add(e);const t=(0,p.u)(u.A,e).flatMap(e=>{return t=e.route.path,Object.entries(X).filter(([e])=>e.replace(/-[^-]+$/,"")===t).flatMap(([,e])=>Object.values((0,ee.A)(e)));var t});return Promise.all(t.map(e=>{const t=n.gca(e);return t&&!t.includes("undefined")?J(t).catch(()=>{}):Promise.resolve()}))},preload:e=>!!(e=>!re()&&!ne.has(e))(e)&&(ne.add(e),F(e))},ae=Object.freeze(oe);function se({children:e}){return"hash"===i.default.future.experimental_router?(0,f.jsx)(s.I9,{children:e}):(0,f.jsx)(s.Kd,{children:e})}const ie=Boolean(!0);if(c.A.canUseDOM){window.docusaurus=ae;const e=document.getElementById("__docusaurus"),t=(0,f.jsx)(a.vd,{children:(0,f.jsx)(se,{children:(0,f.jsx)(Z,{})})}),n=(e,t)=>{console.error("Docusaurus React Root onRecoverableError:",e,t)},s=()=>{if(window.docusaurusRoot)window.docusaurusRoot.render(t);else if(ie)window.docusaurusRoot=o.hydrateRoot(e,t,{onRecoverableError:n});else{const r=o.createRoot(e,{onRecoverableError:n});r.render(t),window.docusaurusRoot=r}};F(window.location.pathname).then(()=>{(0,r.startTransition)(s)})}},31035:(e,t,n)=>{"use strict";var r=n(35959),o={childContextTypes:!0,contextType:!0,contextTypes:!0,defaultProps:!0,displayName:!0,getDefaultProps:!0,getDerivedStateFromError:!0,getDerivedStateFromProps:!0,mixins:!0,propTypes:!0,type:!0},a={name:!0,length:!0,prototype:!0,caller:!0,callee:!0,arguments:!0,arity:!0},s={$$typeof:!0,compare:!0,defaultProps:!0,displayName:!0,propTypes:!0,type:!0},i={};function c(e){return r.isMemo(e)?s:i[e.$$typeof]||o}i[r.ForwardRef]={$$typeof:!0,render:!0,defaultProps:!0,displayName:!0,propTypes:!0},i[r.Memo]=s;var l=Object.defineProperty,u=Object.getOwnPropertyNames,d=Object.getOwnPropertySymbols,p=Object.getOwnPropertyDescriptor,f=Object.getPrototypeOf,h=Object.prototype;e.exports=function e(t,n,r){if("string"!=typeof n){if(h){var o=f(n);o&&o!==h&&e(t,o,r)}var s=u(n);d&&(s=s.concat(d(n)));for(var i=c(t),m=c(n),g=0;g<s.length;++g){var b=s[g];if(!(a[b]||r&&r[b]||m&&m[b]||i&&i[b])){var y=p(n,b);try{l(t,b,y)}catch(v){}}}}return t}},32342:(e,t,n)=>{"use strict";n.d(t,{$Z:()=>s,aZ:()=>c,l:()=>l});var r=n(36672),o=n(85291),a=n(92471);function s(e){!function(e){const t=(0,o.W6)(),n=(0,a._q)(e);(0,r.useEffect)(()=>t.block((e,t)=>n(e,t)),[t,n])}((t,n)=>{if("POP"===n)return e(t,n)})}function i(e){const t=(0,o.W6)();return(0,r.useSyncExternalStore)(t.listen,()=>e(t),()=>e(t))}function c(e){return i(t=>null===e?null:new URLSearchParams(t.location.search).get(e))}function l(e){const t=c(e)??"",n=function(e){const t=(0,o.W6)();return(0,r.useCallback)((n,r)=>{const o=new URLSearchParams(t.location.search);n?o.set(e,n):o.delete(e),(r?.push?t.push:t.replace)({search:o.toString()})},[e,t])}(e);return[t,n]}},32912:()=>{!function(e){var t=/\b(?:abstract|assert|boolean|break|byte|case|catch|char|class|const|continue|default|do|double|else|enum|exports|extends|final|finally|float|for|goto|if|implements|import|instanceof|int|interface|long|module|native|new|non-sealed|null|open|opens|package|permits|private|protected|provides|public|record(?!\s*[(){}[\]<>=%~.:,;?+\-*/&|^])|requires|return|sealed|short|static|strictfp|super|switch|synchronized|this|throw|throws|to|transient|transitive|try|uses|var|void|volatile|while|with|yield)\b/,n=/(?:[a-z]\w*\s*\.\s*)*(?:[A-Z]\w*\s*\.\s*)*/.source,r={pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z](?:[\d_A-Z]*[a-z]\w*)?\b/.source),lookbehind:!0,inside:{namespace:{pattern:/^[a-z]\w*(?:\s*\.\s*[a-z]\w*)*(?:\s*\.)?/,inside:{punctuation:/\./}},punctuation:/\./}};e.languages.java=e.languages.extend("clike",{string:{pattern:/(^|[^\\])"(?:\\.|[^"\\\r\n])*"/,lookbehind:!0,greedy:!0},"class-name":[r,{pattern:RegExp(/(^|[^\w.])/.source+n+/[A-Z]\w*(?=\s+\w+\s*[;,=()]|\s*(?:\[[\s,]*\]\s*)?::\s*new\b)/.source),lookbehind:!0,inside:r.inside},{pattern:RegExp(/(\b(?:class|enum|extends|implements|instanceof|interface|new|record|throws)\s+)/.source+n+/[A-Z]\w*\b/.source),lookbehind:!0,inside:r.inside}],keyword:t,function:[e.languages.clike.function,{pattern:/(::\s*)[a-z_]\w*/,lookbehind:!0}],number:/\b0b[01][01_]*L?\b|\b0x(?:\.[\da-f_p+-]+|[\da-f_]+(?:\.[\da-f_p+-]+)?)\b|(?:\b\d[\d_]*(?:\.[\d_]*)?|\B\.\d[\d_]*)(?:e[+-]?\d[\d_]*)?[dfl]?/i,operator:{pattern:/(^|[^.])(?:<<=?|>>>?=?|->|--|\+\+|&&|\|\||::|[?:~]|[-+*/%&|^!=<>]=?)/m,lookbehind:!0},constant:/\b[A-Z][A-Z_\d]+\b/}),e.languages.insertBefore("java","string",{"triple-quoted-string":{pattern:/"""[ \t]*[\r\n](?:(?:"|"")?(?:\\.|[^"\\]))*"""/,greedy:!0,alias:"string"},char:{pattern:/'(?:\\.|[^'\\\r\n]){1,6}'/,greedy:!0}}),e.languages.insertBefore("java","class-name",{annotation:{pattern:/(^|[^.])@\w+(?:\s*\.\s*\w+)*/,lookbehind:!0,alias:"punctuation"},generics:{pattern:/<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&)|<(?:[\w\s,.?]|&(?!&))*>)*>)*>)*>/,inside:{"class-name":r,keyword:t,punctuation:/[<>(),.:]/,operator:/[?&|]/}},import:[{pattern:RegExp(/(\bimport\s+)/.source+n+/(?:[A-Z]\w*|\*)(?=\s*;)/.source),lookbehind:!0,inside:{namespace:r.inside.namespace,punctuation:/\./,operator:/\*/,"class-name":/\w+/}},{pattern:RegExp(/(\bimport\s+static\s+)/.source+n+/(?:\w+|\*)(?=\s*;)/.source),lookbehind:!0,alias:"static",inside:{namespace:r.inside.namespace,static:/\b\w+$/,punctuation:/\./,operator:/\*/,"class-name":/\w+/}}],namespace:{pattern:RegExp(/(\b(?:exports|import(?:\s+static)?|module|open|opens|package|provides|requires|to|transitive|uses|with)\s+)(?!<keyword>)[a-z]\w*(?:\.[a-z]\w*)*\.?/.source.replace(/<keyword>/g,function(){return t.source})),lookbehind:!0,inside:{punctuation:/\./}}})}(Prism)},33372:(e,t,n)=>{"use strict";n.d(t,{Bc:()=>O,E8:()=>Zn,a1:()=>Yn});var r=n(36672);n(57235);function o(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function a(e,t,n,r,o,a,s){try{var i=e[a](s),c=i.value}catch(e){return void n(e)}i.done?t(c):Promise.resolve(c).then(r,o)}function s(e){return function(){var t=this,n=arguments;return new Promise(function(r,o){var s=e.apply(t,n);function i(e){a(s,r,o,i,c,"next",e)}function c(e){a(s,r,o,i,c,"throw",e)}i(void 0)})}}function i(e,t,n){return t=p(t),function(e,t){if(t&&("object"==typeof t||"function"==typeof t))return t;if(void 0!==t)throw new TypeError("Derived constructors may only return object or undefined");return function(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}(e)}(e,h()?Reflect.construct(t,n||[],p(e).constructor):t.apply(e,n))}function c(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function l(e,t,n){return Object.defineProperty(e,"prototype",{writable:!1}),e}function u(e,t,n){return(t=function(e){var t=function(e){if("object"!=typeof e||!e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function d(){return d=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},d.apply(null,arguments)}function p(e){return p=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(e){return e.__proto__||Object.getPrototypeOf(e)},p(e)}function f(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,"prototype",{writable:!1}),t&&v(e,t)}function h(){try{var e=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(e){}return(h=function(){return!!e})()}function m(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function g(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?m(Object(n),!0).forEach(function(t){u(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):m(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function b(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(t.includes(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.includes(n)||{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function y(){y=function(){return t};var e,t={},n=Object.prototype,r=n.hasOwnProperty,o=Object.defineProperty||function(e,t,n){e[t]=n.value},a="function"==typeof Symbol?Symbol:{},s=a.iterator||"@@iterator",i=a.asyncIterator||"@@asyncIterator",c=a.toStringTag||"@@toStringTag";function l(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{l({},"")}catch(e){l=function(e,t,n){return e[t]=n}}function u(e,t,n,r){var a=t&&t.prototype instanceof b?t:b,s=Object.create(a.prototype),i=new D(r||[]);return o(s,"_invoke",{value:E(e,n,i)}),s}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(e){return{type:"throw",arg:e}}}t.wrap=u;var p="suspendedStart",f="suspendedYield",h="executing",m="completed",g={};function b(){}function v(){}function _(){}var k={};l(k,s,function(){return this});var w=Object.getPrototypeOf,C=w&&w(w(P([])));C&&C!==n&&r.call(C,s)&&(k=C);var x=_.prototype=b.prototype=Object.create(k);function S(e){["next","throw","return"].forEach(function(t){l(e,t,function(e){return this._invoke(t,e)})})}function M(e,t){function n(o,a,s,i){var c=d(e[o],e,a);if("throw"!==c.type){var l=c.arg,u=l.value;return u&&"object"==typeof u&&r.call(u,"__await")?t.resolve(u.__await).then(function(e){n("next",e,s,i)},function(e){n("throw",e,s,i)}):t.resolve(u).then(function(e){l.value=e,s(l)},function(e){return n("throw",e,s,i)})}i(c.arg)}var a;o(this,"_invoke",{value:function(e,r){function o(){return new t(function(t,o){n(e,r,t,o)})}return a=a?a.then(o,o):o()}})}function E(t,n,r){var o=p;return function(a,s){if(o===h)throw Error("Generator is already running");if(o===m){if("throw"===a)throw s;return{value:e,done:!0}}for(r.method=a,r.arg=s;;){var i=r.delegate;if(i){var c=O(i,r);if(c){if(c===g)continue;return c}}if("next"===r.method)r.sent=r._sent=r.arg;else if("throw"===r.method){if(o===p)throw o=m,r.arg;r.dispatchException(r.arg)}else"return"===r.method&&r.abrupt("return",r.arg);o=h;var l=d(t,n,r);if("normal"===l.type){if(o=r.done?m:f,l.arg===g)continue;return{value:l.arg,done:r.done}}"throw"===l.type&&(o=m,r.method="throw",r.arg=l.arg)}}}function O(t,n){var r=n.method,o=t.iterator[r];if(o===e)return n.delegate=null,"throw"===r&&t.iterator.return&&(n.method="return",n.arg=e,O(t,n),"throw"===n.method)||"return"!==r&&(n.method="throw",n.arg=new TypeError("The iterator does not provide a '"+r+"' method")),g;var a=d(o,t.iterator,n.arg);if("throw"===a.type)return n.method="throw",n.arg=a.arg,n.delegate=null,g;var s=a.arg;return s?s.done?(n[t.resultName]=s.value,n.next=t.nextLoc,"return"!==n.method&&(n.method="next",n.arg=e),n.delegate=null,g):s:(n.method="throw",n.arg=new TypeError("iterator result is not an object"),n.delegate=null,g)}function A(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function j(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function D(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(A,this),this.reset(!0)}function P(t){if(t||""===t){var n=t[s];if(n)return n.call(t);if("function"==typeof t.next)return t;if(!isNaN(t.length)){var o=-1,a=function n(){for(;++o<t.length;)if(r.call(t,o))return n.value=t[o],n.done=!1,n;return n.value=e,n.done=!0,n};return a.next=a}}throw new TypeError(typeof t+" is not iterable")}return v.prototype=_,o(x,"constructor",{value:_,configurable:!0}),o(_,"constructor",{value:v,configurable:!0}),v.displayName=l(_,c,"GeneratorFunction"),t.isGeneratorFunction=function(e){var t="function"==typeof e&&e.constructor;return!!t&&(t===v||"GeneratorFunction"===(t.displayName||t.name))},t.mark=function(e){return Object.setPrototypeOf?Object.setPrototypeOf(e,_):(e.__proto__=_,l(e,c,"GeneratorFunction")),e.prototype=Object.create(x),e},t.awrap=function(e){return{__await:e}},S(M.prototype),l(M.prototype,i,function(){return this}),t.AsyncIterator=M,t.async=function(e,n,r,o,a){void 0===a&&(a=Promise);var s=new M(u(e,n,r,o),a);return t.isGeneratorFunction(n)?s:s.next().then(function(e){return e.done?e.value:s.next()})},S(x),l(x,c,"Generator"),l(x,s,function(){return this}),l(x,"toString",function(){return"[object Generator]"}),t.keys=function(e){var t=Object(e),n=[];for(var r in t)n.push(r);return n.reverse(),function e(){for(;n.length;){var r=n.pop();if(r in t)return e.value=r,e.done=!1,e}return e.done=!0,e}},t.values=P,D.prototype={constructor:D,reset:function(t){if(this.prev=0,this.next=0,this.sent=this._sent=e,this.done=!1,this.delegate=null,this.method="next",this.arg=e,this.tryEntries.forEach(j),!t)for(var n in this)"t"===n.charAt(0)&&r.call(this,n)&&!isNaN(+n.slice(1))&&(this[n]=e)},stop:function(){this.done=!0;var e=this.tryEntries[0].completion;if("throw"===e.type)throw e.arg;return this.rval},dispatchException:function(t){if(this.done)throw t;var n=this;function o(r,o){return i.type="throw",i.arg=t,n.next=r,o&&(n.method="next",n.arg=e),!!o}for(var a=this.tryEntries.length-1;a>=0;--a){var s=this.tryEntries[a],i=s.completion;if("root"===s.tryLoc)return o("end");if(s.tryLoc<=this.prev){var c=r.call(s,"catchLoc"),l=r.call(s,"finallyLoc");if(c&&l){if(this.prev<s.catchLoc)return o(s.catchLoc,!0);if(this.prev<s.finallyLoc)return o(s.finallyLoc)}else if(c){if(this.prev<s.catchLoc)return o(s.catchLoc,!0)}else{if(!l)throw Error("try statement without catch or finally");if(this.prev<s.finallyLoc)return o(s.finallyLoc)}}}},abrupt:function(e,t){for(var n=this.tryEntries.length-1;n>=0;--n){var o=this.tryEntries[n];if(o.tryLoc<=this.prev&&r.call(o,"finallyLoc")&&this.prev<o.finallyLoc){var a=o;break}}a&&("break"===e||"continue"===e)&&a.tryLoc<=t&&t<=a.finallyLoc&&(a=null);var s=a?a.completion:{};return s.type=e,s.arg=t,a?(this.method="next",this.next=a.finallyLoc,g):this.complete(s)},complete:function(e,t){if("throw"===e.type)throw e.arg;return"break"===e.type||"continue"===e.type?this.next=e.arg:"return"===e.type?(this.rval=this.arg=e.arg,this.method="return",this.next="end"):"normal"===e.type&&t&&(this.next=t),g},finish:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),j(n),g}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var o=r.arg;j(n)}return o}}throw Error("illegal catch attempt")},delegateYield:function(t,n,r){return this.delegate={iterator:P(t),resultName:n,nextLoc:r},"next"===this.method&&(this.arg=e),g}},t}function v(e,t){return v=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(e,t){return e.__proto__=t,e},v(e,t)}function _(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,s,i=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;c=!1}else for(;!(c=(r=a.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw o}}return i}}(e,t)||w(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function k(e){return function(e){if(Array.isArray(e))return o(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||w(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function w(e,t){if(e){if("string"==typeof e)return o(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?o(e,t):void 0}}function C(e){var t="function"==typeof Map?new Map:void 0;return C=function(e){if(null===e||!function(e){try{return-1!==Function.toString.call(e).indexOf("[native code]")}catch(t){return"function"==typeof e}}(e))return e;if("function"!=typeof e)throw new TypeError("Super expression must either be null or a function");if(void 0!==t){if(t.has(e))return t.get(e);t.set(e,n)}function n(){return function(e,t,n){if(h())return Reflect.construct.apply(null,arguments);var r=[null];r.push.apply(r,t);var o=new(e.bind.apply(e,r));return n&&v(o,n.prototype),o}(e,arguments,p(this).constructor)}return n.prototype=Object.create(e.prototype,{constructor:{value:n,enumerable:!1,writable:!0,configurable:!0}}),v(n,e)},C(e)}function x(){return r.createElement("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon"},r.createElement("path",{d:"M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"}))}function S(){return r.createElement("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20","aria-hidden":"true"},r.createElement("path",{d:"M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}var M=["translations"],E="Ctrl",O=r.forwardRef(function(e,t){var n=e.translations,o=void 0===n?{}:n,a=b(e,M),s=o.buttonText,i=void 0===s?"Search":s,c=o.buttonAriaLabel,l=void 0===c?"Search":c,u=_((0,r.useState)(null),2),p=u[0],f=u[1];(0,r.useEffect)(function(){"undefined"!=typeof navigator&&(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?f("\u2318"):f(E))},[]);var h=_(p===E?[E,"Ctrl",r.createElement(x,null)]:["Meta","Command",p],3),m=h[0],g=h[1],y=h[2];return r.createElement("button",d({type:"button",className:"DocSearch DocSearch-Button","aria-label":"".concat(l," (").concat(g,"+K)")},a,{ref:t}),r.createElement("span",{className:"DocSearch-Button-Container"},r.createElement(S,null),r.createElement("span",{className:"DocSearch-Button-Placeholder"},i)),r.createElement("span",{className:"DocSearch-Button-Keys"},null!==p&&r.createElement(r.Fragment,null,r.createElement(A,{reactsToKey:m},y),r.createElement(A,{reactsToKey:"k"},"K"))))});function A(e){var t=e.reactsToKey,n=e.children,o=_((0,r.useState)(!1),2),a=o[0],s=o[1];return(0,r.useEffect)(function(){if(t)return window.addEventListener("keydown",e),window.addEventListener("keyup",n),function(){window.removeEventListener("keydown",e),window.removeEventListener("keyup",n)};function e(e){e.key===t&&s(!0)}function n(e){e.key!==t&&"Meta"!==e.key||s(!1)}},[t]),r.createElement("kbd",{className:a?"DocSearch-Button-Key DocSearch-Button-Key--pressed":"DocSearch-Button-Key"},n)}function j(e,t){var n=void 0;return function(){for(var r=arguments.length,o=new Array(r),a=0;a<r;a++)o[a]=arguments[a];n&&clearTimeout(n),n=setTimeout(function(){return e.apply(void 0,o)},t)}}function D(e){return e.reduce(function(e,t){return e.concat(t)},[])}var P=0;function T(e){return 0===e.collections.length?0:e.collections.reduce(function(e,t){return e+t.items.length},0)}function I(e){return e!==Object(e)}function N(e,t){if(e===t)return!0;if(I(e)||I(t)||"function"==typeof e||"function"==typeof t)return e===t;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(var n=0,r=Object.keys(e);n<r.length;n++){var o=r[n];if(!(o in t))return!1;if(!N(e[o],t[o]))return!1}return!0}var L=function(){},R=[{segment:"autocomplete-core",version:"1.17.9"}];function F(e){var t=e.item,n=e.items,r=void 0===n?[]:n;return{index:t.__autocomplete_indexName,items:[t],positions:[1+r.findIndex(function(e){return e.objectID===t.objectID})],queryID:t.__autocomplete_queryID,algoliaSource:["autocomplete"]}}function z(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}var B=["items"],$=["items"];function U(e){return U="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},U(e)}function q(e){return function(e){if(Array.isArray(e))return H(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return H(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?H(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function H(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function V(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function W(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function G(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?W(Object(n),!0).forEach(function(t){K(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):W(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function K(e,t,n){return(t=function(e){var t=function(e){if("object"!==U(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==U(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===U(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Q(e){return e.map(function(e){var t=e.items,n=V(e,B);return G(G({},n),{},{objectIDs:(null==t?void 0:t.map(function(e){return e.objectID}))||n.objectIDs})})}function Y(e){var t,n,r,o=(t=function(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,s,i=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t);else for(;!(c=(r=a.call(n)).done)&&(i.push(r.value),i.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(s=n.return(),Object(s)!==s))return}finally{if(l)throw o}}return i}}(e,t)||function(e,t){if(e){if("string"==typeof e)return z(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?z(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}((e.version||"").split(".").map(Number),2),n=t[0],r=t[1],n>=3||2===n&&r>=4||1===n&&r>=10);function a(t,n,r){if(o&&void 0!==r){var a=r[0].__autocomplete_algoliaCredentials,s={"X-Algolia-Application-Id":a.appId,"X-Algolia-API-Key":a.apiKey};e.apply(void 0,[t].concat(q(n),[{headers:s}]))}else e.apply(void 0,[t].concat(q(n)))}return{init:function(t,n){e("init",{appId:t,apiKey:n})},setAuthenticatedUserToken:function(t){e("setAuthenticatedUserToken",t)},setUserToken:function(t){e("setUserToken",t)},clickedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("clickedObjectIDsAfterSearch",Q(t),t[0].items)},clickedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("clickedObjectIDs",Q(t),t[0].items)},clickedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["clickedFilters"].concat(n))},convertedObjectIDsAfterSearch:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("convertedObjectIDsAfterSearch",Q(t),t[0].items)},convertedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&a("convertedObjectIDs",Q(t),t[0].items)},convertedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["convertedFilters"].concat(n))},viewedObjectIDs:function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];t.length>0&&t.reduce(function(e,t){var n=t.items,r=V(t,$);return[].concat(q(e),q(function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:20,n=[],r=0;r<e.objectIDs.length;r+=t)n.push(G(G({},e),{},{objectIDs:e.objectIDs.slice(r,r+t)}));return n}(G(G({},r),{},{objectIDs:(null==n?void 0:n.map(function(e){return e.objectID}))||r.objectIDs})).map(function(e){return{items:n,payload:e}})))},[]).forEach(function(e){var t=e.items;return a("viewedObjectIDs",[e.payload],t)})},viewedFilters:function(){for(var t=arguments.length,n=new Array(t),r=0;r<t;r++)n[r]=arguments[r];n.length>0&&e.apply(void 0,["viewedFilters"].concat(n))}}}function Z(e){var t=e.items.reduce(function(e,t){var n;return e[t.__autocomplete_indexName]=(null!==(n=e[t.__autocomplete_indexName])&&void 0!==n?n:[]).concat(t),e},{});return Object.keys(t).map(function(e){return{index:e,items:t[e],algoliaSource:["autocomplete"]}})}function X(e){return e.objectID&&e.__autocomplete_indexName&&e.__autocomplete_queryID}function J(e){return J="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},J(e)}function ee(e){return function(e){if(Array.isArray(e))return te(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return te(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?te(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function te(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function ne(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function re(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ne(Object(n),!0).forEach(function(t){oe(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ne(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function oe(e,t,n){return(t=function(e){var t=function(e){if("object"!==J(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==J(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===J(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var ae="2.15.0",se="https://cdn.jsdelivr.net/npm/search-insights@".concat(ae,"/dist/search-insights.min.js"),ie=j(function(e){var t=e.onItemsChange,n=e.items,r=e.insights,o=e.state;t({insights:r,insightsEvents:Z({items:n}).map(function(e){return re({eventName:"Items Viewed"},e)}),state:o})},400);function ce(e){var t=function(e){return re({onItemsChange:function(e){var t=e.insights,n=e.insightsEvents,r=e.state;t.viewedObjectIDs.apply(t,ee(n.map(function(e){return re(re({},e),{},{algoliaSource:le(e.algoliaSource,r.context)})})))},onSelect:function(e){var t=e.insights,n=e.insightsEvents,r=e.state;t.clickedObjectIDsAfterSearch.apply(t,ee(n.map(function(e){return re(re({},e),{},{algoliaSource:le(e.algoliaSource,r.context)})})))},onActive:L,__autocomplete_clickAnalytics:!0},e)}(e),n=t.insightsClient,r=t.insightsInitParams,o=t.onItemsChange,a=t.onSelect,s=t.onActive,i=t.__autocomplete_clickAnalytics,c=n;if(n||"undefined"!=typeof window&&function(e){var t=e.window,n=t.AlgoliaAnalyticsObject||"aa";"string"==typeof n&&(c=t[n]),c||(t.AlgoliaAnalyticsObject=n,t[n]||(t[n]=function(){t[n].queue||(t[n].queue=[]);for(var e=arguments.length,r=new Array(e),o=0;o<e;o++)r[o]=arguments[o];t[n].queue.push(r)}),t[n].version=ae,c=t[n],function(e){var t="[Autocomplete]: Could not load search-insights.js. Please load it manually following https://alg.li/insights-autocomplete";try{var n=e.document.createElement("script");n.async=!0,n.src=se,n.onerror=function(){console.error(t)},document.body.appendChild(n)}catch(e){console.error(t)}}(t))}({window:window}),!c)return{};r&&c("init",re({partial:!0},r));var l=Y(c),u={current:[]},d=j(function(e){var t=e.state;if(t.isOpen){var n=t.collections.reduce(function(e,t){return[].concat(ee(e),ee(t.items))},[]).filter(X);N(u.current.map(function(e){return e.objectID}),n.map(function(e){return e.objectID}))||(u.current=n,n.length>0&&ie({onItemsChange:o,items:n,insights:l,state:t}))}},0);return{name:"aa.algoliaInsightsPlugin",subscribe:function(e){var t=e.setContext,n=e.onSelect,r=e.onActive;function o(e){t({algoliaInsightsPlugin:{__algoliaSearchParameters:re(re({},i?{clickAnalytics:!0}:{}),e?{userToken:ue(e)}:{}),insights:l}})}c("addAlgoliaAgent","insights-plugin"),o(),c("onUserTokenChange",function(e){o(e)}),c("getUserToken",null,function(e,t){o(t)}),n(function(e){var t=e.item,n=e.state,r=e.event,o=e.source;X(t)&&a({state:n,event:r,insights:l,item:t,insightsEvents:[re({eventName:"Item Selected"},F({item:t,items:o.getItems().filter(X)}))]})}),r(function(e){var t=e.item,n=e.source,r=e.state,o=e.event;X(t)&&s({state:r,event:o,insights:l,item:t,insightsEvents:[re({eventName:"Item Active"},F({item:t,items:n.getItems().filter(X)}))]})})},onStateChange:function(e){var t=e.state;d({state:t})},__autocomplete_pluginOptions:e}}function le(){var e,t=arguments.length>1?arguments[1]:void 0;return[].concat(ee(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]),["autocomplete-internal"],ee(null!==(e=t.algoliaInsightsPlugin)&&void 0!==e&&e.__automaticInsights?["autocomplete-automatic"]:[]))}function ue(e){return"number"==typeof e?e.toString():e}function de(e,t){var n=t;return{then:function(t,r){return de(e.then(fe(t,n,e),fe(r,n,e)),n)},catch:function(t){return de(e.catch(fe(t,n,e)),n)},finally:function(t){return t&&n.onCancelList.push(t),de(e.finally(fe(t&&function(){return n.onCancelList=[],t()},n,e)),n)},cancel:function(){n.isCanceled=!0;var e=n.onCancelList;n.onCancelList=[],e.forEach(function(e){e()})},isCanceled:function(){return!0===n.isCanceled}}}function pe(e){return de(e,{isCanceled:!1,onCancelList:[]})}function fe(e,t,n){return e?function(n){return t.isCanceled?n:e(n)}:n}function he(e,t,n,r){if(!n)return null;if(e<0&&(null===t||null!==r&&0===t))return n+e;var o=(null===t?-1:t)+e;return o<=-1||o>=n?null===r?null:0:o}function me(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function ge(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?me(Object(n),!0).forEach(function(t){be(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):me(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function be(e,t,n){return(t=function(e){var t=function(e){if("object"!==ye(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==ye(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===ye(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ye(e){return ye="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ye(e)}function ve(e){var t=function(e){var t=e.collections.map(function(e){return e.items.length}).reduce(function(e,t,n){var r=(e[n-1]||0)+t;return e.push(r),e},[]).reduce(function(t,n){return n<=e.activeItemId?t+1:t},0);return e.collections[t]}(e);if(!t)return null;var n=t.items[function(e){for(var t=e.state,n=e.collection,r=!1,o=0,a=0;!1===r;){var s=t.collections[o];if(s===n){r=!0;break}a+=s.items.length,o++}return t.activeItemId-a}({state:e,collection:t})],r=t.source;return{item:n,itemInputValue:r.getItemInputValue({item:n,state:e}),itemUrl:r.getItemUrl({item:n,state:e}),source:r}}function _e(e,t,n){return[e,null==n?void 0:n.sourceId,t].filter(Boolean).join("-").replace(/\s/g,"")}var ke=/((gt|sm)-|galaxy nexus)|samsung[- ]|samsungbrowser/i;function we(e){return e.nativeEvent||e}function Ce(e){return Ce="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ce(e)}function xe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Se(e,t,n){return(t=function(e){var t=function(e){if("object"!==Ce(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Ce(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Ce(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Me(e){return Me="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Me(e)}function Ee(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Oe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ee(Object(n),!0).forEach(function(t){Ae(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ee(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Ae(e,t,n){return(t=function(e){var t=function(e){if("object"!==Me(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Me(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Me(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function je(e){return je="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},je(e)}function De(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function Pe(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Te(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Pe(Object(n),!0).forEach(function(t){Ie(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Pe(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Ie(e,t,n){return(t=function(e){var t=function(e){if("object"!==je(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==je(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===je(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Ne(e,t){var n,r="undefined"!=typeof window?window:{},o=e.plugins||[];return Te(Te({debug:!1,openOnFocus:!1,enterKeyHint:void 0,ignoreCompositionEvents:!1,placeholder:"",autoFocus:!1,defaultActiveItemId:null,stallThreshold:300,insights:void 0,environment:r,shouldPanelOpen:function(e){return T(e.state)>0},reshape:function(e){return e.sources}},e),{},{id:null!==(n=e.id)&&void 0!==n?n:"autocomplete-".concat(P++),plugins:o,initialState:Te({activeItemId:null,query:"",completion:null,collections:[],isOpen:!1,status:"idle",context:{}},e.initialState),onStateChange:function(t){var n;null===(n=e.onStateChange)||void 0===n||n.call(e,t),o.forEach(function(e){var n;return null===(n=e.onStateChange)||void 0===n?void 0:n.call(e,t)})},onSubmit:function(t){var n;null===(n=e.onSubmit)||void 0===n||n.call(e,t),o.forEach(function(e){var n;return null===(n=e.onSubmit)||void 0===n?void 0:n.call(e,t)})},onReset:function(t){var n;null===(n=e.onReset)||void 0===n||n.call(e,t),o.forEach(function(e){var n;return null===(n=e.onReset)||void 0===n?void 0:n.call(e,t)})},getSources:function(n){return Promise.all([].concat(function(e){return function(e){if(Array.isArray(e))return De(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return De(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?De(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}(o.map(function(e){return e.getSources})),[e.getSources]).filter(Boolean).map(function(e){return function(e,t){var n=[];return Promise.resolve(e(t)).then(function(e){return Promise.all(e.filter(function(e){return Boolean(e)}).map(function(e){if(e.sourceId,n.includes(e.sourceId))throw new Error("[Autocomplete] The `sourceId` ".concat(JSON.stringify(e.sourceId)," is not unique."));n.push(e.sourceId);var t={getItemInputValue:function(e){return e.state.query},getItemUrl:function(){},onSelect:function(e){(0,e.setIsOpen)(!1)},onActive:L,onResolve:L};Object.keys(t).forEach(function(e){t[e].__default=!0});var r=ge(ge({},t),e);return Promise.resolve(r)}))})}(e,n)})).then(function(e){return D(e)}).then(function(e){return e.map(function(e){return Te(Te({},e),{},{onSelect:function(n){e.onSelect(n),t.forEach(function(e){var t;return null===(t=e.onSelect)||void 0===t?void 0:t.call(e,n)})},onActive:function(n){e.onActive(n),t.forEach(function(e){var t;return null===(t=e.onActive)||void 0===t?void 0:t.call(e,n)})},onResolve:function(n){e.onResolve(n),t.forEach(function(e){var t;return null===(t=e.onResolve)||void 0===t?void 0:t.call(e,n)})}})})})},navigator:Te({navigate:function(e){var t=e.itemUrl;r.location.assign(t)},navigateNewTab:function(e){var t=e.itemUrl,n=r.open(t,"_blank","noopener");null==n||n.focus()},navigateNewWindow:function(e){var t=e.itemUrl;r.open(t,"_blank","noopener")}},e.navigator)})}function Le(e){return Le="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Le(e)}function Re(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Fe(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Re(Object(n),!0).forEach(function(t){ze(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Re(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function ze(e,t,n){return(t=function(e){var t=function(e){if("object"!==Le(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Le(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Le(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Be(e){return Be="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Be(e)}function $e(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Ue(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?$e(Object(n),!0).forEach(function(t){qe(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):$e(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function qe(e,t,n){return(t=function(e){var t=function(e){if("object"!==Be(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Be(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Be(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function He(e){return function(e){if(Array.isArray(e))return Ve(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(e){if("string"==typeof e)return Ve(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Ve(e,t):void 0}}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ve(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function We(e){return Boolean(e.execute)}function Ge(e){var t=e.reduce(function(e,t){if(!We(t))return e.push(t),e;var n=t.searchClient,r=t.execute,o=t.requesterId,a=t.requests,s=e.find(function(e){return We(t)&&We(e)&&e.searchClient===n&&Boolean(o)&&e.requesterId===o});if(s){var i;(i=s.items).push.apply(i,He(a))}else{var c={execute:r,requesterId:o,items:a,searchClient:n};e.push(c)}return e},[]).map(function(e){if(!We(e))return Promise.resolve(e);var t=e,n=t.execute,r=t.items;return n({searchClient:t.searchClient,requests:r})});return Promise.all(t).then(function(e){return D(e)})}function Ke(e){return Ke="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ke(e)}var Qe=["event","nextState","props","query","refresh","store"];function Ye(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Ze(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ye(Object(n),!0).forEach(function(t){Xe(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ye(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Xe(e,t,n){return(t=function(e){var t=function(e){if("object"!==Ke(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Ke(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Ke(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Je,et,tt,nt=null,rt=(Je=-1,et=-1,tt=void 0,function(e){var t=++Je;return Promise.resolve(e).then(function(e){return tt&&t<et?tt:(et=t,tt=e,e)})});function ot(e){var t=e.event,n=e.nextState,r=void 0===n?{}:n,o=e.props,a=e.query,s=e.refresh,i=e.store,c=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,Qe);nt&&o.environment.clearTimeout(nt);var l=c.setCollections,u=c.setIsOpen,d=c.setQuery,p=c.setActiveItemId,f=c.setStatus,h=c.setContext;if(d(a),p(o.defaultActiveItemId),!a&&!1===o.openOnFocus){var m,g=i.getState().collections.map(function(e){return Ze(Ze({},e),{},{items:[]})});f("idle"),l(g),u(null!==(m=r.isOpen)&&void 0!==m?m:o.shouldPanelOpen({state:i.getState()}));var b=pe(rt(g).then(function(){return Promise.resolve()}));return i.pendingRequests.add(b)}f("loading"),nt=o.environment.setTimeout(function(){f("stalled")},o.stallThreshold);var y=pe(rt(o.getSources(Ze({query:a,refresh:s,state:i.getState()},c)).then(function(e){return Promise.all(e.map(function(e){return Promise.resolve(e.getItems(Ze({query:a,refresh:s,state:i.getState()},c))).then(function(t){return function(e,t,n){if(o=e,Boolean(null==o?void 0:o.execute)){var r="algolia"===e.requesterId?Object.assign.apply(Object,[{}].concat(He(Object.keys(n.context).map(function(e){var t;return null===(t=n.context[e])||void 0===t?void 0:t.__algoliaSearchParameters})))):{};return Ue(Ue({},e),{},{requests:e.queries.map(function(n){return{query:"algolia"===e.requesterId?Ue(Ue({},n),{},{params:Ue(Ue({},r),n.params)}):n,sourceId:t,transformResponse:e.transformResponse}})})}var o;return{items:e,sourceId:t}}(t,e.sourceId,i.getState())})})).then(Ge).then(function(t){var n,r=t.some(function(e){return function(e){return!Array.isArray(e)&&Boolean(null==e?void 0:e._automaticInsights)}(e.items)});return r&&h({algoliaInsightsPlugin:Ze(Ze({},(null===(n=i.getState().context)||void 0===n?void 0:n.algoliaInsightsPlugin)||{}),{},{__automaticInsights:r})}),function(e,t,n){return t.map(function(t){var r,o=e.filter(function(e){return e.sourceId===t.sourceId}),a=o.map(function(e){return e.items}),s=o[0].transformResponse,i=s?s({results:r=a,hits:r.map(function(e){return e.hits}).filter(Boolean),facetHits:r.map(function(e){var t;return null===(t=e.facetHits)||void 0===t?void 0:t.map(function(e){return{label:e.value,count:e.count,_highlightResult:{label:{value:e.highlighted}}}})}).filter(Boolean)}):a;return t.onResolve({source:t,results:a,items:i,state:n.getState()}),i.every(Boolean),'The `getItems` function from source "'.concat(t.sourceId,'" must return an array of items but returned ').concat(JSON.stringify(void 0),".\n\nDid you forget to return items?\n\nSee: https://www.algolia.com/doc/ui-libraries/autocomplete/core-concepts/sources/#param-getitems"),{source:t,items:i}})}(t,e,i)}).then(function(e){return function(e){var t=e.props,n=e.state,r=e.collections.reduce(function(e,t){return Fe(Fe({},e),{},ze({},t.source.sourceId,Fe(Fe({},t.source),{},{getItems:function(){return D(t.items)}})))},{}),o=t.plugins.reduce(function(e,t){return t.reshape?t.reshape(e):e},{sourcesBySourceId:r,state:n}).sourcesBySourceId;return D(t.reshape({sourcesBySourceId:o,sources:Object.values(o),state:n})).filter(Boolean).map(function(e){return{source:e,items:e.getItems()}})}({collections:e,props:o,state:i.getState()})})}))).then(function(e){var n;f("idle"),l(e);var d=o.shouldPanelOpen({state:i.getState()});u(null!==(n=r.isOpen)&&void 0!==n?n:o.openOnFocus&&!a&&d||d);var p=ve(i.getState());if(null!==i.getState().activeItemId&&p){var h=p.item,m=p.itemInputValue,g=p.itemUrl,b=p.source;b.onActive(Ze({event:t,item:h,itemInputValue:m,itemUrl:g,refresh:s,source:b,state:i.getState()},c))}}).finally(function(){f("idle"),nt&&o.environment.clearTimeout(nt)});return i.pendingRequests.add(y)}function at(e){return at="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},at(e)}var st=["event","props","refresh","store"];function it(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function ct(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?it(Object(n),!0).forEach(function(t){lt(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):it(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function lt(e,t,n){return(t=function(e){var t=function(e){if("object"!==at(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==at(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===at(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ut(e){return ut="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},ut(e)}var dt=["props","refresh","store"],pt=["inputElement","formElement","panelElement"],ft=["inputElement"],ht=["inputElement","maxLength"],mt=["source"],gt=["item","source"];function bt(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function yt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?bt(Object(n),!0).forEach(function(t){vt(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):bt(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function vt(e,t,n){return(t=function(e){var t=function(e){if("object"!==ut(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==ut(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===ut(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _t(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}function kt(e){var t=e.props,n=e.refresh,r=e.store,o=_t(e,dt);return{getEnvironmentProps:function(e){var n=e.inputElement,o=e.formElement,a=e.panelElement;function s(e){!r.getState().isOpen&&r.pendingRequests.isEmpty()||e.target===n||!1===[o,a].some(function(t){return(n=t)===(r=e.target)||n.contains(r);var n,r})&&(r.dispatch("blur",null),t.debug||r.pendingRequests.cancelAll())}return yt({onTouchStart:s,onMouseDown:s,onTouchMove:function(e){!1!==r.getState().isOpen&&n===t.environment.document.activeElement&&e.target!==n&&n.blur()}},_t(e,pt))},getRootProps:function(e){return yt({role:"combobox","aria-expanded":r.getState().isOpen,"aria-haspopup":"listbox","aria-controls":r.getState().isOpen?r.getState().collections.map(function(e){var n=e.source;return _e(t.id,"list",n)}).join(" "):void 0,"aria-labelledby":_e(t.id,"label")},e)},getFormProps:function(e){return e.inputElement,yt({action:"",noValidate:!0,role:"search",onSubmit:function(a){var s;a.preventDefault(),t.onSubmit(yt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("submit",null),null===(s=e.inputElement)||void 0===s||s.blur()},onReset:function(a){var s;a.preventDefault(),t.onReset(yt({event:a,refresh:n,state:r.getState()},o)),r.dispatch("reset",null),null===(s=e.inputElement)||void 0===s||s.focus()}},_t(e,ft))},getLabelProps:function(e){return yt({htmlFor:_e(t.id,"input"),id:_e(t.id,"label")},e)},getInputProps:function(e){var a;function s(e){(t.openOnFocus||Boolean(r.getState().query))&&ot(yt({event:e,props:t,query:r.getState().completion||r.getState().query,refresh:n,store:r},o)),r.dispatch("focus",null)}var i=e||{};i.inputElement;var c=i.maxLength,l=void 0===c?512:c,u=_t(i,ht),d=ve(r.getState()),p=function(e){return Boolean(e&&e.match(ke))}((null===(a=t.environment.navigator)||void 0===a?void 0:a.userAgent)||""),f=t.enterKeyHint||(null!=d&&d.itemUrl&&!p?"go":"search");return yt({"aria-autocomplete":"both","aria-activedescendant":r.getState().isOpen&&null!==r.getState().activeItemId?_e(t.id,"item-".concat(r.getState().activeItemId),null==d?void 0:d.source):void 0,"aria-controls":r.getState().isOpen?r.getState().collections.map(function(e){var n=e.source;return _e(t.id,"list",n)}).join(" "):void 0,"aria-labelledby":_e(t.id,"label"),value:r.getState().completion||r.getState().query,id:_e(t.id,"input"),autoComplete:"off",autoCorrect:"off",autoCapitalize:"off",enterKeyHint:f,spellCheck:"false",autoFocus:t.autoFocus,placeholder:t.placeholder,maxLength:l,type:"search",onChange:function(e){var a=e.currentTarget.value;t.ignoreCompositionEvents&&we(e).isComposing?o.setQuery(a):ot(yt({event:e,props:t,query:a.slice(0,l),refresh:n,store:r},o))},onCompositionEnd:function(e){ot(yt({event:e,props:t,query:e.currentTarget.value.slice(0,l),refresh:n,store:r},o))},onKeyDown:function(e){we(e).isComposing||function(e){var t=e.event,n=e.props,r=e.refresh,o=e.store,a=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,st);if("ArrowUp"===t.key||"ArrowDown"===t.key){var s=function(){var e=ve(o.getState()),t=n.environment.document.getElementById(_e(n.id,"item-".concat(o.getState().activeItemId),null==e?void 0:e.source));t&&(t.scrollIntoViewIfNeeded?t.scrollIntoViewIfNeeded(!1):t.scrollIntoView(!1))},i=function(){var e=ve(o.getState());if(null!==o.getState().activeItemId&&e){var n=e.item,s=e.itemInputValue,i=e.itemUrl,c=e.source;c.onActive(ct({event:t,item:n,itemInputValue:s,itemUrl:i,refresh:r,source:c,state:o.getState()},a))}};t.preventDefault(),!1===o.getState().isOpen&&(n.openOnFocus||Boolean(o.getState().query))?ot(ct({event:t,props:n,query:o.getState().query,refresh:r,store:o},a)).then(function(){o.dispatch(t.key,{nextActiveItemId:n.defaultActiveItemId}),i(),setTimeout(s,0)}):(o.dispatch(t.key,{}),i(),s())}else if("Escape"===t.key)t.preventDefault(),o.dispatch(t.key,null),o.pendingRequests.cancelAll();else if("Tab"===t.key)o.dispatch("blur",null),o.pendingRequests.cancelAll();else if("Enter"===t.key){if(null===o.getState().activeItemId||o.getState().collections.every(function(e){return 0===e.items.length}))return void(n.debug||o.pendingRequests.cancelAll());t.preventDefault();var c=ve(o.getState()),l=c.item,u=c.itemInputValue,d=c.itemUrl,p=c.source;if(t.metaKey||t.ctrlKey)void 0!==d&&(p.onSelect(ct({event:t,item:l,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewTab({itemUrl:d,item:l,state:o.getState()}));else if(t.shiftKey)void 0!==d&&(p.onSelect(ct({event:t,item:l,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),n.navigator.navigateNewWindow({itemUrl:d,item:l,state:o.getState()}));else if(t.altKey);else{if(void 0!==d)return p.onSelect(ct({event:t,item:l,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a)),void n.navigator.navigate({itemUrl:d,item:l,state:o.getState()});ot(ct({event:t,nextState:{isOpen:!1},props:n,query:u,refresh:r,store:o},a)).then(function(){p.onSelect(ct({event:t,item:l,itemInputValue:u,itemUrl:d,refresh:r,source:p,state:o.getState()},a))})}}}(yt({event:e,props:t,refresh:n,store:r},o))},onFocus:s,onBlur:L,onClick:function(n){e.inputElement!==t.environment.document.activeElement||r.getState().isOpen||s(n)}},u)},getPanelProps:function(e){return yt({onMouseDown:function(e){e.preventDefault()},onMouseLeave:function(){r.dispatch("mouseleave",null)}},e)},getListProps:function(e){var n=e||{},r=n.source,o=_t(n,mt);return yt({role:"listbox","aria-labelledby":_e(t.id,"label"),id:_e(t.id,"list",r)},o)},getItemProps:function(e){var a=e.item,s=e.source,i=_t(e,gt);return yt({id:_e(t.id,"item-".concat(a.__autocomplete_id),s),role:"option","aria-selected":r.getState().activeItemId===a.__autocomplete_id,onMouseMove:function(e){if(a.__autocomplete_id!==r.getState().activeItemId){r.dispatch("mousemove",a.__autocomplete_id);var t=ve(r.getState());if(null!==r.getState().activeItemId&&t){var s=t.item,i=t.itemInputValue,c=t.itemUrl,l=t.source;l.onActive(yt({event:e,item:s,itemInputValue:i,itemUrl:c,refresh:n,source:l,state:r.getState()},o))}}},onMouseDown:function(e){e.preventDefault()},onClick:function(e){var i=s.getItemInputValue({item:a,state:r.getState()}),c=s.getItemUrl({item:a,state:r.getState()});(c?Promise.resolve():ot(yt({event:e,nextState:{isOpen:!1},props:t,query:i,refresh:n,store:r},o))).then(function(){s.onSelect(yt({event:e,item:a,itemInputValue:i,itemUrl:c,refresh:n,source:s,state:r.getState()},o))})}},i)}}}function wt(e){return wt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},wt(e)}function Ct(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function xt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Ct(Object(n),!0).forEach(function(t){St(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Ct(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function St(e,t,n){return(t=function(e){var t=function(e){if("object"!==wt(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==wt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===wt(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Mt(e){var t,n,r,o,a=e.plugins,s=e.options,i=null===(t=((null===(n=s.__autocomplete_metadata)||void 0===n?void 0:n.userAgents)||[])[0])||void 0===t?void 0:t.segment,c=i?St({},i,Object.keys((null===(r=s.__autocomplete_metadata)||void 0===r?void 0:r.options)||{})):{};return{plugins:a.map(function(e){return{name:e.name,options:Object.keys(e.__autocomplete_pluginOptions||[])}}),options:xt({"autocomplete-core":Object.keys(s)},c),ua:R.concat((null===(o=s.__autocomplete_metadata)||void 0===o?void 0:o.userAgents)||[])}}function Et(e){var t,n=e.state;return!1===n.isOpen||null===n.activeItemId?null:(null===(t=ve(n))||void 0===t?void 0:t.itemInputValue)||null}function Ot(e){return Ot="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Ot(e)}function At(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function jt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?At(Object(n),!0).forEach(function(t){Dt(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):At(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Dt(e,t,n){return(t=function(e){var t=function(e){if("object"!==Ot(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Ot(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Ot(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Pt=function(e,t){switch(t.type){case"setActiveItemId":case"mousemove":return jt(jt({},e),{},{activeItemId:t.payload});case"setQuery":return jt(jt({},e),{},{query:t.payload,completion:null});case"setCollections":return jt(jt({},e),{},{collections:t.payload});case"setIsOpen":return jt(jt({},e),{},{isOpen:t.payload});case"setStatus":return jt(jt({},e),{},{status:t.payload});case"setContext":return jt(jt({},e),{},{context:jt(jt({},e.context),t.payload)});case"ArrowDown":var n=jt(jt({},e),{},{activeItemId:t.payload.hasOwnProperty("nextActiveItemId")?t.payload.nextActiveItemId:he(1,e.activeItemId,T(e),t.props.defaultActiveItemId)});return jt(jt({},n),{},{completion:Et({state:n})});case"ArrowUp":var r=jt(jt({},e),{},{activeItemId:he(-1,e.activeItemId,T(e),t.props.defaultActiveItemId)});return jt(jt({},r),{},{completion:Et({state:r})});case"Escape":return e.isOpen?jt(jt({},e),{},{activeItemId:null,isOpen:!1,completion:null}):jt(jt({},e),{},{activeItemId:null,query:"",status:"idle",collections:[]});case"submit":return jt(jt({},e),{},{activeItemId:null,isOpen:!1,status:"idle"});case"reset":return jt(jt({},e),{},{activeItemId:!0===t.props.openOnFocus?t.props.defaultActiveItemId:null,status:"idle",completion:null,query:""});case"focus":return jt(jt({},e),{},{activeItemId:t.props.defaultActiveItemId,isOpen:(t.props.openOnFocus||Boolean(e.query))&&t.props.shouldPanelOpen({state:e})});case"blur":return t.props.debug?e:jt(jt({},e),{},{isOpen:!1,activeItemId:null});case"mouseleave":return jt(jt({},e),{},{activeItemId:t.props.defaultActiveItemId});default:return"The reducer action ".concat(JSON.stringify(t.type)," is not supported."),e}};function Tt(e){return Tt="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},Tt(e)}function It(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function Nt(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?It(Object(n),!0).forEach(function(t){Lt(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):It(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function Lt(e,t,n){return(t=function(e){var t=function(e){if("object"!==Tt(e)||null===e)return e;var t=e[Symbol.toPrimitive];if(void 0!==t){var n=t.call(e,"string");if("object"!==Tt(n))return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e);return"symbol"===Tt(t)?t:String(t)}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Rt(e){var t=[],n=Ne(e,t),r=function(e,t,n){var r,o=t.initialState;return{getState:function(){return o},dispatch:function(r,a){var s=function(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?xe(Object(n),!0).forEach(function(t){Se(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):xe(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}({},o);o=e(o,{type:r,props:t,payload:a}),n({state:o,prevState:s})},pendingRequests:(r=[],{add:function(e){return r.push(e),e.finally(function(){r=r.filter(function(t){return t!==e})})},cancelAll:function(){r.forEach(function(e){return e.cancel()})},isEmpty:function(){return 0===r.length}})}}(Pt,n,function(e){var t,r,a=e.prevState,l=e.state;if(n.onStateChange(Nt({prevState:a,state:l,refresh:s,navigator:n.navigator},o)),!c()&&null!==(t=l.context)&&void 0!==t&&null!==(r=t.algoliaInsightsPlugin)&&void 0!==r&&r.__automaticInsights&&!1!==n.insights){var u=ce({__autocomplete_clickAnalytics:!1});n.plugins.push(u),i([u])}}),o=function(e){var t=e.store;return{setActiveItemId:function(e){t.dispatch("setActiveItemId",e)},setQuery:function(e){t.dispatch("setQuery",e)},setCollections:function(e){var n=0,r=e.map(function(e){return Oe(Oe({},e),{},{items:D(e.items).map(function(e){return Oe(Oe({},e),{},{__autocomplete_id:n++})})})});t.dispatch("setCollections",r)},setIsOpen:function(e){t.dispatch("setIsOpen",e)},setStatus:function(e){t.dispatch("setStatus",e)},setContext:function(e){t.dispatch("setContext",e)}}}({store:r}),a=kt(Nt({props:n,refresh:s,store:r,navigator:n.navigator},o));function s(){return ot(Nt({event:new Event("input"),nextState:{isOpen:r.getState().isOpen},props:n,navigator:n.navigator,query:r.getState().query,refresh:s,store:r},o))}function i(e){e.forEach(function(e){var r;return null===(r=e.subscribe)||void 0===r?void 0:r.call(e,Nt(Nt({},o),{},{navigator:n.navigator,refresh:s,onSelect:function(e){t.push({onSelect:e})},onActive:function(e){t.push({onActive:e})},onResolve:function(e){t.push({onResolve:e})}}))})}function c(){return n.plugins.some(function(e){return"aa.algoliaInsightsPlugin"===e.name})}if(n.insights&&!c()){var l="boolean"==typeof n.insights?{}:n.insights;n.plugins.push(ce(l))}return i(n.plugins),function(e){var t,n,r=e.metadata,o=e.environment;if(null===(t=o.navigator)||void 0===t||null===(n=t.userAgent)||void 0===n?void 0:n.includes("Algolia Crawler")){var a=o.document.createElement("meta"),s=o.document.querySelector("head");a.name="algolia:metadata",setTimeout(function(){a.content=JSON.stringify(r),s.appendChild(a)},0)}}({metadata:Mt({plugins:n.plugins,options:e}),environment:n.environment}),Nt(Nt({refresh:s,navigator:n.navigator},a),o)}function Ft(e){var t=e.translations,n=(void 0===t?{}:t).searchByText,o=void 0===n?"Search by":n;return r.createElement("a",{href:"https://www.algolia.com/ref/docsearch/?utm_source=".concat(window.location.hostname,"&utm_medium=referral&utm_content=powered_by&utm_campaign=docsearch"),target:"_blank",rel:"noopener noreferrer"},r.createElement("span",{className:"DocSearch-Label"},o),r.createElement("svg",{width:"77",height:"19","aria-label":"Algolia",role:"img",id:"Layer_1",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 2196.2 500"},r.createElement("defs",null,r.createElement("style",null,".cls-1,.cls-2{fill:#003dff;}.cls-2{fill-rule:evenodd;}")),r.createElement("path",{className:"cls-2",d:"M1070.38,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),r.createElement("rect",{className:"cls-1",x:"1845.88",y:"104.73",width:"62.58",height:"277.9",rx:"5.9",ry:"5.9"}),r.createElement("path",{className:"cls-2",d:"M1851.78,71.38h50.77c3.26,0,5.9-2.64,5.9-5.9V5.9c0-3.62-3.24-6.39-6.82-5.83l-50.77,7.95c-2.87,.45-4.99,2.92-4.99,5.83v51.62c0,3.26,2.64,5.9,5.9,5.9Z"}),r.createElement("path",{className:"cls-2",d:"M1764.03,275.3V5.91c0-3.63-3.24-6.39-6.82-5.83l-50.46,7.94c-2.87,.45-4.99,2.93-4.99,5.84l.17,273.22c0,12.92,0,92.7,95.97,95.49,3.33,.1,6.09-2.58,6.09-5.91v-40.78c0-2.96-2.19-5.51-5.12-5.84-34.85-4.01-34.85-47.57-34.85-54.72Z"}),r.createElement("path",{className:"cls-2",d:"M1631.95,142.72c-11.14-12.25-24.83-21.65-40.78-28.31-15.92-6.53-33.26-9.85-52.07-9.85-18.78,0-36.15,3.17-51.92,9.85-15.59,6.66-29.29,16.05-40.76,28.31-11.47,12.23-20.38,26.87-26.76,44.03-6.38,17.17-9.24,37.37-9.24,58.36,0,20.99,3.19,36.87,9.55,54.21,6.38,17.32,15.14,32.11,26.45,44.36,11.29,12.23,24.83,21.62,40.6,28.46,15.77,6.83,40.12,10.33,52.4,10.48,12.25,0,36.78-3.82,52.7-10.48,15.92-6.68,29.46-16.23,40.78-28.46,11.29-12.25,20.05-27.04,26.25-44.36,6.22-17.34,9.24-33.22,9.24-54.21,0-20.99-3.34-41.19-10.03-58.36-6.38-17.17-15.14-31.8-26.43-44.03Zm-44.43,163.75c-11.47,15.75-27.56,23.7-48.09,23.7-20.55,0-36.63-7.8-48.1-23.7-11.47-15.75-17.21-34.01-17.21-61.2,0-26.89,5.59-49.14,17.06-64.87,11.45-15.75,27.54-23.52,48.07-23.52,20.55,0,36.63,7.78,48.09,23.52,11.47,15.57,17.36,37.98,17.36,64.87,0,27.19-5.72,45.3-17.19,61.2Z"}),r.createElement("path",{className:"cls-2",d:"M894.42,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),r.createElement("path",{className:"cls-2",d:"M2133.97,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-14.52,22.58-22.99,49.63-22.99,78.73,0,44.89,20.13,84.92,51.59,111.1,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47,1.23,0,2.46-.03,3.68-.09,.36-.02,.71-.05,1.07-.07,.87-.05,1.75-.11,2.62-.2,.34-.03,.68-.08,1.02-.12,.91-.1,1.82-.21,2.73-.34,.21-.03,.42-.07,.63-.1,32.89-5.07,61.56-30.82,70.9-62.81v57.83c0,3.26,2.64,5.9,5.9,5.9h50.42c3.26,0,5.9-2.64,5.9-5.9V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,206.92c-12.2,10.16-27.97,13.98-44.84,15.12-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-42.24,0-77.12-35.89-77.12-79.37,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33v142.83Z"}),r.createElement("path",{className:"cls-2",d:"M1314.05,104.73h-49.33c-48.36,0-90.91,25.48-115.75,64.1-11.79,18.34-19.6,39.64-22.11,62.59-.58,5.3-.88,10.68-.88,16.14s.31,11.15,.93,16.59c4.28,38.09,23.14,71.61,50.66,94.52,2.93,2.6,6.05,4.98,9.31,7.14,12.86,8.49,28.11,13.47,44.52,13.47h0c17.99,0,34.61-5.93,48.16-15.97,16.29-11.58,28.88-28.54,34.48-47.75v50.26h-.11v11.08c0,21.84-5.71,38.27-17.34,49.36-11.61,11.08-31.04,16.63-58.25,16.63-11.12,0-28.79-.59-46.6-2.41-2.83-.29-5.46,1.5-6.27,4.22l-12.78,43.11c-1.02,3.46,1.27,7.02,4.83,7.53,21.52,3.08,42.52,4.68,54.65,4.68,48.91,0,85.16-10.75,108.89-32.21,21.48-19.41,33.15-48.89,35.2-88.52V110.63c0-3.26-2.64-5.9-5.9-5.9h-56.32Zm0,64.1s.65,139.13,0,143.36c-12.08,9.77-27.11,13.59-43.49,14.7-.16,.01-.33,.03-.49,.04-1.12,.07-2.24,.1-3.36,.1-1.32,0-2.63-.03-3.94-.1-40.41-2.11-74.52-37.26-74.52-79.38,0-10.25,1.96-20.01,5.42-28.98,11.22-29.12,38.77-49.74,71.06-49.74h49.33Z"}),r.createElement("path",{className:"cls-1",d:"M249.83,0C113.3,0,2,110.09,.03,246.16c-2,138.19,110.12,252.7,248.33,253.5,42.68,.25,83.79-10.19,120.3-30.03,3.56-1.93,4.11-6.83,1.08-9.51l-23.38-20.72c-4.75-4.21-11.51-5.4-17.36-2.92-25.48,10.84-53.17,16.38-81.71,16.03-111.68-1.37-201.91-94.29-200.13-205.96,1.76-110.26,92-199.41,202.67-199.41h202.69V407.41l-115-102.18c-3.72-3.31-9.42-2.66-12.42,1.31-18.46,24.44-48.53,39.64-81.93,37.34-46.33-3.2-83.87-40.5-87.34-86.81-4.15-55.24,39.63-101.52,94-101.52,49.18,0,89.68,37.85,93.91,85.95,.38,4.28,2.31,8.27,5.52,11.12l29.95,26.55c3.4,3.01,8.79,1.17,9.63-3.3,2.16-11.55,2.92-23.58,2.07-35.92-4.82-70.34-61.8-126.93-132.17-131.26-80.68-4.97-148.13,58.14-150.27,137.25-2.09,77.1,61.08,143.56,138.19,145.26,32.19,.71,62.03-9.41,86.14-26.95l150.26,133.2c6.44,5.71,16.61,1.14,16.61-7.47V9.48C499.66,4.25,495.42,0,490.18,0H249.83Z"})))}function zt(e){return r.createElement("svg",{width:"15",height:"15","aria-label":e.ariaLabel,role:"img"},r.createElement("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2"},e.children))}function Bt(e){var t=e.translations,n=void 0===t?{}:t,o=n.selectText,a=void 0===o?"to select":o,s=n.selectKeyAriaLabel,i=void 0===s?"Enter key":s,c=n.navigateText,l=void 0===c?"to navigate":c,u=n.navigateUpKeyAriaLabel,d=void 0===u?"Arrow up":u,p=n.navigateDownKeyAriaLabel,f=void 0===p?"Arrow down":p,h=n.closeText,m=void 0===h?"to close":h,g=n.closeKeyAriaLabel,b=void 0===g?"Escape key":g,y=n.searchByText,v=void 0===y?"Search by":y;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Logo"},r.createElement(Ft,{translations:{searchByText:v}})),r.createElement("ul",{className:"DocSearch-Commands"},r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:i},r.createElement("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"}))),r.createElement("span",{className:"DocSearch-Label"},a)),r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:f},r.createElement("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"}))),r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:d},r.createElement("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"}))),r.createElement("span",{className:"DocSearch-Label"},l)),r.createElement("li",null,r.createElement("kbd",{className:"DocSearch-Commands-Key"},r.createElement(zt,{ariaLabel:b},r.createElement("path",{d:"M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956"}))),r.createElement("span",{className:"DocSearch-Label"},m))))}function $t(e){var t=e.hit,n=e.children;return r.createElement("a",{href:t.url},n)}function Ut(){return r.createElement("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5"},r.createElement("g",{fill:"none",fillRule:"evenodd"},r.createElement("g",{transform:"translate(1 1)",strokeWidth:"2"},r.createElement("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),r.createElement("path",{d:"M36 18c0-9.94-8.06-18-18-18"},r.createElement("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})))))}function qt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M3.18 6.6a8.23 8.23 0 1112.93 9.94h0a8.23 8.23 0 01-11.63 0"}),r.createElement("path",{d:"M6.44 7.25H2.55V3.36M10.45 6v5.6M10.45 11.6L13 13"})))}function Ht(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Vt(){return r.createElement("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),r.createElement("path",{d:"M8 17l-6-6 6-6"})))}var Wt=function(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))};function Gt(e){switch(e.type){case"lvl1":return r.createElement(Wt,null);case"content":return r.createElement(Qt,null);default:return r.createElement(Kt,null)}}function Kt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M13 13h4-4V8H7v5h6v4-4H7V8H3h4V3v5h6V3v5h4-4v5zm-6 0v4-4H3h4z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"}))}function Qt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M17 5H3h14zm0 5H3h14zm0 5H3h14z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Yt(){return r.createElement("svg",{width:"20",height:"20",viewBox:"0 0 20 20"},r.createElement("path",{d:"M10 14.2L5 17l1-5.6-4-4 5.5-.7 2.5-5 2.5 5 5.6.8-4 4 .9 5.5z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"}))}function Zt(){return r.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0"}))}function Xt(){return r.createElement("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round"},r.createElement("path",{d:"M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2"}))}function Jt(e){var t=e.translations,n=void 0===t?{}:t,o=n.titleText,a=void 0===o?"Unable to fetch results":o,s=n.helpText,i=void 0===s?"You might want to check your network connection.":s;return r.createElement("div",{className:"DocSearch-ErrorScreen"},r.createElement("div",{className:"DocSearch-Screen-Icon"},r.createElement(Zt,null)),r.createElement("p",{className:"DocSearch-Title"},a),r.createElement("p",{className:"DocSearch-Help"},i))}var en=["translations"];function tn(e){var t=e.translations,n=void 0===t?{}:t,o=b(e,en),a=n.noResultsText,s=void 0===a?"No results for":a,i=n.suggestedQueryText,c=void 0===i?"Try searching for":i,l=n.reportMissingResultsText,u=void 0===l?"Believe this query should return results?":l,d=n.reportMissingResultsLinkText,p=void 0===d?"Let us know.":d,f=o.state.context.searchSuggestions;return r.createElement("div",{className:"DocSearch-NoResults"},r.createElement("div",{className:"DocSearch-Screen-Icon"},r.createElement(Xt,null)),r.createElement("p",{className:"DocSearch-Title"},s,' "',r.createElement("strong",null,o.state.query),'"'),f&&f.length>0&&r.createElement("div",{className:"DocSearch-NoResults-Prefill-List"},r.createElement("p",{className:"DocSearch-Help"},c,":"),r.createElement("ul",null,f.slice(0,3).reduce(function(e,t){return[].concat(k(e),[r.createElement("li",{key:t},r.createElement("button",{className:"DocSearch-Prefill",key:t,type:"button",onClick:function(){o.setQuery(t.toLowerCase()+" "),o.refresh(),o.inputRef.current.focus()}},t))])},[]))),o.getMissingResultsUrl&&r.createElement("p",{className:"DocSearch-Help"},"".concat(u," "),r.createElement("a",{href:o.getMissingResultsUrl({query:o.state.query}),target:"_blank",rel:"noopener noreferrer"},p)))}var nn=["hit","attribute","tagName"];function rn(e,t){return t.split(".").reduce(function(e,t){return null!=e&&e[t]?e[t]:null},e)}function on(e){var t=e.hit,n=e.attribute,o=e.tagName,a=void 0===o?"span":o,s=b(e,nn);return(0,r.createElement)(a,g(g({},s),{},{dangerouslySetInnerHTML:{__html:rn(t,"_snippetResult.".concat(n,".value"))||rn(t,n)}}))}function an(e){return e.collection&&0!==e.collection.items.length?r.createElement("section",{className:"DocSearch-Hits"},r.createElement("div",{className:"DocSearch-Hit-source"},e.title),r.createElement("ul",e.getListProps(),e.collection.items.map(function(t,n){return r.createElement(sn,d({key:[e.title,t.objectID].join(":"),item:t,index:n},e))}))):null}function sn(e){var t=e.item,n=e.index,o=e.renderIcon,a=e.renderAction,s=e.getItemProps,i=e.onItemClick,c=e.collection,l=e.hitComponent,u=_(r.useState(!1),2),p=u[0],f=u[1],h=_(r.useState(!1),2),m=h[0],g=h[1],b=r.useRef(null),y=l;return r.createElement("li",d({className:["DocSearch-Hit",t.__docsearch_parent&&"DocSearch-Hit--Child",p&&"DocSearch-Hit--deleting",m&&"DocSearch-Hit--favoriting"].filter(Boolean).join(" "),onTransitionEnd:function(){b.current&&b.current()}},s({item:t,source:c.source,onClick:function(e){i(t,e)}})),r.createElement(y,{hit:t},r.createElement("div",{className:"DocSearch-Hit-Container"},o({item:t,index:n}),t.hierarchy[t.type]&&"lvl1"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.lvl1"}),t.content&&r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"content"})),t.hierarchy[t.type]&&("lvl2"===t.type||"lvl3"===t.type||"lvl4"===t.type||"lvl5"===t.type||"lvl6"===t.type)&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"hierarchy.".concat(t.type)}),r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),"content"===t.type&&r.createElement("div",{className:"DocSearch-Hit-content-wrapper"},r.createElement(on,{className:"DocSearch-Hit-title",hit:t,attribute:"content"}),r.createElement(on,{className:"DocSearch-Hit-path",hit:t,attribute:"hierarchy.lvl1"})),a({item:t,runDeleteTransition:function(e){f(!0),b.current=e},runFavoriteTransition:function(e){g(!0),b.current=e}}))))}function cn(e,t,n){return e.reduce(function(e,r){var o=t(r);return e.hasOwnProperty(o)||(e[o]=[]),e[o].length<(n||5)&&e[o].push(r),e},{})}function ln(e){return e}function un(e){return 1===e.button||e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}function dn(){}var pn=/(<mark>|<\/mark>)/g,fn=RegExp(pn.source);function hn(e){var t,n,r=e;if(!r.__docsearch_parent&&!e._highlightResult)return e.hierarchy.lvl0;var o=r.__docsearch_parent?null===(t=r.__docsearch_parent)||void 0===t||null===(t=t._highlightResult)||void 0===t||null===(t=t.hierarchy)||void 0===t?void 0:t.lvl0:null===(n=e._highlightResult)||void 0===n||null===(n=n.hierarchy)||void 0===n?void 0:n.lvl0;return o?o.value&&fn.test(o.value)?o.value.replace(pn,""):o.value:e.hierarchy.lvl0}function mn(e){return r.createElement("div",{className:"DocSearch-Dropdown-Container"},e.state.collections.map(function(t){if(0===t.items.length)return null;var n=hn(t.items[0]);return r.createElement(an,d({},e,{key:t.source.sourceId,title:n,collection:t,renderIcon:function(e){var n,o=e.item,a=e.index;return r.createElement(r.Fragment,null,o.__docsearch_parent&&r.createElement("svg",{className:"DocSearch-Hit-Tree",viewBox:"0 0 24 54"},r.createElement("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"},o.__docsearch_parent!==(null===(n=t.items[a+1])||void 0===n?void 0:n.__docsearch_parent)?r.createElement("path",{d:"M8 6v21M20 27H8.3"}):r.createElement("path",{d:"M8 6v42M20 27H8.3"}))),r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Gt,{type:o.type})))},renderAction:function(){return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement(Vt,null))}}))}),e.resultsFooterComponent&&r.createElement("section",{className:"DocSearch-HitsFooter"},r.createElement(e.resultsFooterComponent,{state:e.state})))}var gn=["translations"];function bn(e){var t=e.translations,n=void 0===t?{}:t,o=b(e,gn),a=n.recentSearchesTitle,s=void 0===a?"Recent":a,i=n.noRecentSearchesText,c=void 0===i?"No recent searches":i,l=n.saveRecentSearchButtonTitle,u=void 0===l?"Save this search":l,p=n.removeRecentSearchButtonTitle,f=void 0===p?"Remove this search from history":p,h=n.favoriteSearchesTitle,m=void 0===h?"Favorite":h,g=n.removeFavoriteSearchButtonTitle,y=void 0===g?"Remove this search from favorites":g;return"idle"===o.state.status&&!1===o.hasCollections?o.disableUserPersonalization?null:r.createElement("div",{className:"DocSearch-StartScreen"},r.createElement("p",{className:"DocSearch-Help"},c)):!1===o.hasCollections?null:r.createElement("div",{className:"DocSearch-Dropdown-Container"},r.createElement(an,d({},o,{title:s,collection:o.state.collections[0],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(qt,null))},renderAction:function(e){var t=e.item,n=e.runFavoriteTransition,a=e.runDeleteTransition;return r.createElement(r.Fragment,null,r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:u,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n(function(){o.favoriteSearches.add(t),o.recentSearches.remove(t),o.refresh()})}},r.createElement(Yt,null))),r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:f,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),a(function(){o.recentSearches.remove(t),o.refresh()})}},r.createElement(Ht,null))))}})),r.createElement(an,d({},o,{title:m,collection:o.state.collections[1],renderIcon:function(){return r.createElement("div",{className:"DocSearch-Hit-icon"},r.createElement(Yt,null))},renderAction:function(e){var t=e.item,n=e.runDeleteTransition;return r.createElement("div",{className:"DocSearch-Hit-action"},r.createElement("button",{className:"DocSearch-Hit-action-button",title:y,type:"submit",onClick:function(e){e.preventDefault(),e.stopPropagation(),n(function(){o.favoriteSearches.remove(t),o.refresh()})}},r.createElement(Ht,null)))}})))}var yn=["translations"],vn=r.memo(function(e){var t=e.translations,n=void 0===t?{}:t,o=b(e,yn);if("error"===o.state.status)return r.createElement(Jt,{translations:null==n?void 0:n.errorScreen});var a=o.state.collections.some(function(e){return e.items.length>0});return o.state.query?!1===a?r.createElement(tn,d({},o,{translations:null==n?void 0:n.noResultsScreen})):r.createElement(mn,o):r.createElement(bn,d({},o,{hasCollections:a,translations:null==n?void 0:n.startScreen}))},function(e,t){return"loading"===t.state.status||"stalled"===t.state.status}),_n=["translations"];function kn(e){var t=e.translations,n=void 0===t?{}:t,o=b(e,_n),a=n.resetButtonTitle,s=void 0===a?"Clear the query":a,i=n.resetButtonAriaLabel,c=void 0===i?"Clear the query":i,l=n.cancelButtonText,u=void 0===l?"Cancel":l,p=n.cancelButtonAriaLabel,f=void 0===p?"Cancel":p,h=n.searchInputLabel,m=void 0===h?"Search":h,g=o.getFormProps({inputElement:o.inputRef.current}).onReset;return r.useEffect(function(){o.autoFocus&&o.inputRef.current&&o.inputRef.current.focus()},[o.autoFocus,o.inputRef]),r.useEffect(function(){o.isFromSelection&&o.inputRef.current&&o.inputRef.current.select()},[o.isFromSelection,o.inputRef]),r.createElement(r.Fragment,null,r.createElement("form",{className:"DocSearch-Form",onSubmit:function(e){e.preventDefault()},onReset:g},r.createElement("label",d({className:"DocSearch-MagnifierLabel"},o.getLabelProps()),r.createElement(S,null),r.createElement("span",{className:"DocSearch-VisuallyHiddenForAccessibility"},m)),r.createElement("div",{className:"DocSearch-LoadingIndicator"},r.createElement(Ut,null)),r.createElement("input",d({className:"DocSearch-Input",ref:o.inputRef},o.getInputProps({inputElement:o.inputRef.current,autoFocus:o.autoFocus,maxLength:64}))),r.createElement("button",{type:"reset",title:s,className:"DocSearch-Reset","aria-label":c,hidden:!o.state.query},r.createElement(Ht,null))),r.createElement("button",{className:"DocSearch-Cancel",type:"reset","aria-label":f,onClick:o.onClose},u))}var wn=["_highlightResult","_snippetResult"];function Cn(e){var t=e.key,n=e.limit,r=void 0===n?5:n,o=function(e){return!1===function(){var e="__TEST_KEY__";try{return localStorage.setItem(e,""),localStorage.removeItem(e),!0}catch(e){return!1}}()?{setItem:function(){},getItem:function(){return[]}}:{setItem:function(t){return window.localStorage.setItem(e,JSON.stringify(t))},getItem:function(){var t=window.localStorage.getItem(e);return t?JSON.parse(t):[]}}}(t),a=o.getItem().slice(0,r);return{add:function(e){var t=e;t._highlightResult,t._snippetResult;var n=b(t,wn),s=a.findIndex(function(e){return e.objectID===n.objectID});s>-1&&a.splice(s,1),a.unshift(n),a=a.slice(0,r),o.setItem(a)},remove:function(e){a=a.filter(function(t){return t.objectID!==e.objectID}),o.setItem(a)},getAll:function(){return a}}}function xn(e){var t,n="algolia-client-js-".concat(e.key);function r(){return void 0===t&&(t=e.localStorage||window.localStorage),t}function o(){return JSON.parse(r().getItem(n)||"{}")}function a(e){r().setItem(n,JSON.stringify(e))}return{get:function(t,n){var r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return Promise.resolve().then(function(){var n,r,s;return n=e.timeToLive?1e3*e.timeToLive:null,r=o(),a(s=Object.fromEntries(Object.entries(r).filter(function(e){return void 0!==_(e,2)[1].timestamp}))),n&&a(Object.fromEntries(Object.entries(s).filter(function(e){var t=_(e,2)[1],r=(new Date).getTime();return!(t.timestamp+n<r)}))),o()[JSON.stringify(t)]}).then(function(e){return Promise.all([e?e.value:n(),void 0!==e])}).then(function(e){var t=_(e,2),n=t[0],o=t[1];return Promise.all([n,o||r.miss(n)])}).then(function(e){return _(e,1)[0]})},set:function(e,t){return Promise.resolve().then(function(){var a=o();return a[JSON.stringify(e)]={timestamp:(new Date).getTime(),value:t},r().setItem(n,JSON.stringify(a)),t})},delete:function(e){return Promise.resolve().then(function(){var t=o();delete t[JSON.stringify(e)],r().setItem(n,JSON.stringify(t))})},clear:function(){return Promise.resolve().then(function(){r().removeItem(n)})}}}function Sn(e){var t=k(e.caches),n=t.shift();return void 0===n?{get:function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return t().then(function(e){return Promise.all([e,n.miss(e)])}).then(function(e){return _(e,1)[0]})},set:function(e,t){return Promise.resolve(t)},delete:function(e){return Promise.resolve()},clear:function(){return Promise.resolve()}}:{get:function(e,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}};return n.get(e,r,o).catch(function(){return Sn({caches:t}).get(e,r,o)})},set:function(e,r){return n.set(e,r).catch(function(){return Sn({caches:t}).set(e,r)})},delete:function(e){return n.delete(e).catch(function(){return Sn({caches:t}).delete(e)})},clear:function(){return n.clear().catch(function(){return Sn({caches:t}).clear()})}}}function Mn(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{serializable:!0},t={};return{get:function(n,r){var o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{miss:function(){return Promise.resolve()}},a=JSON.stringify(n);if(a in t)return Promise.resolve(e.serializable?JSON.parse(t[a]):t[a]);var s=r();return s.then(function(e){return o.miss(e)}).then(function(){return s})},set:function(n,r){return t[JSON.stringify(n)]=e.serializable?JSON.stringify(r):r,Promise.resolve(r)},delete:function(e){return delete t[JSON.stringify(e)],Promise.resolve()},clear:function(){return t={},Promise.resolve()}}}function En(e){var t=e.algoliaAgents,n=e.client,r=e.version,o=function(e){var t={value:"Algolia for JavaScript (".concat(e,")"),add:function(e){var n="; ".concat(e.segment).concat(void 0!==e.version?" (".concat(e.version,")"):"");return-1===t.value.indexOf(n)&&(t.value="".concat(t.value).concat(n)),t}};return t}(r).add({segment:n,version:r});return t.forEach(function(e){return o.add(e)}),o}var On=12e4;function An(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"up",n=Date.now();return g(g({},e),{},{status:t,lastUpdate:n,isUp:function(){return"up"===t||Date.now()-n>On},isTimedOut:function(){return"timed out"===t&&Date.now()-n<=On}})}var jn=function(){function e(t,n){var r;return c(this,e),u(r=i(this,e,[t]),"name","AlgoliaError"),n&&(r.name=n),r}return f(e,C(Error)),l(e)}(),Dn=function(){function e(t,n,r){var o;return c(this,e),u(o=i(this,e,[t,r]),"stackTrace",void 0),o.stackTrace=n,o}return f(e,jn),l(e)}(),Pn=function(){function e(t){return c(this,e),i(this,e,["Unreachable hosts - your application id may be incorrect. If the error persists, please reach out to the Algolia Support team: https://alg.li/support.",t,"RetryError"])}return f(e,Dn),l(e)}(),Tn=function(){function e(t,n,r){var o,a=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"ApiError";return c(this,e),u(o=i(this,e,[t,r,a]),"status",void 0),o.status=n,o}return f(e,Dn),l(e)}(),In=function(){function e(t,n){var r;return c(this,e),u(r=i(this,e,[t,"DeserializationError"]),"response",void 0),r.response=n,r}return f(e,jn),l(e)}(),Nn=function(){function e(t,n,r,o){var a;return c(this,e),u(a=i(this,e,[t,n,o,"DetailedApiError"]),"error",void 0),a.error=r,a}return f(e,Tn),l(e)}();function Ln(e,t,n){var r,o=(r=n,Object.keys(r).filter(function(e){return void 0!==r[e]}).sort().map(function(e){return"".concat(e,"=").concat(encodeURIComponent("[object Array]"===Object.prototype.toString.call(r[e])?r[e].join(","):r[e]).replace(/\+/g,"%20"))}).join("&")),a="".concat(e.protocol,"://").concat(e.url).concat(e.port?":".concat(e.port):"","/").concat("/"===t.charAt(0)?t.substring(1):t);return o.length&&(a+="?".concat(o)),a}function Rn(e,t){if("GET"!==e.method&&(void 0!==e.data||void 0!==t.data)){var n=Array.isArray(e.data)?e.data:g(g({},e.data),t.data);return JSON.stringify(n)}}function Fn(e,t,n){var r=g(g(g({Accept:"application/json"},e),t),n),o={};return Object.keys(r).forEach(function(e){var t=r[e];o[e.toLowerCase()]=t}),o}function zn(e){try{return JSON.parse(e.content)}catch(t){throw new In(t.message,e)}}function Bn(e,t){var n=e.content,r=e.status;try{var o=JSON.parse(n);return"error"in o?new Nn(o.message,r,o.error,t):new Tn(o.message,r,t)}catch(e){}return new Tn(n,r,t)}function $n(e){return e.map(function(e){return Un(e)})}function Un(e){var t=e.request.headers["x-algolia-api-key"]?{"x-algolia-api-key":"*****"}:{};return g(g({},e),{},{request:g(g({},e.request),{},{headers:g(g({},e.request.headers),t)})})}var qn=["appId","apiKey","authMode","algoliaAgents"],Hn=["params"],Vn="5.19.0";function Wn(e){return[{url:"".concat(e,"-dsn.algolia.net"),accept:"read",protocol:"https"},{url:"".concat(e,".algolia.net"),accept:"write",protocol:"https"}].concat(function(e){for(var t=e,n=e.length-1;n>0;n--){var r=Math.floor(Math.random()*(n+1)),o=e[n];t[n]=e[r],t[r]=o}return t}([{url:"".concat(e,"-1.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-2.algolianet.com"),accept:"readWrite",protocol:"https"},{url:"".concat(e,"-3.algolianet.com"),accept:"readWrite",protocol:"https"}]))}var Gn="3.9.0";function Kn(e,t,n){return r.useMemo(function(){var r=function(e,t){if(!e||"string"!=typeof e)throw new Error("`appId` is missing.");if(!t||"string"!=typeof t)throw new Error("`apiKey` is missing.");return function(e){var t=e.appId,n=e.apiKey,r=e.authMode,o=e.algoliaAgents,a=b(e,qn),i=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"WithinHeaders",r={"x-algolia-api-key":t,"x-algolia-application-id":e};return{headers:function(){return"WithinHeaders"===n?r:{}},queryParameters:function(){return"WithinQueryParameters"===n?r:{}}}}(t,n,r),c=function(e){var t=e.hosts,n=e.hostsCache,r=e.baseHeaders,o=e.logger,a=e.baseQueryParameters,i=e.algoliaAgent,c=e.timeouts,l=e.requester,u=e.requestsCache,d=e.responsesCache;function p(e){return f.apply(this,arguments)}function f(){return(f=s(y().mark(function e(t){var r,o,a,s,i;return y().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,Promise.all(t.map(function(e){return n.get(e,function(){return Promise.resolve(An(e))})}));case 2:return r=e.sent,o=r.filter(function(e){return e.isUp()}),a=r.filter(function(e){return e.isTimedOut()}),s=[].concat(k(o),k(a)),i=s.length>0?s:t,e.abrupt("return",{hosts:i,getTimeout:function(e,t){return(0===a.length&&0===e?1:a.length+3+e)*t}});case 8:case"end":return e.stop()}},e)}))).apply(this,arguments)}function h(e,t){return m.apply(this,arguments)}function m(){return m=s(y().mark(function e(u,d){var f,h,m,b,v,_,w,C,x,S,M,E,O,A=arguments;return y().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(f=!(A.length>2&&void 0!==A[2])||A[2],h=[],m=Rn(u,d),b=Fn(r,u.headers,d.headers),v="GET"===u.method?g(g({},u.data),d.data):{},_=g(g(g({},a),u.queryParameters),v),i.value&&(_["x-algolia-agent"]=i.value),d&&d.queryParameters)for(w=0,C=Object.keys(d.queryParameters);w<C.length;w++)x=C[w],d.queryParameters[x]&&"[object Object]"!==Object.prototype.toString.call(d.queryParameters[x])?_[x]=d.queryParameters[x].toString():_[x]=d.queryParameters[x];return S=0,M=function(){var e=s(y().mark(function e(t,r){var a,s,i,p,v,k;return y().wrap(function(e){for(;;)switch(e.prev=e.next){case 0:if(void 0!==(a=t.pop())){e.next=3;break}throw new Pn($n(h));case 3:return s=g(g({},c),d.timeouts),i={data:m,headers:b,method:u.method,url:Ln(a,u.path,_),connectTimeout:r(S,s.connect),responseTimeout:r(S,f?s.read:s.write)},p=function(e){var n={request:i,response:e,host:a,triesLeft:t.length};return h.push(n),n},e.next=8,l.send(i);case 8:if(w=(y=v=e.sent).isTimedOut,C=y.status,!(w||function(e){return!e.isTimedOut&&!~~e.status}({isTimedOut:w,status:C})||2!=~~(C/100)&&4!=~~(C/100))){e.next=16;break}return k=p(v),v.isTimedOut&&S++,o.info("Retryable failure",Un(k)),e.next=15,n.set(a,An(a,v.isTimedOut?"timed out":"down"));case 15:return e.abrupt("return",M(t,r));case 16:if(2!=~~(v.status/100)){e.next=18;break}return e.abrupt("return",zn(v));case 18:throw p(v),Bn(v,h);case 20:case"end":return e.stop()}var y,w,C},e)}));return function(t,n){return e.apply(this,arguments)}}(),E=t.filter(function(e){return"readWrite"===e.accept||(f?"read"===e.accept:"write"===e.accept)}),e.next=13,p(E);case 13:return O=e.sent,e.abrupt("return",M(k(O.hosts).reverse(),O.getTimeout));case 15:case"end":return e.stop()}},e)})),m.apply(this,arguments)}return{hostsCache:n,requester:l,timeouts:c,logger:o,algoliaAgent:i,baseHeaders:r,baseQueryParameters:a,hosts:t,request:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=e.useReadTransporter||"GET"===e.method;if(!n)return h(e,t,n);var o=function(){return h(e,t)};if(!0!==(t.cacheable||e.cacheable))return o();var s={request:e,requestOptions:t,transporter:{queryParameters:a,headers:r}};return d.get(s,function(){return u.get(s,function(){return u.set(s,o()).then(function(e){return Promise.all([u.delete(s),e])},function(e){return Promise.all([u.delete(s),Promise.reject(e)])}).then(function(e){var t=_(e,2);return t[0],t[1]})})},{miss:function(e){return d.set(s,e)}})},requestsCache:u,responsesCache:d}}(g(g({hosts:Wn(t)},a),{},{algoliaAgent:En({algoliaAgents:o,client:"Lite",version:Vn}),baseHeaders:g(g({"content-type":"text/plain"},i.headers()),a.baseHeaders),baseQueryParameters:g(g({},i.queryParameters()),a.baseQueryParameters)}));return{transporter:c,appId:t,apiKey:n,clearCache:function(){return Promise.all([c.requestsCache.clear(),c.responsesCache.clear()]).then(function(){})},get _ua(){return c.algoliaAgent.value},addAlgoliaAgent:function(e,t){c.algoliaAgent.add({segment:e,version:t})},setClientApiKey:function(e){var t=e.apiKey;r&&"WithinHeaders"!==r?c.baseQueryParameters["x-algolia-api-key"]=t:c.baseHeaders["x-algolia-api-key"]=t},searchForHits:function(e,t){return this.search(e,t)},searchForFacets:function(e,t){return this.search(e,t)},customPost:function(e,t){var n=e.path,r=e.parameters,o=e.body;if(!n)throw new Error("Parameter `path` is required when calling `customPost`.");var a={method:"POST",path:"/{path}".replace("{path}",n),queryParameters:r||{},headers:{},data:o||{}};return c.request(a,t)},getRecommendations:function(e,t){if(e&&Array.isArray(e)&&(e={requests:e}),!e)throw new Error("Parameter `getRecommendationsParams` is required when calling `getRecommendations`.");if(!e.requests)throw new Error("Parameter `getRecommendationsParams.requests` is required when calling `getRecommendations`.");var n={method:"POST",path:"/1/indexes/*/recommendations",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return c.request(n,t)},search:function(e,t){if(e&&Array.isArray(e)){var n={requests:e.map(function(e){var t=e.params,n=b(e,Hn);return"facet"===n.type?g(g(g({},n),t),{},{type:"facet"}):g(g(g({},n),t),{},{facet:void 0,maxFacetHits:void 0,facetQuery:void 0})})};e=n}if(!e)throw new Error("Parameter `searchMethodParams` is required when calling `search`.");if(!e.requests)throw new Error("Parameter `searchMethodParams.requests` is required when calling `search`.");var r={method:"POST",path:"/1/indexes/*/queries",queryParameters:{},headers:{},data:e,useReadTransporter:!0,cacheable:!0};return c.request(r,t)}}}(g({appId:e,apiKey:t,timeouts:{connect:1e3,read:2e3,write:3e4},logger:{debug:function(e,t){return Promise.resolve()},info:function(e,t){return Promise.resolve()},error:function(e,t){return Promise.resolve()}},requester:{send:function(e){return new Promise(function(t){var n=new XMLHttpRequest;n.open(e.method,e.url,!0),Object.keys(e.headers).forEach(function(t){return n.setRequestHeader(t,e.headers[t])});var r,o=function(e,r){return setTimeout(function(){n.abort(),t({status:0,content:r,isTimedOut:!0})},e)},a=o(e.connectTimeout,"Connection timeout");n.onreadystatechange=function(){n.readyState>n.OPENED&&void 0===r&&(clearTimeout(a),r=o(e.responseTimeout,"Socket timeout"))},n.onerror=function(){0===n.status&&(clearTimeout(a),clearTimeout(r),t({content:n.responseText||"Network request failed",status:n.status,isTimedOut:!1}))},n.onload=function(){clearTimeout(a),clearTimeout(r),t({content:n.responseText,status:n.status,isTimedOut:!1})},n.send(e.data)})}},algoliaAgents:[{segment:"Browser"}],authMode:"WithinQueryParameters",responsesCache:Mn(),requestsCache:Mn({serializable:!1}),hostsCache:Sn({caches:[xn({key:"".concat(Vn,"-").concat(e)}),Mn()]})},void 0))}(e,t);return r.addAlgoliaAgent("docsearch",Gn),!1===/docsearch.js \(.*\)/.test(r.transporter.algoliaAgent.value)&&r.addAlgoliaAgent("docsearch-react",Gn),n(r)},[e,t,n])}var Qn=["footer","searchBox"];function Yn(e){var t=e.appId,n=e.apiKey,o=e.indexName,a=e.placeholder,s=void 0===a?"Search docs":a,i=e.searchParameters,c=e.maxResultsPerGroup,l=e.onClose,u=void 0===l?dn:l,p=e.transformItems,f=void 0===p?ln:p,h=e.hitComponent,m=void 0===h?$t:h,y=e.resultsFooterComponent,v=void 0===y?function(){return null}:y,k=e.navigator,w=e.initialScrollY,C=void 0===w?0:w,x=e.transformSearchClient,S=void 0===x?ln:x,M=e.disableUserPersonalization,E=void 0!==M&&M,O=e.initialQuery,A=void 0===O?"":O,j=e.translations,D=void 0===j?{}:j,P=e.getMissingResultsUrl,T=e.insights,I=void 0!==T&&T,N=D.footer,L=D.searchBox,R=b(D,Qn),F=_(r.useState({query:"",collections:[],completion:null,context:{},isOpen:!1,activeItemId:null,status:"idle"}),2),z=F[0],B=F[1],$=r.useRef(null),U=r.useRef(null),q=r.useRef(null),H=r.useRef(null),V=r.useRef(null),W=r.useRef(10),G=r.useRef("undefined"!=typeof window?window.getSelection().toString().slice(0,64):"").current,K=r.useRef(A||G).current,Q=Kn(t,n,S),Y=r.useRef(Cn({key:"__DOCSEARCH_FAVORITE_SEARCHES__".concat(o),limit:10})).current,Z=r.useRef(Cn({key:"__DOCSEARCH_RECENT_SEARCHES__".concat(o),limit:0===Y.getAll().length?7:4})).current,X=r.useCallback(function(e){if(!E){var t="content"===e.type?e.__docsearch_parent:e;t&&-1===Y.getAll().findIndex(function(e){return e.objectID===t.objectID})&&Z.add(t)}},[Y,Z,E]),J=r.useCallback(function(e){if(z.context.algoliaInsightsPlugin&&e.__autocomplete_id){var t=e,n={eventName:"Item Selected",index:t.__autocomplete_indexName,items:[t],positions:[e.__autocomplete_id],queryID:t.__autocomplete_queryID};z.context.algoliaInsightsPlugin.insights.clickedObjectIDsAfterSearch(n)}},[z.context.algoliaInsightsPlugin]),ee=r.useMemo(function(){return Rt({id:"docsearch",defaultActiveItemId:0,placeholder:s,openOnFocus:!0,initialState:{query:K,context:{searchSuggestions:[]}},insights:I,navigator:k,onStateChange:function(e){B(e.state)},getSources:function(e){var r=e.query,a=e.state,s=e.setContext,l=e.setStatus;if(!r)return E?[]:[{sourceId:"recentSearches",onSelect:function(e){var t=e.item,n=e.event;X(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Z.getAll()}},{sourceId:"favoriteSearches",onSelect:function(e){var t=e.item,n=e.event;X(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Y.getAll()}}];var d=Boolean(I);return Q.search({requests:[g({query:r,indexName:o,attributesToRetrieve:["hierarchy.lvl0","hierarchy.lvl1","hierarchy.lvl2","hierarchy.lvl3","hierarchy.lvl4","hierarchy.lvl5","hierarchy.lvl6","content","type","url"],attributesToSnippet:["hierarchy.lvl1:".concat(W.current),"hierarchy.lvl2:".concat(W.current),"hierarchy.lvl3:".concat(W.current),"hierarchy.lvl4:".concat(W.current),"hierarchy.lvl5:".concat(W.current),"hierarchy.lvl6:".concat(W.current),"content:".concat(W.current)],snippetEllipsisText:"\u2026",highlightPreTag:"<mark>",highlightPostTag:"</mark>",hitsPerPage:20,clickAnalytics:d},i)]}).catch(function(e){throw"RetryError"===e.name&&l("error"),e}).then(function(e){var r=e.results[0],i=r.hits,l=r.nbHits,p=cn(i,function(e){return hn(e)},c);a.context.searchSuggestions.length<Object.keys(p).length&&s({searchSuggestions:Object.keys(p)}),s({nbHits:l});var h={};return d&&(h={__autocomplete_indexName:o,__autocomplete_queryID:r.queryID,__autocomplete_algoliaCredentials:{appId:t,apiKey:n}}),Object.values(p).map(function(e,t){return{sourceId:"hits".concat(t),onSelect:function(e){var t=e.item,n=e.event;X(t),un(n)||u()},getItemUrl:function(e){return e.item.url},getItems:function(){return Object.values(cn(e,function(e){return e.hierarchy.lvl1},c)).map(f).map(function(e){return e.map(function(t){var n=null,r=e.find(function(e){return"lvl1"===e.type&&e.hierarchy.lvl1===t.hierarchy.lvl1});return"lvl1"!==t.type&&r&&(n=r),g(g({},t),{},{__docsearch_parent:n},h)})}).flat()}}})})}})},[o,i,c,Q,u,Z,Y,X,K,s,k,f,E,I,t,n]),te=ee.getEnvironmentProps,ne=ee.getRootProps,re=ee.refresh;return function(e){var t=e.getEnvironmentProps,n=e.panelElement,o=e.formElement,a=e.inputElement;r.useEffect(function(){if(n&&o&&a){var e=t({panelElement:n,formElement:o,inputElement:a}),r=e.onTouchStart,s=e.onTouchMove;return window.addEventListener("touchstart",r),window.addEventListener("touchmove",s),function(){window.removeEventListener("touchstart",r),window.removeEventListener("touchmove",s)}}},[t,n,o,a])}({getEnvironmentProps:te,panelElement:H.current,formElement:q.current,inputElement:V.current}),function(e){var t=e.container;r.useEffect(function(){if(t){var e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),n=e[0],r=e[e.length-1];return t.addEventListener("keydown",o),function(){t.removeEventListener("keydown",o)}}function o(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===n&&(e.preventDefault(),r.focus()):document.activeElement===r&&(e.preventDefault(),n.focus()))}},[t])}({container:$.current}),r.useEffect(function(){return document.body.classList.add("DocSearch--active"),function(){var e,t;document.body.classList.remove("DocSearch--active"),null===(e=(t=window).scrollTo)||void 0===e||e.call(t,0,C)}},[]),r.useLayoutEffect(function(){var e=window.innerWidth-document.body.clientWidth;return document.body.style.marginRight="".concat(e,"px"),function(){document.body.style.marginRight="0px"}},[]),r.useEffect(function(){window.matchMedia("(max-width: 768px)").matches&&(W.current=5)},[]),r.useEffect(function(){H.current&&(H.current.scrollTop=0)},[z.query]),r.useEffect(function(){K.length>0&&(re(),V.current&&V.current.focus())},[K,re]),r.useEffect(function(){function e(){if(U.current){var e=.01*window.innerHeight;U.current.style.setProperty("--docsearch-vh","".concat(e,"px"))}}return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),r.createElement("div",d({ref:$},ne({"aria-expanded":!0}),{className:["DocSearch","DocSearch-Container","stalled"===z.status&&"DocSearch-Container--Stalled","error"===z.status&&"DocSearch-Container--Errored"].filter(Boolean).join(" "),role:"button",tabIndex:0,onMouseDown:function(e){e.target===e.currentTarget&&u()}}),r.createElement("div",{className:"DocSearch-Modal",ref:U},r.createElement("header",{className:"DocSearch-SearchBar",ref:q},r.createElement(kn,d({},ee,{state:z,autoFocus:0===K.length,inputRef:V,isFromSelection:Boolean(K)&&K===G,translations:L,onClose:u}))),r.createElement("div",{className:"DocSearch-Dropdown",ref:H},r.createElement(vn,d({},ee,{indexName:o,state:z,hitComponent:m,resultsFooterComponent:v,disableUserPersonalization:E,recentSearches:Z,favoriteSearches:Y,inputRef:V,translations:R,getMissingResultsUrl:P,onItemClick:function(e,t){J(e),X(e),un(t)||u()}}))),r.createElement("footer",{className:"DocSearch-Footer"},r.createElement(Bt,{translations:N}))))}function Zn(e){var t=e.isOpen,n=e.onOpen,o=e.onClose,a=e.onInput,s=e.searchButtonRef;r.useEffect(function(){function e(e){var r;if("Escape"===e.code&&t||"k"===(null===(r=e.key)||void 0===r?void 0:r.toLowerCase())&&(e.metaKey||e.ctrlKey)||!function(e){var t=e.target,n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&"/"===e.key&&!t)return e.preventDefault(),void(t?o():document.body.classList.contains("DocSearch--active")||n());s&&s.current===document.activeElement&&a&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&a(e)}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[t,n,o,a,s])}},33412:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});n(36672);var r=n(97398),o=n(23420);function a(e){return(0,o.jsx)(r.mg,{...e})}},33555:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(36672);var r=n(13526),o=n(53499),a=n(67797),s=n(75150),i=n(92573);const c={anchorWithStickyNavbar:"anchorWithStickyNavbar_debX",anchorWithHideOnScrollNavbar:"anchorWithHideOnScrollNavbar_MBh0"};var l=n(23420);function u({as:e,id:t,...n}){const u=(0,i.A)(),{navbar:{hideOnScroll:d}}=(0,a.p)();if("h1"===e||!t)return(0,l.jsx)(e,{...n,id:void 0});u.collectAnchor(t);const p=(0,o.T)({id:"theme.common.headingLinkTitle",message:"Direct link to {heading}",description:"Title for link to heading"},{heading:"string"==typeof n.children?n.children:t});return(0,l.jsxs)(e,{...n,className:(0,r.A)("anchor",d?c.anchorWithHideOnScrollNavbar:c.anchorWithStickyNavbar,n.className),id:t,children:[n.children,(0,l.jsx)(s.A,{className:"hash-link",to:`#${t}`,"aria-label":p,title:p,children:"\u200b"})]})}},34072:e=>{var t="undefined"!=typeof Element,n="function"==typeof Map,r="function"==typeof Set,o="function"==typeof ArrayBuffer&&!!ArrayBuffer.isView;function a(e,s){if(e===s)return!0;if(e&&s&&"object"==typeof e&&"object"==typeof s){if(e.constructor!==s.constructor)return!1;var i,c,l,u;if(Array.isArray(e)){if((i=e.length)!=s.length)return!1;for(c=i;0!==c--;)if(!a(e[c],s[c]))return!1;return!0}if(n&&e instanceof Map&&s instanceof Map){if(e.size!==s.size)return!1;for(u=e.entries();!(c=u.next()).done;)if(!s.has(c.value[0]))return!1;for(u=e.entries();!(c=u.next()).done;)if(!a(c.value[1],s.get(c.value[0])))return!1;return!0}if(r&&e instanceof Set&&s instanceof Set){if(e.size!==s.size)return!1;for(u=e.entries();!(c=u.next()).done;)if(!s.has(c.value[0]))return!1;return!0}if(o&&ArrayBuffer.isView(e)&&ArrayBuffer.isView(s)){if((i=e.length)!=s.length)return!1;for(c=i;0!==c--;)if(e[c]!==s[c])return!1;return!0}if(e.constructor===RegExp)return e.source===s.source&&e.flags===s.flags;if(e.valueOf!==Object.prototype.valueOf&&"function"==typeof e.valueOf&&"function"==typeof s.valueOf)return e.valueOf()===s.valueOf();if(e.toString!==Object.prototype.toString&&"function"==typeof e.toString&&"function"==typeof s.toString)return e.toString()===s.toString();if((i=(l=Object.keys(e)).length)!==Object.keys(s).length)return!1;for(c=i;0!==c--;)if(!Object.prototype.hasOwnProperty.call(s,l[c]))return!1;if(t&&e instanceof Element)return!1;for(c=i;0!==c--;)if(("_owner"!==l[c]&&"__v"!==l[c]&&"__o"!==l[c]||!e.$$typeof)&&!a(e[l[c]],s[l[c]]))return!1;return!0}return e!=e&&s!=s}e.exports=function(e,t){try{return a(e,t)}catch(n){if((n.message||"").match(/stack|recursion/i))return console.warn("react-fast-compare cannot handle circular refs"),!1;throw n}}},35959:(e,t,n)=>{"use strict";e.exports=n(95843)},36672:(e,t,n)=>{"use strict";e.exports=n(78385)},36849:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});const r=e=>"object"==typeof e&&!!e&&Object.keys(e).length>0;function o(e){const t={};return function e(n,o){Object.entries(n).forEach(([n,a])=>{const s=o?`${o}.${n}`:n;r(a)?e(a,s):t[s]=a})}(e),t}},39345:(e,t,n)=>{"use strict";var r=n(54123),o=n(36672),a=n(57235);function s(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function i(e){return!(!e||1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType)}function c(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do{!!(4098&(t=e).flags)&&(n=t.return),e=t.return}while(e)}return 3===t.tag?n:null}function l(e){if(13===e.tag){var t=e.memoizedState;if(null===t&&(null!==(e=e.alternate)&&(t=e.memoizedState)),null!==t)return t.dehydrated}return null}function u(e){if(c(e)!==e)throw Error(s(188))}function d(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e;for(e=e.child;null!==e;){if(null!==(t=d(e)))return t;e=e.sibling}return null}var p=Object.assign,f=Symbol.for("react.element"),h=Symbol.for("react.transitional.element"),m=Symbol.for("react.portal"),g=Symbol.for("react.fragment"),b=Symbol.for("react.strict_mode"),y=Symbol.for("react.profiler"),v=Symbol.for("react.provider"),_=Symbol.for("react.consumer"),k=Symbol.for("react.context"),w=Symbol.for("react.forward_ref"),C=Symbol.for("react.suspense"),x=Symbol.for("react.suspense_list"),S=Symbol.for("react.memo"),M=Symbol.for("react.lazy");Symbol.for("react.scope");var E=Symbol.for("react.activity");Symbol.for("react.legacy_hidden"),Symbol.for("react.tracing_marker");var O=Symbol.for("react.memo_cache_sentinel");Symbol.for("react.view_transition");var A=Symbol.iterator;function j(e){return null===e||"object"!=typeof e?null:"function"==typeof(e=A&&e[A]||e["@@iterator"])?e:null}var D=Symbol.for("react.client.reference");function P(e){if(null==e)return null;if("function"==typeof e)return e.$$typeof===D?null:e.displayName||e.name||null;if("string"==typeof e)return e;switch(e){case g:return"Fragment";case y:return"Profiler";case b:return"StrictMode";case C:return"Suspense";case x:return"SuspenseList";case E:return"Activity"}if("object"==typeof e)switch(e.$$typeof){case m:return"Portal";case k:return(e.displayName||"Context")+".Provider";case _:return(e._context.displayName||"Context")+".Consumer";case w:var t=e.render;return(e=e.displayName)||(e=""!==(e=t.displayName||t.name||"")?"ForwardRef("+e+")":"ForwardRef"),e;case S:return null!==(t=e.displayName||null)?t:P(e.type)||"Memo";case M:t=e._payload,e=e._init;try{return P(e(t))}catch(n){}}return null}var T=Array.isArray,I=o.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,N=a.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,L={pending:!1,data:null,method:null,action:null},R=[],F=-1;function z(e){return{current:e}}function B(e){0>F||(e.current=R[F],R[F]=null,F--)}function $(e,t){F++,R[F]=e.current,e.current=t}var U=z(null),q=z(null),H=z(null),V=z(null);function W(e,t){switch($(H,t),$(q,e),$(U,null),t.nodeType){case 9:case 11:e=(e=t.documentElement)&&(e=e.namespaceURI)?od(e):0;break;default:if(e=t.tagName,t=t.namespaceURI)e=ad(t=od(t),e);else switch(e){case"svg":e=1;break;case"math":e=2;break;default:e=0}}B(U),$(U,e)}function G(){B(U),B(q),B(H)}function K(e){null!==e.memoizedState&&$(V,e);var t=U.current,n=ad(t,e.type);t!==n&&($(q,e),$(U,n))}function Q(e){q.current===e&&(B(U),B(q)),V.current===e&&(B(V),Kd._currentValue=L)}var Y=Object.prototype.hasOwnProperty,Z=r.unstable_scheduleCallback,X=r.unstable_cancelCallback,J=r.unstable_shouldYield,ee=r.unstable_requestPaint,te=r.unstable_now,ne=r.unstable_getCurrentPriorityLevel,re=r.unstable_ImmediatePriority,oe=r.unstable_UserBlockingPriority,ae=r.unstable_NormalPriority,se=r.unstable_LowPriority,ie=r.unstable_IdlePriority,ce=r.log,le=r.unstable_setDisableYieldValue,ue=null,de=null;function pe(e){if("function"==typeof ce&&le(e),de&&"function"==typeof de.setStrictMode)try{de.setStrictMode(ue,e)}catch(t){}}var fe=Math.clz32?Math.clz32:function(e){return 0===(e>>>=0)?32:31-(he(e)/me|0)|0},he=Math.log,me=Math.LN2;var ge=256,be=4194304;function ye(e){var t=42&e;if(0!==t)return t;switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:return 64;case 128:return 128;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return 4194048&e;case 4194304:case 8388608:case 16777216:case 33554432:return 62914560&e;case 67108864:return 67108864;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 0;default:return e}}function ve(e,t,n){var r=e.pendingLanes;if(0===r)return 0;var o=0,a=e.suspendedLanes,s=e.pingedLanes;e=e.warmLanes;var i=134217727&r;return 0!==i?0!==(r=i&~a)?o=ye(r):0!==(s&=i)?o=ye(s):n||0!==(n=i&~e)&&(o=ye(n)):0!==(i=r&~a)?o=ye(i):0!==s?o=ye(s):n||0!==(n=r&~e)&&(o=ye(n)),0===o?0:0!==t&&t!==o&&0===(t&a)&&((a=o&-o)>=(n=t&-t)||32===a&&4194048&n)?t:o}function _e(e,t){return 0===(e.pendingLanes&~(e.suspendedLanes&~e.pingedLanes)&t)}function ke(e,t){switch(e){case 1:case 2:case 4:case 8:case 64:return t+250;case 16:case 32:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return t+5e3;default:return-1}}function we(){var e=ge;return!(4194048&(ge<<=1))&&(ge=256),e}function Ce(){var e=be;return!(62914560&(be<<=1))&&(be=4194304),e}function xe(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Se(e,t){e.pendingLanes|=t,268435456!==t&&(e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0)}function Me(e,t,n){e.pendingLanes|=t,e.suspendedLanes&=~t;var r=31-fe(t);e.entangledLanes|=t,e.entanglements[r]=1073741824|e.entanglements[r]|4194090&n}function Ee(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-fe(n),o=1<<r;o&t|e[r]&t&&(e[r]|=t),n&=~o}}function Oe(e){switch(e){case 2:e=1;break;case 8:e=4;break;case 32:e=16;break;case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:case 4194304:case 8388608:case 16777216:case 33554432:e=128;break;case 268435456:e=134217728;break;default:e=0}return e}function Ae(e){return 2<(e&=-e)?8<e?134217727&e?32:268435456:8:2}function je(){var e=N.p;return 0!==e?e:void 0===(e=window.event)?32:lp(e.type)}var De=Math.random().toString(36).slice(2),Pe="__reactFiber$"+De,Te="__reactProps$"+De,Ie="__reactContainer$"+De,Ne="__reactEvents$"+De,Le="__reactListeners$"+De,Re="__reactHandles$"+De,Fe="__reactResources$"+De,ze="__reactMarker$"+De;function Be(e){delete e[Pe],delete e[Te],delete e[Ne],delete e[Le],delete e[Re]}function $e(e){var t=e[Pe];if(t)return t;for(var n=e.parentNode;n;){if(t=n[Ie]||n[Pe]){if(n=t.alternate,null!==t.child||null!==n&&null!==n.child)for(e=vd(e);null!==e;){if(n=e[Pe])return n;e=vd(e)}return t}n=(e=n).parentNode}return null}function Ue(e){if(e=e[Pe]||e[Ie]){var t=e.tag;if(5===t||6===t||13===t||26===t||27===t||3===t)return e}return null}function qe(e){var t=e.tag;if(5===t||26===t||27===t||6===t)return e.stateNode;throw Error(s(33))}function He(e){var t=e[Fe];return t||(t=e[Fe]={hoistableStyles:new Map,hoistableScripts:new Map}),t}function Ve(e){e[ze]=!0}var We=new Set,Ge={};function Ke(e,t){Qe(e,t),Qe(e+"Capture",t)}function Qe(e,t){for(Ge[e]=t,e=0;e<t.length;e++)We.add(t[e])}var Ye,Ze,Xe=RegExp("^[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD][:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD\\-.0-9\\u00B7\\u0300-\\u036F\\u203F-\\u2040]*$"),Je={},et={};function tt(e,t,n){if(o=t,Y.call(et,o)||!Y.call(Je,o)&&(Xe.test(o)?et[o]=!0:(Je[o]=!0,0)))if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":return void e.removeAttribute(t);case"boolean":var r=t.toLowerCase().slice(0,5);if("data-"!==r&&"aria-"!==r)return void e.removeAttribute(t)}e.setAttribute(t,""+n)}var o}function nt(e,t,n){if(null===n)e.removeAttribute(t);else{switch(typeof n){case"undefined":case"function":case"symbol":case"boolean":return void e.removeAttribute(t)}e.setAttribute(t,""+n)}}function rt(e,t,n,r){if(null===r)e.removeAttribute(n);else{switch(typeof r){case"undefined":case"function":case"symbol":case"boolean":return void e.removeAttribute(n)}e.setAttributeNS(t,n,""+r)}}function ot(e){if(void 0===Ye)try{throw Error()}catch(n){var t=n.stack.trim().match(/\n( *(at )?)/);Ye=t&&t[1]||"",Ze=-1<n.stack.indexOf("\n at")?" (<anonymous>)":-1<n.stack.indexOf("@")?"@unknown:0:0":""}return"\n"+Ye+e+Ze}var at=!1;function st(e,t){if(!e||at)return"";at=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{var r={DetermineComponentFrameRoot:function(){try{if(t){var n=function(){throw Error()};if(Object.defineProperty(n.prototype,"props",{set:function(){throw Error()}}),"object"==typeof Reflect&&Reflect.construct){try{Reflect.construct(n,[])}catch(o){var r=o}Reflect.construct(e,[],n)}else{try{n.call()}catch(a){r=a}e.call(n.prototype)}}else{try{throw Error()}catch(s){r=s}(n=e())&&"function"==typeof n.catch&&n.catch(function(){})}}catch(i){if(i&&r&&"string"==typeof i.stack)return[i.stack,r.stack]}return[null,null]}};r.DetermineComponentFrameRoot.displayName="DetermineComponentFrameRoot";var o=Object.getOwnPropertyDescriptor(r.DetermineComponentFrameRoot,"name");o&&o.configurable&&Object.defineProperty(r.DetermineComponentFrameRoot,"name",{value:"DetermineComponentFrameRoot"});var a=r.DetermineComponentFrameRoot(),s=a[0],i=a[1];if(s&&i){var c=s.split("\n"),l=i.split("\n");for(o=r=0;r<c.length&&!c[r].includes("DetermineComponentFrameRoot");)r++;for(;o<l.length&&!l[o].includes("DetermineComponentFrameRoot");)o++;if(r===c.length||o===l.length)for(r=c.length-1,o=l.length-1;1<=r&&0<=o&&c[r]!==l[o];)o--;for(;1<=r&&0<=o;r--,o--)if(c[r]!==l[o]){if(1!==r||1!==o)do{if(r--,0>--o||c[r]!==l[o]){var u="\n"+c[r].replace(" at new "," at ");return e.displayName&&u.includes("<anonymous>")&&(u=u.replace("<anonymous>",e.displayName)),u}}while(1<=r&&0<=o);break}}}finally{at=!1,Error.prepareStackTrace=n}return(n=e?e.displayName||e.name:"")?ot(n):""}function it(e){switch(e.tag){case 26:case 27:case 5:return ot(e.type);case 16:return ot("Lazy");case 13:return ot("Suspense");case 19:return ot("SuspenseList");case 0:case 15:return st(e.type,!1);case 11:return st(e.type.render,!1);case 1:return st(e.type,!0);case 31:return ot("Activity");default:return""}}function ct(e){try{var t="";do{t+=it(e),e=e.return}while(e);return t}catch(n){return"\nError generating stack: "+n.message+"\n"+n.stack}}function lt(e){switch(typeof e){case"bigint":case"boolean":case"number":case"string":case"undefined":case"object":return e;default:return""}}function ut(e){var t=e.type;return(e=e.nodeName)&&"input"===e.toLowerCase()&&("checkbox"===t||"radio"===t)}function dt(e){e._valueTracker||(e._valueTracker=function(e){var t=ut(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&void 0!==n&&"function"==typeof n.get&&"function"==typeof n.set){var o=n.get,a=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(e){r=""+e,a.call(this,e)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(e){r=""+e},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}(e))}function pt(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=ut(e)?e.checked?"true":"false":e.value),(e=r)!==n&&(t.setValue(e),!0)}function ft(e){if(void 0===(e=e||("undefined"!=typeof document?document:void 0)))return null;try{return e.activeElement||e.body}catch(t){return e.body}}var ht=/[\n"\\]/g;function mt(e){return e.replace(ht,function(e){return"\\"+e.charCodeAt(0).toString(16)+" "})}function gt(e,t,n,r,o,a,s,i){e.name="",null!=s&&"function"!=typeof s&&"symbol"!=typeof s&&"boolean"!=typeof s?e.type=s:e.removeAttribute("type"),null!=t?"number"===s?(0===t&&""===e.value||e.value!=t)&&(e.value=""+lt(t)):e.value!==""+lt(t)&&(e.value=""+lt(t)):"submit"!==s&&"reset"!==s||e.removeAttribute("value"),null!=t?yt(e,s,lt(t)):null!=n?yt(e,s,lt(n)):null!=r&&e.removeAttribute("value"),null==o&&null!=a&&(e.defaultChecked=!!a),null!=o&&(e.checked=o&&"function"!=typeof o&&"symbol"!=typeof o),null!=i&&"function"!=typeof i&&"symbol"!=typeof i&&"boolean"!=typeof i?e.name=""+lt(i):e.removeAttribute("name")}function bt(e,t,n,r,o,a,s,i){if(null!=a&&"function"!=typeof a&&"symbol"!=typeof a&&"boolean"!=typeof a&&(e.type=a),null!=t||null!=n){if(("submit"===a||"reset"===a)&&null==t)return;n=null!=n?""+lt(n):"",t=null!=t?""+lt(t):n,i||t===e.value||(e.value=t),e.defaultValue=t}r="function"!=typeof(r=null!=r?r:o)&&"symbol"!=typeof r&&!!r,e.checked=i?e.checked:!!r,e.defaultChecked=!!r,null!=s&&"function"!=typeof s&&"symbol"!=typeof s&&"boolean"!=typeof s&&(e.name=s)}function yt(e,t,n){"number"===t&&ft(e.ownerDocument)===e||e.defaultValue===""+n||(e.defaultValue=""+n)}function vt(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o<n.length;o++)t["$"+n[o]]=!0;for(n=0;n<e.length;n++)o=t.hasOwnProperty("$"+e[n].value),e[n].selected!==o&&(e[n].selected=o),o&&r&&(e[n].defaultSelected=!0)}else{for(n=""+lt(n),t=null,o=0;o<e.length;o++){if(e[o].value===n)return e[o].selected=!0,void(r&&(e[o].defaultSelected=!0));null!==t||e[o].disabled||(t=e[o])}null!==t&&(t.selected=!0)}}function _t(e,t,n){null==t||((t=""+lt(t))!==e.value&&(e.value=t),null!=n)?e.defaultValue=null!=n?""+lt(n):"":e.defaultValue!==t&&(e.defaultValue=t)}function kt(e,t,n,r){if(null==t){if(null!=r){if(null!=n)throw Error(s(92));if(T(r)){if(1<r.length)throw Error(s(93));r=r[0]}n=r}null==n&&(n=""),t=n}n=lt(t),e.defaultValue=n,(r=e.textContent)===n&&""!==r&&null!==r&&(e.value=r)}function wt(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&3===n.nodeType)return void(n.nodeValue=t)}e.textContent=t}var Ct=new Set("animationIterationCount aspectRatio borderImageOutset borderImageSlice borderImageWidth boxFlex boxFlexGroup boxOrdinalGroup columnCount columns flex flexGrow flexPositive flexShrink flexNegative flexOrder gridArea gridRow gridRowEnd gridRowSpan gridRowStart gridColumn gridColumnEnd gridColumnSpan gridColumnStart fontWeight lineClamp lineHeight opacity order orphans scale tabSize widows zIndex zoom fillOpacity floodOpacity stopOpacity strokeDasharray strokeDashoffset strokeMiterlimit strokeOpacity strokeWidth MozAnimationIterationCount MozBoxFlex MozBoxFlexGroup MozLineClamp msAnimationIterationCount msFlex msZoom msFlexGrow msFlexNegative msFlexOrder msFlexPositive msFlexShrink msGridColumn msGridColumnSpan msGridRow msGridRowSpan WebkitAnimationIterationCount WebkitBoxFlex WebKitBoxFlexGroup WebkitBoxOrdinalGroup WebkitColumnCount WebkitColumns WebkitFlex WebkitFlexGrow WebkitFlexPositive WebkitFlexShrink WebkitLineClamp".split(" "));function xt(e,t,n){var r=0===t.indexOf("--");null==n||"boolean"==typeof n||""===n?r?e.setProperty(t,""):"float"===t?e.cssFloat="":e[t]="":r?e.setProperty(t,n):"number"!=typeof n||0===n||Ct.has(t)?"float"===t?e.cssFloat=n:e[t]=(""+n).trim():e[t]=n+"px"}function St(e,t,n){if(null!=t&&"object"!=typeof t)throw Error(s(62));if(e=e.style,null!=n){for(var r in n)!n.hasOwnProperty(r)||null!=t&&t.hasOwnProperty(r)||(0===r.indexOf("--")?e.setProperty(r,""):"float"===r?e.cssFloat="":e[r]="");for(var o in t)r=t[o],t.hasOwnProperty(o)&&n[o]!==r&&xt(e,o,r)}else for(var a in t)t.hasOwnProperty(a)&&xt(e,a,t[a])}function Mt(e){if(-1===e.indexOf("-"))return!1;switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Et=new Map([["acceptCharset","accept-charset"],["htmlFor","for"],["httpEquiv","http-equiv"],["crossOrigin","crossorigin"],["accentHeight","accent-height"],["alignmentBaseline","alignment-baseline"],["arabicForm","arabic-form"],["baselineShift","baseline-shift"],["capHeight","cap-height"],["clipPath","clip-path"],["clipRule","clip-rule"],["colorInterpolation","color-interpolation"],["colorInterpolationFilters","color-interpolation-filters"],["colorProfile","color-profile"],["colorRendering","color-rendering"],["dominantBaseline","dominant-baseline"],["enableBackground","enable-background"],["fillOpacity","fill-opacity"],["fillRule","fill-rule"],["floodColor","flood-color"],["floodOpacity","flood-opacity"],["fontFamily","font-family"],["fontSize","font-size"],["fontSizeAdjust","font-size-adjust"],["fontStretch","font-stretch"],["fontStyle","font-style"],["fontVariant","font-variant"],["fontWeight","font-weight"],["glyphName","glyph-name"],["glyphOrientationHorizontal","glyph-orientation-horizontal"],["glyphOrientationVertical","glyph-orientation-vertical"],["horizAdvX","horiz-adv-x"],["horizOriginX","horiz-origin-x"],["imageRendering","image-rendering"],["letterSpacing","letter-spacing"],["lightingColor","lighting-color"],["markerEnd","marker-end"],["markerMid","marker-mid"],["markerStart","marker-start"],["overlinePosition","overline-position"],["overlineThickness","overline-thickness"],["paintOrder","paint-order"],["panose-1","panose-1"],["pointerEvents","pointer-events"],["renderingIntent","rendering-intent"],["shapeRendering","shape-rendering"],["stopColor","stop-color"],["stopOpacity","stop-opacity"],["strikethroughPosition","strikethrough-position"],["strikethroughThickness","strikethrough-thickness"],["strokeDasharray","stroke-dasharray"],["strokeDashoffset","stroke-dashoffset"],["strokeLinecap","stroke-linecap"],["strokeLinejoin","stroke-linejoin"],["strokeMiterlimit","stroke-miterlimit"],["strokeOpacity","stroke-opacity"],["strokeWidth","stroke-width"],["textAnchor","text-anchor"],["textDecoration","text-decoration"],["textRendering","text-rendering"],["transformOrigin","transform-origin"],["underlinePosition","underline-position"],["underlineThickness","underline-thickness"],["unicodeBidi","unicode-bidi"],["unicodeRange","unicode-range"],["unitsPerEm","units-per-em"],["vAlphabetic","v-alphabetic"],["vHanging","v-hanging"],["vIdeographic","v-ideographic"],["vMathematical","v-mathematical"],["vectorEffect","vector-effect"],["vertAdvY","vert-adv-y"],["vertOriginX","vert-origin-x"],["vertOriginY","vert-origin-y"],["wordSpacing","word-spacing"],["writingMode","writing-mode"],["xmlnsXlink","xmlns:xlink"],["xHeight","x-height"]]),Ot=/^[\u0000-\u001F ]*j[\r\n\t]*a[\r\n\t]*v[\r\n\t]*a[\r\n\t]*s[\r\n\t]*c[\r\n\t]*r[\r\n\t]*i[\r\n\t]*p[\r\n\t]*t[\r\n\t]*:/i;function At(e){return Ot.test(""+e)?"javascript:throw new Error('React has blocked a javascript: URL as a security precaution.')":e}var jt=null;function Dt(e){return(e=e.target||e.srcElement||window).correspondingUseElement&&(e=e.correspondingUseElement),3===e.nodeType?e.parentNode:e}var Pt=null,Tt=null;function It(e){var t=Ue(e);if(t&&(e=t.stateNode)){var n=e[Te]||null;e:switch(e=t.stateNode,t.type){case"input":if(gt(e,n.value,n.defaultValue,n.defaultValue,n.checked,n.defaultChecked,n.type,n.name),t=n.name,"radio"===n.type&&null!=t){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll('input[name="'+mt(""+t)+'"][type="radio"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var o=r[Te]||null;if(!o)throw Error(s(90));gt(r,o.value,o.defaultValue,o.defaultValue,o.checked,o.defaultChecked,o.type,o.name)}}for(t=0;t<n.length;t++)(r=n[t]).form===e.form&&pt(r)}break e;case"textarea":_t(e,n.value,n.defaultValue);break e;case"select":null!=(t=n.value)&&vt(e,!!n.multiple,t,!1)}}}var Nt=!1;function Lt(e,t,n){if(Nt)return e(t,n);Nt=!0;try{return e(t)}finally{if(Nt=!1,(null!==Pt||null!==Tt)&&($l(),Pt&&(t=Pt,e=Tt,Tt=Pt=null,It(t),e)))for(t=0;t<e.length;t++)It(e[t])}}function Rt(e,t){var n=e.stateNode;if(null===n)return null;var r=n[Te]||null;if(null===r)return null;n=r[t];e:switch(t){case"onClick":case"onClickCapture":case"onDoubleClick":case"onDoubleClickCapture":case"onMouseDown":case"onMouseDownCapture":case"onMouseMove":case"onMouseMoveCapture":case"onMouseUp":case"onMouseUpCapture":case"onMouseEnter":(r=!r.disabled)||(r=!("button"===(e=e.type)||"input"===e||"select"===e||"textarea"===e)),e=!r;break e;default:e=!1}if(e)return null;if(n&&"function"!=typeof n)throw Error(s(231,t,typeof n));return n}var Ft=!("undefined"==typeof window||void 0===window.document||void 0===window.document.createElement),zt=!1;if(Ft)try{var Bt={};Object.defineProperty(Bt,"passive",{get:function(){zt=!0}}),window.addEventListener("test",Bt,Bt),window.removeEventListener("test",Bt,Bt)}catch(Tp){zt=!1}var $t=null,Ut=null,qt=null;function Ht(){if(qt)return qt;var e,t,n=Ut,r=n.length,o="value"in $t?$t.value:$t.textContent,a=o.length;for(e=0;e<r&&n[e]===o[e];e++);var s=r-e;for(t=1;t<=s&&n[r-t]===o[a-t];t++);return qt=o.slice(e,1<t?1-t:void 0)}function Vt(e){var t=e.keyCode;return"charCode"in e?0===(e=e.charCode)&&13===t&&(e=13):e=t,10===e&&(e=13),32<=e||13===e?e:0}function Wt(){return!0}function Gt(){return!1}function Kt(e){function t(t,n,r,o,a){for(var s in this._reactName=t,this._targetInst=r,this.type=n,this.nativeEvent=o,this.target=a,this.currentTarget=null,e)e.hasOwnProperty(s)&&(t=e[s],this[s]=t?t(o):o[s]);return this.isDefaultPrevented=(null!=o.defaultPrevented?o.defaultPrevented:!1===o.returnValue)?Wt:Gt,this.isPropagationStopped=Gt,this}return p(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var e=this.nativeEvent;e&&(e.preventDefault?e.preventDefault():"unknown"!=typeof e.returnValue&&(e.returnValue=!1),this.isDefaultPrevented=Wt)},stopPropagation:function(){var e=this.nativeEvent;e&&(e.stopPropagation?e.stopPropagation():"unknown"!=typeof e.cancelBubble&&(e.cancelBubble=!0),this.isPropagationStopped=Wt)},persist:function(){},isPersistent:Wt}),t}var Qt,Yt,Zt,Xt={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},Jt=Kt(Xt),en=p({},Xt,{view:0,detail:0}),tn=Kt(en),nn=p({},en,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:hn,button:0,buttons:0,relatedTarget:function(e){return void 0===e.relatedTarget?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return"movementX"in e?e.movementX:(e!==Zt&&(Zt&&"mousemove"===e.type?(Qt=e.screenX-Zt.screenX,Yt=e.screenY-Zt.screenY):Yt=Qt=0,Zt=e),Qt)},movementY:function(e){return"movementY"in e?e.movementY:Yt}}),rn=Kt(nn),on=Kt(p({},nn,{dataTransfer:0})),an=Kt(p({},en,{relatedTarget:0})),sn=Kt(p({},Xt,{animationName:0,elapsedTime:0,pseudoElement:0})),cn=Kt(p({},Xt,{clipboardData:function(e){return"clipboardData"in e?e.clipboardData:window.clipboardData}})),ln=Kt(p({},Xt,{data:0})),un={Esc:"Escape",Spacebar:" ",Left:"ArrowLeft",Up:"ArrowUp",Right:"ArrowRight",Down:"ArrowDown",Del:"Delete",Win:"OS",Menu:"ContextMenu",Apps:"ContextMenu",Scroll:"ScrollLock",MozPrintableKey:"Unidentified"},dn={8:"Backspace",9:"Tab",12:"Clear",13:"Enter",16:"Shift",17:"Control",18:"Alt",19:"Pause",20:"CapsLock",27:"Escape",32:" ",33:"PageUp",34:"PageDown",35:"End",36:"Home",37:"ArrowLeft",38:"ArrowUp",39:"ArrowRight",40:"ArrowDown",45:"Insert",46:"Delete",112:"F1",113:"F2",114:"F3",115:"F4",116:"F5",117:"F6",118:"F7",119:"F8",120:"F9",121:"F10",122:"F11",123:"F12",144:"NumLock",145:"ScrollLock",224:"Meta"},pn={Alt:"altKey",Control:"ctrlKey",Meta:"metaKey",Shift:"shiftKey"};function fn(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):!!(e=pn[e])&&!!t[e]}function hn(){return fn}var mn=Kt(p({},en,{key:function(e){if(e.key){var t=un[e.key]||e.key;if("Unidentified"!==t)return t}return"keypress"===e.type?13===(e=Vt(e))?"Enter":String.fromCharCode(e):"keydown"===e.type||"keyup"===e.type?dn[e.keyCode]||"Unidentified":""},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:hn,charCode:function(e){return"keypress"===e.type?Vt(e):0},keyCode:function(e){return"keydown"===e.type||"keyup"===e.type?e.keyCode:0},which:function(e){return"keypress"===e.type?Vt(e):"keydown"===e.type||"keyup"===e.type?e.keyCode:0}})),gn=Kt(p({},nn,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0})),bn=Kt(p({},en,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:hn})),yn=Kt(p({},Xt,{propertyName:0,elapsedTime:0,pseudoElement:0})),vn=Kt(p({},nn,{deltaX:function(e){return"deltaX"in e?e.deltaX:"wheelDeltaX"in e?-e.wheelDeltaX:0},deltaY:function(e){return"deltaY"in e?e.deltaY:"wheelDeltaY"in e?-e.wheelDeltaY:"wheelDelta"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0})),_n=Kt(p({},Xt,{newState:0,oldState:0})),kn=[9,13,27,32],wn=Ft&&"CompositionEvent"in window,Cn=null;Ft&&"documentMode"in document&&(Cn=document.documentMode);var xn=Ft&&"TextEvent"in window&&!Cn,Sn=Ft&&(!wn||Cn&&8<Cn&&11>=Cn),Mn=String.fromCharCode(32),En=!1;function On(e,t){switch(e){case"keyup":return-1!==kn.indexOf(t.keyCode);case"keydown":return 229!==t.keyCode;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function An(e){return"object"==typeof(e=e.detail)&&"data"in e?e.data:null}var jn=!1;var Dn={color:!0,date:!0,datetime:!0,"datetime-local":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Pn(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return"input"===t?!!Dn[e.type]:"textarea"===t}function Tn(e,t,n,r){Pt?Tt?Tt.push(r):Tt=[r]:Pt=r,0<(t=Hu(t,"onChange")).length&&(n=new Jt("onChange","change",null,n,r),e.push({event:n,listeners:t}))}var In=null,Nn=null;function Ln(e){Lu(e,0)}function Rn(e){if(pt(qe(e)))return e}function Fn(e,t){if("change"===e)return t}var zn=!1;if(Ft){var Bn;if(Ft){var $n="oninput"in document;if(!$n){var Un=document.createElement("div");Un.setAttribute("oninput","return;"),$n="function"==typeof Un.oninput}Bn=$n}else Bn=!1;zn=Bn&&(!document.documentMode||9<document.documentMode)}function qn(){In&&(In.detachEvent("onpropertychange",Hn),Nn=In=null)}function Hn(e){if("value"===e.propertyName&&Rn(Nn)){var t=[];Tn(t,Nn,e,Dt(e)),Lt(Ln,t)}}function Vn(e,t,n){"focusin"===e?(qn(),Nn=n,(In=t).attachEvent("onpropertychange",Hn)):"focusout"===e&&qn()}function Wn(e){if("selectionchange"===e||"keyup"===e||"keydown"===e)return Rn(Nn)}function Gn(e,t){if("click"===e)return Rn(t)}function Kn(e,t){if("input"===e||"change"===e)return Rn(t)}var Qn="function"==typeof Object.is?Object.is:function(e,t){return e===t&&(0!==e||1/e==1/t)||e!=e&&t!=t};function Yn(e,t){if(Qn(e,t))return!0;if("object"!=typeof e||null===e||"object"!=typeof t||null===t)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var o=n[r];if(!Y.call(t,o)||!Qn(e[o],t[o]))return!1}return!0}function Zn(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Xn(e,t){var n,r=Zn(e);for(e=0;r;){if(3===r.nodeType){if(n=e+r.textContent.length,e<=t&&n>=t)return{node:r,offset:t-e};e=n}e:{for(;r;){if(r.nextSibling){r=r.nextSibling;break e}r=r.parentNode}r=void 0}r=Zn(r)}}function Jn(e,t){return!(!e||!t)&&(e===t||(!e||3!==e.nodeType)&&(t&&3===t.nodeType?Jn(e,t.parentNode):"contains"in e?e.contains(t):!!e.compareDocumentPosition&&!!(16&e.compareDocumentPosition(t))))}function er(e){for(var t=ft((e=null!=e&&null!=e.ownerDocument&&null!=e.ownerDocument.defaultView?e.ownerDocument.defaultView:window).document);t instanceof e.HTMLIFrameElement;){try{var n="string"==typeof t.contentWindow.location.href}catch(r){n=!1}if(!n)break;t=ft((e=t.contentWindow).document)}return t}function tr(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&("input"===t&&("text"===e.type||"search"===e.type||"tel"===e.type||"url"===e.type||"password"===e.type)||"textarea"===t||"true"===e.contentEditable)}var nr=Ft&&"documentMode"in document&&11>=document.documentMode,rr=null,or=null,ar=null,sr=!1;function ir(e,t,n){var r=n.window===n?n.document:9===n.nodeType?n:n.ownerDocument;sr||null==rr||rr!==ft(r)||("selectionStart"in(r=rr)&&tr(r)?r={start:r.selectionStart,end:r.selectionEnd}:r={anchorNode:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection()).anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset},ar&&Yn(ar,r)||(ar=r,0<(r=Hu(or,"onSelect")).length&&(t=new Jt("onSelect","select",null,t,n),e.push({event:t,listeners:r}),t.target=rr)))}function cr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n["Webkit"+e]="webkit"+t,n["Moz"+e]="moz"+t,n}var lr={animationend:cr("Animation","AnimationEnd"),animationiteration:cr("Animation","AnimationIteration"),animationstart:cr("Animation","AnimationStart"),transitionrun:cr("Transition","TransitionRun"),transitionstart:cr("Transition","TransitionStart"),transitioncancel:cr("Transition","TransitionCancel"),transitionend:cr("Transition","TransitionEnd")},ur={},dr={};function pr(e){if(ur[e])return ur[e];if(!lr[e])return e;var t,n=lr[e];for(t in n)if(n.hasOwnProperty(t)&&t in dr)return ur[e]=n[t];return e}Ft&&(dr=document.createElement("div").style,"AnimationEvent"in window||(delete lr.animationend.animation,delete lr.animationiteration.animation,delete lr.animationstart.animation),"TransitionEvent"in window||delete lr.transitionend.transition);var fr=pr("animationend"),hr=pr("animationiteration"),mr=pr("animationstart"),gr=pr("transitionrun"),br=pr("transitionstart"),yr=pr("transitioncancel"),vr=pr("transitionend"),_r=new Map,kr="abort auxClick beforeToggle cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel".split(" ");function wr(e,t){_r.set(e,t),Ke(t,[e])}kr.push("scrollEnd");var Cr=new WeakMap;function xr(e,t){if("object"==typeof e&&null!==e){var n=Cr.get(e);return void 0!==n?n:(t={value:e,source:t,stack:ct(t)},Cr.set(e,t),t)}return{value:e,source:t,stack:ct(t)}}var Sr=[],Mr=0,Er=0;function Or(){for(var e=Mr,t=Er=Mr=0;t<e;){var n=Sr[t];Sr[t++]=null;var r=Sr[t];Sr[t++]=null;var o=Sr[t];Sr[t++]=null;var a=Sr[t];if(Sr[t++]=null,null!==r&&null!==o){var s=r.pending;null===s?o.next=o:(o.next=s.next,s.next=o),r.pending=o}0!==a&&Pr(n,o,a)}}function Ar(e,t,n,r){Sr[Mr++]=e,Sr[Mr++]=t,Sr[Mr++]=n,Sr[Mr++]=r,Er|=r,e.lanes|=r,null!==(e=e.alternate)&&(e.lanes|=r)}function jr(e,t,n,r){return Ar(e,t,n,r),Tr(e)}function Dr(e,t){return Ar(e,null,null,t),Tr(e)}function Pr(e,t,n){e.lanes|=n;var r=e.alternate;null!==r&&(r.lanes|=n);for(var o=!1,a=e.return;null!==a;)a.childLanes|=n,null!==(r=a.alternate)&&(r.childLanes|=n),22===a.tag&&(null===(e=a.stateNode)||1&e._visibility||(o=!0)),e=a,a=a.return;return 3===e.tag?(a=e.stateNode,o&&null!==t&&(o=31-fe(n),null===(r=(e=a.hiddenUpdates)[o])?e[o]=[t]:r.push(t),t.lane=536870912|n),a):null}function Tr(e){if(50<Pl)throw Pl=0,Tl=null,Error(s(185));for(var t=e.return;null!==t;)t=(e=t).return;return 3===e.tag?e.stateNode:null}var Ir={};function Nr(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.refCleanup=this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Lr(e,t,n,r){return new Nr(e,t,n,r)}function Rr(e){return!(!(e=e.prototype)||!e.isReactComponent)}function Fr(e,t){var n=e.alternate;return null===n?((n=Lr(e.tag,t,e.key,e.mode)).elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=65011712&e.flags,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n.refCleanup=e.refCleanup,n}function zr(e,t){e.flags&=65011714;var n=e.alternate;return null===n?(e.childLanes=0,e.lanes=t,e.child=null,e.subtreeFlags=0,e.memoizedProps=null,e.memoizedState=null,e.updateQueue=null,e.dependencies=null,e.stateNode=null):(e.childLanes=n.childLanes,e.lanes=n.lanes,e.child=n.child,e.subtreeFlags=0,e.deletions=null,e.memoizedProps=n.memoizedProps,e.memoizedState=n.memoizedState,e.updateQueue=n.updateQueue,e.type=n.type,t=n.dependencies,e.dependencies=null===t?null:{lanes:t.lanes,firstContext:t.firstContext}),e}function Br(e,t,n,r,o,a){var i=0;if(r=e,"function"==typeof e)Rr(e)&&(i=1);else if("string"==typeof e)i=function(e,t,n){if(1===n||null!=t.itemProp)return!1;switch(e){case"meta":case"title":return!0;case"style":if("string"!=typeof t.precedence||"string"!=typeof t.href||""===t.href)break;return!0;case"link":if("string"!=typeof t.rel||"string"!=typeof t.href||""===t.href||t.onLoad||t.onError)break;return"stylesheet"!==t.rel||(e=t.disabled,"string"==typeof t.precedence&&null==e);case"script":if(t.async&&"function"!=typeof t.async&&"symbol"!=typeof t.async&&!t.onLoad&&!t.onError&&t.src&&"string"==typeof t.src)return!0}return!1}(e,n,U.current)?26:"html"===e||"head"===e||"body"===e?27:5;else e:switch(e){case E:return(e=Lr(31,n,t,o)).elementType=E,e.lanes=a,e;case g:return $r(n.children,o,a,t);case b:i=8,o|=24;break;case y:return(e=Lr(12,n,t,2|o)).elementType=y,e.lanes=a,e;case C:return(e=Lr(13,n,t,o)).elementType=C,e.lanes=a,e;case x:return(e=Lr(19,n,t,o)).elementType=x,e.lanes=a,e;default:if("object"==typeof e&&null!==e)switch(e.$$typeof){case v:case k:i=10;break e;case _:i=9;break e;case w:i=11;break e;case S:i=14;break e;case M:i=16,r=null;break e}i=29,n=Error(s(130,null===e?"null":typeof e,"")),r=null}return(t=Lr(i,n,t,o)).elementType=e,t.type=r,t.lanes=a,t}function $r(e,t,n,r){return(e=Lr(7,e,r,t)).lanes=n,e}function Ur(e,t,n){return(e=Lr(6,e,null,t)).lanes=n,e}function qr(e,t,n){return(t=Lr(4,null!==e.children?e.children:[],e.key,t)).lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}var Hr=[],Vr=0,Wr=null,Gr=0,Kr=[],Qr=0,Yr=null,Zr=1,Xr="";function Jr(e,t){Hr[Vr++]=Gr,Hr[Vr++]=Wr,Wr=e,Gr=t}function eo(e,t,n){Kr[Qr++]=Zr,Kr[Qr++]=Xr,Kr[Qr++]=Yr,Yr=e;var r=Zr;e=Xr;var o=32-fe(r)-1;r&=~(1<<o),n+=1;var a=32-fe(t)+o;if(30<a){var s=o-o%5;a=(r&(1<<s)-1).toString(32),r>>=s,o-=s,Zr=1<<32-fe(t)+o|n<<o|r,Xr=a+e}else Zr=1<<a|n<<o|r,Xr=e}function to(e){null!==e.return&&(Jr(e,1),eo(e,1,0))}function no(e){for(;e===Wr;)Wr=Hr[--Vr],Hr[Vr]=null,Gr=Hr[--Vr],Hr[Vr]=null;for(;e===Yr;)Yr=Kr[--Qr],Kr[Qr]=null,Xr=Kr[--Qr],Kr[Qr]=null,Zr=Kr[--Qr],Kr[Qr]=null}var ro=null,oo=null,ao=!1,so=null,io=!1,co=Error(s(519));function lo(e){throw go(xr(Error(s(418,"")),e)),co}function uo(e){var t=e.stateNode,n=e.type,r=e.memoizedProps;switch(t[Pe]=e,t[Te]=r,n){case"dialog":Ru("cancel",t),Ru("close",t);break;case"iframe":case"object":case"embed":Ru("load",t);break;case"video":case"audio":for(n=0;n<Iu.length;n++)Ru(Iu[n],t);break;case"source":Ru("error",t);break;case"img":case"image":case"link":Ru("error",t),Ru("load",t);break;case"details":Ru("toggle",t);break;case"input":Ru("invalid",t),bt(t,r.value,r.defaultValue,r.checked,r.defaultChecked,r.type,r.name,!0),dt(t);break;case"select":Ru("invalid",t);break;case"textarea":Ru("invalid",t),kt(t,r.value,r.defaultValue,r.children),dt(t)}"string"!=typeof(n=r.children)&&"number"!=typeof n&&"bigint"!=typeof n||t.textContent===""+n||!0===r.suppressHydrationWarning||Yu(t.textContent,n)?(null!=r.popover&&(Ru("beforetoggle",t),Ru("toggle",t)),null!=r.onScroll&&Ru("scroll",t),null!=r.onScrollEnd&&Ru("scrollend",t),null!=r.onClick&&(t.onclick=Zu),t=!0):t=!1,t||lo(e)}function po(e){for(ro=e.return;ro;)switch(ro.tag){case 5:case 13:return void(io=!1);case 27:case 3:return void(io=!0);default:ro=ro.return}}function fo(e){if(e!==ro)return!1;if(!ao)return po(e),ao=!0,!1;var t,n=e.tag;if((t=3!==n&&27!==n)&&((t=5===n)&&(t=!("form"!==(t=e.type)&&"button"!==t)||sd(e.type,e.memoizedProps)),t=!t),t&&oo&&lo(e),po(e),13===n){if(!(e=null!==(e=e.memoizedState)?e.dehydrated:null))throw Error(s(317));e:{for(e=e.nextSibling,n=0;e;){if(8===e.nodeType)if("/$"===(t=e.data)){if(0===n){oo=bd(e.nextSibling);break e}n--}else"$"!==t&&"$!"!==t&&"$?"!==t||n++;e=e.nextSibling}oo=null}}else 27===n?(n=oo,fd(e.type)?(e=yd,yd=null,oo=e):oo=n):oo=ro?bd(e.stateNode.nextSibling):null;return!0}function ho(){oo=ro=null,ao=!1}function mo(){var e=so;return null!==e&&(null===vl?vl=e:vl.push.apply(vl,e),so=null),e}function go(e){null===so?so=[e]:so.push(e)}var bo=z(null),yo=null,vo=null;function _o(e,t,n){$(bo,t._currentValue),t._currentValue=n}function ko(e){e._currentValue=bo.current,B(bo)}function wo(e,t,n){for(;null!==e;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,null!==r&&(r.childLanes|=t)):null!==r&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Co(e,t,n,r){var o=e.child;for(null!==o&&(o.return=e);null!==o;){var a=o.dependencies;if(null!==a){var i=o.child;a=a.firstContext;e:for(;null!==a;){var c=a;a=o;for(var l=0;l<t.length;l++)if(c.context===t[l]){a.lanes|=n,null!==(c=a.alternate)&&(c.lanes|=n),wo(a.return,n,e),r||(i=null);break e}a=c.next}}else if(18===o.tag){if(null===(i=o.return))throw Error(s(341));i.lanes|=n,null!==(a=i.alternate)&&(a.lanes|=n),wo(i,n,e),i=null}else i=o.child;if(null!==i)i.return=o;else for(i=o;null!==i;){if(i===e){i=null;break}if(null!==(o=i.sibling)){o.return=i.return,i=o;break}i=i.return}o=i}}function xo(e,t,n,r){e=null;for(var o=t,a=!1;null!==o;){if(!a)if(524288&o.flags)a=!0;else if(262144&o.flags)break;if(10===o.tag){var i=o.alternate;if(null===i)throw Error(s(387));if(null!==(i=i.memoizedProps)){var c=o.type;Qn(o.pendingProps.value,i.value)||(null!==e?e.push(c):e=[c])}}else if(o===V.current){if(null===(i=o.alternate))throw Error(s(387));i.memoizedState.memoizedState!==o.memoizedState.memoizedState&&(null!==e?e.push(Kd):e=[Kd])}o=o.return}null!==e&&Co(t,e,n,r),t.flags|=262144}function So(e){for(e=e.firstContext;null!==e;){if(!Qn(e.context._currentValue,e.memoizedValue))return!0;e=e.next}return!1}function Mo(e){yo=e,vo=null,null!==(e=e.dependencies)&&(e.firstContext=null)}function Eo(e){return Ao(yo,e)}function Oo(e,t){return null===yo&&Mo(e),Ao(e,t)}function Ao(e,t){var n=t._currentValue;if(t={context:t,memoizedValue:n,next:null},null===vo){if(null===e)throw Error(s(308));vo=t,e.dependencies={lanes:0,firstContext:t},e.flags|=524288}else vo=vo.next=t;return n}var jo="undefined"!=typeof AbortController?AbortController:function(){var e=[],t=this.signal={aborted:!1,addEventListener:function(t,n){e.push(n)}};this.abort=function(){t.aborted=!0,e.forEach(function(e){return e()})}},Do=r.unstable_scheduleCallback,Po=r.unstable_NormalPriority,To={$$typeof:k,Consumer:null,Provider:null,_currentValue:null,_currentValue2:null,_threadCount:0};function Io(){return{controller:new jo,data:new Map,refCount:0}}function No(e){e.refCount--,0===e.refCount&&Do(Po,function(){e.controller.abort()})}var Lo=null,Ro=0,Fo=0,zo=null;function Bo(){if(0===--Ro&&null!==Lo){null!==zo&&(zo.status="fulfilled");var e=Lo;Lo=null,Fo=0,zo=null;for(var t=0;t<e.length;t++)(0,e[t])()}}var $o=I.S;I.S=function(e,t){"object"==typeof t&&null!==t&&"function"==typeof t.then&&function(e,t){if(null===Lo){var n=Lo=[];Ro=0,Fo=Au(),zo={status:"pending",value:void 0,then:function(e){n.push(e)}}}Ro++,t.then(Bo,Bo)}(0,t),null!==$o&&$o(e,t)};var Uo=z(null);function qo(){var e=Uo.current;return null!==e?e:rl.pooledCache}function Ho(e,t){$(Uo,null===t?Uo.current:t.pool)}function Vo(){var e=qo();return null===e?null:{parent:To._currentValue,pool:e}}var Wo=Error(s(460)),Go=Error(s(474)),Ko=Error(s(542)),Qo={then:function(){}};function Yo(e){return"fulfilled"===(e=e.status)||"rejected"===e}function Zo(){}function Xo(e,t,n){switch(void 0===(n=e[n])?e.push(t):n!==t&&(t.then(Zo,Zo),t=n),t.status){case"fulfilled":return t.value;case"rejected":throw ta(e=t.reason),e;default:if("string"==typeof t.status)t.then(Zo,Zo);else{if(null!==(e=rl)&&100<e.shellSuspendCounter)throw Error(s(482));(e=t).status="pending",e.then(function(e){if("pending"===t.status){var n=t;n.status="fulfilled",n.value=e}},function(e){if("pending"===t.status){var n=t;n.status="rejected",n.reason=e}})}switch(t.status){case"fulfilled":return t.value;case"rejected":throw ta(e=t.reason),e}throw Jo=t,Wo}}var Jo=null;function ea(){if(null===Jo)throw Error(s(459));var e=Jo;return Jo=null,e}function ta(e){if(e===Wo||e===Ko)throw Error(s(483))}var na=!1;function ra(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,lanes:0,hiddenCallbacks:null},callbacks:null}}function oa(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,callbacks:null})}function aa(e){return{lane:e,tag:0,payload:null,callback:null,next:null}}function sa(e,t,n){var r=e.updateQueue;if(null===r)return null;if(r=r.shared,2&nl){var o=r.pending;return null===o?t.next=t:(t.next=o.next,o.next=t),r.pending=t,t=Tr(e),Pr(e,null,n),t}return Ar(e,r,t,n),Tr(e)}function ia(e,t,n){if(null!==(t=t.updateQueue)&&(t=t.shared,4194048&n)){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,Ee(e,n)}}function ca(e,t){var n=e.updateQueue,r=e.alternate;if(null!==r&&n===(r=r.updateQueue)){var o=null,a=null;if(null!==(n=n.firstBaseUpdate)){do{var s={lane:n.lane,tag:n.tag,payload:n.payload,callback:null,next:null};null===a?o=a=s:a=a.next=s,n=n.next}while(null!==n);null===a?o=a=t:a=a.next=t}else o=a=t;return n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:a,shared:r.shared,callbacks:r.callbacks},void(e.updateQueue=n)}null===(e=n.lastBaseUpdate)?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}var la=!1;function ua(){if(la){if(null!==zo)throw zo}}function da(e,t,n,r){la=!1;var o=e.updateQueue;na=!1;var a=o.firstBaseUpdate,s=o.lastBaseUpdate,i=o.shared.pending;if(null!==i){o.shared.pending=null;var c=i,l=c.next;c.next=null,null===s?a=l:s.next=l,s=c;var u=e.alternate;null!==u&&((i=(u=u.updateQueue).lastBaseUpdate)!==s&&(null===i?u.firstBaseUpdate=l:i.next=l,u.lastBaseUpdate=c))}if(null!==a){var d=o.baseState;for(s=0,u=l=c=null,i=a;;){var f=-536870913&i.lane,h=f!==i.lane;if(h?(al&f)===f:(r&f)===f){0!==f&&f===Fo&&(la=!0),null!==u&&(u=u.next={lane:0,tag:i.tag,payload:i.payload,callback:null,next:null});e:{var m=e,g=i;f=t;var b=n;switch(g.tag){case 1:if("function"==typeof(m=g.payload)){d=m.call(b,d,f);break e}d=m;break e;case 3:m.flags=-65537&m.flags|128;case 0:if(null==(f="function"==typeof(m=g.payload)?m.call(b,d,f):m))break e;d=p({},d,f);break e;case 2:na=!0}}null!==(f=i.callback)&&(e.flags|=64,h&&(e.flags|=8192),null===(h=o.callbacks)?o.callbacks=[f]:h.push(f))}else h={lane:f,tag:i.tag,payload:i.payload,callback:i.callback,next:null},null===u?(l=u=h,c=d):u=u.next=h,s|=f;if(null===(i=i.next)){if(null===(i=o.shared.pending))break;i=(h=i).next,h.next=null,o.lastBaseUpdate=h,o.shared.pending=null}}null===u&&(c=d),o.baseState=c,o.firstBaseUpdate=l,o.lastBaseUpdate=u,null===a&&(o.shared.lanes=0),fl|=s,e.lanes=s,e.memoizedState=d}}function pa(e,t){if("function"!=typeof e)throw Error(s(191,e));e.call(t)}function fa(e,t){var n=e.callbacks;if(null!==n)for(e.callbacks=null,e=0;e<n.length;e++)pa(n[e],t)}var ha=z(null),ma=z(0);function ga(e,t){$(ma,e=dl),$(ha,t),dl=e|t.baseLanes}function ba(){$(ma,dl),$(ha,ha.current)}function ya(){dl=ma.current,B(ha),B(ma)}var va=0,_a=null,ka=null,wa=null,Ca=!1,xa=!1,Sa=!1,Ma=0,Ea=0,Oa=null,Aa=0;function ja(){throw Error(s(321))}function Da(e,t){if(null===t)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!Qn(e[n],t[n]))return!1;return!0}function Pa(e,t,n,r,o,a){return va=a,_a=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,I.H=null===e||null===e.memoizedState?Ws:Gs,Sa=!1,a=n(r,o),Sa=!1,xa&&(a=Ia(t,n,r,o)),Ta(e),a}function Ta(e){I.H=Vs;var t=null!==ka&&null!==ka.next;if(va=0,wa=ka=_a=null,Ca=!1,Ea=0,Oa=null,t)throw Error(s(300));null===e||Ei||null!==(e=e.dependencies)&&So(e)&&(Ei=!0)}function Ia(e,t,n,r){_a=e;var o=0;do{if(xa&&(Oa=null),Ea=0,xa=!1,25<=o)throw Error(s(301));if(o+=1,wa=ka=null,null!=e.updateQueue){var a=e.updateQueue;a.lastEffect=null,a.events=null,a.stores=null,null!=a.memoCache&&(a.memoCache.index=0)}I.H=Ks,a=t(n,r)}while(xa);return a}function Na(){var e=I.H,t=e.useState()[0];return t="function"==typeof t.then?$a(t):t,e=e.useState()[0],(null!==ka?ka.memoizedState:null)!==e&&(_a.flags|=1024),t}function La(){var e=0!==Ma;return Ma=0,e}function Ra(e,t,n){t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~n}function Fa(e){if(Ca){for(e=e.memoizedState;null!==e;){var t=e.queue;null!==t&&(t.pending=null),e=e.next}Ca=!1}va=0,wa=ka=_a=null,xa=!1,Ea=Ma=0,Oa=null}function za(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return null===wa?_a.memoizedState=wa=e:wa=wa.next=e,wa}function Ba(){if(null===ka){var e=_a.alternate;e=null!==e?e.memoizedState:null}else e=ka.next;var t=null===wa?_a.memoizedState:wa.next;if(null!==t)wa=t,ka=e;else{if(null===e){if(null===_a.alternate)throw Error(s(467));throw Error(s(310))}e={memoizedState:(ka=e).memoizedState,baseState:ka.baseState,baseQueue:ka.baseQueue,queue:ka.queue,next:null},null===wa?_a.memoizedState=wa=e:wa=wa.next=e}return wa}function $a(e){var t=Ea;return Ea+=1,null===Oa&&(Oa=[]),e=Xo(Oa,e,t),t=_a,null===(null===wa?t.memoizedState:wa.next)&&(t=t.alternate,I.H=null===t||null===t.memoizedState?Ws:Gs),e}function Ua(e){if(null!==e&&"object"==typeof e){if("function"==typeof e.then)return $a(e);if(e.$$typeof===k)return Eo(e)}throw Error(s(438,String(e)))}function qa(e){var t=null,n=_a.updateQueue;if(null!==n&&(t=n.memoCache),null==t){var r=_a.alternate;null!==r&&(null!==(r=r.updateQueue)&&(null!=(r=r.memoCache)&&(t={data:r.data.map(function(e){return e.slice()}),index:0})))}if(null==t&&(t={data:[],index:0}),null===n&&(n={lastEffect:null,events:null,stores:null,memoCache:null},_a.updateQueue=n),n.memoCache=t,void 0===(n=t.data[t.index]))for(n=t.data[t.index]=Array(e),r=0;r<e;r++)n[r]=O;return t.index++,n}function Ha(e,t){return"function"==typeof t?t(e):t}function Va(e){return Wa(Ba(),ka,e)}function Wa(e,t,n){var r=e.queue;if(null===r)throw Error(s(311));r.lastRenderedReducer=n;var o=e.baseQueue,a=r.pending;if(null!==a){if(null!==o){var i=o.next;o.next=a.next,a.next=i}t.baseQueue=o=a,r.pending=null}if(a=e.baseState,null===o)e.memoizedState=a;else{var c=i=null,l=null,u=t=o.next,d=!1;do{var p=-536870913&u.lane;if(p!==u.lane?(al&p)===p:(va&p)===p){var f=u.revertLane;if(0===f)null!==l&&(l=l.next={lane:0,revertLane:0,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null}),p===Fo&&(d=!0);else{if((va&f)===f){u=u.next,f===Fo&&(d=!0);continue}p={lane:0,revertLane:u.revertLane,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null},null===l?(c=l=p,i=a):l=l.next=p,_a.lanes|=f,fl|=f}p=u.action,Sa&&n(a,p),a=u.hasEagerState?u.eagerState:n(a,p)}else f={lane:p,revertLane:u.revertLane,action:u.action,hasEagerState:u.hasEagerState,eagerState:u.eagerState,next:null},null===l?(c=l=f,i=a):l=l.next=f,_a.lanes|=p,fl|=p;u=u.next}while(null!==u&&u!==t);if(null===l?i=a:l.next=c,!Qn(a,e.memoizedState)&&(Ei=!0,d&&null!==(n=zo)))throw n;e.memoizedState=a,e.baseState=i,e.baseQueue=l,r.lastRenderedState=a}return null===o&&(r.lanes=0),[e.memoizedState,r.dispatch]}function Ga(e){var t=Ba(),n=t.queue;if(null===n)throw Error(s(311));n.lastRenderedReducer=e;var r=n.dispatch,o=n.pending,a=t.memoizedState;if(null!==o){n.pending=null;var i=o=o.next;do{a=e(a,i.action),i=i.next}while(i!==o);Qn(a,t.memoizedState)||(Ei=!0),t.memoizedState=a,null===t.baseQueue&&(t.baseState=a),n.lastRenderedState=a}return[a,r]}function Ka(e,t,n){var r=_a,o=Ba(),a=ao;if(a){if(void 0===n)throw Error(s(407));n=n()}else n=t();var i=!Qn((ka||o).memoizedState,n);if(i&&(o.memoizedState=n,Ei=!0),o=o.queue,bs(2048,8,Za.bind(null,r,o,e),[e]),o.getSnapshot!==t||i||null!==wa&&1&wa.memoizedState.tag){if(r.flags|=2048,hs(9,{destroy:void 0,resource:void 0},Ya.bind(null,r,o,n,t),null),null===rl)throw Error(s(349));a||124&va||Qa(r,t,n)}return n}function Qa(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},null===(t=_a.updateQueue)?(t={lastEffect:null,events:null,stores:null,memoCache:null},_a.updateQueue=t,t.stores=[e]):null===(n=t.stores)?t.stores=[e]:n.push(e)}function Ya(e,t,n,r){t.value=n,t.getSnapshot=r,Xa(t)&&Ja(e)}function Za(e,t,n){return n(function(){Xa(t)&&Ja(e)})}function Xa(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!Qn(e,n)}catch(r){return!0}}function Ja(e){var t=Dr(e,2);null!==t&&Ll(t,e,2)}function es(e){var t=za();if("function"==typeof e){var n=e;if(e=n(),Sa){pe(!0);try{n()}finally{pe(!1)}}}return t.memoizedState=t.baseState=e,t.queue={pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ha,lastRenderedState:e},t}function ts(e,t,n,r){return e.baseState=n,Wa(e,ka,"function"==typeof r?r:Ha)}function ns(e,t,n,r,o){if(Us(e))throw Error(s(485));if(null!==(e=t.action)){var a={payload:o,action:e,next:null,isTransition:!0,status:"pending",value:null,reason:null,listeners:[],then:function(e){a.listeners.push(e)}};null!==I.T?n(!0):a.isTransition=!1,r(a),null===(n=t.pending)?(a.next=t.pending=a,rs(t,a)):(a.next=n.next,t.pending=n.next=a)}}function rs(e,t){var n=t.action,r=t.payload,o=e.state;if(t.isTransition){var a=I.T,s={};I.T=s;try{var i=n(o,r),c=I.S;null!==c&&c(s,i),os(e,t,i)}catch(l){ss(e,t,l)}finally{I.T=a}}else try{os(e,t,a=n(o,r))}catch(u){ss(e,t,u)}}function os(e,t,n){null!==n&&"object"==typeof n&&"function"==typeof n.then?n.then(function(n){as(e,t,n)},function(n){return ss(e,t,n)}):as(e,t,n)}function as(e,t,n){t.status="fulfilled",t.value=n,is(t),e.state=n,null!==(t=e.pending)&&((n=t.next)===t?e.pending=null:(n=n.next,t.next=n,rs(e,n)))}function ss(e,t,n){var r=e.pending;if(e.pending=null,null!==r){r=r.next;do{t.status="rejected",t.reason=n,is(t),t=t.next}while(t!==r)}e.action=null}function is(e){e=e.listeners;for(var t=0;t<e.length;t++)(0,e[t])()}function cs(e,t){return t}function ls(e,t){if(ao){var n=rl.formState;if(null!==n){e:{var r=_a;if(ao){if(oo){t:{for(var o=oo,a=io;8!==o.nodeType;){if(!a){o=null;break t}if(null===(o=bd(o.nextSibling))){o=null;break t}}o="F!"===(a=o.data)||"F"===a?o:null}if(o){oo=bd(o.nextSibling),r="F!"===o.data;break e}}lo(r)}r=!1}r&&(t=n[0])}}return(n=za()).memoizedState=n.baseState=t,r={pending:null,lanes:0,dispatch:null,lastRenderedReducer:cs,lastRenderedState:t},n.queue=r,n=zs.bind(null,_a,r),r.dispatch=n,r=es(!1),a=$s.bind(null,_a,!1,r.queue),o={state:t,dispatch:null,action:e,pending:null},(r=za()).queue=o,n=ns.bind(null,_a,o,a,n),o.dispatch=n,r.memoizedState=e,[t,n,!1]}function us(e){return ds(Ba(),ka,e)}function ds(e,t,n){if(t=Wa(e,t,cs)[0],e=Va(Ha)[0],"object"==typeof t&&null!==t&&"function"==typeof t.then)try{var r=$a(t)}catch(s){if(s===Wo)throw Ko;throw s}else r=t;var o=(t=Ba()).queue,a=o.dispatch;return n!==t.memoizedState&&(_a.flags|=2048,hs(9,{destroy:void 0,resource:void 0},ps.bind(null,o,n),null)),[r,a,e]}function ps(e,t){e.action=t}function fs(e){var t=Ba(),n=ka;if(null!==n)return ds(t,n,e);Ba(),t=t.memoizedState;var r=(n=Ba()).queue.dispatch;return n.memoizedState=e,[t,r,!1]}function hs(e,t,n,r){return e={tag:e,create:n,deps:r,inst:t,next:null},null===(t=_a.updateQueue)&&(t={lastEffect:null,events:null,stores:null,memoCache:null},_a.updateQueue=t),null===(n=t.lastEffect)?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e),e}function ms(){return Ba().memoizedState}function gs(e,t,n,r){var o=za();r=void 0===r?null:r,_a.flags|=e,o.memoizedState=hs(1|t,{destroy:void 0,resource:void 0},n,r)}function bs(e,t,n,r){var o=Ba();r=void 0===r?null:r;var a=o.memoizedState.inst;null!==ka&&null!==r&&Da(r,ka.memoizedState.deps)?o.memoizedState=hs(t,a,n,r):(_a.flags|=e,o.memoizedState=hs(1|t,a,n,r))}function ys(e,t){gs(8390656,8,e,t)}function vs(e,t){bs(2048,8,e,t)}function _s(e,t){return bs(4,2,e,t)}function ks(e,t){return bs(4,4,e,t)}function ws(e,t){if("function"==typeof t){e=e();var n=t(e);return function(){"function"==typeof n?n():t(null)}}if(null!=t)return e=e(),t.current=e,function(){t.current=null}}function Cs(e,t,n){n=null!=n?n.concat([e]):null,bs(4,4,ws.bind(null,t,e),n)}function xs(){}function Ss(e,t){var n=Ba();t=void 0===t?null:t;var r=n.memoizedState;return null!==t&&Da(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Ms(e,t){var n=Ba();t=void 0===t?null:t;var r=n.memoizedState;if(null!==t&&Da(t,r[1]))return r[0];if(r=e(),Sa){pe(!0);try{e()}finally{pe(!1)}}return n.memoizedState=[r,t],r}function Es(e,t,n){return void 0===n||1073741824&va?e.memoizedState=t:(e.memoizedState=n,e=Nl(),_a.lanes|=e,fl|=e,n)}function Os(e,t,n,r){return Qn(n,t)?n:null!==ha.current?(e=Es(e,n,r),Qn(e,t)||(Ei=!0),e):42&va?(e=Nl(),_a.lanes|=e,fl|=e,t):(Ei=!0,e.memoizedState=n)}function As(e,t,n,r,o){var a=N.p;N.p=0!==a&&8>a?a:8;var s,i,c,l=I.T,u={};I.T=u,$s(e,!1,t,n);try{var d=o(),p=I.S;if(null!==p&&p(u,d),null!==d&&"object"==typeof d&&"function"==typeof d.then)Bs(e,t,(s=r,i=[],c={status:"pending",value:null,reason:null,then:function(e){i.push(e)}},d.then(function(){c.status="fulfilled",c.value=s;for(var e=0;e<i.length;e++)(0,i[e])(s)},function(e){for(c.status="rejected",c.reason=e,e=0;e<i.length;e++)(0,i[e])(void 0)}),c),Il());else Bs(e,t,r,Il())}catch(f){Bs(e,t,{then:function(){},status:"rejected",reason:f},Il())}finally{N.p=a,I.T=l}}function js(){}function Ds(e,t,n,r){if(5!==e.tag)throw Error(s(476));var o=Ps(e).queue;As(e,o,t,L,null===n?js:function(){return Ts(e),n(r)})}function Ps(e){var t=e.memoizedState;if(null!==t)return t;var n={};return(t={memoizedState:L,baseState:L,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ha,lastRenderedState:L},next:null}).next={memoizedState:n,baseState:n,baseQueue:null,queue:{pending:null,lanes:0,dispatch:null,lastRenderedReducer:Ha,lastRenderedState:n},next:null},e.memoizedState=t,null!==(e=e.alternate)&&(e.memoizedState=t),t}function Ts(e){Bs(e,Ps(e).next.queue,{},Il())}function Is(){return Eo(Kd)}function Ns(){return Ba().memoizedState}function Ls(){return Ba().memoizedState}function Rs(e){for(var t=e.return;null!==t;){switch(t.tag){case 24:case 3:var n=Il(),r=sa(t,e=aa(n),n);return null!==r&&(Ll(r,t,n),ia(r,t,n)),t={cache:Io()},void(e.payload=t)}t=t.return}}function Fs(e,t,n){var r=Il();n={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null},Us(e)?qs(t,n):null!==(n=jr(e,t,n,r))&&(Ll(n,e,r),Hs(n,t,r))}function zs(e,t,n){Bs(e,t,n,Il())}function Bs(e,t,n,r){var o={lane:r,revertLane:0,action:n,hasEagerState:!1,eagerState:null,next:null};if(Us(e))qs(t,o);else{var a=e.alternate;if(0===e.lanes&&(null===a||0===a.lanes)&&null!==(a=t.lastRenderedReducer))try{var s=t.lastRenderedState,i=a(s,n);if(o.hasEagerState=!0,o.eagerState=i,Qn(i,s))return Ar(e,t,o,0),null===rl&&Or(),!1}catch(c){}if(null!==(n=jr(e,t,o,r)))return Ll(n,e,r),Hs(n,t,r),!0}return!1}function $s(e,t,n,r){if(r={lane:2,revertLane:Au(),action:r,hasEagerState:!1,eagerState:null,next:null},Us(e)){if(t)throw Error(s(479))}else null!==(t=jr(e,n,r,2))&&Ll(t,e,2)}function Us(e){var t=e.alternate;return e===_a||null!==t&&t===_a}function qs(e,t){xa=Ca=!0;var n=e.pending;null===n?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Hs(e,t,n){if(4194048&n){var r=t.lanes;n|=r&=e.pendingLanes,t.lanes=n,Ee(e,n)}}var Vs={readContext:Eo,use:Ua,useCallback:ja,useContext:ja,useEffect:ja,useImperativeHandle:ja,useLayoutEffect:ja,useInsertionEffect:ja,useMemo:ja,useReducer:ja,useRef:ja,useState:ja,useDebugValue:ja,useDeferredValue:ja,useTransition:ja,useSyncExternalStore:ja,useId:ja,useHostTransitionStatus:ja,useFormState:ja,useActionState:ja,useOptimistic:ja,useMemoCache:ja,useCacheRefresh:ja},Ws={readContext:Eo,use:Ua,useCallback:function(e,t){return za().memoizedState=[e,void 0===t?null:t],e},useContext:Eo,useEffect:ys,useImperativeHandle:function(e,t,n){n=null!=n?n.concat([e]):null,gs(4194308,4,ws.bind(null,t,e),n)},useLayoutEffect:function(e,t){return gs(4194308,4,e,t)},useInsertionEffect:function(e,t){gs(4,2,e,t)},useMemo:function(e,t){var n=za();t=void 0===t?null:t;var r=e();if(Sa){pe(!0);try{e()}finally{pe(!1)}}return n.memoizedState=[r,t],r},useReducer:function(e,t,n){var r=za();if(void 0!==n){var o=n(t);if(Sa){pe(!0);try{n(t)}finally{pe(!1)}}}else o=t;return r.memoizedState=r.baseState=o,e={pending:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:o},r.queue=e,e=e.dispatch=Fs.bind(null,_a,e),[r.memoizedState,e]},useRef:function(e){return e={current:e},za().memoizedState=e},useState:function(e){var t=(e=es(e)).queue,n=zs.bind(null,_a,t);return t.dispatch=n,[e.memoizedState,n]},useDebugValue:xs,useDeferredValue:function(e,t){return Es(za(),e,t)},useTransition:function(){var e=es(!1);return e=As.bind(null,_a,e.queue,!0,!1),za().memoizedState=e,[!1,e]},useSyncExternalStore:function(e,t,n){var r=_a,o=za();if(ao){if(void 0===n)throw Error(s(407));n=n()}else{if(n=t(),null===rl)throw Error(s(349));124&al||Qa(r,t,n)}o.memoizedState=n;var a={value:n,getSnapshot:t};return o.queue=a,ys(Za.bind(null,r,a,e),[e]),r.flags|=2048,hs(9,{destroy:void 0,resource:void 0},Ya.bind(null,r,a,n,t),null),n},useId:function(){var e=za(),t=rl.identifierPrefix;if(ao){var n=Xr;t="\xab"+t+"R"+(n=(Zr&~(1<<32-fe(Zr)-1)).toString(32)+n),0<(n=Ma++)&&(t+="H"+n.toString(32)),t+="\xbb"}else t="\xab"+t+"r"+(n=Aa++).toString(32)+"\xbb";return e.memoizedState=t},useHostTransitionStatus:Is,useFormState:ls,useActionState:ls,useOptimistic:function(e){var t=za();t.memoizedState=t.baseState=e;var n={pending:null,lanes:0,dispatch:null,lastRenderedReducer:null,lastRenderedState:null};return t.queue=n,t=$s.bind(null,_a,!0,n),n.dispatch=t,[e,t]},useMemoCache:qa,useCacheRefresh:function(){return za().memoizedState=Rs.bind(null,_a)}},Gs={readContext:Eo,use:Ua,useCallback:Ss,useContext:Eo,useEffect:vs,useImperativeHandle:Cs,useInsertionEffect:_s,useLayoutEffect:ks,useMemo:Ms,useReducer:Va,useRef:ms,useState:function(){return Va(Ha)},useDebugValue:xs,useDeferredValue:function(e,t){return Os(Ba(),ka.memoizedState,e,t)},useTransition:function(){var e=Va(Ha)[0],t=Ba().memoizedState;return["boolean"==typeof e?e:$a(e),t]},useSyncExternalStore:Ka,useId:Ns,useHostTransitionStatus:Is,useFormState:us,useActionState:us,useOptimistic:function(e,t){return ts(Ba(),0,e,t)},useMemoCache:qa,useCacheRefresh:Ls},Ks={readContext:Eo,use:Ua,useCallback:Ss,useContext:Eo,useEffect:vs,useImperativeHandle:Cs,useInsertionEffect:_s,useLayoutEffect:ks,useMemo:Ms,useReducer:Ga,useRef:ms,useState:function(){return Ga(Ha)},useDebugValue:xs,useDeferredValue:function(e,t){var n=Ba();return null===ka?Es(n,e,t):Os(n,ka.memoizedState,e,t)},useTransition:function(){var e=Ga(Ha)[0],t=Ba().memoizedState;return["boolean"==typeof e?e:$a(e),t]},useSyncExternalStore:Ka,useId:Ns,useHostTransitionStatus:Is,useFormState:fs,useActionState:fs,useOptimistic:function(e,t){var n=Ba();return null!==ka?ts(n,0,e,t):(n.baseState=e,[e,n.queue.dispatch])},useMemoCache:qa,useCacheRefresh:Ls},Qs=null,Ys=0;function Zs(e){var t=Ys;return Ys+=1,null===Qs&&(Qs=[]),Xo(Qs,e,t)}function Xs(e,t){t=t.props.ref,e.ref=void 0!==t?t:null}function Js(e,t){if(t.$$typeof===f)throw Error(s(525));throw e=Object.prototype.toString.call(t),Error(s(31,"[object Object]"===e?"object with keys {"+Object.keys(t).join(", ")+"}":e))}function ei(e){return(0,e._init)(e._payload)}function ti(e){function t(t,n){if(e){var r=t.deletions;null===r?(t.deletions=[n],t.flags|=16):r.push(n)}}function n(n,r){if(!e)return null;for(;null!==r;)t(n,r),r=r.sibling;return null}function r(e){for(var t=new Map;null!==e;)null!==e.key?t.set(e.key,e):t.set(e.index,e),e=e.sibling;return t}function o(e,t){return(e=Fr(e,t)).index=0,e.sibling=null,e}function a(t,n,r){return t.index=r,e?null!==(r=t.alternate)?(r=r.index)<n?(t.flags|=67108866,n):r:(t.flags|=67108866,n):(t.flags|=1048576,n)}function i(t){return e&&null===t.alternate&&(t.flags|=67108866),t}function c(e,t,n,r){return null===t||6!==t.tag?((t=Ur(n,e.mode,r)).return=e,t):((t=o(t,n)).return=e,t)}function l(e,t,n,r){var a=n.type;return a===g?d(e,t,n.props.children,r,n.key):null!==t&&(t.elementType===a||"object"==typeof a&&null!==a&&a.$$typeof===M&&ei(a)===t.type)?(Xs(t=o(t,n.props),n),t.return=e,t):(Xs(t=Br(n.type,n.key,n.props,null,e.mode,r),n),t.return=e,t)}function u(e,t,n,r){return null===t||4!==t.tag||t.stateNode.containerInfo!==n.containerInfo||t.stateNode.implementation!==n.implementation?((t=qr(n,e.mode,r)).return=e,t):((t=o(t,n.children||[])).return=e,t)}function d(e,t,n,r,a){return null===t||7!==t.tag?((t=$r(n,e.mode,r,a)).return=e,t):((t=o(t,n)).return=e,t)}function p(e,t,n){if("string"==typeof t&&""!==t||"number"==typeof t||"bigint"==typeof t)return(t=Ur(""+t,e.mode,n)).return=e,t;if("object"==typeof t&&null!==t){switch(t.$$typeof){case h:return Xs(n=Br(t.type,t.key,t.props,null,e.mode,n),t),n.return=e,n;case m:return(t=qr(t,e.mode,n)).return=e,t;case M:return p(e,t=(0,t._init)(t._payload),n)}if(T(t)||j(t))return(t=$r(t,e.mode,n,null)).return=e,t;if("function"==typeof t.then)return p(e,Zs(t),n);if(t.$$typeof===k)return p(e,Oo(e,t),n);Js(e,t)}return null}function f(e,t,n,r){var o=null!==t?t.key:null;if("string"==typeof n&&""!==n||"number"==typeof n||"bigint"==typeof n)return null!==o?null:c(e,t,""+n,r);if("object"==typeof n&&null!==n){switch(n.$$typeof){case h:return n.key===o?l(e,t,n,r):null;case m:return n.key===o?u(e,t,n,r):null;case M:return f(e,t,n=(o=n._init)(n._payload),r)}if(T(n)||j(n))return null!==o?null:d(e,t,n,r,null);if("function"==typeof n.then)return f(e,t,Zs(n),r);if(n.$$typeof===k)return f(e,t,Oo(e,n),r);Js(e,n)}return null}function b(e,t,n,r,o){if("string"==typeof r&&""!==r||"number"==typeof r||"bigint"==typeof r)return c(t,e=e.get(n)||null,""+r,o);if("object"==typeof r&&null!==r){switch(r.$$typeof){case h:return l(t,e=e.get(null===r.key?n:r.key)||null,r,o);case m:return u(t,e=e.get(null===r.key?n:r.key)||null,r,o);case M:return b(e,t,n,r=(0,r._init)(r._payload),o)}if(T(r)||j(r))return d(t,e=e.get(n)||null,r,o,null);if("function"==typeof r.then)return b(e,t,n,Zs(r),o);if(r.$$typeof===k)return b(e,t,n,Oo(t,r),o);Js(t,r)}return null}function y(c,l,u,d){if("object"==typeof u&&null!==u&&u.type===g&&null===u.key&&(u=u.props.children),"object"==typeof u&&null!==u){switch(u.$$typeof){case h:e:{for(var v=u.key;null!==l;){if(l.key===v){if((v=u.type)===g){if(7===l.tag){n(c,l.sibling),(d=o(l,u.props.children)).return=c,c=d;break e}}else if(l.elementType===v||"object"==typeof v&&null!==v&&v.$$typeof===M&&ei(v)===l.type){n(c,l.sibling),Xs(d=o(l,u.props),u),d.return=c,c=d;break e}n(c,l);break}t(c,l),l=l.sibling}u.type===g?((d=$r(u.props.children,c.mode,d,u.key)).return=c,c=d):(Xs(d=Br(u.type,u.key,u.props,null,c.mode,d),u),d.return=c,c=d)}return i(c);case m:e:{for(v=u.key;null!==l;){if(l.key===v){if(4===l.tag&&l.stateNode.containerInfo===u.containerInfo&&l.stateNode.implementation===u.implementation){n(c,l.sibling),(d=o(l,u.children||[])).return=c,c=d;break e}n(c,l);break}t(c,l),l=l.sibling}(d=qr(u,c.mode,d)).return=c,c=d}return i(c);case M:return y(c,l,u=(v=u._init)(u._payload),d)}if(T(u))return function(o,s,i,c){for(var l=null,u=null,d=s,h=s=0,m=null;null!==d&&h<i.length;h++){d.index>h?(m=d,d=null):m=d.sibling;var g=f(o,d,i[h],c);if(null===g){null===d&&(d=m);break}e&&d&&null===g.alternate&&t(o,d),s=a(g,s,h),null===u?l=g:u.sibling=g,u=g,d=m}if(h===i.length)return n(o,d),ao&&Jr(o,h),l;if(null===d){for(;h<i.length;h++)null!==(d=p(o,i[h],c))&&(s=a(d,s,h),null===u?l=d:u.sibling=d,u=d);return ao&&Jr(o,h),l}for(d=r(d);h<i.length;h++)null!==(m=b(d,o,h,i[h],c))&&(e&&null!==m.alternate&&d.delete(null===m.key?h:m.key),s=a(m,s,h),null===u?l=m:u.sibling=m,u=m);return e&&d.forEach(function(e){return t(o,e)}),ao&&Jr(o,h),l}(c,l,u,d);if(j(u)){if("function"!=typeof(v=j(u)))throw Error(s(150));return function(o,i,c,l){if(null==c)throw Error(s(151));for(var u=null,d=null,h=i,m=i=0,g=null,y=c.next();null!==h&&!y.done;m++,y=c.next()){h.index>m?(g=h,h=null):g=h.sibling;var v=f(o,h,y.value,l);if(null===v){null===h&&(h=g);break}e&&h&&null===v.alternate&&t(o,h),i=a(v,i,m),null===d?u=v:d.sibling=v,d=v,h=g}if(y.done)return n(o,h),ao&&Jr(o,m),u;if(null===h){for(;!y.done;m++,y=c.next())null!==(y=p(o,y.value,l))&&(i=a(y,i,m),null===d?u=y:d.sibling=y,d=y);return ao&&Jr(o,m),u}for(h=r(h);!y.done;m++,y=c.next())null!==(y=b(h,o,m,y.value,l))&&(e&&null!==y.alternate&&h.delete(null===y.key?m:y.key),i=a(y,i,m),null===d?u=y:d.sibling=y,d=y);return e&&h.forEach(function(e){return t(o,e)}),ao&&Jr(o,m),u}(c,l,u=v.call(u),d)}if("function"==typeof u.then)return y(c,l,Zs(u),d);if(u.$$typeof===k)return y(c,l,Oo(c,u),d);Js(c,u)}return"string"==typeof u&&""!==u||"number"==typeof u||"bigint"==typeof u?(u=""+u,null!==l&&6===l.tag?(n(c,l.sibling),(d=o(l,u)).return=c,c=d):(n(c,l),(d=Ur(u,c.mode,d)).return=c,c=d),i(c)):n(c,l)}return function(e,t,n,r){try{Ys=0;var o=y(e,t,n,r);return Qs=null,o}catch(s){if(s===Wo||s===Ko)throw s;var a=Lr(29,s,null,e.mode);return a.lanes=r,a.return=e,a}}}var ni=ti(!0),ri=ti(!1),oi=z(null),ai=null;function si(e){var t=e.alternate;$(ui,1&ui.current),$(oi,e),null===ai&&(null===t||null!==ha.current||null!==t.memoizedState)&&(ai=e)}function ii(e){if(22===e.tag){if($(ui,ui.current),$(oi,e),null===ai){var t=e.alternate;null!==t&&null!==t.memoizedState&&(ai=e)}}else ci()}function ci(){$(ui,ui.current),$(oi,oi.current)}function li(e){B(oi),ai===e&&(ai=null),B(ui)}var ui=z(0);function di(e){for(var t=e;null!==t;){if(13===t.tag){var n=t.memoizedState;if(null!==n&&(null===(n=n.dehydrated)||"$?"===n.data||gd(n)))return t}else if(19===t.tag&&void 0!==t.memoizedProps.revealOrder){if(128&t.flags)return t}else if(null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return null;t=t.return}t.sibling.return=t.return,t=t.sibling}return null}function pi(e,t,n,r){n=null==(n=n(r,t=e.memoizedState))?t:p({},t,n),e.memoizedState=n,0===e.lanes&&(e.updateQueue.baseState=n)}var fi={enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Il(),o=aa(r);o.payload=t,null!=n&&(o.callback=n),null!==(t=sa(e,o,r))&&(Ll(t,e,r),ia(t,e,r))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Il(),o=aa(r);o.tag=1,o.payload=t,null!=n&&(o.callback=n),null!==(t=sa(e,o,r))&&(Ll(t,e,r),ia(t,e,r))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Il(),r=aa(n);r.tag=2,null!=t&&(r.callback=t),null!==(t=sa(e,r,n))&&(Ll(t,e,n),ia(t,e,n))}};function hi(e,t,n,r,o,a,s){return"function"==typeof(e=e.stateNode).shouldComponentUpdate?e.shouldComponentUpdate(r,a,s):!t.prototype||!t.prototype.isPureReactComponent||(!Yn(n,r)||!Yn(o,a))}function mi(e,t,n,r){e=t.state,"function"==typeof t.componentWillReceiveProps&&t.componentWillReceiveProps(n,r),"function"==typeof t.UNSAFE_componentWillReceiveProps&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&fi.enqueueReplaceState(t,t.state,null)}function gi(e,t){var n=t;if("ref"in t)for(var r in n={},t)"ref"!==r&&(n[r]=t[r]);if(e=e.defaultProps)for(var o in n===t&&(n=p({},n)),e)void 0===n[o]&&(n[o]=e[o]);return n}var bi="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function yi(e){bi(e)}function vi(e){console.error(e)}function _i(e){bi(e)}function ki(e,t){try{(0,e.onUncaughtError)(t.value,{componentStack:t.stack})}catch(n){setTimeout(function(){throw n})}}function wi(e,t,n){try{(0,e.onCaughtError)(n.value,{componentStack:n.stack,errorBoundary:1===t.tag?t.stateNode:null})}catch(r){setTimeout(function(){throw r})}}function Ci(e,t,n){return(n=aa(n)).tag=3,n.payload={element:null},n.callback=function(){ki(e,t)},n}function xi(e){return(e=aa(e)).tag=3,e}function Si(e,t,n,r){var o=n.type.getDerivedStateFromError;if("function"==typeof o){var a=r.value;e.payload=function(){return o(a)},e.callback=function(){wi(t,n,r)}}var s=n.stateNode;null!==s&&"function"==typeof s.componentDidCatch&&(e.callback=function(){wi(t,n,r),"function"!=typeof o&&(null===xl?xl=new Set([this]):xl.add(this));var e=r.stack;this.componentDidCatch(r.value,{componentStack:null!==e?e:""})})}var Mi=Error(s(461)),Ei=!1;function Oi(e,t,n,r){t.child=null===e?ri(t,null,n,r):ni(t,e.child,n,r)}function Ai(e,t,n,r,o){n=n.render;var a=t.ref;if("ref"in r){var s={};for(var i in r)"ref"!==i&&(s[i]=r[i])}else s=r;return Mo(t),r=Pa(e,t,n,s,a,o),i=La(),null===e||Ei?(ao&&i&&to(t),t.flags|=1,Oi(e,t,r,o),t.child):(Ra(e,t,o),Qi(e,t,o))}function ji(e,t,n,r,o){if(null===e){var a=n.type;return"function"!=typeof a||Rr(a)||void 0!==a.defaultProps||null!==n.compare?((e=Br(n.type,null,r,t,t.mode,o)).ref=t.ref,e.return=t,t.child=e):(t.tag=15,t.type=a,Di(e,t,a,r,o))}if(a=e.child,!Yi(e,o)){var s=a.memoizedProps;if((n=null!==(n=n.compare)?n:Yn)(s,r)&&e.ref===t.ref)return Qi(e,t,o)}return t.flags|=1,(e=Fr(a,r)).ref=t.ref,e.return=t,t.child=e}function Di(e,t,n,r,o){if(null!==e){var a=e.memoizedProps;if(Yn(a,r)&&e.ref===t.ref){if(Ei=!1,t.pendingProps=r=a,!Yi(e,o))return t.lanes=e.lanes,Qi(e,t,o);131072&e.flags&&(Ei=!0)}}return Ni(e,t,n,r,o)}function Pi(e,t,n){var r=t.pendingProps,o=r.children,a=null!==e?e.memoizedState:null;if("hidden"===r.mode){if(128&t.flags){if(r=null!==a?a.baseLanes|n:n,null!==e){for(o=t.child=e.child,a=0;null!==o;)a=a|o.lanes|o.childLanes,o=o.sibling;t.childLanes=a&~r}else t.childLanes=0,t.child=null;return Ti(e,t,r,n)}if(!(536870912&n))return t.lanes=t.childLanes=536870912,Ti(e,t,null!==a?a.baseLanes|n:n,n);t.memoizedState={baseLanes:0,cachePool:null},null!==e&&Ho(0,null!==a?a.cachePool:null),null!==a?ga(t,a):ba(),ii(t)}else null!==a?(Ho(0,a.cachePool),ga(t,a),ci(),t.memoizedState=null):(null!==e&&Ho(0,null),ba(),ci());return Oi(e,t,o,n),t.child}function Ti(e,t,n,r){var o=qo();return o=null===o?null:{parent:To._currentValue,pool:o},t.memoizedState={baseLanes:n,cachePool:o},null!==e&&Ho(0,null),ba(),ii(t),null!==e&&xo(e,t,r,!0),null}function Ii(e,t){var n=t.ref;if(null===n)null!==e&&null!==e.ref&&(t.flags|=4194816);else{if("function"!=typeof n&&"object"!=typeof n)throw Error(s(284));null!==e&&e.ref===n||(t.flags|=4194816)}}function Ni(e,t,n,r,o){return Mo(t),n=Pa(e,t,n,r,void 0,o),r=La(),null===e||Ei?(ao&&r&&to(t),t.flags|=1,Oi(e,t,n,o),t.child):(Ra(e,t,o),Qi(e,t,o))}function Li(e,t,n,r,o,a){return Mo(t),t.updateQueue=null,n=Ia(t,r,n,o),Ta(e),r=La(),null===e||Ei?(ao&&r&&to(t),t.flags|=1,Oi(e,t,n,a),t.child):(Ra(e,t,a),Qi(e,t,a))}function Ri(e,t,n,r,o){if(Mo(t),null===t.stateNode){var a=Ir,s=n.contextType;"object"==typeof s&&null!==s&&(a=Eo(s)),a=new n(r,a),t.memoizedState=null!==a.state&&void 0!==a.state?a.state:null,a.updater=fi,t.stateNode=a,a._reactInternals=t,(a=t.stateNode).props=r,a.state=t.memoizedState,a.refs={},ra(t),s=n.contextType,a.context="object"==typeof s&&null!==s?Eo(s):Ir,a.state=t.memoizedState,"function"==typeof(s=n.getDerivedStateFromProps)&&(pi(t,n,s,r),a.state=t.memoizedState),"function"==typeof n.getDerivedStateFromProps||"function"==typeof a.getSnapshotBeforeUpdate||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||(s=a.state,"function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount(),s!==a.state&&fi.enqueueReplaceState(a,a.state,null),da(t,r,a,o),ua(),a.state=t.memoizedState),"function"==typeof a.componentDidMount&&(t.flags|=4194308),r=!0}else if(null===e){a=t.stateNode;var i=t.memoizedProps,c=gi(n,i);a.props=c;var l=a.context,u=n.contextType;s=Ir,"object"==typeof u&&null!==u&&(s=Eo(u));var d=n.getDerivedStateFromProps;u="function"==typeof d||"function"==typeof a.getSnapshotBeforeUpdate,i=t.pendingProps!==i,u||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(i||l!==s)&&mi(t,a,r,s),na=!1;var p=t.memoizedState;a.state=p,da(t,r,a,o),ua(),l=t.memoizedState,i||p!==l||na?("function"==typeof d&&(pi(t,n,d,r),l=t.memoizedState),(c=na||hi(t,n,c,r,p,l,s))?(u||"function"!=typeof a.UNSAFE_componentWillMount&&"function"!=typeof a.componentWillMount||("function"==typeof a.componentWillMount&&a.componentWillMount(),"function"==typeof a.UNSAFE_componentWillMount&&a.UNSAFE_componentWillMount()),"function"==typeof a.componentDidMount&&(t.flags|=4194308)):("function"==typeof a.componentDidMount&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=l),a.props=r,a.state=l,a.context=s,r=c):("function"==typeof a.componentDidMount&&(t.flags|=4194308),r=!1)}else{a=t.stateNode,oa(e,t),u=gi(n,s=t.memoizedProps),a.props=u,d=t.pendingProps,p=a.context,l=n.contextType,c=Ir,"object"==typeof l&&null!==l&&(c=Eo(l)),(l="function"==typeof(i=n.getDerivedStateFromProps)||"function"==typeof a.getSnapshotBeforeUpdate)||"function"!=typeof a.UNSAFE_componentWillReceiveProps&&"function"!=typeof a.componentWillReceiveProps||(s!==d||p!==c)&&mi(t,a,r,c),na=!1,p=t.memoizedState,a.state=p,da(t,r,a,o),ua();var f=t.memoizedState;s!==d||p!==f||na||null!==e&&null!==e.dependencies&&So(e.dependencies)?("function"==typeof i&&(pi(t,n,i,r),f=t.memoizedState),(u=na||hi(t,n,u,r,p,f,c)||null!==e&&null!==e.dependencies&&So(e.dependencies))?(l||"function"!=typeof a.UNSAFE_componentWillUpdate&&"function"!=typeof a.componentWillUpdate||("function"==typeof a.componentWillUpdate&&a.componentWillUpdate(r,f,c),"function"==typeof a.UNSAFE_componentWillUpdate&&a.UNSAFE_componentWillUpdate(r,f,c)),"function"==typeof a.componentDidUpdate&&(t.flags|=4),"function"==typeof a.getSnapshotBeforeUpdate&&(t.flags|=1024)):("function"!=typeof a.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=f),a.props=r,a.state=f,a.context=c,r=u):("function"!=typeof a.componentDidUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=4),"function"!=typeof a.getSnapshotBeforeUpdate||s===e.memoizedProps&&p===e.memoizedState||(t.flags|=1024),r=!1)}return a=r,Ii(e,t),r=!!(128&t.flags),a||r?(a=t.stateNode,n=r&&"function"!=typeof n.getDerivedStateFromError?null:a.render(),t.flags|=1,null!==e&&r?(t.child=ni(t,e.child,null,o),t.child=ni(t,null,n,o)):Oi(e,t,n,o),t.memoizedState=a.state,e=t.child):e=Qi(e,t,o),e}function Fi(e,t,n,r){return ho(),t.flags|=256,Oi(e,t,n,r),t.child}var zi={dehydrated:null,treeContext:null,retryLane:0,hydrationErrors:null};function Bi(e){return{baseLanes:e,cachePool:Vo()}}function $i(e,t,n){return e=null!==e?e.childLanes&~n:0,t&&(e|=gl),e}function Ui(e,t,n){var r,o=t.pendingProps,a=!1,i=!!(128&t.flags);if((r=i)||(r=(null===e||null!==e.memoizedState)&&!!(2&ui.current)),r&&(a=!0,t.flags&=-129),r=!!(32&t.flags),t.flags&=-33,null===e){if(ao){if(a?si(t):ci(),ao){var c,l=oo;if(c=l){e:{for(c=l,l=io;8!==c.nodeType;){if(!l){l=null;break e}if(null===(c=bd(c.nextSibling))){l=null;break e}}l=c}null!==l?(t.memoizedState={dehydrated:l,treeContext:null!==Yr?{id:Zr,overflow:Xr}:null,retryLane:536870912,hydrationErrors:null},(c=Lr(18,null,null,0)).stateNode=l,c.return=t,t.child=c,ro=t,oo=null,c=!0):c=!1}c||lo(t)}if(null!==(l=t.memoizedState)&&null!==(l=l.dehydrated))return gd(l)?t.lanes=32:t.lanes=536870912,null;li(t)}return l=o.children,o=o.fallback,a?(ci(),l=Hi({mode:"hidden",children:l},a=t.mode),o=$r(o,a,n,null),l.return=t,o.return=t,l.sibling=o,t.child=l,(a=t.child).memoizedState=Bi(n),a.childLanes=$i(e,r,n),t.memoizedState=zi,o):(si(t),qi(t,l))}if(null!==(c=e.memoizedState)&&null!==(l=c.dehydrated)){if(i)256&t.flags?(si(t),t.flags&=-257,t=Vi(e,t,n)):null!==t.memoizedState?(ci(),t.child=e.child,t.flags|=128,t=null):(ci(),a=o.fallback,l=t.mode,o=Hi({mode:"visible",children:o.children},l),(a=$r(a,l,n,null)).flags|=2,o.return=t,a.return=t,o.sibling=a,t.child=o,ni(t,e.child,null,n),(o=t.child).memoizedState=Bi(n),o.childLanes=$i(e,r,n),t.memoizedState=zi,t=a);else if(si(t),gd(l)){if(r=l.nextSibling&&l.nextSibling.dataset)var u=r.dgst;r=u,(o=Error(s(419))).stack="",o.digest=r,go({value:o,source:null,stack:null}),t=Vi(e,t,n)}else if(Ei||xo(e,t,n,!1),r=0!==(n&e.childLanes),Ei||r){if(null!==(r=rl)&&(0!==(o=0!==((o=42&(o=n&-n)?1:Oe(o))&(r.suspendedLanes|n))?0:o)&&o!==c.retryLane))throw c.retryLane=o,Dr(e,o),Ll(r,e,o),Mi;"$?"===l.data||Gl(),t=Vi(e,t,n)}else"$?"===l.data?(t.flags|=192,t.child=e.child,t=null):(e=c.treeContext,oo=bd(l.nextSibling),ro=t,ao=!0,so=null,io=!1,null!==e&&(Kr[Qr++]=Zr,Kr[Qr++]=Xr,Kr[Qr++]=Yr,Zr=e.id,Xr=e.overflow,Yr=t),(t=qi(t,o.children)).flags|=4096);return t}return a?(ci(),a=o.fallback,l=t.mode,u=(c=e.child).sibling,(o=Fr(c,{mode:"hidden",children:o.children})).subtreeFlags=65011712&c.subtreeFlags,null!==u?a=Fr(u,a):(a=$r(a,l,n,null)).flags|=2,a.return=t,o.return=t,o.sibling=a,t.child=o,o=a,a=t.child,null===(l=e.child.memoizedState)?l=Bi(n):(null!==(c=l.cachePool)?(u=To._currentValue,c=c.parent!==u?{parent:u,pool:u}:c):c=Vo(),l={baseLanes:l.baseLanes|n,cachePool:c}),a.memoizedState=l,a.childLanes=$i(e,r,n),t.memoizedState=zi,o):(si(t),e=(n=e.child).sibling,(n=Fr(n,{mode:"visible",children:o.children})).return=t,n.sibling=null,null!==e&&(null===(r=t.deletions)?(t.deletions=[e],t.flags|=16):r.push(e)),t.child=n,t.memoizedState=null,n)}function qi(e,t){return(t=Hi({mode:"visible",children:t},e.mode)).return=e,e.child=t}function Hi(e,t){return(e=Lr(22,e,null,t)).lanes=0,e.stateNode={_visibility:1,_pendingMarkers:null,_retryCache:null,_transitions:null},e}function Vi(e,t,n){return ni(t,e.child,null,n),(e=qi(t,t.pendingProps.children)).flags|=2,t.memoizedState=null,e}function Wi(e,t,n){e.lanes|=t;var r=e.alternate;null!==r&&(r.lanes|=t),wo(e.return,t,n)}function Gi(e,t,n,r,o){var a=e.memoizedState;null===a?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:o}:(a.isBackwards=t,a.rendering=null,a.renderingStartTime=0,a.last=r,a.tail=n,a.tailMode=o)}function Ki(e,t,n){var r=t.pendingProps,o=r.revealOrder,a=r.tail;if(Oi(e,t,r.children,n),2&(r=ui.current))r=1&r|2,t.flags|=128;else{if(null!==e&&128&e.flags)e:for(e=t.child;null!==e;){if(13===e.tag)null!==e.memoizedState&&Wi(e,n,t);else if(19===e.tag)Wi(e,n,t);else if(null!==e.child){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;null===e.sibling;){if(null===e.return||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}switch($(ui,r),o){case"forwards":for(n=t.child,o=null;null!==n;)null!==(e=n.alternate)&&null===di(e)&&(o=n),n=n.sibling;null===(n=o)?(o=t.child,t.child=null):(o=n.sibling,n.sibling=null),Gi(t,!1,o,n,a);break;case"backwards":for(n=null,o=t.child,t.child=null;null!==o;){if(null!==(e=o.alternate)&&null===di(e)){t.child=o;break}e=o.sibling,o.sibling=n,n=o,o=e}Gi(t,!0,n,null,a);break;case"together":Gi(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function Qi(e,t,n){if(null!==e&&(t.dependencies=e.dependencies),fl|=t.lanes,0===(n&t.childLanes)){if(null===e)return null;if(xo(e,t,n,!1),0===(n&t.childLanes))return null}if(null!==e&&t.child!==e.child)throw Error(s(153));if(null!==t.child){for(n=Fr(e=t.child,e.pendingProps),t.child=n,n.return=t;null!==e.sibling;)e=e.sibling,(n=n.sibling=Fr(e,e.pendingProps)).return=t;n.sibling=null}return t.child}function Yi(e,t){return 0!==(e.lanes&t)||!(null===(e=e.dependencies)||!So(e))}function Zi(e,t,n){if(null!==e)if(e.memoizedProps!==t.pendingProps)Ei=!0;else{if(!(Yi(e,n)||128&t.flags))return Ei=!1,function(e,t,n){switch(t.tag){case 3:W(t,t.stateNode.containerInfo),_o(0,To,e.memoizedState.cache),ho();break;case 27:case 5:K(t);break;case 4:W(t,t.stateNode.containerInfo);break;case 10:_o(0,t.type,t.memoizedProps.value);break;case 13:var r=t.memoizedState;if(null!==r)return null!==r.dehydrated?(si(t),t.flags|=128,null):0!==(n&t.child.childLanes)?Ui(e,t,n):(si(t),null!==(e=Qi(e,t,n))?e.sibling:null);si(t);break;case 19:var o=!!(128&e.flags);if((r=0!==(n&t.childLanes))||(xo(e,t,n,!1),r=0!==(n&t.childLanes)),o){if(r)return Ki(e,t,n);t.flags|=128}if(null!==(o=t.memoizedState)&&(o.rendering=null,o.tail=null,o.lastEffect=null),$(ui,ui.current),r)break;return null;case 22:case 23:return t.lanes=0,Pi(e,t,n);case 24:_o(0,To,e.memoizedState.cache)}return Qi(e,t,n)}(e,t,n);Ei=!!(131072&e.flags)}else Ei=!1,ao&&1048576&t.flags&&eo(t,Gr,t.index);switch(t.lanes=0,t.tag){case 16:e:{e=t.pendingProps;var r=t.elementType,o=r._init;if(r=o(r._payload),t.type=r,"function"!=typeof r){if(null!=r){if((o=r.$$typeof)===w){t.tag=11,t=Ai(null,t,r,e,n);break e}if(o===S){t.tag=14,t=ji(null,t,r,e,n);break e}}throw t=P(r)||r,Error(s(306,t,""))}Rr(r)?(e=gi(r,e),t.tag=1,t=Ri(null,t,r,e,n)):(t.tag=0,t=Ni(null,t,r,e,n))}return t;case 0:return Ni(e,t,t.type,t.pendingProps,n);case 1:return Ri(e,t,r=t.type,o=gi(r,t.pendingProps),n);case 3:e:{if(W(t,t.stateNode.containerInfo),null===e)throw Error(s(387));r=t.pendingProps;var a=t.memoizedState;o=a.element,oa(e,t),da(t,r,null,n);var i=t.memoizedState;if(r=i.cache,_o(0,To,r),r!==a.cache&&Co(t,[To],n,!0),ua(),r=i.element,a.isDehydrated){if(a={element:r,isDehydrated:!1,cache:i.cache},t.updateQueue.baseState=a,t.memoizedState=a,256&t.flags){t=Fi(e,t,r,n);break e}if(r!==o){go(o=xr(Error(s(424)),t)),t=Fi(e,t,r,n);break e}if(9===(e=t.stateNode.containerInfo).nodeType)e=e.body;else e="HTML"===e.nodeName?e.ownerDocument.body:e;for(oo=bd(e.firstChild),ro=t,ao=!0,so=null,io=!0,n=ri(t,null,r,n),t.child=n;n;)n.flags=-3&n.flags|4096,n=n.sibling}else{if(ho(),r===o){t=Qi(e,t,n);break e}Oi(e,t,r,n)}t=t.child}return t;case 26:return Ii(e,t),null===e?(n=Od(t.type,null,t.pendingProps,null))?t.memoizedState=n:ao||(n=t.type,e=t.pendingProps,(r=rd(H.current).createElement(n))[Pe]=t,r[Te]=e,ed(r,n,e),Ve(r),t.stateNode=r):t.memoizedState=Od(t.type,e.memoizedProps,t.pendingProps,e.memoizedState),null;case 27:return K(t),null===e&&ao&&(r=t.stateNode=_d(t.type,t.pendingProps,H.current),ro=t,io=!0,o=oo,fd(t.type)?(yd=o,oo=bd(r.firstChild)):oo=o),Oi(e,t,t.pendingProps.children,n),Ii(e,t),null===e&&(t.flags|=4194304),t.child;case 5:return null===e&&ao&&((o=r=oo)&&(null!==(r=function(e,t,n,r){for(;1===e.nodeType;){var o=n;if(e.nodeName.toLowerCase()!==t.toLowerCase()){if(!r&&("INPUT"!==e.nodeName||"hidden"!==e.type))break}else if(r){if(!e[ze])switch(t){case"meta":if(!e.hasAttribute("itemprop"))break;return e;case"link":if("stylesheet"===(a=e.getAttribute("rel"))&&e.hasAttribute("data-precedence"))break;if(a!==o.rel||e.getAttribute("href")!==(null==o.href||""===o.href?null:o.href)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin)||e.getAttribute("title")!==(null==o.title?null:o.title))break;return e;case"style":if(e.hasAttribute("data-precedence"))break;return e;case"script":if(((a=e.getAttribute("src"))!==(null==o.src?null:o.src)||e.getAttribute("type")!==(null==o.type?null:o.type)||e.getAttribute("crossorigin")!==(null==o.crossOrigin?null:o.crossOrigin))&&a&&e.hasAttribute("async")&&!e.hasAttribute("itemprop"))break;return e;default:return e}}else{if("input"!==t||"hidden"!==e.type)return e;var a=null==o.name?null:""+o.name;if("hidden"===o.type&&e.getAttribute("name")===a)return e}if(null===(e=bd(e.nextSibling)))break}return null}(r,t.type,t.pendingProps,io))?(t.stateNode=r,ro=t,oo=bd(r.firstChild),io=!1,o=!0):o=!1),o||lo(t)),K(t),o=t.type,a=t.pendingProps,i=null!==e?e.memoizedProps:null,r=a.children,sd(o,a)?r=null:null!==i&&sd(o,i)&&(t.flags|=32),null!==t.memoizedState&&(o=Pa(e,t,Na,null,null,n),Kd._currentValue=o),Ii(e,t),Oi(e,t,r,n),t.child;case 6:return null===e&&ao&&((e=n=oo)&&(null!==(n=function(e,t,n){if(""===t)return null;for(;3!==e.nodeType;){if((1!==e.nodeType||"INPUT"!==e.nodeName||"hidden"!==e.type)&&!n)return null;if(null===(e=bd(e.nextSibling)))return null}return e}(n,t.pendingProps,io))?(t.stateNode=n,ro=t,oo=null,e=!0):e=!1),e||lo(t)),null;case 13:return Ui(e,t,n);case 4:return W(t,t.stateNode.containerInfo),r=t.pendingProps,null===e?t.child=ni(t,null,r,n):Oi(e,t,r,n),t.child;case 11:return Ai(e,t,t.type,t.pendingProps,n);case 7:return Oi(e,t,t.pendingProps,n),t.child;case 8:case 12:return Oi(e,t,t.pendingProps.children,n),t.child;case 10:return r=t.pendingProps,_o(0,t.type,r.value),Oi(e,t,r.children,n),t.child;case 9:return o=t.type._context,r=t.pendingProps.children,Mo(t),r=r(o=Eo(o)),t.flags|=1,Oi(e,t,r,n),t.child;case 14:return ji(e,t,t.type,t.pendingProps,n);case 15:return Di(e,t,t.type,t.pendingProps,n);case 19:return Ki(e,t,n);case 31:return r=t.pendingProps,n=t.mode,r={mode:r.mode,children:r.children},null===e?((n=Hi(r,n)).ref=t.ref,t.child=n,n.return=t,t=n):((n=Fr(e.child,r)).ref=t.ref,t.child=n,n.return=t,t=n),t;case 22:return Pi(e,t,n);case 24:return Mo(t),r=Eo(To),null===e?(null===(o=qo())&&(o=rl,a=Io(),o.pooledCache=a,a.refCount++,null!==a&&(o.pooledCacheLanes|=n),o=a),t.memoizedState={parent:r,cache:o},ra(t),_o(0,To,o)):(0!==(e.lanes&n)&&(oa(e,t),da(t,null,null,n),ua()),o=e.memoizedState,a=t.memoizedState,o.parent!==r?(o={parent:r,cache:r},t.memoizedState=o,0===t.lanes&&(t.memoizedState=t.updateQueue.baseState=o),_o(0,To,r)):(r=a.cache,_o(0,To,r),r!==o.cache&&Co(t,[To],n,!0))),Oi(e,t,t.pendingProps.children,n),t.child;case 29:throw t.pendingProps}throw Error(s(156,t.tag))}function Xi(e){e.flags|=4}function Ji(e,t){if("stylesheet"!==t.type||4&t.state.loading)e.flags&=-16777217;else if(e.flags|=16777216,!$d(t)){if(null!==(t=oi.current)&&((4194048&al)===al?null!==ai:(62914560&al)!==al&&!(536870912&al)||t!==ai))throw Jo=Qo,Go;e.flags|=8192}}function ec(e,t){null!==t&&(e.flags|=4),16384&e.flags&&(t=22!==e.tag?Ce():536870912,e.lanes|=t,bl|=t)}function tc(e,t){if(!ao)switch(e.tailMode){case"hidden":t=e.tail;for(var n=null;null!==t;)null!==t.alternate&&(n=t),t=t.sibling;null===n?e.tail=null:n.sibling=null;break;case"collapsed":n=e.tail;for(var r=null;null!==n;)null!==n.alternate&&(r=n),n=n.sibling;null===r?t||null===e.tail?e.tail=null:e.tail.sibling=null:r.sibling=null}}function nc(e){var t=null!==e.alternate&&e.alternate.child===e.child,n=0,r=0;if(t)for(var o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=65011712&o.subtreeFlags,r|=65011712&o.flags,o.return=e,o=o.sibling;else for(o=e.child;null!==o;)n|=o.lanes|o.childLanes,r|=o.subtreeFlags,r|=o.flags,o.return=e,o=o.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function rc(e,t,n){var r=t.pendingProps;switch(no(t),t.tag){case 31:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:case 1:return nc(t),null;case 3:return n=t.stateNode,r=null,null!==e&&(r=e.memoizedState.cache),t.memoizedState.cache!==r&&(t.flags|=2048),ko(To),G(),n.pendingContext&&(n.context=n.pendingContext,n.pendingContext=null),null!==e&&null!==e.child||(fo(t)?Xi(t):null===e||e.memoizedState.isDehydrated&&!(256&t.flags)||(t.flags|=1024,mo())),nc(t),null;case 26:return n=t.memoizedState,null===e?(Xi(t),null!==n?(nc(t),Ji(t,n)):(nc(t),t.flags&=-16777217)):n?n!==e.memoizedState?(Xi(t),nc(t),Ji(t,n)):(nc(t),t.flags&=-16777217):(e.memoizedProps!==r&&Xi(t),nc(t),t.flags&=-16777217),null;case 27:Q(t),n=H.current;var o=t.type;if(null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Xi(t);else{if(!r){if(null===t.stateNode)throw Error(s(166));return nc(t),null}e=U.current,fo(t)?uo(t):(e=_d(o,r,n),t.stateNode=e,Xi(t))}return nc(t),null;case 5:if(Q(t),n=t.type,null!==e&&null!=t.stateNode)e.memoizedProps!==r&&Xi(t);else{if(!r){if(null===t.stateNode)throw Error(s(166));return nc(t),null}if(e=U.current,fo(t))uo(t);else{switch(o=rd(H.current),e){case 1:e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case 2:e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;default:switch(n){case"svg":e=o.createElementNS("http://www.w3.org/2000/svg",n);break;case"math":e=o.createElementNS("http://www.w3.org/1998/Math/MathML",n);break;case"script":(e=o.createElement("div")).innerHTML="<script><\/script>",e=e.removeChild(e.firstChild);break;case"select":e="string"==typeof r.is?o.createElement("select",{is:r.is}):o.createElement("select"),r.multiple?e.multiple=!0:r.size&&(e.size=r.size);break;default:e="string"==typeof r.is?o.createElement(n,{is:r.is}):o.createElement(n)}}e[Pe]=t,e[Te]=r;e:for(o=t.child;null!==o;){if(5===o.tag||6===o.tag)e.appendChild(o.stateNode);else if(4!==o.tag&&27!==o.tag&&null!==o.child){o.child.return=o,o=o.child;continue}if(o===t)break e;for(;null===o.sibling;){if(null===o.return||o.return===t)break e;o=o.return}o.sibling.return=o.return,o=o.sibling}t.stateNode=e;e:switch(ed(e,n,r),n){case"button":case"input":case"select":case"textarea":e=!!r.autoFocus;break e;case"img":e=!0;break e;default:e=!1}e&&Xi(t)}}return nc(t),t.flags&=-16777217,null;case 6:if(e&&null!=t.stateNode)e.memoizedProps!==r&&Xi(t);else{if("string"!=typeof r&&null===t.stateNode)throw Error(s(166));if(e=H.current,fo(t)){if(e=t.stateNode,n=t.memoizedProps,r=null,null!==(o=ro))switch(o.tag){case 27:case 5:r=o.memoizedProps}e[Pe]=t,(e=!!(e.nodeValue===n||null!==r&&!0===r.suppressHydrationWarning||Yu(e.nodeValue,n)))||lo(t)}else(e=rd(e).createTextNode(r))[Pe]=t,t.stateNode=e}return nc(t),null;case 13:if(r=t.memoizedState,null===e||null!==e.memoizedState&&null!==e.memoizedState.dehydrated){if(o=fo(t),null!==r&&null!==r.dehydrated){if(null===e){if(!o)throw Error(s(318));if(!(o=null!==(o=t.memoizedState)?o.dehydrated:null))throw Error(s(317));o[Pe]=t}else ho(),!(128&t.flags)&&(t.memoizedState=null),t.flags|=4;nc(t),o=!1}else o=mo(),null!==e&&null!==e.memoizedState&&(e.memoizedState.hydrationErrors=o),o=!0;if(!o)return 256&t.flags?(li(t),t):(li(t),null)}if(li(t),128&t.flags)return t.lanes=n,t;if(n=null!==r,e=null!==e&&null!==e.memoizedState,n){o=null,null!==(r=t.child).alternate&&null!==r.alternate.memoizedState&&null!==r.alternate.memoizedState.cachePool&&(o=r.alternate.memoizedState.cachePool.pool);var a=null;null!==r.memoizedState&&null!==r.memoizedState.cachePool&&(a=r.memoizedState.cachePool.pool),a!==o&&(r.flags|=2048)}return n!==e&&n&&(t.child.flags|=8192),ec(t,t.updateQueue),nc(t),null;case 4:return G(),null===e&&Bu(t.stateNode.containerInfo),nc(t),null;case 10:return ko(t.type),nc(t),null;case 19:if(B(ui),null===(o=t.memoizedState))return nc(t),null;if(r=!!(128&t.flags),null===(a=o.rendering))if(r)tc(o,!1);else{if(0!==pl||null!==e&&128&e.flags)for(e=t.child;null!==e;){if(null!==(a=di(e))){for(t.flags|=128,tc(o,!1),e=a.updateQueue,t.updateQueue=e,ec(t,e),t.subtreeFlags=0,e=n,n=t.child;null!==n;)zr(n,e),n=n.sibling;return $(ui,1&ui.current|2),t.child}e=e.sibling}null!==o.tail&&te()>wl&&(t.flags|=128,r=!0,tc(o,!1),t.lanes=4194304)}else{if(!r)if(null!==(e=di(a))){if(t.flags|=128,r=!0,e=e.updateQueue,t.updateQueue=e,ec(t,e),tc(o,!0),null===o.tail&&"hidden"===o.tailMode&&!a.alternate&&!ao)return nc(t),null}else 2*te()-o.renderingStartTime>wl&&536870912!==n&&(t.flags|=128,r=!0,tc(o,!1),t.lanes=4194304);o.isBackwards?(a.sibling=t.child,t.child=a):(null!==(e=o.last)?e.sibling=a:t.child=a,o.last=a)}return null!==o.tail?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=te(),t.sibling=null,e=ui.current,$(ui,r?1&e|2:1&e),t):(nc(t),null);case 22:case 23:return li(t),ya(),r=null!==t.memoizedState,null!==e?null!==e.memoizedState!==r&&(t.flags|=8192):r&&(t.flags|=8192),r?!!(536870912&n)&&!(128&t.flags)&&(nc(t),6&t.subtreeFlags&&(t.flags|=8192)):nc(t),null!==(n=t.updateQueue)&&ec(t,n.retryQueue),n=null,null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),r=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(r=t.memoizedState.cachePool.pool),r!==n&&(t.flags|=2048),null!==e&&B(Uo),null;case 24:return n=null,null!==e&&(n=e.memoizedState.cache),t.memoizedState.cache!==n&&(t.flags|=2048),ko(To),nc(t),null;case 25:case 30:return null}throw Error(s(156,t.tag))}function oc(e,t){switch(no(t),t.tag){case 1:return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 3:return ko(To),G(),65536&(e=t.flags)&&!(128&e)?(t.flags=-65537&e|128,t):null;case 26:case 27:case 5:return Q(t),null;case 13:if(li(t),null!==(e=t.memoizedState)&&null!==e.dehydrated){if(null===t.alternate)throw Error(s(340));ho()}return 65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 19:return B(ui),null;case 4:return G(),null;case 10:return ko(t.type),null;case 22:case 23:return li(t),ya(),null!==e&&B(Uo),65536&(e=t.flags)?(t.flags=-65537&e|128,t):null;case 24:return ko(To),null;default:return null}}function ac(e,t){switch(no(t),t.tag){case 3:ko(To),G();break;case 26:case 27:case 5:Q(t);break;case 4:G();break;case 13:li(t);break;case 19:B(ui);break;case 10:ko(t.type);break;case 22:case 23:li(t),ya(),null!==e&&B(Uo);break;case 24:ko(To)}}function sc(e,t){try{var n=t.updateQueue,r=null!==n?n.lastEffect:null;if(null!==r){var o=r.next;n=o;do{if((n.tag&e)===e){r=void 0;var a=n.create,s=n.inst;r=a(),s.destroy=r}n=n.next}while(n!==o)}}catch(i){uu(t,t.return,i)}}function ic(e,t,n){try{var r=t.updateQueue,o=null!==r?r.lastEffect:null;if(null!==o){var a=o.next;r=a;do{if((r.tag&e)===e){var s=r.inst,i=s.destroy;if(void 0!==i){s.destroy=void 0,o=t;var c=n,l=i;try{l()}catch(u){uu(o,c,u)}}}r=r.next}while(r!==a)}}catch(u){uu(t,t.return,u)}}function cc(e){var t=e.updateQueue;if(null!==t){var n=e.stateNode;try{fa(t,n)}catch(r){uu(e,e.return,r)}}}function lc(e,t,n){n.props=gi(e.type,e.memoizedProps),n.state=e.memoizedState;try{n.componentWillUnmount()}catch(r){uu(e,t,r)}}function uc(e,t){try{var n=e.ref;if(null!==n){switch(e.tag){case 26:case 27:case 5:var r=e.stateNode;break;default:r=e.stateNode}"function"==typeof n?e.refCleanup=n(r):n.current=r}}catch(o){uu(e,t,o)}}function dc(e,t){var n=e.ref,r=e.refCleanup;if(null!==n)if("function"==typeof r)try{r()}catch(o){uu(e,t,o)}finally{e.refCleanup=null,null!=(e=e.alternate)&&(e.refCleanup=null)}else if("function"==typeof n)try{n(null)}catch(a){uu(e,t,a)}else n.current=null}function pc(e){var t=e.type,n=e.memoizedProps,r=e.stateNode;try{e:switch(t){case"button":case"input":case"select":case"textarea":n.autoFocus&&r.focus();break e;case"img":n.src?r.src=n.src:n.srcSet&&(r.srcset=n.srcSet)}}catch(o){uu(e,e.return,o)}}function fc(e,t,n){try{var r=e.stateNode;!function(e,t,n,r){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"input":var o=null,a=null,i=null,c=null,l=null,u=null,d=null;for(h in n){var p=n[h];if(n.hasOwnProperty(h)&&null!=p)switch(h){case"checked":case"value":break;case"defaultValue":l=p;default:r.hasOwnProperty(h)||Xu(e,t,h,null,r,p)}}for(var f in r){var h=r[f];if(p=n[f],r.hasOwnProperty(f)&&(null!=h||null!=p))switch(f){case"type":a=h;break;case"name":o=h;break;case"checked":u=h;break;case"defaultChecked":d=h;break;case"value":i=h;break;case"defaultValue":c=h;break;case"children":case"dangerouslySetInnerHTML":if(null!=h)throw Error(s(137,t));break;default:h!==p&&Xu(e,t,f,h,r,p)}}return void gt(e,i,c,l,u,d,a,o);case"select":for(a in h=i=c=f=null,n)if(l=n[a],n.hasOwnProperty(a)&&null!=l)switch(a){case"value":break;case"multiple":h=l;default:r.hasOwnProperty(a)||Xu(e,t,a,null,r,l)}for(o in r)if(a=r[o],l=n[o],r.hasOwnProperty(o)&&(null!=a||null!=l))switch(o){case"value":f=a;break;case"defaultValue":c=a;break;case"multiple":i=a;default:a!==l&&Xu(e,t,o,a,r,l)}return t=c,n=i,r=h,void(null!=f?vt(e,!!n,f,!1):!!r!=!!n&&(null!=t?vt(e,!!n,t,!0):vt(e,!!n,n?[]:"",!1)));case"textarea":for(c in h=f=null,n)if(o=n[c],n.hasOwnProperty(c)&&null!=o&&!r.hasOwnProperty(c))switch(c){case"value":case"children":break;default:Xu(e,t,c,null,r,o)}for(i in r)if(o=r[i],a=n[i],r.hasOwnProperty(i)&&(null!=o||null!=a))switch(i){case"value":f=o;break;case"defaultValue":h=o;break;case"children":break;case"dangerouslySetInnerHTML":if(null!=o)throw Error(s(91));break;default:o!==a&&Xu(e,t,i,o,r,a)}return void _t(e,f,h);case"option":for(var m in n)if(f=n[m],n.hasOwnProperty(m)&&null!=f&&!r.hasOwnProperty(m))if("selected"===m)e.selected=!1;else Xu(e,t,m,null,r,f);for(l in r)if(f=r[l],h=n[l],r.hasOwnProperty(l)&&f!==h&&(null!=f||null!=h))if("selected"===l)e.selected=f&&"function"!=typeof f&&"symbol"!=typeof f;else Xu(e,t,l,f,r,h);return;case"img":case"link":case"area":case"base":case"br":case"col":case"embed":case"hr":case"keygen":case"meta":case"param":case"source":case"track":case"wbr":case"menuitem":for(var g in n)f=n[g],n.hasOwnProperty(g)&&null!=f&&!r.hasOwnProperty(g)&&Xu(e,t,g,null,r,f);for(u in r)if(f=r[u],h=n[u],r.hasOwnProperty(u)&&f!==h&&(null!=f||null!=h))switch(u){case"children":case"dangerouslySetInnerHTML":if(null!=f)throw Error(s(137,t));break;default:Xu(e,t,u,f,r,h)}return;default:if(Mt(t)){for(var b in n)f=n[b],n.hasOwnProperty(b)&&void 0!==f&&!r.hasOwnProperty(b)&&Ju(e,t,b,void 0,r,f);for(d in r)f=r[d],h=n[d],!r.hasOwnProperty(d)||f===h||void 0===f&&void 0===h||Ju(e,t,d,f,r,h);return}}for(var y in n)f=n[y],n.hasOwnProperty(y)&&null!=f&&!r.hasOwnProperty(y)&&Xu(e,t,y,null,r,f);for(p in r)f=r[p],h=n[p],!r.hasOwnProperty(p)||f===h||null==f&&null==h||Xu(e,t,p,f,r,h)}(r,e.type,n,t),r[Te]=t}catch(o){uu(e,e.return,o)}}function hc(e){return 5===e.tag||3===e.tag||26===e.tag||27===e.tag&&fd(e.type)||4===e.tag}function mc(e){e:for(;;){for(;null===e.sibling;){if(null===e.return||hc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;5!==e.tag&&6!==e.tag&&18!==e.tag;){if(27===e.tag&&fd(e.type))continue e;if(2&e.flags)continue e;if(null===e.child||4===e.tag)continue e;e.child.return=e,e=e.child}if(!(2&e.flags))return e.stateNode}}function gc(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?(9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).insertBefore(e,t):((t=9===n.nodeType?n.body:"HTML"===n.nodeName?n.ownerDocument.body:n).appendChild(e),null!=(n=n._reactRootContainer)||null!==t.onclick||(t.onclick=Zu));else if(4!==r&&(27===r&&fd(e.type)&&(n=e.stateNode,t=null),null!==(e=e.child)))for(gc(e,t,n),e=e.sibling;null!==e;)gc(e,t,n),e=e.sibling}function bc(e,t,n){var r=e.tag;if(5===r||6===r)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(4!==r&&(27===r&&fd(e.type)&&(n=e.stateNode),null!==(e=e.child)))for(bc(e,t,n),e=e.sibling;null!==e;)bc(e,t,n),e=e.sibling}function yc(e){var t=e.stateNode,n=e.memoizedProps;try{for(var r=e.type,o=t.attributes;o.length;)t.removeAttributeNode(o[0]);ed(t,r,n),t[Pe]=e,t[Te]=n}catch(a){uu(e,e.return,a)}}var vc=!1,_c=!1,kc=!1,wc="function"==typeof WeakSet?WeakSet:Set,Cc=null;function xc(e,t,n){var r=n.flags;switch(n.tag){case 0:case 11:case 15:Rc(e,n),4&r&&sc(5,n);break;case 1:if(Rc(e,n),4&r)if(e=n.stateNode,null===t)try{e.componentDidMount()}catch(s){uu(n,n.return,s)}else{var o=gi(n.type,t.memoizedProps);t=t.memoizedState;try{e.componentDidUpdate(o,t,e.__reactInternalSnapshotBeforeUpdate)}catch(i){uu(n,n.return,i)}}64&r&&cc(n),512&r&&uc(n,n.return);break;case 3:if(Rc(e,n),64&r&&null!==(e=n.updateQueue)){if(t=null,null!==n.child)switch(n.child.tag){case 27:case 5:case 1:t=n.child.stateNode}try{fa(e,t)}catch(s){uu(n,n.return,s)}}break;case 27:null===t&&4&r&&yc(n);case 26:case 5:Rc(e,n),null===t&&4&r&&pc(n),512&r&&uc(n,n.return);break;case 12:Rc(e,n);break;case 13:Rc(e,n),4&r&&jc(e,n),64&r&&(null!==(e=n.memoizedState)&&(null!==(e=e.dehydrated)&&function(e,t){var n=e.ownerDocument;if("$?"!==e.data||"complete"===n.readyState)t();else{var r=function(){t(),n.removeEventListener("DOMContentLoaded",r)};n.addEventListener("DOMContentLoaded",r),e._reactRetry=r}}(e,n=hu.bind(null,n))));break;case 22:if(!(r=null!==n.memoizedState||vc)){t=null!==t&&null!==t.memoizedState||_c,o=vc;var a=_c;vc=r,(_c=t)&&!a?zc(e,n,!!(8772&n.subtreeFlags)):Rc(e,n),vc=o,_c=a}break;case 30:break;default:Rc(e,n)}}function Sc(e){var t=e.alternate;null!==t&&(e.alternate=null,Sc(t)),e.child=null,e.deletions=null,e.sibling=null,5===e.tag&&(null!==(t=e.stateNode)&&Be(t)),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}var Mc=null,Ec=!1;function Oc(e,t,n){for(n=n.child;null!==n;)Ac(e,t,n),n=n.sibling}function Ac(e,t,n){if(de&&"function"==typeof de.onCommitFiberUnmount)try{de.onCommitFiberUnmount(ue,n)}catch(a){}switch(n.tag){case 26:_c||dc(n,t),Oc(e,t,n),n.memoizedState?n.memoizedState.count--:n.stateNode&&(n=n.stateNode).parentNode.removeChild(n);break;case 27:_c||dc(n,t);var r=Mc,o=Ec;fd(n.type)&&(Mc=n.stateNode,Ec=!1),Oc(e,t,n),kd(n.stateNode),Mc=r,Ec=o;break;case 5:_c||dc(n,t);case 6:if(r=Mc,o=Ec,Mc=null,Oc(e,t,n),Ec=o,null!==(Mc=r))if(Ec)try{(9===Mc.nodeType?Mc.body:"HTML"===Mc.nodeName?Mc.ownerDocument.body:Mc).removeChild(n.stateNode)}catch(s){uu(n,t,s)}else try{Mc.removeChild(n.stateNode)}catch(s){uu(n,t,s)}break;case 18:null!==Mc&&(Ec?(hd(9===(e=Mc).nodeType?e.body:"HTML"===e.nodeName?e.ownerDocument.body:e,n.stateNode),Ep(e)):hd(Mc,n.stateNode));break;case 4:r=Mc,o=Ec,Mc=n.stateNode.containerInfo,Ec=!0,Oc(e,t,n),Mc=r,Ec=o;break;case 0:case 11:case 14:case 15:_c||ic(2,n,t),_c||ic(4,n,t),Oc(e,t,n);break;case 1:_c||(dc(n,t),"function"==typeof(r=n.stateNode).componentWillUnmount&&lc(n,t,r)),Oc(e,t,n);break;case 21:Oc(e,t,n);break;case 22:_c=(r=_c)||null!==n.memoizedState,Oc(e,t,n),_c=r;break;default:Oc(e,t,n)}}function jc(e,t){if(null===t.memoizedState&&(null!==(e=t.alternate)&&(null!==(e=e.memoizedState)&&null!==(e=e.dehydrated))))try{Ep(e)}catch(n){uu(t,t.return,n)}}function Dc(e,t){var n=function(e){switch(e.tag){case 13:case 19:var t=e.stateNode;return null===t&&(t=e.stateNode=new wc),t;case 22:return null===(t=(e=e.stateNode)._retryCache)&&(t=e._retryCache=new wc),t;default:throw Error(s(435,e.tag))}}(e);t.forEach(function(t){var r=mu.bind(null,e,t);n.has(t)||(n.add(t),t.then(r,r))})}function Pc(e,t){var n=t.deletions;if(null!==n)for(var r=0;r<n.length;r++){var o=n[r],a=e,i=t,c=i;e:for(;null!==c;){switch(c.tag){case 27:if(fd(c.type)){Mc=c.stateNode,Ec=!1;break e}break;case 5:Mc=c.stateNode,Ec=!1;break e;case 3:case 4:Mc=c.stateNode.containerInfo,Ec=!0;break e}c=c.return}if(null===Mc)throw Error(s(160));Ac(a,i,o),Mc=null,Ec=!1,null!==(a=o.alternate)&&(a.return=null),o.return=null}if(13878&t.subtreeFlags)for(t=t.child;null!==t;)Ic(t,e),t=t.sibling}var Tc=null;function Ic(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:Pc(t,e),Nc(e),4&r&&(ic(3,e,e.return),sc(3,e),ic(5,e,e.return));break;case 1:Pc(t,e),Nc(e),512&r&&(_c||null===n||dc(n,n.return)),64&r&&vc&&(null!==(e=e.updateQueue)&&(null!==(r=e.callbacks)&&(n=e.shared.hiddenCallbacks,e.shared.hiddenCallbacks=null===n?r:n.concat(r))));break;case 26:var o=Tc;if(Pc(t,e),Nc(e),512&r&&(_c||null===n||dc(n,n.return)),4&r){var a=null!==n?n.memoizedState:null;if(r=e.memoizedState,null===n)if(null===r)if(null===e.stateNode){e:{r=e.type,n=e.memoizedProps,o=o.ownerDocument||o;t:switch(r){case"title":(!(a=o.getElementsByTagName("title")[0])||a[ze]||a[Pe]||"http://www.w3.org/2000/svg"===a.namespaceURI||a.hasAttribute("itemprop"))&&(a=o.createElement(r),o.head.insertBefore(a,o.querySelector("head > title"))),ed(a,r,n),a[Pe]=e,Ve(a),r=a;break e;case"link":var i=zd("link","href",o).get(r+(n.href||""));if(i)for(var c=0;c<i.length;c++)if((a=i[c]).getAttribute("href")===(null==n.href||""===n.href?null:n.href)&&a.getAttribute("rel")===(null==n.rel?null:n.rel)&&a.getAttribute("title")===(null==n.title?null:n.title)&&a.getAttribute("crossorigin")===(null==n.crossOrigin?null:n.crossOrigin)){i.splice(c,1);break t}ed(a=o.createElement(r),r,n),o.head.appendChild(a);break;case"meta":if(i=zd("meta","content",o).get(r+(n.content||"")))for(c=0;c<i.length;c++)if((a=i[c]).getAttribute("content")===(null==n.content?null:""+n.content)&&a.getAttribute("name")===(null==n.name?null:n.name)&&a.getAttribute("property")===(null==n.property?null:n.property)&&a.getAttribute("http-equiv")===(null==n.httpEquiv?null:n.httpEquiv)&&a.getAttribute("charset")===(null==n.charSet?null:n.charSet)){i.splice(c,1);break t}ed(a=o.createElement(r),r,n),o.head.appendChild(a);break;default:throw Error(s(468,r))}a[Pe]=e,Ve(a),r=a}e.stateNode=r}else Bd(o,e.type,e.stateNode);else e.stateNode=Id(o,r,e.memoizedProps);else a!==r?(null===a?null!==n.stateNode&&(n=n.stateNode).parentNode.removeChild(n):a.count--,null===r?Bd(o,e.type,e.stateNode):Id(o,r,e.memoizedProps)):null===r&&null!==e.stateNode&&fc(e,e.memoizedProps,n.memoizedProps)}break;case 27:Pc(t,e),Nc(e),512&r&&(_c||null===n||dc(n,n.return)),null!==n&&4&r&&fc(e,e.memoizedProps,n.memoizedProps);break;case 5:if(Pc(t,e),Nc(e),512&r&&(_c||null===n||dc(n,n.return)),32&e.flags){o=e.stateNode;try{wt(o,"")}catch(h){uu(e,e.return,h)}}4&r&&null!=e.stateNode&&fc(e,o=e.memoizedProps,null!==n?n.memoizedProps:o),1024&r&&(kc=!0);break;case 6:if(Pc(t,e),Nc(e),4&r){if(null===e.stateNode)throw Error(s(162));r=e.memoizedProps,n=e.stateNode;try{n.nodeValue=r}catch(h){uu(e,e.return,h)}}break;case 3:if(Fd=null,o=Tc,Tc=xd(t.containerInfo),Pc(t,e),Tc=o,Nc(e),4&r&&null!==n&&n.memoizedState.isDehydrated)try{Ep(t.containerInfo)}catch(h){uu(e,e.return,h)}kc&&(kc=!1,Lc(e));break;case 4:r=Tc,Tc=xd(e.stateNode.containerInfo),Pc(t,e),Nc(e),Tc=r;break;case 12:default:Pc(t,e),Nc(e);break;case 13:Pc(t,e),Nc(e),8192&e.child.flags&&null!==e.memoizedState!=(null!==n&&null!==n.memoizedState)&&(kl=te()),4&r&&(null!==(r=e.updateQueue)&&(e.updateQueue=null,Dc(e,r)));break;case 22:o=null!==e.memoizedState;var l=null!==n&&null!==n.memoizedState,u=vc,d=_c;if(vc=u||o,_c=d||l,Pc(t,e),_c=d,vc=u,Nc(e),8192&r)e:for(t=e.stateNode,t._visibility=o?-2&t._visibility:1|t._visibility,o&&(null===n||l||vc||_c||Fc(e)),n=null,t=e;;){if(5===t.tag||26===t.tag){if(null===n){l=n=t;try{if(a=l.stateNode,o)"function"==typeof(i=a.style).setProperty?i.setProperty("display","none","important"):i.display="none";else{c=l.stateNode;var p=l.memoizedProps.style,f=null!=p&&p.hasOwnProperty("display")?p.display:null;c.style.display=null==f||"boolean"==typeof f?"":(""+f).trim()}}catch(h){uu(l,l.return,h)}}}else if(6===t.tag){if(null===n){l=t;try{l.stateNode.nodeValue=o?"":l.memoizedProps}catch(h){uu(l,l.return,h)}}}else if((22!==t.tag&&23!==t.tag||null===t.memoizedState||t===e)&&null!==t.child){t.child.return=t,t=t.child;continue}if(t===e)break e;for(;null===t.sibling;){if(null===t.return||t.return===e)break e;n===t&&(n=null),t=t.return}n===t&&(n=null),t.sibling.return=t.return,t=t.sibling}4&r&&(null!==(r=e.updateQueue)&&(null!==(n=r.retryQueue)&&(r.retryQueue=null,Dc(e,n))));break;case 19:Pc(t,e),Nc(e),4&r&&(null!==(r=e.updateQueue)&&(e.updateQueue=null,Dc(e,r)));case 30:case 21:}}function Nc(e){var t=e.flags;if(2&t){try{for(var n,r=e.return;null!==r;){if(hc(r)){n=r;break}r=r.return}if(null==n)throw Error(s(160));switch(n.tag){case 27:var o=n.stateNode;bc(e,mc(e),o);break;case 5:var a=n.stateNode;32&n.flags&&(wt(a,""),n.flags&=-33),bc(e,mc(e),a);break;case 3:case 4:var i=n.stateNode.containerInfo;gc(e,mc(e),i);break;default:throw Error(s(161))}}catch(c){uu(e,e.return,c)}e.flags&=-3}4096&t&&(e.flags&=-4097)}function Lc(e){if(1024&e.subtreeFlags)for(e=e.child;null!==e;){var t=e;Lc(t),5===t.tag&&1024&t.flags&&t.stateNode.reset(),e=e.sibling}}function Rc(e,t){if(8772&t.subtreeFlags)for(t=t.child;null!==t;)xc(e,t.alternate,t),t=t.sibling}function Fc(e){for(e=e.child;null!==e;){var t=e;switch(t.tag){case 0:case 11:case 14:case 15:ic(4,t,t.return),Fc(t);break;case 1:dc(t,t.return);var n=t.stateNode;"function"==typeof n.componentWillUnmount&&lc(t,t.return,n),Fc(t);break;case 27:kd(t.stateNode);case 26:case 5:dc(t,t.return),Fc(t);break;case 22:null===t.memoizedState&&Fc(t);break;default:Fc(t)}e=e.sibling}}function zc(e,t,n){for(n=n&&!!(8772&t.subtreeFlags),t=t.child;null!==t;){var r=t.alternate,o=e,a=t,s=a.flags;switch(a.tag){case 0:case 11:case 15:zc(o,a,n),sc(4,a);break;case 1:if(zc(o,a,n),"function"==typeof(o=(r=a).stateNode).componentDidMount)try{o.componentDidMount()}catch(l){uu(r,r.return,l)}if(null!==(o=(r=a).updateQueue)){var i=r.stateNode;try{var c=o.shared.hiddenCallbacks;if(null!==c)for(o.shared.hiddenCallbacks=null,o=0;o<c.length;o++)pa(c[o],i)}catch(l){uu(r,r.return,l)}}n&&64&s&&cc(a),uc(a,a.return);break;case 27:yc(a);case 26:case 5:zc(o,a,n),n&&null===r&&4&s&&pc(a),uc(a,a.return);break;case 12:zc(o,a,n);break;case 13:zc(o,a,n),n&&4&s&&jc(o,a);break;case 22:null===a.memoizedState&&zc(o,a,n),uc(a,a.return);break;case 30:break;default:zc(o,a,n)}t=t.sibling}}function Bc(e,t){var n=null;null!==e&&null!==e.memoizedState&&null!==e.memoizedState.cachePool&&(n=e.memoizedState.cachePool.pool),e=null,null!==t.memoizedState&&null!==t.memoizedState.cachePool&&(e=t.memoizedState.cachePool.pool),e!==n&&(null!=e&&e.refCount++,null!=n&&No(n))}function $c(e,t){e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&No(e))}function Uc(e,t,n,r){if(10256&t.subtreeFlags)for(t=t.child;null!==t;)qc(e,t,n,r),t=t.sibling}function qc(e,t,n,r){var o=t.flags;switch(t.tag){case 0:case 11:case 15:Uc(e,t,n,r),2048&o&&sc(9,t);break;case 1:case 13:default:Uc(e,t,n,r);break;case 3:Uc(e,t,n,r),2048&o&&(e=null,null!==t.alternate&&(e=t.alternate.memoizedState.cache),(t=t.memoizedState.cache)!==e&&(t.refCount++,null!=e&&No(e)));break;case 12:if(2048&o){Uc(e,t,n,r),e=t.stateNode;try{var a=t.memoizedProps,s=a.id,i=a.onPostCommit;"function"==typeof i&&i(s,null===t.alternate?"mount":"update",e.passiveEffectDuration,-0)}catch(c){uu(t,t.return,c)}}else Uc(e,t,n,r);break;case 23:break;case 22:a=t.stateNode,s=t.alternate,null!==t.memoizedState?2&a._visibility?Uc(e,t,n,r):Vc(e,t):2&a._visibility?Uc(e,t,n,r):(a._visibility|=2,Hc(e,t,n,r,!!(10256&t.subtreeFlags))),2048&o&&Bc(s,t);break;case 24:Uc(e,t,n,r),2048&o&&$c(t.alternate,t)}}function Hc(e,t,n,r,o){for(o=o&&!!(10256&t.subtreeFlags),t=t.child;null!==t;){var a=e,s=t,i=n,c=r,l=s.flags;switch(s.tag){case 0:case 11:case 15:Hc(a,s,i,c,o),sc(8,s);break;case 23:break;case 22:var u=s.stateNode;null!==s.memoizedState?2&u._visibility?Hc(a,s,i,c,o):Vc(a,s):(u._visibility|=2,Hc(a,s,i,c,o)),o&&2048&l&&Bc(s.alternate,s);break;case 24:Hc(a,s,i,c,o),o&&2048&l&&$c(s.alternate,s);break;default:Hc(a,s,i,c,o)}t=t.sibling}}function Vc(e,t){if(10256&t.subtreeFlags)for(t=t.child;null!==t;){var n=e,r=t,o=r.flags;switch(r.tag){case 22:Vc(n,r),2048&o&&Bc(r.alternate,r);break;case 24:Vc(n,r),2048&o&&$c(r.alternate,r);break;default:Vc(n,r)}t=t.sibling}}var Wc=8192;function Gc(e){if(e.subtreeFlags&Wc)for(e=e.child;null!==e;)Kc(e),e=e.sibling}function Kc(e){switch(e.tag){case 26:Gc(e),e.flags&Wc&&null!==e.memoizedState&&function(e,t,n){if(null===Ud)throw Error(s(475));var r=Ud;if(!("stylesheet"!==t.type||"string"==typeof n.media&&!1===matchMedia(n.media).matches||4&t.state.loading)){if(null===t.instance){var o=Ad(n.href),a=e.querySelector(jd(o));if(a)return null!==(e=a._p)&&"object"==typeof e&&"function"==typeof e.then&&(r.count++,r=Hd.bind(r),e.then(r,r)),t.state.loading|=4,t.instance=a,void Ve(a);a=e.ownerDocument||e,n=Dd(n),(o=wd.get(o))&&Ld(n,o),Ve(a=a.createElement("link"));var i=a;i._p=new Promise(function(e,t){i.onload=e,i.onerror=t}),ed(a,"link",n),t.instance=a}null===r.stylesheets&&(r.stylesheets=new Map),r.stylesheets.set(t,e),(e=t.state.preload)&&!(3&t.state.loading)&&(r.count++,t=Hd.bind(r),e.addEventListener("load",t),e.addEventListener("error",t))}}(Tc,e.memoizedState,e.memoizedProps);break;case 5:default:Gc(e);break;case 3:case 4:var t=Tc;Tc=xd(e.stateNode.containerInfo),Gc(e),Tc=t;break;case 22:null===e.memoizedState&&(null!==(t=e.alternate)&&null!==t.memoizedState?(t=Wc,Wc=16777216,Gc(e),Wc=t):Gc(e))}}function Qc(e){var t=e.alternate;if(null!==t&&null!==(e=t.child)){t.child=null;do{t=e.sibling,e.sibling=null,e=t}while(null!==e)}}function Yc(e){var t=e.deletions;if(16&e.flags){if(null!==t)for(var n=0;n<t.length;n++){var r=t[n];Cc=r,Jc(r,e)}Qc(e)}if(10256&e.subtreeFlags)for(e=e.child;null!==e;)Zc(e),e=e.sibling}function Zc(e){switch(e.tag){case 0:case 11:case 15:Yc(e),2048&e.flags&&ic(9,e,e.return);break;case 3:case 12:default:Yc(e);break;case 22:var t=e.stateNode;null!==e.memoizedState&&2&t._visibility&&(null===e.return||13!==e.return.tag)?(t._visibility&=-3,Xc(e)):Yc(e)}}function Xc(e){var t=e.deletions;if(16&e.flags){if(null!==t)for(var n=0;n<t.length;n++){var r=t[n];Cc=r,Jc(r,e)}Qc(e)}for(e=e.child;null!==e;){switch((t=e).tag){case 0:case 11:case 15:ic(8,t,t.return),Xc(t);break;case 22:2&(n=t.stateNode)._visibility&&(n._visibility&=-3,Xc(t));break;default:Xc(t)}e=e.sibling}}function Jc(e,t){for(;null!==Cc;){var n=Cc;switch(n.tag){case 0:case 11:case 15:ic(8,n,t);break;case 23:case 22:if(null!==n.memoizedState&&null!==n.memoizedState.cachePool){var r=n.memoizedState.cachePool.pool;null!=r&&r.refCount++}break;case 24:No(n.memoizedState.cache)}if(null!==(r=n.child))r.return=n,Cc=r;else e:for(n=e;null!==Cc;){var o=(r=Cc).sibling,a=r.return;if(Sc(r),r===n){Cc=null;break e}if(null!==o){o.return=a,Cc=o;break e}Cc=a}}}var el={getCacheForType:function(e){var t=Eo(To),n=t.data.get(e);return void 0===n&&(n=e(),t.data.set(e,n)),n}},tl="function"==typeof WeakMap?WeakMap:Map,nl=0,rl=null,ol=null,al=0,sl=0,il=null,cl=!1,ll=!1,ul=!1,dl=0,pl=0,fl=0,hl=0,ml=0,gl=0,bl=0,yl=null,vl=null,_l=!1,kl=0,wl=1/0,Cl=null,xl=null,Sl=0,Ml=null,El=null,Ol=0,Al=0,jl=null,Dl=null,Pl=0,Tl=null;function Il(){if(2&nl&&0!==al)return al&-al;if(null!==I.T){return 0!==Fo?Fo:Au()}return je()}function Nl(){0===gl&&(gl=536870912&al&&!ao?536870912:we());var e=oi.current;return null!==e&&(e.flags|=32),gl}function Ll(e,t,n){(e!==rl||2!==sl&&9!==sl)&&null===e.cancelPendingCommit||(ql(e,0),Bl(e,al,gl,!1)),Se(e,n),2&nl&&e===rl||(e===rl&&(!(2&nl)&&(hl|=n),4===pl&&Bl(e,al,gl,!1)),wu(e))}function Rl(e,t,n){if(6&nl)throw Error(s(327));for(var r=!n&&!(124&t)&&0===(t&e.expiredLanes)||_e(e,t),o=r?function(e,t){var n=nl;nl|=2;var r=Vl(),o=Wl();rl!==e||al!==t?(Cl=null,wl=te()+500,ql(e,t)):ll=_e(e,t);e:for(;;)try{if(0!==sl&&null!==ol){t=ol;var a=il;t:switch(sl){case 1:sl=0,il=null,Jl(e,t,a,1);break;case 2:case 9:if(Yo(a)){sl=0,il=null,Xl(t);break}t=function(){2!==sl&&9!==sl||rl!==e||(sl=7),wu(e)},a.then(t,t);break e;case 3:sl=7;break e;case 4:sl=5;break e;case 7:Yo(a)?(sl=0,il=null,Xl(t)):(sl=0,il=null,Jl(e,t,a,7));break;case 5:var i=null;switch(ol.tag){case 26:i=ol.memoizedState;case 5:case 27:var c=ol;if(!i||$d(i)){sl=0,il=null;var l=c.sibling;if(null!==l)ol=l;else{var u=c.return;null!==u?(ol=u,eu(u)):ol=null}break t}}sl=0,il=null,Jl(e,t,a,5);break;case 6:sl=0,il=null,Jl(e,t,a,6);break;case 8:Ul(),pl=6;break e;default:throw Error(s(462))}}Yl();break}catch(d){Hl(e,d)}return vo=yo=null,I.H=r,I.A=o,nl=n,null!==ol?0:(rl=null,al=0,Or(),pl)}(e,t):Kl(e,t,!0),a=r;;){if(0===o){ll&&!r&&Bl(e,t,0,!1);break}if(n=e.current.alternate,!a||zl(n)){if(2===o){if(a=t,e.errorRecoveryDisabledLanes&a)var i=0;else i=0!==(i=-536870913&e.pendingLanes)?i:536870912&i?536870912:0;if(0!==i){t=i;e:{var c=e;o=yl;var l=c.current.memoizedState.isDehydrated;if(l&&(ql(c,i).flags|=256),2!==(i=Kl(c,i,!1))){if(ul&&!l){c.errorRecoveryDisabledLanes|=a,hl|=a,o=4;break e}a=vl,vl=o,null!==a&&(null===vl?vl=a:vl.push.apply(vl,a))}o=i}if(a=!1,2!==o)continue}}if(1===o){ql(e,0),Bl(e,t,0,!0);break}e:{switch(r=e,a=o){case 0:case 1:throw Error(s(345));case 4:if((4194048&t)!==t)break;case 6:Bl(r,t,gl,!cl);break e;case 2:vl=null;break;case 3:case 5:break;default:throw Error(s(329))}if((62914560&t)===t&&10<(o=kl+300-te())){if(Bl(r,t,gl,!cl),0!==ve(r,0,!0))break e;r.timeoutHandle=cd(Fl.bind(null,r,n,vl,Cl,_l,t,gl,hl,bl,cl,a,2,-0,0),o)}else Fl(r,n,vl,Cl,_l,t,gl,hl,bl,cl,a,0,-0,0)}break}o=Kl(e,t,!1),a=!1}wu(e)}function Fl(e,t,n,r,o,a,i,c,l,u,d,p,f,h){if(e.timeoutHandle=-1,(8192&(p=t.subtreeFlags)||!(16785408&~p))&&(Ud={stylesheets:null,count:0,unsuspend:qd},Kc(t),null!==(p=function(){if(null===Ud)throw Error(s(475));var e=Ud;return e.stylesheets&&0===e.count&&Wd(e,e.stylesheets),0<e.count?function(t){var n=setTimeout(function(){if(e.stylesheets&&Wd(e,e.stylesheets),e.unsuspend){var t=e.unsuspend;e.unsuspend=null,t()}},6e4);return e.unsuspend=t,function(){e.unsuspend=null,clearTimeout(n)}}:null}())))return e.cancelPendingCommit=p(nu.bind(null,e,t,a,n,r,o,i,c,l,d,1,f,h)),void Bl(e,a,i,!u);nu(e,t,a,n,r,o,i,c,l)}function zl(e){for(var t=e;;){var n=t.tag;if((0===n||11===n||15===n)&&16384&t.flags&&(null!==(n=t.updateQueue)&&null!==(n=n.stores)))for(var r=0;r<n.length;r++){var o=n[r],a=o.getSnapshot;o=o.value;try{if(!Qn(a(),o))return!1}catch(s){return!1}}if(n=t.child,16384&t.subtreeFlags&&null!==n)n.return=t,t=n;else{if(t===e)break;for(;null===t.sibling;){if(null===t.return||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Bl(e,t,n,r){t&=~ml,t&=~hl,e.suspendedLanes|=t,e.pingedLanes&=~t,r&&(e.warmLanes|=t),r=e.expirationTimes;for(var o=t;0<o;){var a=31-fe(o),s=1<<a;r[a]=-1,o&=~s}0!==n&&Me(e,n,t)}function $l(){return!!(6&nl)||(Cu(0,!1),!1)}function Ul(){if(null!==ol){if(0===sl)var e=ol.return;else vo=yo=null,Fa(e=ol),Qs=null,Ys=0,e=ol;for(;null!==e;)ac(e.alternate,e),e=e.return;ol=null}}function ql(e,t){var n=e.timeoutHandle;-1!==n&&(e.timeoutHandle=-1,ld(n)),null!==(n=e.cancelPendingCommit)&&(e.cancelPendingCommit=null,n()),Ul(),rl=e,ol=n=Fr(e.current,null),al=t,sl=0,il=null,cl=!1,ll=_e(e,t),ul=!1,bl=gl=ml=hl=fl=pl=0,vl=yl=null,_l=!1,8&t&&(t|=32&t);var r=e.entangledLanes;if(0!==r)for(e=e.entanglements,r&=t;0<r;){var o=31-fe(r),a=1<<o;t|=e[o],r&=~a}return dl=t,Or(),n}function Hl(e,t){_a=null,I.H=Vs,t===Wo||t===Ko?(t=ea(),sl=3):t===Go?(t=ea(),sl=4):sl=t===Mi?8:null!==t&&"object"==typeof t&&"function"==typeof t.then?6:1,il=t,null===ol&&(pl=1,ki(e,xr(t,e.current)))}function Vl(){var e=I.H;return I.H=Vs,null===e?Vs:e}function Wl(){var e=I.A;return I.A=el,e}function Gl(){pl=4,cl||(4194048&al)!==al&&null!==oi.current||(ll=!0),!(134217727&fl)&&!(134217727&hl)||null===rl||Bl(rl,al,gl,!1)}function Kl(e,t,n){var r=nl;nl|=2;var o=Vl(),a=Wl();rl===e&&al===t||(Cl=null,ql(e,t)),t=!1;var s=pl;e:for(;;)try{if(0!==sl&&null!==ol){var i=ol,c=il;switch(sl){case 8:Ul(),s=6;break e;case 3:case 2:case 9:case 6:null===oi.current&&(t=!0);var l=sl;if(sl=0,il=null,Jl(e,i,c,l),n&&ll){s=0;break e}break;default:l=sl,sl=0,il=null,Jl(e,i,c,l)}}Ql(),s=pl;break}catch(u){Hl(e,u)}return t&&e.shellSuspendCounter++,vo=yo=null,nl=r,I.H=o,I.A=a,null===ol&&(rl=null,al=0,Or()),s}function Ql(){for(;null!==ol;)Zl(ol)}function Yl(){for(;null!==ol&&!J();)Zl(ol)}function Zl(e){var t=Zi(e.alternate,e,dl);e.memoizedProps=e.pendingProps,null===t?eu(e):ol=t}function Xl(e){var t=e,n=t.alternate;switch(t.tag){case 15:case 0:t=Li(n,t,t.pendingProps,t.type,void 0,al);break;case 11:t=Li(n,t,t.pendingProps,t.type.render,t.ref,al);break;case 5:Fa(t);default:ac(n,t),t=Zi(n,t=ol=zr(t,dl),dl)}e.memoizedProps=e.pendingProps,null===t?eu(e):ol=t}function Jl(e,t,n,r){vo=yo=null,Fa(t),Qs=null,Ys=0;var o=t.return;try{if(function(e,t,n,r,o){if(n.flags|=32768,null!==r&&"object"==typeof r&&"function"==typeof r.then){if(null!==(t=n.alternate)&&xo(t,n,o,!0),null!==(n=oi.current)){switch(n.tag){case 13:return null===ai?Gl():null===n.alternate&&0===pl&&(pl=3),n.flags&=-257,n.flags|=65536,n.lanes=o,r===Qo?n.flags|=16384:(null===(t=n.updateQueue)?n.updateQueue=new Set([r]):t.add(r),du(e,r,o)),!1;case 22:return n.flags|=65536,r===Qo?n.flags|=16384:(null===(t=n.updateQueue)?(t={transitions:null,markerInstances:null,retryQueue:new Set([r])},n.updateQueue=t):null===(n=t.retryQueue)?t.retryQueue=new Set([r]):n.add(r),du(e,r,o)),!1}throw Error(s(435,n.tag))}return du(e,r,o),Gl(),!1}if(ao)return null!==(t=oi.current)?(!(65536&t.flags)&&(t.flags|=256),t.flags|=65536,t.lanes=o,r!==co&&go(xr(e=Error(s(422),{cause:r}),n))):(r!==co&&go(xr(t=Error(s(423),{cause:r}),n)),(e=e.current.alternate).flags|=65536,o&=-o,e.lanes|=o,r=xr(r,n),ca(e,o=Ci(e.stateNode,r,o)),4!==pl&&(pl=2)),!1;var a=Error(s(520),{cause:r});if(a=xr(a,n),null===yl?yl=[a]:yl.push(a),4!==pl&&(pl=2),null===t)return!0;r=xr(r,n),n=t;do{switch(n.tag){case 3:return n.flags|=65536,e=o&-o,n.lanes|=e,ca(n,e=Ci(n.stateNode,r,e)),!1;case 1:if(t=n.type,a=n.stateNode,!(128&n.flags||"function"!=typeof t.getDerivedStateFromError&&(null===a||"function"!=typeof a.componentDidCatch||null!==xl&&xl.has(a))))return n.flags|=65536,o&=-o,n.lanes|=o,Si(o=xi(o),e,n,r),ca(n,o),!1}n=n.return}while(null!==n);return!1}(e,o,t,n,al))return pl=1,ki(e,xr(n,e.current)),void(ol=null)}catch(a){if(null!==o)throw ol=o,a;return pl=1,ki(e,xr(n,e.current)),void(ol=null)}32768&t.flags?(ao||1===r?e=!0:ll||536870912&al?e=!1:(cl=e=!0,(2===r||9===r||3===r||6===r)&&(null!==(r=oi.current)&&13===r.tag&&(r.flags|=16384))),tu(t,e)):eu(t)}function eu(e){var t=e;do{if(32768&t.flags)return void tu(t,cl);e=t.return;var n=rc(t.alternate,t,dl);if(null!==n)return void(ol=n);if(null!==(t=t.sibling))return void(ol=t);ol=t=e}while(null!==t);0===pl&&(pl=5)}function tu(e,t){do{var n=oc(e.alternate,e);if(null!==n)return n.flags&=32767,void(ol=n);if(null!==(n=e.return)&&(n.flags|=32768,n.subtreeFlags=0,n.deletions=null),!t&&null!==(e=e.sibling))return void(ol=e);ol=e=n}while(null!==e);pl=6,ol=null}function nu(e,t,n,r,o,a,i,c,l){e.cancelPendingCommit=null;do{iu()}while(0!==Sl);if(6&nl)throw Error(s(327));if(null!==t){if(t===e.current)throw Error(s(177));if(a=t.lanes|t.childLanes,function(e,t,n,r,o,a){var s=e.pendingLanes;e.pendingLanes=n,e.suspendedLanes=0,e.pingedLanes=0,e.warmLanes=0,e.expiredLanes&=n,e.entangledLanes&=n,e.errorRecoveryDisabledLanes&=n,e.shellSuspendCounter=0;var i=e.entanglements,c=e.expirationTimes,l=e.hiddenUpdates;for(n=s&~n;0<n;){var u=31-fe(n),d=1<<u;i[u]=0,c[u]=-1;var p=l[u];if(null!==p)for(l[u]=null,u=0;u<p.length;u++){var f=p[u];null!==f&&(f.lane&=-536870913)}n&=~d}0!==r&&Me(e,r,0),0!==a&&0===o&&0!==e.tag&&(e.suspendedLanes|=a&~(s&~t))}(e,n,a|=Er,i,c,l),e===rl&&(ol=rl=null,al=0),El=t,Ml=e,Ol=n,Al=a,jl=o,Dl=r,10256&t.subtreeFlags||10256&t.flags?(e.callbackNode=null,e.callbackPriority=0,Z(ae,function(){return cu(),null})):(e.callbackNode=null,e.callbackPriority=0),r=!!(13878&t.flags),13878&t.subtreeFlags||r){r=I.T,I.T=null,o=N.p,N.p=2,i=nl,nl|=4;try{!function(e,t){if(e=e.containerInfo,td=np,tr(e=er(e))){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{var r=(n=(n=e.ownerDocument)&&n.defaultView||window).getSelection&&n.getSelection();if(r&&0!==r.rangeCount){n=r.anchorNode;var o=r.anchorOffset,a=r.focusNode;r=r.focusOffset;try{n.nodeType,a.nodeType}catch(g){n=null;break e}var i=0,c=-1,l=-1,u=0,d=0,p=e,f=null;t:for(;;){for(var h;p!==n||0!==o&&3!==p.nodeType||(c=i+o),p!==a||0!==r&&3!==p.nodeType||(l=i+r),3===p.nodeType&&(i+=p.nodeValue.length),null!==(h=p.firstChild);)f=p,p=h;for(;;){if(p===e)break t;if(f===n&&++u===o&&(c=i),f===a&&++d===r&&(l=i),null!==(h=p.nextSibling))break;f=(p=f).parentNode}p=h}n=-1===c||-1===l?null:{start:c,end:l}}else n=null}n=n||{start:0,end:0}}else n=null;for(nd={focusedElem:e,selectionRange:n},np=!1,Cc=t;null!==Cc;)if(e=(t=Cc).child,1024&t.subtreeFlags&&null!==e)e.return=t,Cc=e;else for(;null!==Cc;){switch(a=(t=Cc).alternate,e=t.flags,t.tag){case 0:case 11:case 15:case 5:case 26:case 27:case 6:case 4:case 17:break;case 1:if(1024&e&&null!==a){e=void 0,n=t,o=a.memoizedProps,a=a.memoizedState,r=n.stateNode;try{var m=gi(n.type,o,(n.elementType,n.type));e=r.getSnapshotBeforeUpdate(m,a),r.__reactInternalSnapshotBeforeUpdate=e}catch(b){uu(n,n.return,b)}}break;case 3:if(1024&e)if(9===(n=(e=t.stateNode.containerInfo).nodeType))md(e);else if(1===n)switch(e.nodeName){case"HEAD":case"HTML":case"BODY":md(e);break;default:e.textContent=""}break;default:if(1024&e)throw Error(s(163))}if(null!==(e=t.sibling)){e.return=t.return,Cc=e;break}Cc=t.return}}(e,t)}finally{nl=i,N.p=o,I.T=r}}Sl=1,ru(),ou(),au()}}function ru(){if(1===Sl){Sl=0;var e=Ml,t=El,n=!!(13878&t.flags);if(13878&t.subtreeFlags||n){n=I.T,I.T=null;var r=N.p;N.p=2;var o=nl;nl|=4;try{Ic(t,e);var a=nd,s=er(e.containerInfo),i=a.focusedElem,c=a.selectionRange;if(s!==i&&i&&i.ownerDocument&&Jn(i.ownerDocument.documentElement,i)){if(null!==c&&tr(i)){var l=c.start,u=c.end;if(void 0===u&&(u=l),"selectionStart"in i)i.selectionStart=l,i.selectionEnd=Math.min(u,i.value.length);else{var d=i.ownerDocument||document,p=d&&d.defaultView||window;if(p.getSelection){var f=p.getSelection(),h=i.textContent.length,m=Math.min(c.start,h),g=void 0===c.end?m:Math.min(c.end,h);!f.extend&&m>g&&(s=g,g=m,m=s);var b=Xn(i,m),y=Xn(i,g);if(b&&y&&(1!==f.rangeCount||f.anchorNode!==b.node||f.anchorOffset!==b.offset||f.focusNode!==y.node||f.focusOffset!==y.offset)){var v=d.createRange();v.setStart(b.node,b.offset),f.removeAllRanges(),m>g?(f.addRange(v),f.extend(y.node,y.offset)):(v.setEnd(y.node,y.offset),f.addRange(v))}}}}for(d=[],f=i;f=f.parentNode;)1===f.nodeType&&d.push({element:f,left:f.scrollLeft,top:f.scrollTop});for("function"==typeof i.focus&&i.focus(),i=0;i<d.length;i++){var _=d[i];_.element.scrollLeft=_.left,_.element.scrollTop=_.top}}np=!!td,nd=td=null}finally{nl=o,N.p=r,I.T=n}}e.current=t,Sl=2}}function ou(){if(2===Sl){Sl=0;var e=Ml,t=El,n=!!(8772&t.flags);if(8772&t.subtreeFlags||n){n=I.T,I.T=null;var r=N.p;N.p=2;var o=nl;nl|=4;try{xc(e,t.alternate,t)}finally{nl=o,N.p=r,I.T=n}}Sl=3}}function au(){if(4===Sl||3===Sl){Sl=0,ee();var e=Ml,t=El,n=Ol,r=Dl;10256&t.subtreeFlags||10256&t.flags?Sl=5:(Sl=0,El=Ml=null,su(e,e.pendingLanes));var o=e.pendingLanes;if(0===o&&(xl=null),Ae(n),t=t.stateNode,de&&"function"==typeof de.onCommitFiberRoot)try{de.onCommitFiberRoot(ue,t,void 0,!(128&~t.current.flags))}catch(c){}if(null!==r){t=I.T,o=N.p,N.p=2,I.T=null;try{for(var a=e.onRecoverableError,s=0;s<r.length;s++){var i=r[s];a(i.value,{componentStack:i.stack})}}finally{I.T=t,N.p=o}}3&Ol&&iu(),wu(e),o=e.pendingLanes,4194090&n&&42&o?e===Tl?Pl++:(Pl=0,Tl=e):Pl=0,Cu(0,!1)}}function su(e,t){0===(e.pooledCacheLanes&=t)&&(null!=(t=e.pooledCache)&&(e.pooledCache=null,No(t)))}function iu(e){return ru(),ou(),au(),cu()}function cu(){if(5!==Sl)return!1;var e=Ml,t=Al;Al=0;var n=Ae(Ol),r=I.T,o=N.p;try{N.p=32>n?32:n,I.T=null,n=jl,jl=null;var a=Ml,i=Ol;if(Sl=0,El=Ml=null,Ol=0,6&nl)throw Error(s(331));var c=nl;if(nl|=4,Zc(a.current),qc(a,a.current,i,n),nl=c,Cu(0,!1),de&&"function"==typeof de.onPostCommitFiberRoot)try{de.onPostCommitFiberRoot(ue,a)}catch(l){}return!0}finally{N.p=o,I.T=r,su(e,t)}}function lu(e,t,n){t=xr(n,t),null!==(e=sa(e,t=Ci(e.stateNode,t,2),2))&&(Se(e,2),wu(e))}function uu(e,t,n){if(3===e.tag)lu(e,e,n);else for(;null!==t;){if(3===t.tag){lu(t,e,n);break}if(1===t.tag){var r=t.stateNode;if("function"==typeof t.type.getDerivedStateFromError||"function"==typeof r.componentDidCatch&&(null===xl||!xl.has(r))){e=xr(n,e),null!==(r=sa(t,n=xi(2),2))&&(Si(n,r,t,e),Se(r,2),wu(r));break}}t=t.return}}function du(e,t,n){var r=e.pingCache;if(null===r){r=e.pingCache=new tl;var o=new Set;r.set(t,o)}else void 0===(o=r.get(t))&&(o=new Set,r.set(t,o));o.has(n)||(ul=!0,o.add(n),e=pu.bind(null,e,t,n),t.then(e,e))}function pu(e,t,n){var r=e.pingCache;null!==r&&r.delete(t),e.pingedLanes|=e.suspendedLanes&n,e.warmLanes&=~n,rl===e&&(al&n)===n&&(4===pl||3===pl&&(62914560&al)===al&&300>te()-kl?!(2&nl)&&ql(e,0):ml|=n,bl===al&&(bl=0)),wu(e)}function fu(e,t){0===t&&(t=Ce()),null!==(e=Dr(e,t))&&(Se(e,t),wu(e))}function hu(e){var t=e.memoizedState,n=0;null!==t&&(n=t.retryLane),fu(e,n)}function mu(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;null!==o&&(n=o.retryLane);break;case 19:r=e.stateNode;break;case 22:r=e.stateNode._retryCache;break;default:throw Error(s(314))}null!==r&&r.delete(t),fu(e,n)}var gu=null,bu=null,yu=!1,vu=!1,_u=!1,ku=0;function wu(e){e!==bu&&null===e.next&&(null===bu?gu=bu=e:bu=bu.next=e),vu=!0,yu||(yu=!0,dd(function(){6&nl?Z(re,xu):Su()}))}function Cu(e,t){if(!_u&&vu){_u=!0;do{for(var n=!1,r=gu;null!==r;){if(!t)if(0!==e){var o=r.pendingLanes;if(0===o)var a=0;else{var s=r.suspendedLanes,i=r.pingedLanes;a=(1<<31-fe(42|e)+1)-1,a=201326741&(a&=o&~(s&~i))?201326741&a|1:a?2|a:0}0!==a&&(n=!0,Ou(r,a))}else a=al,!(3&(a=ve(r,r===rl?a:0,null!==r.cancelPendingCommit||-1!==r.timeoutHandle)))||_e(r,a)||(n=!0,Ou(r,a));r=r.next}}while(n);_u=!1}}function xu(){Su()}function Su(){vu=yu=!1;var e=0;0!==ku&&(function(){var e=window.event;if(e&&"popstate"===e.type)return e!==id&&(id=e,!0);return id=null,!1}()&&(e=ku),ku=0);for(var t=te(),n=null,r=gu;null!==r;){var o=r.next,a=Mu(r,t);0===a?(r.next=null,null===n?gu=o:n.next=o,null===o&&(bu=n)):(n=r,(0!==e||3&a)&&(vu=!0)),r=o}Cu(e,!1)}function Mu(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,o=e.expirationTimes,a=-62914561&e.pendingLanes;0<a;){var s=31-fe(a),i=1<<s,c=o[s];-1===c?0!==(i&n)&&0===(i&r)||(o[s]=ke(i,t)):c<=t&&(e.expiredLanes|=i),a&=~i}if(n=al,n=ve(e,e===(t=rl)?n:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle),r=e.callbackNode,0===n||e===t&&(2===sl||9===sl)||null!==e.cancelPendingCommit)return null!==r&&null!==r&&X(r),e.callbackNode=null,e.callbackPriority=0;if(!(3&n)||_e(e,n)){if((t=n&-n)===e.callbackPriority)return t;switch(null!==r&&X(r),Ae(n)){case 2:case 8:n=oe;break;case 32:default:n=ae;break;case 268435456:n=ie}return r=Eu.bind(null,e),n=Z(n,r),e.callbackPriority=t,e.callbackNode=n,t}return null!==r&&null!==r&&X(r),e.callbackPriority=2,e.callbackNode=null,2}function Eu(e,t){if(0!==Sl&&5!==Sl)return e.callbackNode=null,e.callbackPriority=0,null;var n=e.callbackNode;if(iu()&&e.callbackNode!==n)return null;var r=al;return 0===(r=ve(e,e===rl?r:0,null!==e.cancelPendingCommit||-1!==e.timeoutHandle))?null:(Rl(e,r,t),Mu(e,te()),null!=e.callbackNode&&e.callbackNode===n?Eu.bind(null,e):null)}function Ou(e,t){if(iu())return null;Rl(e,t,!0)}function Au(){return 0===ku&&(ku=we()),ku}function ju(e){return null==e||"symbol"==typeof e||"boolean"==typeof e?null:"function"==typeof e?e:At(""+e)}function Du(e,t){var n=t.ownerDocument.createElement("input");return n.name=t.name,n.value=t.value,e.id&&n.setAttribute("form",e.id),t.parentNode.insertBefore(n,t),e=new FormData(e),n.parentNode.removeChild(n),e}for(var Pu=0;Pu<kr.length;Pu++){var Tu=kr[Pu];wr(Tu.toLowerCase(),"on"+(Tu[0].toUpperCase()+Tu.slice(1)))}wr(fr,"onAnimationEnd"),wr(hr,"onAnimationIteration"),wr(mr,"onAnimationStart"),wr("dblclick","onDoubleClick"),wr("focusin","onFocus"),wr("focusout","onBlur"),wr(gr,"onTransitionRun"),wr(br,"onTransitionStart"),wr(yr,"onTransitionCancel"),wr(vr,"onTransitionEnd"),Qe("onMouseEnter",["mouseout","mouseover"]),Qe("onMouseLeave",["mouseout","mouseover"]),Qe("onPointerEnter",["pointerout","pointerover"]),Qe("onPointerLeave",["pointerout","pointerover"]),Ke("onChange","change click focusin focusout input keydown keyup selectionchange".split(" ")),Ke("onSelect","focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange".split(" ")),Ke("onBeforeInput",["compositionend","keypress","textInput","paste"]),Ke("onCompositionEnd","compositionend focusout keydown keypress keyup mousedown".split(" ")),Ke("onCompositionStart","compositionstart focusout keydown keypress keyup mousedown".split(" ")),Ke("onCompositionUpdate","compositionupdate focusout keydown keypress keyup mousedown".split(" "));var Iu="abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting".split(" "),Nu=new Set("beforetoggle cancel close invalid load scroll scrollend toggle".split(" ").concat(Iu));function Lu(e,t){t=!!(4&t);for(var n=0;n<e.length;n++){var r=e[n],o=r.event;r=r.listeners;e:{var a=void 0;if(t)for(var s=r.length-1;0<=s;s--){var i=r[s],c=i.instance,l=i.currentTarget;if(i=i.listener,c!==a&&o.isPropagationStopped())break e;a=i,o.currentTarget=l;try{a(o)}catch(u){bi(u)}o.currentTarget=null,a=c}else for(s=0;s<r.length;s++){if(c=(i=r[s]).instance,l=i.currentTarget,i=i.listener,c!==a&&o.isPropagationStopped())break e;a=i,o.currentTarget=l;try{a(o)}catch(u){bi(u)}o.currentTarget=null,a=c}}}}function Ru(e,t){var n=t[Ne];void 0===n&&(n=t[Ne]=new Set);var r=e+"__bubble";n.has(r)||($u(t,e,2,!1),n.add(r))}function Fu(e,t,n){var r=0;t&&(r|=4),$u(n,e,r,t)}var zu="_reactListening"+Math.random().toString(36).slice(2);function Bu(e){if(!e[zu]){e[zu]=!0,We.forEach(function(t){"selectionchange"!==t&&(Nu.has(t)||Fu(t,!1,e),Fu(t,!0,e))});var t=9===e.nodeType?e:e.ownerDocument;null===t||t[zu]||(t[zu]=!0,Fu("selectionchange",!1,t))}}function $u(e,t,n,r){switch(lp(t)){case 2:var o=rp;break;case 8:o=op;break;default:o=ap}n=o.bind(null,t,n,e),o=void 0,!zt||"touchstart"!==t&&"touchmove"!==t&&"wheel"!==t||(o=!0),r?void 0!==o?e.addEventListener(t,n,{capture:!0,passive:o}):e.addEventListener(t,n,!0):void 0!==o?e.addEventListener(t,n,{passive:o}):e.addEventListener(t,n,!1)}function Uu(e,t,n,r,o){var a=r;if(!(1&t||2&t||null===r))e:for(;;){if(null===r)return;var s=r.tag;if(3===s||4===s){var i=r.stateNode.containerInfo;if(i===o)break;if(4===s)for(s=r.return;null!==s;){var l=s.tag;if((3===l||4===l)&&s.stateNode.containerInfo===o)return;s=s.return}for(;null!==i;){if(null===(s=$e(i)))return;if(5===(l=s.tag)||6===l||26===l||27===l){r=a=s;continue e}i=i.parentNode}}r=r.return}Lt(function(){var r=a,o=Dt(n),s=[];e:{var i=_r.get(e);if(void 0!==i){var l=Jt,u=e;switch(e){case"keypress":if(0===Vt(n))break e;case"keydown":case"keyup":l=mn;break;case"focusin":u="focus",l=an;break;case"focusout":u="blur",l=an;break;case"beforeblur":case"afterblur":l=an;break;case"click":if(2===n.button)break e;case"auxclick":case"dblclick":case"mousedown":case"mousemove":case"mouseup":case"mouseout":case"mouseover":case"contextmenu":l=rn;break;case"drag":case"dragend":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"dragstart":case"drop":l=on;break;case"touchcancel":case"touchend":case"touchmove":case"touchstart":l=bn;break;case fr:case hr:case mr:l=sn;break;case vr:l=yn;break;case"scroll":case"scrollend":l=tn;break;case"wheel":l=vn;break;case"copy":case"cut":case"paste":l=cn;break;case"gotpointercapture":case"lostpointercapture":case"pointercancel":case"pointerdown":case"pointermove":case"pointerout":case"pointerover":case"pointerup":l=gn;break;case"toggle":case"beforetoggle":l=_n}var d=!!(4&t),p=!d&&("scroll"===e||"scrollend"===e),f=d?null!==i?i+"Capture":null:i;d=[];for(var h,m=r;null!==m;){var g=m;if(h=g.stateNode,5!==(g=g.tag)&&26!==g&&27!==g||null===h||null===f||null!=(g=Rt(m,f))&&d.push(qu(m,g,h)),p)break;m=m.return}0<d.length&&(i=new l(i,u,null,n,o),s.push({event:i,listeners:d}))}}if(!(7&t)){if(l="mouseout"===e||"pointerout"===e,(!(i="mouseover"===e||"pointerover"===e)||n===jt||!(u=n.relatedTarget||n.fromElement)||!$e(u)&&!u[Ie])&&(l||i)&&(i=o.window===o?o:(i=o.ownerDocument)?i.defaultView||i.parentWindow:window,l?(l=r,null!==(u=(u=n.relatedTarget||n.toElement)?$e(u):null)&&(p=c(u),d=u.tag,u!==p||5!==d&&27!==d&&6!==d)&&(u=null)):(l=null,u=r),l!==u)){if(d=rn,g="onMouseLeave",f="onMouseEnter",m="mouse","pointerout"!==e&&"pointerover"!==e||(d=gn,g="onPointerLeave",f="onPointerEnter",m="pointer"),p=null==l?i:qe(l),h=null==u?i:qe(u),(i=new d(g,m+"leave",l,n,o)).target=p,i.relatedTarget=h,g=null,$e(o)===r&&((d=new d(f,m+"enter",u,n,o)).target=h,d.relatedTarget=p,g=d),p=g,l&&u)e:{for(f=u,m=0,h=d=l;h;h=Vu(h))m++;for(h=0,g=f;g;g=Vu(g))h++;for(;0<m-h;)d=Vu(d),m--;for(;0<h-m;)f=Vu(f),h--;for(;m--;){if(d===f||null!==f&&d===f.alternate)break e;d=Vu(d),f=Vu(f)}d=null}else d=null;null!==l&&Wu(s,i,l,d,!1),null!==u&&null!==p&&Wu(s,p,u,d,!0)}if("select"===(l=(i=r?qe(r):window).nodeName&&i.nodeName.toLowerCase())||"input"===l&&"file"===i.type)var b=Fn;else if(Pn(i))if(zn)b=Kn;else{b=Wn;var y=Vn}else!(l=i.nodeName)||"input"!==l.toLowerCase()||"checkbox"!==i.type&&"radio"!==i.type?r&&Mt(r.elementType)&&(b=Fn):b=Gn;switch(b&&(b=b(e,r))?Tn(s,b,n,o):(y&&y(e,i,r),"focusout"===e&&r&&"number"===i.type&&null!=r.memoizedProps.value&&yt(i,"number",i.value)),y=r?qe(r):window,e){case"focusin":(Pn(y)||"true"===y.contentEditable)&&(rr=y,or=r,ar=null);break;case"focusout":ar=or=rr=null;break;case"mousedown":sr=!0;break;case"contextmenu":case"mouseup":case"dragend":sr=!1,ir(s,n,o);break;case"selectionchange":if(nr)break;case"keydown":case"keyup":ir(s,n,o)}var v;if(wn)e:{switch(e){case"compositionstart":var _="onCompositionStart";break e;case"compositionend":_="onCompositionEnd";break e;case"compositionupdate":_="onCompositionUpdate";break e}_=void 0}else jn?On(e,n)&&(_="onCompositionEnd"):"keydown"===e&&229===n.keyCode&&(_="onCompositionStart");_&&(Sn&&"ko"!==n.locale&&(jn||"onCompositionStart"!==_?"onCompositionEnd"===_&&jn&&(v=Ht()):(Ut="value"in($t=o)?$t.value:$t.textContent,jn=!0)),0<(y=Hu(r,_)).length&&(_=new ln(_,e,null,n,o),s.push({event:_,listeners:y}),v?_.data=v:null!==(v=An(n))&&(_.data=v))),(v=xn?function(e,t){switch(e){case"compositionend":return An(t);case"keypress":return 32!==t.which?null:(En=!0,Mn);case"textInput":return(e=t.data)===Mn&&En?null:e;default:return null}}(e,n):function(e,t){if(jn)return"compositionend"===e||!wn&&On(e,t)?(e=Ht(),qt=Ut=$t=null,jn=!1,e):null;switch(e){case"paste":default:return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1<t.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case"compositionend":return Sn&&"ko"!==t.locale?null:t.data}}(e,n))&&(0<(_=Hu(r,"onBeforeInput")).length&&(y=new ln("onBeforeInput","beforeinput",null,n,o),s.push({event:y,listeners:_}),y.data=v)),function(e,t,n,r,o){if("submit"===t&&n&&n.stateNode===o){var a=ju((o[Te]||null).action),s=r.submitter;s&&null!==(t=(t=s[Te]||null)?ju(t.formAction):s.getAttribute("formAction"))&&(a=t,s=null);var i=new Jt("action","action",null,r,o);e.push({event:i,listeners:[{instance:null,listener:function(){if(r.defaultPrevented){if(0!==ku){var e=s?Du(o,s):new FormData(o);Ds(n,{pending:!0,data:e,method:o.method,action:a},null,e)}}else"function"==typeof a&&(i.preventDefault(),e=s?Du(o,s):new FormData(o),Ds(n,{pending:!0,data:e,method:o.method,action:a},a,e))},currentTarget:o}]})}}(s,e,r,n,o)}Lu(s,t)})}function qu(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Hu(e,t){for(var n=t+"Capture",r=[];null!==e;){var o=e,a=o.stateNode;if(5!==(o=o.tag)&&26!==o&&27!==o||null===a||(null!=(o=Rt(e,n))&&r.unshift(qu(e,o,a)),null!=(o=Rt(e,t))&&r.push(qu(e,o,a))),3===e.tag)return r;e=e.return}return[]}function Vu(e){if(null===e)return null;do{e=e.return}while(e&&5!==e.tag&&27!==e.tag);return e||null}function Wu(e,t,n,r,o){for(var a=t._reactName,s=[];null!==n&&n!==r;){var i=n,c=i.alternate,l=i.stateNode;if(i=i.tag,null!==c&&c===r)break;5!==i&&26!==i&&27!==i||null===l||(c=l,o?null!=(l=Rt(n,a))&&s.unshift(qu(n,l,c)):o||null!=(l=Rt(n,a))&&s.push(qu(n,l,c))),n=n.return}0!==s.length&&e.push({event:t,listeners:s})}var Gu=/\r\n?/g,Ku=/\u0000|\uFFFD/g;function Qu(e){return("string"==typeof e?e:""+e).replace(Gu,"\n").replace(Ku,"")}function Yu(e,t){return t=Qu(t),Qu(e)===t}function Zu(){}function Xu(e,t,n,r,o,a){switch(n){case"children":"string"==typeof r?"body"===t||"textarea"===t&&""===r||wt(e,r):("number"==typeof r||"bigint"==typeof r)&&"body"!==t&&wt(e,""+r);break;case"className":nt(e,"class",r);break;case"tabIndex":nt(e,"tabindex",r);break;case"dir":case"role":case"viewBox":case"width":case"height":nt(e,n,r);break;case"style":St(e,r,a);break;case"data":if("object"!==t){nt(e,"data",r);break}case"src":case"href":if(""===r&&("a"!==t||"href"!==n)){e.removeAttribute(n);break}if(null==r||"function"==typeof r||"symbol"==typeof r||"boolean"==typeof r){e.removeAttribute(n);break}r=At(""+r),e.setAttribute(n,r);break;case"action":case"formAction":if("function"==typeof r){e.setAttribute(n,"javascript:throw new Error('A React form was unexpectedly submitted. If you called form.submit() manually, consider using form.requestSubmit() instead. If you\\'re trying to use event.stopPropagation() in a submit event handler, consider also calling event.preventDefault().')");break}if("function"==typeof a&&("formAction"===n?("input"!==t&&Xu(e,t,"name",o.name,o,null),Xu(e,t,"formEncType",o.formEncType,o,null),Xu(e,t,"formMethod",o.formMethod,o,null),Xu(e,t,"formTarget",o.formTarget,o,null)):(Xu(e,t,"encType",o.encType,o,null),Xu(e,t,"method",o.method,o,null),Xu(e,t,"target",o.target,o,null))),null==r||"symbol"==typeof r||"boolean"==typeof r){e.removeAttribute(n);break}r=At(""+r),e.setAttribute(n,r);break;case"onClick":null!=r&&(e.onclick=Zu);break;case"onScroll":null!=r&&Ru("scroll",e);break;case"onScrollEnd":null!=r&&Ru("scrollend",e);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!=typeof r||!("__html"in r))throw Error(s(61));if(null!=(n=r.__html)){if(null!=o.children)throw Error(s(60));e.innerHTML=n}}break;case"multiple":e.multiple=r&&"function"!=typeof r&&"symbol"!=typeof r;break;case"muted":e.muted=r&&"function"!=typeof r&&"symbol"!=typeof r;break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"defaultValue":case"defaultChecked":case"innerHTML":case"ref":case"autoFocus":break;case"xlinkHref":if(null==r||"function"==typeof r||"boolean"==typeof r||"symbol"==typeof r){e.removeAttribute("xlink:href");break}n=At(""+r),e.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",n);break;case"contentEditable":case"spellCheck":case"draggable":case"value":case"autoReverse":case"externalResourcesRequired":case"focusable":case"preserveAlpha":null!=r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,""+r):e.removeAttribute(n);break;case"inert":case"allowFullScreen":case"async":case"autoPlay":case"controls":case"default":case"defer":case"disabled":case"disablePictureInPicture":case"disableRemotePlayback":case"formNoValidate":case"hidden":case"loop":case"noModule":case"noValidate":case"open":case"playsInline":case"readOnly":case"required":case"reversed":case"scoped":case"seamless":case"itemScope":r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,""):e.removeAttribute(n);break;case"capture":case"download":!0===r?e.setAttribute(n,""):!1!==r&&null!=r&&"function"!=typeof r&&"symbol"!=typeof r?e.setAttribute(n,r):e.removeAttribute(n);break;case"cols":case"rows":case"size":case"span":null!=r&&"function"!=typeof r&&"symbol"!=typeof r&&!isNaN(r)&&1<=r?e.setAttribute(n,r):e.removeAttribute(n);break;case"rowSpan":case"start":null==r||"function"==typeof r||"symbol"==typeof r||isNaN(r)?e.removeAttribute(n):e.setAttribute(n,r);break;case"popover":Ru("beforetoggle",e),Ru("toggle",e),tt(e,"popover",r);break;case"xlinkActuate":rt(e,"http://www.w3.org/1999/xlink","xlink:actuate",r);break;case"xlinkArcrole":rt(e,"http://www.w3.org/1999/xlink","xlink:arcrole",r);break;case"xlinkRole":rt(e,"http://www.w3.org/1999/xlink","xlink:role",r);break;case"xlinkShow":rt(e,"http://www.w3.org/1999/xlink","xlink:show",r);break;case"xlinkTitle":rt(e,"http://www.w3.org/1999/xlink","xlink:title",r);break;case"xlinkType":rt(e,"http://www.w3.org/1999/xlink","xlink:type",r);break;case"xmlBase":rt(e,"http://www.w3.org/XML/1998/namespace","xml:base",r);break;case"xmlLang":rt(e,"http://www.w3.org/XML/1998/namespace","xml:lang",r);break;case"xmlSpace":rt(e,"http://www.w3.org/XML/1998/namespace","xml:space",r);break;case"is":tt(e,"is",r);break;case"innerText":case"textContent":break;default:(!(2<n.length)||"o"!==n[0]&&"O"!==n[0]||"n"!==n[1]&&"N"!==n[1])&&tt(e,n=Et.get(n)||n,r)}}function Ju(e,t,n,r,o,a){switch(n){case"style":St(e,r,a);break;case"dangerouslySetInnerHTML":if(null!=r){if("object"!=typeof r||!("__html"in r))throw Error(s(61));if(null!=(n=r.__html)){if(null!=o.children)throw Error(s(60));e.innerHTML=n}}break;case"children":"string"==typeof r?wt(e,r):("number"==typeof r||"bigint"==typeof r)&&wt(e,""+r);break;case"onScroll":null!=r&&Ru("scroll",e);break;case"onScrollEnd":null!=r&&Ru("scrollend",e);break;case"onClick":null!=r&&(e.onclick=Zu);break;case"suppressContentEditableWarning":case"suppressHydrationWarning":case"innerHTML":case"ref":case"innerText":case"textContent":break;default:Ge.hasOwnProperty(n)||("o"!==n[0]||"n"!==n[1]||(o=n.endsWith("Capture"),t=n.slice(2,o?n.length-7:void 0),"function"==typeof(a=null!=(a=e[Te]||null)?a[n]:null)&&e.removeEventListener(t,a,o),"function"!=typeof r)?n in e?e[n]=r:!0===r?e.setAttribute(n,""):tt(e,n,r):("function"!=typeof a&&null!==a&&(n in e?e[n]=null:e.hasAttribute(n)&&e.removeAttribute(n)),e.addEventListener(t,r,o)))}}function ed(e,t,n){switch(t){case"div":case"span":case"svg":case"path":case"a":case"g":case"p":case"li":break;case"img":Ru("error",e),Ru("load",e);var r,o=!1,a=!1;for(r in n)if(n.hasOwnProperty(r)){var i=n[r];if(null!=i)switch(r){case"src":o=!0;break;case"srcSet":a=!0;break;case"children":case"dangerouslySetInnerHTML":throw Error(s(137,t));default:Xu(e,t,r,i,n,null)}}return a&&Xu(e,t,"srcSet",n.srcSet,n,null),void(o&&Xu(e,t,"src",n.src,n,null));case"input":Ru("invalid",e);var c=r=i=a=null,l=null,u=null;for(o in n)if(n.hasOwnProperty(o)){var d=n[o];if(null!=d)switch(o){case"name":a=d;break;case"type":i=d;break;case"checked":l=d;break;case"defaultChecked":u=d;break;case"value":r=d;break;case"defaultValue":c=d;break;case"children":case"dangerouslySetInnerHTML":if(null!=d)throw Error(s(137,t));break;default:Xu(e,t,o,d,n,null)}}return bt(e,r,c,l,u,i,a,!1),void dt(e);case"select":for(a in Ru("invalid",e),o=i=r=null,n)if(n.hasOwnProperty(a)&&null!=(c=n[a]))switch(a){case"value":r=c;break;case"defaultValue":i=c;break;case"multiple":o=c;default:Xu(e,t,a,c,n,null)}return t=r,n=i,e.multiple=!!o,void(null!=t?vt(e,!!o,t,!1):null!=n&&vt(e,!!o,n,!0));case"textarea":for(i in Ru("invalid",e),r=a=o=null,n)if(n.hasOwnProperty(i)&&null!=(c=n[i]))switch(i){case"value":o=c;break;case"defaultValue":a=c;break;case"children":r=c;break;case"dangerouslySetInnerHTML":if(null!=c)throw Error(s(91));break;default:Xu(e,t,i,c,n,null)}return kt(e,o,a,r),void dt(e);case"option":for(l in n)if(n.hasOwnProperty(l)&&null!=(o=n[l]))if("selected"===l)e.selected=o&&"function"!=typeof o&&"symbol"!=typeof o;else Xu(e,t,l,o,n,null);return;case"dialog":Ru("beforetoggle",e),Ru("toggle",e),Ru("cancel",e),Ru("close",e);break;case"iframe":case"object":Ru("load",e);break;case"video":case"audio":for(o=0;o<Iu.length;o++)Ru(Iu[o],e);break;case"image":Ru("error",e),Ru("load",e);break;case"details":Ru("toggle",e);break;case"embed":case"source":case"link":Ru("error",e),Ru("load",e);case"area":case"base":case"br":case"col":case"hr":case"keygen":case"meta":case"param":case"track":case"wbr":case"menuitem":for(u in n)if(n.hasOwnProperty(u)&&null!=(o=n[u]))switch(u){case"children":case"dangerouslySetInnerHTML":throw Error(s(137,t));default:Xu(e,t,u,o,n,null)}return;default:if(Mt(t)){for(d in n)n.hasOwnProperty(d)&&(void 0!==(o=n[d])&&Ju(e,t,d,o,n,void 0));return}}for(c in n)n.hasOwnProperty(c)&&(null!=(o=n[c])&&Xu(e,t,c,o,n,null))}var td=null,nd=null;function rd(e){return 9===e.nodeType?e:e.ownerDocument}function od(e){switch(e){case"http://www.w3.org/2000/svg":return 1;case"http://www.w3.org/1998/Math/MathML":return 2;default:return 0}}function ad(e,t){if(0===e)switch(t){case"svg":return 1;case"math":return 2;default:return 0}return 1===e&&"foreignObject"===t?0:e}function sd(e,t){return"textarea"===e||"noscript"===e||"string"==typeof t.children||"number"==typeof t.children||"bigint"==typeof t.children||"object"==typeof t.dangerouslySetInnerHTML&&null!==t.dangerouslySetInnerHTML&&null!=t.dangerouslySetInnerHTML.__html}var id=null;var cd="function"==typeof setTimeout?setTimeout:void 0,ld="function"==typeof clearTimeout?clearTimeout:void 0,ud="function"==typeof Promise?Promise:void 0,dd="function"==typeof queueMicrotask?queueMicrotask:void 0!==ud?function(e){return ud.resolve(null).then(e).catch(pd)}:cd;function pd(e){setTimeout(function(){throw e})}function fd(e){return"head"===e}function hd(e,t){var n=t,r=0,o=0;do{var a=n.nextSibling;if(e.removeChild(n),a&&8===a.nodeType)if("/$"===(n=a.data)){if(0<r&&8>r){n=r;var s=e.ownerDocument;if(1&n&&kd(s.documentElement),2&n&&kd(s.body),4&n)for(kd(n=s.head),s=n.firstChild;s;){var i=s.nextSibling,c=s.nodeName;s[ze]||"SCRIPT"===c||"STYLE"===c||"LINK"===c&&"stylesheet"===s.rel.toLowerCase()||n.removeChild(s),s=i}}if(0===o)return e.removeChild(a),void Ep(t);o--}else"$"===n||"$?"===n||"$!"===n?o++:r=n.charCodeAt(0)-48;else r=0;n=a}while(n);Ep(t)}function md(e){var t=e.firstChild;for(t&&10===t.nodeType&&(t=t.nextSibling);t;){var n=t;switch(t=t.nextSibling,n.nodeName){case"HTML":case"HEAD":case"BODY":md(n),Be(n);continue;case"SCRIPT":case"STYLE":continue;case"LINK":if("stylesheet"===n.rel.toLowerCase())continue}e.removeChild(n)}}function gd(e){return"$!"===e.data||"$?"===e.data&&"complete"===e.ownerDocument.readyState}function bd(e){for(;null!=e;e=e.nextSibling){var t=e.nodeType;if(1===t||3===t)break;if(8===t){if("$"===(t=e.data)||"$!"===t||"$?"===t||"F!"===t||"F"===t)break;if("/$"===t)return null}}return e}var yd=null;function vd(e){e=e.previousSibling;for(var t=0;e;){if(8===e.nodeType){var n=e.data;if("$"===n||"$!"===n||"$?"===n){if(0===t)return e;t--}else"/$"===n&&t++}e=e.previousSibling}return null}function _d(e,t,n){switch(t=rd(n),e){case"html":if(!(e=t.documentElement))throw Error(s(452));return e;case"head":if(!(e=t.head))throw Error(s(453));return e;case"body":if(!(e=t.body))throw Error(s(454));return e;default:throw Error(s(451))}}function kd(e){for(var t=e.attributes;t.length;)e.removeAttributeNode(t[0]);Be(e)}var wd=new Map,Cd=new Set;function xd(e){return"function"==typeof e.getRootNode?e.getRootNode():9===e.nodeType?e:e.ownerDocument}var Sd=N.d;N.d={f:function(){var e=Sd.f(),t=$l();return e||t},r:function(e){var t=Ue(e);null!==t&&5===t.tag&&"form"===t.type?Ts(t):Sd.r(e)},D:function(e){Sd.D(e),Ed("dns-prefetch",e,null)},C:function(e,t){Sd.C(e,t),Ed("preconnect",e,t)},L:function(e,t,n){Sd.L(e,t,n);var r=Md;if(r&&e&&t){var o='link[rel="preload"][as="'+mt(t)+'"]';"image"===t&&n&&n.imageSrcSet?(o+='[imagesrcset="'+mt(n.imageSrcSet)+'"]',"string"==typeof n.imageSizes&&(o+='[imagesizes="'+mt(n.imageSizes)+'"]')):o+='[href="'+mt(e)+'"]';var a=o;switch(t){case"style":a=Ad(e);break;case"script":a=Pd(e)}wd.has(a)||(e=p({rel:"preload",href:"image"===t&&n&&n.imageSrcSet?void 0:e,as:t},n),wd.set(a,e),null!==r.querySelector(o)||"style"===t&&r.querySelector(jd(a))||"script"===t&&r.querySelector(Td(a))||(ed(t=r.createElement("link"),"link",e),Ve(t),r.head.appendChild(t)))}},m:function(e,t){Sd.m(e,t);var n=Md;if(n&&e){var r=t&&"string"==typeof t.as?t.as:"script",o='link[rel="modulepreload"][as="'+mt(r)+'"][href="'+mt(e)+'"]',a=o;switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":a=Pd(e)}if(!wd.has(a)&&(e=p({rel:"modulepreload",href:e},t),wd.set(a,e),null===n.querySelector(o))){switch(r){case"audioworklet":case"paintworklet":case"serviceworker":case"sharedworker":case"worker":case"script":if(n.querySelector(Td(a)))return}ed(r=n.createElement("link"),"link",e),Ve(r),n.head.appendChild(r)}}},X:function(e,t){Sd.X(e,t);var n=Md;if(n&&e){var r=He(n).hoistableScripts,o=Pd(e),a=r.get(o);a||((a=n.querySelector(Td(o)))||(e=p({src:e,async:!0},t),(t=wd.get(o))&&Rd(e,t),Ve(a=n.createElement("script")),ed(a,"link",e),n.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},r.set(o,a))}},S:function(e,t,n){Sd.S(e,t,n);var r=Md;if(r&&e){var o=He(r).hoistableStyles,a=Ad(e);t=t||"default";var s=o.get(a);if(!s){var i={loading:0,preload:null};if(s=r.querySelector(jd(a)))i.loading=5;else{e=p({rel:"stylesheet",href:e,"data-precedence":t},n),(n=wd.get(a))&&Ld(e,n);var c=s=r.createElement("link");Ve(c),ed(c,"link",e),c._p=new Promise(function(e,t){c.onload=e,c.onerror=t}),c.addEventListener("load",function(){i.loading|=1}),c.addEventListener("error",function(){i.loading|=2}),i.loading|=4,Nd(s,t,r)}s={type:"stylesheet",instance:s,count:1,state:i},o.set(a,s)}}},M:function(e,t){Sd.M(e,t);var n=Md;if(n&&e){var r=He(n).hoistableScripts,o=Pd(e),a=r.get(o);a||((a=n.querySelector(Td(o)))||(e=p({src:e,async:!0,type:"module"},t),(t=wd.get(o))&&Rd(e,t),Ve(a=n.createElement("script")),ed(a,"link",e),n.head.appendChild(a)),a={type:"script",instance:a,count:1,state:null},r.set(o,a))}}};var Md="undefined"==typeof document?null:document;function Ed(e,t,n){var r=Md;if(r&&"string"==typeof t&&t){var o=mt(t);o='link[rel="'+e+'"][href="'+o+'"]',"string"==typeof n&&(o+='[crossorigin="'+n+'"]'),Cd.has(o)||(Cd.add(o),e={rel:e,crossOrigin:n,href:t},null===r.querySelector(o)&&(ed(t=r.createElement("link"),"link",e),Ve(t),r.head.appendChild(t)))}}function Od(e,t,n,r){var o,a,i,c,l=(l=H.current)?xd(l):null;if(!l)throw Error(s(446));switch(e){case"meta":case"title":return null;case"style":return"string"==typeof n.precedence&&"string"==typeof n.href?(t=Ad(n.href),(r=(n=He(l).hoistableStyles).get(t))||(r={type:"style",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};case"link":if("stylesheet"===n.rel&&"string"==typeof n.href&&"string"==typeof n.precedence){e=Ad(n.href);var u=He(l).hoistableStyles,d=u.get(e);if(d||(l=l.ownerDocument||l,d={type:"stylesheet",instance:null,count:0,state:{loading:0,preload:null}},u.set(e,d),(u=l.querySelector(jd(e)))&&!u._p&&(d.instance=u,d.state.loading=5),wd.has(e)||(n={rel:"preload",as:"style",href:n.href,crossOrigin:n.crossOrigin,integrity:n.integrity,media:n.media,hrefLang:n.hrefLang,referrerPolicy:n.referrerPolicy},wd.set(e,n),u||(o=l,a=e,i=n,c=d.state,o.querySelector('link[rel="preload"][as="style"]['+a+"]")?c.loading=1:(a=o.createElement("link"),c.preload=a,a.addEventListener("load",function(){return c.loading|=1}),a.addEventListener("error",function(){return c.loading|=2}),ed(a,"link",i),Ve(a),o.head.appendChild(a))))),t&&null===r)throw Error(s(528,""));return d}if(t&&null!==r)throw Error(s(529,""));return null;case"script":return t=n.async,"string"==typeof(n=n.src)&&t&&"function"!=typeof t&&"symbol"!=typeof t?(t=Pd(n),(r=(n=He(l).hoistableScripts).get(t))||(r={type:"script",instance:null,count:0,state:null},n.set(t,r)),r):{type:"void",instance:null,count:0,state:null};default:throw Error(s(444,e))}}function Ad(e){return'href="'+mt(e)+'"'}function jd(e){return'link[rel="stylesheet"]['+e+"]"}function Dd(e){return p({},e,{"data-precedence":e.precedence,precedence:null})}function Pd(e){return'[src="'+mt(e)+'"]'}function Td(e){return"script[async]"+e}function Id(e,t,n){if(t.count++,null===t.instance)switch(t.type){case"style":var r=e.querySelector('style[data-href~="'+mt(n.href)+'"]');if(r)return t.instance=r,Ve(r),r;var o=p({},n,{"data-href":n.href,"data-precedence":n.precedence,href:null,precedence:null});return Ve(r=(e.ownerDocument||e).createElement("style")),ed(r,"style",o),Nd(r,n.precedence,e),t.instance=r;case"stylesheet":o=Ad(n.href);var a=e.querySelector(jd(o));if(a)return t.state.loading|=4,t.instance=a,Ve(a),a;r=Dd(n),(o=wd.get(o))&&Ld(r,o),Ve(a=(e.ownerDocument||e).createElement("link"));var i=a;return i._p=new Promise(function(e,t){i.onload=e,i.onerror=t}),ed(a,"link",r),t.state.loading|=4,Nd(a,n.precedence,e),t.instance=a;case"script":return a=Pd(n.src),(o=e.querySelector(Td(a)))?(t.instance=o,Ve(o),o):(r=n,(o=wd.get(a))&&Rd(r=p({},n),o),Ve(o=(e=e.ownerDocument||e).createElement("script")),ed(o,"link",r),e.head.appendChild(o),t.instance=o);case"void":return null;default:throw Error(s(443,t.type))}else"stylesheet"===t.type&&!(4&t.state.loading)&&(r=t.instance,t.state.loading|=4,Nd(r,n.precedence,e));return t.instance}function Nd(e,t,n){for(var r=n.querySelectorAll('link[rel="stylesheet"][data-precedence],style[data-precedence]'),o=r.length?r[r.length-1]:null,a=o,s=0;s<r.length;s++){var i=r[s];if(i.dataset.precedence===t)a=i;else if(a!==o)break}a?a.parentNode.insertBefore(e,a.nextSibling):(t=9===n.nodeType?n.head:n).insertBefore(e,t.firstChild)}function Ld(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.title&&(e.title=t.title)}function Rd(e,t){null==e.crossOrigin&&(e.crossOrigin=t.crossOrigin),null==e.referrerPolicy&&(e.referrerPolicy=t.referrerPolicy),null==e.integrity&&(e.integrity=t.integrity)}var Fd=null;function zd(e,t,n){if(null===Fd){var r=new Map,o=Fd=new Map;o.set(n,r)}else(r=(o=Fd).get(n))||(r=new Map,o.set(n,r));if(r.has(e))return r;for(r.set(e,null),n=n.getElementsByTagName(e),o=0;o<n.length;o++){var a=n[o];if(!(a[ze]||a[Pe]||"link"===e&&"stylesheet"===a.getAttribute("rel"))&&"http://www.w3.org/2000/svg"!==a.namespaceURI){var s=a.getAttribute(t)||"";s=e+s;var i=r.get(s);i?i.push(a):r.set(s,[a])}}return r}function Bd(e,t,n){(e=e.ownerDocument||e).head.insertBefore(n,"title"===t?e.querySelector("head > title"):null)}function $d(e){return!!("stylesheet"!==e.type||3&e.state.loading)}var Ud=null;function qd(){}function Hd(){if(this.count--,0===this.count)if(this.stylesheets)Wd(this,this.stylesheets);else if(this.unsuspend){var e=this.unsuspend;this.unsuspend=null,e()}}var Vd=null;function Wd(e,t){e.stylesheets=null,null!==e.unsuspend&&(e.count++,Vd=new Map,t.forEach(Gd,e),Vd=null,Hd.call(e))}function Gd(e,t){if(!(4&t.state.loading)){var n=Vd.get(e);if(n)var r=n.get(null);else{n=new Map,Vd.set(e,n);for(var o=e.querySelectorAll("link[data-precedence],style[data-precedence]"),a=0;a<o.length;a++){var s=o[a];"LINK"!==s.nodeName&&"not all"===s.getAttribute("media")||(n.set(s.dataset.precedence,s),r=s)}r&&n.set(null,r)}s=(o=t.instance).getAttribute("data-precedence"),(a=n.get(s)||r)===r&&n.set(null,o),n.set(s,o),this.count++,r=Hd.bind(this),o.addEventListener("load",r),o.addEventListener("error",r),a?a.parentNode.insertBefore(o,a.nextSibling):(e=9===e.nodeType?e.head:e).insertBefore(o,e.firstChild),t.state.loading|=4}}var Kd={$$typeof:k,Provider:null,Consumer:null,_currentValue:L,_currentValue2:L,_threadCount:0};function Qd(e,t,n,r,o,a,s,i){this.tag=1,this.containerInfo=e,this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.next=this.pendingContext=this.context=this.cancelPendingCommit=null,this.callbackPriority=0,this.expirationTimes=xe(-1),this.entangledLanes=this.shellSuspendCounter=this.errorRecoveryDisabledLanes=this.expiredLanes=this.warmLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=xe(0),this.hiddenUpdates=xe(null),this.identifierPrefix=r,this.onUncaughtError=o,this.onCaughtError=a,this.onRecoverableError=s,this.pooledCache=null,this.pooledCacheLanes=0,this.formState=i,this.incompleteTransitions=new Map}function Yd(e,t,n,r,o,a,s,i,c,l,u,d){return e=new Qd(e,t,n,s,i,c,l,d),t=1,!0===a&&(t|=24),a=Lr(3,null,null,t),e.current=a,a.stateNode=e,(t=Io()).refCount++,e.pooledCache=t,t.refCount++,a.memoizedState={element:r,isDehydrated:n,cache:t},ra(a),e}function Zd(e){return e?e=Ir:Ir}function Xd(e,t,n,r,o,a){o=Zd(o),null===r.context?r.context=o:r.pendingContext=o,(r=aa(t)).payload={element:n},null!==(a=void 0===a?null:a)&&(r.callback=a),null!==(n=sa(e,r,t))&&(Ll(n,0,t),ia(n,e,t))}function Jd(e,t){if(null!==(e=e.memoizedState)&&null!==e.dehydrated){var n=e.retryLane;e.retryLane=0!==n&&n<t?n:t}}function ep(e,t){Jd(e,t),(e=e.alternate)&&Jd(e,t)}function tp(e){if(13===e.tag){var t=Dr(e,67108864);null!==t&&Ll(t,0,67108864),ep(e,67108864)}}var np=!0;function rp(e,t,n,r){var o=I.T;I.T=null;var a=N.p;try{N.p=2,ap(e,t,n,r)}finally{N.p=a,I.T=o}}function op(e,t,n,r){var o=I.T;I.T=null;var a=N.p;try{N.p=8,ap(e,t,n,r)}finally{N.p=a,I.T=o}}function ap(e,t,n,r){if(np){var o=sp(r);if(null===o)Uu(e,t,r,ip,n),yp(e,r);else if(function(e,t,n,r,o){switch(t){case"focusin":return dp=vp(dp,e,t,n,r,o),!0;case"dragenter":return pp=vp(pp,e,t,n,r,o),!0;case"mouseover":return fp=vp(fp,e,t,n,r,o),!0;case"pointerover":var a=o.pointerId;return hp.set(a,vp(hp.get(a)||null,e,t,n,r,o)),!0;case"gotpointercapture":return a=o.pointerId,mp.set(a,vp(mp.get(a)||null,e,t,n,r,o)),!0}return!1}(o,e,t,n,r))r.stopPropagation();else if(yp(e,r),4&t&&-1<bp.indexOf(e)){for(;null!==o;){var a=Ue(o);if(null!==a)switch(a.tag){case 3:if((a=a.stateNode).current.memoizedState.isDehydrated){var s=ye(a.pendingLanes);if(0!==s){var i=a;for(i.pendingLanes|=2,i.entangledLanes|=2;s;){var c=1<<31-fe(s);i.entanglements[1]|=c,s&=~c}wu(a),!(6&nl)&&(wl=te()+500,Cu(0,!1))}}break;case 13:null!==(i=Dr(a,2))&&Ll(i,0,2),$l(),ep(a,2)}if(null===(a=sp(r))&&Uu(e,t,r,ip,n),a===o)break;o=a}null!==o&&r.stopPropagation()}else Uu(e,t,r,null,n)}}function sp(e){return cp(e=Dt(e))}var ip=null;function cp(e){if(ip=null,null!==(e=$e(e))){var t=c(e);if(null===t)e=null;else{var n=t.tag;if(13===n){if(null!==(e=l(t)))return e;e=null}else if(3===n){if(t.stateNode.current.memoizedState.isDehydrated)return 3===t.tag?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null)}}return ip=e,null}function lp(e){switch(e){case"beforetoggle":case"cancel":case"click":case"close":case"contextmenu":case"copy":case"cut":case"auxclick":case"dblclick":case"dragend":case"dragstart":case"drop":case"focusin":case"focusout":case"input":case"invalid":case"keydown":case"keypress":case"keyup":case"mousedown":case"mouseup":case"paste":case"pause":case"play":case"pointercancel":case"pointerdown":case"pointerup":case"ratechange":case"reset":case"resize":case"seeked":case"submit":case"toggle":case"touchcancel":case"touchend":case"touchstart":case"volumechange":case"change":case"selectionchange":case"textInput":case"compositionstart":case"compositionend":case"compositionupdate":case"beforeblur":case"afterblur":case"beforeinput":case"blur":case"fullscreenchange":case"focus":case"hashchange":case"popstate":case"select":case"selectstart":return 2;case"drag":case"dragenter":case"dragexit":case"dragleave":case"dragover":case"mousemove":case"mouseout":case"mouseover":case"pointermove":case"pointerout":case"pointerover":case"scroll":case"touchmove":case"wheel":case"mouseenter":case"mouseleave":case"pointerenter":case"pointerleave":return 8;case"message":switch(ne()){case re:return 2;case oe:return 8;case ae:case se:return 32;case ie:return 268435456;default:return 32}default:return 32}}var up=!1,dp=null,pp=null,fp=null,hp=new Map,mp=new Map,gp=[],bp="mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset".split(" ");function yp(e,t){switch(e){case"focusin":case"focusout":dp=null;break;case"dragenter":case"dragleave":pp=null;break;case"mouseover":case"mouseout":fp=null;break;case"pointerover":case"pointerout":hp.delete(t.pointerId);break;case"gotpointercapture":case"lostpointercapture":mp.delete(t.pointerId)}}function vp(e,t,n,r,o,a){return null===e||e.nativeEvent!==a?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:a,targetContainers:[o]},null!==t&&(null!==(t=Ue(t))&&tp(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,null!==o&&-1===t.indexOf(o)&&t.push(o),e)}function _p(e){var t=$e(e.target);if(null!==t){var n=c(t);if(null!==n)if(13===(t=n.tag)){if(null!==(t=l(n)))return e.blockedOn=t,void function(e,t){var n=N.p;try{return N.p=e,t()}finally{N.p=n}}(e.priority,function(){if(13===n.tag){var e=Il();e=Oe(e);var t=Dr(n,e);null!==t&&Ll(t,0,e),ep(n,e)}})}else if(3===t&&n.stateNode.current.memoizedState.isDehydrated)return void(e.blockedOn=3===n.tag?n.stateNode.containerInfo:null)}e.blockedOn=null}function kp(e){if(null!==e.blockedOn)return!1;for(var t=e.targetContainers;0<t.length;){var n=sp(e.nativeEvent);if(null!==n)return null!==(t=Ue(n))&&tp(t),e.blockedOn=n,!1;var r=new(n=e.nativeEvent).constructor(n.type,n);jt=r,n.target.dispatchEvent(r),jt=null,t.shift()}return!0}function wp(e,t,n){kp(e)&&n.delete(t)}function Cp(){up=!1,null!==dp&&kp(dp)&&(dp=null),null!==pp&&kp(pp)&&(pp=null),null!==fp&&kp(fp)&&(fp=null),hp.forEach(wp),mp.forEach(wp)}function xp(e,t){e.blockedOn===t&&(e.blockedOn=null,up||(up=!0,r.unstable_scheduleCallback(r.unstable_NormalPriority,Cp)))}var Sp=null;function Mp(e){Sp!==e&&(Sp=e,r.unstable_scheduleCallback(r.unstable_NormalPriority,function(){Sp===e&&(Sp=null);for(var t=0;t<e.length;t+=3){var n=e[t],r=e[t+1],o=e[t+2];if("function"!=typeof r){if(null===cp(r||n))continue;break}var a=Ue(n);null!==a&&(e.splice(t,3),t-=3,Ds(a,{pending:!0,data:o,method:n.method,action:r},r,o))}}))}function Ep(e){function t(t){return xp(t,e)}null!==dp&&xp(dp,e),null!==pp&&xp(pp,e),null!==fp&&xp(fp,e),hp.forEach(t),mp.forEach(t);for(var n=0;n<gp.length;n++){var r=gp[n];r.blockedOn===e&&(r.blockedOn=null)}for(;0<gp.length&&null===(n=gp[0]).blockedOn;)_p(n),null===n.blockedOn&&gp.shift();if(null!=(n=(e.ownerDocument||e).$$reactFormReplay))for(r=0;r<n.length;r+=3){var o=n[r],a=n[r+1],s=o[Te]||null;if("function"==typeof a)s||Mp(n);else if(s){var i=null;if(a&&a.hasAttribute("formAction")){if(o=a,s=a[Te]||null)i=s.formAction;else if(null!==cp(o))continue}else i=s.action;"function"==typeof i?n[r+1]=i:(n.splice(r,3),r-=3),Mp(n)}}}function Op(e){this._internalRoot=e}function Ap(e){this._internalRoot=e}Ap.prototype.render=Op.prototype.render=function(e){var t=this._internalRoot;if(null===t)throw Error(s(409));Xd(t.current,Il(),e,t,null,null)},Ap.prototype.unmount=Op.prototype.unmount=function(){var e=this._internalRoot;if(null!==e){this._internalRoot=null;var t=e.containerInfo;Xd(e.current,2,null,e,null,null),$l(),t[Ie]=null}},Ap.prototype.unstable_scheduleHydration=function(e){if(e){var t=je();e={blockedOn:null,target:e,priority:t};for(var n=0;n<gp.length&&0!==t&&t<gp[n].priority;n++);gp.splice(n,0,e),0===n&&_p(e)}};var jp=o.version;if("19.1.0"!==jp)throw Error(s(527,jp,"19.1.0"));N.findDOMNode=function(e){var t=e._reactInternals;if(void 0===t){if("function"==typeof e.render)throw Error(s(188));throw e=Object.keys(e).join(","),Error(s(268,e))}return e=function(e){var t=e.alternate;if(!t){if(null===(t=c(e)))throw Error(s(188));return t!==e?null:e}for(var n=e,r=t;;){var o=n.return;if(null===o)break;var a=o.alternate;if(null===a){if(null!==(r=o.return)){n=r;continue}break}if(o.child===a.child){for(a=o.child;a;){if(a===n)return u(o),e;if(a===r)return u(o),t;a=a.sibling}throw Error(s(188))}if(n.return!==r.return)n=o,r=a;else{for(var i=!1,l=o.child;l;){if(l===n){i=!0,n=o,r=a;break}if(l===r){i=!0,r=o,n=a;break}l=l.sibling}if(!i){for(l=a.child;l;){if(l===n){i=!0,n=a,r=o;break}if(l===r){i=!0,r=a,n=o;break}l=l.sibling}if(!i)throw Error(s(189))}}if(n.alternate!==r)throw Error(s(190))}if(3!==n.tag)throw Error(s(188));return n.stateNode.current===n?e:t}(t),e=null===(e=null!==e?d(e):null)?null:e.stateNode};var Dp={bundleType:0,version:"19.1.0",rendererPackageName:"react-dom",currentDispatcherRef:I,reconcilerVersion:"19.1.0"};if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__){var Pp=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Pp.isDisabled&&Pp.supportsFiber)try{ue=Pp.inject(Dp),de=Pp}catch(Ip){}}t.createRoot=function(e,t){if(!i(e))throw Error(s(299));var n=!1,r="",o=yi,a=vi,c=_i;return null!=t&&(!0===t.unstable_strictMode&&(n=!0),void 0!==t.identifierPrefix&&(r=t.identifierPrefix),void 0!==t.onUncaughtError&&(o=t.onUncaughtError),void 0!==t.onCaughtError&&(a=t.onCaughtError),void 0!==t.onRecoverableError&&(c=t.onRecoverableError),void 0!==t.unstable_transitionCallbacks&&t.unstable_transitionCallbacks),t=Yd(e,1,!1,null,0,n,r,o,a,c,0,null),e[Ie]=t.current,Bu(e),new Op(t)},t.hydrateRoot=function(e,t,n){if(!i(e))throw Error(s(299));var r=!1,o="",a=yi,c=vi,l=_i,u=null;return null!=n&&(!0===n.unstable_strictMode&&(r=!0),void 0!==n.identifierPrefix&&(o=n.identifierPrefix),void 0!==n.onUncaughtError&&(a=n.onUncaughtError),void 0!==n.onCaughtError&&(c=n.onCaughtError),void 0!==n.onRecoverableError&&(l=n.onRecoverableError),void 0!==n.unstable_transitionCallbacks&&n.unstable_transitionCallbacks,void 0!==n.formState&&(u=n.formState)),(t=Yd(e,1,!0,t,0,r,o,a,c,l,0,u)).context=Zd(null),n=t.current,(o=aa(r=Oe(r=Il()))).callback=null,sa(n,o,r),n=r,t.current.lanes=n,Se(t,n),wu(t),e[Ie]=t.current,Bu(e),new Ap(t)},t.version="19.1.0"},40827:(e,t,n)=>{"use strict";n.d(t,{n:()=>i,r:()=>c});var r=n(36672),o=n(92471),a=n(23420);const s=r.createContext(null);function i({children:e,version:t}){return(0,a.jsx)(s.Provider,{value:t,children:e})}function c(){const e=(0,r.useContext)(s);if(null===e)throw new o.dV("DocsVersionProvider");return e}},42396:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(39345)},42977:(e,t,n)=>{"use strict";n.d(t,{Ay:()=>i,hH:()=>s});var r=n(36672),o=n(56562),a=n(4518);function s(){const{siteConfig:e}=(0,o.A)(),{baseUrl:t,url:n}=e,s=e.future.experimental_router,i=(0,r.useCallback)((e,r)=>function({siteUrl:e,baseUrl:t,url:n,options:{forcePrependBaseUrl:r=!1,absolute:o=!1}={},router:s}){if(!n||n.startsWith("#")||(0,a.z)(n))return n;if("hash"===s)return n.startsWith("/")?`.${n}`:`./${n}`;if(r)return t+n.replace(/^\//,"");if(n===t.replace(/\/$/,""))return t;const i=n.startsWith(t)?n:t+n.replace(/^\//,"");return o?e+i:i}({siteUrl:n,baseUrl:t,url:e,options:r,router:s}),[n,t,s]);return{withBaseUrl:i}}function i(e,t={}){const{withBaseUrl:n}=s();return n(e,t)}},43062:(e,t,n)=>{"use strict";n.d(t,{G:()=>_,a:()=>v});var r=n(36672),o=n(92471),a=n(1771),s=n(67797),i=n(23420);function c(){return window.matchMedia("(prefers-color-scheme: dark)").matches?"dark":"light"}function l(e){return function(e,t){const n=window.matchMedia(e);return n.addEventListener("change",t),()=>n.removeEventListener("change",t)}("(prefers-color-scheme: dark)",()=>e(c()))}const u=r.createContext(void 0),d=(0,a.Wf)("theme"),p="system",f=e=>"dark"===e?"dark":"light",h=e=>null===e||e===p?null:f(e),m={get:()=>f(document.documentElement.getAttribute("data-theme")),set:e=>{document.documentElement.setAttribute("data-theme",f(e))}},g={get:()=>h(document.documentElement.getAttribute("data-theme-choice")),set:e=>{document.documentElement.setAttribute("data-theme-choice",h(e)??p)}},b=e=>{null===e?d.del():d.set(f(e))};function y(){const{colorMode:{defaultMode:e,disableSwitch:t,respectPrefersColorScheme:n}}=(0,s.p)(),{colorMode:o,setColorModeState:a,colorModeChoice:i,setColorModeChoiceState:u}=function(){const{colorMode:{defaultMode:e}}=(0,s.p)(),[t,n]=(0,r.useState)(e),[o,a]=(0,r.useState)(null);return(0,r.useEffect)(()=>{n(m.get()),a(g.get())},[]),{colorMode:t,setColorModeState:n,colorModeChoice:o,setColorModeChoiceState:a}}();(0,r.useEffect)(()=>{t&&d.del()},[t]);const p=(0,r.useCallback)((t,r={})=>{const{persist:o=!0}=r;if(null===t){const t=n?c():e;m.set(t),a(t),g.set(null),u(null)}else m.set(t),g.set(t),a(t),u(t);o&&b(t)},[a,u,n,e]);return(0,r.useEffect)(()=>d.listen(e=>{p(h(e.newValue))}),[p]),(0,r.useEffect)(()=>{if(null===i&&n)return l(e=>{a(e),m.set(e)})},[n,i,a]),(0,r.useMemo)(()=>({colorMode:o,colorModeChoice:i,setColorMode:p,get isDarkTheme(){return"dark"===o},setLightTheme(){p("light")},setDarkTheme(){p("dark")}}),[o,i,p])}function v({children:e}){const t=y();return(0,i.jsx)(u.Provider,{value:t,children:e})}function _(){const e=(0,r.useContext)(u);if(null==e)throw new o.dV("ColorModeProvider","Please see https://docusaurus.io/docs/api/themes/configuration#use-color-mode.");return e}},44338:()=>{!function(e){var t={pattern:/((?:^|[^\\$])(?:\\{2})*)\$(?:\w+|\{[^{}]*\})/,lookbehind:!0,inside:{"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:null}}};e.languages.groovy=e.languages.extend("clike",{string:{pattern:/'''(?:[^\\]|\\[\s\S])*?'''|'(?:\\.|[^\\'\r\n])*'/,greedy:!0},keyword:/\b(?:abstract|as|assert|boolean|break|byte|case|catch|char|class|const|continue|def|default|do|double|else|enum|extends|final|finally|float|for|goto|if|implements|import|in|instanceof|int|interface|long|native|new|package|private|protected|public|return|short|static|strictfp|super|switch|synchronized|this|throw|throws|trait|transient|try|void|volatile|while)\b/,number:/\b(?:0b[01_]+|0x[\da-f_]+(?:\.[\da-f_p\-]+)?|[\d_]+(?:\.[\d_]+)?(?:e[+-]?\d+)?)[glidf]?\b/i,operator:{pattern:/(^|[^.])(?:~|==?~?|\?[.:]?|\*(?:[.=]|\*=?)?|\.[@&]|\.\.<|\.\.(?!\.)|-[-=>]?|\+[+=]?|!=?|<(?:<=?|=>?)?|>(?:>>?=?|=)?|&[&=]?|\|[|=]?|\/=?|\^=?|%=?)/,lookbehind:!0},punctuation:/\.+|[{}[\];(),:$]/}),e.languages.insertBefore("groovy","string",{shebang:{pattern:/#!.+/,alias:"comment",greedy:!0},"interpolation-string":{pattern:/"""(?:[^\\]|\\[\s\S])*?"""|(["/])(?:\\.|(?!\1)[^\\\r\n])*\1|\$\/(?:[^/$]|\$(?:[/$]|(?![/$]))|\/(?!\$))*\/\$/,greedy:!0,inside:{interpolation:t,string:/[\s\S]+/}}}),e.languages.insertBefore("groovy","punctuation",{"spock-block":/\b(?:and|cleanup|expect|given|setup|then|when|where):/}),e.languages.insertBefore("groovy","function",{annotation:{pattern:/(^|[^.])@\w+/,lookbehind:!0,alias:"punctuation"}}),t.inside.expression.inside=e.languages.groovy}(Prism)},45223:(e,t,n)=>{"use strict";function r(e,t=(e,t)=>e===t){return e.filter((n,r)=>e.findIndex(e=>t(e,n))!==r)}function o(e){return Array.from(new Set(e))}n.d(t,{XI:()=>r,sb:()=>o})},47367:(e,t,n)=>{"use strict";n.d(t,{o:()=>d,l:()=>p});var r=n(36672),o=n(4784);const a=JSON.parse('{"docusaurus-plugin-content-docs":{"default":{"path":"/ModuleCheck/docs","versions":[{"name":"current","label":"Next","isLast":false,"path":"/ModuleCheck/docs/next","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/next/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/next/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/next/","sidebar":"Docs"},{"id":"rules/android/disable_android_resources","path":"/ModuleCheck/docs/next/rules/disable_android_resources","sidebar":"Docs"},{"id":"rules/android/disable_view_binding","path":"/ModuleCheck/docs/next/rules/disable_view_binding","sidebar":"Docs"},{"id":"rules/android/unused_kotlin_android_extensions","path":"/ModuleCheck/docs/next/rules/unused_kotlin_android_extensions","sidebar":"Docs"},{"id":"rules/compiler/custom_kapt_matchers","path":"/ModuleCheck/docs/next/rules/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_plugin","path":"/ModuleCheck/docs/next/rules/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_processor","path":"/ModuleCheck/docs/next/rules/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/compiler/use_anvil_factory_generation","path":"/ModuleCheck/docs/next/rules/use_anvil_factory_generation","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/next/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/next/rules/must_be_api","sidebar":"Docs"},{"id":"rules/overshot_dependency","path":"/ModuleCheck/docs/next/rules/overshot_dependency","sidebar":"Docs"},{"id":"rules/project_depth","path":"/ModuleCheck/docs/next/rules/project_depth","sidebar":"Docs"},{"id":"rules/redundant_dependency","path":"/ModuleCheck/docs/next/rules/redundant_dependency","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/next/rules/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/next/rules/sort_plugins","sidebar":"Docs"},{"id":"rules/unused_dependency","path":"/ModuleCheck/docs/next/rules/unused_dependency","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/next/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/next/","label":"quickstart"}}}},{"name":"0.12.5","label":"0.12.5","isLast":true,"path":"/ModuleCheck/docs","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/","sidebar":"Docs"},{"id":"rules/android/disable_android_resources","path":"/ModuleCheck/docs/rules/disable_android_resources","sidebar":"Docs"},{"id":"rules/android/disable_view_binding","path":"/ModuleCheck/docs/rules/disable_view_binding","sidebar":"Docs"},{"id":"rules/android/unused_kotlin_android_extensions","path":"/ModuleCheck/docs/rules/unused_kotlin_android_extensions","sidebar":"Docs"},{"id":"rules/compiler/custom_kapt_matchers","path":"/ModuleCheck/docs/rules/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_plugin","path":"/ModuleCheck/docs/rules/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_processor","path":"/ModuleCheck/docs/rules/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/compiler/use_anvil_factory_generation","path":"/ModuleCheck/docs/rules/use_anvil_factory_generation","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/rules/must_be_api","sidebar":"Docs"},{"id":"rules/overshot_dependency","path":"/ModuleCheck/docs/rules/overshot_dependency","sidebar":"Docs"},{"id":"rules/project_depth","path":"/ModuleCheck/docs/rules/project_depth","sidebar":"Docs"},{"id":"rules/redundant_dependency","path":"/ModuleCheck/docs/rules/redundant_dependency","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/rules/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/rules/sort_plugins","sidebar":"Docs"},{"id":"rules/unused_dependency","path":"/ModuleCheck/docs/rules/unused_dependency","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/","label":"quickstart"}}}},{"name":"0.12.4","label":"0.12.4","isLast":false,"path":"/ModuleCheck/docs/0.12.4","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/0.12.4/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/0.12.4/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.12.4/","sidebar":"Docs"},{"id":"rules/android/disable_android_resources","path":"/ModuleCheck/docs/0.12.4/rules/disable_android_resources","sidebar":"Docs"},{"id":"rules/android/disable_view_binding","path":"/ModuleCheck/docs/0.12.4/rules/disable_view_binding","sidebar":"Docs"},{"id":"rules/android/unused_kotlin_android_extensions","path":"/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensions","sidebar":"Docs"},{"id":"rules/compiler/custom_kapt_matchers","path":"/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_plugin","path":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_processor","path":"/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/compiler/use_anvil_factory_generation","path":"/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.12.4/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.12.4/rules/must_be_api","sidebar":"Docs"},{"id":"rules/overshot_dependency","path":"/ModuleCheck/docs/0.12.4/rules/overshot_dependency","sidebar":"Docs"},{"id":"rules/project_depth","path":"/ModuleCheck/docs/0.12.4/rules/project_depth","sidebar":"Docs"},{"id":"rules/redundant_dependency","path":"/ModuleCheck/docs/0.12.4/rules/redundant_dependency","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.12.4/rules/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.12.4/rules/sort_plugins","sidebar":"Docs"},{"id":"rules/unused_dependency","path":"/ModuleCheck/docs/0.12.4/rules/unused_dependency","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/0.12.4/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.12.4/","label":"quickstart"}}}},{"name":"0.12.3","label":"0.12.3","isLast":false,"path":"/ModuleCheck/docs/0.12.3","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/0.12.3/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/0.12.3/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.12.3/","sidebar":"Docs"},{"id":"rules/android/disable_android_resources","path":"/ModuleCheck/docs/0.12.3/rules/disable_android_resources","sidebar":"Docs"},{"id":"rules/android/disable_view_binding","path":"/ModuleCheck/docs/0.12.3/rules/disable_view_binding","sidebar":"Docs"},{"id":"rules/android/unused_kotlin_android_extensions","path":"/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensions","sidebar":"Docs"},{"id":"rules/compiler/custom_kapt_matchers","path":"/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_plugin","path":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_processor","path":"/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/compiler/use_anvil_factory_generation","path":"/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.12.3/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.12.3/rules/must_be_api","sidebar":"Docs"},{"id":"rules/overshot_dependency","path":"/ModuleCheck/docs/0.12.3/rules/overshot_dependency","sidebar":"Docs"},{"id":"rules/project_depth","path":"/ModuleCheck/docs/0.12.3/rules/project_depth","sidebar":"Docs"},{"id":"rules/redundant_dependency","path":"/ModuleCheck/docs/0.12.3/rules/redundant_dependency","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.12.3/rules/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.12.3/rules/sort_plugins","sidebar":"Docs"},{"id":"rules/unused_dependency","path":"/ModuleCheck/docs/0.12.3/rules/unused_dependency","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/0.12.3/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.12.3/","label":"quickstart"}}}},{"name":"0.12.2","label":"0.12.2","isLast":false,"path":"/ModuleCheck/docs/0.12.2","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/0.12.2/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/0.12.2/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.12.2/","sidebar":"Docs"},{"id":"rules/android/disable_android_resources","path":"/ModuleCheck/docs/0.12.2/rules/disable_android_resources","sidebar":"Docs"},{"id":"rules/android/disable_view_binding","path":"/ModuleCheck/docs/0.12.2/rules/disable_view_binding","sidebar":"Docs"},{"id":"rules/android/unused_kotlin_android_extensions","path":"/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensions","sidebar":"Docs"},{"id":"rules/compiler/custom_kapt_matchers","path":"/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_plugin","path":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_processor","path":"/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/compiler/use_anvil_factory_generation","path":"/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.12.2/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.12.2/rules/must_be_api","sidebar":"Docs"},{"id":"rules/overshot_dependency","path":"/ModuleCheck/docs/0.12.2/rules/overshot_dependency","sidebar":"Docs"},{"id":"rules/project_depth","path":"/ModuleCheck/docs/0.12.2/rules/project_depth","sidebar":"Docs"},{"id":"rules/redundant_dependency","path":"/ModuleCheck/docs/0.12.2/rules/redundant_dependency","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.12.2/rules/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.12.2/rules/sort_plugins","sidebar":"Docs"},{"id":"rules/unused_dependency","path":"/ModuleCheck/docs/0.12.2/rules/unused_dependency","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/0.12.2/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.12.2/","label":"quickstart"}}}},{"name":"0.12.1","label":"0.12.1","isLast":false,"path":"/ModuleCheck/docs/0.12.1","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/0.12.1/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/0.12.1/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.12.1/","sidebar":"Docs"},{"id":"rules/android/disable_android_resources","path":"/ModuleCheck/docs/0.12.1/rules/disable_android_resources","sidebar":"Docs"},{"id":"rules/android/disable_view_binding","path":"/ModuleCheck/docs/0.12.1/rules/disable_view_binding","sidebar":"Docs"},{"id":"rules/android/unused_kotlin_android_extensions","path":"/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensions","sidebar":"Docs"},{"id":"rules/compiler/custom_kapt_matchers","path":"/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_plugin","path":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/compiler/unused_kapt_processor","path":"/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/compiler/use_anvil_factory_generation","path":"/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.12.1/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.12.1/rules/must_be_api","sidebar":"Docs"},{"id":"rules/overshot_dependency","path":"/ModuleCheck/docs/0.12.1/rules/overshot_dependency","sidebar":"Docs"},{"id":"rules/project_depth","path":"/ModuleCheck/docs/0.12.1/rules/project_depth","sidebar":"Docs"},{"id":"rules/redundant_dependency","path":"/ModuleCheck/docs/0.12.1/rules/redundant_dependency","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.12.1/rules/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.12.1/rules/sort_plugins","sidebar":"Docs"},{"id":"rules/unused_dependency","path":"/ModuleCheck/docs/0.12.1/rules/unused_dependency","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/0.12.1/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.12.1/","label":"quickstart"}}}},{"name":"0.12.0","label":"0.12.0","isLast":false,"path":"/ModuleCheck/docs/0.12.0","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/0.12.0/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/0.12.0/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.12.0/","sidebar":"Docs"},{"id":"rules/android/disable_resources","path":"/ModuleCheck/docs/0.12.0/rules/android/disable_resources","sidebar":"Docs"},{"id":"rules/android/disable_viewbinding","path":"/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding","sidebar":"Docs"},{"id":"rules/android/unused_kotlin_android_extensions","path":"/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensions","sidebar":"Docs"},{"id":"rules/compiler/could_use_anvil_factory","path":"/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory","sidebar":"Docs"},{"id":"rules/depths","path":"/ModuleCheck/docs/0.12.0/rules/depths","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.12.0/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/kapt/custom_kapt_matchers","path":"/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_plugin","path":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_processor","path":"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.12.0/rules/must_be_api","sidebar":"Docs"},{"id":"rules/overshot_dependency","path":"/ModuleCheck/docs/0.12.0/rules/overshot_dependency","sidebar":"Docs"},{"id":"rules/redundant_dependency","path":"/ModuleCheck/docs/0.12.0/rules/redundant_dependency","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins","sidebar":"Docs"},{"id":"rules/unused","path":"/ModuleCheck/docs/0.12.0/rules/unused","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/0.12.0/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.12.0/","label":"quickstart"}}}},{"name":"0.11.3","label":"0.11.3","isLast":false,"path":"/ModuleCheck/docs/0.11.3","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/0.11.3/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/0.11.3/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.11.3/","sidebar":"Docs"},{"id":"rules/android/disable_resources","path":"/ModuleCheck/docs/0.11.3/rules/android/disable_resources","sidebar":"Docs"},{"id":"rules/android/disable_viewbinding","path":"/ModuleCheck/docs/0.11.3/rules/android/disable_viewbinding","sidebar":"Docs"},{"id":"rules/compiler/could_use_anvil_factory","path":"/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.11.3/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/kapt/custom_kapt_matchers","path":"/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_plugin","path":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_processor","path":"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.11.3/rules/must_be_api","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins","sidebar":"Docs"},{"id":"rules/unused","path":"/ModuleCheck/docs/0.11.3/rules/unused","sidebar":"Docs"},{"id":"suppressing-findings","path":"/ModuleCheck/docs/0.11.3/suppressing-findings","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.11.3/","label":"quickstart"}}}},{"name":"0.11.2","label":"0.11.2","isLast":false,"path":"/ModuleCheck/docs/0.11.2","mainDocId":"quickstart","docs":[{"id":"ci-workflow","path":"/ModuleCheck/docs/0.11.2/ci-workflow","sidebar":"Docs"},{"id":"configuration","path":"/ModuleCheck/docs/0.11.2/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.11.2/","sidebar":"Docs"},{"id":"rules/android/disable_resources","path":"/ModuleCheck/docs/0.11.2/rules/android/disable_resources","sidebar":"Docs"},{"id":"rules/android/disable_viewbinding","path":"/ModuleCheck/docs/0.11.2/rules/android/disable_viewbinding","sidebar":"Docs"},{"id":"rules/compiler/could_use_anvil_factory","path":"/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.11.2/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/kapt/custom_kapt_matchers","path":"/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_plugin","path":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_processor","path":"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.11.2/rules/must_be_api","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins","sidebar":"Docs"},{"id":"rules/unused","path":"/ModuleCheck/docs/0.11.2/rules/unused","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.11.2/","label":"quickstart"}}}},{"name":"0.11.1","label":"0.11.1","isLast":false,"path":"/ModuleCheck/docs/0.11.1","mainDocId":"quickstart","docs":[{"id":"configuration","path":"/ModuleCheck/docs/0.11.1/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.11.1/","sidebar":"Docs"},{"id":"rules/android/disable_resources","path":"/ModuleCheck/docs/0.11.1/rules/android/disable_resources","sidebar":"Docs"},{"id":"rules/android/disable_viewbinding","path":"/ModuleCheck/docs/0.11.1/rules/android/disable_viewbinding","sidebar":"Docs"},{"id":"rules/compiler/could_use_anvil_factory","path":"/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.11.1/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/kapt/custom_kapt_matchers","path":"/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_plugin","path":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_processor","path":"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.11.1/rules/must_be_api","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins","sidebar":"Docs"},{"id":"rules/unused","path":"/ModuleCheck/docs/0.11.1/rules/unused","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.11.1/","label":"quickstart"}}}},{"name":"0.11.0","label":"0.11.0","isLast":false,"path":"/ModuleCheck/docs/0.11.0","mainDocId":"quickstart","docs":[{"id":"configuration","path":"/ModuleCheck/docs/0.11.0/configuration","sidebar":"Docs"},{"id":"quickstart","path":"/ModuleCheck/docs/0.11.0/","sidebar":"Docs"},{"id":"rules/android/disable_resources","path":"/ModuleCheck/docs/0.11.0/rules/android/disable_resources","sidebar":"Docs"},{"id":"rules/android/disable_viewbinding","path":"/ModuleCheck/docs/0.11.0/rules/android/disable_viewbinding","sidebar":"Docs"},{"id":"rules/compiler/could_use_anvil_factory","path":"/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory","sidebar":"Docs"},{"id":"rules/inherited_dependency","path":"/ModuleCheck/docs/0.11.0/rules/inherited_dependency","sidebar":"Docs"},{"id":"rules/kapt/custom_kapt_matchers","path":"/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_plugin","path":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin","sidebar":"Docs"},{"id":"rules/kapt/unused_kapt_processor","path":"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor","sidebar":"Docs"},{"id":"rules/must_be_api","path":"/ModuleCheck/docs/0.11.0/rules/must_be_api","sidebar":"Docs"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies","sidebar":"Docs"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins","sidebar":"Docs"},{"id":"rules/unused","path":"/ModuleCheck/docs/0.11.0/rules/unused","sidebar":"Docs"}],"draftIds":[],"sidebars":{"Docs":{"link":{"path":"/ModuleCheck/docs/0.11.0/","label":"quickstart"}}}},{"name":"0.10.0","label":"0.10.0","isLast":false,"path":"/ModuleCheck/docs/0.10.0","mainDocId":"quickstart","docs":[{"id":"configuration","path":"/ModuleCheck/docs/0.10.0/configuration","sidebar":"Basics"},{"id":"mdx","path":"/ModuleCheck/docs/0.10.0/mdx"},{"id":"quickstart","path":"/ModuleCheck/docs/0.10.0/","sidebar":"Basics"},{"id":"rules/android/disable_resources","path":"/ModuleCheck/docs/0.10.0/rules/android/disable_resources","sidebar":"Rules"},{"id":"rules/android/disable_viewbinding","path":"/ModuleCheck/docs/0.10.0/rules/android/disable_viewbinding","sidebar":"Rules"},{"id":"rules/kapt/custom_kapt_matchers","path":"/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers","sidebar":"Rules"},{"id":"rules/kapt/unused_kapt_plugin","path":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin","sidebar":"Rules"},{"id":"rules/kapt/unused_kapt_processor","path":"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor","sidebar":"Rules"},{"id":"rules/overshot","path":"/ModuleCheck/docs/0.10.0/rules/overshot","sidebar":"Rules"},{"id":"rules/redundant","path":"/ModuleCheck/docs/0.10.0/rules/redundant","sidebar":"Rules"},{"id":"rules/sorting/sort_dependencies","path":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies","sidebar":"Rules"},{"id":"rules/sorting/sort_plugins","path":"/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins","sidebar":"Rules"},{"id":"rules/unused","path":"/ModuleCheck/docs/0.10.0/rules/unused","sidebar":"Rules"}],"draftIds":[],"sidebars":{"Basics":{"link":{"path":"/ModuleCheck/docs/0.10.0/","label":"quickstart"}},"Rules":{"link":{"path":"/ModuleCheck/docs/0.10.0/rules/unused","label":"rules/unused"}}}}],"breadcrumbs":true}}}'),s=JSON.parse('{"defaultLocale":"en","locales":["en"],"path":"i18n","currentLocale":"en","localeConfigs":{"en":{"label":"English","direction":"ltr","htmlLang":"en","calendar":"gregory","path":"en"}}}');var i=n(22654);const c=JSON.parse('{"docusaurusVersion":"3.8.1","siteVersion":"0.13.0-SNAPSHOT","pluginVersions":{"docusaurus-plugin-content-docs":{"type":"package","name":"@docusaurus/plugin-content-docs","version":"3.8.1"},"docusaurus-plugin-content-blog":{"type":"package","name":"@docusaurus/plugin-content-blog","version":"3.8.1"},"docusaurus-plugin-content-pages":{"type":"package","name":"@docusaurus/plugin-content-pages","version":"3.8.1"},"docusaurus-plugin-sitemap":{"type":"package","name":"@docusaurus/plugin-sitemap","version":"3.8.1"},"docusaurus-plugin-svgr":{"type":"package","name":"@docusaurus/plugin-svgr","version":"3.8.1"},"docusaurus-theme-classic":{"type":"package","name":"@docusaurus/theme-classic","version":"3.8.1"},"docusaurus-theme-search-algolia":{"type":"package","name":"@docusaurus/theme-search-algolia","version":"3.8.1"},"docusaurus-theme-mermaid":{"type":"package","name":"@docusaurus/theme-mermaid","version":"3.8.1"}}}');var l=n(23420);const u={siteConfig:o.default,siteMetadata:c,globalData:a,i18n:s,codeTranslations:i},d=r.createContext(u);function p({children:e}){return(0,l.jsx)(d.Provider,{value:u,children:e})}},50552:(e,t,n)=>{"use strict";n.d(t,{A:()=>p});n(36672);var r=n(78670),o=n.n(r),a=n(84054);const s={"011d940f":[()=>Promise.all([n.e(1869),n.e(1536)]).then(n.bind(n,33735)),"@site/versioned_docs/version-0.12.3/configuration.mdx",33735],"021c8caa":[()=>n.e(3924).then(n.t.bind(n,4356,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-10-0-825.json",4356],"02359d8a":[()=>n.e(5859).then(n.bind(n,18184)),"@site/versioned_docs/version-0.12.5/rules/redundant_dependency.md",18184],"03459661":[()=>n.e(9335).then(n.bind(n,38611)),"@site/versioned_docs/version-0.12.5/rules/overshot_dependency.md",38611],"044a6187":[()=>n.e(2370).then(n.bind(n,28850)),"@site/versioned_docs/version-0.12.4/ci_workflow.md",28850],"048b8cd8":[()=>n.e(6150).then(n.bind(n,26704)),"@site/versioned_docs/version-0.11.0/rules/unused.md",26704],"051962a1":[()=>n.e(4094).then(n.bind(n,33107)),"@site/versioned_docs/version-0.12.2/rules/compiler/unused_kapt_processor.md",33107],"05d123c0":[()=>Promise.all([n.e(1869),n.e(7155)]).then(n.bind(n,21637)),"@site/versioned_docs/version-0.11.3/suppressing-findings.mdx",21637],"0807349d":[()=>n.e(4182).then(n.bind(n,62264)),"@site/docs/rules/compiler/use_anvil_factory_generation.md",62264],"09b50579":[()=>n.e(228).then(n.bind(n,38331)),"@site/versioned_docs/version-0.11.2/rules/android/disable_viewbinding.md",38331],"0b199b14":[()=>n.e(8321).then(n.bind(n,91906)),"@site/versioned_docs/version-0.12.4/rules/overshot_dependency.md",91906],"0f29fa4c":[()=>n.e(646).then(n.bind(n,93589)),"@site/versioned_docs/version-0.12.2/rules/redundant_dependency.md",93589],"0fc8e5d5":[()=>n.e(4931).then(n.bind(n,84835)),"@site/versioned_docs/version-0.12.5/rules/sorting/sort_dependencies.md",84835],"1050d62e":[()=>Promise.all([n.e(1869),n.e(998)]).then(n.bind(n,67373)),"@site/versioned_docs/version-0.12.2/quickstart.mdx",67373],"107eb4cc":[()=>n.e(832).then(n.bind(n,55325)),"@site/versioned_docs/version-0.12.3/rules/android/unused_kotlin_android_extensions.md",55325],"109fab02":[()=>n.e(5142).then(n.bind(n,91647)),"@site/versioned_docs/version-0.11.0/rules/kapt/unused_kapt_processor.md",91647],"10b686c7":[()=>n.e(6720).then(n.bind(n,73236)),"@site/versioned_docs/version-0.12.0/rules/overshot_dependency.md",73236],"12b0e932":[()=>n.e(8561).then(n.bind(n,27594)),"@site/versioned_docs/version-0.11.2/rules/android/disable_resources.md",27594],"1483dc01":[()=>n.e(1949).then(n.bind(n,58572)),"@site/versioned_docs/version-0.10.0/rules/redundant.md",58572],"14e1fcc3":[()=>n.e(8305).then(n.bind(n,18164)),"@site/versioned_docs/version-0.10.0/rules/sorting/sort_dependencies.md",18164],"150ef1cb":[()=>n.e(9384).then(n.bind(n,84007)),"@site/versioned_docs/version-0.12.1/rules/compiler/use_anvil_factory_generation.md",84007],"15a9c06b":[()=>n.e(2610).then(n.bind(n,96911)),"@site/versioned_docs/version-0.12.1/rules/redundant_dependency.md",96911],"171ac7cc":[()=>n.e(1273).then(n.bind(n,34673)),"@site/versioned_docs/version-0.11.2/rules/compiler/could_use_anvil_factory.md",34673],"171f1b26":[()=>n.e(6679).then(n.bind(n,28677)),"@site/versioned_docs/version-0.12.0/rules/kapt/custom_kapt_matchers.md",28677],17896441:[()=>Promise.all([n.e(1869),n.e(3287),n.e(8401)]).then(n.bind(n,2e4)),"@theme/DocItem",2e4],"19b95078":[()=>n.e(8104).then(n.bind(n,74568)),"@site/versioned_docs/version-0.12.4/rules/sorting/sort_plugins.md",74568],"19d61b19":[()=>n.e(7432).then(n.bind(n,19148)),"@site/versioned_docs/version-0.11.3/rules/must_be_api.md",19148],"1a3a5cbb":[()=>n.e(3821).then(n.bind(n,33875)),"@site/versioned_docs/version-0.11.1/rules/android/disable_resources.md",33875],"1a3bb66a":[()=>n.e(8029).then(n.bind(n,6478)),"@site/versioned_docs/version-0.12.1/ci_workflow.md",6478],"1a4e3797":[()=>Promise.all([n.e(1869),n.e(2138)]).then(n.bind(n,68057)),"@theme/SearchPage",68057],"1c291fdc":[()=>n.e(9206).then(n.bind(n,38566)),"@site/versioned_docs/version-0.12.1/rules/android/unused_kotlin_android_extensions.md",38566],"1e828d0d":[()=>n.e(7259).then(n.bind(n,87612)),"@site/versioned_docs/version-0.12.3/rules/unused_dependency.md",87612],"1ecac929":[()=>n.e(7930).then(n.bind(n,68255)),"@site/versioned_docs/version-0.12.3/rules/compiler/use_anvil_factory_generation.md",68255],"1f391b9e":[()=>Promise.all([n.e(1869),n.e(3287),n.e(6061)]).then(n.bind(n,77549)),"@theme/MDXPage",77549],"20c870cb":[()=>n.e(314).then(n.bind(n,74503)),"@site/versioned_docs/version-0.11.0/rules/android/disable_viewbinding.md",74503],"2192b561":[()=>n.e(8945).then(n.bind(n,47784)),"@site/versioned_docs/version-0.12.2/ci_workflow.md",47784],"228d1b45":[()=>n.e(755).then(n.bind(n,58873)),"@site/versioned_docs/version-0.12.2/rules/must_be_api.md",58873],"23284c9b":[()=>n.e(9254).then(n.bind(n,59643)),"@site/versioned_docs/version-0.12.3/rules/android/disable_view_binding.md",59643],"23c216bb":[()=>n.e(4196).then(n.bind(n,28802)),"@site/versioned_docs/version-0.11.2/configuration.mdx",28802],"24af6869":[()=>Promise.all([n.e(1869),n.e(1753)]).then(n.bind(n,50786)),"@site/versioned_docs/version-0.10.0/quickstart.mdx",50786],25072094:[()=>n.e(4422).then(n.bind(n,58591)),"@site/versioned_docs/version-0.12.1/rules/project_depth.md",58591],"2950f807":[()=>n.e(7914).then(n.bind(n,48456)),"@site/docs/rules/must_be_api.md",48456],"29a2444a":[()=>n.e(4040).then(n.bind(n,61091)),"@site/versioned_docs/version-0.12.2/rules/compiler/custom_kapt_matchers.md",61091],"2f675600":[()=>n.e(7079).then(n.bind(n,99112)),"@site/versioned_docs/version-0.12.0/rules/sorting/sort_plugins.md",99112],"30f6db9d":[()=>n.e(3911).then(n.bind(n,32305)),"@site/versioned_docs/version-0.11.0/configuration.mdx",32305],"3139ff2f":[()=>n.e(8355).then(n.bind(n,82295)),"@site/versioned_docs/version-0.11.2/rules/kapt/unused_kapt_processor.md",82295],"324fc7ff":[()=>Promise.all([n.e(1869),n.e(8020)]).then(n.bind(n,13335)),"@site/versioned_docs/version-0.12.5/quickstart.mdx",13335],"325152a5":[()=>n.e(6313).then(n.bind(n,46461)),"@site/versioned_docs/version-0.12.1/rules/android/disable_android_resources.md",46461],"3325f0a2":[()=>n.e(7141).then(n.bind(n,31347)),"@site/versioned_docs/version-0.12.4/rules/compiler/unused_kapt_plugin.md",31347],"341c85ac":[()=>n.e(9479).then(n.bind(n,22281)),"@site/versioned_docs/version-0.12.1/rules/inherited_dependency.md",22281],"341f4c6e":[()=>n.e(5143).then(n.bind(n,84633)),"@site/versioned_docs/version-0.12.2/rules/compiler/use_anvil_factory_generation.md",84633],35179155:[()=>n.e(4151).then(n.bind(n,57534)),"@site/versioned_docs/version-0.12.4/rules/inherited_dependency.md",57534],"368eb302":[()=>n.e(3914).then(n.bind(n,75305)),"@site/versioned_docs/version-0.12.2/rules/project_depth.md",75305],"388f1aef":[()=>n.e(4955).then(n.bind(n,28859)),"@site/versioned_docs/version-0.12.5/rules/inherited_dependency.md",28859],"3abc021e":[()=>Promise.all([n.e(1869),n.e(6966)]).then(n.bind(n,51302)),"@site/versioned_docs/version-0.12.1/quickstart.mdx",51302],"3e41c308":[()=>n.e(8596).then(n.bind(n,35212)),"@site/versioned_docs/version-0.11.0/rules/kapt/unused_kapt_plugin.md",35212],"3e68fbe7":[()=>n.e(5241).then(n.bind(n,62027)),"@site/versioned_docs/version-0.12.2/rules/unused_dependency.md",62027],"3fb0a163":[()=>Promise.all([n.e(1869),n.e(9805)]).then(n.bind(n,98273)),"@site/versioned_docs/version-0.12.2/configuration.mdx",98273],"400cc4b7":[()=>n.e(1472).then(n.bind(n,32652)),"@site/versioned_docs/version-0.12.3/rules/compiler/unused_kapt_plugin.md",32652],"4047c50f":[()=>n.e(9514).then(n.bind(n,72275)),"@site/versioned_docs/version-0.12.0/rules/android/unused_kotlin_android_extensions.md",72275],"411bcc8b":[()=>n.e(91).then(n.bind(n,5170)),"@site/versioned_docs/version-0.12.4/rules/compiler/use_anvil_factory_generation.md",5170],"41b23040":[()=>n.e(7559).then(n.t.bind(n,41563,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-next-fd2.json",41563],"41bca987":[()=>n.e(5706).then(n.bind(n,83252)),"@site/versioned_docs/version-0.12.0/rules/inherited_dependency.md",83252],"4329fc3c":[()=>n.e(12).then(n.bind(n,42071)),"@site/versioned_docs/version-0.12.5/rules/compiler/custom_kapt_matchers.md",42071],"4359cab8":[()=>n.e(3508).then(n.bind(n,51186)),"@site/versioned_docs/version-0.11.0/rules/sorting/sort_dependencies.md",51186],"444a5a58":[()=>n.e(8327).then(n.bind(n,78381)),"@site/src/pages/migrations.md",78381],"4577221a":[()=>n.e(334).then(n.bind(n,2073)),"@site/docs/rules/compiler/unused_kapt_processor.md",2073],"46d462fa":[()=>n.e(1270).then(n.bind(n,41182)),"@site/versioned_docs/version-0.11.3/rules/inherited_dependency.md",41182],"46e9ac31":[()=>Promise.all([n.e(1869),n.e(4003)]).then(n.bind(n,52084)),"@site/versioned_docs/version-0.11.2/quickstart.mdx",52084],"47da9d80":[()=>n.e(6314).then(n.bind(n,71285)),"@site/versioned_docs/version-0.12.5/rules/must_be_api.md",71285],"485c5e01":[()=>n.e(4276).then(n.bind(n,25636)),"@site/versioned_docs/version-0.12.3/rules/inherited_dependency.md",25636],"487ca811":[()=>n.e(8720).then(n.bind(n,51082)),"@site/versioned_docs/version-0.12.4/rules/compiler/unused_kapt_processor.md",51082],"4c8a85bd":[()=>n.e(7286).then(n.bind(n,4787)),"@site/versioned_docs/version-0.11.3/rules/unused.md",4787],"4e8e2262":[()=>n.e(9055).then(n.bind(n,64276)),"@site/versioned_docs/version-0.12.0/rules/android/disable_viewbinding.md",64276],"50b1f033":[()=>n.e(8179).then(n.bind(n,62961)),"@site/versioned_docs/version-0.12.0/rules/kapt/unused_kapt_processor.md",62961],"50cf1f78":[()=>n.e(3715).then(n.bind(n,69327)),"@site/versioned_docs/version-0.12.2/rules/overshot_dependency.md",69327],"518ccc20":[()=>Promise.all([n.e(1869),n.e(610)]).then(n.bind(n,82270)),"@site/versioned_docs/version-0.12.0/configuration.mdx",82270],"51d6008a":[()=>n.e(2090).then(n.bind(n,64426)),"@site/docs/rules/android/unused_kotlin_android_extensions.md",64426],"521dad97":[()=>n.e(9290).then(n.bind(n,96090)),"@site/versioned_docs/version-0.12.0/rules/sorting/sort_dependencies.md",96090],"53b10fcd":[()=>n.e(2271).then(n.t.bind(n,33836,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-11-1-9c7.json",33836],"54b37c16":[()=>Promise.all([n.e(1869),n.e(7978)]).then(n.bind(n,65296)),"@site/versioned_docs/version-0.12.1/suppressing-findings.mdx",65296],"54f055ef":[()=>n.e(6185).then(n.bind(n,79001)),"@site/versioned_docs/version-0.12.5/rules/sorting/sort_plugins.md",79001],"571f3672":[()=>n.e(8510).then(n.bind(n,22962)),"@site/versioned_docs/version-0.12.1/rules/unused_dependency.md",22962],"5ad15a2f":[()=>n.e(7042).then(n.t.bind(n,81069,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-11-0-816.json",81069],"5b786e91":[()=>n.e(5802).then(n.bind(n,14643)),"@site/versioned_docs/version-0.12.3/rules/overshot_dependency.md",14643],"5d2d37cd":[()=>n.e(7257).then(n.bind(n,50913)),"@site/versioned_docs/version-0.11.1/rules/kapt/custom_kapt_matchers.md",50913],"5d624d4b":[()=>n.e(7658).then(n.bind(n,81800)),"@site/versioned_docs/version-0.11.3/rules/kapt/unused_kapt_plugin.md",81800],"5e95c892":[()=>n.e(9647).then(n.bind(n,81895)),"@theme/DocsRoot",81895],"5e9f5e1a":[()=>Promise.resolve().then(n.bind(n,4784)),"@generated/docusaurus.config",4784],"5f0d7ee4":[()=>n.e(825).then(n.bind(n,65661)),"@site/versioned_docs/version-0.11.1/rules/sorting/sort_dependencies.md",65661],"5fd14b8b":[()=>n.e(9775).then(n.bind(n,20961)),"@site/versioned_docs/version-0.11.2/rules/kapt/custom_kapt_matchers.md",20961],"6033e994":[()=>n.e(9558).then(n.bind(n,3457)),"@site/versioned_docs/version-0.12.5/rules/android/unused_kotlin_android_extensions.md",3457],"627bdb5d":[()=>n.e(2817).then(n.bind(n,72273)),"@site/versioned_docs/version-0.11.1/rules/must_be_api.md",72273],"62cdf0e0":[()=>n.e(8439).then(n.bind(n,20527)),"@site/versioned_docs/version-0.10.0/configuration.mdx",20527],"64018eb5":[()=>n.e(6494).then(n.bind(n,58994)),"@site/versioned_docs/version-0.11.1/rules/android/disable_viewbinding.md",58994],"6518a949":[()=>n.e(8904).then(n.t.bind(n,87834,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-12-4-861.json",87834],"66e00e19":[()=>n.e(5939).then(n.bind(n,24094)),"@site/versioned_docs/version-0.12.5/rules/project_depth.md",24094],"6bba662b":[()=>n.e(5296).then(n.bind(n,14954)),"@site/docs/rules/project_depth.md",14954],"6e6115bc":[()=>n.e(744).then(n.bind(n,54972)),"@site/versioned_docs/version-0.12.5/ci_workflow.md",54972],"6e873df7":[()=>n.e(3127).then(n.bind(n,31358)),"@site/docs/rules/sorting/sort_plugins.md",31358],"70335a48":[()=>n.e(4738).then(n.bind(n,87431)),"@site/versioned_docs/version-0.10.0/rules/unused.md",87431],"71174ce3":[()=>n.e(1792).then(n.bind(n,59847)),"@site/versioned_docs/version-0.12.0/rules/unused.md",59847],"7136df27":[()=>n.e(4167).then(n.bind(n,7519)),"@site/versioned_docs/version-0.12.0/rules/depths.md",7519],"71eb5ef4":[()=>n.e(7842).then(n.bind(n,47394)),"@site/docs/rules/compiler/unused_kapt_plugin.md",47394],"724ecf1a":[()=>n.e(2492).then(n.bind(n,25456)),"@site/docs/rules/inherited_dependency.md",25456],"7273998d":[()=>n.e(6360).then(n.bind(n,29035)),"@site/docs/rules/unused_dependency.md",29035],74876495:[()=>Promise.all([n.e(1869),n.e(6505)]).then(n.bind(n,65552)),"@site/docs/quickstart.mdx",65552],"75878fc8":[()=>n.e(7399).then(n.bind(n,11601)),"@site/src/pages/changelog.md",11601],"7bab4396":[()=>Promise.all([n.e(1869),n.e(2771)]).then(n.bind(n,81882)),"@site/versioned_docs/version-0.11.3/configuration.mdx",81882],"7c1e7b42":[()=>n.e(5682).then(n.bind(n,20962)),"@site/versioned_docs/version-0.12.0/rules/android/disable_resources.md",20962],"7cbf6be7":[()=>n.e(9065).then(n.bind(n,29781)),"@site/versioned_docs/version-0.10.0/mdx.md",29781],"7da24252":[()=>n.e(2016).then(n.bind(n,12577)),"@site/versioned_docs/version-0.12.2/rules/sorting/sort_dependencies.md",12577],"84fb41f0":[()=>n.e(6040).then(n.bind(n,37080)),"@site/versioned_docs/version-0.12.2/rules/android/disable_view_binding.md",37080],"86c82c9a":[()=>n.e(9603).then(n.bind(n,18961)),"@site/versioned_docs/version-0.12.4/rules/must_be_api.md",18961],"87c27ff4":[()=>Promise.all([n.e(1869),n.e(2410)]).then(n.bind(n,85729)),"@site/versioned_docs/version-0.12.0/quickstart.mdx",85729],"896d06c5":[()=>n.e(8374).then(n.bind(n,73033)),"@site/versioned_docs/version-0.12.4/rules/sorting/sort_dependencies.md",73033],"89d14484":[()=>n.e(679).then(n.bind(n,19346)),"@site/versioned_docs/version-0.12.1/rules/android/disable_view_binding.md",19346],"8dac98b9":[()=>n.e(3623).then(n.bind(n,53605)),"@site/versioned_docs/version-0.12.5/rules/android/disable_view_binding.md",53605],"8e56f135":[()=>n.e(8028).then(n.bind(n,45876)),"@site/versioned_docs/version-0.11.0/rules/compiler/could_use_anvil_factory.md",45876],"91e5ca6b":[()=>n.e(259).then(n.bind(n,5613)),"@site/docs/rules/sorting/sort_dependencies.md",5613],"91ee770c":[()=>n.e(7950).then(n.bind(n,74970)),"@site/versioned_docs/version-0.12.1/rules/compiler/custom_kapt_matchers.md",74970],"92131bac":[()=>n.e(9583).then(n.bind(n,30185)),"@site/versioned_docs/version-0.12.1/rules/sorting/sort_dependencies.md",30185],"9469bd80":[()=>n.e(4661).then(n.bind(n,1966)),"@site/versioned_docs/version-0.11.0/rules/android/disable_resources.md",1966],"9478d12a":[()=>n.e(1815).then(n.bind(n,37997)),"@site/versioned_docs/version-0.11.3/rules/kapt/custom_kapt_matchers.md",37997],"94dc3e5f":[()=>Promise.all([n.e(1869),n.e(6446)]).then(n.bind(n,5009)),"@site/docs/suppressing-findings.mdx",5009],"99547feb":[()=>n.e(3388).then(n.bind(n,46539)),"@site/versioned_docs/version-0.10.0/rules/sorting/sort_plugins.md",46539],"99cbfc76":[()=>Promise.all([n.e(1869),n.e(6288)]).then(n.bind(n,94082)),"@site/versioned_docs/version-0.12.2/suppressing-findings.mdx",94082],"9ae4b911":[()=>n.e(763).then(n.bind(n,97181)),"@site/versioned_docs/version-0.12.0/rules/compiler/could_use_anvil_factory.md",97181],"9e2bab8c":[()=>n.e(9063).then(n.t.bind(n,18324,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-209.json",18324],a06cff9c:[()=>n.e(8705).then(n.bind(n,24941)),"@site/versioned_docs/version-0.11.2/rules/inherited_dependency.md",24941],a180cea5:[()=>n.e(5251).then(n.bind(n,34669)),"@site/docs/ci_workflow.md",34669],a2d99d88:[()=>Promise.all([n.e(1869),n.e(8628)]).then(n.bind(n,85672)),"@site/versioned_docs/version-0.12.0/suppressing-findings.mdx",85672],a35aa088:[()=>n.e(750).then(n.bind(n,4620)),"@site/versioned_docs/version-0.12.0/ci_workflow.md",4620],a4b1a9b8:[()=>n.e(8783).then(n.bind(n,67556)),"@site/versioned_docs/version-0.12.1/rules/overshot_dependency.md",67556],a4e2bd41:[()=>n.e(406).then(n.bind(n,32088)),"@site/versioned_docs/version-0.10.0/rules/kapt/unused_kapt_plugin.md",32088],a559ab1c:[()=>n.e(286).then(n.bind(n,86729)),"@site/versioned_docs/version-0.11.1/rules/kapt/unused_kapt_processor.md",86729],a5f1db42:[()=>Promise.all([n.e(1869),n.e(7454)]).then(n.bind(n,66592)),"@site/versioned_docs/version-0.12.4/suppressing-findings.mdx",66592],a5fc5a0e:[()=>n.e(4663).then(n.bind(n,82454)),"@site/versioned_docs/version-0.11.3/rules/sorting/sort_dependencies.md",82454],a7456010:[()=>n.e(1235).then(n.t.bind(n,88552,19)),"@generated/docusaurus-plugin-content-pages/default/__plugin.json",88552],a7bd4aaa:[()=>n.e(7098).then(n.bind(n,72538)),"@theme/DocVersionRoot",72538],a8ed45e8:[()=>n.e(3149).then(n.bind(n,17547)),"@site/versioned_docs/version-0.11.1/rules/unused.md",17547],a94703ab:[()=>Promise.all([n.e(1869),n.e(9048)]).then(n.bind(n,16816)),"@theme/DocRoot",16816],aad83134:[()=>n.e(6644).then(n.bind(n,91584)),"@site/versioned_docs/version-0.12.3/ci_workflow.md",91584],aba21aa0:[()=>n.e(5742).then(n.t.bind(n,27093,19)),"@generated/docusaurus-plugin-content-docs/default/__plugin.json",27093],abdba85e:[()=>n.e(9961).then(n.bind(n,82212)),"@site/versioned_docs/version-0.11.0/rules/inherited_dependency.md",82212],ac2458d6:[()=>n.e(80).then(n.bind(n,16538)),"@site/versioned_docs/version-0.11.1/rules/sorting/sort_plugins.md",16538],b00e7a90:[()=>n.e(463).then(n.bind(n,74269)),"@site/versioned_docs/version-0.11.2/rules/unused.md",74269],b1002bca:[()=>Promise.all([n.e(1869),n.e(9152)]).then(n.bind(n,26626)),"@site/versioned_docs/version-0.11.3/quickstart.mdx",26626],b1c76d35:[()=>n.e(5264).then(n.bind(n,23049)),"@site/versioned_docs/version-0.12.2/rules/sorting/sort_plugins.md",23049],b20814c1:[()=>n.e(704).then(n.t.bind(n,43569,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-11-3-fd4.json",43569],b28afb00:[()=>n.e(4590).then(n.bind(n,12773)),"@site/versioned_docs/version-0.12.3/rules/redundant_dependency.md",12773],b35da6ab:[()=>Promise.all([n.e(1869),n.e(6601)]).then(n.bind(n,20954)),"@site/versioned_docs/version-0.12.4/quickstart.mdx",20954],b3a16c5b:[()=>n.e(2520).then(n.bind(n,38196)),"@site/versioned_docs/version-0.10.0/rules/android/disable_resources.md",38196],b7c223ee:[()=>n.e(6678).then(n.bind(n,80766)),"@site/versioned_docs/version-0.12.2/rules/android/disable_android_resources.md",80766],ba3d50d9:[()=>n.e(8463).then(n.bind(n,25708)),"@site/versioned_docs/version-0.11.0/rules/sorting/sort_plugins.md",25708],bc73dc9d:[()=>Promise.all([n.e(1869),n.e(1895)]).then(n.bind(n,74509)),"@site/versioned_docs/version-0.11.1/quickstart.mdx",74509],bc7e3c4b:[()=>n.e(362).then(n.bind(n,86257)),"@site/versioned_docs/version-0.11.1/rules/inherited_dependency.md",86257],bd7e05cf:[()=>n.e(7187).then(n.bind(n,30738)),"@site/versioned_docs/version-0.11.2/rules/sorting/sort_dependencies.md",30738],be81e05d:[()=>n.e(1917).then(n.bind(n,39033)),"@site/versioned_docs/version-0.10.0/rules/android/disable_viewbinding.md",39033],c0050a27:[()=>n.e(6087).then(n.t.bind(n,60862,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-12-1-473.json",60862],c07a004a:[()=>Promise.all([n.e(1869),n.e(4687)]).then(n.bind(n,51456)),"@site/versioned_docs/version-0.11.0/quickstart.mdx",51456],c10c208b:[()=>n.e(2132).then(n.bind(n,98428)),"@site/versioned_docs/version-0.11.3/rules/kapt/unused_kapt_processor.md",98428],c141421f:[()=>n.e(957).then(n.t.bind(n,40936,19)),"@generated/docusaurus-theme-search-algolia/default/__plugin.json",40936],c1600862:[()=>n.e(3641).then(n.bind(n,2501)),"@site/docs/rules/redundant_dependency.md",2501],c2414a18:[()=>n.e(8043).then(n.bind(n,65787)),"@site/versioned_docs/version-0.12.3/rules/compiler/custom_kapt_matchers.md",65787],c4025719:[()=>n.e(2406).then(n.bind(n,90773)),"@site/versioned_docs/version-0.12.4/rules/android/unused_kotlin_android_extensions.md",90773],c4b5a5df:[()=>n.e(2581).then(n.bind(n,42683)),"@site/versioned_docs/version-0.12.3/rules/android/disable_android_resources.md",42683],c4f5d8e4:[()=>Promise.all([n.e(1869),n.e(2634)]).then(n.bind(n,28292)),"@site/src/pages/index.js",28292],c5b979b0:[()=>n.e(5734).then(n.bind(n,14198)),"@site/docs/rules/compiler/custom_kapt_matchers.md",14198],c5f63adb:[()=>n.e(2133).then(n.bind(n,24772)),"@site/versioned_docs/version-0.11.1/configuration.mdx",24772],c7222430:[()=>n.e(3361).then(n.bind(n,49477)),"@site/versioned_docs/version-0.12.2/rules/compiler/unused_kapt_plugin.md",49477],c83ce79b:[()=>n.e(8141).then(n.bind(n,9745)),"@site/versioned_docs/version-0.12.0/rules/must_be_api.md",9745],c846d7aa:[()=>n.e(4193).then(n.bind(n,25493)),"@site/versioned_docs/version-0.11.1/rules/compiler/could_use_anvil_factory.md",25493],c902409b:[()=>n.e(5184).then(n.bind(n,45590)),"@site/versioned_docs/version-0.11.3/ci_workflow.md",45590],c989d589:[()=>n.e(9082).then(n.bind(n,70856)),"@site/versioned_docs/version-0.12.2/rules/inherited_dependency.md",70856],ca3e6c65:[()=>n.e(1601).then(n.bind(n,29689)),"@site/versioned_docs/version-0.11.3/rules/compiler/could_use_anvil_factory.md",29689],ca460041:[()=>n.e(1084).then(n.bind(n,24762)),"@site/docs/rules/android/disable_android_resources.md",24762],ca873730:[()=>Promise.all([n.e(1869),n.e(4559)]).then(n.bind(n,35252)),"@site/versioned_docs/version-0.12.4/configuration.mdx",35252],ca8e7b55:[()=>n.e(3867).then(n.bind(n,138)),"@site/versioned_docs/version-0.11.2/rules/must_be_api.md",138],cb00cd0b:[()=>n.e(3263).then(n.bind(n,62768)),"@site/versioned_docs/version-0.10.0/rules/kapt/custom_kapt_matchers.md",62768],cb4f58ba:[()=>n.e(4074).then(n.bind(n,75686)),"@site/versioned_docs/version-0.11.2/ci_workflow.md",75686],cbb899e4:[()=>Promise.all([n.e(1869),n.e(5235)]).then(n.bind(n,94266)),"@site/docs/configuration.mdx",94266],cbe609e8:[()=>n.e(9991).then(n.bind(n,30094)),"@site/docs/rules/overshot_dependency.md",30094],cc640607:[()=>n.e(5050).then(n.bind(n,10850)),"@site/versioned_docs/version-0.12.2/rules/android/unused_kotlin_android_extensions.md",10850],cd2aa5fe:[()=>n.e(2376).then(n.bind(n,35358)),"@site/versioned_docs/version-0.12.3/rules/sorting/sort_plugins.md",35358],cd6f4c97:[()=>n.e(1381).then(n.bind(n,36641)),"@site/versioned_docs/version-0.12.3/rules/compiler/unused_kapt_processor.md",36641],ce0be35a:[()=>n.e(9303).then(n.bind(n,70400)),"@site/versioned_docs/version-0.12.0/rules/kapt/unused_kapt_plugin.md",70400],d05f0a7d:[()=>n.e(9230).then(n.bind(n,18678)),"@site/versioned_docs/version-0.10.0/rules/overshot.md",18678],d1cdaf24:[()=>n.e(4996).then(n.t.bind(n,68800,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-12-3-48f.json",68800],d2866892:[()=>n.e(1900).then(n.bind(n,5168)),"@site/versioned_docs/version-0.12.1/rules/compiler/unused_kapt_processor.md",5168],d425c21a:[()=>n.e(5673).then(n.bind(n,64533)),"@site/versioned_docs/version-0.12.4/rules/unused_dependency.md",64533],d4bc87de:[()=>n.e(3832).then(n.t.bind(n,86646,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-11-2-f40.json",86646],d51efe31:[()=>Promise.all([n.e(1869),n.e(183)]).then(n.bind(n,27923)),"@site/versioned_docs/version-0.12.3/quickstart.mdx",27923],d69a7b0b:[()=>n.e(4410).then(n.bind(n,6137)),"@site/versioned_docs/version-0.12.3/rules/project_depth.md",6137],d968e4da:[()=>n.e(5326).then(n.bind(n,65452)),"@site/versioned_docs/version-0.12.4/rules/android/disable_view_binding.md",65452],dc7f0b30:[()=>n.e(8296).then(n.bind(n,38200)),"@site/versioned_docs/version-0.11.3/rules/android/disable_resources.md",38200],de297161:[()=>n.e(1658).then(n.bind(n,63148)),"@site/versioned_docs/version-0.12.5/rules/compiler/unused_kapt_processor.md",63148],de406b5e:[()=>n.e(6364).then(n.bind(n,9930)),"@site/versioned_docs/version-0.11.2/rules/sorting/sort_plugins.md",9930],df248b36:[()=>n.e(1686).then(n.bind(n,84629)),"@site/versioned_docs/version-0.11.1/rules/kapt/unused_kapt_plugin.md",84629],e0474f93:[()=>n.e(8861).then(n.bind(n,5919)),"@site/versioned_docs/version-0.12.5/rules/android/disable_android_resources.md",5919],e0a1aa17:[()=>n.e(2304).then(n.bind(n,12069)),"@site/versioned_docs/version-0.12.0/rules/redundant_dependency.md",12069],e12d7f74:[()=>n.e(9369).then(n.bind(n,62659)),"@site/versioned_docs/version-0.12.4/rules/redundant_dependency.md",62659],e4603b0e:[()=>Promise.all([n.e(1869),n.e(3108)]).then(n.bind(n,22513)),"@site/versioned_docs/version-0.12.5/configuration.mdx",22513],e480558e:[()=>n.e(7107).then(n.bind(n,78397)),"@site/versioned_docs/version-0.12.1/rules/compiler/unused_kapt_plugin.md",78397],e4d3d2e1:[()=>n.e(1647).then(n.bind(n,79013)),"@site/versioned_docs/version-0.11.0/rules/must_be_api.md",79013],e4f0c0bc:[()=>n.e(1338).then(n.bind(n,61546)),"@site/versioned_docs/version-0.12.5/rules/unused_dependency.md",61546],e5eedb42:[()=>n.e(9568).then(n.bind(n,59921)),"@site/versioned_docs/version-0.12.4/rules/android/disable_android_resources.md",59921],e69e4b95:[()=>n.e(2880).then(n.bind(n,55079)),"@site/docs/rules/android/disable_view_binding.md",55079],e7f8ca4b:[()=>n.e(575).then(n.bind(n,50353)),"@site/versioned_docs/version-0.12.3/rules/sorting/sort_dependencies.md",50353],e819ef22:[()=>n.e(247).then(n.t.bind(n,16240,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-12-0-e0d.json",16240],e8303188:[()=>n.e(6545).then(n.bind(n,89097)),"@site/versioned_docs/version-0.11.3/rules/android/disable_viewbinding.md",89097],eadc19b4:[()=>n.e(2946).then(n.bind(n,94064)),"@site/versioned_docs/version-0.11.0/rules/kapt/custom_kapt_matchers.md",94064],eb10ccf4:[()=>n.e(629).then(n.bind(n,49642)),"@site/versioned_docs/version-0.12.1/rules/sorting/sort_plugins.md",49642],eb678835:[()=>n.e(7671).then(n.bind(n,5277)),"@site/versioned_docs/version-0.12.5/rules/compiler/unused_kapt_plugin.md",5277],ede96f45:[()=>Promise.all([n.e(1869),n.e(1007)]).then(n.bind(n,95838)),"@site/versioned_docs/version-0.12.3/suppressing-findings.mdx",95838],ef09bccd:[()=>n.e(6823).then(n.bind(n,17135)),"@site/versioned_docs/version-0.12.3/rules/must_be_api.md",17135],ef46515e:[()=>Promise.all([n.e(1869),n.e(2852)]).then(n.bind(n,58114)),"@site/versioned_docs/version-0.12.1/configuration.mdx",58114],f354998b:[()=>n.e(6673).then(n.bind(n,45247)),"@site/versioned_docs/version-0.12.4/rules/project_depth.md",45247],f399bb6f:[()=>n.e(6884).then(n.bind(n,62826)),"@site/versioned_docs/version-0.11.2/rules/kapt/unused_kapt_plugin.md",62826],f435945d:[()=>Promise.all([n.e(1869),n.e(7509)]).then(n.bind(n,52767)),"@site/versioned_docs/version-0.12.5/suppressing-findings.mdx",52767],f9546978:[()=>n.e(4025).then(n.bind(n,97905)),"@site/versioned_docs/version-0.12.4/rules/compiler/custom_kapt_matchers.md",97905],f963ac8e:[()=>n.e(9440).then(n.bind(n,37588)),"@site/versioned_docs/version-0.12.5/rules/compiler/use_anvil_factory_generation.md",37588],fb031341:[()=>n.e(5397).then(n.bind(n,19282)),"@site/versioned_docs/version-0.11.3/rules/sorting/sort_plugins.md",19282],fde89899:[()=>n.e(4719).then(n.t.bind(n,36442,19)),"@generated/docusaurus-plugin-content-docs/default/p/module-check-docs-0-12-2-43d.json",36442],ff366317:[()=>n.e(1349).then(n.bind(n,86811)),"@site/versioned_docs/version-0.12.1/rules/must_be_api.md",86811],ffeead90:[()=>n.e(5817).then(n.bind(n,74280)),"@site/versioned_docs/version-0.10.0/rules/kapt/unused_kapt_processor.md",74280]};var i=n(23420);function c({error:e,retry:t,pastDelay:n}){return e?(0,i.jsxs)("div",{style:{textAlign:"center",color:"#fff",backgroundColor:"#fa383e",borderColor:"#fa383e",borderStyle:"solid",borderRadius:"0.25rem",borderWidth:"1px",boxSizing:"border-box",display:"block",padding:"1rem",flex:"0 0 50%",marginLeft:"25%",marginRight:"25%",marginTop:"5rem",maxWidth:"50%",width:"100%"},children:[(0,i.jsx)("p",{children:String(e)}),(0,i.jsx)("div",{children:(0,i.jsx)("button",{type:"button",onClick:t,children:"Retry"})})]}):n?(0,i.jsx)("div",{style:{display:"flex",justifyContent:"center",alignItems:"center",height:"100vh"},children:(0,i.jsx)("svg",{id:"loader",style:{width:128,height:110,position:"absolute",top:"calc(100vh - 64%)"},viewBox:"0 0 45 45",xmlns:"http://www.w3.org/2000/svg",stroke:"#61dafb",children:(0,i.jsxs)("g",{fill:"none",fillRule:"evenodd",transform:"translate(1 1)",strokeWidth:"2",children:[(0,i.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,i.jsx)("animate",{attributeName:"r",begin:"1.5s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-opacity",begin:"1.5s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-width",begin:"1.5s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,i.jsxs)("circle",{cx:"22",cy:"22",r:"6",strokeOpacity:"0",children:[(0,i.jsx)("animate",{attributeName:"r",begin:"3s",dur:"3s",values:"6;22",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-opacity",begin:"3s",dur:"3s",values:"1;0",calcMode:"linear",repeatCount:"indefinite"}),(0,i.jsx)("animate",{attributeName:"stroke-width",begin:"3s",dur:"3s",values:"2;0",calcMode:"linear",repeatCount:"indefinite"})]}),(0,i.jsx)("circle",{cx:"22",cy:"22",r:"8",children:(0,i.jsx)("animate",{attributeName:"r",begin:"0s",dur:"1.5s",values:"6;1;2;3;4;5;6",calcMode:"linear",repeatCount:"indefinite"})})]})})}):null}var l=n(36849),u=n(77414);function d(e,t){if("*"===e)return o()({loading:c,loader:()=>n.e(3471).then(n.bind(n,63471)),modules:["@theme/NotFound"],webpack:()=>[63471],render(e,t){const n=e.default;return(0,i.jsx)(u.W,{value:{plugin:{name:"native",id:"default"}},children:(0,i.jsx)(n,{...t})})}});const r=a[`${e}-${t}`],d={},p=[],f=[],h=(0,l.A)(r);return Object.entries(h).forEach(([e,t])=>{const n=s[t];n&&(d[e]=n[0],p.push(n[1]),f.push(n[2]))}),o().Map({loading:c,loader:d,modules:p,webpack:()=>f,render(t,n){const o=JSON.parse(JSON.stringify(r));Object.entries(t).forEach(([t,n])=>{const r=n.default;if(!r)throw new Error(`The page component at ${e} doesn't have a default export. This makes it impossible to render anything. Consider default-exporting a React component.`);"object"!=typeof r&&"function"!=typeof r||Object.keys(n).filter(e=>"default"!==e).forEach(e=>{r[e]=n[e]});let a=o;const s=t.split(".");s.slice(0,-1).forEach(e=>{a=a[e]}),a[s[s.length-1]]=r});const a=o.__comp;delete o.__comp;const s=o.__context;delete o.__context;const c=o.__props;return delete o.__props,(0,i.jsx)(u.W,{value:s,children:(0,i.jsx)(a,{...o,...c,...n})})}})}const p=[{path:"/ModuleCheck/changelog",component:d("/ModuleCheck/changelog","6c5"),exact:!0},{path:"/ModuleCheck/migrations",component:d("/ModuleCheck/migrations","b20"),exact:!0},{path:"/ModuleCheck/search",component:d("/ModuleCheck/search","b2c"),exact:!0},{path:"/ModuleCheck/docs",component:d("/ModuleCheck/docs","ea9"),routes:[{path:"/ModuleCheck/docs/0.10.0",component:d("/ModuleCheck/docs/0.10.0","69a"),routes:[{path:"/ModuleCheck/docs/0.10.0",component:d("/ModuleCheck/docs/0.10.0","acc"),routes:[{path:"/ModuleCheck/docs/0.10.0/",component:d("/ModuleCheck/docs/0.10.0/","efa"),exact:!0,sidebar:"Basics"},{path:"/ModuleCheck/docs/0.10.0/configuration",component:d("/ModuleCheck/docs/0.10.0/configuration","4f3"),exact:!0,sidebar:"Basics"},{path:"/ModuleCheck/docs/0.10.0/mdx",component:d("/ModuleCheck/docs/0.10.0/mdx","60c"),exact:!0},{path:"/ModuleCheck/docs/0.10.0/rules/android/disable_resources",component:d("/ModuleCheck/docs/0.10.0/rules/android/disable_resources","3a2"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/android/disable_viewbinding",component:d("/ModuleCheck/docs/0.10.0/rules/android/disable_viewbinding","4d4"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers","0fe"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin","1f9"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor",component:d("/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor","d30"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/overshot",component:d("/ModuleCheck/docs/0.10.0/rules/overshot","771"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/redundant",component:d("/ModuleCheck/docs/0.10.0/rules/redundant","c5b"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies",component:d("/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies","b11"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins",component:d("/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins","de5"),exact:!0,sidebar:"Rules"},{path:"/ModuleCheck/docs/0.10.0/rules/unused",component:d("/ModuleCheck/docs/0.10.0/rules/unused","f7f"),exact:!0,sidebar:"Rules"}]}]},{path:"/ModuleCheck/docs/0.11.0",component:d("/ModuleCheck/docs/0.11.0","00d"),routes:[{path:"/ModuleCheck/docs/0.11.0",component:d("/ModuleCheck/docs/0.11.0","c05"),routes:[{path:"/ModuleCheck/docs/0.11.0/",component:d("/ModuleCheck/docs/0.11.0/","110"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/configuration",component:d("/ModuleCheck/docs/0.11.0/configuration","511"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/android/disable_resources",component:d("/ModuleCheck/docs/0.11.0/rules/android/disable_resources","f78"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/android/disable_viewbinding",component:d("/ModuleCheck/docs/0.11.0/rules/android/disable_viewbinding","cff"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory",component:d("/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory","953"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.11.0/rules/inherited_dependency","83f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers","a1a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin","e0c"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor",component:d("/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor","322"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/must_be_api",component:d("/ModuleCheck/docs/0.11.0/rules/must_be_api","66f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies",component:d("/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies","077"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins",component:d("/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins","b83"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.0/rules/unused",component:d("/ModuleCheck/docs/0.11.0/rules/unused","84a"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.11.1",component:d("/ModuleCheck/docs/0.11.1","fdf"),routes:[{path:"/ModuleCheck/docs/0.11.1",component:d("/ModuleCheck/docs/0.11.1","709"),routes:[{path:"/ModuleCheck/docs/0.11.1/",component:d("/ModuleCheck/docs/0.11.1/","a1a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/configuration",component:d("/ModuleCheck/docs/0.11.1/configuration","4f3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/android/disable_resources",component:d("/ModuleCheck/docs/0.11.1/rules/android/disable_resources","551"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/android/disable_viewbinding",component:d("/ModuleCheck/docs/0.11.1/rules/android/disable_viewbinding","5c0"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory",component:d("/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory","fc2"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.11.1/rules/inherited_dependency","01b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers","cc4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin","85d"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor",component:d("/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor","31b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/must_be_api",component:d("/ModuleCheck/docs/0.11.1/rules/must_be_api","f93"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies",component:d("/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies","f1c"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins",component:d("/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins","2ac"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.1/rules/unused",component:d("/ModuleCheck/docs/0.11.1/rules/unused","a1e"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.11.2",component:d("/ModuleCheck/docs/0.11.2","936"),routes:[{path:"/ModuleCheck/docs/0.11.2",component:d("/ModuleCheck/docs/0.11.2","ad2"),routes:[{path:"/ModuleCheck/docs/0.11.2/",component:d("/ModuleCheck/docs/0.11.2/","b89"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/ci-workflow",component:d("/ModuleCheck/docs/0.11.2/ci-workflow","e0f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/configuration",component:d("/ModuleCheck/docs/0.11.2/configuration","c88"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/android/disable_resources",component:d("/ModuleCheck/docs/0.11.2/rules/android/disable_resources","7cd"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/android/disable_viewbinding",component:d("/ModuleCheck/docs/0.11.2/rules/android/disable_viewbinding","59f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory",component:d("/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory","c8f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.11.2/rules/inherited_dependency","d33"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers","f07"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin","f7f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor",component:d("/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor","053"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/must_be_api",component:d("/ModuleCheck/docs/0.11.2/rules/must_be_api","4c3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies",component:d("/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies","abd"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins",component:d("/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins","d80"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.2/rules/unused",component:d("/ModuleCheck/docs/0.11.2/rules/unused","789"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.11.3",component:d("/ModuleCheck/docs/0.11.3","0ce"),routes:[{path:"/ModuleCheck/docs/0.11.3",component:d("/ModuleCheck/docs/0.11.3","f4b"),routes:[{path:"/ModuleCheck/docs/0.11.3/",component:d("/ModuleCheck/docs/0.11.3/","5e5"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/ci-workflow",component:d("/ModuleCheck/docs/0.11.3/ci-workflow","b4a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/configuration",component:d("/ModuleCheck/docs/0.11.3/configuration","1c6"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/android/disable_resources",component:d("/ModuleCheck/docs/0.11.3/rules/android/disable_resources","11b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/android/disable_viewbinding",component:d("/ModuleCheck/docs/0.11.3/rules/android/disable_viewbinding","e1e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory",component:d("/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory","291"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.11.3/rules/inherited_dependency","712"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers","75a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin","e38"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor",component:d("/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor","783"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/must_be_api",component:d("/ModuleCheck/docs/0.11.3/rules/must_be_api","671"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies",component:d("/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies","2ad"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins",component:d("/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins","b98"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/rules/unused",component:d("/ModuleCheck/docs/0.11.3/rules/unused","ba3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.11.3/suppressing-findings",component:d("/ModuleCheck/docs/0.11.3/suppressing-findings","d13"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.12.0",component:d("/ModuleCheck/docs/0.12.0","ae3"),routes:[{path:"/ModuleCheck/docs/0.12.0",component:d("/ModuleCheck/docs/0.12.0","e9b"),routes:[{path:"/ModuleCheck/docs/0.12.0/",component:d("/ModuleCheck/docs/0.12.0/","afb"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/ci-workflow",component:d("/ModuleCheck/docs/0.12.0/ci-workflow","29e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/configuration",component:d("/ModuleCheck/docs/0.12.0/configuration","d18"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/android/disable_resources",component:d("/ModuleCheck/docs/0.12.0/rules/android/disable_resources","c59"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding",component:d("/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding","e07"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensions",component:d("/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensions","474"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory",component:d("/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory","9f3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/depths",component:d("/ModuleCheck/docs/0.12.0/rules/depths","106"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.12.0/rules/inherited_dependency","4c6"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers","9d7"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin","28a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor",component:d("/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor","247"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/must_be_api",component:d("/ModuleCheck/docs/0.12.0/rules/must_be_api","529"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/overshot_dependency",component:d("/ModuleCheck/docs/0.12.0/rules/overshot_dependency","d6f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/redundant_dependency",component:d("/ModuleCheck/docs/0.12.0/rules/redundant_dependency","8f3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies",component:d("/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies","30d"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins",component:d("/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins","694"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/rules/unused",component:d("/ModuleCheck/docs/0.12.0/rules/unused","6a4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.0/suppressing-findings",component:d("/ModuleCheck/docs/0.12.0/suppressing-findings","8de"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.12.1",component:d("/ModuleCheck/docs/0.12.1","254"),routes:[{path:"/ModuleCheck/docs/0.12.1",component:d("/ModuleCheck/docs/0.12.1","d14"),routes:[{path:"/ModuleCheck/docs/0.12.1/",component:d("/ModuleCheck/docs/0.12.1/","75e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/ci-workflow",component:d("/ModuleCheck/docs/0.12.1/ci-workflow","c9b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/configuration",component:d("/ModuleCheck/docs/0.12.1/configuration","584"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers","68b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/disable_android_resources",component:d("/ModuleCheck/docs/0.12.1/rules/disable_android_resources","bc2"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/disable_view_binding",component:d("/ModuleCheck/docs/0.12.1/rules/disable_view_binding","133"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.12.1/rules/inherited_dependency","c72"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/must_be_api",component:d("/ModuleCheck/docs/0.12.1/rules/must_be_api","5b1"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/overshot_dependency",component:d("/ModuleCheck/docs/0.12.1/rules/overshot_dependency","4bd"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/project_depth",component:d("/ModuleCheck/docs/0.12.1/rules/project_depth","4c1"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/redundant_dependency",component:d("/ModuleCheck/docs/0.12.1/rules/redundant_dependency","07b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/sort_dependencies",component:d("/ModuleCheck/docs/0.12.1/rules/sort_dependencies","deb"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/sort_plugins",component:d("/ModuleCheck/docs/0.12.1/rules/sort_plugins","c1d"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/unused_dependency",component:d("/ModuleCheck/docs/0.12.1/rules/unused_dependency","5ae"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin","fd6"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor",component:d("/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor","e05"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensions",component:d("/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensions","13b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation",component:d("/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation","164"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.1/suppressing-findings",component:d("/ModuleCheck/docs/0.12.1/suppressing-findings","6c9"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.12.2",component:d("/ModuleCheck/docs/0.12.2","f87"),routes:[{path:"/ModuleCheck/docs/0.12.2",component:d("/ModuleCheck/docs/0.12.2","35b"),routes:[{path:"/ModuleCheck/docs/0.12.2/",component:d("/ModuleCheck/docs/0.12.2/","fb0"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/ci-workflow",component:d("/ModuleCheck/docs/0.12.2/ci-workflow","b8a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/configuration",component:d("/ModuleCheck/docs/0.12.2/configuration","832"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers","7d4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/disable_android_resources",component:d("/ModuleCheck/docs/0.12.2/rules/disable_android_resources","402"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/disable_view_binding",component:d("/ModuleCheck/docs/0.12.2/rules/disable_view_binding","271"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.12.2/rules/inherited_dependency","ff3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/must_be_api",component:d("/ModuleCheck/docs/0.12.2/rules/must_be_api","17f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/overshot_dependency",component:d("/ModuleCheck/docs/0.12.2/rules/overshot_dependency","a62"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/project_depth",component:d("/ModuleCheck/docs/0.12.2/rules/project_depth","06c"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/redundant_dependency",component:d("/ModuleCheck/docs/0.12.2/rules/redundant_dependency","abd"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/sort_dependencies",component:d("/ModuleCheck/docs/0.12.2/rules/sort_dependencies","0bd"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/sort_plugins",component:d("/ModuleCheck/docs/0.12.2/rules/sort_plugins","f4e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/unused_dependency",component:d("/ModuleCheck/docs/0.12.2/rules/unused_dependency","9a1"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin","f08"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor",component:d("/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor","951"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensions",component:d("/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensions","191"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation",component:d("/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation","acb"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.2/suppressing-findings",component:d("/ModuleCheck/docs/0.12.2/suppressing-findings","566"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.12.3",component:d("/ModuleCheck/docs/0.12.3","995"),routes:[{path:"/ModuleCheck/docs/0.12.3",component:d("/ModuleCheck/docs/0.12.3","549"),routes:[{path:"/ModuleCheck/docs/0.12.3/",component:d("/ModuleCheck/docs/0.12.3/","bdc"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/ci-workflow",component:d("/ModuleCheck/docs/0.12.3/ci-workflow","2b2"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/configuration",component:d("/ModuleCheck/docs/0.12.3/configuration","081"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers","73d"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/disable_android_resources",component:d("/ModuleCheck/docs/0.12.3/rules/disable_android_resources","8b6"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/disable_view_binding",component:d("/ModuleCheck/docs/0.12.3/rules/disable_view_binding","153"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.12.3/rules/inherited_dependency","487"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/must_be_api",component:d("/ModuleCheck/docs/0.12.3/rules/must_be_api","4ba"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/overshot_dependency",component:d("/ModuleCheck/docs/0.12.3/rules/overshot_dependency","54b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/project_depth",component:d("/ModuleCheck/docs/0.12.3/rules/project_depth","1bf"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/redundant_dependency",component:d("/ModuleCheck/docs/0.12.3/rules/redundant_dependency","65b"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/sort_dependencies",component:d("/ModuleCheck/docs/0.12.3/rules/sort_dependencies","303"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/sort_plugins",component:d("/ModuleCheck/docs/0.12.3/rules/sort_plugins","9ba"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/unused_dependency",component:d("/ModuleCheck/docs/0.12.3/rules/unused_dependency","bf4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin","2f6"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor",component:d("/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor","75e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensions",component:d("/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensions","127"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation",component:d("/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation","522"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.3/suppressing-findings",component:d("/ModuleCheck/docs/0.12.3/suppressing-findings","71e"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/0.12.4",component:d("/ModuleCheck/docs/0.12.4","3a4"),routes:[{path:"/ModuleCheck/docs/0.12.4",component:d("/ModuleCheck/docs/0.12.4","27f"),routes:[{path:"/ModuleCheck/docs/0.12.4/",component:d("/ModuleCheck/docs/0.12.4/","e8d"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/ci-workflow",component:d("/ModuleCheck/docs/0.12.4/ci-workflow","8b5"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/configuration",component:d("/ModuleCheck/docs/0.12.4/configuration","6b4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers",component:d("/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers","b37"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/disable_android_resources",component:d("/ModuleCheck/docs/0.12.4/rules/disable_android_resources","e3e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/disable_view_binding",component:d("/ModuleCheck/docs/0.12.4/rules/disable_view_binding","54e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/inherited_dependency",component:d("/ModuleCheck/docs/0.12.4/rules/inherited_dependency","185"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/must_be_api",component:d("/ModuleCheck/docs/0.12.4/rules/must_be_api","342"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/overshot_dependency",component:d("/ModuleCheck/docs/0.12.4/rules/overshot_dependency","230"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/project_depth",component:d("/ModuleCheck/docs/0.12.4/rules/project_depth","c39"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/redundant_dependency",component:d("/ModuleCheck/docs/0.12.4/rules/redundant_dependency","606"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/sort_dependencies",component:d("/ModuleCheck/docs/0.12.4/rules/sort_dependencies","35a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/sort_plugins",component:d("/ModuleCheck/docs/0.12.4/rules/sort_plugins","690"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/unused_dependency",component:d("/ModuleCheck/docs/0.12.4/rules/unused_dependency","c81"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin",component:d("/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin","088"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor",component:d("/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor","652"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensions",component:d("/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensions","23e"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation",component:d("/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation","b7d"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/0.12.4/suppressing-findings",component:d("/ModuleCheck/docs/0.12.4/suppressing-findings","357"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs/next",component:d("/ModuleCheck/docs/next","5d8"),routes:[{path:"/ModuleCheck/docs/next",component:d("/ModuleCheck/docs/next","b28"),routes:[{path:"/ModuleCheck/docs/next/",component:d("/ModuleCheck/docs/next/","2a1"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/ci-workflow",component:d("/ModuleCheck/docs/next/ci-workflow","7ff"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/configuration",component:d("/ModuleCheck/docs/next/configuration","18d"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/custom_kapt_matchers",component:d("/ModuleCheck/docs/next/rules/custom_kapt_matchers","2df"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/disable_android_resources",component:d("/ModuleCheck/docs/next/rules/disable_android_resources","955"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/disable_view_binding",component:d("/ModuleCheck/docs/next/rules/disable_view_binding","e88"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/inherited_dependency",component:d("/ModuleCheck/docs/next/rules/inherited_dependency","222"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/must_be_api",component:d("/ModuleCheck/docs/next/rules/must_be_api","db1"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/overshot_dependency",component:d("/ModuleCheck/docs/next/rules/overshot_dependency","ed9"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/project_depth",component:d("/ModuleCheck/docs/next/rules/project_depth","4d8"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/redundant_dependency",component:d("/ModuleCheck/docs/next/rules/redundant_dependency","ea9"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/sort_dependencies",component:d("/ModuleCheck/docs/next/rules/sort_dependencies","9f3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/sort_plugins",component:d("/ModuleCheck/docs/next/rules/sort_plugins","ab2"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/unused_dependency",component:d("/ModuleCheck/docs/next/rules/unused_dependency","6a3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/unused_kapt_plugin",component:d("/ModuleCheck/docs/next/rules/unused_kapt_plugin","872"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/unused_kapt_processor",component:d("/ModuleCheck/docs/next/rules/unused_kapt_processor","a4f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/unused_kotlin_android_extensions",component:d("/ModuleCheck/docs/next/rules/unused_kotlin_android_extensions","bbb"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/rules/use_anvil_factory_generation",component:d("/ModuleCheck/docs/next/rules/use_anvil_factory_generation","49a"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/next/suppressing-findings",component:d("/ModuleCheck/docs/next/suppressing-findings","1a5"),exact:!0,sidebar:"Docs"}]}]},{path:"/ModuleCheck/docs",component:d("/ModuleCheck/docs","f3f"),routes:[{path:"/ModuleCheck/docs",component:d("/ModuleCheck/docs","ce9"),routes:[{path:"/ModuleCheck/docs/",component:d("/ModuleCheck/docs/","c72"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/ci-workflow",component:d("/ModuleCheck/docs/ci-workflow","ef4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/configuration",component:d("/ModuleCheck/docs/configuration","ce4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/custom_kapt_matchers",component:d("/ModuleCheck/docs/rules/custom_kapt_matchers","aea"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/disable_android_resources",component:d("/ModuleCheck/docs/rules/disable_android_resources","3b4"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/disable_view_binding",component:d("/ModuleCheck/docs/rules/disable_view_binding","a53"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/inherited_dependency",component:d("/ModuleCheck/docs/rules/inherited_dependency","003"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/must_be_api",component:d("/ModuleCheck/docs/rules/must_be_api","f05"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/overshot_dependency",component:d("/ModuleCheck/docs/rules/overshot_dependency","7f8"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/project_depth",component:d("/ModuleCheck/docs/rules/project_depth","919"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/redundant_dependency",component:d("/ModuleCheck/docs/rules/redundant_dependency","4c1"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/sort_dependencies",component:d("/ModuleCheck/docs/rules/sort_dependencies","8ca"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/sort_plugins",component:d("/ModuleCheck/docs/rules/sort_plugins","e73"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/unused_dependency",component:d("/ModuleCheck/docs/rules/unused_dependency","905"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/unused_kapt_plugin",component:d("/ModuleCheck/docs/rules/unused_kapt_plugin","3c3"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/unused_kapt_processor",component:d("/ModuleCheck/docs/rules/unused_kapt_processor","728"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/unused_kotlin_android_extensions",component:d("/ModuleCheck/docs/rules/unused_kotlin_android_extensions","2b6"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/rules/use_anvil_factory_generation",component:d("/ModuleCheck/docs/rules/use_anvil_factory_generation","a6f"),exact:!0,sidebar:"Docs"},{path:"/ModuleCheck/docs/suppressing-findings",component:d("/ModuleCheck/docs/suppressing-findings","8f6"),exact:!0,sidebar:"Docs"}]}]}]},{path:"/ModuleCheck/",component:d("/ModuleCheck/","f09"),exact:!0},{path:"*",component:d("*")}]},51728:(e,t,n)=>{"use strict";n.d(t,{A:()=>m});var r=n(36672),o=n(20601),a=n(33412),s=n(95758),i=n(64381),c=n(77414),l=n(23420);function u({error:e,tryAgain:t}){return(0,l.jsxs)("div",{style:{display:"flex",flexDirection:"column",justifyContent:"center",alignItems:"flex-start",minHeight:"100vh",width:"100%",maxWidth:"80ch",fontSize:"20px",margin:"0 auto",padding:"1rem"},children:[(0,l.jsx)("h1",{style:{fontSize:"3rem"},children:"This page crashed"}),(0,l.jsx)("button",{type:"button",onClick:t,style:{margin:"1rem 0",fontSize:"2rem",cursor:"pointer",borderRadius:20,padding:"1rem"},children:"Try again"}),(0,l.jsx)(d,{error:e})]})}function d({error:e}){const t=(0,s.rA)(e).map(e=>e.message).join("\n\nCause:\n");return(0,l.jsx)("p",{style:{whiteSpace:"pre-wrap"},children:t})}function p({children:e}){return(0,l.jsx)(c.W,{value:{plugin:{name:"docusaurus-core-error-boundary",id:"default"}},children:e})}function f({error:e,tryAgain:t}){return(0,l.jsx)(p,{children:(0,l.jsxs)(m,{fallback:()=>(0,l.jsx)(u,{error:e,tryAgain:t}),children:[(0,l.jsx)(a.A,{children:(0,l.jsx)("title",{children:"Page Error"})}),(0,l.jsx)(i.A,{children:(0,l.jsx)(u,{error:e,tryAgain:t})})]})})}const h=e=>(0,l.jsx)(f,{...e});class m extends r.Component{constructor(e){super(e),this.state={error:null}}componentDidCatch(e){o.A.canUseDOM&&this.setState({error:e})}render(){const{children:e}=this.props,{error:t}=this.state;if(t){const e={error:t,tryAgain:()=>this.setState({error:null})};return(this.props.fallback??h)(e)}return e??null}}},52245:(e,t,n)=>{"use strict";n.d(t,{A:()=>o});var r=n(36672);const o=n(20601).A.canUseDOM?r.useLayoutEffect:r.useEffect},53499:(e,t,n)=>{"use strict";n.d(t,{A:()=>l,T:()=>c});var r=n(36672),o=n(23420);function a(e,t){const n=e.split(/(\{\w+\})/).map((e,n)=>{if(n%2==1){const n=t?.[e.slice(1,-1)];if(void 0!==n)return n}return e});return n.some(e=>(0,r.isValidElement)(e))?n.map((e,t)=>(0,r.isValidElement)(e)?r.cloneElement(e,{key:t}):e).filter(e=>""!==e):n.join("")}var s=n(22654);function i({id:e,message:t}){if(void 0===e&&void 0===t)throw new Error("Docusaurus translation declarations must have at least a translation id or a default translation message");return s[e??t]??t??e}function c({message:e,id:t},n){return a(i({message:e,id:t}),n)}function l({children:e,id:t,values:n}){if(e&&"string"!=typeof e)throw console.warn("Illegal <Translate> children",e),new Error("The Docusaurus <Translate> component only accept simple string values");const r=i({message:e,id:t});return(0,o.jsx)(o.Fragment,{children:a(r,n)})}},54123:(e,t,n)=>{"use strict";e.exports=n(81690)},54785:(e,t,n)=>{var r=n(5526);e.exports=m,e.exports.parse=a,e.exports.compile=function(e,t){return l(a(e,t),t)},e.exports.tokensToFunction=l,e.exports.tokensToRegExp=h;var o=new RegExp(["(\\\\.)","([\\/.])?(?:(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?|(\\*))"].join("|"),"g");function a(e,t){for(var n,r=[],a=0,i=0,c="",l=t&&t.delimiter||"/";null!=(n=o.exec(e));){var u=n[0],p=n[1],f=n.index;if(c+=e.slice(i,f),i=f+u.length,p)c+=p[1];else{var h=e[i],m=n[2],g=n[3],b=n[4],y=n[5],v=n[6],_=n[7];c&&(r.push(c),c="");var k=null!=m&&null!=h&&h!==m,w="+"===v||"*"===v,C="?"===v||"*"===v,x=m||l,S=b||y,M=m||("string"==typeof r[r.length-1]?r[r.length-1]:"");r.push({name:g||a++,prefix:m||"",delimiter:x,optional:C,repeat:w,partial:k,asterisk:!!_,pattern:S?d(S):_?".*":s(x,M)})}}return i<e.length&&(c+=e.substr(i)),c&&r.push(c),r}function s(e,t){return!t||t.indexOf(e)>-1?"[^"+u(e)+"]+?":u(t)+"|(?:(?!"+u(t)+")[^"+u(e)+"])+?"}function i(e){return encodeURI(e).replace(/[\/?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function c(e){return encodeURI(e).replace(/[?#]/g,function(e){return"%"+e.charCodeAt(0).toString(16).toUpperCase()})}function l(e,t){for(var n=new Array(e.length),o=0;o<e.length;o++)"object"==typeof e[o]&&(n[o]=new RegExp("^(?:"+e[o].pattern+")$",f(t)));return function(t,o){for(var a="",s=t||{},l=(o||{}).pretty?i:encodeURIComponent,u=0;u<e.length;u++){var d=e[u];if("string"!=typeof d){var p,f=s[d.name];if(null==f){if(d.optional){d.partial&&(a+=d.prefix);continue}throw new TypeError('Expected "'+d.name+'" to be defined')}if(r(f)){if(!d.repeat)throw new TypeError('Expected "'+d.name+'" to not repeat, but received `'+JSON.stringify(f)+"`");if(0===f.length){if(d.optional)continue;throw new TypeError('Expected "'+d.name+'" to not be empty')}for(var h=0;h<f.length;h++){if(p=l(f[h]),!n[u].test(p))throw new TypeError('Expected all "'+d.name+'" to match "'+d.pattern+'", but received `'+JSON.stringify(p)+"`");a+=(0===h?d.prefix:d.delimiter)+p}}else{if(p=d.asterisk?c(f):l(f),!n[u].test(p))throw new TypeError('Expected "'+d.name+'" to match "'+d.pattern+'", but received "'+p+'"');a+=d.prefix+p}}else a+=d}return a}}function u(e){return e.replace(/([.+*?=^!:${}()[\]|\/\\])/g,"\\$1")}function d(e){return e.replace(/([=!:$\/()])/g,"\\$1")}function p(e,t){return e.keys=t,e}function f(e){return e&&e.sensitive?"":"i"}function h(e,t,n){r(t)||(n=t||n,t=[]);for(var o=(n=n||{}).strict,a=!1!==n.end,s="",i=0;i<e.length;i++){var c=e[i];if("string"==typeof c)s+=u(c);else{var l=u(c.prefix),d="(?:"+c.pattern+")";t.push(c),c.repeat&&(d+="(?:"+l+d+")*"),s+=d=c.optional?c.partial?l+"("+d+")?":"(?:"+l+"("+d+"))?":l+"("+d+")"}}var h=u(n.delimiter||"/"),m=s.slice(-h.length)===h;return o||(s=(m?s.slice(0,-h.length):s)+"(?:"+h+"(?=$))?"),s+=a?"$":o&&m?"":"(?="+h+"|$)",p(new RegExp("^"+s,f(n)),t)}function m(e,t,n){return r(t)||(n=t||n,t=[]),n=n||{},e instanceof RegExp?function(e,t){var n=e.source.match(/\((?!\?)/g);if(n)for(var r=0;r<n.length;r++)t.push({name:r,prefix:null,delimiter:null,optional:!1,repeat:!1,partial:!1,asterisk:!1,pattern:null});return p(e,t)}(e,t):r(e)?function(e,t,n){for(var r=[],o=0;o<e.length;o++)r.push(m(e[o],t,n).source);return p(new RegExp("(?:"+r.join("|")+")",f(n)),t)}(e,t,n):function(e,t,n){return h(a(e,n),t,n)}(e,t,n)}},56562:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(36672),o=n(47367);function a(){return(0,r.useContext)(o.o)}},56747:(e,t,n)=>{"use strict";n.d(t,{k:()=>a,v:()=>s});var r=n(72408),o=n(12380);function a(e,t){return`docs-${e}-${t}`}function s(){const e=(0,r.Gy)(),t=(0,r.gk)(),n=(0,o.XK)();return[...Object.keys(e).map(function(r){const o=t?.activePlugin.pluginId===r?t.activeVersion:void 0,s=n[r],i=e[r].versions.find(e=>e.isLast);return a(r,(o??s??i).name)})]}},57235:(e,t,n)=>{"use strict";!function e(){if("undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE)try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(e)}catch(t){console.error(t)}}(),e.exports=n(96603)},58212:(e,t,n)=>{"use strict";n.d(t,{I9:()=>d,Kd:()=>u,N_:()=>b,k2:()=>_});var r=n(85291),o=n(10809),a=n(36672),s=n(83332),i=n(70811),c=n(99298),l=n(25385),u=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,s.zR)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var d=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).history=(0,s.TM)(t.props),t}return(0,o.A)(t,e),t.prototype.render=function(){return a.createElement(r.Ix,{history:this.history,children:this.props.children})},t}(a.Component);var p=function(e,t){return"function"==typeof e?e(t):e},f=function(e,t){return"string"==typeof e?(0,s.yJ)(e,null,null,t):e},h=function(e){return e},m=a.forwardRef;void 0===m&&(m=h);var g=m(function(e,t){var n=e.innerRef,r=e.navigate,o=e.onClick,s=(0,c.A)(e,["innerRef","navigate","onClick"]),l=s.target,u=(0,i.A)({},s,{onClick:function(e){try{o&&o(e)}catch(t){throw e.preventDefault(),t}e.defaultPrevented||0!==e.button||l&&"_self"!==l||function(e){return!!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)}(e)||(e.preventDefault(),r())}});return u.ref=h!==m&&t||n,a.createElement("a",u)});var b=m(function(e,t){var n=e.component,o=void 0===n?g:n,u=e.replace,d=e.to,b=e.innerRef,y=(0,c.A)(e,["component","replace","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,function(e){e||(0,l.A)(!1);var n=e.history,r=f(p(d,e.location),e.location),c=r?n.createHref(r):"",g=(0,i.A)({},y,{href:c,navigate:function(){var t=p(d,e.location),r=(0,s.AO)(e.location)===(0,s.AO)(f(t));(u||r?n.replace:n.push)(t)}});return h!==m?g.ref=t||b:g.innerRef=b,a.createElement(o,g)})}),y=function(e){return e},v=a.forwardRef;void 0===v&&(v=y);var _=v(function(e,t){var n=e["aria-current"],o=void 0===n?"page":n,s=e.activeClassName,u=void 0===s?"active":s,d=e.activeStyle,h=e.className,m=e.exact,g=e.isActive,_=e.location,k=e.sensitive,w=e.strict,C=e.style,x=e.to,S=e.innerRef,M=(0,c.A)(e,["aria-current","activeClassName","activeStyle","className","exact","isActive","location","sensitive","strict","style","to","innerRef"]);return a.createElement(r.XZ.Consumer,null,function(e){e||(0,l.A)(!1);var n=_||e.location,s=f(p(x,n),n),c=s.pathname,E=c&&c.replace(/([.+*?=^!:${}()[\]|/\\])/g,"\\$1"),O=E?(0,r.B6)(n.pathname,{path:E,exact:m,sensitive:k,strict:w}):null,A=!!(g?g(O,n):O),j="function"==typeof h?h(A):h,D="function"==typeof C?C(A):C;A&&(j=function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return t.filter(function(e){return e}).join(" ")}(j,u),D=(0,i.A)({},D,d));var P=(0,i.A)({"aria-current":A&&o||null,className:j,style:D,to:s},M);return y!==v?P.ref=t||S:P.innerRef=S,a.createElement(b,P)})})},58744:function(e,t,n){var r,o;r=function(){var e,t,n={version:"0.2.0"},r=n.settings={minimum:.08,easing:"ease",positionUsing:"",speed:200,trickle:!0,trickleRate:.02,trickleSpeed:800,showSpinner:!0,barSelector:'[role="bar"]',spinnerSelector:'[role="spinner"]',parent:"body",template:'<div class="bar" role="bar"><div class="peg"></div></div><div class="spinner" role="spinner"><div class="spinner-icon"></div></div>'};function o(e,t,n){return e<t?t:e>n?n:e}function a(e){return 100*(-1+e)}function s(e,t,n){var o;return(o="translate3d"===r.positionUsing?{transform:"translate3d("+a(e)+"%,0,0)"}:"translate"===r.positionUsing?{transform:"translate("+a(e)+"%,0)"}:{"margin-left":a(e)+"%"}).transition="all "+t+"ms "+n,o}n.configure=function(e){var t,n;for(t in e)void 0!==(n=e[t])&&e.hasOwnProperty(t)&&(r[t]=n);return this},n.status=null,n.set=function(e){var t=n.isStarted();e=o(e,r.minimum,1),n.status=1===e?null:e;var a=n.render(!t),l=a.querySelector(r.barSelector),u=r.speed,d=r.easing;return a.offsetWidth,i(function(t){""===r.positionUsing&&(r.positionUsing=n.getPositioningCSS()),c(l,s(e,u,d)),1===e?(c(a,{transition:"none",opacity:1}),a.offsetWidth,setTimeout(function(){c(a,{transition:"all "+u+"ms linear",opacity:0}),setTimeout(function(){n.remove(),t()},u)},u)):setTimeout(t,u)}),this},n.isStarted=function(){return"number"==typeof n.status},n.start=function(){n.status||n.set(0);var e=function(){setTimeout(function(){n.status&&(n.trickle(),e())},r.trickleSpeed)};return r.trickle&&e(),this},n.done=function(e){return e||n.status?n.inc(.3+.5*Math.random()).set(1):this},n.inc=function(e){var t=n.status;return t?("number"!=typeof e&&(e=(1-t)*o(Math.random()*t,.1,.95)),t=o(t+e,0,.994),n.set(t)):n.start()},n.trickle=function(){return n.inc(Math.random()*r.trickleRate)},e=0,t=0,n.promise=function(r){return r&&"resolved"!==r.state()?(0===t&&n.start(),e++,t++,r.always(function(){0===--t?(e=0,n.done()):n.set((e-t)/e)}),this):this},n.render=function(e){if(n.isRendered())return document.getElementById("nprogress");u(document.documentElement,"nprogress-busy");var t=document.createElement("div");t.id="nprogress",t.innerHTML=r.template;var o,s=t.querySelector(r.barSelector),i=e?"-100":a(n.status||0),l=document.querySelector(r.parent);return c(s,{transition:"all 0 linear",transform:"translate3d("+i+"%,0,0)"}),r.showSpinner||(o=t.querySelector(r.spinnerSelector))&&f(o),l!=document.body&&u(l,"nprogress-custom-parent"),l.appendChild(t),t},n.remove=function(){d(document.documentElement,"nprogress-busy"),d(document.querySelector(r.parent),"nprogress-custom-parent");var e=document.getElementById("nprogress");e&&f(e)},n.isRendered=function(){return!!document.getElementById("nprogress")},n.getPositioningCSS=function(){var e=document.body.style,t="WebkitTransform"in e?"Webkit":"MozTransform"in e?"Moz":"msTransform"in e?"ms":"OTransform"in e?"O":"";return t+"Perspective"in e?"translate3d":t+"Transform"in e?"translate":"margin"};var i=function(){var e=[];function t(){var n=e.shift();n&&n(t)}return function(n){e.push(n),1==e.length&&t()}}(),c=function(){var e=["Webkit","O","Moz","ms"],t={};function n(e){return e.replace(/^-ms-/,"ms-").replace(/-([\da-z])/gi,function(e,t){return t.toUpperCase()})}function r(t){var n=document.body.style;if(t in n)return t;for(var r,o=e.length,a=t.charAt(0).toUpperCase()+t.slice(1);o--;)if((r=e[o]+a)in n)return r;return t}function o(e){return e=n(e),t[e]||(t[e]=r(e))}function a(e,t,n){t=o(t),e.style[t]=n}return function(e,t){var n,r,o=arguments;if(2==o.length)for(n in t)void 0!==(r=t[n])&&t.hasOwnProperty(n)&&a(e,n,r);else a(e,o[1],o[2])}}();function l(e,t){return("string"==typeof e?e:p(e)).indexOf(" "+t+" ")>=0}function u(e,t){var n=p(e),r=n+t;l(n,t)||(e.className=r.substring(1))}function d(e,t){var n,r=p(e);l(e,t)&&(n=r.replace(" "+t+" "," "),e.className=n.substring(1,n.length-1))}function p(e){return(" "+(e.className||"")+" ").replace(/\s+/gi," ")}function f(e){e&&e.parentNode&&e.parentNode.removeChild(e)}return n},void 0===(o="function"==typeof r?r.call(t,n,t,e):r)||(e.exports=o)},58797:(e,t,n)=>{"use strict";n.d(t,{Mq:()=>f,Tv:()=>u,a_:()=>h,gk:()=>m});var r=n(36672),o=n(20601),a=n(64407),s=n(52245),i=n(92471),c=n(23420);const l=r.createContext(void 0);function u({children:e}){const t=function(){const e=(0,r.useRef)(!0);return(0,r.useMemo)(()=>({scrollEventsEnabledRef:e,enableScrollEvents:()=>{e.current=!0},disableScrollEvents:()=>{e.current=!1}}),[])}();return(0,c.jsx)(l.Provider,{value:t,children:e})}function d(){const e=(0,r.useContext)(l);if(null==e)throw new i.dV("ScrollControllerProvider");return e}const p=()=>o.A.canUseDOM?{scrollX:window.pageXOffset,scrollY:window.pageYOffset}:null;function f(e,t=[]){const{scrollEventsEnabledRef:n}=d(),o=(0,r.useRef)(p()),a=(0,i._q)(e);(0,r.useEffect)(()=>{const e=()=>{if(!n.current)return;const e=p();a(e,o.current),o.current=e},t={passive:!0};return e(),window.addEventListener("scroll",e,t),()=>window.removeEventListener("scroll",e,t)},[a,n,...t])}function h(){const e=d(),t=function(){const e=(0,r.useRef)({elem:null,top:0}),t=(0,r.useCallback)(t=>{e.current={elem:t,top:t.getBoundingClientRect().top}},[]),n=(0,r.useCallback)(()=>{const{current:{elem:t,top:n}}=e;if(!t)return{restored:!1};const r=t.getBoundingClientRect().top-n;return r&&window.scrollBy({left:0,top:r}),e.current={elem:null,top:0},{restored:0!==r}},[]);return(0,r.useMemo)(()=>({save:t,restore:n}),[n,t])}(),n=(0,r.useRef)(void 0),o=(0,r.useCallback)(r=>{t.save(r),e.disableScrollEvents(),n.current=()=>{const{restored:r}=t.restore();if(n.current=void 0,r){const t=()=>{e.enableScrollEvents(),window.removeEventListener("scroll",t)};window.addEventListener("scroll",t)}else e.enableScrollEvents()}},[e,t]);return(0,s.A)(()=>{queueMicrotask(()=>n.current?.())}),{blockElementScrollPositionUntilNextRender:o}}function m(){const e=(0,r.useRef)(null),t=(0,a.A)()&&"smooth"===getComputedStyle(document.documentElement).scrollBehavior;return{startScroll:n=>{e.current=t?function(e){return window.scrollTo({top:e,behavior:"smooth"}),()=>{}}(n):function(e){let t=null;const n=document.documentElement.scrollTop>e;return function r(){const o=document.documentElement.scrollTop;(n&&o>e||!n&&o<e)&&(t=requestAnimationFrame(r),window.scrollTo(0,Math.floor(.85*(o-e))+e))}(),()=>t&&cancelAnimationFrame(t)}(n)},cancelScroll:()=>e.current?.()}}},62945:e=>{e.exports=function(e,t,n,r){var o=n?n.call(r,e,t):void 0;if(void 0!==o)return!!o;if(e===t)return!0;if("object"!=typeof e||!e||"object"!=typeof t||!t)return!1;var a=Object.keys(e),s=Object.keys(t);if(a.length!==s.length)return!1;for(var i=Object.prototype.hasOwnProperty.bind(t),c=0;c<a.length;c++){var l=a[c];if(!i(l))return!1;var u=e[l],d=t[l];if(!1===(o=n?n.call(r,u,d,l):void 0)||void 0===o&&u!==d)return!1}return!0}},62985:e=>{"use strict";e.exports="SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED"},63543:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.getErrorCausalChain=function e(t){if(t.cause)return[t,...e(t.cause)];return[t]}},64381:(e,t,n)=>{"use strict";n.d(t,{A:()=>Rt});var r=n(36672),o=n(13526),a=n(51728),s=n(6617),i=n(85291),c=n(53499),l=n(27019),u=n(23420);const d="__docusaurus_skipToContent_fallback";function p(e){e.setAttribute("tabindex","-1"),e.focus(),e.removeAttribute("tabindex")}function f(){const e=(0,r.useRef)(null),{action:t}=(0,i.W6)(),n=(0,r.useCallback)(e=>{e.preventDefault();const t=document.querySelector("main:first-of-type")??document.getElementById(d);t&&p(t)},[]);return(0,l.$)(({location:n})=>{e.current&&!n.hash&&"PUSH"===t&&p(e.current)}),{containerRef:e,onClick:n}}const h=(0,c.T)({id:"theme.common.skipToMainContent",description:"The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation",message:"Skip to main content"});function m(e){const t=e.children??h,{containerRef:n,onClick:r}=f();return(0,u.jsx)("div",{ref:n,role:"region","aria-label":h,children:(0,u.jsx)("a",{...e,href:`#${d}`,onClick:r,children:t})})}var g=n(84862),b=n(14952);const y={skipToContent:"skipToContent_X_hG"};function v(){return(0,u.jsx)(m,{className:y.skipToContent})}var _=n(67797),k=n(71850);function w({width:e=21,height:t=21,color:n="currentColor",strokeWidth:r=1.2,className:o,...a}){return(0,u.jsx)("svg",{viewBox:"0 0 15 15",width:e,height:t,...a,children:(0,u.jsx)("g",{stroke:n,strokeWidth:r,children:(0,u.jsx)("path",{d:"M.75.75l13.5 13.5M14.25.75L.75 14.25"})})})}const C={closeButton:"closeButton_D4Iw"};function x(e){return(0,u.jsx)("button",{type:"button","aria-label":(0,c.T)({id:"theme.AnnouncementBar.closeButtonAriaLabel",message:"Close",description:"The ARIA label for close button of announcement bar"}),...e,className:(0,o.A)("clean-btn close",C.closeButton,e.className),children:(0,u.jsx)(w,{width:14,height:14,strokeWidth:3.1})})}const S={content:"content_pIKM"};function M(e){const{announcementBar:t}=(0,_.p)(),{content:n}=t;return(0,u.jsx)("div",{...e,className:(0,o.A)(S.content,e.className),dangerouslySetInnerHTML:{__html:n}})}const E={announcementBar:"announcementBar_ExsL",announcementBarPlaceholder:"announcementBarPlaceholder_vZsE",announcementBarClose:"announcementBarClose_kfzw",announcementBarContent:"announcementBarContent_aTCg"};function O(){const{announcementBar:e}=(0,_.p)(),{isActive:t,close:n}=(0,k.M)();if(!t)return null;const{backgroundColor:r,textColor:a,isCloseable:s}=e;return(0,u.jsxs)("div",{className:(0,o.A)(g.G.announcementBar.container,E.announcementBar),style:{backgroundColor:r,color:a},role:"banner",children:[s&&(0,u.jsx)("div",{className:E.announcementBarPlaceholder}),(0,u.jsx)(M,{className:E.announcementBarContent}),s&&(0,u.jsx)(x,{onClick:n,className:E.announcementBarClose})]})}var A=n(83386),j=n(58797);var D=n(92471),P=n(98099);const T=r.createContext(null);function I({children:e}){const t=function(){const e=(0,A.M)(),t=(0,P.YL)(),[n,o]=(0,r.useState)(!1),a=null!==t.component,s=(0,D.ZC)(a);return(0,r.useEffect)(()=>{a&&!s&&o(!0)},[a,s]),(0,r.useEffect)(()=>{a?e.shown||o(!0):o(!1)},[e.shown,a]),(0,r.useMemo)(()=>[n,o],[n])}();return(0,u.jsx)(T.Provider,{value:t,children:e})}function N(e){if(e.component){const t=e.component;return(0,u.jsx)(t,{...e.props})}}function L(){const e=(0,r.useContext)(T);if(!e)throw new D.dV("NavbarSecondaryMenuDisplayProvider");const[t,n]=e,o=(0,r.useCallback)(()=>n(!1),[n]),a=(0,P.YL)();return(0,r.useMemo)(()=>({shown:t,hide:o,content:N(a)}),[o,a,t])}function R(e){return parseInt(r.version.split(".")[0],10)<19?{inert:e?"":void 0}:{inert:e}}function F({children:e,inert:t}){return(0,u.jsx)("div",{className:(0,o.A)(g.G.layout.navbar.mobileSidebar.panel,"navbar-sidebar__item menu"),...R(t),children:e})}function z({header:e,primaryMenu:t,secondaryMenu:n}){const{shown:r}=L();return(0,u.jsxs)("div",{className:(0,o.A)(g.G.layout.navbar.mobileSidebar.container,"navbar-sidebar"),children:[e,(0,u.jsxs)("div",{className:(0,o.A)("navbar-sidebar__items",{"navbar-sidebar__items--show-secondary":r}),children:[(0,u.jsx)(F,{inert:r,children:t}),(0,u.jsx)(F,{inert:!r,children:n})]})]})}var B=n(43062),$=n(64407);function U(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"})})}function q(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"})})}function H(e){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:24,height:24,...e,children:(0,u.jsx)("path",{fill:"currentColor",d:"m12 21c4.971 0 9-4.029 9-9s-4.029-9-9-9-9 4.029-9 9 4.029 9 9 9zm4.95-13.95c1.313 1.313 2.05 3.093 2.05 4.95s-0.738 3.637-2.05 4.95c-1.313 1.313-3.093 2.05-4.95 2.05v-14c1.857 0 3.637 0.737 4.95 2.05z"})})}const V="toggle_bfyf",W="toggleButton_DDky",G="toggleIcon_BNLx",K="systemToggleIcon_Ctr3",Q="lightToggleIcon_FoKC",Y="darkToggleIcon_lNmY",Z="toggleButtonDisabled_U1cX";function X(e){switch(e){case null:return(0,c.T)({message:"system mode",id:"theme.colorToggle.ariaLabel.mode.system",description:"The name for the system color mode"});case"light":return(0,c.T)({message:"light mode",id:"theme.colorToggle.ariaLabel.mode.light",description:"The name for the light color mode"});case"dark":return(0,c.T)({message:"dark mode",id:"theme.colorToggle.ariaLabel.mode.dark",description:"The name for the dark color mode"});default:throw new Error(`unexpected color mode ${e}`)}}function J(e){return(0,c.T)({message:"Switch between dark and light mode (currently {mode})",id:"theme.colorToggle.ariaLabel",description:"The ARIA label for the color mode toggle"},{mode:X(e)})}function ee(){return(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(U,{"aria-hidden":!0,className:(0,o.A)(G,Q)}),(0,u.jsx)(q,{"aria-hidden":!0,className:(0,o.A)(G,Y)}),(0,u.jsx)(H,{"aria-hidden":!0,className:(0,o.A)(G,K)})]})}function te({className:e,buttonClassName:t,respectPrefersColorScheme:n,value:r,onChange:a}){const s=(0,$.A)();return(0,u.jsx)("div",{className:(0,o.A)(V,e),children:(0,u.jsx)("button",{className:(0,o.A)("clean-btn",W,!s&&Z,t),type:"button",onClick:()=>a(function(e,t){if(!t)return"dark"===e?"light":"dark";switch(e){case null:return"light";case"light":return"dark";case"dark":return null;default:throw new Error(`unexpected color mode ${e}`)}}(r,n)),disabled:!s,title:X(r),"aria-label":J(r),children:(0,u.jsx)(ee,{})})})}const ne=r.memo(te),re={darkNavbarColorModeToggle:"darkNavbarColorModeToggle_npDy"};function oe({className:e}){const t=(0,_.p)().navbar.style,{disableSwitch:n,respectPrefersColorScheme:r}=(0,_.p)().colorMode,{colorModeChoice:o,setColorMode:a}=(0,B.G)();return n?null:(0,u.jsx)(ne,{className:e,buttonClassName:"dark"===t?re.darkNavbarColorModeToggle:void 0,respectPrefersColorScheme:r,value:o,onChange:a})}var ae=n(86643);function se(){return(0,u.jsx)(ae.A,{className:"navbar__brand",imageClassName:"navbar__logo",titleClassName:"navbar__title text--truncate"})}function ie(){const e=(0,A.M)();return(0,u.jsx)("button",{type:"button","aria-label":(0,c.T)({id:"theme.docs.sidebar.closeSidebarButtonAriaLabel",message:"Close navigation bar",description:"The ARIA label for close button of mobile sidebar"}),className:"clean-btn navbar-sidebar__close",onClick:()=>e.toggle(),children:(0,u.jsx)(w,{color:"var(--ifm-color-emphasis-600)"})})}function ce(){return(0,u.jsxs)("div",{className:"navbar-sidebar__brand",children:[(0,u.jsx)(se,{}),(0,u.jsx)(oe,{className:"margin-right--md"}),(0,u.jsx)(ie,{})]})}var le=n(75150),ue=n(42977),de=n(4518),pe=n(3025),fe=n(8804);function he({activeBasePath:e,activeBaseRegex:t,to:n,href:r,label:o,html:a,isDropdownLink:s,prependBaseUrlToHref:i,...c}){const l=(0,ue.Ay)(n),d=(0,ue.Ay)(e),p=(0,ue.Ay)(r,{forcePrependBaseUrl:!0}),f=o&&r&&!(0,de.A)(r),h=a?{dangerouslySetInnerHTML:{__html:a}}:{children:(0,u.jsxs)(u.Fragment,{children:[o,f&&(0,u.jsx)(fe.A,{...s&&{width:12,height:12}})]})};return r?(0,u.jsx)(le.A,{href:i?p:r,...c,...h}):(0,u.jsx)(le.A,{to:l,isNavLink:!0,...(e||t)&&{isActive:(e,n)=>t?(0,pe.G)(t,n.pathname):n.pathname.startsWith(d)},...c,...h})}function me({className:e,isDropdownItem:t,...n}){return(0,u.jsx)("li",{className:"menu__list-item",children:(0,u.jsx)(he,{className:(0,o.A)("menu__link",e),...n})})}function ge({className:e,isDropdownItem:t=!1,...n}){const r=(0,u.jsx)(he,{className:(0,o.A)(t?"dropdown__link":"navbar__item navbar__link",e),isDropdownLink:t,...n});return t?(0,u.jsx)("li",{children:r}):r}function be({mobile:e=!1,position:t,...n}){const r=e?me:ge;return(0,u.jsx)(r,{...n,activeClassName:n.activeClassName??(e?"menu__link--active":"navbar__link--active")})}var ye=n(90317),ve=n(91548),_e=n(56562);const ke="dropdownNavbarItemMobile_UUiP";function we(e,t){return e.some(e=>function(e,t){return!!(0,ve.ys)(e.to,t)||!!(0,pe.G)(e.activeBaseRegex,t)||!(!e.activeBasePath||!t.startsWith(e.activeBasePath))}(e,t))}function Ce({collapsed:e,onClick:t}){return(0,u.jsx)("button",{"aria-label":e?(0,c.T)({id:"theme.navbar.mobileDropdown.collapseButton.expandAriaLabel",message:"Expand the dropdown",description:"The ARIA label of the button to expand the mobile dropdown navbar item"}):(0,c.T)({id:"theme.navbar.mobileDropdown.collapseButton.collapseAriaLabel",message:"Collapse the dropdown",description:"The ARIA label of the button to collapse the mobile dropdown navbar item"}),"aria-expanded":!e,type:"button",className:"clean-btn menu__caret",onClick:t})}function xe({items:e,className:t,position:n,onClick:a,...s}){const c=function(){const{siteConfig:{baseUrl:e}}=(0,_e.A)(),{pathname:t}=(0,i.zy)();return t.replace(e,"/")}(),l=(0,ve.ys)(s.to,c),d=we(e,c),{collapsed:p,toggleCollapsed:f}=function({active:e}){const{collapsed:t,toggleCollapsed:n,setCollapsed:o}=(0,ye.u)({initialState:()=>!e});return(0,r.useEffect)(()=>{e&&o(!1)},[e,o]),{collapsed:t,toggleCollapsed:n}}({active:l||d}),h=s.to?void 0:"#";return(0,u.jsxs)("li",{className:(0,o.A)("menu__list-item",{"menu__list-item--collapsed":p}),children:[(0,u.jsxs)("div",{className:(0,o.A)("menu__list-item-collapsible",{"menu__list-item-collapsible--active":l}),children:[(0,u.jsx)(he,{role:"button",className:(0,o.A)(ke,"menu__link menu__link--sublist",t),href:h,...s,onClick:e=>{"#"===h&&e.preventDefault(),f()},children:s.children??s.label}),(0,u.jsx)(Ce,{collapsed:p,onClick:e=>{e.preventDefault(),f()}})]}),(0,u.jsx)(ye.N,{lazy:!0,as:"ul",className:"menu__list",collapsed:p,children:e.map((e,t)=>(0,r.createElement)(Je,{mobile:!0,isDropdownItem:!0,onClick:a,activeClassName:"menu__link--active",...e,key:t}))})]})}function Se({items:e,position:t,className:n,onClick:a,...s}){const i=(0,r.useRef)(null),[c,l]=(0,r.useState)(!1);return(0,r.useEffect)(()=>{const e=e=>{i.current&&!i.current.contains(e.target)&&l(!1)};return document.addEventListener("mousedown",e),document.addEventListener("touchstart",e),document.addEventListener("focusin",e),()=>{document.removeEventListener("mousedown",e),document.removeEventListener("touchstart",e),document.removeEventListener("focusin",e)}},[i]),(0,u.jsxs)("div",{ref:i,className:(0,o.A)("navbar__item","dropdown","dropdown--hoverable",{"dropdown--right":"right"===t,"dropdown--show":c}),children:[(0,u.jsx)(he,{"aria-haspopup":"true","aria-expanded":c,role:"button",href:s.to?void 0:"#",className:(0,o.A)("navbar__link",n),...s,onClick:s.to?void 0:e=>e.preventDefault(),onKeyDown:e=>{"Enter"===e.key&&(e.preventDefault(),l(!c))},children:s.children??s.label}),(0,u.jsx)("ul",{className:"dropdown__menu",children:e.map((e,t)=>(0,r.createElement)(Je,{isDropdownItem:!0,activeClassName:"dropdown__link--active",...e,key:t}))})]})}function Me({mobile:e=!1,...t}){const n=e?xe:Se;return(0,u.jsx)(n,{...t})}var Ee=n(17882);function Oe({width:e=20,height:t=20,...n}){return(0,u.jsx)("svg",{viewBox:"0 0 24 24",width:e,height:t,"aria-hidden":!0,...n,children:(0,u.jsx)("path",{fill:"currentColor",d:"M12.87 15.07l-2.54-2.51.03-.03c1.74-1.94 2.98-4.17 3.71-6.53H17V4h-7V2H8v2H1v1.99h11.17C11.5 7.92 10.44 9.75 9 11.35 8.07 10.32 7.3 9.19 6.69 8h-2c.73 1.63 1.73 3.17 2.98 4.56l-5.09 5.02L4 19l5-5 3.11 3.11.76-2.04zM18.5 10h-2L12 22h2l1.12-3h4.75L21 22h2l-4.5-12zm-2.62 7l1.62-4.33L19.12 17h-3.24z"})})}const Ae="iconLanguage_Yxqf";var je=n(57235),De=n(33372),Pe=n(33412),Te=n(96414),Ie=n(72686),Ne=n(24962),Le=n(56747);function Re(){return[`language:${(0,_e.A)().i18n.currentLocale}`,function(){const e=(0,Le.v)();return[Ne.C,...e]}().map(e=>`docusaurus_tag:${e}`)]}const Fe={button:{buttonText:(0,c.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"}),buttonAriaLabel:(0,c.T)({id:"theme.SearchBar.label",message:"Search",description:"The ARIA label and placeholder for search button"})},modal:{searchBox:{resetButtonTitle:(0,c.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),resetButtonAriaLabel:(0,c.T)({id:"theme.SearchModal.searchBox.resetButtonTitle",message:"Clear the query",description:"The label and ARIA label for search box reset button"}),cancelButtonText:(0,c.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"}),cancelButtonAriaLabel:(0,c.T)({id:"theme.SearchModal.searchBox.cancelButtonText",message:"Cancel",description:"The label and ARIA label for search box cancel button"})},startScreen:{recentSearchesTitle:(0,c.T)({id:"theme.SearchModal.startScreen.recentSearchesTitle",message:"Recent",description:"The title for recent searches"}),noRecentSearchesText:(0,c.T)({id:"theme.SearchModal.startScreen.noRecentSearchesText",message:"No recent searches",description:"The text when no recent searches"}),saveRecentSearchButtonTitle:(0,c.T)({id:"theme.SearchModal.startScreen.saveRecentSearchButtonTitle",message:"Save this search",description:"The label for save recent search button"}),removeRecentSearchButtonTitle:(0,c.T)({id:"theme.SearchModal.startScreen.removeRecentSearchButtonTitle",message:"Remove this search from history",description:"The label for remove recent search button"}),favoriteSearchesTitle:(0,c.T)({id:"theme.SearchModal.startScreen.favoriteSearchesTitle",message:"Favorite",description:"The title for favorite searches"}),removeFavoriteSearchButtonTitle:(0,c.T)({id:"theme.SearchModal.startScreen.removeFavoriteSearchButtonTitle",message:"Remove this search from favorites",description:"The label for remove favorite search button"})},errorScreen:{titleText:(0,c.T)({id:"theme.SearchModal.errorScreen.titleText",message:"Unable to fetch results",description:"The title for error screen of search modal"}),helpText:(0,c.T)({id:"theme.SearchModal.errorScreen.helpText",message:"You might want to check your network connection.",description:"The help text for error screen of search modal"})},footer:{selectText:(0,c.T)({id:"theme.SearchModal.footer.selectText",message:"to select",description:"The explanatory text of the action for the enter key"}),selectKeyAriaLabel:(0,c.T)({id:"theme.SearchModal.footer.selectKeyAriaLabel",message:"Enter key",description:"The ARIA label for the Enter key button that makes the selection"}),navigateText:(0,c.T)({id:"theme.SearchModal.footer.navigateText",message:"to navigate",description:"The explanatory text of the action for the Arrow up and Arrow down key"}),navigateUpKeyAriaLabel:(0,c.T)({id:"theme.SearchModal.footer.navigateUpKeyAriaLabel",message:"Arrow up",description:"The ARIA label for the Arrow up key button that makes the navigation"}),navigateDownKeyAriaLabel:(0,c.T)({id:"theme.SearchModal.footer.navigateDownKeyAriaLabel",message:"Arrow down",description:"The ARIA label for the Arrow down key button that makes the navigation"}),closeText:(0,c.T)({id:"theme.SearchModal.footer.closeText",message:"to close",description:"The explanatory text of the action for Escape key"}),closeKeyAriaLabel:(0,c.T)({id:"theme.SearchModal.footer.closeKeyAriaLabel",message:"Escape key",description:"The ARIA label for the Escape key button that close the modal"}),searchByText:(0,c.T)({id:"theme.SearchModal.footer.searchByText",message:"Search by",description:"The text explain that the search is making by Algolia"})},noResultsScreen:{noResultsText:(0,c.T)({id:"theme.SearchModal.noResultsScreen.noResultsText",message:"No results for",description:"The text explains that there are no results for the following search"}),suggestedQueryText:(0,c.T)({id:"theme.SearchModal.noResultsScreen.suggestedQueryText",message:"Try searching for",description:"The text for the suggested query when no results are found for the following search"}),reportMissingResultsText:(0,c.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsText",message:"Believe this query should return results?",description:"The text for the question where the user thinks there are missing results"}),reportMissingResultsLinkText:(0,c.T)({id:"theme.SearchModal.noResultsScreen.reportMissingResultsLinkText",message:"Let us know.",description:"The text for the link to report missing results"})}},placeholder:(0,c.T)({id:"theme.SearchModal.placeholder",message:"Search docs",description:"The placeholder of the input of the DocSearch pop-up modal"})};let ze=null;function Be(){return ze?Promise.resolve():Promise.all([n.e(5610).then(n.bind(n,5610)),Promise.all([n.e(1869),n.e(997)]).then(n.bind(n,70997)),Promise.all([n.e(1869),n.e(4047)]).then(n.bind(n,64047))]).then(([{DocSearchModal:e}])=>{ze=e})}function $e({hit:e,children:t}){return(0,u.jsx)(le.A,{to:e.url,children:t})}function Ue({state:e,onClose:t}){const n=(0,Te.w)();return(0,u.jsx)(le.A,{to:n(e.query),onClick:t,children:(0,u.jsx)(c.A,{id:"theme.SearchBar.seeAll",values:{count:e.context.nbHits},children:"See all {count} results"})})}function qe({externalUrlRegex:e,...t}){const n=function({externalUrlRegex:e}){const t=(0,i.W6)(),[n]=(0,r.useState)(()=>({navigate(n){(0,pe.G)(e,n.itemUrl)?window.location.href=n.itemUrl:t.push(n.itemUrl)}}));return n}({externalUrlRegex:e}),o=function({contextualSearch:e,...t}){const n=Re(),r=t.searchParameters?.facetFilters??[],o=e?function(e,t){const n=e=>"string"==typeof e?[e]:e;return[...n(e),...n(t)]}(n,r):r;return{...t.searchParameters,facetFilters:o}}({...t}),a=function(e){const t=(0,Ie.C)(),[n]=(0,r.useState)(()=>n=>e.transformItems?e.transformItems(n):n.map(e=>({...e,url:t(e.url)})));return n}(t),s=function(){const{siteMetadata:{docusaurusVersion:e}}=(0,_e.A)();return(0,r.useCallback)(t=>(t.addAlgoliaAgent("docusaurus",e),t),[e])}(),c=(0,r.useRef)(null),l=(0,r.useRef)(null),[d,p]=(0,r.useState)(!1),[f,h]=(0,r.useState)(void 0),m=(0,r.useCallback)(()=>{if(!c.current){const e=document.createElement("div");c.current=e,document.body.insertBefore(e,document.body.firstChild)}},[]),g=(0,r.useCallback)(()=>{m(),Be().then(()=>p(!0))},[m]),b=(0,r.useCallback)(()=>{p(!1),l.current?.focus(),h(void 0)},[]),y=(0,r.useCallback)(e=>{"f"===e.key&&(e.metaKey||e.ctrlKey)||(e.preventDefault(),h(e.key),g())},[g]),v=function({closeModal:e}){return(0,r.useMemo)(()=>({state:t})=>(0,u.jsx)(Ue,{state:t,onClose:e}),[e])}({closeModal:b});return(0,De.E8)({isOpen:d,onOpen:g,onClose:b,onInput:y,searchButtonRef:l}),(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Pe.A,{children:(0,u.jsx)("link",{rel:"preconnect",href:`https://${t.appId}-dsn.algolia.net`,crossOrigin:"anonymous"})}),(0,u.jsx)(De.Bc,{onTouchStart:Be,onFocus:Be,onMouseOver:Be,onClick:g,ref:l,translations:t.translations?.button??Fe.button}),d&&ze&&c.current&&(0,je.createPortal)((0,u.jsx)(ze,{onClose:b,initialScrollY:window.scrollY,initialQuery:f,navigator:n,transformItems:a,hitComponent:$e,transformSearchClient:s,...t.searchPagePath&&{resultsFooterComponent:v},placeholder:Fe.placeholder,...t,translations:t.translations?.modal??Fe.modal,searchParameters:o}),c.current)]})}function He(){const{siteConfig:e}=(0,_e.A)();return(0,u.jsx)(qe,{...e.themeConfig.algolia})}const Ve={navbarSearchContainer:"navbarSearchContainer_WjZK"};function We({children:e,className:t}){return(0,u.jsx)("div",{className:(0,o.A)(t,Ve.navbarSearchContainer),children:e})}var Ge=n(72408),Ke=n(74366);var Qe=n(12380);function Ye({docsPluginId:e,configs:t}){return function(e,t){if(t){const n=new Map(e.map(e=>[e.name,e])),r=(t,r)=>{const o=n.get(t);if(!o)throw new Error(`No docs version exist for name '${t}', please verify your 'docsVersionDropdown' navbar item versions config.\nAvailable version names:\n- ${e.map(e=>`${e.name}`).join("\n- ")}`);return{version:o,label:r?.label??o.label}};return Array.isArray(t)?t.map(e=>r(e,void 0)):Object.entries(t).map(([e,t])=>r(e,t))}return e.map(e=>({version:e,label:e.label}))}((0,Ge.jh)(e),t)}function Ze(e,t){return t.alternateDocVersions[e.name]??function(e){return e.docs.find(t=>t.id===e.mainDocId)}(e)}const Xe={default:be,localeDropdown:function({mobile:e,dropdownItemsBefore:t,dropdownItemsAfter:n,queryString:r="",...o}){const{i18n:{currentLocale:a,locales:s,localeConfigs:l}}=(0,_e.A)(),d=(0,Ee.o)(),{search:p,hash:f}=(0,i.zy)(),h=[...t,...s.map(t=>{const n=`${`pathname://${d.createUrl({locale:t,fullyQualified:!1})}`}${p}${f}${r}`;return{label:l[t].label,lang:l[t].htmlLang,to:n,target:"_self",autoAddBaseUrl:!1,className:t===a?e?"menu__link--active":"dropdown__link--active":""}}),...n],m=e?(0,c.T)({message:"Languages",id:"theme.navbar.mobileLanguageDropdown.label",description:"The label for the mobile language switcher dropdown"}):l[a].label;return(0,u.jsx)(Me,{...o,mobile:e,label:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(Oe,{className:Ae}),m]}),items:h})},search:function({mobile:e,className:t}){return e?null:(0,u.jsx)(We,{className:t,children:(0,u.jsx)(He,{})})},dropdown:Me,html:function({value:e,className:t,mobile:n=!1,isDropdownItem:r=!1}){const a=r?"li":"div";return(0,u.jsx)(a,{className:(0,o.A)({navbar__item:!n&&!r,"menu__list-item":n},t),dangerouslySetInnerHTML:{__html:e}})},doc:function({docId:e,label:t,docsPluginId:n,...r}){const{activeDoc:o}=(0,Ge.zK)(n),a=(0,Ke.QB)(e,n),s=o?.path===a?.path;return null===a||a.unlisted&&!s?null:(0,u.jsx)(be,{exact:!0,...r,isActive:()=>s||!!o?.sidebar&&o.sidebar===a.sidebar,label:t??a.id,to:a.path})},docSidebar:function({sidebarId:e,label:t,docsPluginId:n,...r}){const{activeDoc:o}=(0,Ge.zK)(n),a=(0,Ke.fW)(e,n).link;if(!a)throw new Error(`DocSidebarNavbarItem: Sidebar with ID "${e}" doesn't have anything to be linked to.`);return(0,u.jsx)(be,{exact:!0,...r,isActive:()=>o?.sidebar===e,label:t??a.label,to:a.path})},docsVersion:function({label:e,to:t,docsPluginId:n,...r}){const o=(0,Ke.Vd)(n)[0],a=e??o.label,s=t??(e=>e.docs.find(t=>t.id===e.mainDocId))(o).path;return(0,u.jsx)(be,{...r,label:a,to:s})},docsVersionDropdown:function({mobile:e,docsPluginId:t,dropdownActiveClassDisabled:n,dropdownItemsBefore:r,dropdownItemsAfter:o,versions:a,...s}){const{search:l,hash:d}=(0,i.zy)(),p=(0,Ge.zK)(t),{savePreferredVersionName:f}=(0,Qe.g1)(t),h=Ye({docsPluginId:t,configs:a}),m=function({docsPluginId:e,versionItems:t}){return(0,Ke.Vd)(e).map(e=>t.find(t=>t.version===e)).filter(e=>void 0!==e)[0]??t[0]}({docsPluginId:t,versionItems:h}),g=[...r,...h.map(function({version:e,label:t}){return{label:t,to:`${Ze(e,p).path}${l}${d}`,isActive:()=>e===p.activeVersion,onClick:()=>f(e.name)}}),...o],b=e&&g.length>1?(0,c.T)({id:"theme.navbar.mobileVersionsDropdown.label",message:"Versions",description:"The label for the navbar versions dropdown on mobile view"}):m.label,y=e&&g.length>1?void 0:Ze(m.version,p).path;return g.length<=1?(0,u.jsx)(be,{...s,mobile:e,label:b,to:y,isActive:n?()=>!1:void 0}):(0,u.jsx)(Me,{...s,mobile:e,label:b,to:y,items:g,isActive:n?()=>!1:void 0})}};function Je({type:e,...t}){const n=function(e,t){return e&&"default"!==e?e:"items"in t?"dropdown":"default"}(e,t),r=Xe[n];if(!r)throw new Error(`No NavbarItem component found for type "${e}".`);return(0,u.jsx)(r,{...t})}function et(){const e=(0,A.M)(),t=(0,_.p)().navbar.items;return(0,u.jsx)("ul",{className:"menu__list",children:t.map((t,n)=>(0,r.createElement)(Je,{mobile:!0,...t,onClick:()=>e.toggle(),key:n}))})}function tt(e){return(0,u.jsx)("button",{...e,type:"button",className:"clean-btn navbar-sidebar__back",children:(0,u.jsx)(c.A,{id:"theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel",description:"The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)",children:"\u2190 Back to main menu"})})}function nt(){const e=0===(0,_.p)().navbar.items.length,t=L();return(0,u.jsxs)(u.Fragment,{children:[!e&&(0,u.jsx)(tt,{onClick:()=>t.hide()}),t.content]})}function rt(){const e=(0,A.M)();return function(e=!0){(0,r.useEffect)(()=>(document.body.style.overflow=e?"hidden":"visible",()=>{document.body.style.overflow="visible"}),[e])}(e.shown),e.shouldRender?(0,u.jsx)(z,{header:(0,u.jsx)(ce,{}),primaryMenu:(0,u.jsx)(et,{}),secondaryMenu:(0,u.jsx)(nt,{})}):null}const ot={navbarHideable:"navbarHideable_dcaT",navbarHidden:"navbarHidden_LHpq"};function at(e){return(0,u.jsx)("div",{role:"presentation",...e,className:(0,o.A)("navbar-sidebar__backdrop",e.className)})}function st({children:e}){const{navbar:{hideOnScroll:t,style:n}}=(0,_.p)(),a=(0,A.M)(),{navbarRef:s,isNavbarVisible:i}=function(e){const[t,n]=(0,r.useState)(e),o=(0,r.useRef)(!1),a=(0,r.useRef)(0),s=(0,r.useCallback)(e=>{null!==e&&(a.current=e.getBoundingClientRect().height)},[]);return(0,j.Mq)(({scrollY:t},r)=>{if(!e)return;if(t<a.current)return void n(!0);if(o.current)return void(o.current=!1);const s=r?.scrollY,i=document.documentElement.scrollHeight-a.current,c=window.innerHeight;s&&t>=s?n(!1):t+c<i&&n(!0)}),(0,l.$)(t=>{if(!e)return;const r=t.location.hash;if(r?document.getElementById(r.substring(1)):void 0)return o.current=!0,void n(!1);n(!0)}),{navbarRef:s,isNavbarVisible:t}}(t);return(0,u.jsxs)("nav",{ref:s,"aria-label":(0,c.T)({id:"theme.NavBar.navAriaLabel",message:"Main",description:"The ARIA label for the main navigation"}),className:(0,o.A)(g.G.layout.navbar.container,"navbar","navbar--fixed-top",t&&[ot.navbarHideable,!i&&ot.navbarHidden],{"navbar--dark":"dark"===n,"navbar--primary":"primary"===n,"navbar-sidebar--show":a.shown}),children:[e,(0,u.jsx)(at,{onClick:a.toggle}),(0,u.jsx)(rt,{})]})}var it=n(74306);const ct="right";function lt({width:e=30,height:t=30,className:n,...r}){return(0,u.jsx)("svg",{className:n,width:e,height:t,viewBox:"0 0 30 30","aria-hidden":"true",...r,children:(0,u.jsx)("path",{stroke:"currentColor",strokeLinecap:"round",strokeMiterlimit:"10",strokeWidth:"2",d:"M4 7h22M4 15h22M4 23h22"})})}function ut(){const{toggle:e,shown:t}=(0,A.M)();return(0,u.jsx)("button",{onClick:e,"aria-label":(0,c.T)({id:"theme.docs.sidebar.toggleSidebarButtonAriaLabel",message:"Toggle navigation bar",description:"The ARIA label for hamburger menu button of mobile navigation"}),"aria-expanded":t,className:"navbar__toggle clean-btn",type:"button",children:(0,u.jsx)(lt,{})})}const dt={colorModeToggle:"colorModeToggle_Bfwy"};function pt({items:e}){return(0,u.jsx)(u.Fragment,{children:e.map((e,t)=>(0,u.jsx)(it.k2,{onError:t=>new Error(`A theme navbar item failed to render.\nPlease double-check the following navbar item (themeConfig.navbar.items) of your Docusaurus config:\n${JSON.stringify(e,null,2)}`,{cause:t}),children:(0,u.jsx)(Je,{...e})},t))})}function ft({left:e,right:t}){return(0,u.jsxs)("div",{className:"navbar__inner",children:[(0,u.jsx)("div",{className:(0,o.A)(g.G.layout.navbar.containerLeft,"navbar__items"),children:e}),(0,u.jsx)("div",{className:(0,o.A)(g.G.layout.navbar.containerRight,"navbar__items navbar__items--right"),children:t})]})}function ht(){const e=(0,A.M)(),t=(0,_.p)().navbar.items,[n,r]=function(e){function t(e){return"left"===(e.position??ct)}return[e.filter(t),e.filter(e=>!t(e))]}(t),o=t.find(e=>"search"===e.type);return(0,u.jsx)(ft,{left:(0,u.jsxs)(u.Fragment,{children:[!e.disabled&&(0,u.jsx)(ut,{}),(0,u.jsx)(se,{}),(0,u.jsx)(pt,{items:n})]}),right:(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(pt,{items:r}),(0,u.jsx)(oe,{className:dt.colorModeToggle}),!o&&(0,u.jsx)(We,{children:(0,u.jsx)(He,{})})]})})}function mt(){return(0,u.jsx)(st,{children:(0,u.jsx)(ht,{})})}function gt({item:e}){const{to:t,href:n,label:r,prependBaseUrlToHref:a,className:s,...i}=e,c=(0,ue.Ay)(t),l=(0,ue.Ay)(n,{forcePrependBaseUrl:!0});return(0,u.jsxs)(le.A,{className:(0,o.A)("footer__link-item",s),...n?{href:a?l:n}:{to:c},...i,children:[r,n&&!(0,de.A)(n)&&(0,u.jsx)(fe.A,{})]})}function bt({item:e}){return e.html?(0,u.jsx)("li",{className:(0,o.A)("footer__item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,u.jsx)("li",{className:"footer__item",children:(0,u.jsx)(gt,{item:e})},e.href??e.to)}function yt({column:e}){return(0,u.jsxs)("div",{className:(0,o.A)(g.G.layout.footer.column,"col footer__col",e.className),children:[(0,u.jsx)("div",{className:"footer__title",children:e.title}),(0,u.jsx)("ul",{className:"footer__items clean-list",children:e.items.map((e,t)=>(0,u.jsx)(bt,{item:e},t))})]})}function vt({columns:e}){return(0,u.jsx)("div",{className:"row footer__links",children:e.map((e,t)=>(0,u.jsx)(yt,{column:e},t))})}function _t(){return(0,u.jsx)("span",{className:"footer__link-separator",children:"\xb7"})}function kt({item:e}){return e.html?(0,u.jsx)("span",{className:(0,o.A)("footer__link-item",e.className),dangerouslySetInnerHTML:{__html:e.html}}):(0,u.jsx)(gt,{item:e})}function wt({links:e}){return(0,u.jsx)("div",{className:"footer__links text--center",children:(0,u.jsx)("div",{className:"footer__links",children:e.map((t,n)=>(0,u.jsxs)(r.Fragment,{children:[(0,u.jsx)(kt,{item:t}),e.length!==n+1&&(0,u.jsx)(_t,{})]},n))})})}function Ct({links:e}){return function(e){return"title"in e[0]}(e)?(0,u.jsx)(vt,{columns:e}):(0,u.jsx)(wt,{links:e})}var xt=n(29283);const St="footerLogoLink_sUlE";function Mt({logo:e}){const{withBaseUrl:t}=(0,ue.hH)(),n={light:t(e.src),dark:t(e.srcDark??e.src)};return(0,u.jsx)(xt.A,{className:(0,o.A)("footer__logo",e.className),alt:e.alt,sources:n,width:e.width,height:e.height,style:e.style})}function Et({logo:e}){return e.href?(0,u.jsx)(le.A,{href:e.href,className:St,target:e.target,children:(0,u.jsx)(Mt,{logo:e})}):(0,u.jsx)(Mt,{logo:e})}function Ot({copyright:e}){return(0,u.jsx)("div",{className:"footer__copyright",dangerouslySetInnerHTML:{__html:e}})}function At({style:e,links:t,logo:n,copyright:r}){return(0,u.jsx)("footer",{className:(0,o.A)(g.G.layout.footer.container,"footer",{"footer--dark":"dark"===e}),children:(0,u.jsxs)("div",{className:"container container-fluid",children:[t,(n||r)&&(0,u.jsxs)("div",{className:"footer__bottom text--center",children:[n&&(0,u.jsx)("div",{className:"margin-bottom--sm",children:n}),r]})]})})}function jt(){const{footer:e}=(0,_.p)();if(!e)return null;const{copyright:t,links:n,logo:r,style:o}=e;return(0,u.jsx)(At,{style:o,links:n&&n.length>0&&(0,u.jsx)(Ct,{links:n}),logo:r&&(0,u.jsx)(Et,{logo:r}),copyright:t&&(0,u.jsx)(Ot,{copyright:t})})}const Dt=r.memo(jt),Pt=(0,D.fM)([B.a,k.o,j.Tv,Qe.VQ,s.Jx,function({children:e}){return(0,u.jsx)(P.y_,{children:(0,u.jsx)(A.e,{children:(0,u.jsx)(I,{children:e})})})}]);function Tt({children:e}){return(0,u.jsx)(Pt,{children:e})}var It=n(33555);function Nt({error:e,tryAgain:t}){return(0,u.jsx)("main",{className:"container margin-vert--xl",children:(0,u.jsx)("div",{className:"row",children:(0,u.jsxs)("div",{className:"col col--6 col--offset-3",children:[(0,u.jsx)(It.A,{as:"h1",className:"hero__title",children:(0,u.jsx)(c.A,{id:"theme.ErrorPageContent.title",description:"The title of the fallback page when the page crashed",children:"This page crashed."})}),(0,u.jsx)("div",{className:"margin-vert--lg",children:(0,u.jsx)(it.a2,{onClick:t,className:"button button--primary shadow--lw"})}),(0,u.jsx)("hr",{}),(0,u.jsx)("div",{className:"margin-vert--md",children:(0,u.jsx)(it.bq,{error:e})})]})})})}const Lt={mainWrapper:"mainWrapper_c5No"};function Rt(e){const{children:t,noFooter:n,wrapperClassName:r,title:i,description:c}=e;return(0,b.J)(),(0,u.jsxs)(Tt,{children:[(0,u.jsx)(s.be,{title:i,description:c}),(0,u.jsx)(v,{}),(0,u.jsx)(O,{}),(0,u.jsx)(mt,{}),(0,u.jsx)("div",{id:d,className:(0,o.A)(g.G.layout.main.container,g.G.wrapper.main,Lt.mainWrapper,r),children:(0,u.jsx)(a.A,{fallback:e=>(0,u.jsx)(Nt,{...e}),children:t})}),!n&&(0,u.jsx)(Dt,{})]})}},64407:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(36672),o=n(21189);function a(){return(0,r.useContext)(o.o)}},65777:(e,t,n)=>{var r={"./prism-groovy":44338,"./prism-java":32912,"./prism-kotlin":83481};function o(e){var t=a(e);return n(t)}function a(e){if(!n.o(r,e)){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}return r[e]}o.keys=function(){return Object.keys(r)},o.resolve=a,e.exports=o,o.id=65777},67797:(e,t,n)=>{"use strict";n.d(t,{p:()=>o});var r=n(56562);function o(){return(0,r.A)().siteConfig.themeConfig}},70811:(e,t,n)=>{"use strict";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)({}).hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},r.apply(null,arguments)}n.d(t,{A:()=>r})},71850:(e,t,n)=>{"use strict";n.d(t,{M:()=>m,o:()=>h});var r=n(36672),o=n(64407),a=n(1771),s=n(92471),i=n(67797),c=n(23420);const l=(0,a.Wf)("docusaurus.announcement.dismiss"),u=(0,a.Wf)("docusaurus.announcement.id"),d=()=>"true"===l.get(),p=e=>l.set(String(e)),f=r.createContext(null);function h({children:e}){const t=function(){const{announcementBar:e}=(0,i.p)(),t=(0,o.A)(),[n,a]=(0,r.useState)(()=>!!t&&d());(0,r.useEffect)(()=>{a(d())},[]);const s=(0,r.useCallback)(()=>{p(!0),a(!0)},[]);return(0,r.useEffect)(()=>{if(!e)return;const{id:t}=e;let n=u.get();"annoucement-bar"===n&&(n="announcement-bar");const r=t!==n;u.set(t),r&&p(!1),!r&&d()||a(!1)},[e]),(0,r.useMemo)(()=>({isActive:!!e&&!n,close:s}),[e,n,s])}();return(0,c.jsx)(f.Provider,{value:t,children:e})}function m(){const e=(0,r.useContext)(f);if(!e)throw new s.dV("AnnouncementBarProvider");return e}},72408:(e,t,n)=>{"use strict";n.d(t,{zK:()=>b,vT:()=>f,gk:()=>h,Gy:()=>d,HW:()=>y,ht:()=>p,r7:()=>g,jh:()=>m});var r=n(85291),o=n(56562),a=n(7953);function s(e,t={}){const n=function(){const{globalData:e}=(0,o.A)();return e}()[e];if(!n&&t.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin.`);return n}const i=e=>e.versions.find(e=>e.isLast);function c(e,t){return[...e.versions].sort((e,t)=>e.path===t.path?0:e.path.includes(t.path)?-1:t.path.includes(e.path)?1:0).find(e=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1}))}function l(e,t){const n=c(e,t),o=n?.docs.find(e=>!!(0,r.B6)(t,{path:e.path,exact:!0,strict:!1}));return{activeVersion:n,activeDoc:o,alternateDocVersions:o?function(t){const n={};return e.versions.forEach(e=>{e.docs.forEach(r=>{r.id===t&&(n[e.name]=r)})}),n}(o.id):{}}}const u={},d=()=>s("docusaurus-plugin-content-docs")??u,p=e=>{try{return function(e,t=a.W,n={}){const r=s(e),o=r?.[t];if(!o&&n.failfast)throw new Error(`Docusaurus plugin global data not found for "${e}" plugin with id "${t}".`);return o}("docusaurus-plugin-content-docs",e,{failfast:!0})}catch(t){throw new Error("You are using a feature of the Docusaurus docs plugin, but this plugin does not seem to be enabled"+("Default"===e?"":` (pluginId=${e}`),{cause:t})}};function f(e={}){const t=d(),{pathname:n}=(0,r.zy)();return function(e,t,n={}){const o=Object.entries(e).sort((e,t)=>t[1].path.localeCompare(e[1].path)).find(([,e])=>!!(0,r.B6)(t,{path:e.path,exact:!1,strict:!1})),a=o?{pluginId:o[0],pluginData:o[1]}:void 0;if(!a&&n.failfast)throw new Error(`Can't find active docs plugin for "${t}" pathname, while it was expected to be found. Maybe you tried to use a docs feature that can only be used on a docs-related page? Existing docs plugin paths are: ${Object.values(e).map(e=>e.path).join(", ")}`);return a}(t,n,e)}function h(e={}){const t=f(e),{pathname:n}=(0,r.zy)();if(!t)return;return{activePlugin:t,activeVersion:c(t.pluginData,n)}}function m(e){return p(e).versions}function g(e){const t=p(e);return i(t)}function b(e){const t=p(e),{pathname:n}=(0,r.zy)();return l(t,n)}function y(e){const t=p(e),{pathname:n}=(0,r.zy)();return function(e,t){const n=i(e);return{latestDocSuggestion:l(e,t).alternateDocVersions[n.name],latestVersionSuggestion:n}}(t,n)}},72686:(e,t,n)=>{"use strict";n.d(t,{C:()=>i});var r=n(36672),o=n(3025),a=n(42977),s=n(76742);function i(){const{withBaseUrl:e}=(0,a.hH)(),{algolia:{externalUrlRegex:t,replaceSearchResultPathname:n}}=(0,s.c)();return(0,r.useCallback)(r=>{const a=new URL(r);if((0,o.G)(t,a.href))return r;const s=`${a.pathname+a.hash}`;return e(function(e,t){return t?e.replaceAll(new RegExp(t.from,"g"),t.to):e}(s,n))},[e,t,n])}},74306:(e,t,n)=>{"use strict";n.d(t,{bq:()=>u,MN:()=>l,a2:()=>c,k2:()=>d});var r=n(36672),o=n(53499),a=n(95758);const s={errorBoundaryError:"errorBoundaryError_iQOE",errorBoundaryFallback:"errorBoundaryFallback_FOml"};var i=n(23420);function c(e){return(0,i.jsx)("button",{type:"button",...e,children:(0,i.jsx)(o.A,{id:"theme.ErrorPageContent.tryAgain",description:"The label of the button to try again rendering when the React error boundary captures an error",children:"Try again"})})}function l({error:e,tryAgain:t}){return(0,i.jsxs)("div",{className:s.errorBoundaryFallback,children:[(0,i.jsx)("p",{children:e.message}),(0,i.jsx)(c,{onClick:t})]})}function u({error:e}){const t=(0,a.rA)(e).map(e=>e.message).join("\n\nCause:\n");return(0,i.jsx)("p",{className:s.errorBoundaryError,children:t})}class d extends r.Component{componentDidCatch(e,t){throw this.props.onError(e,t)}render(){return this.props.children}}},74366:(e,t,n)=>{"use strict";n.d(t,{B5:()=>C,Nr:()=>p,OF:()=>v,QB:()=>w,Vd:()=>_,Y:()=>b,fW:()=>k,w8:()=>m});var r=n(36672),o=n(85291),a=n(26271),s=n(72408),i=n(91548),c=n(45223),l=n(12380),u=n(40827),d=n(24179);function p(e){return"link"!==e.type||e.unlisted?"category"===e.type?function(e){if(e.href&&!e.linkUnlisted)return e.href;for(const t of e.items){const e=p(t);if(e)return e}}(e):void 0:e.href}const f=(e,t)=>void 0!==e&&(0,i.ys)(e,t),h=(e,t)=>e.some(e=>m(e,t));function m(e,t){return"link"===e.type?f(e.href,t):"category"===e.type&&(f(e.href,t)||h(e.items,t))}function g(e,t){switch(e.type){case"category":return m(e,t)||void 0!==e.href&&!e.linkUnlisted||e.items.some(e=>g(e,t));case"link":return!e.unlisted||m(e,t);default:return!0}}function b(e,t){return(0,r.useMemo)(()=>e.filter(e=>g(e,t)),[e,t])}function y({sidebarItems:e,pathname:t,onlyCategories:n=!1}){const r=[];return function e(o){for(const a of o)if("category"===a.type&&((0,i.ys)(a.href,t)||e(a.items))||"link"===a.type&&(0,i.ys)(a.href,t)){return n&&"category"!==a.type||r.unshift(a),!0}return!1}(e),r}function v(){const e=(0,d.t)(),{pathname:t}=(0,o.zy)(),n=(0,s.vT)()?.pluginData.breadcrumbs;return!1!==n&&e?y({sidebarItems:e.items,pathname:t}):null}function _(e){const{activeVersion:t}=(0,s.zK)(e),{preferredVersion:n}=(0,l.g1)(e),o=(0,s.r7)(e);return(0,r.useMemo)(()=>(0,c.sb)([t,n,o].filter(Boolean)),[t,n,o])}function k(e,t){const n=_(t);return(0,r.useMemo)(()=>{const t=n.flatMap(e=>e.sidebars?Object.entries(e.sidebars):[]),r=t.find(t=>t[0]===e);if(!r)throw new Error(`Can't find any sidebar with id "${e}" in version${n.length>1?"s":""} ${n.map(e=>e.name).join(", ")}".\nAvailable sidebar ids are:\n- ${t.map(e=>e[0]).join("\n- ")}`);return r[1]},[e,n])}function w(e,t){const n=_(t);return(0,r.useMemo)(()=>{const t=n.flatMap(e=>e.docs),r=t.find(t=>t.id===e);if(!r){if(n.flatMap(e=>e.draftIds).includes(e))return null;throw new Error(`Couldn't find any doc with id "${e}" in version${n.length>1?"s":""} "${n.map(e=>e.name).join(", ")}".\nAvailable doc ids are:\n- ${(0,c.sb)(t.map(e=>e.id)).join("\n- ")}`)}return r},[e,n])}function C({route:e}){const t=(0,o.zy)(),n=(0,u.r)(),r=e.routes,s=r.find(e=>(0,o.B6)(t.pathname,e));if(!s)return null;const i=s.sidebar,c=i?n.docsSidebars[i]:void 0;return{docElement:(0,a.v)(r),sidebarName:i,sidebarItems:c}}},75150:(e,t,n)=>{"use strict";n.d(t,{A:()=>f});var r=n(36672),o=n(58212),a=n(95758),s=n(56562),i=n(4518),c=n(20601),l=n(92573),u=n(42977),d=n(23420);function p({isNavLink:e,to:t,href:n,activeClassName:p,isActive:f,"data-noBrokenLinkCheck":h,autoAddBaseUrl:m=!0,...g},b){const{siteConfig:y}=(0,s.A)(),{trailingSlash:v,baseUrl:_}=y,k=y.future.experimental_router,{withBaseUrl:w}=(0,u.hH)(),C=(0,l.A)(),x=(0,r.useRef)(null);(0,r.useImperativeHandle)(b,()=>x.current);const S=t||n;const M=(0,i.A)(S),E=S?.replace("pathname://","");let O=void 0!==E?(A=E,m&&(e=>e.startsWith("/"))(A)?w(A):A):void 0;var A;"hash"===k&&O?.startsWith("./")&&(O=O?.slice(1)),O&&M&&(O=(0,a.Ks)(O,{trailingSlash:v,baseUrl:_}));const j=(0,r.useRef)(!1),D=e?o.k2:o.N_,P=c.A.canUseIntersectionObserver,T=(0,r.useRef)(),I=()=>{j.current||null==O||(window.docusaurus.preload(O),j.current=!0)};(0,r.useEffect)(()=>(!P&&M&&c.A.canUseDOM&&null!=O&&window.docusaurus.prefetch(O),()=>{P&&T.current&&T.current.disconnect()}),[T,O,P,M]);const N=O?.startsWith("#")??!1,L=!g.target||"_self"===g.target,R=!O||!M||!L||N&&"hash"!==k;h||!N&&R||C.collectLink(O),g.id&&C.collectAnchor(g.id);const F={};return R?(0,d.jsx)("a",{ref:x,href:O,...S&&!M&&{target:"_blank",rel:"noopener noreferrer"},...g,...F}):(0,d.jsx)(D,{...g,onMouseEnter:I,onTouchStart:I,innerRef:e=>{x.current=e,P&&e&&M&&(T.current=new window.IntersectionObserver(t=>{t.forEach(t=>{e===t.target&&(t.isIntersecting||t.intersectionRatio>0)&&(T.current.unobserve(e),T.current.disconnect(),null!=O&&window.docusaurus.prefetch(O))})}),T.current.observe(e))},to:O,...e&&{isActive:f,activeClassName:p},...F})}const f=r.forwardRef(p)},76742:(e,t,n)=>{"use strict";n.d(t,{c:()=>o});var r=n(56562);function o(){const{siteConfig:{themeConfig:e}}=(0,r.A)();return e}},77414:(e,t,n)=>{"use strict";n.d(t,{W:()=>s,o:()=>a});var r=n(36672),o=n(23420);const a=r.createContext(null);function s({children:e,value:t}){const n=r.useContext(a),s=(0,r.useMemo)(()=>function({parent:e,value:t}){if(!e){if(!t)throw new Error("Unexpected: no Docusaurus route context found");if(!("plugin"in t))throw new Error("Unexpected: Docusaurus topmost route context has no `plugin` attribute");return t}const n={...e.data,...t?.data};return{plugin:e.plugin,data:n}}({parent:n,value:t}),[n,t]);return(0,o.jsx)(a.Provider,{value:s,children:e})}},78385:(e,t)=>{"use strict";var n=Symbol.for("react.transitional.element"),r=Symbol.for("react.portal"),o=Symbol.for("react.fragment"),a=Symbol.for("react.strict_mode"),s=Symbol.for("react.profiler"),i=Symbol.for("react.consumer"),c=Symbol.for("react.context"),l=Symbol.for("react.forward_ref"),u=Symbol.for("react.suspense"),d=Symbol.for("react.memo"),p=Symbol.for("react.lazy"),f=Symbol.iterator;var h={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},m=Object.assign,g={};function b(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}function y(){}function v(e,t,n){this.props=e,this.context=t,this.refs=g,this.updater=n||h}b.prototype.isReactComponent={},b.prototype.setState=function(e,t){if("object"!=typeof e&&"function"!=typeof e&&null!=e)throw Error("takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,e,t,"setState")},b.prototype.forceUpdate=function(e){this.updater.enqueueForceUpdate(this,e,"forceUpdate")},y.prototype=b.prototype;var _=v.prototype=new y;_.constructor=v,m(_,b.prototype),_.isPureReactComponent=!0;var k=Array.isArray,w={H:null,A:null,T:null,S:null,V:null},C=Object.prototype.hasOwnProperty;function x(e,t,r,o,a,s){return r=s.ref,{$$typeof:n,type:e,key:t,ref:void 0!==r?r:null,props:s}}function S(e){return"object"==typeof e&&null!==e&&e.$$typeof===n}var M=/\/+/g;function E(e,t){return"object"==typeof e&&null!==e&&null!=e.key?(n=""+e.key,r={"=":"=0",":":"=2"},"$"+n.replace(/[=:]/g,function(e){return r[e]})):t.toString(36);var n,r}function O(){}function A(e,t,o,a,s){var i=typeof e;"undefined"!==i&&"boolean"!==i||(e=null);var c,l,u=!1;if(null===e)u=!0;else switch(i){case"bigint":case"string":case"number":u=!0;break;case"object":switch(e.$$typeof){case n:case r:u=!0;break;case p:return A((u=e._init)(e._payload),t,o,a,s)}}if(u)return s=s(e),u=""===a?"."+E(e,0):a,k(s)?(o="",null!=u&&(o=u.replace(M,"$&/")+"/"),A(s,t,o,"",function(e){return e})):null!=s&&(S(s)&&(c=s,l=o+(null==s.key||e&&e.key===s.key?"":(""+s.key).replace(M,"$&/")+"/")+u,s=x(c.type,l,void 0,0,0,c.props)),t.push(s)),1;u=0;var d,h=""===a?".":a+":";if(k(e))for(var m=0;m<e.length;m++)u+=A(a=e[m],t,o,i=h+E(a,m),s);else if("function"==typeof(m=null===(d=e)||"object"!=typeof d?null:"function"==typeof(d=f&&d[f]||d["@@iterator"])?d:null))for(e=m.call(e),m=0;!(a=e.next()).done;)u+=A(a=a.value,t,o,i=h+E(a,m++),s);else if("object"===i){if("function"==typeof e.then)return A(function(e){switch(e.status){case"fulfilled":return e.value;case"rejected":throw e.reason;default:switch("string"==typeof e.status?e.then(O,O):(e.status="pending",e.then(function(t){"pending"===e.status&&(e.status="fulfilled",e.value=t)},function(t){"pending"===e.status&&(e.status="rejected",e.reason=t)})),e.status){case"fulfilled":return e.value;case"rejected":throw e.reason}}throw e}(e),t,o,a,s);throw t=String(e),Error("Objects are not valid as a React child (found: "+("[object Object]"===t?"object with keys {"+Object.keys(e).join(", ")+"}":t)+"). If you meant to render a collection of children, use an array instead.")}return u}function j(e,t,n){if(null==e)return e;var r=[],o=0;return A(e,r,"","",function(e){return t.call(n,e,o++)}),r}function D(e){if(-1===e._status){var t=e._result;(t=t()).then(function(t){0!==e._status&&-1!==e._status||(e._status=1,e._result=t)},function(t){0!==e._status&&-1!==e._status||(e._status=2,e._result=t)}),-1===e._status&&(e._status=0,e._result=t)}if(1===e._status)return e._result.default;throw e._result}var P="function"==typeof reportError?reportError:function(e){if("object"==typeof window&&"function"==typeof window.ErrorEvent){var t=new window.ErrorEvent("error",{bubbles:!0,cancelable:!0,message:"object"==typeof e&&null!==e&&"string"==typeof e.message?String(e.message):String(e),error:e});if(!window.dispatchEvent(t))return}else if("object"==typeof process&&"function"==typeof process.emit)return void process.emit("uncaughtException",e);console.error(e)};function T(){}t.Children={map:j,forEach:function(e,t,n){j(e,function(){t.apply(this,arguments)},n)},count:function(e){var t=0;return j(e,function(){t++}),t},toArray:function(e){return j(e,function(e){return e})||[]},only:function(e){if(!S(e))throw Error("React.Children.only expected to receive a single React element child.");return e}},t.Component=b,t.Fragment=o,t.Profiler=s,t.PureComponent=v,t.StrictMode=a,t.Suspense=u,t.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=w,t.__COMPILER_RUNTIME={__proto__:null,c:function(e){return w.H.useMemoCache(e)}},t.cache=function(e){return function(){return e.apply(null,arguments)}},t.cloneElement=function(e,t,n){if(null==e)throw Error("The argument must be a React element, but you passed "+e+".");var r=m({},e.props),o=e.key;if(null!=t)for(a in void 0!==t.ref&&void 0,void 0!==t.key&&(o=""+t.key),t)!C.call(t,a)||"key"===a||"__self"===a||"__source"===a||"ref"===a&&void 0===t.ref||(r[a]=t[a]);var a=arguments.length-2;if(1===a)r.children=n;else if(1<a){for(var s=Array(a),i=0;i<a;i++)s[i]=arguments[i+2];r.children=s}return x(e.type,o,void 0,0,0,r)},t.createContext=function(e){return(e={$$typeof:c,_currentValue:e,_currentValue2:e,_threadCount:0,Provider:null,Consumer:null}).Provider=e,e.Consumer={$$typeof:i,_context:e},e},t.createElement=function(e,t,n){var r,o={},a=null;if(null!=t)for(r in void 0!==t.key&&(a=""+t.key),t)C.call(t,r)&&"key"!==r&&"__self"!==r&&"__source"!==r&&(o[r]=t[r]);var s=arguments.length-2;if(1===s)o.children=n;else if(1<s){for(var i=Array(s),c=0;c<s;c++)i[c]=arguments[c+2];o.children=i}if(e&&e.defaultProps)for(r in s=e.defaultProps)void 0===o[r]&&(o[r]=s[r]);return x(e,a,void 0,0,0,o)},t.createRef=function(){return{current:null}},t.forwardRef=function(e){return{$$typeof:l,render:e}},t.isValidElement=S,t.lazy=function(e){return{$$typeof:p,_payload:{_status:-1,_result:e},_init:D}},t.memo=function(e,t){return{$$typeof:d,type:e,compare:void 0===t?null:t}},t.startTransition=function(e){var t=w.T,n={};w.T=n;try{var r=e(),o=w.S;null!==o&&o(n,r),"object"==typeof r&&null!==r&&"function"==typeof r.then&&r.then(T,P)}catch(a){P(a)}finally{w.T=t}},t.unstable_useCacheRefresh=function(){return w.H.useCacheRefresh()},t.use=function(e){return w.H.use(e)},t.useActionState=function(e,t,n){return w.H.useActionState(e,t,n)},t.useCallback=function(e,t){return w.H.useCallback(e,t)},t.useContext=function(e){return w.H.useContext(e)},t.useDebugValue=function(){},t.useDeferredValue=function(e,t){return w.H.useDeferredValue(e,t)},t.useEffect=function(e,t,n){var r=w.H;if("function"==typeof n)throw Error("useEffect CRUD overload is not enabled in this build of React.");return r.useEffect(e,t)},t.useId=function(){return w.H.useId()},t.useImperativeHandle=function(e,t,n){return w.H.useImperativeHandle(e,t,n)},t.useInsertionEffect=function(e,t){return w.H.useInsertionEffect(e,t)},t.useLayoutEffect=function(e,t){return w.H.useLayoutEffect(e,t)},t.useMemo=function(e,t){return w.H.useMemo(e,t)},t.useOptimistic=function(e,t){return w.H.useOptimistic(e,t)},t.useReducer=function(e,t,n){return w.H.useReducer(e,t,n)},t.useRef=function(e){return w.H.useRef(e)},t.useState=function(e){return w.H.useState(e)},t.useSyncExternalStore=function(e,t,n){return w.H.useSyncExternalStore(e,t,n)},t.useTransition=function(){return w.H.useTransition()},t.version="19.1.0"},78670:(e,t,n)=>{"use strict";function r(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,e.__proto__=t}function o(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function s(){return s=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},s.apply(this,arguments)}var i=n(36672),c=[],l=[];var u=i.createContext(null);function d(e){var t=e(),n={loading:!0,loaded:null,error:null};return n.promise=t.then(function(e){return n.loading=!1,n.loaded=e,e}).catch(function(e){throw n.loading=!1,n.error=e,e}),n}function p(e){var t={loading:!1,loaded:{},error:null},n=[];try{Object.keys(e).forEach(function(r){var o=d(e[r]);o.loading?t.loading=!0:(t.loaded[r]=o.loaded,t.error=o.error),n.push(o.promise),o.promise.then(function(e){t.loaded[r]=e}).catch(function(e){t.error=e})})}catch(r){t.error=r}return t.promise=Promise.all(n).then(function(e){return t.loading=!1,e}).catch(function(e){throw t.loading=!1,e}),t}function f(e,t){return i.createElement((n=e)&&n.__esModule?n.default:n,t);var n}function h(e,t){var d,p;if(!t.loading)throw new Error("react-loadable requires a `loading` component");var h=s({loader:null,loading:null,delay:200,timeout:null,render:f,webpack:null,modules:null},t),m=null;function g(){return m||(m=e(h.loader)),m.promise}return c.push(g),"function"==typeof h.webpack&&l.push(function(){if((0,h.webpack)().every(function(e){return void 0!==e&&void 0!==n.m[e]}))return g()}),p=d=function(t){function n(n){var r;return a(o(o(r=t.call(this,n)||this)),"retry",function(){r.setState({error:null,loading:!0,timedOut:!1}),m=e(h.loader),r._loadModule()}),g(),r.state={error:m.error,pastDelay:!1,timedOut:!1,loading:m.loading,loaded:m.loaded},r}r(n,t),n.preload=function(){return g()};var s=n.prototype;return s.UNSAFE_componentWillMount=function(){this._loadModule()},s.componentDidMount=function(){this._mounted=!0},s._loadModule=function(){var e=this;if(this.context&&Array.isArray(h.modules)&&h.modules.forEach(function(t){e.context.report(t)}),m.loading){var t=function(t){e._mounted&&e.setState(t)};"number"==typeof h.delay&&(0===h.delay?this.setState({pastDelay:!0}):this._delay=setTimeout(function(){t({pastDelay:!0})},h.delay)),"number"==typeof h.timeout&&(this._timeout=setTimeout(function(){t({timedOut:!0})},h.timeout));var n=function(){t({error:m.error,loaded:m.loaded,loading:m.loading}),e._clearTimeouts()};m.promise.then(function(){return n(),null}).catch(function(e){return n(),null})}},s.componentWillUnmount=function(){this._mounted=!1,this._clearTimeouts()},s._clearTimeouts=function(){clearTimeout(this._delay),clearTimeout(this._timeout)},s.render=function(){return this.state.loading||this.state.error?i.createElement(h.loading,{isLoading:this.state.loading,pastDelay:this.state.pastDelay,timedOut:this.state.timedOut,error:this.state.error,retry:this.retry}):this.state.loaded?h.render(this.state.loaded,this.props):null},n}(i.Component),a(d,"contextType",u),p}function m(e){return h(d,e)}m.Map=function(e){if("function"!=typeof e.render)throw new Error("LoadableMap requires a `render(loaded, props)` function");return h(p,e)};var g=function(e){function t(){return e.apply(this,arguments)||this}return r(t,e),t.prototype.render=function(){return i.createElement(u.Provider,{value:{report:this.props.report}},i.Children.only(this.props.children))},t}(i.Component);function b(e){for(var t=[];e.length;){var n=e.pop();t.push(n())}return Promise.all(t).then(function(){if(e.length)return b(e)})}m.Capture=g,m.preloadAll=function(){return new Promise(function(e,t){b(c).then(e,t)})},m.preloadReady=function(){return new Promise(function(e,t){b(l).then(e,e)})},e.exports=m},79048:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>a});var r=n(58744),o=n.n(r);o().configure({showSpinner:!1});const a={onRouteUpdate({location:e,previousLocation:t}){if(t&&e.pathname!==t.pathname){const e=window.setTimeout(()=>{o().start()},200);return()=>window.clearTimeout(e)}},onRouteDidUpdate(){o().done()}}},81690:(e,t)=>{"use strict";function n(e,t){var n=e.length;e.push(t);e:for(;0<n;){var r=n-1>>>1,o=e[r];if(!(0<a(o,t)))break e;e[r]=t,e[n]=o,n=r}}function r(e){return 0===e.length?null:e[0]}function o(e){if(0===e.length)return null;var t=e[0],n=e.pop();if(n!==t){e[0]=n;e:for(var r=0,o=e.length,s=o>>>1;r<s;){var i=2*(r+1)-1,c=e[i],l=i+1,u=e[l];if(0>a(c,n))l<o&&0>a(u,c)?(e[r]=u,e[l]=n,r=l):(e[r]=c,e[i]=n,r=i);else{if(!(l<o&&0>a(u,n)))break e;e[r]=u,e[l]=n,r=l}}}return t}function a(e,t){var n=e.sortIndex-t.sortIndex;return 0!==n?n:e.id-t.id}if(t.unstable_now=void 0,"object"==typeof performance&&"function"==typeof performance.now){var s=performance;t.unstable_now=function(){return s.now()}}else{var i=Date,c=i.now();t.unstable_now=function(){return i.now()-c}}var l=[],u=[],d=1,p=null,f=3,h=!1,m=!1,g=!1,b=!1,y="function"==typeof setTimeout?setTimeout:null,v="function"==typeof clearTimeout?clearTimeout:null,_="undefined"!=typeof setImmediate?setImmediate:null;function k(e){for(var t=r(u);null!==t;){if(null===t.callback)o(u);else{if(!(t.startTime<=e))break;o(u),t.sortIndex=t.expirationTime,n(l,t)}t=r(u)}}function w(e){if(g=!1,k(e),!m)if(null!==r(l))m=!0,x||(x=!0,C());else{var t=r(u);null!==t&&P(w,t.startTime-e)}}var C,x=!1,S=-1,M=5,E=-1;function O(){return!!b||!(t.unstable_now()-E<M)}function A(){if(b=!1,x){var e=t.unstable_now();E=e;var n=!0;try{e:{m=!1,g&&(g=!1,v(S),S=-1),h=!0;var a=f;try{t:{for(k(e),p=r(l);null!==p&&!(p.expirationTime>e&&O());){var s=p.callback;if("function"==typeof s){p.callback=null,f=p.priorityLevel;var i=s(p.expirationTime<=e);if(e=t.unstable_now(),"function"==typeof i){p.callback=i,k(e),n=!0;break t}p===r(l)&&o(l),k(e)}else o(l);p=r(l)}if(null!==p)n=!0;else{var c=r(u);null!==c&&P(w,c.startTime-e),n=!1}}break e}finally{p=null,f=a,h=!1}n=void 0}}finally{n?C():x=!1}}}if("function"==typeof _)C=function(){_(A)};else if("undefined"!=typeof MessageChannel){var j=new MessageChannel,D=j.port2;j.port1.onmessage=A,C=function(){D.postMessage(null)}}else C=function(){y(A,0)};function P(e,n){S=y(function(){e(t.unstable_now())},n)}t.unstable_IdlePriority=5,t.unstable_ImmediatePriority=1,t.unstable_LowPriority=4,t.unstable_NormalPriority=3,t.unstable_Profiling=null,t.unstable_UserBlockingPriority=2,t.unstable_cancelCallback=function(e){e.callback=null},t.unstable_forceFrameRate=function(e){0>e||125<e?console.error("forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported"):M=0<e?Math.floor(1e3/e):5},t.unstable_getCurrentPriorityLevel=function(){return f},t.unstable_next=function(e){switch(f){case 1:case 2:case 3:var t=3;break;default:t=f}var n=f;f=t;try{return e()}finally{f=n}},t.unstable_requestPaint=function(){b=!0},t.unstable_runWithPriority=function(e,t){switch(e){case 1:case 2:case 3:case 4:case 5:break;default:e=3}var n=f;f=e;try{return t()}finally{f=n}},t.unstable_scheduleCallback=function(e,o,a){var s=t.unstable_now();switch("object"==typeof a&&null!==a?a="number"==typeof(a=a.delay)&&0<a?s+a:s:a=s,e){case 1:var i=-1;break;case 2:i=250;break;case 5:i=1073741823;break;case 4:i=1e4;break;default:i=5e3}return e={id:d++,callback:o,priorityLevel:e,startTime:a,expirationTime:i=a+i,sortIndex:-1},a>s?(e.sortIndex=a,n(u,e),null===r(l)&&e===r(u)&&(g?(v(S),S=-1):g=!0,P(w,a-s))):(e.sortIndex=i,n(l,e),m||h||(m=!0,x||(x=!0,C()))),e},t.unstable_shouldYield=O,t.unstable_wrapCallback=function(e){var t=f;return function(){var n=f;f=t;try{return e.apply(this,arguments)}finally{f=n}}}},83332:(e,t,n)=>{"use strict";n.d(t,{zR:()=>_,TM:()=>M,yJ:()=>f,sC:()=>O,AO:()=>p});var r=n(70811);function o(e){return"/"===e.charAt(0)}function a(e,t){for(var n=t,r=n+1,o=e.length;r<o;n+=1,r+=1)e[n]=e[r];e.pop()}const s=function(e,t){void 0===t&&(t="");var n,r=e&&e.split("/")||[],s=t&&t.split("/")||[],i=e&&o(e),c=t&&o(t),l=i||c;if(e&&o(e)?s=r:r.length&&(s.pop(),s=s.concat(r)),!s.length)return"/";if(s.length){var u=s[s.length-1];n="."===u||".."===u||""===u}else n=!1;for(var d=0,p=s.length;p>=0;p--){var f=s[p];"."===f?a(s,p):".."===f?(a(s,p),d++):d&&(a(s,p),d--)}if(!l)for(;d--;d)s.unshift("..");!l||""===s[0]||s[0]&&o(s[0])||s.unshift("");var h=s.join("/");return n&&"/"!==h.substr(-1)&&(h+="/"),h};var i=n(25385);function c(e){return"/"===e.charAt(0)?e:"/"+e}function l(e){return"/"===e.charAt(0)?e.substr(1):e}function u(e,t){return function(e,t){return 0===e.toLowerCase().indexOf(t.toLowerCase())&&-1!=="/?#".indexOf(e.charAt(t.length))}(e,t)?e.substr(t.length):e}function d(e){return"/"===e.charAt(e.length-1)?e.slice(0,-1):e}function p(e){var t=e.pathname,n=e.search,r=e.hash,o=t||"/";return n&&"?"!==n&&(o+="?"===n.charAt(0)?n:"?"+n),r&&"#"!==r&&(o+="#"===r.charAt(0)?r:"#"+r),o}function f(e,t,n,o){var a;"string"==typeof e?(a=function(e){var t=e||"/",n="",r="",o=t.indexOf("#");-1!==o&&(r=t.substr(o),t=t.substr(0,o));var a=t.indexOf("?");return-1!==a&&(n=t.substr(a),t=t.substr(0,a)),{pathname:t,search:"?"===n?"":n,hash:"#"===r?"":r}}(e),a.state=t):(void 0===(a=(0,r.A)({},e)).pathname&&(a.pathname=""),a.search?"?"!==a.search.charAt(0)&&(a.search="?"+a.search):a.search="",a.hash?"#"!==a.hash.charAt(0)&&(a.hash="#"+a.hash):a.hash="",void 0!==t&&void 0===a.state&&(a.state=t));try{a.pathname=decodeURI(a.pathname)}catch(i){throw i instanceof URIError?new URIError('Pathname "'+a.pathname+'" could not be decoded. This is likely caused by an invalid percent-encoding.'):i}return n&&(a.key=n),o?a.pathname?"/"!==a.pathname.charAt(0)&&(a.pathname=s(a.pathname,o.pathname)):a.pathname=o.pathname:a.pathname||(a.pathname="/"),a}function h(){var e=null;var t=[];return{setPrompt:function(t){return e=t,function(){e===t&&(e=null)}},confirmTransitionTo:function(t,n,r,o){if(null!=e){var a="function"==typeof e?e(t,n):e;"string"==typeof a?"function"==typeof r?r(a,o):o(!0):o(!1!==a)}else o(!0)},appendListener:function(e){var n=!0;function r(){n&&e.apply(void 0,arguments)}return t.push(r),function(){n=!1,t=t.filter(function(e){return e!==r})}},notifyListeners:function(){for(var e=arguments.length,n=new Array(e),r=0;r<e;r++)n[r]=arguments[r];t.forEach(function(e){return e.apply(void 0,n)})}}}var m=!("undefined"==typeof window||!window.document||!window.document.createElement);function g(e,t){t(window.confirm(e))}var b="popstate",y="hashchange";function v(){try{return window.history.state||{}}catch(e){return{}}}function _(e){void 0===e&&(e={}),m||(0,i.A)(!1);var t,n=window.history,o=(-1===(t=window.navigator.userAgent).indexOf("Android 2.")&&-1===t.indexOf("Android 4.0")||-1===t.indexOf("Mobile Safari")||-1!==t.indexOf("Chrome")||-1!==t.indexOf("Windows Phone"))&&window.history&&"pushState"in window.history,a=!(-1===window.navigator.userAgent.indexOf("Trident")),s=e,l=s.forceRefresh,_=void 0!==l&&l,k=s.getUserConfirmation,w=void 0===k?g:k,C=s.keyLength,x=void 0===C?6:C,S=e.basename?d(c(e.basename)):"";function M(e){var t=e||{},n=t.key,r=t.state,o=window.location,a=o.pathname+o.search+o.hash;return S&&(a=u(a,S)),f(a,r,n)}function E(){return Math.random().toString(36).substr(2,x)}var O=h();function A(e){(0,r.A)($,e),$.length=n.length,O.notifyListeners($.location,$.action)}function j(e){(function(e){return void 0===e.state&&-1===navigator.userAgent.indexOf("CriOS")})(e)||T(M(e.state))}function D(){T(M(v()))}var P=!1;function T(e){if(P)P=!1,A();else{O.confirmTransitionTo(e,"POP",w,function(t){t?A({action:"POP",location:e}):function(e){var t=$.location,n=N.indexOf(t.key);-1===n&&(n=0);var r=N.indexOf(e.key);-1===r&&(r=0);var o=n-r;o&&(P=!0,R(o))}(e)})}}var I=M(v()),N=[I.key];function L(e){return S+p(e)}function R(e){n.go(e)}var F=0;function z(e){1===(F+=e)&&1===e?(window.addEventListener(b,j),a&&window.addEventListener(y,D)):0===F&&(window.removeEventListener(b,j),a&&window.removeEventListener(y,D))}var B=!1;var $={length:n.length,action:"POP",location:I,createHref:L,push:function(e,t){var r="PUSH",a=f(e,t,E(),$.location);O.confirmTransitionTo(a,r,w,function(e){if(e){var t=L(a),s=a.key,i=a.state;if(o)if(n.pushState({key:s,state:i},null,t),_)window.location.href=t;else{var c=N.indexOf($.location.key),l=N.slice(0,c+1);l.push(a.key),N=l,A({action:r,location:a})}else window.location.href=t}})},replace:function(e,t){var r="REPLACE",a=f(e,t,E(),$.location);O.confirmTransitionTo(a,r,w,function(e){if(e){var t=L(a),s=a.key,i=a.state;if(o)if(n.replaceState({key:s,state:i},null,t),_)window.location.replace(t);else{var c=N.indexOf($.location.key);-1!==c&&(N[c]=a.key),A({action:r,location:a})}else window.location.replace(t)}})},go:R,goBack:function(){R(-1)},goForward:function(){R(1)},block:function(e){void 0===e&&(e=!1);var t=O.setPrompt(e);return B||(z(1),B=!0),function(){return B&&(B=!1,z(-1)),t()}},listen:function(e){var t=O.appendListener(e);return z(1),function(){z(-1),t()}}};return $}var k="hashchange",w={hashbang:{encodePath:function(e){return"!"===e.charAt(0)?e:"!/"+l(e)},decodePath:function(e){return"!"===e.charAt(0)?e.substr(1):e}},noslash:{encodePath:l,decodePath:c},slash:{encodePath:c,decodePath:c}};function C(e){var t=e.indexOf("#");return-1===t?e:e.slice(0,t)}function x(){var e=window.location.href,t=e.indexOf("#");return-1===t?"":e.substring(t+1)}function S(e){window.location.replace(C(window.location.href)+"#"+e)}function M(e){void 0===e&&(e={}),m||(0,i.A)(!1);var t=window.history,n=(window.navigator.userAgent.indexOf("Firefox"),e),o=n.getUserConfirmation,a=void 0===o?g:o,s=n.hashType,l=void 0===s?"slash":s,b=e.basename?d(c(e.basename)):"",y=w[l],v=y.encodePath,_=y.decodePath;function M(){var e=_(x());return b&&(e=u(e,b)),f(e)}var E=h();function O(e){(0,r.A)(B,e),B.length=t.length,E.notifyListeners(B.location,B.action)}var A=!1,j=null;function D(){var e,t,n=x(),r=v(n);if(n!==r)S(r);else{var o=M(),s=B.location;if(!A&&(t=o,(e=s).pathname===t.pathname&&e.search===t.search&&e.hash===t.hash))return;if(j===p(o))return;j=null,function(e){if(A)A=!1,O();else{var t="POP";E.confirmTransitionTo(e,t,a,function(n){n?O({action:t,location:e}):function(e){var t=B.location,n=N.lastIndexOf(p(t));-1===n&&(n=0);var r=N.lastIndexOf(p(e));-1===r&&(r=0);var o=n-r;o&&(A=!0,L(o))}(e)})}}(o)}}var P=x(),T=v(P);P!==T&&S(T);var I=M(),N=[p(I)];function L(e){t.go(e)}var R=0;function F(e){1===(R+=e)&&1===e?window.addEventListener(k,D):0===R&&window.removeEventListener(k,D)}var z=!1;var B={length:t.length,action:"POP",location:I,createHref:function(e){var t=document.querySelector("base"),n="";return t&&t.getAttribute("href")&&(n=C(window.location.href)),n+"#"+v(b+p(e))},push:function(e,t){var n="PUSH",r=f(e,void 0,void 0,B.location);E.confirmTransitionTo(r,n,a,function(e){if(e){var t=p(r),o=v(b+t);if(x()!==o){j=t,function(e){window.location.hash=e}(o);var a=N.lastIndexOf(p(B.location)),s=N.slice(0,a+1);s.push(t),N=s,O({action:n,location:r})}else O()}})},replace:function(e,t){var n="REPLACE",r=f(e,void 0,void 0,B.location);E.confirmTransitionTo(r,n,a,function(e){if(e){var t=p(r),o=v(b+t);x()!==o&&(j=t,S(o));var a=N.indexOf(p(B.location));-1!==a&&(N[a]=t),O({action:n,location:r})}})},go:L,goBack:function(){L(-1)},goForward:function(){L(1)},block:function(e){void 0===e&&(e=!1);var t=E.setPrompt(e);return z||(F(1),z=!0),function(){return z&&(z=!1,F(-1)),t()}},listen:function(e){var t=E.appendListener(e);return F(1),function(){F(-1),t()}}};return B}function E(e,t,n){return Math.min(Math.max(e,t),n)}function O(e){void 0===e&&(e={});var t=e,n=t.getUserConfirmation,o=t.initialEntries,a=void 0===o?["/"]:o,s=t.initialIndex,i=void 0===s?0:s,c=t.keyLength,l=void 0===c?6:c,u=h();function d(e){(0,r.A)(_,e),_.length=_.entries.length,u.notifyListeners(_.location,_.action)}function m(){return Math.random().toString(36).substr(2,l)}var g=E(i,0,a.length-1),b=a.map(function(e){return f(e,void 0,"string"==typeof e?m():e.key||m())}),y=p;function v(e){var t=E(_.index+e,0,_.entries.length-1),r=_.entries[t];u.confirmTransitionTo(r,"POP",n,function(e){e?d({action:"POP",location:r,index:t}):d()})}var _={length:b.length,action:"POP",location:b[g],index:g,entries:b,createHref:y,push:function(e,t){var r="PUSH",o=f(e,t,m(),_.location);u.confirmTransitionTo(o,r,n,function(e){if(e){var t=_.index+1,n=_.entries.slice(0);n.length>t?n.splice(t,n.length-t,o):n.push(o),d({action:r,location:o,index:t,entries:n})}})},replace:function(e,t){var r="REPLACE",o=f(e,t,m(),_.location);u.confirmTransitionTo(o,r,n,function(e){e&&(_.entries[_.index]=o,d({action:r,location:o}))})},go:v,goBack:function(){v(-1)},goForward:function(){v(1)},canGo:function(e){var t=_.index+e;return t>=0&&t<_.entries.length},block:function(e){return void 0===e&&(e=!1),u.setPrompt(e)},listen:function(e){return u.appendListener(e)}};return _}},83386:(e,t,n)=>{"use strict";n.d(t,{M:()=>h,e:()=>f});var r=n(36672),o=n(98099),a=n(96320),s=n(32342),i=n(67797),c=n(92471),l=n(23420);const u=r.createContext(void 0);function d(){const e=function(){const e=(0,o.YL)(),{items:t}=(0,i.p)().navbar;return 0===t.length&&!e.component}(),t=(0,a.l)(),n=!e&&"mobile"===t,[s,c]=(0,r.useState)(!1),l=(0,r.useCallback)(()=>{c(e=>!e)},[]);return(0,r.useEffect)(()=>{"desktop"===t&&c(!1)},[t]),(0,r.useMemo)(()=>({disabled:e,shouldRender:n,toggle:l,shown:s}),[e,n,l,s])}function p({handler:e}){return(0,s.$Z)(e),null}function f({children:e}){const t=d();return(0,l.jsxs)(l.Fragment,{children:[t.shown&&(0,l.jsx)(p,{handler:()=>(t.toggle(),!1)}),(0,l.jsx)(u.Provider,{value:t,children:e})]})}function h(){const e=r.useContext(u);if(void 0===e)throw new c.dV("NavbarMobileSidebarProvider");return e}},83481:()=>{!function(e){e.languages.kotlin=e.languages.extend("clike",{keyword:{pattern:/(^|[^.])\b(?:abstract|actual|annotation|as|break|by|catch|class|companion|const|constructor|continue|crossinline|data|do|dynamic|else|enum|expect|external|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|lateinit|noinline|null|object|open|operator|out|override|package|private|protected|public|reified|return|sealed|set|super|suspend|tailrec|this|throw|to|try|typealias|val|var|vararg|when|where|while)\b/,lookbehind:!0},function:[{pattern:/(?:`[^\r\n`]+`|\b\w+)(?=\s*\()/,greedy:!0},{pattern:/(\.)(?:`[^\r\n`]+`|\w+)(?=\s*\{)/,lookbehind:!0,greedy:!0}],number:/\b(?:0[xX][\da-fA-F]+(?:_[\da-fA-F]+)*|0[bB][01]+(?:_[01]+)*|\d+(?:_\d+)*(?:\.\d+(?:_\d+)*)?(?:[eE][+-]?\d+(?:_\d+)*)?[fFL]?)\b/,operator:/\+[+=]?|-[-=>]?|==?=?|!(?:!|==?)?|[\/*%<>]=?|[?:]:?|\.\.|&&|\|\||\b(?:and|inv|or|shl|shr|ushr|xor)\b/}),delete e.languages.kotlin["class-name"];var t={"interpolation-punctuation":{pattern:/^\$\{?|\}$/,alias:"punctuation"},expression:{pattern:/[\s\S]+/,inside:e.languages.kotlin}};e.languages.insertBefore("kotlin","string",{"string-literal":[{pattern:/"""(?:[^$]|\$(?:(?!\{)|\{[^{}]*\}))*?"""/,alias:"multiline",inside:{interpolation:{pattern:/\$(?:[a-z_]\w*|\{[^{}]*\})/i,inside:t},string:/[\s\S]+/}},{pattern:/"(?:[^"\\\r\n$]|\\.|\$(?:(?!\{)|\{[^{}]*\}))*"/,alias:"singleline",inside:{interpolation:{pattern:/((?:^|[^\\])(?:\\{2})*)\$(?:[a-z_]\w*|\{[^{}]*\})/i,lookbehind:!0,inside:t},string:/[\s\S]+/}}],char:{pattern:/'(?:[^'\\\r\n]|\\(?:.|u[a-fA-F0-9]{0,4}))'/,greedy:!0}}),delete e.languages.kotlin.string,e.languages.insertBefore("kotlin","keyword",{annotation:{pattern:/\B@(?:\w+:)?(?:[A-Z]\w*|\[[^\]]+\])/,alias:"builtin"}}),e.languages.insertBefore("kotlin","function",{label:{pattern:/\b\w+@|@\w+\b/,alias:"symbol"}}),e.languages.kt=e.languages.kotlin,e.languages.kts=e.languages.kotlin}(Prism)},84054:e=>{"use strict";e.exports=JSON.parse('{"/ModuleCheck/changelog-6c5":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"75878fc8"},"/ModuleCheck/migrations-b20":{"__comp":"1f391b9e","__context":{"plugin":"a7456010"},"content":"444a5a58"},"/ModuleCheck/search-b2c":{"__comp":"1a4e3797","__context":{"plugin":"c141421f"}},"/ModuleCheck/docs-ea9":{"__comp":"5e95c892","__context":{"plugin":"aba21aa0"}},"/ModuleCheck/docs/0.10.0-69a":{"__comp":"a7bd4aaa","__props":"021c8caa"},"/ModuleCheck/docs/0.10.0-acc":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.10.0/-efa":{"__comp":"17896441","content":"24af6869"},"/ModuleCheck/docs/0.10.0/configuration-4f3":{"__comp":"17896441","content":"62cdf0e0"},"/ModuleCheck/docs/0.10.0/mdx-60c":{"__comp":"17896441","content":"7cbf6be7"},"/ModuleCheck/docs/0.10.0/rules/android/disable_resources-3a2":{"__comp":"17896441","content":"b3a16c5b"},"/ModuleCheck/docs/0.10.0/rules/android/disable_viewbinding-4d4":{"__comp":"17896441","content":"be81e05d"},"/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchers-0fe":{"__comp":"17896441","content":"cb00cd0b"},"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_plugin-1f9":{"__comp":"17896441","content":"a4e2bd41"},"/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processor-d30":{"__comp":"17896441","content":"ffeead90"},"/ModuleCheck/docs/0.10.0/rules/overshot-771":{"__comp":"17896441","content":"d05f0a7d"},"/ModuleCheck/docs/0.10.0/rules/redundant-c5b":{"__comp":"17896441","content":"1483dc01"},"/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependencies-b11":{"__comp":"17896441","content":"14e1fcc3"},"/ModuleCheck/docs/0.10.0/rules/sorting/sort_plugins-de5":{"__comp":"17896441","content":"99547feb"},"/ModuleCheck/docs/0.10.0/rules/unused-f7f":{"__comp":"17896441","content":"70335a48"},"/ModuleCheck/docs/0.11.0-00d":{"__comp":"a7bd4aaa","__props":"5ad15a2f"},"/ModuleCheck/docs/0.11.0-c05":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.11.0/-110":{"__comp":"17896441","content":"c07a004a"},"/ModuleCheck/docs/0.11.0/configuration-511":{"__comp":"17896441","content":"30f6db9d"},"/ModuleCheck/docs/0.11.0/rules/android/disable_resources-f78":{"__comp":"17896441","content":"9469bd80"},"/ModuleCheck/docs/0.11.0/rules/android/disable_viewbinding-cff":{"__comp":"17896441","content":"20c870cb"},"/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factory-953":{"__comp":"17896441","content":"8e56f135"},"/ModuleCheck/docs/0.11.0/rules/inherited_dependency-83f":{"__comp":"17896441","content":"abdba85e"},"/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchers-a1a":{"__comp":"17896441","content":"eadc19b4"},"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_plugin-e0c":{"__comp":"17896441","content":"3e41c308"},"/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processor-322":{"__comp":"17896441","content":"109fab02"},"/ModuleCheck/docs/0.11.0/rules/must_be_api-66f":{"__comp":"17896441","content":"e4d3d2e1"},"/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependencies-077":{"__comp":"17896441","content":"4359cab8"},"/ModuleCheck/docs/0.11.0/rules/sorting/sort_plugins-b83":{"__comp":"17896441","content":"ba3d50d9"},"/ModuleCheck/docs/0.11.0/rules/unused-84a":{"__comp":"17896441","content":"048b8cd8"},"/ModuleCheck/docs/0.11.1-fdf":{"__comp":"a7bd4aaa","__props":"53b10fcd"},"/ModuleCheck/docs/0.11.1-709":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.11.1/-a1a":{"__comp":"17896441","content":"bc73dc9d"},"/ModuleCheck/docs/0.11.1/configuration-4f3":{"__comp":"17896441","content":"c5f63adb"},"/ModuleCheck/docs/0.11.1/rules/android/disable_resources-551":{"__comp":"17896441","content":"1a3a5cbb"},"/ModuleCheck/docs/0.11.1/rules/android/disable_viewbinding-5c0":{"__comp":"17896441","content":"64018eb5"},"/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factory-fc2":{"__comp":"17896441","content":"c846d7aa"},"/ModuleCheck/docs/0.11.1/rules/inherited_dependency-01b":{"__comp":"17896441","content":"bc7e3c4b"},"/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchers-cc4":{"__comp":"17896441","content":"5d2d37cd"},"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_plugin-85d":{"__comp":"17896441","content":"df248b36"},"/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processor-31b":{"__comp":"17896441","content":"a559ab1c"},"/ModuleCheck/docs/0.11.1/rules/must_be_api-f93":{"__comp":"17896441","content":"627bdb5d"},"/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependencies-f1c":{"__comp":"17896441","content":"5f0d7ee4"},"/ModuleCheck/docs/0.11.1/rules/sorting/sort_plugins-2ac":{"__comp":"17896441","content":"ac2458d6"},"/ModuleCheck/docs/0.11.1/rules/unused-a1e":{"__comp":"17896441","content":"a8ed45e8"},"/ModuleCheck/docs/0.11.2-936":{"__comp":"a7bd4aaa","__props":"d4bc87de"},"/ModuleCheck/docs/0.11.2-ad2":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.11.2/-b89":{"__comp":"17896441","content":"46e9ac31"},"/ModuleCheck/docs/0.11.2/ci-workflow-e0f":{"__comp":"17896441","content":"cb4f58ba"},"/ModuleCheck/docs/0.11.2/configuration-c88":{"__comp":"17896441","content":"23c216bb"},"/ModuleCheck/docs/0.11.2/rules/android/disable_resources-7cd":{"__comp":"17896441","content":"12b0e932"},"/ModuleCheck/docs/0.11.2/rules/android/disable_viewbinding-59f":{"__comp":"17896441","content":"09b50579"},"/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factory-c8f":{"__comp":"17896441","content":"171ac7cc"},"/ModuleCheck/docs/0.11.2/rules/inherited_dependency-d33":{"__comp":"17896441","content":"a06cff9c"},"/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchers-f07":{"__comp":"17896441","content":"5fd14b8b"},"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_plugin-f7f":{"__comp":"17896441","content":"f399bb6f"},"/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processor-053":{"__comp":"17896441","content":"3139ff2f"},"/ModuleCheck/docs/0.11.2/rules/must_be_api-4c3":{"__comp":"17896441","content":"ca8e7b55"},"/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependencies-abd":{"__comp":"17896441","content":"bd7e05cf"},"/ModuleCheck/docs/0.11.2/rules/sorting/sort_plugins-d80":{"__comp":"17896441","content":"de406b5e"},"/ModuleCheck/docs/0.11.2/rules/unused-789":{"__comp":"17896441","content":"b00e7a90"},"/ModuleCheck/docs/0.11.3-0ce":{"__comp":"a7bd4aaa","__props":"b20814c1"},"/ModuleCheck/docs/0.11.3-f4b":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.11.3/-5e5":{"__comp":"17896441","content":"b1002bca"},"/ModuleCheck/docs/0.11.3/ci-workflow-b4a":{"__comp":"17896441","content":"c902409b"},"/ModuleCheck/docs/0.11.3/configuration-1c6":{"__comp":"17896441","content":"7bab4396"},"/ModuleCheck/docs/0.11.3/rules/android/disable_resources-11b":{"__comp":"17896441","content":"dc7f0b30"},"/ModuleCheck/docs/0.11.3/rules/android/disable_viewbinding-e1e":{"__comp":"17896441","content":"e8303188"},"/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factory-291":{"__comp":"17896441","content":"ca3e6c65"},"/ModuleCheck/docs/0.11.3/rules/inherited_dependency-712":{"__comp":"17896441","content":"46d462fa"},"/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchers-75a":{"__comp":"17896441","content":"9478d12a"},"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_plugin-e38":{"__comp":"17896441","content":"5d624d4b"},"/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processor-783":{"__comp":"17896441","content":"c10c208b"},"/ModuleCheck/docs/0.11.3/rules/must_be_api-671":{"__comp":"17896441","content":"19d61b19"},"/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependencies-2ad":{"__comp":"17896441","content":"a5fc5a0e"},"/ModuleCheck/docs/0.11.3/rules/sorting/sort_plugins-b98":{"__comp":"17896441","content":"fb031341"},"/ModuleCheck/docs/0.11.3/rules/unused-ba3":{"__comp":"17896441","content":"4c8a85bd"},"/ModuleCheck/docs/0.11.3/suppressing-findings-d13":{"__comp":"17896441","content":"05d123c0"},"/ModuleCheck/docs/0.12.0-ae3":{"__comp":"a7bd4aaa","__props":"e819ef22"},"/ModuleCheck/docs/0.12.0-e9b":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.12.0/-afb":{"__comp":"17896441","content":"87c27ff4"},"/ModuleCheck/docs/0.12.0/ci-workflow-29e":{"__comp":"17896441","content":"a35aa088"},"/ModuleCheck/docs/0.12.0/configuration-d18":{"__comp":"17896441","content":"518ccc20"},"/ModuleCheck/docs/0.12.0/rules/android/disable_resources-c59":{"__comp":"17896441","content":"7c1e7b42"},"/ModuleCheck/docs/0.12.0/rules/android/disable_viewbinding-e07":{"__comp":"17896441","content":"4e8e2262"},"/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensions-474":{"__comp":"17896441","content":"4047c50f"},"/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factory-9f3":{"__comp":"17896441","content":"9ae4b911"},"/ModuleCheck/docs/0.12.0/rules/depths-106":{"__comp":"17896441","content":"7136df27"},"/ModuleCheck/docs/0.12.0/rules/inherited_dependency-4c6":{"__comp":"17896441","content":"41bca987"},"/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchers-9d7":{"__comp":"17896441","content":"171f1b26"},"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_plugin-28a":{"__comp":"17896441","content":"ce0be35a"},"/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processor-247":{"__comp":"17896441","content":"50b1f033"},"/ModuleCheck/docs/0.12.0/rules/must_be_api-529":{"__comp":"17896441","content":"c83ce79b"},"/ModuleCheck/docs/0.12.0/rules/overshot_dependency-d6f":{"__comp":"17896441","content":"10b686c7"},"/ModuleCheck/docs/0.12.0/rules/redundant_dependency-8f3":{"__comp":"17896441","content":"e0a1aa17"},"/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependencies-30d":{"__comp":"17896441","content":"521dad97"},"/ModuleCheck/docs/0.12.0/rules/sorting/sort_plugins-694":{"__comp":"17896441","content":"2f675600"},"/ModuleCheck/docs/0.12.0/rules/unused-6a4":{"__comp":"17896441","content":"71174ce3"},"/ModuleCheck/docs/0.12.0/suppressing-findings-8de":{"__comp":"17896441","content":"a2d99d88"},"/ModuleCheck/docs/0.12.1-254":{"__comp":"a7bd4aaa","__props":"c0050a27"},"/ModuleCheck/docs/0.12.1-d14":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.12.1/-75e":{"__comp":"17896441","content":"3abc021e"},"/ModuleCheck/docs/0.12.1/ci-workflow-c9b":{"__comp":"17896441","content":"1a3bb66a"},"/ModuleCheck/docs/0.12.1/configuration-584":{"__comp":"17896441","content":"ef46515e"},"/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchers-68b":{"__comp":"17896441","content":"91ee770c"},"/ModuleCheck/docs/0.12.1/rules/disable_android_resources-bc2":{"__comp":"17896441","content":"325152a5"},"/ModuleCheck/docs/0.12.1/rules/disable_view_binding-133":{"__comp":"17896441","content":"89d14484"},"/ModuleCheck/docs/0.12.1/rules/inherited_dependency-c72":{"__comp":"17896441","content":"341c85ac"},"/ModuleCheck/docs/0.12.1/rules/must_be_api-5b1":{"__comp":"17896441","content":"ff366317"},"/ModuleCheck/docs/0.12.1/rules/overshot_dependency-4bd":{"__comp":"17896441","content":"a4b1a9b8"},"/ModuleCheck/docs/0.12.1/rules/project_depth-4c1":{"__comp":"17896441","content":"25072094"},"/ModuleCheck/docs/0.12.1/rules/redundant_dependency-07b":{"__comp":"17896441","content":"15a9c06b"},"/ModuleCheck/docs/0.12.1/rules/sort_dependencies-deb":{"__comp":"17896441","content":"92131bac"},"/ModuleCheck/docs/0.12.1/rules/sort_plugins-c1d":{"__comp":"17896441","content":"eb10ccf4"},"/ModuleCheck/docs/0.12.1/rules/unused_dependency-5ae":{"__comp":"17896441","content":"571f3672"},"/ModuleCheck/docs/0.12.1/rules/unused_kapt_plugin-fd6":{"__comp":"17896441","content":"e480558e"},"/ModuleCheck/docs/0.12.1/rules/unused_kapt_processor-e05":{"__comp":"17896441","content":"d2866892"},"/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensions-13b":{"__comp":"17896441","content":"1c291fdc"},"/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generation-164":{"__comp":"17896441","content":"150ef1cb"},"/ModuleCheck/docs/0.12.1/suppressing-findings-6c9":{"__comp":"17896441","content":"54b37c16"},"/ModuleCheck/docs/0.12.2-f87":{"__comp":"a7bd4aaa","__props":"fde89899"},"/ModuleCheck/docs/0.12.2-35b":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.12.2/-fb0":{"__comp":"17896441","content":"1050d62e"},"/ModuleCheck/docs/0.12.2/ci-workflow-b8a":{"__comp":"17896441","content":"2192b561"},"/ModuleCheck/docs/0.12.2/configuration-832":{"__comp":"17896441","content":"3fb0a163"},"/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchers-7d4":{"__comp":"17896441","content":"29a2444a"},"/ModuleCheck/docs/0.12.2/rules/disable_android_resources-402":{"__comp":"17896441","content":"b7c223ee"},"/ModuleCheck/docs/0.12.2/rules/disable_view_binding-271":{"__comp":"17896441","content":"84fb41f0"},"/ModuleCheck/docs/0.12.2/rules/inherited_dependency-ff3":{"__comp":"17896441","content":"c989d589"},"/ModuleCheck/docs/0.12.2/rules/must_be_api-17f":{"__comp":"17896441","content":"228d1b45"},"/ModuleCheck/docs/0.12.2/rules/overshot_dependency-a62":{"__comp":"17896441","content":"50cf1f78"},"/ModuleCheck/docs/0.12.2/rules/project_depth-06c":{"__comp":"17896441","content":"368eb302"},"/ModuleCheck/docs/0.12.2/rules/redundant_dependency-abd":{"__comp":"17896441","content":"0f29fa4c"},"/ModuleCheck/docs/0.12.2/rules/sort_dependencies-0bd":{"__comp":"17896441","content":"7da24252"},"/ModuleCheck/docs/0.12.2/rules/sort_plugins-f4e":{"__comp":"17896441","content":"b1c76d35"},"/ModuleCheck/docs/0.12.2/rules/unused_dependency-9a1":{"__comp":"17896441","content":"3e68fbe7"},"/ModuleCheck/docs/0.12.2/rules/unused_kapt_plugin-f08":{"__comp":"17896441","content":"c7222430"},"/ModuleCheck/docs/0.12.2/rules/unused_kapt_processor-951":{"__comp":"17896441","content":"051962a1"},"/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensions-191":{"__comp":"17896441","content":"cc640607"},"/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generation-acb":{"__comp":"17896441","content":"341f4c6e"},"/ModuleCheck/docs/0.12.2/suppressing-findings-566":{"__comp":"17896441","content":"99cbfc76"},"/ModuleCheck/docs/0.12.3-995":{"__comp":"a7bd4aaa","__props":"d1cdaf24"},"/ModuleCheck/docs/0.12.3-549":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.12.3/-bdc":{"__comp":"17896441","content":"d51efe31"},"/ModuleCheck/docs/0.12.3/ci-workflow-2b2":{"__comp":"17896441","content":"aad83134"},"/ModuleCheck/docs/0.12.3/configuration-081":{"__comp":"17896441","content":"011d940f"},"/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchers-73d":{"__comp":"17896441","content":"c2414a18"},"/ModuleCheck/docs/0.12.3/rules/disable_android_resources-8b6":{"__comp":"17896441","content":"c4b5a5df"},"/ModuleCheck/docs/0.12.3/rules/disable_view_binding-153":{"__comp":"17896441","content":"23284c9b"},"/ModuleCheck/docs/0.12.3/rules/inherited_dependency-487":{"__comp":"17896441","content":"485c5e01"},"/ModuleCheck/docs/0.12.3/rules/must_be_api-4ba":{"__comp":"17896441","content":"ef09bccd"},"/ModuleCheck/docs/0.12.3/rules/overshot_dependency-54b":{"__comp":"17896441","content":"5b786e91"},"/ModuleCheck/docs/0.12.3/rules/project_depth-1bf":{"__comp":"17896441","content":"d69a7b0b"},"/ModuleCheck/docs/0.12.3/rules/redundant_dependency-65b":{"__comp":"17896441","content":"b28afb00"},"/ModuleCheck/docs/0.12.3/rules/sort_dependencies-303":{"__comp":"17896441","content":"e7f8ca4b"},"/ModuleCheck/docs/0.12.3/rules/sort_plugins-9ba":{"__comp":"17896441","content":"cd2aa5fe"},"/ModuleCheck/docs/0.12.3/rules/unused_dependency-bf4":{"__comp":"17896441","content":"1e828d0d"},"/ModuleCheck/docs/0.12.3/rules/unused_kapt_plugin-2f6":{"__comp":"17896441","content":"400cc4b7"},"/ModuleCheck/docs/0.12.3/rules/unused_kapt_processor-75e":{"__comp":"17896441","content":"cd6f4c97"},"/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensions-127":{"__comp":"17896441","content":"107eb4cc"},"/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generation-522":{"__comp":"17896441","content":"1ecac929"},"/ModuleCheck/docs/0.12.3/suppressing-findings-71e":{"__comp":"17896441","content":"ede96f45"},"/ModuleCheck/docs/0.12.4-3a4":{"__comp":"a7bd4aaa","__props":"6518a949"},"/ModuleCheck/docs/0.12.4-27f":{"__comp":"a94703ab"},"/ModuleCheck/docs/0.12.4/-e8d":{"__comp":"17896441","content":"b35da6ab"},"/ModuleCheck/docs/0.12.4/ci-workflow-8b5":{"__comp":"17896441","content":"044a6187"},"/ModuleCheck/docs/0.12.4/configuration-6b4":{"__comp":"17896441","content":"ca873730"},"/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchers-b37":{"__comp":"17896441","content":"f9546978"},"/ModuleCheck/docs/0.12.4/rules/disable_android_resources-e3e":{"__comp":"17896441","content":"e5eedb42"},"/ModuleCheck/docs/0.12.4/rules/disable_view_binding-54e":{"__comp":"17896441","content":"d968e4da"},"/ModuleCheck/docs/0.12.4/rules/inherited_dependency-185":{"__comp":"17896441","content":"35179155"},"/ModuleCheck/docs/0.12.4/rules/must_be_api-342":{"__comp":"17896441","content":"86c82c9a"},"/ModuleCheck/docs/0.12.4/rules/overshot_dependency-230":{"__comp":"17896441","content":"0b199b14"},"/ModuleCheck/docs/0.12.4/rules/project_depth-c39":{"__comp":"17896441","content":"f354998b"},"/ModuleCheck/docs/0.12.4/rules/redundant_dependency-606":{"__comp":"17896441","content":"e12d7f74"},"/ModuleCheck/docs/0.12.4/rules/sort_dependencies-35a":{"__comp":"17896441","content":"896d06c5"},"/ModuleCheck/docs/0.12.4/rules/sort_plugins-690":{"__comp":"17896441","content":"19b95078"},"/ModuleCheck/docs/0.12.4/rules/unused_dependency-c81":{"__comp":"17896441","content":"d425c21a"},"/ModuleCheck/docs/0.12.4/rules/unused_kapt_plugin-088":{"__comp":"17896441","content":"3325f0a2"},"/ModuleCheck/docs/0.12.4/rules/unused_kapt_processor-652":{"__comp":"17896441","content":"487ca811"},"/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensions-23e":{"__comp":"17896441","content":"c4025719"},"/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generation-b7d":{"__comp":"17896441","content":"411bcc8b"},"/ModuleCheck/docs/0.12.4/suppressing-findings-357":{"__comp":"17896441","content":"a5f1db42"},"/ModuleCheck/docs/next-5d8":{"__comp":"a7bd4aaa","__props":"41b23040"},"/ModuleCheck/docs/next-b28":{"__comp":"a94703ab"},"/ModuleCheck/docs/next/-2a1":{"__comp":"17896441","content":"74876495"},"/ModuleCheck/docs/next/ci-workflow-7ff":{"__comp":"17896441","content":"a180cea5"},"/ModuleCheck/docs/next/configuration-18d":{"__comp":"17896441","content":"cbb899e4"},"/ModuleCheck/docs/next/rules/custom_kapt_matchers-2df":{"__comp":"17896441","content":"c5b979b0"},"/ModuleCheck/docs/next/rules/disable_android_resources-955":{"__comp":"17896441","content":"ca460041"},"/ModuleCheck/docs/next/rules/disable_view_binding-e88":{"__comp":"17896441","content":"e69e4b95"},"/ModuleCheck/docs/next/rules/inherited_dependency-222":{"__comp":"17896441","content":"724ecf1a"},"/ModuleCheck/docs/next/rules/must_be_api-db1":{"__comp":"17896441","content":"2950f807"},"/ModuleCheck/docs/next/rules/overshot_dependency-ed9":{"__comp":"17896441","content":"cbe609e8"},"/ModuleCheck/docs/next/rules/project_depth-4d8":{"__comp":"17896441","content":"6bba662b"},"/ModuleCheck/docs/next/rules/redundant_dependency-ea9":{"__comp":"17896441","content":"c1600862"},"/ModuleCheck/docs/next/rules/sort_dependencies-9f3":{"__comp":"17896441","content":"91e5ca6b"},"/ModuleCheck/docs/next/rules/sort_plugins-ab2":{"__comp":"17896441","content":"6e873df7"},"/ModuleCheck/docs/next/rules/unused_dependency-6a3":{"__comp":"17896441","content":"7273998d"},"/ModuleCheck/docs/next/rules/unused_kapt_plugin-872":{"__comp":"17896441","content":"71eb5ef4"},"/ModuleCheck/docs/next/rules/unused_kapt_processor-a4f":{"__comp":"17896441","content":"4577221a"},"/ModuleCheck/docs/next/rules/unused_kotlin_android_extensions-bbb":{"__comp":"17896441","content":"51d6008a"},"/ModuleCheck/docs/next/rules/use_anvil_factory_generation-49a":{"__comp":"17896441","content":"0807349d"},"/ModuleCheck/docs/next/suppressing-findings-1a5":{"__comp":"17896441","content":"94dc3e5f"},"/ModuleCheck/docs-f3f":{"__comp":"a7bd4aaa","__props":"9e2bab8c"},"/ModuleCheck/docs-ce9":{"__comp":"a94703ab"},"/ModuleCheck/docs/-c72":{"__comp":"17896441","content":"324fc7ff"},"/ModuleCheck/docs/ci-workflow-ef4":{"__comp":"17896441","content":"6e6115bc"},"/ModuleCheck/docs/configuration-ce4":{"__comp":"17896441","content":"e4603b0e"},"/ModuleCheck/docs/rules/custom_kapt_matchers-aea":{"__comp":"17896441","content":"4329fc3c"},"/ModuleCheck/docs/rules/disable_android_resources-3b4":{"__comp":"17896441","content":"e0474f93"},"/ModuleCheck/docs/rules/disable_view_binding-a53":{"__comp":"17896441","content":"8dac98b9"},"/ModuleCheck/docs/rules/inherited_dependency-003":{"__comp":"17896441","content":"388f1aef"},"/ModuleCheck/docs/rules/must_be_api-f05":{"__comp":"17896441","content":"47da9d80"},"/ModuleCheck/docs/rules/overshot_dependency-7f8":{"__comp":"17896441","content":"03459661"},"/ModuleCheck/docs/rules/project_depth-919":{"__comp":"17896441","content":"66e00e19"},"/ModuleCheck/docs/rules/redundant_dependency-4c1":{"__comp":"17896441","content":"02359d8a"},"/ModuleCheck/docs/rules/sort_dependencies-8ca":{"__comp":"17896441","content":"0fc8e5d5"},"/ModuleCheck/docs/rules/sort_plugins-e73":{"__comp":"17896441","content":"54f055ef"},"/ModuleCheck/docs/rules/unused_dependency-905":{"__comp":"17896441","content":"e4f0c0bc"},"/ModuleCheck/docs/rules/unused_kapt_plugin-3c3":{"__comp":"17896441","content":"eb678835"},"/ModuleCheck/docs/rules/unused_kapt_processor-728":{"__comp":"17896441","content":"de297161"},"/ModuleCheck/docs/rules/unused_kotlin_android_extensions-2b6":{"__comp":"17896441","content":"6033e994"},"/ModuleCheck/docs/rules/use_anvil_factory_generation-a6f":{"__comp":"17896441","content":"f963ac8e"},"/ModuleCheck/docs/suppressing-findings-8f6":{"__comp":"17896441","content":"f435945d"},"/ModuleCheck/-f09":{"__comp":"c4f5d8e4","__context":{"plugin":"a7456010"},"config":"5e9f5e1a"}}')},84862:(e,t,n)=>{"use strict";n.d(t,{G:()=>r});const r={page:{blogListPage:"blog-list-page",blogPostPage:"blog-post-page",blogTagsListPage:"blog-tags-list-page",blogTagPostListPage:"blog-tags-post-list-page",blogAuthorsListPage:"blog-authors-list-page",blogAuthorsPostsPage:"blog-authors-posts-page",docsDocPage:"docs-doc-page",docsTagsListPage:"docs-tags-list-page",docsTagDocListPage:"docs-tags-doc-list-page",mdxPage:"mdx-page"},wrapper:{main:"main-wrapper",blogPages:"blog-wrapper",docsPages:"docs-wrapper",mdxPages:"mdx-wrapper"},common:{editThisPage:"theme-edit-this-page",lastUpdated:"theme-last-updated",backToTopButton:"theme-back-to-top-button",codeBlock:"theme-code-block",admonition:"theme-admonition",unlistedBanner:"theme-unlisted-banner",draftBanner:"theme-draft-banner",admonitionType:e=>`theme-admonition-${e}`},announcementBar:{container:"theme-announcement-bar"},layout:{navbar:{container:"theme-layout-navbar",containerLeft:"theme-layout-navbar-left",containerRight:"theme-layout-navbar-right",mobileSidebar:{container:"theme-layout-navbar-sidebar",panel:"theme-layout-navbar-sidebar-panel"}},main:{container:"theme-layout-main"},footer:{container:"theme-layout-footer",column:"theme-layout-footer-column"}},docs:{docVersionBanner:"theme-doc-version-banner",docVersionBadge:"theme-doc-version-badge",docBreadcrumbs:"theme-doc-breadcrumbs",docMarkdown:"theme-doc-markdown",docTocMobile:"theme-doc-toc-mobile",docTocDesktop:"theme-doc-toc-desktop",docFooter:"theme-doc-footer",docFooterTagsRow:"theme-doc-footer-tags-row",docFooterEditMetaRow:"theme-doc-footer-edit-meta-row",docSidebarContainer:"theme-doc-sidebar-container",docSidebarMenu:"theme-doc-sidebar-menu",docSidebarItemCategory:"theme-doc-sidebar-item-category",docSidebarItemLink:"theme-doc-sidebar-item-link",docSidebarItemCategoryLevel:e=>`theme-doc-sidebar-item-category-level-${e}`,docSidebarItemLinkLevel:e=>`theme-doc-sidebar-item-link-level-${e}`},blog:{blogFooterTagsRow:"theme-blog-footer-tags-row",blogFooterEditMetaRow:"theme-blog-footer-edit-meta-row"},pages:{pageFooterEditMetaRow:"theme-pages-footer-edit-meta-row"}}},85291:(e,t,n)=>{"use strict";n.d(t,{B6:()=>C,Ix:()=>v,W6:()=>P,XZ:()=>y,dO:()=>j,qh:()=>x,zy:()=>T});var r=n(10809),o=n(36672),a=n(2736),s=n.n(a),i=n(83332),c=n(25385),l=n(70811),u=n(54785),d=n.n(u),p=(n(35959),n(99298)),f=(n(31035),1073741823),h="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:void 0!==n.g?n.g:{};var m=o.createContext||function(e,t){var n,a,i="__create-react-context-"+function(){var e="__global_unique_id__";return h[e]=(h[e]||0)+1}()+"__",c=function(e){function n(){for(var t,n,r,o=arguments.length,a=new Array(o),s=0;s<o;s++)a[s]=arguments[s];return(t=e.call.apply(e,[this].concat(a))||this).emitter=(n=t.props.value,r=[],{on:function(e){r.push(e)},off:function(e){r=r.filter(function(t){return t!==e})},get:function(){return n},set:function(e,t){n=e,r.forEach(function(e){return e(n,t)})}}),t}(0,r.A)(n,e);var o=n.prototype;return o.getChildContext=function(){var e;return(e={})[i]=this.emitter,e},o.componentWillReceiveProps=function(e){if(this.props.value!==e.value){var n,r=this.props.value,o=e.value;((a=r)===(s=o)?0!==a||1/a==1/s:a!=a&&s!=s)?n=0:(n="function"==typeof t?t(r,o):f,0!==(n|=0)&&this.emitter.set(e.value,n))}var a,s},o.render=function(){return this.props.children},n}(o.Component);c.childContextTypes=((n={})[i]=s().object.isRequired,n);var l=function(t){function n(){for(var e,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(e=t.call.apply(t,[this].concat(r))||this).observedBits=void 0,e.state={value:e.getValue()},e.onUpdate=function(t,n){0!==((0|e.observedBits)&n)&&e.setState({value:e.getValue()})},e}(0,r.A)(n,t);var o=n.prototype;return o.componentWillReceiveProps=function(e){var t=e.observedBits;this.observedBits=null==t?f:t},o.componentDidMount=function(){this.context[i]&&this.context[i].on(this.onUpdate);var e=this.props.observedBits;this.observedBits=null==e?f:e},o.componentWillUnmount=function(){this.context[i]&&this.context[i].off(this.onUpdate)},o.getValue=function(){return this.context[i]?this.context[i].get():e},o.render=function(){return(e=this.props.children,Array.isArray(e)?e[0]:e)(this.state.value);var e},n}(o.Component);return l.contextTypes=((a={})[i]=s().object,a),{Provider:c,Consumer:l}},g=function(e){var t=m();return t.displayName=e,t},b=g("Router-History"),y=g("Router"),v=function(e){function t(t){var n;return(n=e.call(this,t)||this).state={location:t.history.location},n._isMounted=!1,n._pendingLocation=null,t.staticContext||(n.unlisten=t.history.listen(function(e){n._pendingLocation=e})),n}(0,r.A)(t,e),t.computeRootMatch=function(e){return{path:"/",url:"/",params:{},isExact:"/"===e}};var n=t.prototype;return n.componentDidMount=function(){var e=this;this._isMounted=!0,this.unlisten&&this.unlisten(),this.props.staticContext||(this.unlisten=this.props.history.listen(function(t){e._isMounted&&e.setState({location:t})})),this._pendingLocation&&this.setState({location:this._pendingLocation})},n.componentWillUnmount=function(){this.unlisten&&(this.unlisten(),this._isMounted=!1,this._pendingLocation=null)},n.render=function(){return o.createElement(y.Provider,{value:{history:this.props.history,location:this.state.location,match:t.computeRootMatch(this.state.location.pathname),staticContext:this.props.staticContext}},o.createElement(b.Provider,{children:this.props.children||null,value:this.props.history}))},t}(o.Component);o.Component;o.Component;var _={},k=1e4,w=0;function C(e,t){void 0===t&&(t={}),("string"==typeof t||Array.isArray(t))&&(t={path:t});var n=t,r=n.path,o=n.exact,a=void 0!==o&&o,s=n.strict,i=void 0!==s&&s,c=n.sensitive,l=void 0!==c&&c;return[].concat(r).reduce(function(t,n){if(!n&&""!==n)return null;if(t)return t;var r=function(e,t){var n=""+t.end+t.strict+t.sensitive,r=_[n]||(_[n]={});if(r[e])return r[e];var o=[],a={regexp:d()(e,o,t),keys:o};return w<k&&(r[e]=a,w++),a}(n,{end:a,strict:i,sensitive:l}),o=r.regexp,s=r.keys,c=o.exec(e);if(!c)return null;var u=c[0],p=c.slice(1),f=e===u;return a&&!f?null:{path:n,url:"/"===n&&""===u?"/":u,isExact:f,params:s.reduce(function(e,t,n){return e[t.name]=p[n],e},{})}},null)}var x=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(y.Consumer,null,function(t){t||(0,c.A)(!1);var n=e.props.location||t.location,r=e.props.computedMatch?e.props.computedMatch:e.props.path?C(n.pathname,e.props):t.match,a=(0,l.A)({},t,{location:n,match:r}),s=e.props,i=s.children,u=s.component,d=s.render;return Array.isArray(i)&&function(e){return 0===o.Children.count(e)}(i)&&(i=null),o.createElement(y.Provider,{value:a},a.match?i?"function"==typeof i?i(a):i:u?o.createElement(u,a):d?d(a):null:"function"==typeof i?i(a):null)})},t}(o.Component);function S(e){return"/"===e.charAt(0)?e:"/"+e}function M(e,t){if(!e)return t;var n=S(e);return 0!==t.pathname.indexOf(n)?t:(0,l.A)({},t,{pathname:t.pathname.substr(n.length)})}function E(e){return"string"==typeof e?e:(0,i.AO)(e)}function O(e){return function(){(0,c.A)(!1)}}function A(){}o.Component;var j=function(e){function t(){return e.apply(this,arguments)||this}return(0,r.A)(t,e),t.prototype.render=function(){var e=this;return o.createElement(y.Consumer,null,function(t){t||(0,c.A)(!1);var n,r,a=e.props.location||t.location;return o.Children.forEach(e.props.children,function(e){if(null==r&&o.isValidElement(e)){n=e;var s=e.props.path||e.props.from;r=s?C(a.pathname,(0,l.A)({},e.props,{path:s})):t.match}}),r?o.cloneElement(n,{location:a,computedMatch:r}):null})},t}(o.Component);var D=o.useContext;function P(){return D(b)}function T(){return D(y).location}},85339:(e,t,n)=>{"use strict";n.d(t,{A:()=>a});var r=n(36672),o=n(77414);function a(){const e=r.useContext(o.o);if(!e)throw new Error("Unexpected: no Docusaurus route context found");return e}},86643:(e,t,n)=>{"use strict";n.d(t,{A:()=>u});n(36672);var r=n(75150),o=n(42977),a=n(56562),s=n(67797),i=n(29283),c=n(23420);function l({logo:e,alt:t,imageClassName:n}){const r={light:(0,o.Ay)(e.src),dark:(0,o.Ay)(e.srcDark||e.src)},a=(0,c.jsx)(i.A,{className:e.className,sources:r,height:e.height,width:e.width,alt:t,style:e.style});return n?(0,c.jsx)("div",{className:n,children:a}):a}function u(e){const{siteConfig:{title:t}}=(0,a.A)(),{navbar:{title:n,logo:i}}=(0,s.p)(),{imageClassName:u,titleClassName:d,...p}=e,f=(0,o.Ay)(i?.href||"/"),h=n?"":t,m=i?.alt??h;return(0,c.jsxs)(r.A,{to:f,...p,...i?.target&&{target:i.target},children:[i&&(0,c.jsx)(l,{logo:i,alt:m,imageClassName:u}),null!=n&&(0,c.jsx)("b",{className:d,children:n})]})}},87014:(e,t,n)=>{"use strict";function r(){return window.matchMedia("(prefers-reduced-motion: reduce)").matches}n.d(t,{O:()=>r})},88020:()=>{!function(e){function t(e,t){return"___"+e.toUpperCase()+t+"___"}Object.defineProperties(e.languages["markup-templating"]={},{buildPlaceholders:{value:function(n,r,o,a){if(n.language===r){var s=n.tokenStack=[];n.code=n.code.replace(o,function(e){if("function"==typeof a&&!a(e))return e;for(var o,i=s.length;-1!==n.code.indexOf(o=t(r,i));)++i;return s[i]=e,o}),n.grammar=e.languages.markup}}},tokenizePlaceholders:{value:function(n,r){if(n.language===r&&n.tokenStack){n.grammar=e.languages[r];var o=0,a=Object.keys(n.tokenStack);!function s(i){for(var c=0;c<i.length&&!(o>=a.length);c++){var l=i[c];if("string"==typeof l||l.content&&"string"==typeof l.content){var u=a[o],d=n.tokenStack[u],p="string"==typeof l?l:l.content,f=t(r,u),h=p.indexOf(f);if(h>-1){++o;var m=p.substring(0,h),g=new e.Token(r,e.tokenize(d,n.grammar),"language-"+r,d),b=p.substring(h+f.length),y=[];m&&y.push.apply(y,s([m])),y.push(g),b&&y.push.apply(y,s([b])),"string"==typeof l?i.splice.apply(i,[c,1].concat(y)):l.content=y}}else l.content&&s(l.content)}return i}(n.tokens)}}}})}(Prism)},90317:(e,t,n)=>{"use strict";n.d(t,{N:()=>m,u:()=>c});var r=n(36672),o=n(52245),a=n(87014),s=n(23420);const i="ease-in-out";function c({initialState:e}){const[t,n]=(0,r.useState)(e??!1),o=(0,r.useCallback)(()=>{n(e=>!e)},[]);return{collapsed:t,setCollapsed:n,toggleCollapsed:o}}const l={display:"none",overflow:"hidden",height:"0px"},u={display:"block",overflow:"visible",height:"auto"};function d(e,t){const n=t?l:u;e.style.display=n.display,e.style.overflow=n.overflow,e.style.height=n.height}function p({collapsibleRef:e,collapsed:t,animation:n}){const o=(0,r.useRef)(!1);(0,r.useEffect)(()=>{const r=e.current;function s(){const e=r.scrollHeight,t=n?.duration??function(e){if((0,a.O)())return 1;const t=e/36;return Math.round(10*(4+15*t**.25+t/5))}(e);return{transition:`height ${t}ms ${n?.easing??i}`,height:`${e}px`}}function c(){const e=s();r.style.transition=e.transition,r.style.height=e.height}if(!o.current)return d(r,t),void(o.current=!0);return r.style.willChange="height",function(){const e=requestAnimationFrame(()=>{t?(c(),requestAnimationFrame(()=>{r.style.height=l.height,r.style.overflow=l.overflow})):(r.style.display="block",requestAnimationFrame(()=>{c()}))});return()=>cancelAnimationFrame(e)}()},[e,t,n])}function f({as:e="div",collapsed:t,children:n,animation:o,onCollapseTransitionEnd:a,className:i}){const c=(0,r.useRef)(null);return p({collapsibleRef:c,collapsed:t,animation:o}),(0,s.jsx)(e,{ref:c,onTransitionEnd:e=>{"height"===e.propertyName&&(d(c.current,t),a?.(t))},className:i,children:n})}function h({collapsed:e,...t}){const[n,a]=(0,r.useState)(!e),[i,c]=(0,r.useState)(e);return(0,o.A)(()=>{e||a(!0)},[e]),(0,o.A)(()=>{n&&c(e)},[n,e]),n?(0,s.jsx)(f,{...t,collapsed:i}):null}function m({lazy:e,...t}){const n=e?h:f;return(0,s.jsx)(n,{...t})}},91548:(e,t,n)=>{"use strict";n.d(t,{Dt:()=>i,ys:()=>s});var r=n(36672),o=n(50552),a=n(56562);function s(e,t){const n=e=>(!e||e.endsWith("/")?e:`${e}/`)?.toLowerCase();return n(e)===n(t)}function i(){const{baseUrl:e}=(0,a.A)().siteConfig;return(0,r.useMemo)(()=>function({baseUrl:e,routes:t}){function n(t){return t.path===e&&!0===t.exact}function r(t){return t.path===e&&!t.exact}return function e(t){if(0===t.length)return;return t.find(n)||e(t.filter(r).flatMap(e=>e.routes??[]))}(t)}({routes:o.A,baseUrl:e}),[e])}},91908:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.addPrefix=function(e,t){return e.startsWith(t)?e:`${t}${e}`},t.removeSuffix=function(e,t){if(""===t)return e;return e.endsWith(t)?e.slice(0,-t.length):e},t.addSuffix=function(e,t){return e.endsWith(t)?e:`${e}${t}`},t.removePrefix=function(e,t){return e.startsWith(t)?e.slice(t.length):e}},92471:(e,t,n)=>{"use strict";n.d(t,{Be:()=>l,ZC:()=>i,_q:()=>s,dV:()=>c,fM:()=>u});var r=n(36672),o=n(52245),a=n(23420);function s(e){const t=(0,r.useRef)(e);return(0,o.A)(()=>{t.current=e},[e]),(0,r.useCallback)((...e)=>t.current(...e),[])}function i(e){const t=(0,r.useRef)();return(0,o.A)(()=>{t.current=e}),t.current}class c extends Error{constructor(e,t){super(),this.name="ReactContextError",this.message=`Hook ${this.stack?.split("\n")[1]?.match(/at (?:\w+\.)?(?<name>\w+)/)?.groups.name??""} is called outside the <${e}>. ${t??""}`}}function l(e){const t=Object.entries(e);return t.sort((e,t)=>e[0].localeCompare(t[0])),(0,r.useMemo)(()=>e,t.flat())}function u(e){return({children:t})=>(0,a.jsx)(a.Fragment,{children:e.reduceRight((e,t)=>(0,a.jsx)(t,{children:e}),t)})}},92573:(e,t,n)=>{"use strict";n.d(t,{A:()=>s});var r=n(36672);n(23420);const o=r.createContext({collectAnchor:()=>{},collectLink:()=>{}}),a=()=>(0,r.useContext)(o);function s(){return a()}},95758:(e,t,n)=>{"use strict";t.rA=t.Ks=void 0;const r=n(5482);var o=n(7753);Object.defineProperty(t,"Ks",{enumerable:!0,get:function(){return r.__importDefault(o).default}});var a=n(91908);var s=n(63543);Object.defineProperty(t,"rA",{enumerable:!0,get:function(){return s.getErrorCausalChain}})},95843:(e,t)=>{"use strict";var n="function"==typeof Symbol&&Symbol.for,r=n?Symbol.for("react.element"):60103,o=n?Symbol.for("react.portal"):60106,a=n?Symbol.for("react.fragment"):60107,s=n?Symbol.for("react.strict_mode"):60108,i=n?Symbol.for("react.profiler"):60114,c=n?Symbol.for("react.provider"):60109,l=n?Symbol.for("react.context"):60110,u=n?Symbol.for("react.async_mode"):60111,d=n?Symbol.for("react.concurrent_mode"):60111,p=n?Symbol.for("react.forward_ref"):60112,f=n?Symbol.for("react.suspense"):60113,h=n?Symbol.for("react.suspense_list"):60120,m=n?Symbol.for("react.memo"):60115,g=n?Symbol.for("react.lazy"):60116,b=n?Symbol.for("react.block"):60121,y=n?Symbol.for("react.fundamental"):60117,v=n?Symbol.for("react.responder"):60118,_=n?Symbol.for("react.scope"):60119;function k(e){if("object"==typeof e&&null!==e){var t=e.$$typeof;switch(t){case r:switch(e=e.type){case u:case d:case a:case i:case s:case f:return e;default:switch(e=e&&e.$$typeof){case l:case p:case g:case m:case c:return e;default:return t}}case o:return t}}}function w(e){return k(e)===d}t.AsyncMode=u,t.ConcurrentMode=d,t.ContextConsumer=l,t.ContextProvider=c,t.Element=r,t.ForwardRef=p,t.Fragment=a,t.Lazy=g,t.Memo=m,t.Portal=o,t.Profiler=i,t.StrictMode=s,t.Suspense=f,t.isAsyncMode=function(e){return w(e)||k(e)===u},t.isConcurrentMode=w,t.isContextConsumer=function(e){return k(e)===l},t.isContextProvider=function(e){return k(e)===c},t.isElement=function(e){return"object"==typeof e&&null!==e&&e.$$typeof===r},t.isForwardRef=function(e){return k(e)===p},t.isFragment=function(e){return k(e)===a},t.isLazy=function(e){return k(e)===g},t.isMemo=function(e){return k(e)===m},t.isPortal=function(e){return k(e)===o},t.isProfiler=function(e){return k(e)===i},t.isStrictMode=function(e){return k(e)===s},t.isSuspense=function(e){return k(e)===f},t.isValidElementType=function(e){return"string"==typeof e||"function"==typeof e||e===a||e===d||e===i||e===s||e===f||e===h||"object"==typeof e&&null!==e&&(e.$$typeof===g||e.$$typeof===m||e.$$typeof===c||e.$$typeof===l||e.$$typeof===p||e.$$typeof===y||e.$$typeof===v||e.$$typeof===_||e.$$typeof===b)},t.typeOf=k},96320:(e,t,n)=>{"use strict";n.d(t,{l:()=>i});var r=n(36672),o=n(20601);const a={desktop:"desktop",mobile:"mobile",ssr:"ssr"},s=996;function i({desktopBreakpoint:e=s}={}){const[t,n]=(0,r.useState)(()=>"ssr");return(0,r.useEffect)(()=>{function t(){n(function(e){if(!o.A.canUseDOM)throw new Error("getWindowSize() should only be called after React hydration");return window.innerWidth>e?a.desktop:a.mobile}(e))}return t(),window.addEventListener("resize",t),()=>{window.removeEventListener("resize",t)}},[e]),t}},96414:(e,t,n)=>{"use strict";n.d(t,{b:()=>i,w:()=>c});var r=n(36672),o=n(56562),a=n(32342);const s="q";function i(){return(0,a.l)(s)}function c(){const{siteConfig:{baseUrl:e,themeConfig:t}}=(0,o.A)(),{algolia:{searchPagePath:n}}=t;return(0,r.useCallback)(t=>`${e}${n}?${s}=${encodeURIComponent(t)}`,[e,n])}},96603:(e,t,n)=>{"use strict";var r=n(36672);function o(e){var t="https://react.dev/errors/"+e;if(1<arguments.length){t+="?args[]="+encodeURIComponent(arguments[1]);for(var n=2;n<arguments.length;n++)t+="&args[]="+encodeURIComponent(arguments[n])}return"Minified React error #"+e+"; visit "+t+" for the full message or use the non-minified dev environment for full errors and additional helpful warnings."}function a(){}var s={d:{f:a,r:function(){throw Error(o(522))},D:a,C:a,L:a,m:a,X:a,S:a,M:a},p:0,findDOMNode:null},i=Symbol.for("react.portal");var c=r.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE;function l(e,t){return"font"===e?"":"string"==typeof t?"use-credentials"===t?t:"":void 0}t.__DOM_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE=s,t.createPortal=function(e,t){var n=2<arguments.length&&void 0!==arguments[2]?arguments[2]:null;if(!t||1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType)throw Error(o(299));return function(e,t,n){var r=3<arguments.length&&void 0!==arguments[3]?arguments[3]:null;return{$$typeof:i,key:null==r?null:""+r,children:e,containerInfo:t,implementation:n}}(e,t,null,n)},t.flushSync=function(e){var t=c.T,n=s.p;try{if(c.T=null,s.p=2,e)return e()}finally{c.T=t,s.p=n,s.d.f()}},t.preconnect=function(e,t){"string"==typeof e&&(t?t="string"==typeof(t=t.crossOrigin)?"use-credentials"===t?t:"":void 0:t=null,s.d.C(e,t))},t.prefetchDNS=function(e){"string"==typeof e&&s.d.D(e)},t.preinit=function(e,t){if("string"==typeof e&&t&&"string"==typeof t.as){var n=t.as,r=l(n,t.crossOrigin),o="string"==typeof t.integrity?t.integrity:void 0,a="string"==typeof t.fetchPriority?t.fetchPriority:void 0;"style"===n?s.d.S(e,"string"==typeof t.precedence?t.precedence:void 0,{crossOrigin:r,integrity:o,fetchPriority:a}):"script"===n&&s.d.X(e,{crossOrigin:r,integrity:o,fetchPriority:a,nonce:"string"==typeof t.nonce?t.nonce:void 0})}},t.preinitModule=function(e,t){if("string"==typeof e)if("object"==typeof t&&null!==t){if(null==t.as||"script"===t.as){var n=l(t.as,t.crossOrigin);s.d.M(e,{crossOrigin:n,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0})}}else null==t&&s.d.M(e)},t.preload=function(e,t){if("string"==typeof e&&"object"==typeof t&&null!==t&&"string"==typeof t.as){var n=t.as,r=l(n,t.crossOrigin);s.d.L(e,n,{crossOrigin:r,integrity:"string"==typeof t.integrity?t.integrity:void 0,nonce:"string"==typeof t.nonce?t.nonce:void 0,type:"string"==typeof t.type?t.type:void 0,fetchPriority:"string"==typeof t.fetchPriority?t.fetchPriority:void 0,referrerPolicy:"string"==typeof t.referrerPolicy?t.referrerPolicy:void 0,imageSrcSet:"string"==typeof t.imageSrcSet?t.imageSrcSet:void 0,imageSizes:"string"==typeof t.imageSizes?t.imageSizes:void 0,media:"string"==typeof t.media?t.media:void 0})}},t.preloadModule=function(e,t){if("string"==typeof e)if(t){var n=l(t.as,t.crossOrigin);s.d.m(e,{as:"string"==typeof t.as&&"script"!==t.as?t.as:void 0,crossOrigin:n,integrity:"string"==typeof t.integrity?t.integrity:void 0})}else s.d.m(e)},t.requestFormReset=function(e){s.d.r(e)},t.unstable_batchedUpdates=function(e,t){return e(t)},t.useFormState=function(e,t,n){return c.H.useFormState(e,t,n)},t.useFormStatus=function(){return c.H.useHostTransitionStatus()},t.version="19.1.0"},97057:(e,t,n)=>{"use strict";n.r(t)},97398:(e,t,n)=>{"use strict";n.d(t,{mg:()=>J,vd:()=>V});var r=n(36672),o=n(2736),a=n.n(o),s=n(34072),i=n.n(s),c=n(29597),l=n.n(c),u=n(62945),d=n.n(u);function p(){return p=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e},p.apply(this,arguments)}function f(e,t){e.prototype=Object.create(t.prototype),e.prototype.constructor=e,h(e,t)}function h(e,t){return h=Object.setPrototypeOf||function(e,t){return e.__proto__=t,e},h(e,t)}function m(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)t.indexOf(n=a[r])>=0||(o[n]=e[n]);return o}var g={BASE:"base",BODY:"body",HEAD:"head",HTML:"html",LINK:"link",META:"meta",NOSCRIPT:"noscript",SCRIPT:"script",STYLE:"style",TITLE:"title",FRAGMENT:"Symbol(react.fragment)"},b={rel:["amphtml","canonical","alternate"]},y={type:["application/ld+json"]},v={charset:"",name:["robots","description"],property:["og:type","og:title","og:url","og:image","og:image:alt","og:description","twitter:url","twitter:title","twitter:description","twitter:image","twitter:image:alt","twitter:card","twitter:site"]},_=Object.keys(g).map(function(e){return g[e]}),k={accesskey:"accessKey",charset:"charSet",class:"className",contenteditable:"contentEditable",contextmenu:"contextMenu","http-equiv":"httpEquiv",itemprop:"itemProp",tabindex:"tabIndex"},w=Object.keys(k).reduce(function(e,t){return e[k[t]]=t,e},{}),C=function(e,t){for(var n=e.length-1;n>=0;n-=1){var r=e[n];if(Object.prototype.hasOwnProperty.call(r,t))return r[t]}return null},x=function(e){var t=C(e,g.TITLE),n=C(e,"titleTemplate");if(Array.isArray(t)&&(t=t.join("")),n&&t)return n.replace(/%s/g,function(){return t});var r=C(e,"defaultTitle");return t||r||void 0},S=function(e){return C(e,"onChangeClientState")||function(){}},M=function(e,t){return t.filter(function(t){return void 0!==t[e]}).map(function(t){return t[e]}).reduce(function(e,t){return p({},e,t)},{})},E=function(e,t){return t.filter(function(e){return void 0!==e[g.BASE]}).map(function(e){return e[g.BASE]}).reverse().reduce(function(t,n){if(!t.length)for(var r=Object.keys(n),o=0;o<r.length;o+=1){var a=r[o].toLowerCase();if(-1!==e.indexOf(a)&&n[a])return t.concat(n)}return t},[])},O=function(e,t,n){var r={};return n.filter(function(t){return!!Array.isArray(t[e])||(void 0!==t[e]&&console&&"function"==typeof console.warn&&console.warn("Helmet: "+e+' should be of type "Array". Instead found type "'+typeof t[e]+'"'),!1)}).map(function(t){return t[e]}).reverse().reduce(function(e,n){var o={};n.filter(function(e){for(var n,a=Object.keys(e),s=0;s<a.length;s+=1){var i=a[s],c=i.toLowerCase();-1===t.indexOf(c)||"rel"===n&&"canonical"===e[n].toLowerCase()||"rel"===c&&"stylesheet"===e[c].toLowerCase()||(n=c),-1===t.indexOf(i)||"innerHTML"!==i&&"cssText"!==i&&"itemprop"!==i||(n=i)}if(!n||!e[n])return!1;var l=e[n].toLowerCase();return r[n]||(r[n]={}),o[n]||(o[n]={}),!r[n][l]&&(o[n][l]=!0,!0)}).reverse().forEach(function(t){return e.push(t)});for(var a=Object.keys(o),s=0;s<a.length;s+=1){var i=a[s],c=p({},r[i],o[i]);r[i]=c}return e},[]).reverse()},A=function(e,t){if(Array.isArray(e)&&e.length)for(var n=0;n<e.length;n+=1)if(e[n][t])return!0;return!1},j=function(e){return Array.isArray(e)?e.join(""):e},D=function(e,t){return Array.isArray(e)?e.reduce(function(e,n){return function(e,t){for(var n=Object.keys(e),r=0;r<n.length;r+=1)if(t[n[r]]&&t[n[r]].includes(e[n[r]]))return!0;return!1}(n,t)?e.priority.push(n):e.default.push(n),e},{priority:[],default:[]}):{default:e}},P=function(e,t){var n;return p({},e,((n={})[t]=void 0,n))},T=[g.NOSCRIPT,g.SCRIPT,g.STYLE],I=function(e,t){return void 0===t&&(t=!0),!1===t?String(e):String(e).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/'/g,"'")},N=function(e){return Object.keys(e).reduce(function(t,n){var r=void 0!==e[n]?n+'="'+e[n]+'"':""+n;return t?t+" "+r:r},"")},L=function(e,t){return void 0===t&&(t={}),Object.keys(e).reduce(function(t,n){return t[k[n]||n]=e[n],t},t)},R=function(e,t){return t.map(function(t,n){var o,a=((o={key:n})["data-rh"]=!0,o);return Object.keys(t).forEach(function(e){var n=k[e]||e;"innerHTML"===n||"cssText"===n?a.dangerouslySetInnerHTML={__html:t.innerHTML||t.cssText}:a[n]=t[e]}),r.createElement(e,a)})},F=function(e,t,n){switch(e){case g.TITLE:return{toComponent:function(){return n=t.titleAttributes,(o={key:e=t.title})["data-rh"]=!0,a=L(n,o),[r.createElement(g.TITLE,a,e)];var e,n,o,a},toString:function(){return function(e,t,n,r){var o=N(n),a=j(t);return o?"<"+e+' data-rh="true" '+o+">"+I(a,r)+"</"+e+">":"<"+e+' data-rh="true">'+I(a,r)+"</"+e+">"}(e,t.title,t.titleAttributes,n)}};case"bodyAttributes":case"htmlAttributes":return{toComponent:function(){return L(t)},toString:function(){return N(t)}};default:return{toComponent:function(){return R(e,t)},toString:function(){return function(e,t,n){return t.reduce(function(t,r){var o=Object.keys(r).filter(function(e){return!("innerHTML"===e||"cssText"===e)}).reduce(function(e,t){var o=void 0===r[t]?t:t+'="'+I(r[t],n)+'"';return e?e+" "+o:o},""),a=r.innerHTML||r.cssText||"",s=-1===T.indexOf(e);return t+"<"+e+' data-rh="true" '+o+(s?"/>":">"+a+"</"+e+">")},"")}(e,t,n)}}}},z=function(e){var t=e.baseTag,n=e.bodyAttributes,r=e.encode,o=e.htmlAttributes,a=e.noscriptTags,s=e.styleTags,i=e.title,c=void 0===i?"":i,l=e.titleAttributes,u=e.linkTags,d=e.metaTags,p=e.scriptTags,f={toComponent:function(){},toString:function(){return""}};if(e.prioritizeSeoTags){var h=function(e){var t=e.linkTags,n=e.scriptTags,r=e.encode,o=D(e.metaTags,v),a=D(t,b),s=D(n,y);return{priorityMethods:{toComponent:function(){return[].concat(R(g.META,o.priority),R(g.LINK,a.priority),R(g.SCRIPT,s.priority))},toString:function(){return F(g.META,o.priority,r)+" "+F(g.LINK,a.priority,r)+" "+F(g.SCRIPT,s.priority,r)}},metaTags:o.default,linkTags:a.default,scriptTags:s.default}}(e);f=h.priorityMethods,u=h.linkTags,d=h.metaTags,p=h.scriptTags}return{priority:f,base:F(g.BASE,t,r),bodyAttributes:F("bodyAttributes",n,r),htmlAttributes:F("htmlAttributes",o,r),link:F(g.LINK,u,r),meta:F(g.META,d,r),noscript:F(g.NOSCRIPT,a,r),script:F(g.SCRIPT,p,r),style:F(g.STYLE,s,r),title:F(g.TITLE,{title:c,titleAttributes:l},r)}},B=[],$=function(e,t){var n=this;void 0===t&&(t="undefined"!=typeof document),this.instances=[],this.value={setHelmet:function(e){n.context.helmet=e},helmetInstances:{get:function(){return n.canUseDOM?B:n.instances},add:function(e){(n.canUseDOM?B:n.instances).push(e)},remove:function(e){var t=(n.canUseDOM?B:n.instances).indexOf(e);(n.canUseDOM?B:n.instances).splice(t,1)}}},this.context=e,this.canUseDOM=t,t||(e.helmet=z({baseTag:[],bodyAttributes:{},encodeSpecialCharacters:!0,htmlAttributes:{},linkTags:[],metaTags:[],noscriptTags:[],scriptTags:[],styleTags:[],title:"",titleAttributes:{}}))},U=r.createContext({}),q=a().shape({setHelmet:a().func,helmetInstances:a().shape({get:a().func,add:a().func,remove:a().func})}),H="undefined"!=typeof document,V=function(e){function t(n){var r;return(r=e.call(this,n)||this).helmetData=new $(r.props.context,t.canUseDOM),r}return f(t,e),t.prototype.render=function(){return r.createElement(U.Provider,{value:this.helmetData.value},this.props.children)},t}(r.Component);V.canUseDOM=H,V.propTypes={context:a().shape({helmet:a().shape()}),children:a().node.isRequired},V.defaultProps={context:{}},V.displayName="HelmetProvider";var W=function(e,t){var n,r=document.head||document.querySelector(g.HEAD),o=r.querySelectorAll(e+"[data-rh]"),a=[].slice.call(o),s=[];return t&&t.length&&t.forEach(function(t){var r=document.createElement(e);for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&("innerHTML"===o?r.innerHTML=t.innerHTML:"cssText"===o?r.styleSheet?r.styleSheet.cssText=t.cssText:r.appendChild(document.createTextNode(t.cssText)):r.setAttribute(o,void 0===t[o]?"":t[o]));r.setAttribute("data-rh","true"),a.some(function(e,t){return n=t,r.isEqualNode(e)})?a.splice(n,1):s.push(r)}),a.forEach(function(e){return e.parentNode.removeChild(e)}),s.forEach(function(e){return r.appendChild(e)}),{oldTags:a,newTags:s}},G=function(e,t){var n=document.getElementsByTagName(e)[0];if(n){for(var r=n.getAttribute("data-rh"),o=r?r.split(","):[],a=[].concat(o),s=Object.keys(t),i=0;i<s.length;i+=1){var c=s[i],l=t[c]||"";n.getAttribute(c)!==l&&n.setAttribute(c,l),-1===o.indexOf(c)&&o.push(c);var u=a.indexOf(c);-1!==u&&a.splice(u,1)}for(var d=a.length-1;d>=0;d-=1)n.removeAttribute(a[d]);o.length===a.length?n.removeAttribute("data-rh"):n.getAttribute("data-rh")!==s.join(",")&&n.setAttribute("data-rh",s.join(","))}},K=function(e,t){var n=e.baseTag,r=e.htmlAttributes,o=e.linkTags,a=e.metaTags,s=e.noscriptTags,i=e.onChangeClientState,c=e.scriptTags,l=e.styleTags,u=e.title,d=e.titleAttributes;G(g.BODY,e.bodyAttributes),G(g.HTML,r),function(e,t){void 0!==e&&document.title!==e&&(document.title=j(e)),G(g.TITLE,t)}(u,d);var p={baseTag:W(g.BASE,n),linkTags:W(g.LINK,o),metaTags:W(g.META,a),noscriptTags:W(g.NOSCRIPT,s),scriptTags:W(g.SCRIPT,c),styleTags:W(g.STYLE,l)},f={},h={};Object.keys(p).forEach(function(e){var t=p[e],n=t.newTags,r=t.oldTags;n.length&&(f[e]=n),r.length&&(h[e]=p[e].oldTags)}),t&&t(),i(e,f,h)},Q=null,Y=function(e){function t(){for(var t,n=arguments.length,r=new Array(n),o=0;o<n;o++)r[o]=arguments[o];return(t=e.call.apply(e,[this].concat(r))||this).rendered=!1,t}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!d()(e,this.props)},n.componentDidUpdate=function(){this.emitChange()},n.componentWillUnmount=function(){this.props.context.helmetInstances.remove(this),this.emitChange()},n.emitChange=function(){var e,t,n=this.props.context,r=n.setHelmet,o=null,a=(e=n.helmetInstances.get().map(function(e){var t=p({},e.props);return delete t.context,t}),{baseTag:E(["href"],e),bodyAttributes:M("bodyAttributes",e),defer:C(e,"defer"),encode:C(e,"encodeSpecialCharacters"),htmlAttributes:M("htmlAttributes",e),linkTags:O(g.LINK,["rel","href"],e),metaTags:O(g.META,["name","charset","http-equiv","property","itemprop"],e),noscriptTags:O(g.NOSCRIPT,["innerHTML"],e),onChangeClientState:S(e),scriptTags:O(g.SCRIPT,["src","innerHTML"],e),styleTags:O(g.STYLE,["cssText"],e),title:x(e),titleAttributes:M("titleAttributes",e),prioritizeSeoTags:A(e,"prioritizeSeoTags")});V.canUseDOM?(t=a,Q&&cancelAnimationFrame(Q),t.defer?Q=requestAnimationFrame(function(){K(t,function(){Q=null})}):(K(t),Q=null)):z&&(o=z(a)),r(o)},n.init=function(){this.rendered||(this.rendered=!0,this.props.context.helmetInstances.add(this),this.emitChange())},n.render=function(){return this.init(),null},t}(r.Component);Y.propTypes={context:q.isRequired},Y.displayName="HelmetDispatcher";var Z=["children"],X=["children"],J=function(e){function t(){return e.apply(this,arguments)||this}f(t,e);var n=t.prototype;return n.shouldComponentUpdate=function(e){return!i()(P(this.props,"helmetData"),P(e,"helmetData"))},n.mapNestedChildrenToProps=function(e,t){if(!t)return null;switch(e.type){case g.SCRIPT:case g.NOSCRIPT:return{innerHTML:t};case g.STYLE:return{cssText:t};default:throw new Error("<"+e.type+" /> elements are self-closing and can not contain children. Refer to our API for more information.")}},n.flattenArrayTypeChildren=function(e){var t,n=e.child,r=e.arrayTypeChildren;return p({},r,((t={})[n.type]=[].concat(r[n.type]||[],[p({},e.newChildProps,this.mapNestedChildrenToProps(n,e.nestedChildren))]),t))},n.mapObjectTypeChildren=function(e){var t,n,r=e.child,o=e.newProps,a=e.newChildProps,s=e.nestedChildren;switch(r.type){case g.TITLE:return p({},o,((t={})[r.type]=s,t.titleAttributes=p({},a),t));case g.BODY:return p({},o,{bodyAttributes:p({},a)});case g.HTML:return p({},o,{htmlAttributes:p({},a)});default:return p({},o,((n={})[r.type]=p({},a),n))}},n.mapArrayTypeChildrenToProps=function(e,t){var n=p({},t);return Object.keys(e).forEach(function(t){var r;n=p({},n,((r={})[t]=e[t],r))}),n},n.warnOnInvalidChildren=function(e,t){return l()(_.some(function(t){return e.type===t}),"function"==typeof e.type?"You may be attempting to nest <Helmet> components within each other, which is not allowed. Refer to our API for more information.":"Only elements types "+_.join(", ")+" are allowed. Helmet does not support rendering <"+e.type+"> elements. Refer to our API for more information."),l()(!t||"string"==typeof t||Array.isArray(t)&&!t.some(function(e){return"string"!=typeof e}),"Helmet expects a string as a child of <"+e.type+">. Did you forget to wrap your children in braces? ( <"+e.type+">{``}</"+e.type+"> ) Refer to our API for more information."),!0},n.mapChildrenToProps=function(e,t){var n=this,o={};return r.Children.forEach(e,function(e){if(e&&e.props){var r=e.props,a=r.children,s=m(r,Z),i=Object.keys(s).reduce(function(e,t){return e[w[t]||t]=s[t],e},{}),c=e.type;switch("symbol"==typeof c?c=c.toString():n.warnOnInvalidChildren(e,a),c){case g.FRAGMENT:t=n.mapChildrenToProps(a,t);break;case g.LINK:case g.META:case g.NOSCRIPT:case g.SCRIPT:case g.STYLE:o=n.flattenArrayTypeChildren({child:e,arrayTypeChildren:o,newChildProps:i,nestedChildren:a});break;default:t=n.mapObjectTypeChildren({child:e,newProps:t,newChildProps:i,nestedChildren:a})}}}),this.mapArrayTypeChildrenToProps(o,t)},n.render=function(){var e=this.props,t=e.children,n=m(e,X),o=p({},n),a=n.helmetData;return t&&(o=this.mapChildrenToProps(t,o)),!a||a instanceof $||(a=new $(a.context,a.instances)),a?r.createElement(Y,p({},o,{context:a.value,helmetData:void 0})):r.createElement(U.Consumer,null,function(e){return r.createElement(Y,p({},o,{context:e}))})},t}(r.Component);J.propTypes={base:a().object,bodyAttributes:a().object,children:a().oneOfType([a().arrayOf(a().node),a().node]),defaultTitle:a().string,defer:a().bool,encodeSpecialCharacters:a().bool,htmlAttributes:a().object,link:a().arrayOf(a().object),meta:a().arrayOf(a().object),noscript:a().arrayOf(a().object),onChangeClientState:a().func,script:a().arrayOf(a().object),style:a().arrayOf(a().object),title:a().string,titleAttributes:a().object,titleTemplate:a().string,prioritizeSeoTags:a().bool,helmetData:a().object},J.defaultProps={defer:!0,encodeSpecialCharacters:!0,prioritizeSeoTags:!1},J.displayName="Helmet"},98099:(e,t,n)=>{"use strict";n.d(t,{GX:()=>l,YL:()=>c,y_:()=>i});var r=n(36672),o=n(92471),a=n(23420);const s=r.createContext(null);function i({children:e}){const t=(0,r.useState)({component:null,props:null});return(0,a.jsx)(s.Provider,{value:t,children:e})}function c(){const e=(0,r.useContext)(s);if(!e)throw new o.dV("NavbarSecondaryMenuContentProvider");return e[0]}function l({component:e,props:t}){const n=(0,r.useContext)(s);if(!n)throw new o.dV("NavbarSecondaryMenuContentProvider");const[,a]=n,i=(0,o.Be)(t);return(0,r.useEffect)(()=>{a({component:e,props:i})},[a,e,i]),(0,r.useEffect)(()=>()=>a({component:null,props:null}),[a]),null}},99298:(e,t,n)=>{"use strict";function r(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}n.d(t,{A:()=>r})}},e=>{e.O(0,[1869],()=>{return t=30691,e(e.s=t);var t});e.O()}]); \ No newline at end of file diff --git a/assets/js/main.6722e00e.js.LICENSE.txt b/assets/js/main.6722e00e.js.LICENSE.txt new file mode 100644 index 0000000000..4c963e46c6 --- /dev/null +++ b/assets/js/main.6722e00e.js.LICENSE.txt @@ -0,0 +1,61 @@ +/* NProgress, (c) 2013, 2014 Rico Sta. Cruz - http://ricostacruz.com/nprogress + * @license MIT */ + +/** + * @license React + * react-dom-client.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react-dom.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react-jsx-runtime.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * react.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** + * @license React + * scheduler.production.js + * + * Copyright (c) Meta Platforms, Inc. and affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +/** @license React v16.13.1 + * react-is.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ diff --git a/assets/js/runtime~main.a24e4faf.js b/assets/js/runtime~main.a24e4faf.js new file mode 100644 index 0000000000..d9229080fa --- /dev/null +++ b/assets/js/runtime~main.a24e4faf.js @@ -0,0 +1 @@ +(()=>{"use strict";var e,c,a,b,f,d={},t={};function r(e){var c=t[e];if(void 0!==c)return c.exports;var a=t[e]={exports:{}};return d[e].call(a.exports,a,a.exports,r),a.exports}r.m=d,e=[],r.O=(c,a,b,f)=>{if(!a){var d=1/0;for(i=0;i<e.length;i++){a=e[i][0],b=e[i][1],f=e[i][2];for(var t=!0,o=0;o<a.length;o++)(!1&f||d>=f)&&Object.keys(r.O).every(e=>r.O[e](a[o]))?a.splice(o--,1):(t=!1,f<d&&(d=f));if(t){e.splice(i--,1);var n=b();void 0!==n&&(c=n)}}return c}f=f||0;for(var i=e.length;i>0&&e[i-1][2]>f;i--)e[i]=e[i-1];e[i]=[a,b,f]},r.n=e=>{var c=e&&e.__esModule?()=>e.default:()=>e;return r.d(c,{a:c}),c},a=Object.getPrototypeOf?e=>Object.getPrototypeOf(e):e=>e.__proto__,r.t=function(e,b){if(1&b&&(e=this(e)),8&b)return e;if("object"==typeof e&&e){if(4&b&&e.__esModule)return e;if(16&b&&"function"==typeof e.then)return e}var f=Object.create(null);r.r(f);var d={};c=c||[null,a({}),a([]),a(a)];for(var t=2&b&&e;("object"==typeof t||"function"==typeof t)&&!~c.indexOf(t);t=a(t))Object.getOwnPropertyNames(t).forEach(c=>d[c]=()=>e[c]);return d.default=()=>e,r.d(f,d),f},r.d=(e,c)=>{for(var a in c)r.o(c,a)&&!r.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:c[a]})},r.f={},r.e=e=>Promise.all(Object.keys(r.f).reduce((c,a)=>(r.f[a](e,c),c),[])),r.u=e=>"assets/js/"+({12:"4329fc3c",80:"ac2458d6",91:"411bcc8b",183:"d51efe31",228:"09b50579",247:"e819ef22",259:"91e5ca6b",286:"a559ab1c",314:"20c870cb",334:"4577221a",362:"bc7e3c4b",406:"a4e2bd41",463:"b00e7a90",575:"e7f8ca4b",610:"518ccc20",629:"eb10ccf4",646:"0f29fa4c",679:"89d14484",704:"b20814c1",744:"6e6115bc",750:"a35aa088",755:"228d1b45",763:"9ae4b911",825:"5f0d7ee4",832:"107eb4cc",957:"c141421f",998:"1050d62e",1007:"ede96f45",1084:"ca460041",1235:"a7456010",1270:"46d462fa",1273:"171ac7cc",1338:"e4f0c0bc",1349:"ff366317",1381:"cd6f4c97",1472:"400cc4b7",1536:"011d940f",1601:"ca3e6c65",1647:"e4d3d2e1",1658:"de297161",1686:"df248b36",1753:"24af6869",1792:"71174ce3",1815:"9478d12a",1895:"bc73dc9d",1900:"d2866892",1917:"be81e05d",1949:"1483dc01",2016:"7da24252",2090:"51d6008a",2132:"c10c208b",2133:"c5f63adb",2138:"1a4e3797",2271:"53b10fcd",2304:"e0a1aa17",2370:"044a6187",2376:"cd2aa5fe",2406:"c4025719",2410:"87c27ff4",2492:"724ecf1a",2520:"b3a16c5b",2581:"c4b5a5df",2610:"15a9c06b",2634:"c4f5d8e4",2771:"7bab4396",2817:"627bdb5d",2852:"ef46515e",2880:"e69e4b95",2946:"eadc19b4",3108:"e4603b0e",3127:"6e873df7",3149:"a8ed45e8",3263:"cb00cd0b",3361:"c7222430",3388:"99547feb",3508:"4359cab8",3623:"8dac98b9",3641:"c1600862",3715:"50cf1f78",3821:"1a3a5cbb",3832:"d4bc87de",3867:"ca8e7b55",3911:"30f6db9d",3914:"368eb302",3924:"021c8caa",4003:"46e9ac31",4025:"f9546978",4040:"29a2444a",4074:"cb4f58ba",4094:"051962a1",4151:"35179155",4167:"7136df27",4182:"0807349d",4193:"c846d7aa",4196:"23c216bb",4276:"485c5e01",4410:"d69a7b0b",4422:"25072094",4559:"ca873730",4590:"b28afb00",4661:"9469bd80",4663:"a5fc5a0e",4687:"c07a004a",4719:"fde89899",4738:"70335a48",4931:"0fc8e5d5",4955:"388f1aef",4996:"d1cdaf24",5050:"cc640607",5142:"109fab02",5143:"341f4c6e",5184:"c902409b",5235:"cbb899e4",5241:"3e68fbe7",5251:"a180cea5",5264:"b1c76d35",5296:"6bba662b",5326:"d968e4da",5397:"fb031341",5673:"d425c21a",5682:"7c1e7b42",5706:"41bca987",5734:"c5b979b0",5742:"aba21aa0",5802:"5b786e91",5817:"ffeead90",5859:"02359d8a",5939:"66e00e19",6040:"84fb41f0",6061:"1f391b9e",6087:"c0050a27",6150:"048b8cd8",6185:"54f055ef",6288:"99cbfc76",6313:"325152a5",6314:"47da9d80",6360:"7273998d",6364:"de406b5e",6446:"94dc3e5f",6494:"64018eb5",6505:"74876495",6545:"e8303188",6601:"b35da6ab",6644:"aad83134",6673:"f354998b",6678:"b7c223ee",6679:"171f1b26",6720:"10b686c7",6823:"ef09bccd",6884:"f399bb6f",6966:"3abc021e",7042:"5ad15a2f",7079:"2f675600",7098:"a7bd4aaa",7107:"e480558e",7141:"3325f0a2",7155:"05d123c0",7187:"bd7e05cf",7257:"5d2d37cd",7259:"1e828d0d",7286:"4c8a85bd",7399:"75878fc8",7432:"19d61b19",7454:"a5f1db42",7509:"f435945d",7559:"41b23040",7658:"5d624d4b",7671:"eb678835",7842:"71eb5ef4",7914:"2950f807",7930:"1ecac929",7950:"91ee770c",7978:"54b37c16",8020:"324fc7ff",8028:"8e56f135",8029:"1a3bb66a",8043:"c2414a18",8104:"19b95078",8141:"c83ce79b",8179:"50b1f033",8296:"dc7f0b30",8305:"14e1fcc3",8321:"0b199b14",8327:"444a5a58",8355:"3139ff2f",8374:"896d06c5",8401:"17896441",8439:"62cdf0e0",8463:"ba3d50d9",8510:"571f3672",8561:"12b0e932",8596:"3e41c308",8628:"a2d99d88",8705:"a06cff9c",8720:"487ca811",8783:"a4b1a9b8",8861:"e0474f93",8904:"6518a949",8945:"2192b561",9048:"a94703ab",9055:"4e8e2262",9063:"9e2bab8c",9065:"7cbf6be7",9082:"c989d589",9152:"b1002bca",9206:"1c291fdc",9230:"d05f0a7d",9254:"23284c9b",9290:"521dad97",9303:"ce0be35a",9335:"03459661",9369:"e12d7f74",9384:"150ef1cb",9440:"f963ac8e",9479:"341c85ac",9514:"4047c50f",9558:"6033e994",9568:"e5eedb42",9583:"92131bac",9603:"86c82c9a",9647:"5e95c892",9775:"5fd14b8b",9805:"3fb0a163",9961:"abdba85e",9991:"cbe609e8"}[e]||e)+"."+{12:"6bc2d8bb",25:"a5b52d71",80:"80ddf71a",91:"06632b9e",183:"c9fce7be",228:"52f3f328",247:"1f7644ac",248:"6b522764",259:"1b977b78",286:"eb18048e",299:"732d79d4",314:"fc120f02",334:"09a7f265",362:"a8fbf2c4",406:"6d1296f7",463:"a49b6a39",575:"e49f8895",610:"56ca2fa5",629:"83c5f603",646:"fc3b20a4",679:"675e28e5",704:"bdea7f12",713:"2d51f591",744:"9c665f96",750:"66e7e35f",755:"82366616",756:"63037093",763:"287c9823",825:"d029c08e",832:"38fc2a4d",957:"484a90c2",997:"782da1dd",998:"a0a1b37a",1007:"33a1ab35",1084:"6b486372",1235:"f7ae1996",1270:"286c2600",1273:"3780a727",1338:"660ed59a",1349:"3645d264",1381:"d2deb129",1472:"f8b9ca7c",1536:"6d2a3a01",1556:"8cf5a342",1601:"ecb85b48",1647:"0520673c",1658:"ef4d0adf",1686:"3e0b0a95",1753:"3a0a1bc2",1772:"bfd970d2",1792:"4f3ede8c",1815:"78d0819f",1853:"4ea6156f",1874:"e4531d36",1895:"2ff94511",1900:"4829f6b3",1917:"7a86ef3f",1937:"58891791",1949:"4a6793d2",2016:"97351c6c",2090:"50a9f7f0",2129:"d07ffb6a",2132:"a6ca7316",2133:"a5f2c02f",2138:"e1c7b2f5",2271:"34a45138",2304:"e9aa4f41",2370:"858142cb",2376:"11b87afe",2400:"23e68242",2406:"ae817c79",2410:"a0ab0337",2492:"9bf4f373",2520:"d3c71a1c",2570:"398299e2",2581:"f6e20324",2610:"fbed8bd4",2634:"2d0ebcc3",2771:"e2e91f03",2817:"ae8f63fd",2852:"0b72d5b5",2880:"4f61ca79",2946:"06a401e4",3108:"3e5343b8",3127:"fec0e1cb",3149:"71f7c343",3263:"c5dbd77c",3287:"4167c976",3346:"011b0ace",3361:"7a1609fd",3388:"0f4e43ef",3471:"8c232dc7",3508:"86206a90",3623:"6fa92e78",3641:"f5c16495",3715:"f7d589c0",3821:"8ba00a30",3832:"eb870da7",3867:"318cc4bc",3911:"c745195e",3914:"357b41fd",3924:"5f295dcb",4003:"4fad4321",4025:"0ec94175",4040:"ca3c70d1",4047:"e935efab",4074:"46f93e40",4078:"053eb54c",4094:"4cc7a7f7",4151:"c63741dd",4167:"1082e2aa",4182:"731308c1",4193:"eb80452a",4196:"d1f3edb7",4276:"604a9153",4326:"ada317d4",4410:"901336c8",4422:"ba042603",4559:"cbd84d65",4590:"b441d887",4661:"82882490",4663:"d705654f",4687:"065ecca1",4719:"a1e49d64",4738:"f86179a4",4852:"cf62decd",4931:"38475e52",4955:"4435dd88",4996:"c592a7cf",5019:"b953ab3c",5050:"57d48479",5110:"ae209bcb",5142:"1304204c",5143:"7089d269",5184:"ea48d292",5235:"e69a7ee6",5241:"9af0cab4",5251:"12b75376",5264:"8ff8d553",5296:"7a43db97",5326:"5e728ea5",5397:"984994de",5493:"c30074b0",5610:"cdc986e1",5673:"2155e74e",5682:"398858f5",5706:"cbb68b80",5734:"ec745dfa",5742:"98fa788f",5792:"cb9c5644",5802:"375d2adb",5817:"0bf02578",5859:"d06fea6b",5932:"5b8e5082",5939:"3dc8d15e",6007:"cad91727",6040:"22512b68",6061:"162e3a02",6087:"1fdf8fd2",6150:"15bd0619",6185:"80b62cae",6192:"8a9258d0",6288:"b0a2d548",6313:"7841a58f",6314:"8ece4d5e",6360:"6460f2be",6364:"777d18f0",6446:"4a4a88a1",6494:"14ae6d1d",6505:"ec4b0cb6",6508:"73a823cb",6545:"d53d0160",6601:"ea19e28b",6644:"e45bf932",6673:"75ea0a3d",6678:"81ebafcd",6679:"5b2c51de",6720:"ac7f610a",6767:"25a30352",6823:"a990ad2c",6884:"cf5dbf41",6966:"2ffb79a9",7042:"f4fecb23",7079:"bb74ddd9",7098:"4676842a",7107:"6da81ca1",7133:"0d4b51b1",7141:"1e18f834",7155:"6460c759",7187:"d916accd",7257:"b28f062f",7259:"eae29f3f",7286:"a9c6182b",7306:"a7783f4e",7339:"4592535c",7399:"b7f50444",7432:"e67483c8",7454:"7e5dd1b3",7509:"9f0f3574",7559:"971baa32",7658:"a7c617c0",7671:"77a07c94",7720:"4384d24b",7842:"a76ebaef",7914:"da4a2425",7930:"4026d79c",7950:"5b0131e0",7978:"bb657828",8020:"4b3af6c2",8028:"7be2c54b",8029:"8ca073f7",8043:"a5185bc2",8055:"07fc3a99",8104:"24dbad74",8132:"e097933d",8141:"05c17cb8",8179:"c59eb4a5",8296:"6d808dd0",8305:"79e08407",8321:"369b6927",8327:"da06fd79",8355:"c26a0908",8374:"7c4b3f7f",8401:"d6b2d810",8439:"2cdd70b2",8463:"6fdc1a92",8479:"4afca346",8510:"aea1a8e4",8561:"46e840ec",8596:"24bd886f",8628:"6f240b05",8693:"ac6c8a3a",8705:"68c9ad11",8720:"0e457977",8783:"e83ba81c",8861:"a9c558dc",8904:"2a328af4",8945:"ddda8f54",8998:"9e7e5b24",9048:"be6278a0",9055:"aa0f58c7",9063:"72214067",9065:"0fd7bef4",9082:"94d486a6",9130:"d1239283",9152:"79ed64df",9206:"c1d9c78d",9219:"cb8684dc",9230:"ebcd5ef9",9254:"20730bf6",9290:"82033bc9",9303:"84e31a7d",9311:"dd0d5079",9335:"a5ccd375",9339:"62e7186f",9369:"b33a1f87",9384:"34b3cc1d",9402:"3e4174f5",9440:"5450a01f",9479:"bf75e08d",9514:"c0b206fe",9558:"8a9089ba",9568:"302cbb8a",9583:"7edf15d9",9603:"704cb880",9647:"d9451226",9775:"6409dbe4",9805:"cf9203ef",9961:"26e5806f",9991:"3d5c44f1"}[e]+".js",r.miniCssF=e=>{},r.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),r.o=(e,c)=>Object.prototype.hasOwnProperty.call(e,c),b={},f="modulecheck:",r.l=(e,c,a,d)=>{if(b[e])b[e].push(c);else{var t,o;if(void 0!==a)for(var n=document.getElementsByTagName("script"),i=0;i<n.length;i++){var u=n[i];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==f+a){t=u;break}}t||(o=!0,(t=document.createElement("script")).charset="utf-8",t.timeout=120,r.nc&&t.setAttribute("nonce",r.nc),t.setAttribute("data-webpack",f+a),t.src=e),b[e]=[c];var l=(c,a)=>{t.onerror=t.onload=null,clearTimeout(s);var f=b[e];if(delete b[e],t.parentNode&&t.parentNode.removeChild(t),f&&f.forEach(e=>e(a)),c)return c(a)},s=setTimeout(l.bind(null,void 0,{type:"timeout",target:t}),12e4);t.onerror=l.bind(null,t.onerror),t.onload=l.bind(null,t.onload),o&&document.head.appendChild(t)}},r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.p="/ModuleCheck/",r.gca=function(e){return e={17896441:"8401",25072094:"4422",35179155:"4151",74876495:"6505","4329fc3c":"12",ac2458d6:"80","411bcc8b":"91",d51efe31:"183","09b50579":"228",e819ef22:"247","91e5ca6b":"259",a559ab1c:"286","20c870cb":"314","4577221a":"334",bc7e3c4b:"362",a4e2bd41:"406",b00e7a90:"463",e7f8ca4b:"575","518ccc20":"610",eb10ccf4:"629","0f29fa4c":"646","89d14484":"679",b20814c1:"704","6e6115bc":"744",a35aa088:"750","228d1b45":"755","9ae4b911":"763","5f0d7ee4":"825","107eb4cc":"832",c141421f:"957","1050d62e":"998",ede96f45:"1007",ca460041:"1084",a7456010:"1235","46d462fa":"1270","171ac7cc":"1273",e4f0c0bc:"1338",ff366317:"1349",cd6f4c97:"1381","400cc4b7":"1472","011d940f":"1536",ca3e6c65:"1601",e4d3d2e1:"1647",de297161:"1658",df248b36:"1686","24af6869":"1753","71174ce3":"1792","9478d12a":"1815",bc73dc9d:"1895",d2866892:"1900",be81e05d:"1917","1483dc01":"1949","7da24252":"2016","51d6008a":"2090",c10c208b:"2132",c5f63adb:"2133","1a4e3797":"2138","53b10fcd":"2271",e0a1aa17:"2304","044a6187":"2370",cd2aa5fe:"2376",c4025719:"2406","87c27ff4":"2410","724ecf1a":"2492",b3a16c5b:"2520",c4b5a5df:"2581","15a9c06b":"2610",c4f5d8e4:"2634","7bab4396":"2771","627bdb5d":"2817",ef46515e:"2852",e69e4b95:"2880",eadc19b4:"2946",e4603b0e:"3108","6e873df7":"3127",a8ed45e8:"3149",cb00cd0b:"3263",c7222430:"3361","99547feb":"3388","4359cab8":"3508","8dac98b9":"3623",c1600862:"3641","50cf1f78":"3715","1a3a5cbb":"3821",d4bc87de:"3832",ca8e7b55:"3867","30f6db9d":"3911","368eb302":"3914","021c8caa":"3924","46e9ac31":"4003",f9546978:"4025","29a2444a":"4040",cb4f58ba:"4074","051962a1":"4094","7136df27":"4167","0807349d":"4182",c846d7aa:"4193","23c216bb":"4196","485c5e01":"4276",d69a7b0b:"4410",ca873730:"4559",b28afb00:"4590","9469bd80":"4661",a5fc5a0e:"4663",c07a004a:"4687",fde89899:"4719","70335a48":"4738","0fc8e5d5":"4931","388f1aef":"4955",d1cdaf24:"4996",cc640607:"5050","109fab02":"5142","341f4c6e":"5143",c902409b:"5184",cbb899e4:"5235","3e68fbe7":"5241",a180cea5:"5251",b1c76d35:"5264","6bba662b":"5296",d968e4da:"5326",fb031341:"5397",d425c21a:"5673","7c1e7b42":"5682","41bca987":"5706",c5b979b0:"5734",aba21aa0:"5742","5b786e91":"5802",ffeead90:"5817","02359d8a":"5859","66e00e19":"5939","84fb41f0":"6040","1f391b9e":"6061",c0050a27:"6087","048b8cd8":"6150","54f055ef":"6185","99cbfc76":"6288","325152a5":"6313","47da9d80":"6314","7273998d":"6360",de406b5e:"6364","94dc3e5f":"6446","64018eb5":"6494",e8303188:"6545",b35da6ab:"6601",aad83134:"6644",f354998b:"6673",b7c223ee:"6678","171f1b26":"6679","10b686c7":"6720",ef09bccd:"6823",f399bb6f:"6884","3abc021e":"6966","5ad15a2f":"7042","2f675600":"7079",a7bd4aaa:"7098",e480558e:"7107","3325f0a2":"7141","05d123c0":"7155",bd7e05cf:"7187","5d2d37cd":"7257","1e828d0d":"7259","4c8a85bd":"7286","75878fc8":"7399","19d61b19":"7432",a5f1db42:"7454",f435945d:"7509","41b23040":"7559","5d624d4b":"7658",eb678835:"7671","71eb5ef4":"7842","2950f807":"7914","1ecac929":"7930","91ee770c":"7950","54b37c16":"7978","324fc7ff":"8020","8e56f135":"8028","1a3bb66a":"8029",c2414a18:"8043","19b95078":"8104",c83ce79b:"8141","50b1f033":"8179",dc7f0b30:"8296","14e1fcc3":"8305","0b199b14":"8321","444a5a58":"8327","3139ff2f":"8355","896d06c5":"8374","62cdf0e0":"8439",ba3d50d9:"8463","571f3672":"8510","12b0e932":"8561","3e41c308":"8596",a2d99d88:"8628",a06cff9c:"8705","487ca811":"8720",a4b1a9b8:"8783",e0474f93:"8861","6518a949":"8904","2192b561":"8945",a94703ab:"9048","4e8e2262":"9055","9e2bab8c":"9063","7cbf6be7":"9065",c989d589:"9082",b1002bca:"9152","1c291fdc":"9206",d05f0a7d:"9230","23284c9b":"9254","521dad97":"9290",ce0be35a:"9303","03459661":"9335",e12d7f74:"9369","150ef1cb":"9384",f963ac8e:"9440","341c85ac":"9479","4047c50f":"9514","6033e994":"9558",e5eedb42:"9568","92131bac":"9583","86c82c9a":"9603","5e95c892":"9647","5fd14b8b":"9775","3fb0a163":"9805",abdba85e:"9961",cbe609e8:"9991"}[e]||e,r.p+r.u(e)},(()=>{var e={5354:0,1869:0};r.f.j=(c,a)=>{var b=r.o(e,c)?e[c]:void 0;if(0!==b)if(b)a.push(b[2]);else if(/^(1869|5354)$/.test(c))e[c]=0;else{var f=new Promise((a,f)=>b=e[c]=[a,f]);a.push(b[2]=f);var d=r.p+r.u(c),t=new Error;r.l(d,a=>{if(r.o(e,c)&&(0!==(b=e[c])&&(e[c]=void 0),b)){var f=a&&("load"===a.type?"missing":a.type),d=a&&a.target&&a.target.src;t.message="Loading chunk "+c+" failed.\n("+f+": "+d+")",t.name="ChunkLoadError",t.type=f,t.request=d,b[1](t)}},"chunk-"+c,c)}},r.O.j=c=>0===e[c];var c=(c,a)=>{var b,f,d=a[0],t=a[1],o=a[2],n=0;if(d.some(c=>0!==e[c])){for(b in t)r.o(t,b)&&(r.m[b]=t[b]);if(o)var i=o(r)}for(c&&c(a);n<d.length;n++)f=d[n],r.o(e,f)&&e[f]&&e[f][0](),e[f]=0;return r.O(i)},a=self.webpackChunkmodulecheck=self.webpackChunkmodulecheck||[];a.forEach(c.bind(null,0)),a.push=c.bind(null,a.push.bind(a))})()})(); \ No newline at end of file diff --git a/build-logic/artifacts-check/build.gradle.kts b/build-logic/artifacts-check/build.gradle.kts deleted file mode 100644 index d903ae93d0..0000000000 --- a/build-logic/artifacts-check/build.gradle.kts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -buildscript { - dependencies { - // Gradle 7.6 has a dependency resolution bug which tries to use Kotlin 1.7.10 - // for transitive dependencies like `sam-with-receiver`. - // https://github.com/gradle/gradle/issues/22510 - classpath(libs.kotlin.sam.with.receiver) - } -} - -plugins { - base - kotlin("jvm") - alias(libs.plugins.google.ksp) - id("java-gradle-plugin") -} - -gradlePlugin { - plugins { - create("artifacts-check") { - id = "mcbuild.artifacts-check" - implementationClass = "modulecheck.builds.artifacts.ArtifactsPlugin" - } - } -} - -dependencies { - - api(libs.rickBusarow.kgx) - api(libs.square.moshi) - - compileOnly(gradleApi()) - - compileOnly(libs.kotlin.gradle.plugin) - - implementation(libs.benManes.versions) - implementation(libs.detekt.gradle) - implementation(libs.dokka.gradle) - implementation(libs.dropbox.dependencyGuard) - implementation(libs.google.dagger.api) - implementation(libs.google.ksp) - implementation(libs.kotlin.compiler) - implementation(libs.kotlin.reflect) - implementation(libs.kotlin.stdlib.common) - implementation(libs.kotlin.stdlib.jdk7) - implementation(libs.kotlin.stdlib.jdk8) - implementation(libs.kotlinx.knit) - - ksp(libs.square.moshi.codegen) -} diff --git a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactConfig.kt b/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactConfig.kt deleted file mode 100644 index d98873838b..0000000000 --- a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactConfig.kt +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.artifacts - -import com.squareup.moshi.JsonClass -import java.io.Serializable - -/** - * Models the module-specific properties of published maven artifacts. - * - * see (Niklas Baudy's - * [gradle-maven-publish-plugin](https://github.com/vanniktech/gradle-maven-publish-plugin)) - * - * @property gradlePath the path of the Gradle project, such as `:workflow-core` - * @property group The maven "group", which should always be `com.rickbusarow.modulecheck`. - * @property artifactId The maven "module", such as `workflow-core-jvm`. - * @property description The description of this specific artifact, such as "Workflow Core". - * @property packaging `aar` or `jar`. - * @property javaVersion the java version of the artifact (typically 8 or 11). If - * not set explicitly, this defaults to the JDK version used to build the artifact. - */ -@JsonClass(generateAdapter = true) -data class ArtifactConfig( - val gradlePath: String, - val group: String, - val artifactId: String, - val description: String, - val packaging: String, - val javaVersion: String -) : Serializable diff --git a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsCheckTask.kt b/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsCheckTask.kt deleted file mode 100644 index 92e7ba4728..0000000000 --- a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsCheckTask.kt +++ /dev/null @@ -1,217 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.artifacts - -import modulecheck.builds.artifacts.ArtifactsCheckTask.Color.RESET -import modulecheck.builds.artifacts.ArtifactsCheckTask.Color.YELLOW -import org.gradle.api.GradleException -import org.gradle.api.file.ProjectLayout -import org.gradle.api.tasks.TaskAction -import java.util.Locale -import javax.inject.Inject - -/** - * Evaluates all published artifacts in the project and compares the results to `/artifacts.json`. - * - * If there are any differences, the task will fail with a descriptive message. - */ -open class ArtifactsCheckTask @Inject constructor( - projectLayout: ProjectLayout -) : ArtifactsTask(projectLayout) { - - init { - description = "Parses the Maven artifact parameters for all modules " + - "and compares them to those recorded in artifacts.json" - group = "verification" - } - - @TaskAction - fun run() { - val fromJson = moshiAdapter.fromJson(reportFile.asFile.readText()) - .orEmpty() - .associateBy { it.gradlePath } - - val currentPaths = currentList.mapTo(mutableSetOf()) { it.gradlePath } - - val extraFromJson = fromJson.values.filterNot { it.gradlePath in currentPaths } - val extraFromCurrent = currentList.filterNot { it.gradlePath in fromJson.keys } - - val changed = currentList.minus(fromJson.values.toSet()) - .minus(extraFromCurrent.toSet()) - .map { artifact -> - fromJson.getValue(artifact.gradlePath) to artifact - } - - // Each artifact needs to have a unique ID. Repository managers will quietly allow overwrites - // with duplicate IDs, so this is the last chance to catch it before publishing. - val duplicateArtifactIds = currentList.findDuplicates { artifactId } - - val foundSomething = sequenceOf( - duplicateArtifactIds.keys, - extraFromJson, - extraFromCurrent, - changed - ).any { it.isNotEmpty() } - - if (foundSomething) { - reportChanges( - duplicateArtifactIds = duplicateArtifactIds, - missing = extraFromJson, - extraFromCurrent = extraFromCurrent, - changed = changed - ) - } - } - - private fun <R : Comparable<R>> List<ArtifactConfig>.findDuplicates( - selector: ArtifactConfig.() -> R - ): Map<R, List<ArtifactConfig>> = groupBy(selector) - .filter { it.value.size > 1 } - - private fun reportChanges( - duplicateArtifactIds: Map<String, List<ArtifactConfig>>, - missing: List<ArtifactConfig>, - extraFromCurrent: List<ArtifactConfig>, - changed: List<Pair<ArtifactConfig, ArtifactConfig>> - ) { - val message = buildString { - appendLine( - "\tArtifact definitions don't match. If this is intended, " + - "run `./gradlew artifactsDump` and commit changes." - ) - appendLine() - - maybeAddDuplicateValueMessages(duplicateArtifactIds, "artifact id") - - maybeAddMissingArtifactMessages(missing) - - maybeAddExtraArtifactMessages(extraFromCurrent) - - maybeAddChangedValueMessages(changed) - } - - logger.error(message.colorized(YELLOW)) - - throw GradleException("Artifacts check failed") - } - - private fun StringBuilder.maybeAddDuplicateValueMessages( - duplicates: Map<String, List<ArtifactConfig>>, - propertyName: String - ) = apply { - if (duplicates.isNotEmpty()) { - appendLine("\tDuplicate properties were found where they should be unique:") - appendLine() - duplicates.forEach { (value, artifacts) -> - appendLine("\t\t projects - ${artifacts.map { it.gradlePath }}") - appendLine("\t\t property - $propertyName") - appendLine("\t\tduplicate value - $value") - appendLine() - } - } - } - - private fun StringBuilder.maybeAddMissingArtifactMessages(missing: List<ArtifactConfig>) = apply { - if (missing.isNotEmpty()) { - val isAre = if (missing.size == 1) "is" else "are" - appendLine( - "\t${pluralsString(missing.size)} defined in `artifacts.json` but " + - "$isAre duplicates from the project:" - ) - appendLine() - missing.forEach { - appendLine(it.message()) - appendLine() - } - } - } - - private fun StringBuilder.maybeAddExtraArtifactMessages(extraFromCurrent: List<ArtifactConfig>) = - apply { - if (extraFromCurrent.isNotEmpty()) { - appendLine("\t${pluralsString(extraFromCurrent.size)} new:\n") - extraFromCurrent.forEach { - appendLine(it.message()) - appendLine() - } - } - } - - private fun StringBuilder.maybeAddChangedValueMessages( - changed: List<Pair<ArtifactConfig, ArtifactConfig>> - ): StringBuilder = apply { - fun appendDiff(propertyName: String, old: String, new: String) { - appendLine("\t\t\told $propertyName - $old") - appendLine("\t\t\tnew $propertyName - $new") - } - - if (changed.isNotEmpty()) { - appendLine("\t${pluralsString(changed.size)} changed:") - changed.forEach { (old, new) -> - - appendLine() - appendLine("\t ${old.gradlePath} -") - - if (old.group != new.group) { - appendDiff("group", old.group, new.group) - } - - if (old.artifactId != new.artifactId) { - appendDiff("artifact id", old.artifactId, new.artifactId) - } - - if (old.description != new.description) { - appendDiff("pom description", old.description, new.description) - } - - if (old.packaging != new.packaging) { - appendDiff("packaging", old.packaging, new.packaging) - } - } - appendLine() - } - } - - private fun pluralsString(size: Int): String { - return if (size == 1) { - "This artifact is" - } else { - "These artifacts are" - } - } - - private fun ArtifactConfig.message(): String { - return """ - | gradlePath - $gradlePath - | group - $group - | artifactId - $artifactId - | pom description - $description - | packaging - $packaging - """.trimMargin() - } - - enum class Color(val escape: String) { - RESET("\u001B[0m"), - YELLOW("\u001B[33m") - } - - private val supported = "win" !in System.getProperty("os.name").lowercase(Locale.ROOT) - private fun String.colorized(color: Color) = if (supported) { - "${color.escape}$this${RESET.escape}" - } else { - this - } -} diff --git a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsDumpTask.kt b/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsDumpTask.kt deleted file mode 100644 index 7092ca0711..0000000000 --- a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsDumpTask.kt +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.artifacts - -import org.gradle.api.file.ProjectLayout -import org.gradle.api.tasks.TaskAction -import javax.inject.Inject - -/** Evaluates all published artifacts in the project and writes the results to `/artifacts.json` */ -open class ArtifactsDumpTask @Inject constructor( - projectLayout: ProjectLayout -) : ArtifactsTask(projectLayout) { - - init { - description = "Parses the Maven artifact parameters for all modules " + - "and writes them to artifacts.json" - group = "other" - } - - @TaskAction - fun run() { - val json = moshiAdapter.indent(" ").toJson(currentList) - - reportFile.asFile.writeText(json) - } -} diff --git a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsPlugin.kt b/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsPlugin.kt deleted file mode 100644 index 578cc23fe3..0000000000 --- a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsPlugin.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.artifacts - -import com.rickbusarow.kgx.checkProjectIsRoot -import com.rickbusarow.kgx.dependsOn -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.publish.maven.tasks.AbstractPublishToMaven -import org.gradle.language.base.plugins.LifecycleBasePlugin - -abstract class ArtifactsPlugin : Plugin<Project> { - - override fun apply(target: Project) { - - target.checkProjectIsRoot() - - target.tasks.register("artifactsDump", ArtifactsDumpTask::class.java) - val artifactsCheck = target.tasks.register("artifactsCheck", ArtifactsCheckTask::class.java) - - target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(artifactsCheck) - - target.allprojects { - target.tasks.withType(AbstractPublishToMaven::class.java).configureEach { - it.dependsOn(artifactsCheck) - } - } - } -} diff --git a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsTask.kt b/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsTask.kt deleted file mode 100644 index 9cac48f190..0000000000 --- a/build-logic/artifacts-check/src/main/kotlin/modulecheck/builds/artifacts/ArtifactsTask.kt +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.artifacts - -import com.squareup.moshi.JsonAdapter -import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter -import org.gradle.api.DefaultTask -import org.gradle.api.Project -import org.gradle.api.file.ProjectLayout -import org.gradle.api.file.RegularFile -import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.OutputFile - -abstract class ArtifactsTask( - private val projectLayout: ProjectLayout -) : DefaultTask() { - - /** - * This file contains all definitions for published artifacts. - * - * It's located at the root of the project, assuming that the task is run from the root project. - */ - @get:OutputFile - protected val reportFile: RegularFile by lazy { - projectLayout.projectDirectory.file("artifacts.json") - } - - /** - * All artifacts as they are defined in the project right now. - * - * This is a lazy delegate because it's accessing [project], and Gradle's configuration caching - * doesn't allow direct references to `project` in task properties or inside task actions. - * Somehow, it doesn't complain about this even though it's definitely accessed at runtime. - */ - @get:Internal - protected val currentList by lazy { project.createArtifactList() } - - @OptIn(ExperimentalStdlibApi::class) - @get:Internal - protected val moshiAdapter: JsonAdapter<List<ArtifactConfig>> by lazy { - - Moshi.Builder() - .build() - .adapter() - } - - private fun Project.createArtifactList(): List<ArtifactConfig> { - val map = subprojects - .mapNotNull { sub -> - - var group: String? = null - var artifactId: String? = null - var pomDescription: String? = null - var packaging: String? = null - - sub.extensions.findByType(PublishingExtension::class.java) - ?.publications - ?.findByName("maven") - ?.let { it as? MavenPublication } - ?.let { publication -> - packaging = publication.pom.packaging - group = publication.groupId - artifactId = publication.artifactId - pomDescription = publication.pom.description.orNull - } - - listOfNotNull(group, artifactId, pomDescription, packaging) - .also { allProperties -> - - require(allProperties.isEmpty() || allProperties.size == 4) { - "expected all properties to be null or none to be null for project `${sub.path}, " + - "but got:\n" + - "group : $group\n" + - "artifactId : $artifactId\n" + - "pom description : $pomDescription\n" + - "packaging : $packaging" - } - } - .takeIf { it.size == 4 } - ?.let { (group, artifactId, pomDescription, packaging) -> - - val javaVersion = sub.extensions.getByType(JavaPluginExtension::class.java) - .sourceCompatibility - .toString() - - ArtifactConfig( - gradlePath = sub.path, - group = group, - artifactId = artifactId, - description = pomDescription, - packaging = packaging, - javaVersion = javaVersion - ) - } - } - - return map - } -} diff --git a/build-logic/build.gradle.kts b/build-logic/build.gradle.kts deleted file mode 100644 index a2732268a4..0000000000 --- a/build-logic/build.gradle.kts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension -import org.jetbrains.kotlin.gradle.dsl.KotlinVersion -import org.jetbrains.kotlin.gradle.plugin.KotlinBasePlugin - -plugins { - alias(libs.plugins.kotlin.jvm) - alias(libs.plugins.dependencyAnalysis) - alias(libs.plugins.moduleCheck) - alias(libs.plugins.ktlint) apply false -} - -moduleCheck { - deleteUnused = true - checks { - sortDependencies = true - } -} - -val ktlintPluginId = libs.plugins.ktlint.get().pluginId - -allprojects ap@{ - - val innerProject = this@ap - - apply(plugin = ktlintPluginId) - dependencies { - "ktlint"(rootProject.libs.rickBusarow.ktrules) - } - - if (innerProject != rootProject) { - rootProject.tasks.named("ktlintCheck") { - dependsOn(innerProject.tasks.named("ktlintCheck")) - } - rootProject.tasks.named("ktlintFormat") { - dependsOn(innerProject.tasks.named("ktlintFormat")) - } - } - - plugins.withType(KotlinBasePlugin::class.java).configureEach { - extensions.configure(KotlinJvmProjectExtension::class.java) { - jvmToolchain { - languageVersion.set(JavaLanguageVersion.of(libs.versions.jdk.get())) - } - compilerOptions { - val versionProvider = libs.versions.kotlinApi - .map { KotlinVersion.fromVersion(it) } - - languageVersion.set(versionProvider) - apiVersion.set(versionProvider) - - jvmTarget = libs.versions.jvmTarget.map { JvmTarget.fromTarget(it) } - - optIn.add("kotlin.RequiresOptIn") - } - } - } - plugins.withType(JavaPlugin::class.java).configureEach { - extensions.configure(JavaPluginExtension::class.java) { - sourceCompatibility = JavaVersion.toVersion(libs.versions.jvmTarget.get()) - } - } -} - -tasks.withType<Delete>().configureEach rootTask@{ - - subprojects { - tasks.withType<Delete>().forEach { subTask -> - this@rootTask.dependsOn(subTask) - } - } -} - -tasks.named("test") rootTask@{ - - subprojects { - tasks.withType<Test>().forEach { subTask -> - subTask.useJUnitPlatform() - this@rootTask.dependsOn(subTask) - } - } -} diff --git a/build-logic/conventions/build.gradle.kts b/build-logic/conventions/build.gradle.kts deleted file mode 100644 index c6f1142c2c..0000000000 --- a/build-logic/conventions/build.gradle.kts +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - base - kotlin("jvm") - alias(libs.plugins.google.ksp) - id("java-gradle-plugin") -} - -gradlePlugin { - plugins { - create("ben-manes") { - id = "mcbuild.ben-manes" - implementationClass = "modulecheck.builds.BenManesVersionsPlugin" - } - create("mcbuild.clean") { - id = "mcbuild.clean" - implementationClass = "modulecheck.builds.CleanPlugin" - } - create("mcbuild.dependency-guard") { - id = "mcbuild.dependency-guard" - implementationClass = "modulecheck.builds.DependencyGuardConventionPlugin" - } - create("mcbuild.dependency-guard-aggregate") { - id = "mcbuild.dependency-guard-aggregate" - implementationClass = "modulecheck.builds.DependencyGuardAggregatePlugin" - } - create("mcbuild.detekt") { - id = "mcbuild.detekt" - implementationClass = "modulecheck.builds.DetektConventionPlugin" - } - create("mcbuild.dokka") { - id = "mcbuild.dokka" - implementationClass = "modulecheck.builds.DokkaConventionPlugin" - } - create("mcbuild.dokka-version-archive") { - id = "mcbuild.dokka-version-archive" - implementationClass = "modulecheck.builds.DokkaVersionArchivePlugin" - } - create("mcbuild.kotlin") { - id = "mcbuild.kotlin" - implementationClass = "modulecheck.builds.KotlinJvmConventionPlugin" - } - create("mcbuild.knit") { - id = "mcbuild.knit" - implementationClass = "modulecheck.builds.KnitConventionPlugin" - } - create("mcbuild.ktlint") { - id = "mcbuild.ktlint" - implementationClass = "modulecheck.builds.KtLintConventionPlugin" - } - create("mcbuild.test") { - id = "mcbuild.test" - implementationClass = "modulecheck.builds.TestConventionPlugin" - } - create("mcbuild.website") { - id = "mcbuild.website" - implementationClass = "modulecheck.builds.WebsitePlugin" - } - } -} - -dependencies { - - api(libs.rickBusarow.kgx) - api(libs.square.moshi) - - api(project(path = ":core")) - - compileOnly(gradleApi()) - - compileOnly(libs.kotlin.gradle.plugin) - - implementation(libs.benManes.versions) - implementation(libs.buildconfig) - implementation(libs.detekt.gradle) - implementation(libs.dokka.gradle) - implementation(libs.dokka.versioning) - implementation(libs.dropbox.dependencyGuard) - implementation(libs.google.dagger.api) - implementation(libs.google.ksp) - implementation(libs.gradle.plugin.publish) - implementation(libs.kotlin.compiler) - implementation(libs.kotlin.gradle.plugin) - implementation(libs.kotlin.reflect) - implementation(libs.kotlin.stdlib.common) - implementation(libs.kotlin.stdlib.jdk7) - implementation(libs.kotlin.stdlib.jdk8) - implementation(libs.kotlinx.binaryCompatibility) - implementation(libs.kotlinx.knit) - implementation(libs.rickBusarow.ktlint) - implementation(libs.rickBusarow.ktrules) - implementation(libs.scabbard) - implementation(libs.square.anvil.gradle) - implementation(libs.square.kotlinPoet) - implementation(libs.vanniktech.publish) - - ksp(libs.square.moshi.codegen) -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/BenManesVersionsPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/BenManesVersionsPlugin.kt deleted file mode 100644 index edcc15f820..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/BenManesVersionsPlugin.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.github.benmanes.gradle.versions.updates.DependencyUpdatesTask -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.checkProjectIsRoot -import org.gradle.api.Plugin -import org.gradle.api.Project - -abstract class BenManesVersionsPlugin : Plugin<Project> { - - override fun apply(target: Project) { - target.plugins.applyOnce("com.github.ben-manes.versions") - - target.checkProjectIsRoot() - - target.tasks.withType( - DependencyUpdatesTask::class.java - ).configureEach { task -> - task.rejectVersionIf { - isNonStable(it.candidate.version) && !isNonStable(it.currentVersion) - } - } - } - - private fun isNonStable(version: String): Boolean { - val stableKeyword = listOf("RELEASE", "FINAL", "GA") - .any { version.uppercase().contains(it) } - val regex = "^[0-9,.v-]+(-r)?$".toRegex() - val isStable = stableKeyword || regex.matches(version) - return isStable.not() - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/BuildPropertiesExtension.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/BuildPropertiesExtension.kt deleted file mode 100644 index e62574825c..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/BuildPropertiesExtension.kt +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.github.gmazzo.buildconfig.BuildConfigExtension -import com.github.gmazzo.buildconfig.BuildConfigPlugin -import com.rickbusarow.kgx.isDirectoryWithFiles -import com.rickbusarow.kgx.registerOnce -import org.gradle.api.Project -import org.gradle.api.file.DirectoryProperty -import org.gradle.api.provider.Property -import org.gradle.api.provider.Provider -import java.io.File -import kotlin.LazyThreadSafetyMode.NONE -import kotlin.reflect.KClass - -interface BuildPropertiesExtension { - - fun Project.buildConfig( - sourceSetName: String = "main", - internalVisibility: Boolean = true, - config: BuildConfigBuilderScope.() -> Unit - ) { - - plugins.apply(BuildConfigPlugin::class.java) - - BuildConfigBuilderScope( - project = this, - sourceSetName = sourceSetName, - internalVisibility = internalVisibility - ).config() - } -} - -@Suppress("MemberVisibilityCanBePrivate") -class BuildConfigBuilderScope( - private val project: Project, - private val sourceSetName: String, - private val internalVisibility: Boolean -) { - - // Shadow the common project properties eagerly, - // so that the project instance isn't accidentally referenced during task runtime. - val rootDir: File = project.rootDir - val projectDir: File = project.projectDir - - val normalSourceRoot: DirectoryProperty = project.objects.directoryProperty() - .convention( - project.layout.dir( - project.provider { - projectDir.resolve("src/$sourceSetName/kotlin") - } - ) - ) - - val packageName: Property<String> = project.objects.property(String::class.java) - .convention( - normalSourceRoot.map { dir -> - - val root = dir.asFile - val minDir = root - .walkTopDown() - .filter { it.isDirectoryWithFiles { file -> file.extension == "kt" } } - .minByOrNull { it.path.length } - ?.relativeTo(root) - - checkNotNull(minDir) { - "Could not find a kotlin file in the source directory of: file://$normalSourceRoot" - } - - minDir.path.split(File.separator).joinToString(".") - } - ) - - private val sourceSet by lazy(NONE) { - project.extensions - .getByType(BuildConfigExtension::class.java) - .sourceSets - .registerOnce(sourceSetName) { buildConfigSourceSet -> - - buildConfigSourceSet.className.convention("BuildProperties") - buildConfigSourceSet.packageName.convention(packageName) - - buildConfigSourceSet.useKotlinOutput { generator -> - if (internalVisibility) { - generator.internalVisibility = true - } - } - - project.registerSimpleGenerationTaskAsDependency( - sourceSetName, - buildConfigSourceSet.generateTask - ) - } - } - - fun <T : Any> field(name: String, value: T) { - - sourceSet.configure { buildConfigSourceSet -> - val valueString = getValueString(value) - - buildConfigSourceSet.buildConfigField(value::class.java.simpleName, name, valueString) - } - } - - fun field(name: String, valueProvider: () -> String) { - field(name, String::class, project.provider { valueProvider() }) - } - - fun field(name: String, valueProvider: Provider<String>) { - field(name, String::class, valueProvider) - } - - fun <T : Any> field(name: String, type: KClass<out Any>, valueProvider: () -> T) { - field(name, type, project.provider { valueProvider() }) - } - - fun <T : Any> field(name: String, type: KClass<out Any>, valueProvider: Provider<T>) { - - sourceSet.configure { buildConfigSourceSet -> - buildConfigSourceSet.buildConfigField( - type = type.qualifiedName!!, - name = name, - value = valueProvider.map { getValueString(it) } - ) - } - } - - @PublishedApi - internal fun <T : Any> getValueString(value: T) = when (value) { - is String -> { - check(!value.startsWith("\\\"") && !value.endsWith("\\\"")) { - "Don't add escaped quotes manually. The Kable extension will do that automagically.\n" + - "The `value` argument was (underscores added): _${value}_" - } - - "\"$value\"" - } - - // For file paths, turn '/Users/<username>/Development/kable/extras/some-folder' - // into '../../extras/some-folder' - is File -> "\"${value.relativeTo(projectDir)}\"" - is Number -> "$value" - else -> "\"$value\"" - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/CheckPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/CheckPlugin.kt deleted file mode 100644 index 0580b7d08d..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/CheckPlugin.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.EagerGradleApi -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.matchingName -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.language.base.plugins.LifecycleBasePlugin - -abstract class CheckPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.plugins.applyOnce("base") - - @OptIn(EagerGradleApi::class) - val fix = target.tasks.register("fix", ModuleCheckBuildTask::class.java) { task -> - - task.group = "Verification" - task.description = "Runs all auto-fix linting tasks" - - task.dependsOn(target.rootProject.tasks.matchingName("artifactsDump")) - task.dependsOn(target.rootProject.tasks.matchingName("spotlessApply")) - task.dependsOn(target.rootProject.tasks.matchingName("updateChangelogVersionLinks")) - task.dependsOn(target.tasks.matchingName("apiDump")) - task.dependsOn(target.tasks.matchingName("dependencyGuardBaseline")) - task.dependsOn(target.tasks.matchingName("ktlintFormat")) - task.dependsOn(target.tasks.matchingName("deleteEmptyDirs")) - task.dependsOn(target.tasks.matchingName("moduleCheckAuto")) - } - - // This is a convenience task which applies all available fixes before running `check`. Each - // of the fixable linters use `mustRunAfter` to ensure that their auto-fix task runs before their - // check-only task. - target.tasks.register("checkFix", ModuleCheckBuildTask::class.java) { task -> - - task.group = "Verification" - task.description = "Runs all auto-fix linting tasks, then runs all of the normal :check task" - - task.dependsOn(target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME)) - task.dependsOn(fix) - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/CleanPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/CleanPlugin.kt deleted file mode 100644 index 87d7e1504f..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/CleanPlugin.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.isOrphanedBuildOrGradleDir -import com.rickbusarow.kgx.isOrphanedGradleProperties -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.Delete -import org.gradle.api.tasks.SourceTask -import org.gradle.language.base.plugins.LifecycleBasePlugin -import java.io.File - -abstract class CleanPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.plugins.applyOnce("base") - - val deleteEmptyDirs = target.tasks - .register("deleteEmptyDirs", Delete::class.java) { - it.description = "Delete all empty directories within a project." - it.doLast { - - val subprojectDirs = target.subprojects - .map { it.projectDir.path } - - target.projectDir.walkBottomUp() - .filter { it.isDirectory } - .filterNot { dir -> subprojectDirs.any { dir.path.startsWith(it) } } - .filterNot { it.path.contains(".gradle") } - .filter { it.listFiles().isNullOrEmpty() } - .forEach { it.deleteRecursively() } - } - } - - target.tasks.named(LifecycleBasePlugin.CLEAN_TASK_NAME) { task -> - task.dependsOn(deleteEmptyDirs) - } - - target.tasks.register("cleanGradle", SourceTask::class.java) { - it.source(".gradle") - it.doLast { - target.projectDir.walkBottomUp() - .filter { it.isDirectory } - .filter { it.path.contains(".gradle") } - .all { it.deleteRecursively() } - } - } - - if (target == target.rootProject) { - val deleteOrphanedProjectDirs = - target.tasks.register("deleteOrphanedProjectDirs", Delete::class.java) { task -> - - task.description = buildString { - append("Delete any 'build' or `.gradle` directory or `gradle.properties` file ") - append("without an associated Gradle project.") - } - - task.doLast { - - val websiteBuildDir = "${target.rootDir}/website/node_modules" - - target.projectDir.walkBottomUp() - .filterNot { it.path.contains(".git") } - .filterNot { it.path.startsWith(websiteBuildDir) } - .filter { it.isOrphanedBuildOrGradleDir() || it.isOrphanedGradleProperties() } - .forEach(File::deleteRecursively) - } - } - - deleteEmptyDirs.configure { - it.dependsOn(deleteOrphanedProjectDirs) - } - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DependencyGuardAggregatePlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/DependencyGuardAggregatePlugin.kt deleted file mode 100644 index 0a32198358..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DependencyGuardAggregatePlugin.kt +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.EagerGradleApi -import com.rickbusarow.kgx.allProjectsTasksMatchingName -import com.rickbusarow.kgx.checkProjectIsRoot -import com.rickbusarow.kgx.dependsOn -import com.rickbusarow.kgx.matchingName -import modulecheck.builds.DependencyGuardConventionPlugin.Companion.DEPENDENCY_GUARD_BASELINE_TASK_NAME -import modulecheck.builds.DependencyGuardConventionPlugin.Companion.DEPENDENCY_GUARD_CHECK_TASK_NAME -import modulecheck.builds.dependencyGuardAggregate.DependencyGuardAggregateTask -import modulecheck.builds.dependencyGuardAggregate.DependencyGuardExplodeTask -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.language.base.plugins.LifecycleBasePlugin - -/** - * Stores all the `dependencies/runtimeClasspath.txt` files from - * individual modules in a single .txt file in the root project directory. - * - * The individual files are recreated before the real dependency-guard plugin does its comparisons. - */ -abstract class DependencyGuardAggregatePlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.checkProjectIsRoot() - - val aggregateFile = target.file("dependency-guard-aggregate.txt") - - @OptIn(EagerGradleApi::class) - target.tasks.register(AGGREGATE_TASK_NAME, DependencyGuardAggregateTask::class.java) { task -> - task.rootDir.set(target.rootDir) - - target.subprojects.forEach { subProject -> - task.source(subProject.fileTree(subProject.file("dependencies"))) - task.finalizedBy(subProject.tasks.matchingName("dependencyGuardDeleteBaselines")) - } - - task.outputFile.set(aggregateFile) - - task.mustRunAfter(target.allProjectsTasksMatchingName(DEPENDENCY_GUARD_CHECK_TASK_NAME)) - task.dependsOn(target.allProjectsTasksMatchingName(DEPENDENCY_GUARD_BASELINE_TASK_NAME)) - } - - target.tasks.named("fix").dependsOn(AGGREGATE_TASK_NAME) - - target.tasks.register(EXPLODE_TASK_NAME, DependencyGuardExplodeTask::class.java) { task -> - task.aggregateFile.set(aggregateFile) - task.rootDir.set(target.rootDir) - } - - @OptIn(EagerGradleApi::class) - target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) { task -> - task.dependsOn(target.tasks.matchingName(EXPLODE_TASK_NAME)) - } - } - - companion object { - const val AGGREGATE_TASK_NAME = "dependencyGuardAggregate" - const val EXPLODE_TASK_NAME = "dependencyGuardExplode" - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DependencyGuardConventionPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/DependencyGuardConventionPlugin.kt deleted file mode 100644 index 2999c0f81a..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DependencyGuardConventionPlugin.kt +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.dropbox.gradle.plugins.dependencyguard.DependencyGuardPluginExtension -import com.rickbusarow.kgx.EagerGradleApi -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.dependsOn -import com.rickbusarow.kgx.matchingName -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.Delete -import org.gradle.language.base.plugins.LifecycleBasePlugin - -abstract class DependencyGuardConventionPlugin : Plugin<Project> { - override fun apply(target: Project) { - - if (target == target.rootProject) { - return - } - - target.plugins.applyOnce("org.jetbrains.kotlin.jvm") - target.plugins.applyOnce("com.dropbox.dependency-guard") - - target.extensions.configure(DependencyGuardPluginExtension::class.java) { extension -> - extension.configuration("runtimeClasspath") { - it.modules = false - } - } - - target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) - .dependsOn(DEPENDENCY_GUARD_CHECK_TASK_NAME) - - // Delete any existing dependency files/directories before recreating with a new baseline task. - val dependencyGuardDeleteBaselines = target.tasks - .register("dependencyGuardDeleteBaselines", Delete::class.java) { - it.delete("dependencies") - it.mustRunAfter(DEPENDENCY_GUARD_BASELINE_TASK_NAME) - } - - @OptIn(EagerGradleApi::class) - target.tasks.named(DEPENDENCY_GUARD_BASELINE_TASK_NAME) { - - it.finalizedBy( - target.rootProject.tasks.matchingName(DependencyGuardAggregatePlugin.AGGREGATE_TASK_NAME) - ) - } - @OptIn(EagerGradleApi::class) - target.tasks.named(DEPENDENCY_GUARD_CHECK_TASK_NAME) { - it.dependsOn( - target.rootProject.tasks.matchingName(DependencyGuardAggregatePlugin.EXPLODE_TASK_NAME) - ) - it.finalizedBy(dependencyGuardDeleteBaselines) - } - } - - companion object { - const val DEPENDENCY_GUARD_CHECK_TASK_NAME = "dependencyGuard" - const val DEPENDENCY_GUARD_BASELINE_TASK_NAME = "dependencyGuardBaseline" - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DetektConventionPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/DetektConventionPlugin.kt deleted file mode 100644 index 587ff51b87..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DetektConventionPlugin.kt +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.library -import com.rickbusarow.kgx.libsCatalog -import io.gitlab.arturbosch.detekt.Detekt -import io.gitlab.arturbosch.detekt.DetektCreateBaselineTask -import io.gitlab.arturbosch.detekt.DetektGenerateConfigTask -import io.gitlab.arturbosch.detekt.extensions.DetektExtension -import io.gitlab.arturbosch.detekt.report.ReportMergeTask -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.tasks.TaskCollection -import org.gradle.language.base.plugins.LifecycleBasePlugin - -abstract class DetektConventionPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.plugins.applyOnce("io.gitlab.arturbosch.detekt") - - val detektExcludes = listOf( - "**/resources/**", - "**/build/**", - // Tasks with type resolution don't honor excludes starting with the - // https://github.com/detekt/detekt/issues/4743 - "**/BuildProperties.kt" - ) - - target.tasks - .register("detektReportMerge", ReportMergeTask::class.java) { reportMergeTask -> - reportMergeTask.output - .set( - target.rootProject.layout.buildDirectory.file( - "reports/detekt/merged.sarif" - ) - ) - - reportMergeTask.input.from( - target.tasks.withType(Detekt::class.java).map { it.sarifReportFile } - ) - } - - target.dependencies.add( - "detektPlugins", - target.libsCatalog.library("detekt-rules-libraries") - ) - - target.extensions.configure(DetektExtension::class.java) { extension -> - - extension.autoCorrect = false - extension.baseline = target.file("${target.rootDir}/detekt/detekt-baseline.xml") - extension.config.from("${target.rootDir}/detekt/detekt-config.yml") - extension.buildUponDefaultConfig = true - - extension.source.from( - "src/main/java", - "src/test/java", - "src/main/kotlin", - "src/test/kotlin" - ) - - extension.parallel = true - } - - target.tasks.withType(Detekt::class.java).configureEach { task -> - - task.autoCorrect = false - task.parallel = true - task.baseline.set(target.file("${target.rootDir}/detekt/detekt-baseline.xml")) - task.config.from(target.files("${target.rootDir}/detekt/detekt-config.yml")) - task.buildUponDefaultConfig = true - - task.reports { - it.xml.required.set(true) - it.html.required.set(true) - it.txt.required.set(false) - it.sarif.required.set(true) - } - - task.exclude(detektExcludes) - target.subprojects.forEach { sub -> - task.exclude("**/${sub.projectDir.relativeTo(target.rootDir)}/**") - } - - // https://github.com/detekt/detekt/issues/4127 - task.exclude { "/build/generated/" in it.file.absolutePath } - - task.dependsOn(target.tasks.withType(ModuleCheckBuildCodeGeneratorTask::class.java)) - } - - target.tasks.register("detektAll", Detekt::class.java) { - it.description = "runs the standard PSI Detekt as well as all type resolution tasks" - it.dependsOn(target.otherDetektTasks(it, withAutoCorrect = false)) - } - - // Make all tasks from Detekt part of the 'detekt' task group. Default is 'verification'. - sequenceOf( - Detekt::class.java, - DetektCreateBaselineTask::class.java, - DetektGenerateConfigTask::class.java - ).forEach { type -> - target.tasks.withType(type).configureEach { it.group = "detekt" } - } - - // By default, `check` only handles the PSI Detekt task. This adds the type resolution tasks. - target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) { - it.dependsOn(target.otherDetektTasks(it, withAutoCorrect = false)) - } - - if (target == target.rootProject) { - - target.tasks.register( - "detektProjectBaseline", - DetektCreateBaselineTask::class.java - ) { task -> - task.description = "Overrides current baseline." - task.buildUponDefaultConfig.set(true) - task.ignoreFailures.set(true) - task.parallel.set(true) - task.setSource(target.files(target.rootDir)) - task.config.setFrom(target.files("${target.rootDir}/detekt/detekt-config.yml")) - - val baselineFile = target.file("${target.rootDir}/detekt/detekt-baseline.xml") - task.baseline.set(baselineFile) - - task.include("**/*.kt", "**/*.kts") - task.exclude(detektExcludes) - - task.doLast { - // Detekt completely re-writes this file's contents any time it has to update. - // After updating the baseline file, insert the comment to exclude it from auto-format. - val oldText = baselineFile.readText() - val newText = oldText.replaceFirst( - "<?xml version='1.0' encoding='UTF-8'?>", - "<?xml version='1.0' encoding='UTF-8'?>\n" + - "<!--@formatter:off this file (or Detekt's parsing?) is broken if this gets auto-formatted-->" - ) - baselineFile.writeText(newText) - } - } - } - } - - private fun Project.otherDetektTasks( - targetTask: Task, - withAutoCorrect: Boolean - ): TaskCollection<Detekt> { - return tasks.withType(Detekt::class.java) - .matching { it.autoCorrect == withAutoCorrect && it != targetTask } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DiExtension.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/DiExtension.kt deleted file mode 100644 index d1c82b48c2..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DiExtension.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -interface DiExtension { - /** - * Applies the Anvil plugin with `generateDaggerFactories` - * set to `true`. Do not use at the same time as `dagger()`. - */ - fun anvil() - - /** - * Applies kapt and the Anvil plugin with `generateDaggerFactories` - * set to `false`. Also adds the Dagger compiler `kapt` dependency. - * - * Do not use at the same time as `anvil()`. - */ - fun dagger() -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DokkaConventionPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/DokkaConventionPlugin.kt deleted file mode 100644 index a064ce9657..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DokkaConventionPlugin.kt +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.dependsOn -import com.rickbusarow.kgx.isRootProject -import com.rickbusarow.kgx.projectDependency -import com.rickbusarow.kgx.withType -import com.vanniktech.maven.publish.tasks.JavadocJar -import org.gradle.api.GradleException -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.publish.maven.plugins.MavenPublishPlugin -import org.gradle.language.base.plugins.LifecycleBasePlugin -import org.jetbrains.dokka.gradle.DokkaExtension -import org.jetbrains.dokka.gradle.engine.parameters.VisibilityModifier -import org.jetbrains.dokka.gradle.engine.plugins.DokkaVersioningPluginParameters -import org.jetbrains.dokka.gradle.tasks.DokkaBaseTask -import org.jetbrains.kotlin.gradle.plugin.extraProperties - -abstract class DokkaConventionPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.extraProperties.apply { - set("org.jetbrains.dokka.experimental.gradle.pluginMode", "V2Enabled") - set("org.jetbrains.dokka.experimental.gradle.pluginMode.noWarn", "true") - } - - target.plugins.applyOnce("org.jetbrains.dokka") - - target.extensions.configure(DokkaExtension::class.java) { dokka -> - - val fullModuleName = target.path.removePrefix(":") - dokka.moduleName.set(fullModuleName) - dokka.moduleVersion.set(target.VERSION_NAME_STABLE) - - dokka.dokkaSourceSets.configureEach { ss -> - - val ssName = ss.name - - ss.documentedVisibilities(*VisibilityModifier.values()) - - ss.languageVersion.set(target.KOTLIN_API) - ss.jdkVersion.set(target.JVM_TARGET_INT) - - // include all project sources when resolving kdoc samples - ss.samples.setFrom(target.fileTree(target.file("src"))) - - if (!target.isRootProject()) { - val readmeFile = target.projectDir.resolve("README.md") - if (readmeFile.exists()) { - ss.includes.from(readmeFile) - } - } - - ss.sourceLink { spec -> - - // spec.localDirectory.files(kotlinSS.kotlin.sourceDirectories) - spec.localDirectory.files("src/$ssName") - - val modulePath = target.path.replace(":", "/") - .replaceFirst("/", "") - - // URL showing where the source code can be accessed through the web browser - spec.remoteUrl("${SOURCE_WEBSITE}/blob/main/$modulePath/src/$ssName") - // Suffix which is used to append the line number to the URL. Use #L for GitHub - spec.remoteLineSuffix.set("#L") - } - } - - target.tasks.withType(DokkaBaseTask::class.java).configureEach { task -> - - if (target.isRootProject()) { - task.dependsOn("unzipDokkaArchives") - } - - // Dokka uses their outputs but doesn't explicitly depend upon them. - // task.mustRunAfter(target.tasks.withType(KotlinCompile::class.java)) - // task.mustRunAfter(target.tasks.withType(KtLintTask::class.java)) - } - - if (target.isRootProject()) { - - val config = target.configurations.getByName("dokka") - - config.dependencies.addAllLater( - target.provider { - target.subprojects - .filter { sub -> sub.subprojects.isEmpty() } - .map { sub -> target.projectDependency(sub.path) } - } - ) - - target.dependencies.add("dokkaPlugin", target.libs.dokka.versioning) - - val dokkaArchiveBuildDir = target.rootProject.layout - .buildDirectory - .dir("tmp/dokka-archive") - - dokka.pluginsConfiguration.withType<DokkaVersioningPluginParameters>().configureEach { versioning -> - versioning.version.set(target.VERSION_NAME) - versioning.olderVersionsDir.set(dokkaArchiveBuildDir) - versioning.renderVersionsNavigationOnAllPages.set(true) - } - - // dokka.dokkatooPublications.configureEach { - // it.suppressObviousFunctions.set(true) - // } - } - } - - target.plugins.withType(MavenPublishPlugin::class.java).configureEach { - - val checkJavadocJarIsNotVersioned = target.tasks - .register("checkJavadocJarIsNotVersioned") { task -> - - task.description = - "Ensures that generated javadoc.jar artifacts don't include old Dokka versions" - task.group = "dokka versioning" - - val javadocTasks = target.tasks.withType(JavadocJar::class.java) - task.dependsOn(javadocTasks) - - task.inputs.files(javadocTasks.map { it.outputs }) - - val zipTrees = javadocTasks.map { target.zipTree(it.archiveFile) } - - task.doLast { - - val jsonReg = """older/($SEMVER_REGEX)/version\.json""".toRegex() - - val versions = zipTrees.flatMap { tree -> - tree - .filter { it.path.startsWith("older/") } - .filter { it.isFile } - .mapNotNull { jsonReg.find(it.path)?.groupValues?.get(1) } - } - - if (versions.isNotEmpty()) { - throw GradleException("Found old Dokka versions in javadoc.jar: $versions") - } - } - } - - target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn( - checkJavadocJarIsNotVersioned - ) - } - } - - companion object { - const val DOKKA_HTML_TASK_NAME = "dokkaGenerate" - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DokkaVersionArchivePlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/DokkaVersionArchivePlugin.kt deleted file mode 100644 index 24fcfee107..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/DokkaVersionArchivePlugin.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.checkProjectIsRoot -import com.rickbusarow.kgx.dependOn -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.Copy -import org.gradle.api.tasks.Sync -import org.gradle.api.tasks.bundling.Zip -import org.jetbrains.dokka.gradle.tasks.DokkaBaseTask - -abstract class DokkaVersionArchivePlugin : Plugin<Project> { - - override fun apply(target: Project) { - - target.checkProjectIsRoot { - "Only apply the dokka version archive plugin to a root project." - } - - val versionWithoutSnapshot = VERSION_NAME.removeSuffix("-SNAPSHOT") - - val dokkaHtmlBuildDir = target.rootDir.resolve("build/dokka/html") - val currentVersionBuildDirZip = - dokkaHtmlBuildDir.resolveSibling("$versionWithoutSnapshot.zip") - - val dokkaArchiveBuildDir = target.rootDir.resolve("build/tmp/dokka-archive") - - val dokkaArchive = target.rootDir.resolve("dokka-archive") - - val taskGroup = "dokka versioning" - - val unzip = target.tasks - .register("unzipDokkaArchives", Sync::class.java) { task -> - task.group = taskGroup - task.description = "Unzips all zip files in $dokkaArchive into $dokkaArchiveBuildDir" - - task.onlyIf { dokkaArchive.exists() } - - task.into(dokkaArchiveBuildDir) - - dokkaArchive.walkTopDown() - .maxDepth(1) - .filter { file -> file.isFile } - .filter { file -> file.extension == "zip" } - .filter { file -> file.nameWithoutExtension != versionWithoutSnapshot } - .forEach { zipFile -> task.from(target.zipTree(zipFile)) } - } - - target.tasks.withType(DokkaBaseTask::class.java).dependOn(unzip) - - val zipDokkaArchive = target.tasks - .register("zipDokkaArchive", Zip::class.java) { task -> - task.group = taskGroup - task.description = "Zips the contents of $dokkaArchiveBuildDir" - - task.destinationDirectory.set(dokkaHtmlBuildDir.parentFile) - task.archiveFileName.set(currentVersionBuildDirZip.name) - task.outputs.file(currentVersionBuildDirZip) - - task.enabled = versionWithoutSnapshot == VERSION_NAME - - task.from(dokkaHtmlBuildDir) { - it.into(versionWithoutSnapshot) - // Don't copy the `older/` directory into the archive, because all navigation is done using - // the root version's copy. Archived `older/` directories just waste space. - it.exclude("older/**") - } - - task.mustRunAfter(target.tasks.withType(DokkaBaseTask::class.java)) - task.dependsOn("dokkaGenerate") - } - - target.tasks.register("syncDokkaToArchive", Copy::class.java) { task -> - task.group = taskGroup - task.description = - "sync the Dokka output for the current version to /dokka-archive/$versionWithoutSnapshot" - - task.from(currentVersionBuildDirZip) - task.into(dokkaArchive) - task.outputs.file(dokkaArchive.resolve("$versionWithoutSnapshot.zip")) - - task.enabled = versionWithoutSnapshot == VERSION_NAME - - task.mustRunAfter(target.tasks.withType(DokkaBaseTask::class.java)) - task.dependsOn(zipDokkaArchive) - - task.onlyIf { - - val destZip = dokkaArchive.resolve("$versionWithoutSnapshot.zip") - - !destZip.exists() || !currentVersionBuildDirZip.zipContentEquals(destZip) - } - } - - target.tasks.withType(DokkaBaseTask::class.java).configureEach { - it.finalizedBy(zipDokkaArchive) - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/KnitConventionPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/KnitConventionPlugin.kt deleted file mode 100644 index 93a028351f..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/KnitConventionPlugin.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.applyOnce -import kotlinx.knit.KnitPluginExtension -import kotlinx.knit.KnitTask -import org.gradle.api.Plugin -import org.gradle.api.Project - -abstract class KnitConventionPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.plugins.applyOnce("kotlinx-knit") - - target.extensions.configure(KnitPluginExtension::class.java) { extension -> - extension.moduleRoots = listOf(".") - - extension.moduleDocs = "build/dokka/htmlMultiModule" - extension.dokkaMultiModuleRoot = "build/dokka/htmlMultiModule" - extension.moduleMarkers = listOf("build.gradle", "build.gradle.kts") - extension.siteRoot = "$DOCS_WEBSITE/api" - } - - target.tasks.withType(KnitTask::class.java).configureEach { task -> - task.notCompatibleWithConfigurationCache("knit does not support configuration cache") - - task.inputs.files(target.tasks.named(DokkaConventionPlugin.DOKKA_HTML_TASK_NAME)) - - task.rootDir = target.rootProject.rootDir - - task.files = target.fileTree(target.rootDir) { tree -> - tree.include( - "**/*.md", - "**/*.kt", - "**/*.kts" - ) - tree.exclude( - "**/node_modules/**", - "**/build/**", - "**/sample/**", - "**/.gradle/**" - ) - } - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/KotlinJvmConventionPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/KotlinJvmConventionPlugin.kt deleted file mode 100644 index 54dfbbc1c6..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/KotlinJvmConventionPlugin.kt +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.dependsOn -import com.rickbusarow.kgx.javaExtension -import com.rickbusarow.kgx.names.ConfigurationName -import org.gradle.api.JavaVersion -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.artifacts.ExternalModuleDependency -import org.gradle.api.plugins.JavaPluginExtension -import org.gradle.api.tasks.compile.JavaCompile -import org.gradle.jvm.toolchain.JavaLanguageVersion -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension -import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -import java.io.File - -abstract class KotlinJvmConventionPlugin : Plugin<Project> { - - override fun apply(target: Project) { - target.plugins.applyOnce("org.jetbrains.kotlin.jvm") - - target.extensions.configure(KotlinJvmProjectExtension::class.java) { extension -> - extension.jvmToolchain { toolChain -> - toolChain.languageVersion.set(JavaLanguageVersion.of(target.JDK)) - } - extension.coreLibrariesVersion = target.libs.versions.kotlin.core.get() - } - target.tasks.withType(JavaCompile::class.java).configureEach { task -> - task.options.release.set(target.JVM_TARGET_INT) - task.targetCompatibility = target.JVM_TARGET - } - target.extensions.configure(JavaPluginExtension::class.java) { extension -> - extension.sourceCompatibility = JavaVersion.toVersion(target.JVM_TARGET) - } - - target.dependencies.add( - ConfigurationName.implementation.value, - target.dependencies.platform(target.libs.kotlin.bom) - ) - - target.tasks.withType(KotlinCompile::class.java).configureEach { task -> - task.kotlinOptions { - allWarningsAsErrors = false - - val kotlinMajor = target.KOTLIN_API - languageVersion = kotlinMajor - apiVersion = kotlinMajor - - jvmTarget = target.JVM_TARGET - - freeCompilerArgs += buildList { - add("-Xinline-classes") - add("-Xjvm-default=all") - add("-Xsam-conversions=class") - add("-opt-in=kotlin.ExperimentalStdlibApi") - add("-opt-in=kotlin.RequiresOptIn") - add("-opt-in=kotlin.contracts.ExperimentalContracts") - - if (task.hasCoroutines(target)) { - add("-opt-in=kotlinx.coroutines.ExperimentalCoroutinesApi") - add("-opt-in=kotlinx.coroutines.FlowPreview") - } - - if (task.name.endsWith("TestKotlin") || target.path.endsWith("testing")) { - add("-Xcontext-receivers") - } - } - } - } - - target.tasks.register("lintMain") { task -> - task.doFirst { - target.tasks.withType(KotlinCompile::class.java).configureEach { compileTask -> - compileTask.kotlinOptions { - allWarningsAsErrors = true - } - } - } - task.finalizedBy(target.tasks.withType(KotlinCompile::class.java)) - } - - target.tasks.register("testJvm").dependsOn("test") - target.tasks.register("buildTests").dependsOn("testClasses") - target.tasks.register("buildAll").dependsOn( - target.provider { target.javaExtension.sourceSets.map { it.classesTaskName } } - ) - - target.tasks.register("moveJavaSrcToKotlin") { task -> - - task.doLast { - val reg = """.*/src/([^/]*)/java.*""".toRegex() - - target.projectDir.walkTopDown() - .filter { it.path.matches(reg) } - .forEach { file -> - - val oldPath = file.path - val newPath = oldPath.replace("/java", "/kotlin") - - if (file.isFile) { - val text = file.readText() - - File(newPath).also { - it.createNewFile() - it.writeText(text) - } - } else { - - File(newPath).mkdirs() - } - } - - target.projectDir.walkBottomUp() - .filter { it.path.matches(reg) } - .forEach { file -> file.deleteRecursively() } - } - } - } - - /** - * There's `sourceSetName` property for the task, but it isn't - * necessarily set for custom compile tasks like for `integrationTest`. - */ - private fun KotlinCompile.sourceSetName(): String { - return name.substringAfter("compile") - .substringBefore("Kotlin") - .decapitalize() - .ifEmpty { "main" } - } - - private fun KotlinCompile.hasCoroutines(target: Project): Boolean { - - val configNames = when (val sourceSetName = sourceSetName()) { - "main" -> setOf("api", "implementation", "compileOnly") - else -> setOf( - "${sourceSetName}CompileOnly", - "${sourceSetName}Api", - "${sourceSetName}Implementation" - ) - } - - return target.configurations - .asSequence() - .filter { it.name in configNames } - .flatMap { it.dependencies.asSequence() } - .filterIsInstance<ExternalModuleDependency>() - .any { it.group == "org.jetbrains.kotlinx" && it.name.startsWith("kotlinx-coroutines-") } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/KtLintConventionPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/KtLintConventionPlugin.kt deleted file mode 100644 index ad5b25953d..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/KtLintConventionPlugin.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package modulecheck.builds - -import com.rickbusarow.kgx.isRealRootProject -import com.rickbusarow.kgx.namedOrNull -import com.rickbusarow.ktlint.KtLintPlugin -import com.rickbusarow.ktlint.KtLintTask -import com.rickbusarow.ktrules.rules.internal.sequenceOfNotNull -import kotlinx.validation.KotlinApiBuildTask -import kotlinx.validation.KotlinApiCompareTask -import org.gradle.api.Plugin -import org.gradle.api.Project -import kotlin.text.RegexOption.MULTILINE - -abstract class KtLintConventionPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.plugins.apply(KtLintPlugin::class.java) - - target.dependencies - .add("ktlint", target.libs.rickBusarow.ktrules) - - target.tasks.withType(KtLintTask::class.java).configureEach { task -> - task.dependsOn(":updateEditorConfigVersion") - task.mustRunAfter( - target.tasks.withType(KotlinApiBuildTask::class.java), - target.tasks.withType(KotlinApiCompareTask::class.java) - ) - sequenceOfNotNull( - target.tasks.namedOrNull("apiDump"), - target.tasks.namedOrNull("dependencyGuard"), - target.tasks.namedOrNull("dependencyGuardBaseline") - ) - .forEach { task.mustRunAfter(it.name) } - } - - if (target.isRealRootProject()) { - - target.tasks.register("updateEditorConfigVersion") { task -> - - val file = target.file(".editorconfig") - - task.doLast { - val oldText = file.readText() - - val reg = """^(ktlint_kt-rules_project_version *?= *?)\S*$""".toRegex(MULTILINE) - - val newText = oldText.replace(reg, "$1$VERSION_NAME") - - if (newText != oldText) { - file.writeText(newText) - } - } - } - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/ShardTestTask.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/ShardTestTask.kt deleted file mode 100644 index 2758b99012..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/ShardTestTask.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import org.gradle.api.GradleException -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.testing.Test -import org.gradle.api.tasks.testing.logging.TestLogEvent -import kotlin.math.ceil - -abstract class ShardTestTask : Test() { - - @get:Input - abstract val totalShards: Property<Int> - - @get:Input - abstract val shardNumber: Property<Int> - - private var filterWasSet: Boolean = false - - fun setFilter() { - - // Calculate the range of test classes for this shard - val testClassCount = testClassesDirs.asFileTree.matching { - include("**/*Test.class") - }.files.size - - val testsPerShard = ceil(testClassCount.toDouble() / totalShards.get()).toInt() - val startIndex = testsPerShard * (shardNumber.get() - 1) - val endIndex = minOf(testClassCount, startIndex + testsPerShard) - - testLogging.events( - TestLogEvent.FAILED, - TestLogEvent.STARTED, - TestLogEvent.PASSED, - TestLogEvent.SKIPPED - ) - - testClassesDirs.asFileTree.matching { - include("**/*Test.class") - }.files.asSequence() - .sorted() - .map { file -> file.name.replace(".class", "") } - .drop(startIndex) - .take(endIndex - startIndex) - .also { - - println( - "###### integration test shard ${shardNumber.get()} of ${totalShards.get()} includes:\n" + - it.joinToString("\n") - ) - } - .forEach { - this@ShardTestTask.filter.includeTest(it, null) - } - - filterWasSet = true - } - - @TaskAction - fun execute() { - - if (!filterWasSet) { - throw GradleException("This shard test task did not have its filter set.") - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/TestConventionPlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/TestConventionPlugin.kt deleted file mode 100644 index 6559e8aa54..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/TestConventionPlugin.kt +++ /dev/null @@ -1,177 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.isRootProject -import com.rickbusarow.kgx.withJavaPlugin -import com.rickbusarow.kgx.withType -import modulecheck.builds.shards.registerYamlShardsTasks -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.plugins.jvm.JvmTestSuite -import org.gradle.api.tasks.testing.Test -import org.gradle.api.tasks.testing.logging.TestExceptionFormat -import org.gradle.api.tasks.testing.logging.TestLogEvent.FAILED -import org.gradle.internal.classpath.Instrumented.systemProperty -import org.gradle.testing.base.TestingExtension - -abstract class TestConventionPlugin : Plugin<Project> { - - override fun apply(target: Project) { - - target.plugins.withJavaPlugin { - - @Suppress("UnstableApiUsage") - target.extensions.getByType(TestingExtension::class.java) - .suites - .withType(JvmTestSuite::class.java) - .configureEach { suite -> - - suite.useJUnitJupiter(target.libs.versions.jUnit.asProvider()) - suite.dependencies { - - // https://junit.org/junit5/docs/current/user-guide/#running-tests-build-gradle-bom - // https://github.com/junit-team/junit5/issues/4374#issuecomment-2704880447 - it.implementation.add(target.libs.junit.jupiter.asProvider()) - it.runtimeOnly.add(target.libs.junit.platform.launcher) - } - } - } - - target.tasks.withType(Test::class.java).configureEach { task -> - - task.useJUnitPlatform() - - task.testLogging { - it.events = setOf(FAILED) - it.exceptionFormat = TestExceptionFormat.FULL - it.showExceptions = true - it.showCauses = true - it.showStackTraces = true - } - - target.properties - .asSequence() - .filter { (key, value) -> - key.startsWith("modulecheck") && value != null - } - .forEach { (key, value) -> - systemProperty(key, value as String) - } - - val ci = System.getenv("CI")?.toBoolean() == true - if (ci) { - // defaults to 512m. - task.maxHeapSize = "1g" - // Allow JUnit4 tests to run in parallel - task.maxParallelForks = Runtime.getRuntime().availableProcessors() / 2 - } else { - task.maxHeapSize = "4g" - - task.systemProperties.putAll( - mapOf( - - // auto-discover and apply any Junit5 extensions in the classpath - "junit.jupiter.extensions.autodetection.enabled" to true, - - // remove parentheses from test display names - "junit.jupiter.displayname.generator.default" to - "org.junit.jupiter.api.DisplayNameGenerator\$Simple", - - // https://junit.org/junit5/docs/snapshot/user-guide/#writing-tests-parallel-execution-config-properties - // Allow unit tests to run in parallel - "junit.jupiter.execution.parallel.enabled" to true, - "junit.jupiter.execution.parallel.mode.default" to "concurrent", - "junit.jupiter.execution.parallel.mode.classes.default" to "concurrent", - - "junit.jupiter.execution.parallel.config.strategy" to "dynamic", - "junit.jupiter.execution.parallel.config.dynamic.factor" to 1.0 - ) - ) - - // Allow JUnit4 tests to run in parallel - task.maxParallelForks = Runtime.getRuntime().availableProcessors() - } - } - - if (target.isRootProject()) { - - @Suppress("MagicNumber") - val shardCount = 4 - - target.registerYamlShardsTasks( - shardCount = shardCount, - startTagName = "### <start-unit-test-shards>", - endTagName = "### <end-unit-test-shards>", - taskNamePart = "unitTest", - yamlFile = target.rootProject.file(".github/workflows/ci.yml") - ) - - // Assign each project to a shard. - // It's lazy so that the work only happens at task configuration time, but it's outside the - // task configuration block so that it only happens once. - val shardAssignments by lazy { - - val testAnnotationRegex = "@Test(?!Factory)".toRegex() - val testFactoryAnnotationRegex = "@TestFactory".toRegex() - - // Calculate the cost of each project's tests - val projectTestCosts = target.subprojects - .associateWith { project -> - project.file("src/test") - .walkTopDown() - .filter { it.isFile && it.extension == "kt" } - .sumOf { file -> - val fileText = file.readText() - val testAnnotationCount = testAnnotationRegex.findAll(fileText).count() - val testFactoryAnnotationCount = - testFactoryAnnotationRegex.findAll(fileText).count() - testAnnotationCount + (testFactoryAnnotationCount * 2) - } - } - - // Sort the projects by descending test cost, then fall back to the project paths - // The path sort is just so that the shard composition is stable. If the shard composition - // isn't stable, the shard tasks may not be up-to-date and build caching in CI is broken. - val sortedProjects = projectTestCosts.keys - .sortedWith( - compareBy( - { projectTestCosts.getValue(it) }, - { it.path } - ) - ) - - var shardIndex = 0 - - sortedProjects.groupBy { (shardIndex++ % shardCount) + 1 } - } - - (1..shardCount).map { shardIndex -> - - target.tasks.register("testShard$shardIndex", Test::class.java) { task -> - - val assignedTests = shardAssignments.getValue(shardIndex) - .map { project -> - project.tasks.withType<Test>() - .matching { it.name == "test" } - } - - task.dependsOn(assignedTests) - } - } - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/WebsitePlugin.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/WebsitePlugin.kt deleted file mode 100644 index f5750a7c75..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/WebsitePlugin.kt +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.checkProjectIsRoot -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.api.tasks.Exec -import org.gradle.api.tasks.Sync -import java.io.File - -abstract class WebsitePlugin : Plugin<Project> { - - private val Project.readme: File - get() = file("README.md") - - private val Project.changelog: File - get() = file("CHANGELOG.md") - - private val Project.websiteDir: File - get() = rootDir.resolve("website") - - private val Project.websiteDocsDir: File - get() = websiteDir.resolve("docs") - - private val Project.websiteApiDir: File - get() = websiteDir.resolve("static/api") - - private val Project.websiteSrcDir: File - get() = websiteDir.resolve("src") - - private val Project.websitePagesDir: File - get() = websiteSrcDir.resolve("pages") - - private val Project.websiteChangelog: File - get() = websitePagesDir.resolve("changelog.md") - - private val Project.websitePackageJson: File - get() = websiteDir.resolve("package.json") - - override fun apply(target: Project) { - - target.checkProjectIsRoot() - - /** - * Looks for all references to ModuleCheck artifacts in the md/mdx files in the - * un-versioned /website/docs. Updates all versions to the pre-release version. - */ - target.tasks.register("checkWebsiteNextDocsVersionRefs") { task -> - - task.description = "Checks the \"next\" version docs for version changes" - task.group = "website" - - task.doLast { - - target.fileTree(target.websiteDocsDir) { - it.include("**/*.md*") - } - .forEach { file -> - file.updateModuleCheckVersionRef(VERSION_NAME, failOnChanges = true) - } - } - } - - /** - * Looks for all references to ModuleCheck artifacts in the md/mdx files in the - * un-versioned /website/docs. Updates all versions to the pre-release version. - */ - target.tasks.register("updateWebsiteNextDocsVersionRefs") { task -> - - task.description = "Updates the \"next\" version docs for version changes" - task.group = "website" - - task.doLast { - - target.fileTree(target.websiteDocsDir) { - it.include("**/*.md*") - } - .forEach { file -> - file.updateModuleCheckVersionRef(VERSION_NAME, failOnChanges = false) - } - } - } - - /** Updates the "moduleCheck" version in package.json. */ - target.tasks.register("updateWebsitePackageJsonVersion") { task -> - - task.description = "Updates the \"ModuleCheck\" version in package.json" - task.group = "website" - - task.doLast { - - val newText = target.websitePackageJson.readText().updatePackageJsonVersion() - - target.websitePackageJson.writeText(newText) - } - } - - /** Updates the "moduleCheck" version in package.json. */ - target.tasks.register("checkWebsitePackageJsonVersion") { task -> - - task.description = "Checks the \"ModuleCheck\" version in package.json" - task.group = "website" - - task.doLast { - - val oldText = target.websitePackageJson.readText() - val newText = oldText.updatePackageJsonVersion() - require(oldText == newText) { - "The website package.json version is out of date. " + - "Run `./gradlew updateWebsitePackageJsonVersion` to update." - } - } - } - - val updateVersionRefs = target.tasks - .register("updateProjectReadmeVersionRefs") { task -> - - task.description = "Checks the project-level README for version changes" - task.group = "documentation" - - task.doLast { - - target.readme.updateModuleCheckVersionRef(version = VERSION_NAME, failOnChanges = false) - } - } - - target.tasks.register("checkProjectReadmeVersionRefs") { task -> - - task.description = - "Updates the project-level README to use the latest published version in maven coordinates" - task.group = "documentation" - - task.mustRunAfter(updateVersionRefs) - - task.doLast { - - target.readme.updateModuleCheckVersionRef( - version = VERSION_NAME, - failOnChanges = true, - updateTaskName = "updateProjectReadmeVersionRefs" - ) - } - } - - target.tasks.register("pnpmInstall", Exec::class.java) { task -> - - task.description = "runs `pnpm install` for the website" - task.group = "website" - - task.workingDir(target.websiteDir) - task.commandLine("pnpm", "install") - } - - target.tasks.register("updateWebsiteApiDocs", Sync::class.java) { task -> - - task.description = "creates new Dokka api docs and copies them to the website's static dir" - task.group = "website" - - task.dependsOn(target.tasks.findByName("knit")) - - task.from(target.tasks.named(DokkaConventionPlugin.DOKKA_HTML_TASK_NAME)) - - task.into(target.websiteApiDir) - } - - val updateWebsiteChangelog = - target.tasks.register("updateWebsiteChangelog") { task -> - - task.description = - "copies the root project's CHANGELOG to the website and updates its formatting" - task.group = "website" - - task.inputs.file(target.changelog) - task.outputs.file(target.websiteChangelog) - - task.doLast { - - // add one hash mark to each header, because GitHub and Docusaurus render them differently - val newText = target.changelog.readText() - .lines() - .joinToString("\n") { line -> - line.replace("^(#+) (.*)".toRegex()) { matchResult -> - val (hashes, text) = matchResult.destructured - - "$hashes# $text" - } - // relativize all links? - .remove(DOCS_WEBSITE) - } - - require(!newText.contains("http://localhost:3000")) { - "Don't forget to remove the hard-coded local development site root " + - "(`http://localhost:3000`) from the ChangeLog." - } - - target.websiteChangelog.writeText(newText) - } - } - - val versionDocs = target.tasks.register("versionDocs", Exec::class.java) { task -> - - task.description = "creates a new version snapshot of website docs, " + - "using the current version defined in gradle.properties" - task.group = "website" - - val existingVersions = - "\"([^\"]*)\"".toRegex() - .findAll(target.websitePackageJson.readText()) - .flatMap { it.destructured.toList() } - - val devVersions = ".*(?:-SNAPSHOT|-LOCAL)".toRegex() - - val version = VERSION_NAME - - task.enabled = version !in existingVersions && !version.matches(devVersions) - - task.workingDir(target.websiteDir) - task.commandLine("pnpm", "docusaurus", "docs:version", version) - } - - target.tasks.register("startSite", Exec::class.java) { task -> - - task.description = "launches the local development website" - task.group = "website" - - task.dependsOn( - "pnpmInstall", - versionDocs, - "updateWebsiteApiDocs", - updateWebsiteChangelog, - "updateWebsiteNextDocsVersionRefs", - "updateWebsitePackageJsonVersion" - ) - - task.workingDir(target.websiteDir) - task.commandLine("pnpm", "start") - } - - target.tasks.register("buildSite", Exec::class.java) { task -> - - task.description = "builds the website" - task.group = "website" - - task.dependsOn( - "pnpmInstall", - versionDocs, - "updateWebsiteApiDocs", - updateWebsiteChangelog, - "updateWebsiteNextDocsVersionRefs", - "updateWebsitePackageJsonVersion" - ) - - task.workingDir(target.websiteDir) - task.commandLine("pnpm", "build") - } - } - - private fun String.updatePackageJsonVersion(): String { - // this isn't very robust, but it's fine for this use-case - val versionReg = """(\s*"version"\s*:\s*")[^"]*("\s*,)""".toRegex() - - // just in case some child object gets a "version" field, ignore it. - // This only works if the correct field comes first (which it does). - var foundOnce = false - - return lineSequence() - .joinToString("\n") { line -> - - line.replace(versionReg) { matchResult -> - - if (!foundOnce) { - foundOnce = true - val (prefix, suffix) = matchResult.destructured - "$prefix$VERSION_NAME$suffix" - } else { - line - } - } - } - } - - private fun File.updateModuleCheckVersionRef( - version: String, - failOnChanges: Boolean, - updateTaskName: String = "" - ) { - val group = GROUP - - val pluginId = PLUGIN_ID - - val pluginRegex = - """^([^'"\n]*['"])$pluginId[^'"]*(['"].*) version (['"])[^'"]*(['"].*)${'$'}""".toRegex() - val moduleRegex = """^([^'"\n]*['"])$group:([^:]*):[^'"]*(['"].*)${'$'}""".toRegex() - - val oldText = readText() - - val newText = oldText - .lines() - .joinToString("\n") { line -> - line - .replace(pluginRegex) { matchResult -> - - val (preId, postId, preVersion, postVersion) = matchResult.destructured - - "$preId$pluginId$postId version $preVersion$version$postVersion" - } - .replace(moduleRegex) { matchResult -> - - val (config, module, suffix) = matchResult.destructured - - "$config$group:$module:$version$suffix" - } - } - - require(oldText == newText || !failOnChanges) { - "ModuleCheck version references in $path are out of date. " + - "Run `./gradlew $updateTaskName` to update." - } - - writeText(newText) - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/anvil.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/anvil.kt deleted file mode 100644 index 43680c170e..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/anvil.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.applyOnce -import org.gradle.api.GradleException -import org.gradle.api.Project -import org.gradle.api.artifacts.ExternalDependency - -fun Project.applyAnvil() { - - pluginManager.withPlugin("org.jetbrains.kotlin.kapt") { - throw GradleException( - "Don't use `mcbuild.anvil()` if kapt is also being applied. Just use `dagger()`." - ) - } - - plugins.applyOnce("com.squareup.anvil") - - extensions.configure(com.squareup.anvil.plugin.AnvilExtension::class.java) { - it.generateDaggerFactories.set(true) // default is false - } - - dependencies.add("compileOnly", project.libs.javax.inject) - dependencies.add("compileOnly", project.libs.google.dagger.api) - - // Anvil adds its annotations artifact as 'implementation', which is unnecessary. - // Replace it with a 'compileOnly' dependency. - dependencies.add("compileOnly", project.libs.square.anvil.annotations) - afterEvaluate { - configurations.named("implementation") { - val annotations = project.libs.square.anvil.annotations.get() - - it.dependencies.removeIf { dep -> - dep is ExternalDependency && dep.group == annotations.group && dep.name == annotations.name - } - } - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/dagger.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/dagger.kt deleted file mode 100644 index e8782db0ae..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/dagger.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.applyOnce -import org.gradle.api.Project - -fun Project.applyDagger() { - plugins.applyOnce("org.jetbrains.kotlin.kapt") - plugins.applyOnce("com.squareup.anvil") - - dependencies.add("compileOnly", project.libs.javax.inject) - dependencies.add("compileOnly", project.libs.google.dagger.api) - dependencies.add("kapt", project.libs.google.dagger.compiler) -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/dependencyGuardAggregate/DependencyGuardAggregateTask.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/dependencyGuardAggregate/DependencyGuardAggregateTask.kt deleted file mode 100644 index 01e8bbcf2f..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/dependencyGuardAggregate/DependencyGuardAggregateTask.kt +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.dependencyGuardAggregate - -import org.gradle.api.DefaultTask -import org.gradle.api.file.RegularFileProperty -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.OutputFile -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity.RELATIVE -import org.gradle.api.tasks.SourceTask -import org.gradle.api.tasks.TaskAction -import org.jetbrains.kotlin.util.prefixIfNot -import java.io.File - -abstract class DependencyGuardAggregateTask : SourceTask() { - - @get:Internal - abstract val rootDir: RegularFileProperty - - @get:OutputFile - abstract val outputFile: RegularFileProperty - - @TaskAction - fun combine() { - val rootFile = rootDir.asFile.get() - - val newText = source.files - .map { file -> - - val relative = file.relativeTo(rootFile) - - val moduleDir = relative.parentFile.parentFile!! - - val modulePath = moduleDir.path.replace(File.separator, ":") - .prefixIfNot(":") - - val classpath = file.nameWithoutExtension - - Triple(modulePath, classpath, file) - } - .joinToString("\n\n") { (modulePath, classpath, file) -> - val prefix = "$modulePath -- $classpath" - - val lines = file.readText() - .lines() - .filterNot { it.isBlank() } - - file.deleteAndDeleteEmptyParents() - - lines.joinToString("\n") { "$prefix -- $it" } - } - - outputFile.get().asFile.writeText(newText) - } -} - -abstract class DependencyGuardExplodeTask : DefaultTask() { - - @get:InputFile - @get:PathSensitive(RELATIVE) - abstract val aggregateFile: RegularFileProperty - - @get:Internal - abstract val rootDir: RegularFileProperty - - @TaskAction - fun combine() { - val agText = aggregateFile.asFile.get().readText() - - val split = agText.lines() - .filterNot { it.isBlank() } - .map { line -> - line.split(" -- ") - .map { segment -> segment.trim() } - .let { (path, classpath, dependency) -> - Triple(path, classpath, dependency) - } - } - - val pathToSplit = split.groupBy { (path, _, _) -> - path - } - .mapValues { (_, triples) -> - triples.map { it.second to it.third } - .groupBy { it.first } - .mapValues { (_, pairs) -> - pairs.map { it.second } - } - } - - val rootFile = rootDir.get().asFile - - pathToSplit.forEach { (path, classpathToDepsMap) -> - - val relative = path.removePrefix(":") - .replace(":", File.separator) - - val dependenciesDir = rootFile.resolve(relative).resolve("dependencies") - .also { it.mkdirs() } - - classpathToDepsMap - .forEach { (classpath, lines) -> - val text = lines.joinToString("\n", postfix = "\n") - - dependenciesDir.resolve("$classpath.txt").writeText(text) - } - } - } -} - -fun File.deleteAndDeleteEmptyParents() { - when { - isFile -> delete() - exists() && isDirectory && listFiles().isNullOrEmpty() -> delete() - else -> return - } - - parentFile?.deleteAndDeleteEmptyParents() -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/publishing.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/publishing.kt deleted file mode 100644 index 9e8641bf8b..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/publishing.kt +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.mustRunAfter -import com.rickbusarow.kgx.registerOnce -import com.vanniktech.maven.publish.GradlePlugin -import com.vanniktech.maven.publish.JavadocJar.Dokka -import com.vanniktech.maven.publish.KotlinJvm -import com.vanniktech.maven.publish.MavenPublishBaseExtension -import com.vanniktech.maven.publish.SonatypeHost.Companion.DEFAULT -import kotlinx.validation.ApiValidationExtension -import org.gradle.api.NamedDomainObjectProvider -import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.api.publish.maven.tasks.PublishToMavenRepository -import org.gradle.api.tasks.bundling.Jar -import org.gradle.language.base.plugins.LifecycleBasePlugin -import org.gradle.plugin.devel.GradlePluginDevelopmentExtension -import org.gradle.plugin.devel.PluginDeclaration -import org.gradle.plugins.signing.Sign -import org.jetbrains.dokka.gradle.AbstractDokkaLeafTask - -interface PublishingExtension { - - fun Project.published( - artifactId: String, - pomDescription: String = "Fast dependency graph linting for Gradle projects" - ) { - - plugins.apply("com.vanniktech.maven.publish.base") - plugins.apply("mcbuild.dokka") - - require(pluginManager.hasPlugin("org.jetbrains.kotlin.jvm")) - - configurePublish( - artifactId = artifactId, - pomDescription = pomDescription, - groupId = GROUP - ) - } - - fun Project.publishedPlugin( - pluginDeclaration: NamedDomainObjectProvider<PluginDeclaration>, - groupId: String = GROUP - ) { - - plugins.apply("com.vanniktech.maven.publish.base") - plugins.apply("mcbuild.dokka") - - require(pluginManager.hasPlugin("org.jetbrains.kotlin.jvm")) - require(pluginManager.hasPlugin("java-gradle-plugin")) - - plugins.apply("com.gradle.plugin-publish") - - configurePublishPlugin(groupId, pluginDeclaration) - } -} - -private fun Project.configurePublishPlugin( - groupId: String, - pluginDeclaration: NamedDomainObjectProvider<PluginDeclaration> -) { - applyBinaryCompatibility() - - group = groupId - - plugins.withId("com.gradle.plugin-publish") { - - pluginDeclaration.configure { declaration -> - - requireNotNull(declaration.description) { "A plugin description is required." } - - extensions.configure( - GradlePluginDevelopmentExtension::class.java - ) { pluginDevelopmentExtension -> - - @Suppress("UnstableApiUsage") - pluginDevelopmentExtension.website.set(SOURCE_WEBSITE) - @Suppress("UnstableApiUsage") - pluginDevelopmentExtension.vcsUrl.set("$SOURCE_WEBSITE.git") - } - } - } -} - -fun Project.applyBinaryCompatibility() { - - pluginManager.apply("org.jetbrains.kotlinx.binary-compatibility-validator") - - extensions.configure(ApiValidationExtension::class.java) { extension -> - - // Packages that are excluded from public API dumps even if they contain public API - extension.ignoredPackages = mutableSetOf("sample", "samples") - - // Subprojects that are excluded from API validation - extension.ignoredProjects = mutableSetOf() - } - - tasks.named("apiCheck").mustRunAfter("apiDump") -} - -private fun Project.configurePublish(artifactId: String, pomDescription: String, groupId: String) { - - version = VERSION_NAME - - this@configurePublish.artifactId = artifactId - - extensions.configure(MavenPublishBaseExtension::class.java) { extension -> - - extension.publishToMavenCentral(DEFAULT, automaticRelease = true) - - extension.signAllPublications() - - extension.pom { mavenPom -> - mavenPom.description.set("Fast dependency graph linting for Gradle projects") - mavenPom.name.set(artifactId) - mavenPom.url.set(SOURCE_WEBSITE) - mavenPom.licenses { licenseSpec -> - licenseSpec.license { pomLicense -> - pomLicense.name.set("The Apache Software License, Version 2.0") - pomLicense.url.set("https://www.apache.org/licenses/LICENSE-2.0.txt") - pomLicense.distribution.set("repo") - } - } - mavenPom.scm { scm -> - scm.url.set("$SOURCE_WEBSITE/") - scm.connection.set("scm:git:git://github.com/rbusarow/ModuleCheck.git") - scm.developerConnection.set("scm:git:ssh://git@github.com/rbusarow/ModuleCheck.git") - } - mavenPom.developers { developerSpec -> - developerSpec.developer { developer -> - developer.id.set("rbusarow") - developer.name.set("Rick Busarow") - } - } - } - - when { - // The plugin-publish plugin handles its artifacts - pluginManager.hasPlugin("com.gradle.plugin-publish") -> {} - - // handle publishing plugins if they're not going to the plugin portal - pluginManager.hasPlugin("java-gradle-plugin") -> { - extension.configure( - GradlePlugin( - javadocJar = Dokka(taskName = "dokkaGenerateModuleHtml"), - sourcesJar = true - ) - ) - } - - pluginManager.hasPlugin("com.github.johnrengelman.shadow") -> { - extension.configure( - KotlinJvm( - javadocJar = Dokka(taskName = "dokkaGenerateModuleHtml"), - sourcesJar = true - ) - ) - applyBinaryCompatibility() - } - - else -> { - extension.configure( - KotlinJvm( - javadocJar = Dokka(taskName = "dokkaGenerateModuleHtml"), - sourcesJar = true - ) - ) - applyBinaryCompatibility() - } - } - - extensions.configure(PublishingExtension::class.java) { publishingExtension -> - publishingExtension.publications.withType(MavenPublication::class.java) - .configureEach { publication -> - publication.artifactId = artifactId - publication.pom.description.set(pomDescription) - publication.groupId = groupId - } - } - } - - registerCoordinatesStringsCheckTask(groupId = groupId, artifactId = artifactId) - registerSnapshotVersionCheckTask() - configureSkipDokka() - - tasks.withType(PublishToMavenRepository::class.java).configureEach { - it.notCompatibleWithConfigurationCache("See https://github.com/gradle/gradle/issues/13468") - } - tasks.withType(Jar::class.java).configureEach { - it.notCompatibleWithConfigurationCache("") - } - tasks.withType(Sign::class.java).configureEach { - it.notCompatibleWithConfigurationCache("") - // skip signing for -SNAPSHOT publishing - it.onlyIf { !(version as String).endsWith("SNAPSHOT") } - } -} - -private fun Project.registerCoordinatesStringsCheckTask(groupId: String, artifactId: String) { - - val checkTask = tasks.registerOnce( - "checkMavenCoordinatesStrings", - ModuleCheckBuildTask::class.java - ) { task -> - task.group = "publishing" - task.description = "checks that the project's maven group and artifact ID are valid for Maven" - - task.doLast { - - val allowedRegex = "^[A-Za-z0-9_\\-.]+$".toRegex() - - check(groupId.matches(allowedRegex)) { - - val actualString = when { - groupId.isEmpty() -> "<<empty string>>" - else -> groupId - } - "groupId ($actualString) is not a valid Maven identifier ($allowedRegex)." - } - - check(artifactId.matches(allowedRegex)) { - - val actualString = when { - artifactId.isEmpty() -> "<<empty string>>" - else -> artifactId - } - "artifactId ($actualString) is not a valid Maven identifier ($allowedRegex)." - } - } - } - - tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME) { task -> - task.dependsOn(checkTask) - } -} - -private fun Project.registerSnapshotVersionCheckTask() { - tasks.registerOnce( - "checkVersionIsSnapshot", - ModuleCheckBuildTask::class.java - ) { task -> - task.group = "publishing" - task.description = "ensures that the project version has a -SNAPSHOT suffix" - val versionString = version as String - task.doLast { - val expected = "-SNAPSHOT" - require(versionString.endsWith(expected)) { - "The project's version name must be suffixed with `$expected` when checked in" + - " to the main branch, but instead it's `$versionString`." - } - } - } - tasks.registerOnce("checkVersionIsNotSnapshot", ModuleCheckBuildTask::class.java) { task -> - task.group = "publishing" - task.description = "ensures that the project version does not have a -SNAPSHOT suffix" - val versionString = version as String - task.doLast { - require(!versionString.endsWith("-SNAPSHOT")) { - "The project's version name cannot have a -SNAPSHOT suffix, but it was $versionString." - } - } - } -} - -/** - * Integration tests require `publishToMavenLocal`, but they definitely don't need - * Dokka output, and generating kdoc for everything takes forever -- especially - * on a GitHub Actions server. So for integration tests, skip Dokka tasks. - */ -private fun Project.configureSkipDokka() { - - if (tasks.names.contains("setSkipDokka")) { - return - } - - var skipDokka = false - val setSkipDokka = tasks.register( - "setSkipDokka", - ModuleCheckBuildTask::class.java - ) { task -> - - task.group = "publishing" - task.description = "sets `skipDokka` to true before `publishToMavenLocal` is evaluated." - - task.doFirst { skipDokka = true } - task.onlyIf { true } - } - - tasks.register("publishToMavenLocalNoDokka", ModuleCheckBuildTask::class.java) { - - it.group = "publishing" - it.description = "Delegates to `publishToMavenLocal`, " + - "but skips Dokka generation and does not include a javadoc .jar." - - it.doFirst { skipDokka = true } - it.dependsOn(setSkipDokka) - it.onlyIf { true } - it.dependsOn("publishToMavenLocal") - } - - tasks.matching { it.name == "javaDocReleaseGeneration" }.configureEach { - it.onlyIf { !skipDokka } - } - tasks.withType(AbstractDokkaLeafTask::class.java).configureEach { - it.onlyIf { !skipDokka } - } - - tasks.named("publishToMavenLocal") { - it.mustRunAfter(setSkipDokka) - } -} diff --git a/build-logic/conventions/src/main/kotlin/modulecheck/builds/shards/ShardMatrixYamlCheckTask.kt b/build-logic/conventions/src/main/kotlin/modulecheck/builds/shards/ShardMatrixYamlCheckTask.kt deleted file mode 100644 index 1682ac6f59..0000000000 --- a/build-logic/conventions/src/main/kotlin/modulecheck/builds/shards/ShardMatrixYamlCheckTask.kt +++ /dev/null @@ -1,171 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.shards - -import com.rickbusarow.kgx.dependsOn -import modulecheck.builds.BaseYamlMatrixTask -import modulecheck.builds.diffString -import modulecheck.builds.getFinal -import org.gradle.api.Project -import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.VerificationTask -import org.gradle.internal.logging.text.StyledTextOutput -import org.gradle.language.base.plugins.LifecycleBasePlugin -import java.io.File -import javax.inject.Inject - -abstract class ShardMatrixYamlCheckTask @Inject constructor( - objectFactory: ObjectFactory -) : BaseYamlMatrixTask(objectFactory), VerificationTask { - - @get:Input - abstract val numShards: Property<Int> - - @get:Input - abstract val updateTaskName: Property<String> - - @TaskAction - fun check() { - val ciFile = requireCiFile() - - val ciText = ciFile.readText() - val pattern = matrixSectionRegex - - val newText = ciText.replace(pattern) { match -> - - val (indent, startTag, _, closingLine) = match.destructured - - val newContent = createYaml(indent, numShards.get()) - - "$indent$startTag$newContent$closingLine" - } - - if (ciText != newText) { - val message = "The test shard matrix in the CI file is out of date. " + - "Run ./gradlew ${updateTaskName.getFinal()} to automatically update." + - "\n\tfile://${yamlFile.get()}" - - createStyledOutput() - .withStyle(StyledTextOutput.Style.Description) - .println(message) - - println() - println(diffString(ciText, newText)) - println() - - require(false) - } - } -} - -fun Project.registerYamlShardsTasks( - shardCount: Int, - startTagName: String, - endTagName: String, - taskNamePart: String, - yamlFile: File -) { - - require(yamlFile.exists()) { - "Could not resolve '$yamlFile'." - } - - val updateTask = tasks.register( - "${taskNamePart}ShardMatrixYamlUpdate", - ShardMatrixYamlUpdateTask::class.java - ) { task -> - task.yamlFile.set(yamlFile) - task.numShards.set(shardCount) - task.startTagProperty.set(startTagName) - task.endTagProperty.set(endTagName) - } - - tasks.named("fix").dependsOn(updateTask) - - val checkTask = tasks.register( - "${taskNamePart}ShardMatrixYamlCheck", - ShardMatrixYamlCheckTask::class.java - ) { task -> - task.yamlFile.set(yamlFile) - task.numShards.set(shardCount) - task.startTagProperty.set(startTagName) - task.endTagProperty.set(endTagName) - task.updateTaskName.set(updateTask.name) - task.mustRunAfter(updateTask) - } - - // Automatically run the check task when running `check` - tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(checkTask) -} - -abstract class ShardMatrixYamlUpdateTask @Inject constructor( - objectFactory: ObjectFactory -) : BaseYamlMatrixTask(objectFactory) { - - @get:Input - abstract val numShards: Property<Int> - - @TaskAction - fun execute() { - val ciFile = requireCiFile() - - val ciText = ciFile.readText() - val pattern = matrixSectionRegex - - val newText = ciText.replace(pattern) { match -> - - val (indent, startTag, _, closingLine) = match.destructured - - val newContent = createYaml(indent, numShards.get()) - - "$indent$startTag$newContent$closingLine" - } - - if (ciText != newText) { - - ciFile.writeText(newText) - - val message = "Updated the test shard matrix in the CI file." + - "\n\tfile://${yamlFile.get()}" - - createStyledOutput() - .withStyle(StyledTextOutput.Style.Description) - .println(message) - - println() - println(diffString(ciText, newText)) - println() - } - } -} - -private fun createYaml(indent: String, numShards: Int): String { - - val shardList = buildString { - append("[ ") - repeat(numShards) { - val i = it + 1 - append("$i") - if (i < numShards) append(", ") - } - append(" ]") - } - - return "${indent}shardNum: $shardList\n" -} diff --git a/build-logic/core/build.gradle.kts b/build-logic/core/build.gradle.kts deleted file mode 100644 index 3ddb907a04..0000000000 --- a/build-logic/core/build.gradle.kts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - kotlin("jvm") - alias(libs.plugins.google.ksp) -} - -dependencies { - - api(files(libs::class.java.protectionDomain.codeSource.location)) - - api(libs.java.diff.utils) - api(libs.rickBusarow.kgx) - - compileOnly(gradleApi()) - - compileOnly(libs.kotlin.gradle.plugin) - - implementation(libs.google.auto.common) - implementation(libs.google.auto.service.annotations) - implementation(libs.google.ksp) - implementation(libs.ktlint.ruleset.standard) - implementation(libs.rickBusarow.ktlint) - - ksp(libs.zacSweers.auto.service.ksp) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.ktlint.test) -} diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/BaseYamlMatrixTask.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/BaseYamlMatrixTask.kt deleted file mode 100644 index f06e2088be..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/BaseYamlMatrixTask.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import org.gradle.api.DefaultTask -import org.gradle.api.model.ObjectFactory -import org.gradle.api.provider.Property -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.InputFile -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.PathSensitive -import org.gradle.api.tasks.PathSensitivity.RELATIVE -import org.gradle.internal.logging.text.StyledTextOutput -import org.gradle.internal.logging.text.StyledTextOutput.Style.Description -import org.gradle.internal.logging.text.StyledTextOutputFactory -import java.io.File -import javax.inject.Inject -import kotlin.LazyThreadSafetyMode.NONE - -abstract class BaseYamlMatrixTask @Inject constructor( - objectFactory: ObjectFactory -) : DefaultTask() { - - @get:InputFile - @get:PathSensitive(RELATIVE) - val yamlFile = objectFactory.fileProperty() - - @get:Input abstract val startTagProperty: Property<String> - private val startTag: String - get() = startTagProperty.get() - - @get:Input abstract val endTagProperty: Property<String> - private val endTag: String - get() = endTagProperty.get() - - @get:Internal - protected val matrixSectionRegex by lazy(NONE) { - - val startTagEscaped = Regex.escape(startTag) - val endTagEscaped = Regex.escape(endTag) - - Regex("""( *)(.*$startTagEscaped.*\n)([\s\S]+?)(.*$endTagEscaped)""") - } - - protected fun getYamlSections(ciText: String) = matrixSectionRegex - .findAll(ciText) - .also { matches -> - - if (!matches.iterator().hasNext()) { - val message = - "Couldn't find any `$startTag`/`$endTag` sections in the CI file:" + - "\tfile://${yamlFile.get()}\n\n" + - "\tSurround the matrix section with the comments '$startTag' and `$endTag':\n\n" + - "\t strategy:\n" + - "\t ### $startTag\n" + - "\t matrix:\n" + - "\t [ ... ]\n" + - "\t ### $endTag\n" - - createStyledOutput() - .withStyle(Description) - .println(message) - - require(false) - } - } - - protected fun createStyledOutput(): StyledTextOutput = services - .get(StyledTextOutputFactory::class.java) - .create("mcbuild-yaml-matrix") - - protected fun requireCiFile(): File { - val ciFile = yamlFile.get().asFile - - require(ciFile.exists()) { - "Could not resolve file: file://$ciFile" - } - - return ciFile - } -} diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/ModuleCheckBuildTask.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/ModuleCheckBuildTask.kt deleted file mode 100644 index 40fc8b430d..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/ModuleCheckBuildTask.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import org.gradle.api.DefaultTask - -abstract class ModuleCheckBuildTask : DefaultTask() -abstract class ModuleCheckBuildCodeGeneratorTask : ModuleCheckBuildTask() diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/catalogs.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/catalogs.kt deleted file mode 100644 index 684381c48e..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/catalogs.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.extras -import com.rickbusarow.kgx.getOrNullAs -import org.gradle.accessors.dm.LibrariesForLibs -import org.gradle.api.Project - -val Project.libs: LibrariesForLibs - get() = extensions.getByType(LibrariesForLibs::class.java) - -val Project.VERSION_NAME_STABLE: String - get() = libs.versions.rickBusarow.moduleCheck.get() - -@Suppress("UnusedReceiverParameter") -val Project.VERSION_NAME: String - get() = modulecheck.builds.VERSION_NAME - -const val GROUP = "com.rickbusarow.modulecheck" -const val PLUGIN_ID = "com.rickbusarow.module-check" -const val VERSION_NAME = "0.13.0-SNAPSHOT" -const val SOURCE_WEBSITE = "https://github.com/rickbusarow/ModuleCheck" -const val DOCS_WEBSITE = "https://rickbusarow.github.io/ModuleCheck" - -var Project.artifactId: String? - get() = extras.getOrNullAs("artifactId") - set(value) { - extras.set("artifactId", value) - } - -/** "1.6", "1.7", "1.8", etc. */ -val Project.KOTLIN_API: String - get() = libs.versions.kotlinApi.get() - -/** - * the jdk used in packaging - * - * "1.6", "1.8", "11", etc. - */ -val Project.JVM_TARGET: String - get() = libs.versions.jvmTarget.get() - -/** - * the jdk used to build the project - * - * "1.6", "1.8", "11", etc. - */ -val Project.JDK: String - get() = libs.versions.jdk.get() - -/** `6`, `8`, `11`, etc. */ -val Project.JVM_TARGET_INT: Int - get() = JVM_TARGET.substringAfterLast('.').toInt() diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/diff.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/diff.kt deleted file mode 100644 index dbd7e4f85c..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/diff.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.github.difflib.text.DiffRow.Tag -import com.github.difflib.text.DiffRowGenerator -import modulecheck.builds.Color.Companion.colorized -import modulecheck.builds.Color.LIGHT_GREEN -import modulecheck.builds.Color.LIGHT_YELLOW - -fun diffString(oldStr: String, newStr: String): String { - - return buildString { - - val rows = DiffRowGenerator.create() - .showInlineDiffs(true) - .inlineDiffByWord(true) - .oldTag { _: Boolean? -> "" } - .newTag { _: Boolean? -> "" } - .build() - .generateDiffRows(oldStr.lines(), newStr.lines()) - - val linePadding = rows.size.toString().length + 1 - - rows.forEachIndexed { line, diffRow -> - if (diffRow.tag != Tag.EQUAL) { - append("line ${line.inc().toString().padEnd(linePadding)} ") - } - - if (diffRow.tag == Tag.CHANGE || diffRow.tag == Tag.DELETE) { - appendLine("-- ${diffRow.oldLine}".colorized(LIGHT_YELLOW)) - } - if (diffRow.tag == Tag.CHANGE) { - append(" " + " ".repeat(linePadding)) - } - if (diffRow.tag == Tag.CHANGE || diffRow.tag == Tag.INSERT) { - appendLine("++ ${diffRow.newLine}".colorized(LIGHT_GREEN)) - } - } - } -} - -@Suppress("MagicNumber") -internal enum class Color(val code: Int) { - LIGHT_GREEN(92), - LIGHT_YELLOW(93); - - companion object { - - private val supported = "win" !in System.getProperty("os.name").lowercase() - - fun String.colorized(color: Color) = if (supported) { - "\u001B[${color.code}m$this\u001B[0m" - } else { - this - } - } -} diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/file.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/file.kt deleted file mode 100644 index 2aa4199ed1..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/file.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import java.io.File -import java.util.zip.ZipEntry -import java.util.zip.ZipFile - -/** Compares the contents of two zip files, ignoring metadata like timestamps. */ -fun File.zipContentEquals(other: File): Boolean { - - require(extension == "zip") { "This file is not a zip file: file://$path" } - require(other.extension == "zip") { "This file is not a zip file: file://$other" } - - fun ZipFile.getZipEntries(): Set<ZipEntry> { - return entries() - .asSequence() - .filter { !it.isDirectory } - .toHashSet() - } - - return ZipFile(this).use { zip1 -> - ZipFile(other).use use2@{ zip2 -> - - val zip1Entries = zip1.getZipEntries() - val zip1Names = zip1Entries.mapTo(mutableSetOf()) { it.name } - val zip2Entries = zip2.getZipEntries() - val zip2Names = zip2Entries.mapTo(mutableSetOf()) { it.name } - - // Check if any file is contained in one archive but not the other - if (zip1Names != zip2Names) { - return@use false - } - - // Check if the contents of any files with the same path are different - for (file in zip1Names) { - val zip1Entry = zip1.getEntry(file) - val zip2Entry = zip2.getEntry(file) - - if (zip1Entry.size != zip2Entry.size) { - return@use false - } - - val inputStream1 = zip1.getInputStream(zip1Entry) - val inputStream2 = zip2.getInputStream(zip2Entry) - val content1 = inputStream1.readBytes() - val content2 = inputStream2.readBytes() - inputStream1.close() - inputStream2.close() - - if (!content1.contentEquals(content2)) { - return@use false - } - } - return@use true - } - } -} diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/project.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/project.kt deleted file mode 100644 index a3a7b06d16..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/project.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.google.devtools.ksp.gradle.KspTaskJvm -import com.rickbusarow.kgx.EagerGradleApi -import com.rickbusarow.kgx.maybeNamed -import org.gradle.api.Project -import org.gradle.api.Task -import org.gradle.api.tasks.TaskProvider - -fun Project.registerSimpleGenerationTaskAsDependency( - sourceSetName: String, - taskProvider: TaskProvider<out Task> -) { - val kotlinTaskSourceSetName = when (sourceSetName) { - "main" -> "" - else -> sourceSetName.capitalize() - } - - val ktlintSourceSetName = sourceSetName.capitalize() - - setOf( - "compile${kotlinTaskSourceSetName}Kotlin", - "sourcesJar", - "javaSourcesJar", - "lintKotlin$ktlintSourceSetName", - "formatKotlin$ktlintSourceSetName", - "runKtlintCheckOver${ktlintSourceSetName}SourceSet", - "runKtlintFormatOver${ktlintSourceSetName}SourceSet" - ).forEach { taskName -> - - @OptIn(EagerGradleApi::class) - tasks.maybeNamed(taskName) { it.dependsOn(taskProvider) } - } - - tasks.withType(KspTaskJvm::class.java).configureEach { it.dependsOn(taskProvider) } - - // generate the build properties file during an IDE sync, so no more red squigglies - rootProject.tasks.named("prepareKotlinBuildScriptModel") { - it.dependsOn(taskProvider) - } -} diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/properties.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/properties.kt deleted file mode 100644 index 655afa034e..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/properties.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import org.gradle.api.provider.Property - -fun <T> Property<T>.getFinal(): T { - finalizeValueOnRead() - disallowChanges() - return get() -} diff --git a/build-logic/core/src/main/kotlin/modulecheck/builds/string.kt b/build-logic/core/src/main/kotlin/modulecheck/builds/string.kt deleted file mode 100644 index de4e3eefdd..0000000000 --- a/build-logic/core/src/main/kotlin/modulecheck/builds/string.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import org.gradle.util.internal.TextUtil -import java.util.Locale - -val SEMVER_REGEX = buildString { - append("(?:0|[1-9]\\d*)\\.") - append("(?:0|[1-9]\\d*)\\.") - append("(?:0|[1-9]\\d*)") - append("(?:-(?:(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)") - append("(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?") - append("(?:\\+(?:[0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?") -} - -/** Replaces the deprecated Kotlin version, but hard-codes `Locale.US` */ -fun String.capitalize(): String = replaceFirstChar { - if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString() -} - -/** Replaces the deprecated Kotlin version, but hard-codes `Locale.US` */ -fun String.decapitalize(): String = replaceFirstChar { - if (it.isUpperCase()) it.lowercase(Locale.US) else it.toString() -} - -/** - * Removes trailing whitespaces from all lines in a string. - * - * Shorthand for `lines().joinToString("\n") { it.trimEnd() }` - */ -fun String.trimLineEnds(): String = mapLines { it.trimEnd() } - -/** performs [transform] on each line */ -fun String.mapLines(transform: (String) -> CharSequence): String = lineSequence() - .joinToString("\n", transform = transform) - -fun String.normaliseLineSeparators(): String = TextUtil.convertLineSeparatorsToUnix(this) - -fun String.prefixIfNot(prefix: String) = if (this.startsWith(prefix)) this else "$prefix$this" - -fun CharSequence.normaliseLineSeparators(): String { - return when (this) { - is String -> TextUtil.convertLineSeparatorsToUnix(this) - else -> TextUtil.convertLineSeparatorsToUnix(toString()) - } -} - -/** shorthand for `replace(___, "")` against multiple tokens */ -fun String.remove(vararg strings: String): String = strings.fold(this) { acc, string -> - acc.replace(string, "") -} - -/** shorthand for `replace(___, "")` against multiple tokens */ -fun String.remove(vararg regex: Regex): String = regex.fold(this) { acc, reg -> - acc.replace(reg, "") -} diff --git a/build-logic/gradle.properties b/build-logic/gradle.properties deleted file mode 100644 index 6e8a73fe44..0000000000 --- a/build-logic/gradle.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (C) 2021-2023 Rick Busarow -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -org.gradle.jvmargs=-Xmx12g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -org.gradle.daemon=true -org.gradle.caching=true -org.gradle.parallel=true -org.gradle.vfs.watch=true -android.useAndroidX=true -kotlin.code.style=official -kotlin.caching.enabled=true -kotlin.incremental=true -kapt.include.compile.classpath=false diff --git a/build-logic/mcbuild/build.gradle.kts b/build-logic/mcbuild/build.gradle.kts deleted file mode 100644 index 816a4afe49..0000000000 --- a/build-logic/mcbuild/build.gradle.kts +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -buildscript { - dependencies { - // Gradle 7.6 has a dependency resolution bug which tries to use Kotlin 1.7.10 - // for transitive dependencies like `sam-with-receiver`. - // https://github.com/gradle/gradle/issues/22510 - classpath(libs.kotlin.sam.with.receiver) - } -} - -plugins { - kotlin("jvm") - alias(libs.plugins.google.ksp) - id("java-gradle-plugin") -} - -gradlePlugin { - plugins { - create("mcbuild") { - id = "mcbuild" - implementationClass = "modulecheck.builds.McBuildPlugin" - } - create("mcbuild.root") { - id = "mcbuild.root" - implementationClass = "modulecheck.builds.McBuildRootPlugin" - } - } -} - -dependencies { - - api(libs.rickBusarow.kgx) - api(libs.square.moshi) - - api(project(path = ":conventions")) - api(project(path = ":versions-matrix")) - - compileOnly(gradleApi()) - - compileOnly(libs.kotlin.gradle.plugin) - - implementation(libs.benManes.versions) - implementation(libs.detekt.gradle) - implementation(libs.dokka.gradle) - implementation(libs.dropbox.dependencyGuard) - implementation(libs.google.dagger.api) - implementation(libs.google.ksp) - implementation(libs.kotlin.compiler) - implementation(libs.kotlin.gradle.plugin) - implementation(libs.kotlin.reflect) - implementation(libs.kotlin.stdlib.common) - implementation(libs.kotlin.stdlib.jdk7) - implementation(libs.kotlin.stdlib.jdk8) - implementation(libs.kotlinx.knit) - implementation(libs.rickBusarow.ktlint) - implementation(libs.scabbard) - implementation(libs.square.anvil.gradle) - implementation(libs.square.kotlinPoet) - implementation(libs.vanniktech.publish) - - implementation(project(path = ":artifacts-check")) - - ksp(libs.square.moshi.codegen) -} diff --git a/build-logic/mcbuild/src/main/kotlin/modulecheck/builds/McBuildPlugin.kt b/build-logic/mcbuild/src/main/kotlin/modulecheck/builds/McBuildPlugin.kt deleted file mode 100644 index 07bcc83dbe..0000000000 --- a/build-logic/mcbuild/src/main/kotlin/modulecheck/builds/McBuildPlugin.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import com.rickbusarow.kgx.checkProjectIsRoot -import modulecheck.builds.artifacts.ArtifactsPlugin -import modulecheck.builds.matrix.VersionsMatrixYamlPlugin -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.language.base.plugins.LifecycleBasePlugin - -abstract class McBuildPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.plugins.apply(CheckPlugin::class.java) - target.plugins.apply(CleanPlugin::class.java) - target.plugins.apply(DependencyGuardConventionPlugin::class.java) - target.plugins.apply(DetektConventionPlugin::class.java) - target.plugins.apply(DokkaConventionPlugin::class.java) - target.plugins.apply(KotlinJvmConventionPlugin::class.java) - target.plugins.apply(KtLintConventionPlugin::class.java) - target.plugins.apply(TestConventionPlugin::class.java) - - target.extensions.create("mcbuild", ModuleCheckBuildExtension::class.java) - } -} - -abstract class McBuildRootPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.checkProjectIsRoot() - - target.plugins.apply(LifecycleBasePlugin::class.java) - target.plugins.apply(McBuildPlugin::class.java) - - target.plugins.apply(ArtifactsPlugin::class.java) - target.plugins.apply(BenManesVersionsPlugin::class.java) - target.plugins.apply(DependencyGuardAggregatePlugin::class.java) - target.plugins.apply(DokkaVersionArchivePlugin::class.java) - target.plugins.apply(KnitConventionPlugin::class.java) - target.plugins.apply(VersionsMatrixYamlPlugin::class.java) - target.plugins.apply(WebsitePlugin::class.java) - } -} diff --git a/build-logic/mcbuild/src/main/kotlin/modulecheck/builds/ModuleCheckBuildExtension.kt b/build-logic/mcbuild/src/main/kotlin/modulecheck/builds/ModuleCheckBuildExtension.kt deleted file mode 100644 index c30c053a1c..0000000000 --- a/build-logic/mcbuild/src/main/kotlin/modulecheck/builds/ModuleCheckBuildExtension.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds - -import modulecheck.builds.matrix.VersionsMatrixExtension -import org.gradle.api.Project -import javax.inject.Inject - -@Suppress("MemberVisibilityCanBePrivate", "UnnecessaryAbstractClass") -abstract class ModuleCheckBuildExtension @Inject constructor( - private val target: Project -) : VersionsMatrixExtension(target), - BuildPropertiesExtension, - PublishingExtension, - DiExtension { - - override fun anvil() { - target.applyAnvil() - } - - override fun dagger() { - target.applyDagger() - } - - fun ksp() { - target.pluginManager.apply("com.google.devtools.ksp") - } -} diff --git a/build-logic/project.dic b/build-logic/project.dic deleted file mode 100644 index 2c0de8705c..0000000000 --- a/build-logic/project.dic +++ /dev/null @@ -1,4 +0,0 @@ -Xcontext -Xinline -Xjvm -Xsam diff --git a/build-logic/settings.gradle.kts b/build-logic/settings.gradle.kts deleted file mode 100644 index 28ee86e901..0000000000 --- a/build-logic/settings.gradle.kts +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -rootProject.name = "build-logic" - -pluginManagement { - - val allowMavenLocal = providers - .gradleProperty("moduleCheck.allow-maven-local") - .orNull.toBoolean() - - repositories { - if (allowMavenLocal) { - logger.lifecycle("${rootProject.name} -- allowing mavenLocal for plugins") - mavenLocal() - } - mavenCentral() - google() - maven("https://plugins.gradle.org/m2/") - } -} - -val allowMavenLocal = providers - .gradleProperty("moduleCheck.allow-maven-local") - .orNull.toBoolean() - -dependencyResolutionManagement { - @Suppress("UnstableApiUsage") - repositories { - if (allowMavenLocal) { - logger.lifecycle("${rootProject.name} -- allowing mavenLocal for dependencies") - mavenLocal() - } - mavenCentral() - google() - maven("https://plugins.gradle.org/m2/") - } - - versionCatalogs { - create("libs") { - from(files("../gradle/libs.versions.toml")) - } - } -} - -include( - ":artifacts-check", - ":conventions", - ":core", - ":mcbuild", - ":versions-matrix" -) diff --git a/build-logic/versions-matrix/build.gradle.kts b/build-logic/versions-matrix/build.gradle.kts deleted file mode 100644 index 90fa214f9f..0000000000 --- a/build-logic/versions-matrix/build.gradle.kts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - base - kotlin("jvm") - alias(libs.plugins.google.ksp) - id("java-gradle-plugin") -} - -gradlePlugin { - plugins { - create("mcbuild.matrix-yaml") { - id = "mcbuild.matrix-yaml" - implementationClass = "modulecheck.builds.matrix.VersionsMatrixYamlPlugin" - } - } -} - -dependencies { - - api(libs.rickBusarow.kgx) - api(libs.square.moshi) - - api(project(path = ":core")) - - compileOnly(gradleApi()) - - compileOnly(libs.kotlin.gradle.plugin) - - implementation(libs.benManes.versions) - implementation(libs.buildconfig) - implementation(libs.detekt.gradle) - implementation(libs.dokka.gradle) - implementation(libs.dropbox.dependencyGuard) - implementation(libs.google.dagger.api) - implementation(libs.google.ksp) - implementation(libs.kotlin.compiler) - implementation(libs.kotlin.gradle.plugin) - implementation(libs.kotlin.reflect) - implementation(libs.kotlin.stdlib.common) - implementation(libs.kotlin.stdlib.jdk7) - implementation(libs.kotlin.stdlib.jdk8) - implementation(libs.kotlinx.knit) - implementation(libs.rickBusarow.ktlint) - implementation(libs.scabbard) - implementation(libs.square.anvil.gradle) - implementation(libs.square.kotlinPoet) - implementation(libs.vanniktech.publish) - implementation(libs.semVer) - - ksp(libs.square.moshi.codegen) -} diff --git a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/TestVersions.kt b/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/TestVersions.kt deleted file mode 100644 index 6b41e27077..0000000000 --- a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/TestVersions.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.matrix - -data class TestVersions( - val gradle: String, - val agp: String, - val anvil: String, - val kotlin: String -) { - override fun toString(): String { - return "[gradle $gradle, agp $agp, anvil $anvil, kotlin $kotlin]" - } -} diff --git a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrix.kt b/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrix.kt deleted file mode 100644 index c115909295..0000000000 --- a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrix.kt +++ /dev/null @@ -1,159 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.matrix - -import net.swiftzer.semver.SemVer - -class VersionsMatrix( - val gradleList: List<String>, - val agpList: List<String>, - val anvilList: List<String>, - val kotlinList: List<String> -) { - - private fun String.coerceSemVer() = split('.').let { parts -> - if (parts.size == 2) { - SemVer.parse("$this.0") - } else { - SemVer.parse(this) - } - } - - internal val exclusions = listOf<Exclusion>( - Exclusion(anvil = "2.5.0", kotlin = "2.0.21"), - *agpGradle(agp = "8.10.0", gradleMinimum = "8.11.1") - ).requireNoDuplicates() - - private fun agpGradle(agp: String, gradleMinimum: String): Array<Exclusion> { - - val minSemVer = gradleMinimum.coerceSemVer() - - return gradleList - .filter { it.coerceSemVer() < minSemVer } - .map { Exclusion(agp = agp, gradle = it) } - .toTypedArray() - } - - // ORDER MATTERS. - // ...at least with regard to Gradle. - // Gradle > AGP > Anvil > Kotlin - // By testing all the Gradle versions together, TestKit doesn't have to re-download everything - // for each new test. As soon as the Gradle version changes, the previous Gradle version is - // deleted. - private fun combinations( - gradleList: List<String>, - agpList: List<String>, - anvilList: List<String>, - kotlinList: List<String> - ) = gradleList.flatMap { gradle -> - agpList.flatMap { agp -> - anvilList.flatMap { anvil -> - kotlinList.map { kotlin -> - TestVersions( - gradle = gradle, - agp = agp, - anvil = anvil, - kotlin = kotlin - ) - } - } - } - } - - val allValid = combinations( - gradleList = gradleList, - agpList = agpList, - anvilList = anvilList, - kotlinList = kotlinList - ).filtered(exclusions) - .requireNotEmpty() - - init { - requireNoUselessExclusions() - } - - private fun List<TestVersions>.requireNotEmpty() = apply { - require(isNotEmpty()) { - "There are no valid version combinations to be made from the provided arguments." - } - } - - private fun List<Exclusion>.requireNoDuplicates() = also { exclusions -> - require(exclusions.toSet().size == exclusions.size) { - val duplicates = exclusions.filter { target -> - exclusions.filter { it == target }.size > 1 - } - .distinct() - - "There are duplicate (identical) exclusions (this list shows one of each type):\n" + - duplicates.joinToString("\n\t") - } - } - - private fun requireNoUselessExclusions() { - // If we're using arguments, then the baseline `combinations` list will naturally be smaller. - // This check can be skipped. - // if (listOfNotNull(gradleArg, agpArg, anvilArg, kotlinArg).isNotEmpty()) return - - val redundant = mutableListOf<Exclusion>() - - exclusions.forEach { exclusion -> - val filteredWithout = combinations( - gradleList = gradleList, - agpList = agpList, - anvilList = anvilList, - kotlinList = kotlinList - ).filtered(exclusions.filterNot { it == exclusion }) - - val leftOut = filteredWithout.subtract(allValid.toSet()) - .sortedBy { it.hashCode() } - - if (leftOut.isEmpty()) { - redundant.add(exclusion) - } - } - - require(redundant.isEmpty()) { - "The following defined exclusions all achieve the same filtered result. Leave one:\n" + - redundant.joinToString("\n\t", "\t") - } - } - - internal operator fun Collection<Exclusion>.contains(testVersions: TestVersions): Boolean { - return any { testVersions.excludedBy(it) } - } - - private fun TestVersions.excludedBy(exclusion: Exclusion): Boolean { - return when { - exclusion.gradle != null && exclusion.gradle != gradle -> false - exclusion.agp != null && exclusion.agp != agp -> false - exclusion.kotlin != null && exclusion.kotlin != kotlin -> false - exclusion.anvil != null && exclusion.anvil != anvil -> false - else -> true - } - } - - private fun List<TestVersions>.filtered(exclusions: List<Exclusion>): List<TestVersions> { - return filterNot { versions -> exclusions.contains(versions) } - } - - data class Exclusion( - val gradle: String? = null, - val agp: String? = null, - val anvil: String? = null, - val kotlin: String? = null - ) -} diff --git a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixExtension.kt b/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixExtension.kt deleted file mode 100644 index 2974a9ca82..0000000000 --- a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixExtension.kt +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.matrix - -import com.github.gmazzo.buildconfig.BuildConfigExtension -import com.rickbusarow.kgx.libsCatalog -import com.rickbusarow.kgx.listProperty -import com.rickbusarow.kgx.pluginId -import com.rickbusarow.kgx.propertyOrNull -import com.rickbusarow.kgx.version -import modulecheck.builds.matrix.Versions.Companion.agpListDefault -import modulecheck.builds.matrix.Versions.Companion.anvilListDefault -import modulecheck.builds.matrix.Versions.Companion.gradleListDefault -import modulecheck.builds.matrix.Versions.Companion.kotlinListDefault -import org.gradle.api.Project -import org.gradle.api.provider.ListProperty -import org.gradle.kotlin.dsl.buildConfigField -import org.jetbrains.kotlin.gradle.dsl.KotlinJvmProjectExtension -import java.io.File -import java.io.Serializable -import javax.inject.Inject - -open class Versions @Inject constructor( - private val target: Project -) : Serializable { - - val gradleList: ListProperty<String> = target.objects - .listProperty<String>() - .convention(propertyName = "modulecheck.gradleVersion", gradleListDefault) - - val agpList: ListProperty<String> = target.objects - .listProperty<String>() - .convention("modulecheck.agpVersion", agpListDefault) - - val anvilList: ListProperty<String> = target.objects - .listProperty<String>() - .convention("modulecheck.anvilVersion", anvilListDefault) - - val kotlinList: ListProperty<String> = target.objects - .listProperty<String>() - .convention("modulecheck.kotlinVersion", kotlinListDefault) - - private fun ListProperty<String>.convention( - propertyName: String, - default: List<String> - ): ListProperty<String> = convention( - target.providers.gradleProperty(propertyName) - .map { it.split("""\s*,\s*""".toRegex()) } - .orElse(default) - ) - - companion object { - internal val gradleListDefault = listOf("8.6", "8.11.1", "8.14") - internal val agpListDefault = listOf("8.4.0", "8.10.0") - internal val anvilListDefault = listOf("2.5.0", "2.5.1") - internal val kotlinListDefault = listOf("2.0.21") - } -} - -open class VersionsMatrixExtension @Inject constructor(target: Project) : Serializable { - - val versions = Versions(target) - - fun Project.versionsMatrix(sourceSetName: String, packageName: String) { - setUpGeneration( - sourceSetName = sourceSetName, - packageName = packageName, - versions = versions - ) - } -} - -private fun Project.setUpGeneration( - sourceSetName: String, - packageName: String, - versions: Versions -) { - - val generatedDirPath = layout.buildDirectory.dir( - "generated/sources/versionsMatrix/kotlin/main" - ) - - requireInSyncWithToml() - - plugins.apply(libsCatalog.pluginId("buildconfig")) - - extensions.configure(BuildConfigExtension::class.java) { extension -> - extension.sourceSets.named(sourceSetName) { sourceSet -> - sourceSet.forClass(packageName, "Versions") { clazz -> - clazz.buildConfigField("gradleList", versions.gradleList.get()) - clazz.buildConfigField("agpList", versions.agpList.get()) - clazz.buildConfigField("anvilList", versions.anvilList.get()) - clazz.buildConfigField("kotlinList", versions.kotlinList.get()) - clazz.buildConfigField( - "exhaustive", - propertyOrNull<String>("modulecheck.exhaustive")?.toBoolean() ?: false - ) - } - } - } - - extensions.configure(KotlinJvmProjectExtension::class.java) { extension -> - extension.sourceSets.named("main") { kotlinSourceSet -> - kotlinSourceSet.kotlin.srcDir(generatedDirPath) - } - } -} - -private fun Project.requireInSyncWithToml() { - - val simpleName = VersionsMatrix::class.simpleName - val versionsMatrixRelativePath = VersionsMatrix::class.qualifiedName!! - .replace('.', File.separatorChar) - .let { "$it.kt" } - - val versionMatrixFile = rootDir - .resolve("build-logic/versions-matrix") - .resolve("src/main/kotlin") - .resolve(versionsMatrixRelativePath) - - require(versionMatrixFile.exists()) { - "Could not resolve the $simpleName file: $versionMatrixFile" - } - - VersionsMatrix( - gradleList = gradleListDefault, - agpList = agpListDefault, - anvilList = anvilListDefault, - kotlinList = kotlinListDefault - ).run { - - sequenceOf( - Triple(agpList, "agpList", "androidTools"), - Triple(anvilList, "anvilList", "square-anvil"), - Triple(kotlinList, "kotlinList", "kotlin-core") - ) - .forEach { (list, listName, alias) -> - require(list.contains(libsCatalog.version(alias))) { - "The versions catalog version for '$alias' is ${libsCatalog.version(alias)}. " + - "Update the $simpleName list '$listName' to include this new version.\n" + - "\tfile://$versionMatrixFile" - } - } - - require(gradleList.contains(gradle.gradleVersion)) { - "The Gradle version is ${gradle.gradleVersion}. " + - "Update the $simpleName list 'gradleList' to include this new version.\n" + - "\tfile://$versionMatrixFile" - } - } -} diff --git a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlCheckTask.kt b/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlCheckTask.kt deleted file mode 100644 index ea863273a2..0000000000 --- a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlCheckTask.kt +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.matrix - -import modulecheck.builds.BaseYamlMatrixTask -import modulecheck.builds.diffString -import org.gradle.api.model.ObjectFactory -import org.gradle.api.tasks.TaskAction -import org.gradle.api.tasks.VerificationTask -import org.gradle.internal.logging.text.StyledTextOutput -import javax.inject.Inject - -abstract class VersionsMatrixYamlCheckTask @Inject constructor( - objectFactory: ObjectFactory -) : BaseYamlMatrixTask(objectFactory), VerificationTask { - - @TaskAction - fun check() { - val ciFile = requireCiFile() - - val ciText = ciFile.readText() - val pattern = matrixSectionRegex - - val newText = ciText.replace(pattern) { match -> - - val (indent, startTag, _, closingLine) = match.destructured - - val newContent = createYaml(indent.length) - - "$indent$startTag$newContent$closingLine" - } - - if (ciText != newText) { - val message = "The versions matrix in the CI file is out of date. " + - "Run ./gradlew versionsMatrixYamlUpdate to automatically update." + - "\n\tfile://${yamlFile.get()}" - - createStyledOutput() - .withStyle(StyledTextOutput.Style.Description) - .println(message) - - println() - println(diffString(ciText, newText)) - println() - - require(false) - } - } -} - -abstract class VersionsMatrixYamlGenerateTask @Inject constructor( - objectFactory: ObjectFactory -) : BaseYamlMatrixTask(objectFactory) { - - @TaskAction - fun execute() { - val ciFile = requireCiFile() - - val ciText = ciFile.readText() - val pattern = matrixSectionRegex - - val newText = ciText.replace(pattern) { match -> - - val (indent, startTag, _, closingLine) = match.destructured - - val newContent = createYaml(indent.length) - - "$indent$startTag$newContent$closingLine" - } - - if (ciText != newText) { - - ciFile.writeText(newText) - - val message = "Updated the versions matrix in the CI file." + - "\n\tfile://${yamlFile.get()}" - - createStyledOutput() - .withStyle(StyledTextOutput.Style.Description) - .println(message) - - println() - println(diffString(ciText, newText)) - println() - } - } -} - -private fun createYaml(indentSize: Int): String { - val versionsMatrix = VersionsMatrix( - gradleList = Versions.gradleListDefault, - agpList = Versions.agpListDefault, - anvilList = Versions.anvilListDefault, - kotlinList = Versions.kotlinListDefault - ) - - return VersionsMatrixYamlGenerator() - .generate( - versionsMatrix = versionsMatrix, - indentSize = indentSize - ) -} diff --git a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlGenerator.kt b/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlGenerator.kt deleted file mode 100644 index 9ca8afd187..0000000000 --- a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlGenerator.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.matrix - -import modulecheck.builds.matrix.VersionsMatrix.Exclusion - -internal class VersionsMatrixYamlGenerator { - - fun generate(versionsMatrix: VersionsMatrix, indentSize: Int): String { - var currentIndent = " ".repeat(indentSize) - - fun StringBuilder.indent(content: StringBuilder.() -> Unit) { - currentIndent += " " - content() - currentIndent = currentIndent.removeSuffix(" ") - } - - fun StringBuilder.line(content: String) { - appendLine(currentIndent + content) - } - - val yaml = buildString { - line("matrix:") - - indent { - line("kotlin-version: ${versionsMatrix.kotlinList.asYamlList()}") - line("gradle-version: ${versionsMatrix.gradleList.asYamlList()}") - line("agp-version: ${versionsMatrix.agpList.asYamlList()}") - line("anvil-version: ${versionsMatrix.anvilList.asYamlList()}") - - if (versionsMatrix.exclusions.isEmpty()) { - line("exclude: [ ]") - } else { - line("exclude:") - - indent { - versionsMatrix.exclusions - .forEach { exclude -> - exclude.asYamlLines() - .forEach { line -> - line(line) - } - } - } - } - } - } - return yaml - } - - private fun List<String>.asYamlList() = joinToString(", ", "[ ", " ]") { it } - - private fun Exclusion.asYamlLines(): List<String> { - return listOf( - "gradle-version" to gradle, - "agp-version" to agp, - "kotlin-version" to kotlin, - "anvil-version" to anvil - ) - .filter { it.second != null } - .mapIndexed { index, pair -> - val (label, value) = pair - if (index == 0) { - "- $label: $value" - } else { - " $label: $value" - } - } - } -} diff --git a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlPlugin.kt b/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlPlugin.kt deleted file mode 100644 index 4fdd1e3781..0000000000 --- a/build-logic/versions-matrix/src/main/kotlin/modulecheck/builds/matrix/VersionsMatrixYamlPlugin.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.builds.matrix - -import com.rickbusarow.kgx.applyOnce -import com.rickbusarow.kgx.checkProjectIsRoot -import com.rickbusarow.kgx.dependsOn -import org.gradle.api.Plugin -import org.gradle.api.Project -import org.gradle.language.base.plugins.LifecycleBasePlugin - -abstract class VersionsMatrixYamlPlugin : Plugin<Project> { - override fun apply(target: Project) { - - target.checkProjectIsRoot() - target.plugins.applyOnce("base") - - val ciFile = target.file(".github/workflows/ci.yml") - - require(ciFile.exists()) { - "Could not resolve '$ciFile'. Only add the ci/yaml matrix tasks to the root project." - } - val versionsMatrixYamlUpdate = target.tasks.register( - "versionsMatrixYamlUpdate", - VersionsMatrixYamlGenerateTask::class.java - ) { task -> - task.yamlFile.set(ciFile) - task.startTagProperty.set("### <start-versions-matrix>") - task.endTagProperty.set("### <end-versions-matrix>") - } - - target.tasks.named("fix").dependsOn(versionsMatrixYamlUpdate) - - val versionsMatrixYamlCheck = target.tasks.register( - "versionsMatrixYamlCheck", - VersionsMatrixYamlCheckTask::class.java - ) { task -> - task.yamlFile.set(ciFile) - task.startTagProperty.set("### <start-versions-matrix>") - task.endTagProperty.set("### <end-versions-matrix>") - task.mustRunAfter(versionsMatrixYamlUpdate) - } - - // Automatically run `versionsMatrixYamlCheck` when running `check` - target.tasks.named(LifecycleBasePlugin.CHECK_TASK_NAME).dependsOn(versionsMatrixYamlCheck) - } -} diff --git a/build.gradle.kts b/build.gradle.kts deleted file mode 100644 index 5f3ee73f65..0000000000 --- a/build.gradle.kts +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.rickbusarow.kgx.buildDir -import modulecheck.builds.GROUP -import modulecheck.builds.PLUGIN_ID -import modulecheck.builds.VERSION_NAME -import modulecheck.builds.VERSION_NAME_STABLE - -buildscript { - dependencies { - classpath(libs.kotlin.gradle.plugin) - classpath(libs.vanniktech.publish) - classpath(libs.rickBusarow.kgx) - } -} - -plugins { - id("mcbuild.root") - alias(libs.plugins.dependencyAnalysis) - alias(libs.plugins.detekt) - alias(libs.plugins.doks) - alias(libs.plugins.moduleCheck) - alias(libs.plugins.taskTree) -} - -doks { - dokSet("readme") { - docs("README.md", "CHANGELOG.md") - - rule("modulecheck-version") { - regex = SEMVER - replacement = VERSION_NAME - } - rule("modulecheck-plugin") { - regex = gradlePluginWithVersion(pluginId = PLUGIN_ID) - replacement = "$1$2$3$4$VERSION_NAME$6" - } - rule("modulecheck-maven") { - regex = maven(GROUP.escapeRegex()) - replacement = "$1:$2:$VERSION_NAME" - } - - rule("modulecheck-version-stable") { - regex = SEMVER - replacement = VERSION_NAME_STABLE - } - rule("modulecheck-plugin-stable") { - regex = gradlePluginWithVersion(pluginId = PLUGIN_ID) - replacement = "$1$2$3$4$VERSION_NAME_STABLE$6" - } - rule("modulecheck-maven-stable") { - regex = maven(GROUP.escapeRegex()) - replacement = "$1:$2:$VERSION_NAME_STABLE" - } - } - dokSet("website") { - docs("website/docs") { - include("**/*.md", "**/*.mdx") - } - sampleCodeSource("modulecheck-gradle/plugin/src/integrationTest/kotlin") { - include("**/*.kt") - } - - rule("modulecheck-version") { - regex = SEMVER - replacement = VERSION_NAME - } - rule("modulecheck-plugin") { - regex = gradlePluginWithVersion(pluginId = PLUGIN_ID) - replacement = "$1$2$3$4$VERSION_NAME$6" - } - rule("modulecheck-maven") { - regex = maven(GROUP.escapeRegex()) - replacement = "$1:$2:$VERSION_NAME" - } - - rule("dollar-raw-string") { - regex = "\${'$'}".escapeRegex() - replacement = "$".escapeReplacement() - } - rule("buildConfig-version") { - regex = "\${BuildConfig.version}".escapeRegex() - replacement = VERSION_NAME.escapeReplacement() - } - - rule("modulecheck-gradle-config-kotlin") { - replacement = sourceCode( - fqName = "modulecheck.gradle.ConfigValidationTest.kotlinConfig", - bodyOnly = true, - codeBlockLanguage = "kotlin", - attributes = "title = root/build.gradle.kts" - ) - } - rule("modulecheck-gradle-config-groovy") { - replacement = sourceCode( - fqName = "modulecheck.gradle.ConfigValidationTest.groovyConfig", - bodyOnly = true, - codeBlockLanguage = "groovy", - attributes = "title = root/build.gradle" - ) - } - } -} - -moduleCheck { - deleteUnused = true - checks { - depths = true - sortDependencies = true - } - reports { - depths.enabled = true - graphs { - enabled = true - outputDir = "${buildDir()}/reports/modulecheck/graphs" - } - } -} - -afterEvaluate { - - // Hack for ensuring that when 'publishToMavenLocal' is invoked from the root project, - // all subprojects are published. This is used in plugin tests. - sequenceOf( - "publishToMavenLocal", - "publishToMavenLocalNoDokka" - ).forEach { taskName -> - tasks.register(taskName) { - subprojects.forEach { sub -> - dependsOn(sub.tasks.matching { it.name == taskName }) - } - } - } - - sequenceOf( - "buildHealth", - "clean", - "ktlintCheck", - "ktlintFormat", - "ktlintCheckGradleScripts", - "ktlintFormatGradleScripts", - "moduleCheck", - "moduleCheckAuto", - "moduleCheckSortDependenciesAuto", - "test" - ).forEach { taskName -> - tasks.named(taskName).configure { - dependsOn(gradle.includedBuild("build-logic").task(":$taskName")) - } - } -} diff --git a/changelog/index.html b/changelog/index.html new file mode 100644 index 0000000000..1b2b457590 --- /dev/null +++ b/changelog/index.html @@ -0,0 +1,409 @@ +<!doctype html> +<html lang="en" dir="ltr" class="mdx-wrapper mdx-page plugin-pages plugin-id-default" data-has-hydrated="false"> +<head> +<meta charset="UTF-8"> +<meta name="generator" content="Docusaurus v3.8.1"> +<title data-rh="true">ModuleCheck + + + + + + + +

0.12.5

+

This is a re-release of 0.12.4.

+

🐛 Bug Fixes

+ +

Other Changes

+ +

Full Changelog: https://github.com/RBusarow/ModuleCheck/compare/0.12.3...0.12.5

+

0.12.4

+

This version was published with stale artifacts. Use 0.12.5 instead.

+

0.12.3

+

🐛 Bug Fixes

+
    +
  • fix suppressing findings within the AGP +DSL (#712)
  • +
  • parse the declarations of named companion objects and their +members (#706)
  • +
  • treat annotation processor dependencies the same as runtime dependencies for McProject.uses() +and overshot behavior (#701)
  • +
  • fix false positive for 'unused-dependency' when consuming debug source +from testImplementation @tasomaniac (#685)
  • +
  • revert Kotlin to 1.6.10 to fix build issues in targets using +1.6.10 (#683)
  • +
+

🧰 Maintenance

+
    +
  • Update dependency com.vanniktech:gradle-maven-publish-plugin to +v0.20.0 (#707)
  • +
  • Update dependency com.autonomousapps.dependency-analysis to +v1.4.0 (#698)
  • +
  • Update dependency com.osacky.doctor to +v0.8.1 (#699)
  • +
  • Update docusaurus monorepo to +v2.0.0-beta.21 (#691)
  • +
  • Update kotlinx-coroutines to v1.6.2 (#695)
  • +
  • Update dependency com.autonomousapps.dependency-analysis to +v1.3.0 (#696)
  • +
  • Update dependency com.github.ben-manes.caffeine:caffeine to +v3.1.1 (#694)
  • +
  • remove CI's tests-windows need +for publish-maven-local @RBusarow (#693)
  • +
  • use Caffeine for caching, with LazyDeferred +loaders @RBusarow (#692)
  • +
  • Update dropbox-dependencyGuard to +v0.3.0 (#690)
  • +
  • don't sign -SNAPSHOT +builds @RBusarow (#686)
  • +
  • disable KtLint's broken experimental:type-parameter-list-spacing +rule @RBusarow (#681)
  • +
  • Update crazy-max/ghaction-github-pages action to +v3 (#679)
  • +
  • update changelog for 0.12.2 +release @RBusarow (#680)
  • +
  • Update dependency com.rickbusarow.module-check to +v0.12.2 (#678)
  • +
+

Contributors

+

@RBusarow and @tasomaniac

+

0.12.2

+

🐛 Bug Fixes

+
    +
  • false positives for unused kapt processors which are defined in +additionalKaptMatchers (8c55fd1)
  • +
+

0.12.1

+

🗑 Deprecations

+
    +
  • The names of all findings have been updated/standardized. Any declarations which were suppressing +a finding with the old ID (via @Suppress("someFinding") or //suppress=someFinding) will still +work, but they should be updated to use the new names. +See the migrations guide
  • +
  • The method for defining additionalKaptMatchers in the Gradle DSL has been deprecated, replaced +with the additionalCodeGenerators property and CodeGeneratorBinding. +See the migrations guide
  • +
+

💥 Breaking Changes

+
    +
  • The base :moduleCheck task will now automatically hook into the root project's :check task, if +one +exists. @RBusarow (#611)
  • +
+

🚀 Features

+ +

🐛 Bug Fixes

+
    +
  • don't find must-be-api if the project is already an api dependency +also @RBusarow (#666)
  • +
  • remove AGP and KGP from the plugin's runtime +classpath (079ab9d)
  • +
  • fix matching to custom +kaptMatchers @RBusarow (#658)
  • +
  • properly use settings to determine which kinds of depth output to +create @RBusarow (#647)
  • +
  • fix relative paths for custom graph report +directory @RBusarow (#612)
  • +
  • use type-safe accessor "path" when adding a dependency with type-safe +syntax @RBusarow (#608)
  • +
  • evaluate suppress/noinspection annotations +eagerly @RBusarow (#604)
  • +
  • fixes false negative for unused kapt plugin when there are no +processors @RBusarow (#603)
  • +
  • fix Dagger NoSuchMethodError for dagger.internal.Preconditions.checkNotNullFromProvides in +SNAPSHOT @RBusarow (#570)
  • +
+

🧰 Maintenance

+
    +
  • add a discrete job in CI for publishing to mavenLocal, then cache +it @RBusarow (#668)
  • +
  • update the build classpath baseline for the snapshot build's new +runt… @RBusarow (#664)
  • +
  • use the current SNAPSHOT for plugin +dogfooding @RBusarow (#663)
  • +
  • migrate TestKit tests away from the Specs +DSLs @RBusarow (#660)
  • +
  • hook dependencyGuard into the check +task @RBusarow (#661)
  • +
  • give Dokka explicit dependency upon KtLint tasks and more broadly +dis… @RBusarow (#659)
  • +
  • Update dropbox-dependencyGuard to +v0.2.0 @renovate (#657)
  • +
  • require comments for public APIs in Detekt, and add +baselines @RBusarow (#656)
  • +
  • add dependency-guard and +baselines @RBusarow (#654)
  • +
  • Update dependency prism-react-renderer to +v1.3.3 @renovate (#653)
  • +
  • Update dependency com.android.tools.build:gradle to +v7.2.0 @renovate (#620)
  • +
  • Update actions/setup-java action to +v3 @renovate (#652)
  • +
  • Update dependency com.autonomousapps.dependency-analysis to +v1.2.1 @renovate (#651)
  • +
  • Update actions/upload-artifact action to +v3 @renovate (#629)
  • +
  • Update dependency com.gradleup.auto.manifest to +v2 @renovate (#645)
  • +
  • Update react monorepo to v18 ( +major) @renovate (#646)
  • +
  • remove github actions +caching @RBusarow (#649)
  • +
  • remove +dependabot @RBusarow (#648)
  • +
  • create a shared .gradle cache for TestKit +tests @RBusarow (#640)
  • +
  • add the artifacts-check convention +plugin @RBusarow (#615)
  • +
  • fix incorrect/duplicate maven artifact +ids @RBusarow (#614)
  • +
  • revert KaptMatcher name +to modulecheck.api.KaptMatcher @RBusarow (#613)
  • +
  • +
+

delete ConfiguredModule @RBusarow (#609)

+ +

ℹ️ Website

+ +

Contributors

+

@RBusarow

+

0.12.0

+

💥 Breaking Changes

+
    +
  • The autoCorrect property in the Gradle settings DSL has been removed. Instead, to perform a +check with auto-correct, add the Auto suffix to the task name. +
    # perform all checks and fail if errors are found
    ./gradlew moduleCheck

    # perform all checks and auto-correct if possible
    ./gradlew moduleCheckAuto
    +
  • +
  • Tasks are no longer generated for most individual rules. Instead, rules should be toggled via +the Gradle DSL and can be +invoked +through ./gradlew modulecheck or ./gradlew moduleCheckAuto.
  • +
+

📐 New Rules

+ +

🚀 Features

+
    +
  • Add support for depths, dotviz dependency graph, checkstyle, and plaintext result +reporting @RBusarow (#243)
  • +
+

🐛 Bug Fixes

+
    +
  • Add a test case for false +positive @tasomaniac (#419)
  • +
  • Don't call a dependency overshot if it's already declared in that source +set @RBusarow (#521)
  • +
  • don't try to parse .pngs as +xml @RBusarow (#522)
  • +
  • fix parsing xml resource declarations when there's a dot in the +name @RBusarow (#512)
  • +
  • Fix false positive for unusedDependency when a resource from the dependency is used with R from +the dependent in a downstream +project @RBusarow (#510)
  • +
  • better modeling for generated databinding declarations and +references @RBusarow (#509)
  • +
  • count layout files and @+id/__ declarations as part of a module's +declarations @RBusarow (#499)
  • +
  • Support the alternative usage of kapt +plugin @tasomaniac (#481)
  • +
  • add new dependency declarations even if their transitive source can't be +found @RBusarow (#469)
  • +
  • don't generate BuildConfig if it's ignored in Android +settings @RBusarow (#470)
  • +
  • force single-threaded GroovyLangParser +access @RBusarow (#463)
  • +
  • fix false positive for disableViewBinding when used in debug source set of different +module @RBusarow (#446)
  • +
  • don't swallow a newline when replacing a dependency with a preceding blank +line @RBusarow (#444)
  • +
  • better handling for detecting complex precompiled configuration +names @RBusarow (#442)
  • +
  • support multiple android base +packages @RBusarow (#411)
  • +
  • support .java files without a package +declaration @RBusarow (#400)
  • +
  • strip illegal characters from XML before +parsing @RBusarow (#376)
  • +
  • fix auto-correct when using a non-standard config +name @RBusarow (#368)
  • +
  • fix false positive for kapt processors in non-kapt +configurations @RBusarow (#350)
  • +
  • don't allow projects to inherit +themselves @RBusarow (#343)
  • +
  • update configuration +docs @RBusarow (#335)
  • +
  • always create depth and graph reports when running their explicit +tasks @RBusarow (#332)
  • +
  • collect depth info after applying +changes @RBusarow (#331)
  • +
  • fix testFixtures handling in +OverShotDependencyFinding @RBusarow (#297)
  • +
  • treat testFixtures and the associated main sources like different +projects @RBusarow (#288)
  • +
  • correctly apply the testFixtures(...) wrapper for replaced/added +dependencies @RBusarow (#287)
  • +
+

ℹ️ Website

+ +

Contributors

+

@RBusarow, @diego-gomez-olvera and @tasomaniac

+

0.11.3

+

🚀 Features

+
    +
  • support suppressing findings (#235)
  • +
+

🐛 Bug Fixes

+
    +
  • support testFixtures (#232)
  • +
+

🧰 Maintenance

+
    +
  • Bump kotlinpoet from 1.10.1 to 1.10.2 (#233)
  • +
  • Bump gradle-plugin from 2.3.6 to 2.3.7 (#229)
  • +
+

ℹ️ Website

+
    +
  • use titles in docs code snippets (#237)
  • +
  • clarify CI workflow docs (#221)
  • +
  • add example CI workflow to docs (#220)
  • +
+

0.11.2

+

🐛 Bug Fixes

+
    +
  • support overshot dependencies (#217)
  • +
  • sorting fixes (#215)
  • +
+

0.11.1

+

🐛 Bug Fixes

+
    +
  • support constant or enum declarations in Java +classes (#209)
  • +
  • include generated data/viewbinding objects as +declarations (#208)
  • +
  • support closures in dependency +declarations (#205)
  • +
  • count resources as R references when used in +AndroidManifest.xml (#203)
  • +
+

0.11.0 - Groovy auto-correct support

+

🐛 Bug Fixes

+
    +
  • Support generated manifests (#197)
  • +
  • fix redundant "from: " output (#193)
  • +
  • support Groovy parsing (#190)
  • +
  • capture a finding's log string before it's +fixed (#184)
  • +
  • include class literal expressions when looking for type +references (#177)
  • +
  • check for Android kotlin sources (#173)
  • +
+

0.10.0

+

Initial release

+ + \ No newline at end of file diff --git a/dependency-guard-aggregate.txt b/dependency-guard-aggregate.txt deleted file mode 100644 index 936ff810e6..0000000000 --- a/dependency-guard-aggregate.txt +++ /dev/null @@ -1,1803 +0,0 @@ -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-api -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-api -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-api -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-api -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-api -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-api -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-core -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-core -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-core -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-core -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-core -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-core -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-core -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-core -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-core -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-core -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-core -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-dagger -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-dagger -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -:modulecheck-dagger -- runtimeClasspath -- org.jetbrains:annotations:13.0 - -:modulecheck-internal-testing -- runtimeClasspath -- com.github.curious-odd-man:rgxgen:1.4 -:modulecheck-internal-testing -- runtimeClasspath -- com.rickbusarow.kase:kase-gradle:0.12.0 -:modulecheck-internal-testing -- runtimeClasspath -- com.rickbusarow.kase:kase:0.12.0 -:modulecheck-internal-testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations-jvm:0.15.3 -:modulecheck-internal-testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations:0.15.3 -:modulecheck-internal-testing -- runtimeClasspath -- io.github.java-diff-utils:java-diff-utils:4.12 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-assertions-api-jvm:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-assertions-api:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-assertions-core-jvm:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared-jvm:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-common-jvm:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-common:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- io.kotest:kotest-property-jvm:5.9.1 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-internal-testing -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-internal-testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-api:5.13.3 -:modulecheck-internal-testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-engine:5.13.3 -:modulecheck-internal-testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-params:5.13.3 -:modulecheck-internal-testing -- runtimeClasspath -- org.junit.platform:junit-platform-commons:1.13.3 -:modulecheck-internal-testing -- runtimeClasspath -- org.junit.platform:junit-platform-engine:1.13.3 -:modulecheck-internal-testing -- runtimeClasspath -- org.junit:junit-bom:5.13.3 -:modulecheck-internal-testing -- runtimeClasspath -- org.opentest4j:opentest4j:1.3.0 - -:modulecheck-config:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-config:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-config:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-config:fake -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-config:fake -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-config:fake -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-config:impl -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-config:impl -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-config:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-finding:api -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-finding:api -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-finding:api -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-finding:api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-finding:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-finding:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-finding:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-finding:api -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-finding:impl -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-finding:impl -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-finding:impl -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-finding:impl -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-finding:impl -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-finding:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-finding:impl -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-finding:impl-android -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-finding:impl-android -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-finding:impl-sort -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-finding:impl-sort -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-finding:name -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-finding:name -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-finding:name -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-finding:name -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-finding:name -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-finding:name -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-finding:name -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.javaparser:javaparser-core:3.27.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.github.javaparser:javaparser-symbol-solver-core:3.27.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.google.code.findbugs:jsr305:3.0.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.google.dagger:dagger:2.56.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.google.guava:failureaccess:1.0.3 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.google.guava:guava:33.4.8-jre -:modulecheck-gradle:plugin -- runtimeClasspath -- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -:modulecheck-gradle:plugin -- runtimeClasspath -- com.google.j2objc:j2objc-annotations:3.0.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.ibm.icu:icu4j:72.1 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.rickbusarow.kgx:kotlin-gradle-extensions:0.1.12 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.rickbusarow.kgx:names:0.1.12 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.squareup.moshi:moshi:1.15.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.squareup.okio:okio-jvm:3.7.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- com.squareup.okio:okio:3.7.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- guru.nidi:graphviz-java-min-deps:0.18.1 -:modulecheck-gradle:plugin -- runtimeClasspath -- guru.nidi:graphviz-java:0.18.1 -:modulecheck-gradle:plugin -- runtimeClasspath -- jakarta.inject:jakarta.inject-api:2.0.1 -:modulecheck-gradle:plugin -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-gradle:plugin -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.abego.treelayout:org.abego.treelayout.core:1.0.3 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.antlr:ST4:4.3.4 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.antlr:antlr-runtime:3.5.3 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.antlr:antlr4-runtime:4.13.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.antlr:antlr4:4.13.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.checkerframework:checker-qual:3.49.4 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.javassist:javassist:3.30.2-GA -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.slf4j:jcl-over-slf4j:1.7.30 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.slf4j:jul-to-slf4j:1.7.30 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.slf4j:slf4j-api:1.7.30 -:modulecheck-gradle:plugin -- runtimeClasspath -- org.unbescape:unbescape:1.1.6.RELEASE - -:modulecheck-parsing:android -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:android -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:android -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-parsing:android -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:android -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- com.ibm.icu:icu4j:72.1 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.abego.treelayout:org.abego.treelayout.core:1.0.3 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.antlr:ST4:4.3.4 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.antlr:antlr-runtime:3.5.3 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.antlr:antlr4-runtime:4.13.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.antlr:antlr4:4.13.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:groovy-antlr -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.javaparser:javaparser-core:3.27.0 -:modulecheck-parsing:java -- runtimeClasspath -- com.github.javaparser:javaparser-symbol-solver-core:3.27.0 -:modulecheck-parsing:java -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-parsing:java -- runtimeClasspath -- com.google.guava:failureaccess:1.0.3 -:modulecheck-parsing:java -- runtimeClasspath -- com.google.guava:guava:33.4.8-jre -:modulecheck-parsing:java -- runtimeClasspath -- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -:modulecheck-parsing:java -- runtimeClasspath -- com.google.j2objc:j2objc-annotations:3.0.0 -:modulecheck-parsing:java -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-parsing:java -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:java -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:java -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:java -- runtimeClasspath -- org.checkerframework:checker-qual:3.49.4 -:modulecheck-parsing:java -- runtimeClasspath -- org.javassist:javassist:3.30.2-GA -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:java -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-parsing:java -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-parsing:psi -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-parsing:psi -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-parsing:psi -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-parsing:psi -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:psi -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:psi -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-parsing:psi -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.javaparser:javaparser-core:3.27.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.github.javaparser:javaparser-symbol-solver-core:3.27.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.google.guava:failureaccess:1.0.3 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.google.guava:guava:33.4.8-jre -:modulecheck-parsing:wiring -- runtimeClasspath -- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -:modulecheck-parsing:wiring -- runtimeClasspath -- com.google.j2objc:j2objc-annotations:3.0.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.ibm.icu:icu4j:72.1 -:modulecheck-parsing:wiring -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-parsing:wiring -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-parsing:wiring -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.abego.treelayout:org.abego.treelayout.core:1.0.3 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.antlr:ST4:4.3.4 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.antlr:antlr-runtime:3.5.3 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.antlr:antlr4-runtime:4.13.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.antlr:antlr4:4.13.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.checkerframework:checker-qual:3.49.4 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.javassist:javassist:3.30.2-GA -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-parsing:wiring -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-project:api -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-project:api -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-project:api -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-project:api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-project:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-project:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-project:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-project:api -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-project:impl -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-project:impl -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-project:impl -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-project:impl -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-project:impl -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-project:impl -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-project:impl -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-project:impl -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-project:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-project:impl -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-project:testing -- runtimeClasspath -- com.github.curious-odd-man:rgxgen:1.4 -:modulecheck-project:testing -- runtimeClasspath -- com.github.javaparser:javaparser-core:3.27.0 -:modulecheck-project:testing -- runtimeClasspath -- com.github.javaparser:javaparser-symbol-solver-core:3.27.0 -:modulecheck-project:testing -- runtimeClasspath -- com.google.dagger:dagger:2.56.2 -:modulecheck-project:testing -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-project:testing -- runtimeClasspath -- com.google.guava:failureaccess:1.0.3 -:modulecheck-project:testing -- runtimeClasspath -- com.google.guava:guava:33.4.8-jre -:modulecheck-project:testing -- runtimeClasspath -- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -:modulecheck-project:testing -- runtimeClasspath -- com.google.j2objc:j2objc-annotations:3.0.0 -:modulecheck-project:testing -- runtimeClasspath -- com.ibm.icu:icu4j:72.1 -:modulecheck-project:testing -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-project:testing -- runtimeClasspath -- com.rickbusarow.kase:kase-gradle:0.12.0 -:modulecheck-project:testing -- runtimeClasspath -- com.rickbusarow.kase:kase:0.12.0 -:modulecheck-project:testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations-jvm:0.15.3 -:modulecheck-project:testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations:0.15.3 -:modulecheck-project:testing -- runtimeClasspath -- io.github.java-diff-utils:java-diff-utils:4.12 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-assertions-api-jvm:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-assertions-api:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-assertions-core-jvm:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared-jvm:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-common-jvm:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-common:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- io.kotest:kotest-property-jvm:5.9.1 -:modulecheck-project:testing -- runtimeClasspath -- jakarta.inject:jakarta.inject-api:2.0.1 -:modulecheck-project:testing -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-project:testing -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-project:testing -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-project:testing -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-project:testing -- runtimeClasspath -- org.abego.treelayout:org.abego.treelayout.core:1.0.3 -:modulecheck-project:testing -- runtimeClasspath -- org.antlr:ST4:4.3.4 -:modulecheck-project:testing -- runtimeClasspath -- org.antlr:antlr-runtime:3.5.3 -:modulecheck-project:testing -- runtimeClasspath -- org.antlr:antlr4-runtime:4.13.2 -:modulecheck-project:testing -- runtimeClasspath -- org.antlr:antlr4:4.13.2 -:modulecheck-project:testing -- runtimeClasspath -- org.checkerframework:checker-qual:3.49.4 -:modulecheck-project:testing -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-project:testing -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-project:testing -- runtimeClasspath -- org.javassist:javassist:3.30.2-GA -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-project:testing -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-project:testing -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 -:modulecheck-project:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-api:5.13.3 -:modulecheck-project:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-engine:5.13.3 -:modulecheck-project:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-params:5.13.3 -:modulecheck-project:testing -- runtimeClasspath -- org.junit.platform:junit-platform-commons:1.13.3 -:modulecheck-project:testing -- runtimeClasspath -- org.junit.platform:junit-platform-engine:1.13.3 -:modulecheck-project:testing -- runtimeClasspath -- org.junit:junit-bom:5.13.3 -:modulecheck-project:testing -- runtimeClasspath -- org.opentest4j:opentest4j:1.3.0 - -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.curious-odd-man:rgxgen:1.4 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.javaparser:javaparser-core:3.27.0 -:modulecheck-project-generation:api -- runtimeClasspath -- com.github.javaparser:javaparser-symbol-solver-core:3.27.0 -:modulecheck-project-generation:api -- runtimeClasspath -- com.google.dagger:dagger:2.56.2 -:modulecheck-project-generation:api -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-project-generation:api -- runtimeClasspath -- com.google.guava:failureaccess:1.0.3 -:modulecheck-project-generation:api -- runtimeClasspath -- com.google.guava:guava:33.4.8-jre -:modulecheck-project-generation:api -- runtimeClasspath -- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -:modulecheck-project-generation:api -- runtimeClasspath -- com.google.j2objc:j2objc-annotations:3.0.0 -:modulecheck-project-generation:api -- runtimeClasspath -- com.ibm.icu:icu4j:72.1 -:modulecheck-project-generation:api -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-project-generation:api -- runtimeClasspath -- com.rickbusarow.kase:kase-gradle:0.12.0 -:modulecheck-project-generation:api -- runtimeClasspath -- com.rickbusarow.kase:kase:0.12.0 -:modulecheck-project-generation:api -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations-jvm:0.15.3 -:modulecheck-project-generation:api -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations:0.15.3 -:modulecheck-project-generation:api -- runtimeClasspath -- io.github.java-diff-utils:java-diff-utils:4.12 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-assertions-api-jvm:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-assertions-api:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-assertions-core-jvm:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-assertions-shared-jvm:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-assertions-shared:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-common-jvm:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-common:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- io.kotest:kotest-property-jvm:5.9.1 -:modulecheck-project-generation:api -- runtimeClasspath -- jakarta.inject:jakarta.inject-api:2.0.1 -:modulecheck-project-generation:api -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-project-generation:api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-project-generation:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-project-generation:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-project-generation:api -- runtimeClasspath -- org.abego.treelayout:org.abego.treelayout.core:1.0.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.antlr:ST4:4.3.4 -:modulecheck-project-generation:api -- runtimeClasspath -- org.antlr:antlr-runtime:3.5.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.antlr:antlr4-runtime:4.13.2 -:modulecheck-project-generation:api -- runtimeClasspath -- org.antlr:antlr4:4.13.2 -:modulecheck-project-generation:api -- runtimeClasspath -- org.checkerframework:checker-qual:3.49.4 -:modulecheck-project-generation:api -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-project-generation:api -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-project-generation:api -- runtimeClasspath -- org.javassist:javassist:3.30.2-GA -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-project-generation:api -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 -:modulecheck-project-generation:api -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-api:5.13.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-engine:5.13.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-params:5.13.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.junit.platform:junit-platform-commons:1.13.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.junit.platform:junit-platform-engine:1.13.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.junit:junit-bom:5.13.3 -:modulecheck-project-generation:api -- runtimeClasspath -- org.opentest4j:opentest4j:1.3.0 - -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 -:modulecheck-reporting:checkstyle -- runtimeClasspath -- org.unbescape:unbescape:1.1.6.RELEASE - -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-reporting:console -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-reporting:console -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-reporting:console -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-reporting:console -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-reporting:console -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-reporting:console -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-reporting:console -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-reporting:console -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-reporting:console -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.google.code.findbugs:jsr305:3.0.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-reporting:graphviz -- runtimeClasspath -- guru.nidi:graphviz-java-min-deps:0.18.1 -:modulecheck-reporting:graphviz -- runtimeClasspath -- guru.nidi:graphviz-java:0.18.1 -:modulecheck-reporting:graphviz -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.slf4j:jcl-over-slf4j:1.7.30 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.slf4j:jul-to-slf4j:1.7.30 -:modulecheck-reporting:graphviz -- runtimeClasspath -- org.slf4j:slf4j-api:1.7.30 - -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.squareup.moshi:moshi:1.15.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.squareup.okio:okio-jvm:3.7.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- com.squareup.okio:okio:3.7.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-reporting:sarif -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-rule:api -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-rule:api -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-rule:api -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-rule:api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-rule:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-rule:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-rule:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-rule:api -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-rule:impl -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-rule:impl -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-rule:impl -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-rule:impl -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-rule:impl -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-rule:impl -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-rule:impl -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-rule:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-rule:impl -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-rule:impl-factory -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-rule:impl-factory -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.google.dagger:dagger:2.56.2 -:modulecheck-rule:testing -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-rule:testing -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-rule:testing -- runtimeClasspath -- jakarta.inject:jakarta.inject-api:2.0.1 -:modulecheck-rule:testing -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-rule:testing -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-rule:testing -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-rule:testing -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-rule:testing -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-rule:testing -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-rule:testing -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-rule:testing -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.google.code.findbugs:jsr305:3.0.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-runtime:api -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-runtime:api -- runtimeClasspath -- com.squareup.moshi:moshi:1.15.2 -:modulecheck-runtime:api -- runtimeClasspath -- com.squareup.okio:okio-jvm:3.7.0 -:modulecheck-runtime:api -- runtimeClasspath -- com.squareup.okio:okio:3.7.0 -:modulecheck-runtime:api -- runtimeClasspath -- guru.nidi:graphviz-java-min-deps:0.18.1 -:modulecheck-runtime:api -- runtimeClasspath -- guru.nidi:graphviz-java:0.18.1 -:modulecheck-runtime:api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-runtime:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-runtime:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-runtime:api -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-runtime:api -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-runtime:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-runtime:api -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 -:modulecheck-runtime:api -- runtimeClasspath -- org.slf4j:jcl-over-slf4j:1.7.30 -:modulecheck-runtime:api -- runtimeClasspath -- org.slf4j:jul-to-slf4j:1.7.30 -:modulecheck-runtime:api -- runtimeClasspath -- org.slf4j:slf4j-api:1.7.30 -:modulecheck-runtime:api -- runtimeClasspath -- org.unbescape:unbescape:1.1.6.RELEASE - -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.curious-odd-man:rgxgen:1.4 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.javaparser:javaparser-core:3.27.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.github.javaparser:javaparser-symbol-solver-core:3.27.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.google.code.findbugs:jsr305:3.0.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.google.dagger:dagger:2.56.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.google.guava:failureaccess:1.0.3 -:modulecheck-runtime:testing -- runtimeClasspath -- com.google.guava:guava:33.4.8-jre -:modulecheck-runtime:testing -- runtimeClasspath -- com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava -:modulecheck-runtime:testing -- runtimeClasspath -- com.google.j2objc:j2objc-annotations:3.0.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.ibm.icu:icu4j:72.1 -:modulecheck-runtime:testing -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-runtime:testing -- runtimeClasspath -- com.rickbusarow.kase:kase-gradle:0.12.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.rickbusarow.kase:kase:0.12.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.squareup.moshi:moshi:1.15.2 -:modulecheck-runtime:testing -- runtimeClasspath -- com.squareup.okio:okio-jvm:3.7.0 -:modulecheck-runtime:testing -- runtimeClasspath -- com.squareup.okio:okio:3.7.0 -:modulecheck-runtime:testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations-jvm:0.15.3 -:modulecheck-runtime:testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations:0.15.3 -:modulecheck-runtime:testing -- runtimeClasspath -- guru.nidi:graphviz-java-min-deps:0.18.1 -:modulecheck-runtime:testing -- runtimeClasspath -- guru.nidi:graphviz-java:0.18.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.github.java-diff-utils:java-diff-utils:4.12 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-assertions-api-jvm:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-assertions-api:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-assertions-core-jvm:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared-jvm:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-common-jvm:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-common:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- io.kotest:kotest-property-jvm:5.9.1 -:modulecheck-runtime:testing -- runtimeClasspath -- jakarta.inject:jakarta.inject-api:2.0.1 -:modulecheck-runtime:testing -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-runtime:testing -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-runtime:testing -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-runtime:testing -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-runtime:testing -- runtimeClasspath -- org.abego.treelayout:org.abego.treelayout.core:1.0.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.antlr:ST4:4.3.4 -:modulecheck-runtime:testing -- runtimeClasspath -- org.antlr:antlr-runtime:3.5.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.antlr:antlr4-runtime:4.13.2 -:modulecheck-runtime:testing -- runtimeClasspath -- org.antlr:antlr4:4.13.2 -:modulecheck-runtime:testing -- runtimeClasspath -- org.checkerframework:checker-qual:3.49.4 -:modulecheck-runtime:testing -- runtimeClasspath -- org.codehaus.groovy:groovy-xml:3.0.25 -:modulecheck-runtime:testing -- runtimeClasspath -- org.codehaus.groovy:groovy:3.0.25 -:modulecheck-runtime:testing -- runtimeClasspath -- org.javassist:javassist:3.30.2-GA -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-runtime:testing -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 -:modulecheck-runtime:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-api:5.13.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-engine:5.13.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-params:5.13.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.junit.platform:junit-platform-commons:1.13.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.junit.platform:junit-platform-engine:1.13.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.junit:junit-bom:5.13.3 -:modulecheck-runtime:testing -- runtimeClasspath -- org.opentest4j:opentest4j:1.3.0 -:modulecheck-runtime:testing -- runtimeClasspath -- org.slf4j:jcl-over-slf4j:1.7.30 -:modulecheck-runtime:testing -- runtimeClasspath -- org.slf4j:jul-to-slf4j:1.7.30 -:modulecheck-runtime:testing -- runtimeClasspath -- org.slf4j:slf4j-api:1.7.30 -:modulecheck-runtime:testing -- runtimeClasspath -- org.unbescape:unbescape:1.1.6.RELEASE - -:modulecheck-utils:cache -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-utils:cache -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-utils:cache -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-utils:cache -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-utils:cache -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-utils:lazy -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-utils:stdlib -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:stdlib -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:stdlib -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:stdlib -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:stdlib -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:stdlib -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-utils:trace -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:trace -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-utils:trace-testing -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:trace-testing -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-utils:traversal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:traversal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:traversal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:traversal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:traversal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:traversal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-utils:traversal -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-gradle:platforms:api -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-gradle:platforms:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- com.rickbusarow.kgx:kotlin-gradle-extensions:0.1.12 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- com.rickbusarow.kgx:names:0.1.12 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-gradle:platforms:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- com.rickbusarow.kgx:kotlin-gradle-extensions:0.1.12 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- com.rickbusarow.kgx:names:0.1.12 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-gradle:platforms:internal-android -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- com.rickbusarow.kgx:kotlin-gradle-extensions:0.1.12 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- com.rickbusarow.kgx:names:0.1.12 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-gradle:platforms:internal-jvm -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-model:dependency:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-model:dependency:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-model:dependency:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-model:dependency:impl -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-model:dependency:impl -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-model:dependency:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-model:sourceset:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-model:sourceset:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-model:sourceset:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-model:sourceset:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-model:sourceset:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-model:sourceset:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:kotlin-compiler:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.github.ben-manes.caffeine:caffeine:3.2.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.google.dagger:dagger:2.56.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.google.errorprone:error_prone_annotations:2.40.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- jakarta.inject:jakarta.inject-api:2.0.1 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- javax.inject:javax.inject:1 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-parsing:kotlin-compiler:impl -- runtimeClasspath -- org.jspecify:jspecify:1.0.0 - -:modulecheck-parsing:source:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:source:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:source:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:source:testing -- runtimeClasspath -- com.github.curious-odd-man:rgxgen:1.4 -:modulecheck-parsing:source:testing -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-parsing:source:testing -- runtimeClasspath -- com.rickbusarow.kase:kase-gradle:0.12.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- com.rickbusarow.kase:kase:0.12.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations-jvm:0.15.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- dev.drewhamilton.poko:poko-annotations:0.15.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.github.java-diff-utils:java-diff-utils:4.12 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-assertions-api-jvm:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-assertions-api:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-assertions-core-jvm:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared-jvm:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-assertions-shared:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-common-jvm:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-common:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- io.kotest:kotest-property-jvm:5.9.1 -:modulecheck-parsing:source:testing -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-api:5.13.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-engine:5.13.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.junit.jupiter:junit-jupiter-params:5.13.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.junit.platform:junit-platform-commons:1.13.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.junit.platform:junit-platform-engine:1.13.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.junit:junit-bom:5.13.3 -:modulecheck-parsing:source:testing -- runtimeClasspath -- org.opentest4j:opentest4j:1.3.0 - -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-reporting:logging:api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-reporting:logging:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-reporting:logging:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -:modulecheck-reporting:logging:api -- runtimeClasspath -- org.jetbrains:annotations:13.0 - -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.0.21 -:modulecheck-reporting:logging:testing -- runtimeClasspath -- org.jetbrains:annotations:13.0 - -:modulecheck-utils:coroutines:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:coroutines:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:coroutines:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:coroutines:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:coroutines:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:coroutines:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-utils:coroutines:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- com.rickbusarow.dispatch:dispatch-core:1.0.0-beta10 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.0.21 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib-jdk8:2.0.21 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.0 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-utils:coroutines:impl -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:gradle:dsl:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:gradle:dsl:internal -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:gradle:dsl:precompiled -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath-jvm:3.6.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.colormath:colormath:3.6.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-core:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-ffm:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-graal-ffi:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm-jna:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant-jvm:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- com.github.ajalt.mordant:mordant:3.0.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- net.java.dev.jna:jna:5.14.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:gradle:dsl:testing -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:gradle:model:api -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 - -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- net.swiftzer.semver:semver-jvm:2.1.0 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- net.swiftzer.semver:semver:2.1.0 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.intellij.deps:trove4j:1.0.20200330 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-bom:2.0.21 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-compiler-embeddable:2.0.21 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-daemon-embeddable:2.0.21 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-reflect:2.0.21 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-script-runtime:2.0.21 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlin:kotlin-stdlib:2.1.10 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-bom:1.10.2 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.10.2 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.10.2 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-bom:1.8.0 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core-jvm:1.8.0 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains.kotlinx:kotlinx-serialization-core:1.8.0 -:modulecheck-parsing:gradle:model:impl-typesafe -- runtimeClasspath -- org.jetbrains:annotations:23.0.0 \ No newline at end of file diff --git a/detekt/detekt-baseline.xml b/detekt/detekt-baseline.xml deleted file mode 100644 index c8285ff137..0000000000 --- a/detekt/detekt-baseline.xml +++ /dev/null @@ -1,984 +0,0 @@ - - - - - - - - MagicNumber:ArtifactsTask.kt$ArtifactsTask$4 - MatchingDeclarationName:publishing.kt$PublishingExtension - NestedBlockDepth:ArtifactsCheckTask.kt$ArtifactsCheckTask$private fun StringBuilder.maybeAddChangedValueMessages( changed: List<Pair<ArtifactConfig, ArtifactConfig>> ): StringBuilder - NestedBlockDepth:file.kt$fun File.zipContentEquals(other: File): Boolean - OutdatedDocumentation:AbstractDependenciesBlock.kt$AbstractDependenciesBlock$fun addModuleStatement( configName: ConfigurationName, parsedString: String, projectPath: ProjectPath, projectAccessor: ProjectAccessor, suppressed: List<String> ) - OutdatedDocumentation:ModuleCheckRunner.kt$ModuleCheckRunner - SerialVersionUIDInSerializableClass:ArtifactConfig.kt$ArtifactConfig : Serializable - UndocumentedPublicClass:AbstractDependenciesBlock.kt$AbstractDependenciesBlock : DependenciesBlock - UndocumentedPublicClass:AbstractDependenciesBlock.kt$DependenciesBlocksProvider - UndocumentedPublicClass:AbstractDependenciesBlock.kt$DependenciesBlocksProvider$Factory - UndocumentedPublicClass:AbstractModuleCheckTask.kt$AbstractModuleCheckTask : DefaultTask - UndocumentedPublicClass:AbstractModuleCheckTask.kt$MultiRuleModuleCheckTask : AbstractModuleCheckTask - UndocumentedPublicClass:AbstractModuleCheckTask.kt$SingleRuleModuleCheckTask : AbstractModuleCheckTask - UndocumentedPublicClass:AbstractPluginsBlock.kt$AbstractPluginsBlock : PluginsBlock - UndocumentedPublicClass:AbstractPluginsBlock.kt$PluginsBlockProvider - UndocumentedPublicClass:AbstractPluginsBlock.kt$PluginsBlockProvider$Factory - UndocumentedPublicClass:AbstractProjectDependencyFinding.kt$AbstractProjectDependencyFinding : ProblemFixableFindingDependencyFindingConfiguredDependencyFinding - UndocumentedPublicClass:AddsDependency.kt$AddsDependency : Fixable - UndocumentedPublicClass:AndroidBasePackages.kt$AndroidBasePackages : Element - UndocumentedPublicClass:AndroidBasePackages.kt$AndroidBasePackages$Key : Key - UndocumentedPublicClass:AndroidDataBindingDeclarations.kt$AndroidDataBindingDeclarations : Element - UndocumentedPublicClass:AndroidDataBindingDeclarations.kt$AndroidDataBindingDeclarations$Key : Key - UndocumentedPublicClass:AndroidDataBindingNameProvider.kt$AndroidDataBindingNameProvider - UndocumentedPublicClass:AndroidDataBindingReferenceParsingInterceptor.kt$AndroidDataBindingReferenceParsingInterceptor : ParsingInterceptor - UndocumentedPublicClass:AndroidGradleSettings.kt$AndroidGradleParser - UndocumentedPublicClass:AndroidGradleSettings.kt$AndroidGradleSettings - UndocumentedPublicClass:AndroidGradleSettings.kt$AndroidGradleSettings$AgpBlock : Block - UndocumentedPublicClass:AndroidGradleSettings.kt$AndroidGradleSettings.AgpBlock$AndroidBlock : AgpBlock - UndocumentedPublicClass:AndroidGradleSettings.kt$AndroidGradleSettings.AgpBlock$BuildFeaturesBlock : AgpBlock - UndocumentedPublicClass:AndroidGradleSettings.kt$AndroidGradleSettingsProvider - UndocumentedPublicClass:AndroidGradleSettings.kt$AndroidGradleSettingsProvider$Factory - UndocumentedPublicClass:AndroidLayoutParser.kt$AndroidLayoutParser - UndocumentedPublicClass:AndroidManifestParser.kt$AndroidManifestParser - UndocumentedPublicClass:AndroidPlatformPluginFactory.kt$AndroidPlatformPluginFactory - UndocumentedPublicClass:AndroidRDeclaredNames.kt$AndroidRDeclaredNames : Element - UndocumentedPublicClass:AndroidRDeclaredNames.kt$AndroidRDeclaredNames$Key : Key - UndocumentedPublicClass:AndroidRNameProvider.kt$AndroidRNameProvider - UndocumentedPublicClass:AndroidResourceDeclaredNames.kt$AndroidResourceDeclaredNames : Element - UndocumentedPublicClass:AndroidResourceDeclaredNames.kt$AndroidResourceDeclaredNames$Key : Key - UndocumentedPublicClass:AndroidResourceParser.kt$AndroidResourceParser - UndocumentedPublicClass:AndroidResourceReferenceParsingInterceptor.kt$AndroidResourceReferenceParsingInterceptor : ParsingInterceptor - UndocumentedPublicClass:AndroidResourceReferences.kt$AndroidResourceReferences : Element - UndocumentedPublicClass:AndroidResourceReferences.kt$AndroidResourceReferences$Key : Key - UndocumentedPublicClass:AndroidSourceSetsParser.kt$AndroidSourceSetsParser - UndocumentedPublicClass:AndroidSourceSetsParser.kt$AndroidSourceSetsParser$Factory - UndocumentedPublicClass:AndroidStylesFile.kt$AndroidStylesFile : XmlFile - UndocumentedPublicClass:AndroidStylesFiles.kt$AndroidStylesFiles : Element - UndocumentedPublicClass:AndroidStylesFiles.kt$AndroidStylesFiles$Key : Key - UndocumentedPublicClass:AndroidStylesParser.kt$AndroidStylesParser - UndocumentedPublicClass:AndroidUnqualifiedResources.kt$AndroidUnqualifiedResources$Key : Key - UndocumentedPublicClass:AnvilFactoryRule.kt$AnvilFactoryRule : DocumentedRule - UndocumentedPublicClass:AnvilGradlePlugin.kt$AnvilAnnotatedType - UndocumentedPublicClass:AnvilGradlePlugin.kt$AnvilGradlePlugin - UndocumentedPublicClass:AnvilGradlePlugin.kt$AnvilScopeName - UndocumentedPublicClass:AnvilGradlePlugin.kt$AnvilScopeNameEntry - UndocumentedPublicClass:AnvilGradlePlugin.kt$RawAnvilAnnotatedType - UndocumentedPublicClass:AnvilScopeContributions.kt$AnvilScopeContributions : Element - UndocumentedPublicClass:AnvilScopeContributions.kt$AnvilScopeContributions$Key : Key - UndocumentedPublicClass:AnvilScopeDependencies.kt$AnvilScopeDependencies : Element - UndocumentedPublicClass:AnvilScopeDependencies.kt$AnvilScopeDependencies$Key : Key - UndocumentedPublicClass:AnvilScopeMerges.kt$AnvilScopeMerges : Element - UndocumentedPublicClass:AnvilScopeMerges.kt$AnvilScopeMerges$Key : Key - UndocumentedPublicClass:Assignment.kt$Assignment : BuildFileStatement - UndocumentedPublicClass:Block.kt$Block<T> - UndocumentedPublicClass:BuildFileParser.kt$BuildFileParser - UndocumentedPublicClass:BuildFileParser.kt$BuildFileParser$Factory - UndocumentedPublicClass:BuildFileStatement.kt$BuildFileStatement - UndocumentedPublicClass:CheckstyleReporter.kt$CheckstyleReporter - UndocumentedPublicClass:ClasspathDependencies.kt$ClasspathDependencies : Element - UndocumentedPublicClass:ClasspathDependencies.kt$ClasspathDependencies$Key : Key - UndocumentedPublicClass:ConcatenatingParsingInterceptor.kt$ConcatenatingParsingInterceptor : ParsingInterceptor - UndocumentedPublicClass:ConfigBuilder.kt$ConfigBuilder - UndocumentedPublicClass:ConfigFactory.kt$ConfigFactory<T : Any> - UndocumentedPublicClass:ConfigurationsFactory.kt$ConfigurationsFactory - UndocumentedPublicClass:ConfiguredDependency.kt$ConfiguredDependency : Dependency - UndocumentedPublicClass:ConfiguredDependency.kt$Dependency - UndocumentedPublicClass:CoroutineScopeModule.kt$DispatcherProviderComponent - UndocumentedPublicClass:CouldUseAnvilFinding.kt$CouldUseAnvilFinding : FindingFixable - UndocumentedPublicClass:Declarations.kt$Declarations : Element - UndocumentedPublicClass:Declarations.kt$Declarations$Key : Key - UndocumentedPublicClass:DeclarationsProvider.kt$DeclarationsProvider - UndocumentedPublicClass:Deletable.kt$Deletable : FindingDependencyFinding - UndocumentedPublicClass:DependenciesBlock.kt$DependenciesBlock : BlockHasSuppressedChildren - UndocumentedPublicClass:DependenciesBlock.kt$DependenciesBlocksProvider - UndocumentedPublicClass:DependenciesBlock.kt$DependenciesBlocksProvider$Factory - UndocumentedPublicClass:DependencyDeclaration.kt$DependencyDeclaration : BuildFileStatement - UndocumentedPublicClass:DependencyDeclaration.kt$DependencyDeclaration$ConfigurationNameTransform - UndocumentedPublicClass:DependencyDeclaration.kt$ExternalDependencyDeclaration : DependencyDeclaration - UndocumentedPublicClass:DependencyDeclaration.kt$ModuleDependencyDeclaration : DependencyDeclaration - UndocumentedPublicClass:DependencyDeclaration.kt$UnknownDependencyDeclaration : DependencyDeclaration - UndocumentedPublicClass:DependencySources.kt$DependencySources : Element - UndocumentedPublicClass:DependencySources.kt$DependencySources$Key : Key - UndocumentedPublicClass:DependencySources.kt$DependencySources$SourceKey - UndocumentedPublicClass:DependencySources.kt$DependencySources$SourceResult - UndocumentedPublicClass:DependencySources.kt$DependencySources.SourceResult$Found : SourceResult - UndocumentedPublicClass:DependencySources.kt$DependencySources.SourceResult$NOT_PRESENT : SourceResult - UndocumentedPublicClass:DepthFinding.kt$DepthFinding : FindingComparable - UndocumentedPublicClass:DepthRule.kt$DepthRule : DocumentedRuleReportOnlyRule - UndocumentedPublicClass:Depths.kt$Depths : Element - UndocumentedPublicClass:Depths.kt$Depths$Key : Key - UndocumentedPublicClass:Depths.kt$ProjectDepth : Comparable - UndocumentedPublicClass:DisableAndroidResourcesRule.kt$DisableAndroidResourcesRule : DocumentedRule - UndocumentedPublicClass:DisableViewBindingGenerationFinding.kt$DisableViewBindingGenerationFinding : FindingFixable - UndocumentedPublicClass:DisableViewBindingRule.kt$DisableViewBindingRule : DocumentedRule - UndocumentedPublicClass:DocumentedRule.kt$DocumentedRule<T : Finding> : ModuleCheckRule - UndocumentedPublicClass:DownstreamDependency.kt$DownstreamDependency - UndocumentedPublicClass:DownstreamProjects.kt$DownstreamProjects : SetElement - UndocumentedPublicClass:DownstreamProjects.kt$DownstreamProjects$Key : Key - UndocumentedPublicClass:ExternalDependencies.kt$ExternalDependencies : MutableMap - UndocumentedPublicClass:ExternalDependency.kt$ExternalDependency : ConfiguredDependencyHasMavenCoordinates - UndocumentedPublicClass:ExternalDependency.kt$ExternalDependency$ExternalCodeGeneratorDependency : ExternalDependencyMightHaveCodeGeneratorBinding - UndocumentedPublicClass:ExternalDependency.kt$ExternalDependency$ExternalRuntimeDependency : ExternalDependency - UndocumentedPublicClass:ExternalDependencyDeclarationVisitor.kt$ExternalDependencyDeclarationVisitor - UndocumentedPublicClass:Finding.kt$ConfigurationFinding - UndocumentedPublicClass:Finding.kt$ConfiguredDependencyFinding : ConfigurationFinding - UndocumentedPublicClass:Finding.kt$DependencyFinding - UndocumentedPublicClass:Finding.kt$Finding - UndocumentedPublicClass:Finding.kt$Finding$FindingResult - UndocumentedPublicClass:Finding.kt$Finding$Position : Comparable - UndocumentedPublicClass:Finding.kt$ProjectDependencyFinding : ConfiguredDependencyFindingConfigurationFinding - UndocumentedPublicClass:FindingFactory.kt$FindingFactory<T : Finding> - UndocumentedPublicClass:FindingFactory.kt$RuleFilter - UndocumentedPublicClass:FindingName.kt$FindingName - UndocumentedPublicClass:FindingResultFactory.kt$FindingResultFactory - UndocumentedPublicClass:Fixable.kt$Fixable : FindingProblem - UndocumentedPublicClass:Fixable.kt$ModifiesProjectDependency : RemovesDependencyAddsDependency - UndocumentedPublicClass:FqNames.kt$FqNames - UndocumentedPublicClass:GradleMcLogger.kt$GradleMcLogger : McLogger - UndocumentedPublicClass:GradleProjectProvider.kt$GradleProjectProvider : ProjectProviderAllProjectPathsProvider - UndocumentedPublicClass:GraphvizFileWriter.kt$GraphvizFileWriter - UndocumentedPublicClass:GroovyAndroidGradleParser.kt$GroovyAndroidGradleParser : AndroidGradleParser - UndocumentedPublicClass:GroovyDependenciesBlock.kt$GroovyDependenciesBlock : AbstractDependenciesBlock - UndocumentedPublicClass:GroovyDependenciesBlockParser.kt$GroovyDependenciesBlockParser - UndocumentedPublicClass:GroovyPluginsBlock.kt$GroovyPluginsBlock : AbstractPluginsBlock - UndocumentedPublicClass:GroovyPluginsBlockParser.kt$GroovyPluginsBlockParser - UndocumentedPublicClass:HasConfigurations.kt$HasConfigurations - UndocumentedPublicClass:HasConfigurations.kt$HasDependencies - UndocumentedPublicClass:HasIdentifier.kt$HasIdentifier - UndocumentedPublicClass:HasIdentifier.kt$HasMavenCoordinates : HasIdentifier - UndocumentedPublicClass:HasProjectCache.kt$HasProjectCache - UndocumentedPublicClass:HasSuppressions.kt$HasSuppressions<T : Any> - UndocumentedPublicClass:Imports.kt$Imports : Element - UndocumentedPublicClass:Imports.kt$Imports$Key : Key - UndocumentedPublicClass:InheritedDependencyFinding.kt$InheritedDependencyFinding : AbstractProjectDependencyFindingAddsDependencyComparable - UndocumentedPublicClass:InheritedDependencyRule.kt$InheritedDependencyRule : DocumentedRule - UndocumentedPublicClass:InterpretingInterceptor.kt$InterpretingInterceptor : ParsingInterceptor - UndocumentedPublicClass:InvokesConfigurationNames.kt$HasBuildFile - UndocumentedPublicClass:InvokesConfigurationNames.kt$HasDependencyDeclarations : HasBuildFileHasDependenciesHasConfigurationsPluginAware - UndocumentedPublicClass:InvokesConfigurationNames.kt$InvokesConfigurationNames : PluginAwareHasBuildFileHasConfigurationsHasDependencyDeclarations - UndocumentedPublicClass:JavaParserNodeResolver.kt$JavaParserNodeResolver - UndocumentedPublicClass:JvmFile.kt$JavaFile : JvmFile - UndocumentedPublicClass:JvmFile.kt$JvmFile : HasReferences - UndocumentedPublicClass:JvmFile.kt$KotlinFile : JvmFile - UndocumentedPublicClass:JvmFile.kt$KotlinFile$ScopeArgumentParseResult - UndocumentedPublicClass:JvmFileProvider.kt$JvmFileProvider - UndocumentedPublicClass:JvmFileProvider.kt$JvmFileProvider$Factory - UndocumentedPublicClass:JvmPlatformPluginFactory.kt$JvmPlatformPluginFactory - UndocumentedPublicClass:JvmSourceSetsParser.kt$JvmSourceSetsParser - UndocumentedPublicClass:KaptDependencies.kt$KaptDependencies : Element - UndocumentedPublicClass:KaptDependencies.kt$KaptDependencies$Key : Key - UndocumentedPublicClass:KaptMatcher.kt$KaptMatcher - UndocumentedPublicClass:KotlinAndroidGradleParser.kt$KotlinAndroidGradleParser : AndroidGradleParser - UndocumentedPublicClass:KotlinDependenciesBlock.kt$KotlinDependenciesBlock : AbstractDependenciesBlock - UndocumentedPublicClass:KotlinDependenciesBlockParser.kt$KotlinDependenciesBlockParser - UndocumentedPublicClass:KotlinPluginsBlock.kt$KotlinPluginsBlock : AbstractPluginsBlock - UndocumentedPublicClass:KotlinPluginsBlockParser.kt$KotlinPluginsBlockParser - UndocumentedPublicClass:LayoutFiles.kt$LayoutFiles : Element - UndocumentedPublicClass:LayoutFiles.kt$LayoutFiles$Key : Key - UndocumentedPublicClass:LazySet.kt$LazySet$State<out E> - UndocumentedPublicClass:LazySet.kt$LazySet.DataSource$Priority : Comparable - UndocumentedPublicClass:LazySet.kt$LazySet<out E> : FlowLazySetComponent - UndocumentedPublicClass:LazySet.kt$LazySetComponent<out E> - UndocumentedPublicClass:ManifestFiles.kt$ManifestFiles : Element - UndocumentedPublicClass:ManifestFiles.kt$ManifestFiles$Key : Key - UndocumentedPublicClass:MavenCoordinates.kt$Identifier - UndocumentedPublicClass:MavenCoordinates.kt$MavenCoordinates : IdentifierComparable - UndocumentedPublicClass:McConfiguration.kt$McConfiguration - UndocumentedPublicClass:McLogger.kt$McLogger - UndocumentedPublicClass:McLogger.kt$Report - UndocumentedPublicClass:McLogger.kt$Report$ReportBuilder - UndocumentedPublicClass:McLogger.kt$Report$ReportEntry - UndocumentedPublicClass:McLogger.kt$Report.ReportEntry$AppendNewLine - UndocumentedPublicClass:McProject.kt$McProject : ProjectContextComparableHasProjectPathHasProjectCacheHasBuildFileHasConfigurationsHasDependenciesHasSourceSetsHasDependencyDeclarationsInvokesConfigurationNamesHasPlatformPluginPluginAware - UndocumentedPublicClass:McProjectBuilder.kt$McProjectBuilder<P : PlatformPluginBuilder<*>> : HasDependencyDeclarationsInvokesConfigurationNamesHasDependencies - UndocumentedPublicClass:McSourceSet.kt$HasSourceSets - UndocumentedPublicClass:ModuleCheckExtension.kt$ChecksExtension : ChecksSettings - UndocumentedPublicClass:ModuleCheckExtension.kt$ModuleCheckExtension : ModuleCheckSettings - UndocumentedPublicClass:ModuleCheckExtension.kt$PerModuleReportExtension : PerModuleReportSettings - UndocumentedPublicClass:ModuleCheckExtension.kt$ReportExtension : ReportSettings - UndocumentedPublicClass:ModuleCheckExtension.kt$ReportsExtension : ReportsSettings - UndocumentedPublicClass:ModuleCheckExtension.kt$SortExtension : SortSettings - UndocumentedPublicClass:ModuleCheckPlugin.kt$ModuleCheckPlugin : Plugin - UndocumentedPublicClass:ModuleCheckRule.kt$AllRules - UndocumentedPublicClass:ModuleCheckRule.kt$ModuleCheckRule<T : Finding> - UndocumentedPublicClass:ModuleCheckRule.kt$ReportOnlyRule<T : Finding> : ModuleCheckRule - UndocumentedPublicClass:ModuleCheckRule.kt$SortRule<T : Finding> : ModuleCheckRule - UndocumentedPublicClass:ModuleCheckRunner.kt$ModuleCheckRunner$Factory - UndocumentedPublicClass:ModuleCheckRunner.kt$ModuleCheckRunner$TimedResults<R> - UndocumentedPublicClass:ModuleCheckSettings.kt$ChecksSettings - UndocumentedPublicClass:ModuleCheckSettings.kt$ModuleCheckSettings - UndocumentedPublicClass:ModuleCheckSettings.kt$PerModuleReportSettings - UndocumentedPublicClass:ModuleCheckSettings.kt$ReportSettings - UndocumentedPublicClass:ModuleCheckSettings.kt$ReportsSettings - UndocumentedPublicClass:ModuleCheckSettings.kt$SortSettings - UndocumentedPublicClass:MustBeApi.kt$InheritedDependencyWithSource - UndocumentedPublicClass:MustBeApi.kt$MustBeApi : SetElement - UndocumentedPublicClass:MustBeApi.kt$MustBeApi$Key : Key - UndocumentedPublicClass:MustBeApiFinding.kt$MustBeApiFinding : AbstractProjectDependencyFindingModifiesProjectDependencyAddsDependencyRemovesDependency - UndocumentedPublicClass:MustBeApiRule.kt$MustBeApiRule : DocumentedRule - UndocumentedPublicClass:NameParser.kt$NameParser - UndocumentedPublicClass:NameParser.kt$ParsingChain : Chain - UndocumentedPublicClass:NameParser.kt$ParsingChain$Factory : NameParser - UndocumentedPublicClass:NameParser.kt$ParsingInterceptor - UndocumentedPublicClass:NameParser.kt$ParsingInterceptor$Chain - UndocumentedPublicClass:OverShotDependencies.kt$OverShotDependencies : Element - UndocumentedPublicClass:OverShotDependencies.kt$OverShotDependencies$Key : Key - UndocumentedPublicClass:OverShotDependencyFinding.kt$OverShotDependencyFinding : AbstractProjectDependencyFindingAddsDependency - UndocumentedPublicClass:OverShotDependencyRule.kt$OverShotDependencyRule : DocumentedRule - UndocumentedPublicClass:PlatformPlugin.kt$AndroidPlatformPlugin : PlatformPlugin - UndocumentedPublicClass:PlatformPlugin.kt$AndroidPlatformPlugin$AndroidApplicationPlugin : PlatformPluginAndroidPlatformPlugin - UndocumentedPublicClass:PlatformPlugin.kt$AndroidPlatformPlugin$AndroidDynamicFeaturePlugin : PlatformPluginAndroidPlatformPluginCanDisableAndroidBuildConfig - UndocumentedPublicClass:PlatformPlugin.kt$AndroidPlatformPlugin$AndroidLibraryPlugin : PlatformPluginAndroidPlatformPluginCanDisableAndroidResourcesCanDisableAndroidBuildConfig - UndocumentedPublicClass:PlatformPlugin.kt$AndroidPlatformPlugin$AndroidTestPlugin : PlatformPluginAndroidPlatformPluginCanDisableAndroidBuildConfig - UndocumentedPublicClass:PlatformPlugin.kt$AndroidPlatformPlugin$CanDisableAndroidBuildConfig - UndocumentedPublicClass:PlatformPlugin.kt$AndroidPlatformPlugin$CanDisableAndroidResources - UndocumentedPublicClass:PlatformPlugin.kt$JvmPlatformPlugin : PlatformPlugin - UndocumentedPublicClass:PlatformPlugin.kt$JvmPlatformPlugin$JavaLibraryPlugin : JvmPlatformPlugin - UndocumentedPublicClass:PlatformPlugin.kt$JvmPlatformPlugin$KotlinJvmPlugin : JvmPlatformPlugin - UndocumentedPublicClass:PlatformPluginBuilder.kt$AndroidApplicationPluginBuilder : AndroidPlatformPluginBuilder - UndocumentedPublicClass:PlatformPluginBuilder.kt$AndroidDynamicFeaturePluginBuilder : AndroidPlatformPluginBuilder - UndocumentedPublicClass:PlatformPluginBuilder.kt$AndroidLibraryPluginBuilder : AndroidPlatformPluginBuilder - UndocumentedPublicClass:PlatformPluginBuilder.kt$AndroidPlatformPluginBuilder<T : AndroidPlatformPlugin> : PlatformPluginBuilder - UndocumentedPublicClass:PlatformPluginBuilder.kt$AndroidTestPluginBuilder : AndroidPlatformPluginBuilder - UndocumentedPublicClass:PlatformPluginBuilder.kt$JavaLibraryPluginBuilder : PlatformPluginBuilder - UndocumentedPublicClass:PlatformPluginBuilder.kt$KotlinJvmPluginBuilder : PlatformPluginBuilder - UndocumentedPublicClass:PlatformPluginBuilder.kt$PlatformPluginBuilder<T : PlatformPlugin> - UndocumentedPublicClass:PluginAware.kt$HasPlatformPlugin : PluginAware - UndocumentedPublicClass:PluginAware.kt$PluginAware - UndocumentedPublicClass:PluginDeclaration.kt$PluginDeclaration : BuildFileStatement - UndocumentedPublicClass:PluginsBlock.kt$PluginsBlock : BlockHasSuppressedChildren - UndocumentedPublicClass:PluginsBlock.kt$PluginsBlockProvider - UndocumentedPublicClass:PluginsBlock.kt$PluginsBlockProvider$Factory - UndocumentedPublicClass:PrintLogger.kt$PrintLogger : McLogger - UndocumentedPublicClass:Problem.kt$Problem : FindingDependencyFinding - UndocumentedPublicClass:ProjectAccessor.kt$ProjectAccessor - UndocumentedPublicClass:ProjectAccessor.kt$ProjectAccessor$StringProjectAccessor : ProjectAccessor - UndocumentedPublicClass:ProjectAccessor.kt$ProjectAccessor$TypeSafeProjectAccessor : ProjectAccessor - UndocumentedPublicClass:ProjectCache.kt$ProjectCache : HasTraceTags - UndocumentedPublicClass:ProjectContext.kt$ProjectContext - UndocumentedPublicClass:ProjectContext.kt$ProjectContext$Element - UndocumentedPublicClass:ProjectContext.kt$ProjectContext$Key<E : Element> - UndocumentedPublicClass:ProjectDependencies.kt$ProjectDependencies : MutableMap - UndocumentedPublicClass:ProjectPath.kt$ProjectPath : IdentifierComparable - UndocumentedPublicClass:ProjectPath.kt$ProjectPath$StringProjectPath : ProjectPath - UndocumentedPublicClass:ProjectPath.kt$ProjectPath$TypeSafeProjectPath : ProjectPath - UndocumentedPublicClass:ProjectProvider.kt$ProjectProvider : HasProjectCacheAllProjectPathsProvider - UndocumentedPublicClass:ProjectProvider.kt$ProjectRoot - UndocumentedPublicClass:PsiElementResolver.kt$PsiElementResolver - UndocumentedPublicClass:PsiElementWithSurroundingText.kt$PsiElementWithSurroundingText - UndocumentedPublicClass:PublicDependencies.kt$PublicDependencies : SetElement - UndocumentedPublicClass:PublicDependencies.kt$PublicDependencies$Key : Key - UndocumentedPublicClass:RealAllProjectPathsProvider.kt$RealAllProjectPathsProvider : AllProjectPathsProvider - UndocumentedPublicClass:RealAndroidDataBindingNameProvider.kt$RealAndroidDataBindingNameProvider : AndroidDataBindingNameProvider - UndocumentedPublicClass:RealAndroidGradleSettingsProvider.kt$RealAndroidGradleSettingsProvider : AndroidGradleSettingsProvider - UndocumentedPublicClass:RealAndroidGradleSettingsProvider.kt$RealAndroidGradleSettingsProvider$Factory : Factory - UndocumentedPublicClass:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory : AndroidPlatformPluginFactory - UndocumentedPublicClass:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory$Type<T : AndroidCommonExtension> - UndocumentedPublicClass:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory.Type$Application : Type - UndocumentedPublicClass:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory.Type$DynamicFeature : Type - UndocumentedPublicClass:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory.Type$Library : Type - UndocumentedPublicClass:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory.Type$Test : Type - UndocumentedPublicClass:RealAndroidRNameProvider.kt$RealAndroidRNameProvider : AndroidRNameProvider - UndocumentedPublicClass:RealAndroidSourceSetsParser.kt$RealAndroidSourceSetsParser$Factory : Factory - UndocumentedPublicClass:RealBuildFileParser.kt$RealBuildFileParser : BuildFileParser - UndocumentedPublicClass:RealBuildFileParser.kt$RealBuildFileParser$Factory : Factory - UndocumentedPublicClass:RealConfigurationsFactory.kt$RealConfigurationsFactory : ConfigurationsFactory - UndocumentedPublicClass:RealDeclarationsProvider.kt$RealDeclarationsProvider : DeclarationsProvider - UndocumentedPublicClass:RealDependenciesBlocksProvider.kt$RealDependenciesBlocksProvider : DependenciesBlocksProvider - UndocumentedPublicClass:RealDependenciesBlocksProvider.kt$RealDependenciesBlocksProvider$Factory : Factory - UndocumentedPublicClass:RealDocsWebsiteUrlProvider.kt$RealDocsWebsiteUrlProvider : DocsWebsiteUrlProvider - UndocumentedPublicClass:RealDocsWebsiteUrlProvider.kt$RealModuleCheckVersionProvider : ModuleCheckVersionProvider - UndocumentedPublicClass:RealDocsWebsiteUrlProvider.kt$RealSourceWebsiteUrlProvider : SourceWebsiteUrlProvider - UndocumentedPublicClass:RealFindingResultFactory.kt$RealFindingResultFactory : FindingResultFactory - UndocumentedPublicClass:RealJavaFile.kt$RealJavaFile : JavaFile - UndocumentedPublicClass:RealJvmFileProvider.kt$RealJvmFileProvider : JvmFileProvider - UndocumentedPublicClass:RealJvmFileProvider.kt$RealJvmFileProvider$Factory : Factory - UndocumentedPublicClass:RealJvmSourceSetsParser.kt$RealJvmSourceSetsParser : JvmSourceSetsParser - UndocumentedPublicClass:RealKotlinFile.kt$RealKotlinFile : KotlinFile - UndocumentedPublicClass:RealMcProject.kt$RealMcProject : McProject - UndocumentedPublicClass:RealPluginsBlockProvider.kt$RealPluginsBlockProvider : PluginsBlockProvider - UndocumentedPublicClass:RealPluginsBlockProvider.kt$RealPluginsBlockProvider$Factory : Factory - UndocumentedPublicClass:RedundantDependencies.kt$RedundantDependencies : Element - UndocumentedPublicClass:RedundantDependencies.kt$RedundantDependencies$Key : Key - UndocumentedPublicClass:RedundantDependencyFinding.kt$RedundantDependency - UndocumentedPublicClass:RedundantDependencyFinding.kt$RedundantDependencyFinding : AbstractProjectDependencyFindingRemovesDependencyDeletable - UndocumentedPublicClass:RedundantRule.kt$RedundantRule : DocumentedRule - UndocumentedPublicClass:ReferenceVisitor.kt$ReferenceVisitor : KtTreeVisitorVoid - UndocumentedPublicClass:References.kt$References : Element - UndocumentedPublicClass:References.kt$References$Key : Key - UndocumentedPublicClass:RemovesDependency.kt$RemovesDependency : Fixable - UndocumentedPublicClass:RemovesDependency.kt$RemovesDependency$RemovalStrategy - UndocumentedPublicClass:ResSourceFiles.kt$ResSourceFiles : Element - UndocumentedPublicClass:ResSourceFiles.kt$ResSourceFiles$Key : Key - UndocumentedPublicClass:ResolvedDeclaredNames.kt$ResolvedDeclaredNames : Element - UndocumentedPublicClass:ResolvedDeclaredNames.kt$ResolvedDeclaredNames$Key : Key - UndocumentedPublicClass:ResolvedDeclaredNames.kt$ResolvedDeclaredNames$McProjectWithSourceSetName - UndocumentedPublicClass:RulesComponent.kt$RulesComponent - UndocumentedPublicClass:RunnerComponent.kt$RunnerComponent - UndocumentedPublicClass:SafeXmlParser.kt$SafeXmlParser - UndocumentedPublicClass:SarifReport.kt$Content - UndocumentedPublicClass:SarifReport.kt$Role - UndocumentedPublicClass:SarifReportFactory.kt$SarifReportFactory - UndocumentedPublicClass:SortDependenciesFinding.kt$SortDependenciesFinding : FindingFixable - UndocumentedPublicClass:SortDependenciesRule.kt$SortDependenciesRule : DocumentedRuleSortRule - UndocumentedPublicClass:SortPluginsRule.kt$SortPluginsRule : DocumentedRuleSortRule - UndocumentedPublicClass:SourceSetDependencies.kt$SourceSetDependencies : Element - UndocumentedPublicClass:SourceSetDependencies.kt$SourceSetDependencies$Key : Key - UndocumentedPublicClass:SourceSetDependency.kt$SourceSetDependency : HasIdentifier - UndocumentedPublicClass:SourceSetDependency.kt$SourceSetDependency$SourceSetExternalDependency : SourceSetDependencyHasMavenCoordinates - UndocumentedPublicClass:SourceSetDependency.kt$SourceSetDependency$SourceSetProjectDependency : SourceSetDependencyHasProjectPath - UndocumentedPublicClass:SourceSetName.kt$SourceSetName - UndocumentedPublicClass:SourceSetsFactory.kt$SourceSetsFactory - UndocumentedPublicClass:Suppressions.kt$Suppressions - UndocumentedPublicClass:TaskComponent.kt$TaskComponent : RunnerComponentRulesComponent - UndocumentedPublicClass:TaskComponent.kt$TaskComponent$Factory - UndocumentedPublicClass:TestSettings.kt$TestChecksSettings : ChecksSettings - UndocumentedPublicClass:TestSettings.kt$TestPerModuleReportSettings : PerModuleReportSettings - UndocumentedPublicClass:TestSettings.kt$TestReportSettings : ReportSettings - UndocumentedPublicClass:TestSettings.kt$TestReportsSettings : ReportsSettings - UndocumentedPublicClass:TestSettings.kt$TestSettings : ModuleCheckSettings - UndocumentedPublicClass:TestSettings.kt$TestSortSettings : SortSettings - UndocumentedPublicClass:Trace.kt$Trace$Key : Key - UndocumentedPublicClass:TransitiveProjectDependency.kt$TransitiveProjectDependency - UndocumentedPublicClass:TypeSafeProjectPathResolver.kt$AllProjectPathsProvider - UndocumentedPublicClass:UnusedDependencies.kt$UnusedDependencies : Element - UndocumentedPublicClass:UnusedDependencies.kt$UnusedDependencies$Key : Key - UndocumentedPublicClass:UnusedDependency.kt$UnusedDependency - UndocumentedPublicClass:UnusedDependency.kt$UnusedDependencyFinding : AbstractProjectDependencyFindingRemovesDependencyDeletable - UndocumentedPublicClass:UnusedDependencyRule.kt$UnusedDependencyRule : DocumentedRule - UndocumentedPublicClass:UnusedKaptPluginRule.kt$UnusedKaptPluginRule : DocumentedRule - UndocumentedPublicClass:UnusedKaptProcessorFinding.kt$UnusedKaptProcessorFinding : FindingProblemFixableDependencyFindingConfigurationFindingRemovesDependency - UndocumentedPublicClass:UnusedKaptProcessorRule.kt$UnusedKaptProcessorRule : DocumentedRule - UndocumentedPublicClass:UnusedKotlinAndroidExtensionsRule.kt$UnusedKotlinAndroidExtensionsRule : DocumentedRule - UndocumentedPublicClass:UnusedPluginFinding.kt$UnusedPluginFinding : FindingProblemFixableDeletable - UndocumentedPublicClass:UnusedResourcesGenerationFinding.kt$UnusedResourcesGenerationFinding : FindingFixable - UndocumentedPublicClass:XmlFile.kt$XmlFile : HasReferences - UndocumentedPublicClass:XmlFile.kt$XmlFile$LayoutFile : XmlFile - UndocumentedPublicClass:XmlFile.kt$XmlFile$ManifestFile : XmlFile - UndocumentedPublicFunction:AbstractDependenciesBlock.kt$AbstractDependenciesBlock$fun addNonModuleStatement( configName: ConfigurationName, parsedString: String, coordinates: MavenCoordinates, suppressed: List<String> ) - UndocumentedPublicFunction:AbstractDependenciesBlock.kt$AbstractDependenciesBlock$fun addUnknownStatement( configName: ConfigurationName, parsedString: String, argument: String, suppressed: List<String> ) - UndocumentedPublicFunction:AbstractDependenciesBlock.kt$DependenciesBlocksProvider$suspend fun get(): List<DependenciesBlock> - UndocumentedPublicFunction:AbstractDependenciesBlock.kt$DependenciesBlocksProvider.Factory$fun create(invokesConfigurationNames: InvokesConfigurationNames): DependenciesBlocksProvider - UndocumentedPublicFunction:AbstractModuleCheckTask.kt$AbstractModuleCheckTask$@TaskAction fun run() - UndocumentedPublicFunction:AbstractPluginsBlock.kt$AbstractPluginsBlock$fun addStatement(parsedString: String, suppressed: List<String>) - UndocumentedPublicFunction:AbstractPluginsBlock.kt$PluginsBlockProvider$fun get(): PluginsBlock? - UndocumentedPublicFunction:AbstractPluginsBlock.kt$PluginsBlockProvider.Factory$fun create(buildFile: File): PluginsBlockProvider - UndocumentedPublicFunction:AbstractProjectDependencyFinding.kt$AbstractProjectDependencyFinding$abstract fun fromStringOrEmpty(): String - UndocumentedPublicFunction:AddsDependency.kt$AddsDependency$suspend fun addDependency(): Boolean - UndocumentedPublicFunction:AndroidBasePackages.kt$AndroidBasePackages$suspend fun get(sourceSetName: SourceSetName): PackageName? - UndocumentedPublicFunction:AndroidBasePackages.kt$suspend fun ProjectContext.androidBasePackages(): AndroidBasePackages - UndocumentedPublicFunction:AndroidBasePackages.kt$suspend fun ProjectContext.androidBasePackagesForSourceSetName( sourceSetName: SourceSetName ): PackageName? - UndocumentedPublicFunction:AndroidDataBindingDeclarations.kt$AndroidDataBindingDeclarations$suspend fun get(sourceSetName: SourceSetName): LazySet<AndroidDataBindingDeclaredName> - UndocumentedPublicFunction:AndroidDataBindingDeclarations.kt$suspend fun ProjectContext.androidDataBindingDeclarations(): AndroidDataBindingDeclarations - UndocumentedPublicFunction:AndroidDataBindingDeclarations.kt$suspend fun ProjectContext.androidDataBindingDeclarationsForSourceSetName( sourceSetName: SourceSetName ): LazySet<AndroidDataBindingDeclaredName> - UndocumentedPublicFunction:AndroidDataBindingNameProvider.kt$AndroidDataBindingNameProvider$suspend fun get(): LazySet<AndroidDataBindingDeclaredName> - UndocumentedPublicFunction:AndroidGradleSettings.kt$AndroidGradleParser$suspend fun parse(buildFile: File): AndroidGradleSettings - UndocumentedPublicFunction:AndroidGradleSettings.kt$AndroidGradleSettingsProvider$suspend fun get(): AndroidGradleSettings - UndocumentedPublicFunction:AndroidGradleSettings.kt$AndroidGradleSettingsProvider.Factory$fun create(buildFile: File): AndroidGradleSettingsProvider - UndocumentedPublicFunction:AndroidLayoutParser.kt$AndroidLayoutParser$fun parseResources(file: File): Set<String> - UndocumentedPublicFunction:AndroidLayoutParser.kt$AndroidLayoutParser$fun parseViews(file: File): Set<String> - UndocumentedPublicFunction:AndroidManifestParser.kt$AndroidManifestParser$fun parse(file: File): Map<String, String> - UndocumentedPublicFunction:AndroidManifestParser.kt$AndroidManifestParser$fun parseResources(file: File): Set<String> - UndocumentedPublicFunction:AndroidRDeclaredNames.kt$AndroidRDeclaredNames$suspend fun all(): Set<AndroidRDeclaredName> - UndocumentedPublicFunction:AndroidRDeclaredNames.kt$AndroidRDeclaredNames$suspend fun get(sourceSetName: SourceSetName): AndroidRDeclaredName? - UndocumentedPublicFunction:AndroidRDeclaredNames.kt$suspend fun ProjectContext.androidRDeclaredNameForSourceSetName( sourceSetName: SourceSetName ): AndroidRDeclaredName? - UndocumentedPublicFunction:AndroidRDeclaredNames.kt$suspend fun ProjectContext.androidRDeclaredNames(): AndroidRDeclaredNames - UndocumentedPublicFunction:AndroidResourceDeclaredNames.kt$suspend fun ProjectContext.androidResourceDeclaredNames(): AndroidResourceDeclaredNames - UndocumentedPublicFunction:AndroidResourceReferences.kt$AndroidResourceReferences$suspend fun get(sourceSetName: SourceSetName): LazySet<ReferenceName> - UndocumentedPublicFunction:AndroidResourceReferences.kt$suspend fun ProjectContext.androidResourceReferencesForSourceSetName( sourceSetName: SourceSetName ): LazySet<ReferenceName> - UndocumentedPublicFunction:AndroidSourceSetsParser.kt$AndroidSourceSetsParser$fun parse(): SourceSets - UndocumentedPublicFunction:AndroidStylesFiles.kt$AndroidStylesFiles$suspend fun all(): Map<SourceSetName, Set<AndroidStylesFile>> - UndocumentedPublicFunction:AndroidStylesFiles.kt$AndroidStylesFiles$suspend fun get(sourceSetName: SourceSetName): Set<AndroidStylesFile> - UndocumentedPublicFunction:AndroidStylesFiles.kt$suspend fun ProjectContext.androidStylesFiles(): AndroidStylesFiles - UndocumentedPublicFunction:AndroidStylesFiles.kt$suspend fun ProjectContext.androidStylesFilesForSourceSetName( sourceSetName: SourceSetName ): Set<AndroidStylesFile> - UndocumentedPublicFunction:AndroidStylesParser.kt$AndroidStylesParser$fun parseFile(file: File): Set<UnqualifiedAndroidResourceReferenceName> - UndocumentedPublicFunction:AnvilFactoryRule.kt$AnvilFactoryRule$@Suppress("ComplexMethod") suspend fun parse(findingName: FindingName, project: McProject): List<CouldUseAnvilFinding> - UndocumentedPublicFunction:AnvilScopeContributions.kt$suspend fun ProjectContext.anvilScopeContributions(): AnvilScopeContributions - UndocumentedPublicFunction:AnvilScopeDependencies.kt$AnvilScopeDependencies$suspend fun get(sourceSetName: SourceSetName): List<ProjectDependency> - UndocumentedPublicFunction:AnvilScopeDependencies.kt$suspend fun ProjectContext.anvilScopeDependencies(): AnvilScopeDependencies - UndocumentedPublicFunction:AnvilScopeDependencies.kt$suspend fun ProjectContext.anvilScopeDependenciesForSourceSetName( sourceSetName: SourceSetName ): List<ProjectDependency> - UndocumentedPublicFunction:AnvilScopeMerges.kt$suspend fun ProjectContext.anvilScopeMerges(): AnvilScopeMerges - UndocumentedPublicFunction:BuildFileParser.kt$BuildFileParser$suspend fun androidSettings(): AndroidGradleSettings - UndocumentedPublicFunction:BuildFileParser.kt$BuildFileParser$suspend fun dependenciesBlocks(): List<DependenciesBlock> - UndocumentedPublicFunction:BuildFileParser.kt$BuildFileParser$suspend fun pluginsBlock(): PluginsBlock? - UndocumentedPublicFunction:BuildFileParser.kt$BuildFileParser.Factory$fun create(invokesConfigurationNames: InvokesConfigurationNames): BuildFileParser - UndocumentedPublicFunction:CaseMatcher.kt$CaseMatcher$open fun matches(source: String?): Boolean - UndocumentedPublicFunction:CheckstyleReporter.kt$CheckstyleReporter$fun createXml(results: List<FindingResult>): String - UndocumentedPublicFunction:ClasspathDependencies.kt$ClasspathDependencies$suspend fun all(): List<TransitiveProjectDependency> - UndocumentedPublicFunction:ClasspathDependencies.kt$ClasspathDependencies$suspend fun get(key: SourceSetName): List<TransitiveProjectDependency> - UndocumentedPublicFunction:ClasspathDependencies.kt$suspend fun ProjectContext.classpathDependencies(): ClasspathDependencies - UndocumentedPublicFunction:CodeGenerator.kt$fun List<CodeGenerator>.asMap(): Map<String, CodeGenerator> - UndocumentedPublicFunction:ConfigBuilder.kt$ConfigBuilder$fun toConfig(configFactory: ConfigFactory<String>): McConfiguration - UndocumentedPublicFunction:ConfigBuilder.kt$ConfigBuilder.Companion$fun fromConfig(configuration: McConfiguration): ConfigBuilder - UndocumentedPublicFunction:ConfigFactory.kt$ConfigFactory$fun create(t: T): McConfiguration - UndocumentedPublicFunction:ConfigurationName.kt$fun <T : Any> Map<ConfigurationName, Collection<T>>.main(): List<T> - UndocumentedPublicFunction:ConfigurationsFactory.kt$ConfigurationsFactory$fun create(gradleProject: GradleProject): Configurations - UndocumentedPublicFunction:ConfiguredDependency.kt$ConfiguredDependency.Companion$inline fun <reified T : ConfiguredDependency> T.copy( configurationName: ConfigurationName = this.configurationName, isTestFixture: Boolean = this.isTestFixture ): ConfiguredDependency - UndocumentedPublicFunction:Declarations.kt$Declarations$suspend fun all(): LazySet<DeclaredName> - UndocumentedPublicFunction:Declarations.kt$Declarations$suspend fun get( sourceSetName: SourceSetName, includeUpstream: Boolean, packageNameOrNull: PackageName? = null ): LazySet<DeclaredName> - UndocumentedPublicFunction:Declarations.kt$suspend fun ProjectContext.declarations(): Declarations - UndocumentedPublicFunction:Declarations.kt$suspend fun ProjectDependency.declarations( projectCache: ProjectCache, packageNameOrNull: PackageName? = null ): LazySet<DeclaredName> - UndocumentedPublicFunction:DeclarationsProvider.kt$DeclarationsProvider$suspend fun get(sourceSetName: SourceSetName, packageName: PackageName): LazySet<DeclaredName> - UndocumentedPublicFunction:DeclarationsProvider.kt$DeclarationsProvider$suspend fun getWithUpstream( sourceSetName: SourceSetName, packageNameOrNull: PackageName? = null ): LazySet<DeclaredName> - UndocumentedPublicFunction:DeclaredName.kt$QualifiedDeclaredName$open fun asReferenceName(language: CompatibleLanguage): ReferenceName - UndocumentedPublicFunction:Deletable.kt$Deletable$suspend fun delete(): Boolean - UndocumentedPublicFunction:DependenciesBlock.kt$DependenciesBlock$fun getOrEmpty( mavenCoordinates: MavenCoordinates, configName: ConfigurationName ): List<ExternalDependencyDeclaration> - UndocumentedPublicFunction:DependenciesBlock.kt$DependenciesBlock$fun getOrEmpty( moduleRef: ProjectPath, configName: ConfigurationName, testFixtures: Boolean ): List<ModuleDependencyDeclaration> - UndocumentedPublicFunction:DependenciesBlock.kt$DependenciesBlock$fun getOrEmpty( moduleRef: String, configName: ConfigurationName, testFixtures: Boolean ): List<ModuleDependencyDeclaration> - UndocumentedPublicFunction:DependenciesBlock.kt$DependenciesBlocksProvider$suspend fun get(): List<DependenciesBlock> - UndocumentedPublicFunction:DependenciesBlock.kt$DependenciesBlocksProvider.Factory$fun create(invokesConfigurationNames: InvokesConfigurationNames): DependenciesBlocksProvider - UndocumentedPublicFunction:DependencyDeclaration.kt$DependencyDeclaration.ConfigurationNameTransform$suspend operator fun invoke(configurationName: ConfigurationName): String - UndocumentedPublicFunction:DependencyDeclaration.kt$ExternalDependencyDeclaration$suspend fun copy( newConfigName: ConfigurationName = configName, newCoordinates: MavenCoordinates = coordinates, testFixtures: Boolean ): ExternalDependencyDeclaration - UndocumentedPublicFunction:DependencyDeclaration.kt$ModuleDependencyDeclaration$suspend fun copy( newConfigName: ConfigurationName = configName, newModulePath: ProjectPath = projectPath, testFixtures: Boolean ): ModuleDependencyDeclaration - UndocumentedPublicFunction:DependencySources.kt$DependencySources$suspend fun sourceOfOrNull( dependencyProjectPath: ProjectPath, sourceSetName: SourceSetName, isTestFixture: Boolean ): ProjectDependency? - UndocumentedPublicFunction:DependencySources.kt$suspend fun McProject.requireSourceOf( dependencyProject: McProject, sourceSetName: SourceSetName, isTestFixture: Boolean ): ProjectDependency - UndocumentedPublicFunction:DependencySources.kt$suspend fun ProjectContext.dependencySources(): DependencySources - UndocumentedPublicFunction:DepthFinding.kt$DepthFinding$fun toProjectDepth(): ProjectDepth - UndocumentedPublicFunction:Depths.kt$Depths$suspend fun get(key: SourceSetName): ProjectDepth - UndocumentedPublicFunction:Depths.kt$ProjectDepth$fun toFinding(name: FindingName): DepthFinding - UndocumentedPublicFunction:Depths.kt$ProjectDepth$suspend fun fullTree(sourceSetName: SourceSetName = this.sourceSetName): Set<ProjectDepth> - UndocumentedPublicFunction:Depths.kt$suspend fun McProject.depthForSourceSetName(sourceSetName: SourceSetName): ProjectDepth - UndocumentedPublicFunction:Depths.kt$suspend fun McProject.depths(): Depths - UndocumentedPublicFunction:ExternalDependencies.kt$ExternalDependencies$fun add(dependency: ExternalDependency) - UndocumentedPublicFunction:ExternalDependencies.kt$ExternalDependencies$fun main(): Set<ExternalDependency> - UndocumentedPublicFunction:ExternalDependencies.kt$ExternalDependencies$fun private(): Set<ExternalDependency> - UndocumentedPublicFunction:ExternalDependencies.kt$ExternalDependencies$fun public(): Set<ExternalDependency> - UndocumentedPublicFunction:ExternalDependencies.kt$ExternalDependencies$fun remove(dependency: ExternalDependency) - UndocumentedPublicFunction:ExternalDependencies.kt$ExternalDependencies$operator fun get(sourceSetName: SourceSetName): Set<ExternalDependency> - UndocumentedPublicFunction:Finding.kt$Finding$suspend fun toResult(fixed: Boolean): FindingResult - UndocumentedPublicFunction:Finding.kt$Finding.Position$fun logString(): String - UndocumentedPublicFunction:FindingFactory.kt$FindingFactory$suspend fun evaluateFixable(projects: List<McProject>): List<T> - UndocumentedPublicFunction:FindingFactory.kt$FindingFactory$suspend fun evaluateReports(projects: List<McProject>): List<T> - UndocumentedPublicFunction:FindingFactory.kt$FindingFactory$suspend fun evaluateSorts(projects: List<McProject>): List<T> - UndocumentedPublicFunction:FindingFactory.kt$RuleFilter$fun shouldEvaluate(rule: ModuleCheckRule<*>, settings: ModuleCheckSettings): Boolean - UndocumentedPublicFunction:FindingName.kt$FindingName.Companion$@Deprecated("This will be removed soon.") fun migrateLegacyIdOrNull(legacyID: String, logger: McLogger): String? - UndocumentedPublicFunction:FindingResultFactory.kt$FindingResultFactory$suspend fun create( findings: List<Finding>, autoCorrect: Boolean, deleteUnused: Boolean ): List<FindingResult> - UndocumentedPublicFunction:Fixable.kt$Fixable$fun fixLabel(): String - UndocumentedPublicFunction:Fixable.kt$Fixable$suspend fun fix(removalStrategy: RemovalStrategy): Boolean - UndocumentedPublicFunction:GraphvizFileWriter.kt$GraphvizFileWriter$suspend fun write(depths: List<ProjectDepth>) - UndocumentedPublicFunction:GroovyDependenciesBlockParser.kt$GroovyDependenciesBlockParser$fun parse(file: File): List<GroovyDependenciesBlock> - UndocumentedPublicFunction:GroovyPluginsBlockParser.kt$GroovyPluginsBlockParser$fun parse(file: File): GroovyPluginsBlock? - UndocumentedPublicFunction:HasProjectCache.kt$HasProjectCache$fun HasProjectPath.project(): McProject - UndocumentedPublicFunction:Imports.kt$Imports$suspend fun get(sourceSetName: SourceSetName): LazySet<ReferenceName> - UndocumentedPublicFunction:Imports.kt$suspend fun ProjectContext.imports(): Imports - UndocumentedPublicFunction:Imports.kt$suspend fun ProjectContext.importsForSourceSetName( sourceSetName: SourceSetName ): LazySet<ReferenceName> - UndocumentedPublicFunction:InvokesConfigurationNames.kt$suspend fun HasDependencyDeclarations.getConfigurationInvocations(): Set<String> - UndocumentedPublicFunction:JavaParserNodeResolver.kt$JavaParserNodeResolver$suspend fun fqNameOrNull( node: ClassOrInterfaceType, packageName: String, directImports: Collection<String>, wildcardImports: Collection<String> ): FqName? - UndocumentedPublicFunction:JvmFileProvider.kt$JvmFileProvider$suspend fun getOrNull(file: File): JvmFile? - UndocumentedPublicFunction:JvmFileProvider.kt$JvmFileProvider.Factory$fun create(project: McProject, sourceSetName: SourceSetName): JvmFileProvider - UndocumentedPublicFunction:JvmPlatformPluginFactory.kt$JvmPlatformPluginFactory$fun create(gradleProject: GradleProject, hasTestFixturesPlugin: Boolean): JvmPlatformPlugin - UndocumentedPublicFunction:JvmPlatformPluginFactory.kt$fun GradleProject.getKotlinExtensionOrNull(): KotlinProjectExtension? - UndocumentedPublicFunction:JvmSourceSetsParser.kt$JvmSourceSetsParser$fun parse(parsedConfigurations: Configurations, gradleProject: GradleProject): SourceSets - UndocumentedPublicFunction:KaptDependencies.kt$KaptDependencies$suspend fun all(): List<ConfiguredDependency> - UndocumentedPublicFunction:KaptDependencies.kt$KaptDependencies$suspend fun get(configurationName: ConfigurationName): Set<ConfiguredDependency> - UndocumentedPublicFunction:KaptDependencies.kt$suspend fun ProjectContext.kaptDependencies(): KaptDependencies - UndocumentedPublicFunction:KaptDependencies.kt$suspend fun ProjectContext.kaptDependenciesForConfig( configurationName: ConfigurationName ): Set<ConfiguredDependency> - UndocumentedPublicFunction:KaptMatcher.kt$KaptMatcher$fun toCodeGeneratorBinding(): AnnotationProcessor - UndocumentedPublicFunction:KotlinDependenciesBlockParser.kt$inline fun blockExpressionRecursiveVisitor( crossinline block: KtTreeVisitorVoid.(expression: KtBlockExpression) -> Unit ): KtTreeVisitorVoid - UndocumentedPublicFunction:KotlinDependenciesBlockParser.kt$inline fun literalStringTemplateRecursiveVisitor( crossinline block: KtTreeVisitorVoid.(entry: KtLiteralStringTemplateEntry) -> Unit ): KtTreeVisitorVoid - UndocumentedPublicFunction:LayoutFiles.kt$LayoutFiles$suspend fun all(): Map<SourceSetName, Set<LayoutFile>> - UndocumentedPublicFunction:LayoutFiles.kt$LayoutFiles$suspend fun get(sourceSetName: SourceSetName): Set<LayoutFile> - UndocumentedPublicFunction:LayoutFiles.kt$suspend fun ProjectContext.layoutFiles(): LayoutFiles - UndocumentedPublicFunction:LayoutFiles.kt$suspend fun ProjectContext.layoutFilesForSourceSetName( sourceSetName: SourceSetName ): Set<XmlFile.LayoutFile> - UndocumentedPublicFunction:LazyDeferred.kt$LazyDeferred$suspend fun await(): T - UndocumentedPublicFunction:LazyDeferred.kt$fun <T> (suspend () -> T).asLazyDeferred(): LazyDeferred<T> - UndocumentedPublicFunction:LazyDeferred.kt$suspend fun <T> Collection<LazyDeferred<T>>.awaitAll(): List<T> - UndocumentedPublicFunction:LazySet.kt$@JvmName("lazySetSingle") fun <E> lazySet(priority: Priority = MEDIUM, dataSource: suspend () -> E): LazySet<E> - UndocumentedPublicFunction:LazySet.kt$LazySet$fun snapshot(): State<E> - UndocumentedPublicFunction:LazySet.kt$LazySet$suspend fun contains(element: Any?): Boolean - UndocumentedPublicFunction:LazySet.kt$LazySet$suspend fun isEmpty(): Boolean - UndocumentedPublicFunction:LazySet.kt$LazySet$suspend fun isNotEmpty(): Boolean - UndocumentedPublicFunction:LazySet.kt$LazySet.State$fun nextSources(): Sequence<List<DataSource<E>>> - UndocumentedPublicFunction:LazySet.kt$fun <E> Collection<LazySetComponent<E>>.toLazySet(): LazySet<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> Flow<E>.asDataSource(priority: Priority = MEDIUM): DataSource<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> Flow<E>.toLazySet(priority: Priority = MEDIUM): LazySet<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> Lazy<Set<E>>.asDataSource(priority: Priority = MEDIUM): DataSource<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> LazyDeferred<Set<E>>.asDataSource(priority: Priority = MEDIUM): DataSource<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> dataSourceOf(vararg elements: E, priority: Priority = MEDIUM): DataSource<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> emptyLazySet(): LazySet<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> lazySet(children: Collection<LazySetComponent<E>>): LazySet<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> lazySet(priority: Priority = MEDIUM, dataSource: suspend () -> Set<E>): LazySet<E> - UndocumentedPublicFunction:LazySet.kt$fun <E> lazySet(vararg children: LazySetComponent<E>): LazySet<E> - UndocumentedPublicFunction:LazySet.kt$suspend fun <T : B, E : B, B> LazySet<T>.containsAny(elements: Collection<E>): Boolean - UndocumentedPublicFunction:LazySet.kt$suspend inline fun <reified T : E, E> LazySet<E>.getOrNull(element: E): T? - UndocumentedPublicFunction:ManifestFiles.kt$ManifestFiles$suspend fun get(sourceSetName: SourceSetName): XmlFile.ManifestFile? - UndocumentedPublicFunction:ManifestFiles.kt$suspend fun ProjectContext.manifestFileForSourceSetName( sourceSetName: SourceSetName ): XmlFile.ManifestFile? - UndocumentedPublicFunction:ManifestFiles.kt$suspend fun ProjectContext.manifestFiles(): ManifestFiles - UndocumentedPublicFunction:MavenCoordinates.kt$MavenCoordinates.Companion$fun parseOrNull(coordinateString: String): MavenCoordinates? - UndocumentedPublicFunction:McLogger.kt$Report$fun joinToString(): String - UndocumentedPublicFunction:McLogger.kt$Report.Companion$fun build(buildAction: ReportBuilder.() -> Unit): Report - UndocumentedPublicFunction:McLogger.kt$Report.ReportEntry$fun printToStdOut() - UndocumentedPublicFunction:McName.kt$suspend inline fun <reified T : McName> LazySet<McName>.getNameOrNull(element: McName): T? - UndocumentedPublicFunction:McProject.kt$fun McProject.isAndroid(): Boolean - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun <T : AndroidPlatformPluginBuilder<*>> McProjectBuilder<T>.addLayoutFile( name: String, @Language("xml") content: String, sourceSetName: SourceSetName = SourceSetName.MAIN ) - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun <T : AndroidPlatformPluginBuilder<*>> McProjectBuilder<T>.addManifest( @Language("xml") content: String, sourceSetName: SourceSetName = SourceSetName.MAIN ) - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun <T : AndroidPlatformPluginBuilder<*>> McProjectBuilder<T>.addResourceFile( name: String, @Language("xml") content: String, sourceSetName: SourceSetName = SourceSetName.MAIN ) - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun addDependency( configurationName: ConfigurationName, project: McProject, asTestFixture: Boolean = false, addToBuildFile: Boolean = true ) - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun addExternalDependency( configurationName: ConfigurationName, coordinates: String, isTestFixture: Boolean = false ) - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun addJavaSource( @Language("java") java: String, sourceSetName: SourceSetName = SourceSetName.MAIN, directory: String? = null, fileName: String? = null, sourceDirName: String = "java" ): File - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun addKotlinSource( @Language("kotlin") kotlin: String, sourceSetName: SourceSetName = SourceSetName.MAIN, directory: String? = null, fileName: String? = null, sourceDirName: String = "java" ): File - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun addSource( name: String, @Language("kotlin") kotlin: String, sourceSetName: SourceSetName = SourceSetName.MAIN ) - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$fun requireSourceSetExists(name: SourceSetName) - UndocumentedPublicFunction:McProjectBuilder.kt$McProjectBuilder$operator fun File.invoke(text: () -> String) - UndocumentedPublicFunction:McSourceSet.kt$McSourceSet$fun withDownstream(): List<SourceSetName> - UndocumentedPublicFunction:McSourceSet.kt$McSourceSet$fun withUpstream(): List<SourceSetName> - UndocumentedPublicFunction:McSourceSet.kt$fun Collection<McSourceSet>.sortedByInheritance(): Sequence<McSourceSet> - UndocumentedPublicFunction:McSourceSet.kt$fun Iterable<McSourceSet>.names(): List<SourceSetName> - UndocumentedPublicFunction:McSourceSet.kt$fun Sequence<McSourceSet>.names(): Sequence<SourceSetName> - UndocumentedPublicFunction:McSourceSet.kt$fun SourceSetName.inheritsFrom(other: SourceSetName, hasSourceSets: HasSourceSets): Boolean - UndocumentedPublicFunction:McSourceSet.kt$fun SourceSetName.withDownStream(hasSourceSets: HasSourceSets): List<SourceSetName> - UndocumentedPublicFunction:ModuleCheckExtension.kt$ModuleCheckExtension$fun checks(action: Action<ChecksSettings>) - UndocumentedPublicFunction:ModuleCheckExtension.kt$ModuleCheckExtension$fun sort(action: Action<SortExtension>) - UndocumentedPublicFunction:ModuleCheckRule.kt$ModuleCheckRule$fun shouldApply(settings: ModuleCheckSettings): Boolean - UndocumentedPublicFunction:ModuleCheckRule.kt$ModuleCheckRule$suspend fun check(project: McProject): List<T> - UndocumentedPublicFunction:ModuleCheckRunner.kt$ModuleCheckRunner$fun run(projects: List<McProject>): Result<Unit> - UndocumentedPublicFunction:ModuleCheckRunner.kt$ModuleCheckRunner.Factory$fun create(autoCorrect: Boolean): ModuleCheckRunner - UndocumentedPublicFunction:MustBeApi.kt$suspend fun McProject.mustBeApiIn( dependentProject: McProject, sourceSetName: SourceSetName, isTestFixtures: Boolean ): Boolean - UndocumentedPublicFunction:MustBeApi.kt$suspend fun ProjectContext.mustBeApi(): MustBeApi - UndocumentedPublicFunction:NameParser.kt$NameParser$suspend fun parse(packet: NameParserPacket): NameParserPacket - UndocumentedPublicFunction:NameParser.kt$ParsingInterceptor$suspend fun intercept(chain: Chain): NameParserPacket - UndocumentedPublicFunction:OverShotDependencies.kt$OverShotDependencies$suspend fun all(): List<OverShotDependency> - UndocumentedPublicFunction:OverShotDependencies.kt$OverShotDependencies$suspend fun get(configurationName: ConfigurationName): List<OverShotDependency> - UndocumentedPublicFunction:OverShotDependencies.kt$suspend fun ProjectContext.overshotDependencies(): OverShotDependencies - UndocumentedPublicFunction:PlatformPlugin.kt$PlatformPlugin$fun asAndroidOrNull(): AndroidPlatformPlugin? - UndocumentedPublicFunction:PlatformPlugin.kt$fun PlatformPlugin.isAndroid(): Boolean - UndocumentedPublicFunction:PlatformPluginBuilder.kt$PlatformPluginBuilder$fun toPlugin( dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, projectPath: StringProjectPath, projectDependencies: ProjectDependencies, externalDependencies: ExternalDependencies ): T - UndocumentedPublicFunction:PluginsBlock.kt$PluginsBlock$fun getById(pluginId: String): PluginDeclaration? - UndocumentedPublicFunction:PluginsBlock.kt$PluginsBlockProvider$suspend fun get(): PluginsBlock? - UndocumentedPublicFunction:PluginsBlock.kt$PluginsBlockProvider.Factory$fun create(buildFile: File): PluginsBlockProvider - UndocumentedPublicFunction:ProjectAccessor.kt$ProjectAccessor.Companion$fun from(rawString: String, projectPath: ProjectPath): ProjectAccessor - UndocumentedPublicFunction:ProjectCache.kt$ProjectCache$fun clearContexts() - UndocumentedPublicFunction:ProjectCache.kt$ProjectCache$fun getValue(path: ProjectPath): McProject - UndocumentedPublicFunction:ProjectCache.kt$ProjectCache$operator fun set(path: ProjectPath, project: McProject): McProject? - UndocumentedPublicFunction:ProjectContext.kt$ProjectContext$fun clearContext() - UndocumentedPublicFunction:ProjectContext.kt$ProjectContext$suspend fun <E : Element> get(key: Key<E>): E - UndocumentedPublicFunction:ProjectContext.kt$ProjectContext.Companion$operator fun invoke(project: McProject): ProjectContext - UndocumentedPublicFunction:ProjectContext.kt$ProjectContext.Key$suspend operator fun invoke(project: McProject): E - UndocumentedPublicFunction:ProjectDependencies.kt$ProjectDependencies$fun add(cpd: ProjectDependency) - UndocumentedPublicFunction:ProjectDependencies.kt$ProjectDependencies$fun main(): Set<ProjectDependency> - UndocumentedPublicFunction:ProjectDependencies.kt$ProjectDependencies$fun private(): Set<ProjectDependency> - UndocumentedPublicFunction:ProjectDependencies.kt$ProjectDependencies$fun public(): Set<ProjectDependency> - UndocumentedPublicFunction:ProjectDependencies.kt$ProjectDependencies$fun remove(cpd: ProjectDependency) - UndocumentedPublicFunction:ProjectDependencies.kt$ProjectDependencies$operator fun get(sourceSetName: SourceSetName): Set<ProjectDependency> - UndocumentedPublicFunction:ProjectPath.kt$ProjectPath$abstract fun pathValue(typeSafeProjectPathResolver: TypeSafeProjectPathResolver): String - UndocumentedPublicFunction:ProjectPath.kt$ProjectPath$abstract fun toTypeSafe(): TypeSafeProjectPath - UndocumentedPublicFunction:ProjectPath.kt$ProjectPath.Companion$fun from(rawString: String): ProjectPath - UndocumentedPublicFunction:ProjectProvider.kt$ProjectProvider$fun clearCaches() - UndocumentedPublicFunction:ProjectProvider.kt$ProjectProvider$fun get(path: ProjectPath): McProject - UndocumentedPublicFunction:ProjectProvider.kt$ProjectProvider$fun getAll(): List<McProject> - UndocumentedPublicFunction:ProjectProvider.kt$ProjectRoot$fun get(): File - UndocumentedPublicFunction:ProjectProvider.kt$fun ProjectProvider.toTypeSafeProjectPathResolver(): TypeSafeProjectPathResolver - UndocumentedPublicFunction:PsiElementResolver.kt$PsiElementResolver$suspend fun declaredNameOrNull(token: PsiElement): QualifiedDeclaredName? - UndocumentedPublicFunction:PublicDependencies.kt$suspend fun ProjectContext.publicDependencies(): PublicDependencies - UndocumentedPublicFunction:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory.Type.Companion$fun from(extension: AndroidCommonExtension): Type<*> - UndocumentedPublicFunction:RealJavaFile.kt$fun <T> T.canBeImported(): Boolean - UndocumentedPublicFunction:RealJavaFile.kt$fun <T> T.canBeResolved(): Boolean - UndocumentedPublicFunction:RealJavaFile.kt$fun FieldDeclaration.apiReferences(): List<String> - UndocumentedPublicFunction:RealJavaFile.kt$fun MethodDeclaration.apiReferences(): List<String> - UndocumentedPublicFunction:RedundantDependencies.kt$RedundantDependencies$suspend fun all(): List<RedundantDependency> - UndocumentedPublicFunction:RedundantDependencies.kt$RedundantDependencies$suspend fun get(sourceSetName: SourceSetName): List<RedundantDependency> - UndocumentedPublicFunction:RedundantDependencies.kt$suspend fun ProjectContext.redundantDependencies(): RedundantDependencies - UndocumentedPublicFunction:RedundantDependencyFinding.kt$RedundantDependency$fun toFinding(findingName: FindingName): RedundantDependencyFinding - UndocumentedPublicFunction:References.kt$References$suspend fun all(): LazySet<ReferenceName> - UndocumentedPublicFunction:References.kt$References$suspend fun get(sourceSetName: SourceSetName): LazySet<ReferenceName> - UndocumentedPublicFunction:References.kt$suspend fun ProjectContext.references(): References - UndocumentedPublicFunction:References.kt$suspend fun ProjectContext.referencesForSourceSetName( sourceSetName: SourceSetName ): LazySet<ReferenceName> - UndocumentedPublicFunction:RemovesDependency.kt$RemovesDependency$suspend fun removeDependency(removalStrategy: RemovalStrategy): Boolean - UndocumentedPublicFunction:ResSourceFiles.kt$ResSourceFiles$suspend fun all(): Set<File> - UndocumentedPublicFunction:ResSourceFiles.kt$ResSourceFiles$suspend fun get(sourceSetName: SourceSetName): Set<File> - UndocumentedPublicFunction:ResSourceFiles.kt$suspend fun ProjectContext.resSourceFiles(): ResSourceFiles - UndocumentedPublicFunction:ResSourceFiles.kt$suspend fun ProjectContext.resourceFilesForSourceSetName(sourceSetName: SourceSetName): Set<File> - UndocumentedPublicFunction:ResolvedDeclaredNames.kt$ResolvedDeclaredNames$suspend fun getSource( name: ResolvableMcName, sourceSetName: SourceSetName ): McProjectWithSourceSetName? - UndocumentedPublicFunction:ResolvedDeclaredNames.kt$suspend fun ProjectContext.resolvedDeclaredNames(): ResolvedDeclaredNames - UndocumentedPublicFunction:SafeXmlParser.kt$SafeXmlParser$fun parse(file: File): Node? - UndocumentedPublicFunction:SafeXmlParser.kt$SafeXmlParser$fun parse(text: String): Node? - UndocumentedPublicFunction:SarifReportFactory.kt$SarifReportFactory$fun create(findingResults: List<Finding.FindingResult>, rules: List<ModuleCheckRule<*>>): String - UndocumentedPublicFunction:SortDependenciesFinding.kt$fun sortedDependenciesFileText( block: DependenciesBlock, fileText: String, comparator: Comparator<String> ): String - UndocumentedPublicFunction:SourceSetDependencies.kt$SourceSetDependencies$suspend fun get(sourceSetName: SourceSetName): List<TransitiveProjectDependency> - UndocumentedPublicFunction:SourceSetDependencies.kt$suspend fun ProjectContext.sourceSetDependencies(): SourceSetDependencies - UndocumentedPublicFunction:SourceSetDependency.kt$fun ConfiguredDependency.toSourceSetDependency( sourceSetName: SourceSetName = configurationName.toSourceSetName() ): SourceSetDependency - UndocumentedPublicFunction:SourceSetName.kt$SourceSetName$fun isTestFixtures(): Boolean - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.addPrefix(prefix: SourceSetName): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.addPrefix(prefix: String): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.addSuffix(suffix: SourceSetName): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.addSuffix(suffix: String): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.hasPrefix(prefix: SourceSetName): Boolean - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.hasPrefix(prefix: String): Boolean - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.removePrefix(prefix: SourceSetName): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.removePrefix(prefix: String): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.removeSuffix(suffix: SourceSetName): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun SourceSetName.removeSuffix(suffix: String): SourceSetName - UndocumentedPublicFunction:SourceSetName.kt$fun String.asSourceSetName(): SourceSetName - UndocumentedPublicFunction:SourceSetsFactory.kt$SourceSetsFactory$fun create( gradleProject: GradleProject, configurations: Configurations, hasTestFixturesPlugin: Boolean ): SourceSets - UndocumentedPublicFunction:Suppressions.kt$Suppressions$fun get(dependency: Dependency): Set<FindingName> - UndocumentedPublicFunction:Suppressions.kt$Suppressions$fun get(findingName: FindingName): Set<Dependency> - UndocumentedPublicFunction:Suppressions.kt$suspend fun <T> T.getSuppressions(): Suppressions - UndocumentedPublicFunction:TestSettings.kt$TestSettings$@Suppress("UNUSED") fun checks(block: ChecksSettings.() -> Unit): Unit - UndocumentedPublicFunction:TestSettings.kt$TestSettings$@Suppress("UNUSED") fun sort(block: SortSettings.() -> Unit): Unit - UndocumentedPublicFunction:TransitiveProjectDependency.kt$TransitiveProjectDependency$fun withContributedConfiguration( configurationName: ConfigurationName = source.configurationName ): TransitiveProjectDependency - UndocumentedPublicFunction:TypeSafeProjectPathResolver.kt$AllProjectPathsProvider$fun getAllPaths(): List<StringProjectPath> - UndocumentedPublicFunction:TypeSafeProjectPathResolver.kt$TypeSafeProjectPathResolver$fun resolveStringProjectPath(typeSafe: TypeSafeProjectPath): StringProjectPath - UndocumentedPublicFunction:UnusedDependencies.kt$UnusedDependencies$suspend fun all(): List<UnusedDependency> - UndocumentedPublicFunction:UnusedDependencies.kt$UnusedDependencies$suspend fun get(configurationName: ConfigurationName): Set<UnusedDependency> - UndocumentedPublicFunction:UnusedDependencies.kt$suspend fun ProjectContext.unusedDependencies(): UnusedDependencies - UndocumentedPublicFunction:UnusedDependency.kt$UnusedDependency$fun toFinding(findingName: FindingName): UnusedDependencyFinding - UndocumentedPublicFunction:androidPsi.kt$fun PsiElement.androidBlocks(): List<KtCallExpression> - UndocumentedPublicFunction:androidPsi.kt$fun PsiElement.buildFeaturesBlocks(): List<KtCallExpression> - UndocumentedPublicFunction:androidPsi.kt$fun PsiElement.inBuildscript(): Boolean - UndocumentedPublicFunction:cast.kt$@Suppress("NOTHING_TO_INLINE") inline fun <T : Any> T?.requireNotNull(): T - UndocumentedPublicFunction:cast.kt$@Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE") inline fun <T> Any.cast(): T - UndocumentedPublicFunction:cast.kt$inline fun <T : Any> T?.requireNotNull(lazyMessage: () -> Any): T - UndocumentedPublicFunction:cast.kt$inline fun <reified T : Any> Any?.safeAs(): T? - UndocumentedPublicFunction:comparable.kt$infix fun <T> Comparable<T>.isGreaterThan(other: T): Boolean - UndocumentedPublicFunction:defaultCodeGeneratorBindings.kt$fun defaultCodeGeneratorBindings(): List<CodeGeneratorBinding> - UndocumentedPublicFunction:factories.kt$fun buildFileParserFactory( projectDependencyFactory: ProjectDependency.Factory, logger: McLogger = PrintLogger() ): BuildFileParser.Factory - UndocumentedPublicFunction:factories.kt$inline fun <reified T, reified P, G> T.toRealMcProject(): McProject - UndocumentedPublicFunction:file.kt$fun File.writeGroovy( @Language("groovy") content: String ) - UndocumentedPublicFunction:file.kt$fun File.writeJava( @Language("java") content: String ) - UndocumentedPublicFunction:file.kt$fun File.writeKotlin( @Language("kotlin") content: String ) - UndocumentedPublicFunction:kotlinStdLibNames.kt$fun ReferenceName.kotlinStdLibNameOrNull(): QualifiedDeclaredName? - UndocumentedPublicFunction:kotlinStdLibNames.kt$fun String.kotlinStdLibNameOrNull(): QualifiedDeclaredName? - UndocumentedPublicFunction:ktCallableDeclaration.kt$fun KtCallableDeclaration.isJvmStatic(): Boolean - UndocumentedPublicFunction:ktCallableDeclaration.kt$fun KtFunction.jvmNameOrNull(): String? - UndocumentedPublicFunction:ktCallableDeclaration.kt$fun KtProperty.isJvmField(): Boolean - UndocumentedPublicFunction:ktCallableDeclaration.kt$fun KtPropertyAccessor.jvmNameOrNull(): String? - UndocumentedPublicFunction:lazy.kt$fun <T> unsafeLazy(initializer: () -> T): Lazy<T> - UndocumentedPublicFunction:modify.kt$fun HasDependencyDeclarations.removeDependencyWithComment( statement: BuildFileStatement, fixLabel: String, configuredDependency: ConfiguredDependency? = null ) - UndocumentedPublicFunction:modify.kt$fun HasDependencyDeclarations.removeDependencyWithDelete( statement: BuildFileStatement, configuredDependency: ConfiguredDependency? = null ) - UndocumentedPublicFunction:project.kt$fun Boolean?.orPropertyDefault( gradleProject: GradleProject, key: String, defaultValue: Boolean ): Boolean - UndocumentedPublicFunction:project.kt$fun FileTreeWalk.files(): Sequence<File> - UndocumentedPublicFunction:psiElement.kt$fun KotlinType.asReferenceName(): ReferenceName - UndocumentedPublicFunction:psiElement.kt$fun KotlinType?.requireReferenceName(): ReferenceName - UndocumentedPublicFunction:psiElement.kt$fun KtAnnotated.hasAnnotation(annotationFqName: FqName): Boolean - UndocumentedPublicFunction:psiElement.kt$fun KtBlockExpression.nameSafe(): String? - UndocumentedPublicFunction:psiElement.kt$fun KtCallExpression.nameSafe(): String? - UndocumentedPublicFunction:psiElement.kt$fun KtDeclaration.isInObject(): Boolean - UndocumentedPublicFunction:psiElement.kt$fun KtDeclaration.isInObjectOrCompanionObject(): Boolean - UndocumentedPublicFunction:psiElement.kt$fun KtProperty.resolveType(bindingContext: BindingContext): VariableDescriptor? - UndocumentedPublicFunction:psiElement.kt$fun KtPropertyDelegate.returnType(bindingContext: BindingContext): KotlinType? - UndocumentedPublicFunction:psiElement.kt$fun PsiElement.file(): File - UndocumentedPublicFunction:psiElement.kt$fun PsiElement.isQualifiedPropertyOrCallExpression(): Boolean - UndocumentedPublicFunction:psiElement.kt$inline fun <reified T : PsiElement> PsiElement.isPartOf(): Boolean - UndocumentedPublicFunction:psiElement.kt$suspend fun McProject.canResolveDeclaredName( declaredName: QualifiedDeclaredName, sourceSetName: SourceSetName ): Boolean - UndocumentedPublicFunction:psiElement.kt$suspend fun McProject.canResolveReferenceName( declaredName: ReferenceName, sourceSetName: SourceSetName ): Boolean - UndocumentedPublicFunction:regex.kt$inline fun String.replaceDestructured( regex: Regex, crossinline transform: ( group1: String, group2: String, group3: String, group4: String, group5: String ) -> String ): String - UndocumentedPublicFunction:regex.kt$inline fun String.replaceDestructured( regex: Regex, crossinline transform: (group1: String) -> String ): String - UndocumentedPublicFunction:regex.kt$inline fun String.replaceDestructured( regex: Regex, crossinline transform: (group1: String, group2: String) -> String ): String - UndocumentedPublicFunction:regex.kt$inline fun String.replaceDestructured( regex: Regex, crossinline transform: (group1: String, group2: String, group3: String) -> String ): String - UndocumentedPublicFunction:regex.kt$inline fun String.replaceDestructured( regex: Regex, crossinline transform: (group1: String, group2: String, group3: String, group4: String) -> String ): String - UndocumentedPublicFunction:settings.gradle.kts$fun printCiEnvironment() - UndocumentedPublicFunction:sourceSetName.kt$fun SourceSetName.apiConfig(): ConfigurationName - UndocumentedPublicFunction:sourceSetName.kt$fun SourceSetName.implementationConfig(): ConfigurationName - UndocumentedPublicFunction:sourceSetName.kt$fun SourceSetName.javaConfigurationNames(): List<ConfigurationName> - UndocumentedPublicFunction:string.kt$fun String.positionOfStatement(statement: String): Position - UndocumentedPublicFunction:uses.kt$suspend fun McProject.uses(dependency: ConfiguredDependency): Boolean - UndocumentedPublicFunction:util.kt$fun KtElement.requireSimpleName(): SimpleName - UndocumentedPublicFunction:util.kt$fun KtValueArgumentList.getByNameOrIndex(index: Int, name: String): KtValueArgument? - UndocumentedPublicFunction:visitor.kt$fun <T : Node> T.simpleName(): String - UndocumentedPublicFunction:visitor.kt$fun <T, R : ResolvedDeclaration> T.fqNameOrNull( typeDeclarations: List<TypeDeclaration<*>> ): String? - UndocumentedPublicFunction:visitor.kt$inline fun <reified T : Node> Node.getChildOfType(): T? - UndocumentedPublicFunction:visitor.kt$inline fun <reified T : Node> Node.getChildrenOfType(): List<T> - UndocumentedPublicFunction:visitor.kt$inline fun <reified T : Node> Node.requireChildOfType(): T - UndocumentedPublicProperty:AbstractDependenciesBlock.kt$AbstractDependenciesBlock.Companion$val testFixturesRegex: Regex = "testFixtures\\([\\s\\S]*\\)".toRegex() - UndocumentedPublicProperty:AbstractModuleCheckTask.kt$AbstractModuleCheckTask$@get:Input val settings: ModuleCheckExtension = project.extensions .getByType(ModuleCheckExtension::class.java) - UndocumentedPublicProperty:AndroidGradleSettings.kt$AndroidGradleSettings$val androidBlocks: List<AgpBlock.AndroidBlock> - UndocumentedPublicProperty:AndroidGradleSettings.kt$AndroidGradleSettings$val assignments: List<Assignment> - UndocumentedPublicProperty:AndroidGradleSettings.kt$AndroidGradleSettings$val buildFeaturesBlocks: List<AgpBlock.BuildFeaturesBlock> - UndocumentedPublicProperty:AndroidStylesFile.kt$AndroidStylesFile$val name: String = file.nameWithoutExtension - UndocumentedPublicProperty:AnvilGradlePlugin.kt$AnvilAnnotatedType$val contributedScope: AnvilScopeName - UndocumentedPublicProperty:AnvilGradlePlugin.kt$AnvilAnnotatedType$val contributedTypeDeclaration: QualifiedDeclaredName - UndocumentedPublicProperty:AnvilGradlePlugin.kt$AnvilGradlePlugin$val generateDaggerFactories: Boolean - UndocumentedPublicProperty:AnvilGradlePlugin.kt$AnvilGradlePlugin$val version: SemVer - UndocumentedPublicProperty:AnvilGradlePlugin.kt$AnvilScopeName$val fqName: FqName - UndocumentedPublicProperty:AnvilGradlePlugin.kt$AnvilScopeNameEntry$val name: ReferenceName - UndocumentedPublicProperty:AnvilGradlePlugin.kt$RawAnvilAnnotatedType$val anvilScopeNameEntry: AnvilScopeNameEntry - UndocumentedPublicProperty:AnvilGradlePlugin.kt$RawAnvilAnnotatedType$val declaredName: QualifiedDeclaredName - UndocumentedPublicProperty:Assignment.kt$Assignment$val fullText: String - UndocumentedPublicProperty:Assignment.kt$Assignment$val propertyFullName: String - UndocumentedPublicProperty:Assignment.kt$Assignment$val value: String - UndocumentedPublicProperty:Block.kt$Block$val fullText: String - UndocumentedPublicProperty:Block.kt$Block$val lambdaContent: String - UndocumentedPublicProperty:Block.kt$Block$val settings: List<T> - UndocumentedPublicProperty:BuildFileStatement.kt$BuildFileStatement$val declarationText: String - UndocumentedPublicProperty:BuildFileStatement.kt$BuildFileStatement$val statementWithSurroundingText: String - UndocumentedPublicProperty:BuildFileStatement.kt$BuildFileStatement$val suppressed: List<String> - UndocumentedPublicProperty:CodeGeneratorBinding.kt$CodeGeneratorBinding.KotlinCompilerPlugin$val gradlePlugin: PluginDefinition - UndocumentedPublicProperty:ConfigBuilder.kt$ConfigBuilder$val downstream: MutableList<ConfigurationName> - UndocumentedPublicProperty:ConfigBuilder.kt$ConfigBuilder$val name: ConfigurationName - UndocumentedPublicProperty:ConfigBuilder.kt$ConfigBuilder$val upstream: MutableList<ConfigurationName> - UndocumentedPublicProperty:ConfiguredDependency.kt$ConfiguredDependency$val configurationName: ConfigurationName - UndocumentedPublicProperty:CoroutineScopeModule.kt$DispatcherProviderComponent$val dispatcherProvider: DispatcherProvider - UndocumentedPublicProperty:DependencyDeclaration.kt$DependencyDeclaration$val configName: ConfigurationName - UndocumentedPublicProperty:DependencyDeclaration.kt$ExternalDependencyDeclaration$val configurationNameTransform: ConfigurationNameTransform - UndocumentedPublicProperty:DependencyDeclaration.kt$ExternalDependencyDeclaration$val coordinates: MavenCoordinates - UndocumentedPublicProperty:DependencyDeclaration.kt$ExternalDependencyDeclaration$val group: String? - UndocumentedPublicProperty:DependencyDeclaration.kt$ExternalDependencyDeclaration$val moduleName: String? - UndocumentedPublicProperty:DependencyDeclaration.kt$ExternalDependencyDeclaration$val version: String? - UndocumentedPublicProperty:DependencyDeclaration.kt$ModuleDependencyDeclaration$val configurationNameTransform: ConfigurationNameTransform - UndocumentedPublicProperty:DependencyDeclaration.kt$ModuleDependencyDeclaration$val projectAccessor: ProjectAccessor - UndocumentedPublicProperty:DependencyDeclaration.kt$ModuleDependencyDeclaration$val projectPath: ProjectPath - UndocumentedPublicProperty:DependencyDeclaration.kt$UnknownDependencyDeclaration$val argument: String - UndocumentedPublicProperty:DependencyDeclaration.kt$UnknownDependencyDeclaration$val configurationNameTransform: ConfigurationNameTransform - UndocumentedPublicProperty:DependencySources.kt$DependencySources.SourceKey$val dependencyProjectPath: ProjectPath - UndocumentedPublicProperty:DependencySources.kt$DependencySources.SourceKey$val isTestFixture: Boolean - UndocumentedPublicProperty:DependencySources.kt$DependencySources.SourceKey$val sourceSetName: SourceSetName - UndocumentedPublicProperty:DependencySources.kt$DependencySources.SourceResult.Found$val sourceDependency: ProjectDependency - UndocumentedPublicProperty:DepthFinding.kt$DepthFinding$val children: List<DepthFinding> - UndocumentedPublicProperty:DepthFinding.kt$DepthFinding$val depth: Int - UndocumentedPublicProperty:DepthFinding.kt$DepthFinding$val sourceSetName: SourceSetName - UndocumentedPublicProperty:DepthFinding.kt$DepthFinding.Companion$val NAME: FindingName = FindingName("project-depth") - UndocumentedPublicProperty:Depths.kt$ProjectDepth$val children: List<ProjectDepth> - UndocumentedPublicProperty:Depths.kt$ProjectDepth$val dependentPath: StringProjectPath - UndocumentedPublicProperty:Depths.kt$ProjectDepth$val dependentProject: McProject - UndocumentedPublicProperty:Depths.kt$ProjectDepth$val depth: Int - UndocumentedPublicProperty:Depths.kt$ProjectDepth$val sourceSetName: SourceSetName - UndocumentedPublicProperty:DocumentedRule.kt$DocumentedRule.Companion$const val RULES_BASE_URL: String = "https://rbusarow.github.io/ModuleCheck/docs/rules/" - UndocumentedPublicProperty:DownstreamDependency.kt$DownstreamDependency$val dependentProjectPath: ProjectPath.StringProjectPath - UndocumentedPublicProperty:DownstreamDependency.kt$DownstreamDependency$val projectDependency: ProjectDependency - UndocumentedPublicProperty:ExternalDependency.kt$ExternalDependency$abstract val group: String? - UndocumentedPublicProperty:ExternalDependency.kt$ExternalDependency$abstract val moduleName: String - UndocumentedPublicProperty:ExternalDependency.kt$ExternalDependency$abstract val version: String? - UndocumentedPublicProperty:ExternalDependency.kt$ExternalDependency$val nameWithVersion: String by unsafeLazy { "${group.orEmpty()}:$moduleName:${version.orEmpty()}" } - UndocumentedPublicProperty:ExternalDependency.kt$ExternalDependency$val nameWithoutVersion: String by unsafeLazy { "${group.orEmpty()}:$moduleName" } - UndocumentedPublicProperty:Finding.kt$ConfigurationFinding$val configurationName: ConfigurationName - UndocumentedPublicProperty:Finding.kt$ConfiguredDependencyFinding$val dependency: ConfiguredDependency - UndocumentedPublicProperty:Finding.kt$DependencyFinding$val statementOrNull: LazyDeferred<BuildFileStatement?> - UndocumentedPublicProperty:Finding.kt$DependencyFinding$val statementTextOrNull: LazyDeferred<String?> - UndocumentedPublicProperty:Finding.kt$Finding$val buildFile: File - UndocumentedPublicProperty:Finding.kt$Finding$val dependencyIdentifier: String - UndocumentedPublicProperty:Finding.kt$Finding$val dependentPath: StringProjectPath - UndocumentedPublicProperty:Finding.kt$Finding$val dependentProject: McProject - UndocumentedPublicProperty:Finding.kt$Finding$val findingName: FindingName - UndocumentedPublicProperty:Finding.kt$Finding$val message: String - UndocumentedPublicProperty:Finding.kt$Finding$val positionOrNull: LazyDeferred<Position?> - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val buildFile: File - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val configurationName: String - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val dependencyIdentifier: String - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val dependentPath: StringProjectPath - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val filePathString: String = "${buildFile.path}: ${positionOrNull?.logString().orEmpty()}" - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val findingName: FindingName - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val fixed: Boolean - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val message: String - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val positionOrNull: Position? - UndocumentedPublicProperty:Finding.kt$Finding.FindingResult$val sourceOrNull: String? - UndocumentedPublicProperty:Finding.kt$Finding.Position$val column: Int - UndocumentedPublicProperty:Finding.kt$Finding.Position$val row: Int - UndocumentedPublicProperty:FindingFactory.kt$RuleFilter.Companion$val DEFAULT: RuleFilter = RuleFilter { rule, settings -> rule.shouldApply(settings) } - UndocumentedPublicProperty:Fixable.kt$Fixable.Companion$const val FIX_LABEL: String = "// ModuleCheck finding" - UndocumentedPublicProperty:FqNames.kt$FqNames$val inject: FqName = FqName("javax.inject.Inject") - UndocumentedPublicProperty:FqNames.kt$FqNames$val jvmField: FqName = FqName("kotlin.jvm.JvmField") - UndocumentedPublicProperty:FqNames.kt$FqNames$val jvmStatic: FqName = FqName("kotlin.jvm.JvmStatic") - UndocumentedPublicProperty:GroovyDependenciesBlockParser.kt$GroovyDependenciesBlockParser.Companion$val BLOCK_BODY_REGEX: Regex = """dependencies\s*\{([\s\S]*)\}""".toRegex() - UndocumentedPublicProperty:GroovyDependenciesBlockParser.kt$GroovyDependenciesBlockParser.Companion$val NO_INSPECTION_REGEX: Regex = """//noinspection\s+(.*)\n""".toRegex() - UndocumentedPublicProperty:HasConfigurations.kt$HasConfigurations$val configurations: Configurations - UndocumentedPublicProperty:HasConfigurations.kt$HasDependencies$val externalDependencies: ExternalDependencies - UndocumentedPublicProperty:HasConfigurations.kt$HasDependencies$val projectDependencies: ProjectDependencies - UndocumentedPublicProperty:HasIdentifier.kt$HasIdentifier$val identifier: Identifier - UndocumentedPublicProperty:HasIdentifier.kt$HasMavenCoordinates$val mavenCoordinates: MavenCoordinates - UndocumentedPublicProperty:HasIdentifier.kt$HasProjectPath$val projectPath: ProjectPath - UndocumentedPublicProperty:HasProjectCache.kt$HasProjectCache$val projectCache: ProjectCache - UndocumentedPublicProperty:HasSuppressions.kt$HasSuppressedChildren$val allSuppressions: Map<C, Set<S>> - UndocumentedPublicProperty:HasSuppressions.kt$HasSuppressions$val suppressions: List<T> - UndocumentedPublicProperty:InheritedDependencyFinding.kt$InheritedDependencyFinding$val source: ProjectDependency - UndocumentedPublicProperty:InvokesConfigurationNames.kt$HasBuildFile$val buildFile: File - UndocumentedPublicProperty:InvokesConfigurationNames.kt$HasBuildFile$val buildFileParser: BuildFileParser - UndocumentedPublicProperty:JvmFile.kt$JvmFile$val apiReferences: LazyDeferred<Set<ReferenceName>> - UndocumentedPublicProperty:JvmFile.kt$JvmFile$val importsLazy: Lazy<Set<ReferenceName>> - UndocumentedPublicProperty:JvmFile.kt$KotlinFile.ScopeArgumentParseResult$val contributeArguments: Set<RawAnvilAnnotatedType> - UndocumentedPublicProperty:JvmFile.kt$KotlinFile.ScopeArgumentParseResult$val mergeArguments: Set<RawAnvilAnnotatedType> - UndocumentedPublicProperty:KaptMatcher.kt$KaptMatcher$val annotationImports: List<String> - UndocumentedPublicProperty:KaptMatcher.kt$KaptMatcher$val name: String - UndocumentedPublicProperty:KaptMatcher.kt$KaptMatcher$val processor: String - UndocumentedPublicProperty:LazyDeferred.kt$LazyDeferred$val isCompleted: Boolean - UndocumentedPublicProperty:LazySet.kt$LazySet$val isFullyCached: Boolean - UndocumentedPublicProperty:LazySet.kt$LazySet.State$val cache: Set<E> - UndocumentedPublicProperty:LazySet.kt$LazySet.State$val remaining: List<DataSource<E>> - UndocumentedPublicProperty:MavenCoordinates.kt$Identifier$val name: String - UndocumentedPublicProperty:McConfiguration.kt$McConfiguration$val externalDependencies: Set<ExternalDependency> - UndocumentedPublicProperty:McConfiguration.kt$McConfiguration$val name: ConfigurationName - UndocumentedPublicProperty:McConfiguration.kt$McConfiguration$val projectDependencies: Set<ProjectDependency> - UndocumentedPublicProperty:McLogger.kt$Report$val entries: List<ReportEntry> - UndocumentedPublicProperty:McLogger.kt$Report.ReportEntry$val message: String - UndocumentedPublicProperty:McProject.kt$McProject$val anvilGradlePlugin: AnvilGradlePlugin? - UndocumentedPublicProperty:McProject.kt$McProject$val jvmFileProviderFactory: JvmFileProvider.Factory - UndocumentedPublicProperty:McProject.kt$McProject$val logger: McLogger - UndocumentedPublicProperty:McProject.kt$McProject$val projectDir: File - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$val codeGeneratorBindings: List<CodeGeneratorBinding> - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$val configuredProjectDependencyFactory: RealConfiguredProjectDependencyFactory by lazy { RealConfiguredProjectDependencyFactory( pathResolver = TypeSafeProjectPathResolver(projectProvider), generatorBindings = codeGeneratorBindings ) } - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$val dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$val platformPlugin: P - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$val projectCache: ProjectCache - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$val projectProvider: ProjectProvider - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$var anvilGradlePlugin: AnvilGradlePlugin? = null - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$var jvmTarget: JvmTarget = JvmTarget.JVM_11 - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$var path: StringProjectPath - UndocumentedPublicProperty:McProjectBuilder.kt$McProjectBuilder$var projectDir: File - UndocumentedPublicProperty:McSourceSet.kt$HasSourceSets$val sourceSets: SourceSets - UndocumentedPublicProperty:McSourceSet.kt$McSourceSet$val configurations: Configurations by lazy { Configurations( sequenceOfNotNull( compileOnlyConfiguration, apiConfiguration, implementationConfiguration, runtimeOnlyConfiguration, annotationProcessorConfiguration ).associateBy { it.name } ) } - UndocumentedPublicProperty:McSourceSet.kt$McSourceSet$val externalDependencies: ExternalDependencies by lazy { ExternalDependencies( configurations.mapValues { (_, configuration) -> configuration.externalDependencies } ) } - UndocumentedPublicProperty:McSourceSet.kt$McSourceSet$val hasExistingSourceFiles: Boolean by lazy { jvmFiles.hasExistingFiles() || resourceFiles.hasExistingFiles() || layoutFiles.hasExistingFiles() } - UndocumentedPublicProperty:McSourceSet.kt$McSourceSet$val projectDependencies: ProjectDependencies by lazy { ProjectDependencies( configurations.mapValues { (_, configuration) -> configuration.projectDependencies } ) } - UndocumentedPublicProperty:ModuleCheckRule.kt$ModuleCheckRule$val description: String - UndocumentedPublicProperty:ModuleCheckRule.kt$ModuleCheckRule$val documentationUrl: String - UndocumentedPublicProperty:ModuleCheckRule.kt$ModuleCheckRule$val name: FindingName - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$@Assisted val autoCorrect: Boolean - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val checkstyleReporter: CheckstyleReporter - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val dispatcherProvider: DispatcherProvider - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val graphvizFileWriter: GraphvizFileWriter - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val logger: McLogger - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val projectProvider: ProjectProvider - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val rules: DaggerList<ModuleCheckRule<*>> - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val sarifReportFactory: SarifReportFactory - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner$val settings: ModuleCheckSettings - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner.TimedResults$val data: R - UndocumentedPublicProperty:ModuleCheckRunner.kt$ModuleCheckRunner.TimedResults$val timeMillis: Long - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var anvilFactoryGeneration: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var depths: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var disableAndroidResources: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var disableViewBinding: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var inheritedDependency: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var mustBeApi: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var overShotDependency: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var redundantDependency: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var sortDependencies: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var sortPlugins: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var unusedDependency: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var unusedKapt: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings$var unusedKotlinAndroidExtensions: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val ANVIL_FACTORY_GENERATION_DEFAULT: Boolean = true - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val DEPTHS_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val DISABLE_ANDROID_RESOURCES_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val DISABLE_VIEW_BINDING_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val INHERITED_DEPENDENCY_DEFAULT: Boolean = true - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val MUST_BE_API_DEFAULT: Boolean = true - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val OVERSHOT_DEPENDENCY_DEFAULT: Boolean = true - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val REDUNDANT_DEPENDENCY_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val SORT_DEPENDENCIES_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val SORT_PLUGINS_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val UNUSED_DEPENDENCY_DEFAULT: Boolean = true - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val UNUSED_KAPT_DEFAULT: Boolean = true - UndocumentedPublicProperty:ModuleCheckSettings.kt$ChecksSettings.Companion$const val UNUSED_KOTLIN_ANDROID_EXTENSIONS_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ModuleCheckSettings$val checks: ChecksSettings - UndocumentedPublicProperty:ModuleCheckSettings.kt$ModuleCheckSettings$val sort: SortSettings - UndocumentedPublicProperty:ModuleCheckSettings.kt$PerModuleReportSettings$var enabled: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$PerModuleReportSettings$var outputDir: String? - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportSettings$var enabled: Boolean - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportSettings$var outputPath: String - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val CHECKSTYLE_ENABLED_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val CHECKSTYLE_PATH_DEFAULT: String = "build/reports/modulecheck/report.xml" - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val DEPTHS_ENABLED_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val DEPTHS_PATH_DEFAULT: String = "build/reports/modulecheck/depths.txt" - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val GRAPH_ENABLED_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val SARIF_ENABLED_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val SARIF_PATH_DEFAULT: String = "build/reports/modulecheck/modulecheck.sarif" - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val TEXT_ENABLED_DEFAULT: Boolean = false - UndocumentedPublicProperty:ModuleCheckSettings.kt$ReportsSettings.Companion$const val TEXT_PATH_DEFAULT: String = "build/reports/modulecheck/report.txt" - UndocumentedPublicProperty:ModuleCheckSettings.kt$SortSettings$var dependencyComparators: List<String> - UndocumentedPublicProperty:ModuleCheckSettings.kt$SortSettings$var pluginComparators: List<String> - UndocumentedPublicProperty:ModuleCheckSettings.kt$SortSettings.Companion$val DEPENDENCY_COMPARATORS_DEFAULT: List<String> = listOf( """.*""", """kapt.*""" ) - UndocumentedPublicProperty:ModuleCheckSettings.kt$SortSettings.Companion$val PLUGIN_COMPARATORS_DEFAULT: List<String> = listOf( """id\("com\.android.*"\)""", """id\("android-.*"\)""", """id\("java-library"\)""", """kotlin\("jvm"\)""", """android.*""", """javaLibrary.*""", """kotlin.*""", """id.*""" ) - UndocumentedPublicProperty:MustBeApi.kt$InheritedDependencyWithSource$val projectDependency: ProjectDependency - UndocumentedPublicProperty:MustBeApi.kt$InheritedDependencyWithSource$val source: ProjectDependency? - UndocumentedPublicProperty:MustBeApiFinding.kt$MustBeApiFinding$val source: ProjectDependency? - UndocumentedPublicProperty:NameParser.kt$ParsingInterceptor.Chain$val packet: NameParserPacket - UndocumentedPublicProperty:OverShotDependencyFinding.kt$OverShotDependencyFinding$val oldDependency: ConfiguredDependency - UndocumentedPublicProperty:OverShotDependencyFinding.kt$OverShotDependencyFinding.Companion$val NAME: FindingName = FindingName("overshot-dependency") - UndocumentedPublicProperty:OverShotDependencyRule.kt$OverShotDependencyRule$val settings: ModuleCheckSettings - UndocumentedPublicProperty:PackageName.kt$HasPackageName$val packageName: PackageName - UndocumentedPublicProperty:PlatformPlugin.kt$AndroidPlatformPlugin$val kotlinAndroidExtensionEnabled: Boolean - UndocumentedPublicProperty:PlatformPlugin.kt$AndroidPlatformPlugin$val manifests: Map<SourceSetName, File> - UndocumentedPublicProperty:PlatformPlugin.kt$AndroidPlatformPlugin$val nonTransientRClass: Boolean - UndocumentedPublicProperty:PlatformPlugin.kt$AndroidPlatformPlugin$val viewBindingEnabled: Boolean - UndocumentedPublicProperty:PlatformPlugin.kt$AndroidPlatformPlugin.CanDisableAndroidBuildConfig$val buildConfigEnabled: Boolean - UndocumentedPublicProperty:PlatformPlugin.kt$AndroidPlatformPlugin.CanDisableAndroidResources$val androidResourcesEnabled: Boolean - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidDynamicFeaturePluginBuilder$var buildConfigEnabled: Boolean = true - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidLibraryPluginBuilder$var androidResourcesEnabled: Boolean = true - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidLibraryPluginBuilder$var buildConfigEnabled: Boolean = true - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidPlatformPluginBuilder$val manifests: MutableMap<SourceSetName, File> - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidPlatformPluginBuilder$val resValues: MutableMap<SourceSetName, Set<UnqualifiedAndroidResource>> - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidPlatformPluginBuilder$var kotlinAndroidExtensionEnabled: Boolean - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidPlatformPluginBuilder$var nonTransientRClass: Boolean - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidPlatformPluginBuilder$var viewBindingEnabled: Boolean - UndocumentedPublicProperty:PlatformPluginBuilder.kt$AndroidTestPluginBuilder$var buildConfigEnabled: Boolean = true - UndocumentedPublicProperty:PlatformPluginBuilder.kt$PlatformPluginBuilder$val configurations: MutableMap<ConfigurationName, ConfigBuilder> - UndocumentedPublicProperty:PlatformPluginBuilder.kt$PlatformPluginBuilder$val sourceSets: MutableMap<SourceSetName, SourceSetBuilder> - UndocumentedPublicProperty:PluginAware.kt$HasPlatformPlugin$val platformPlugin: PlatformPlugin - UndocumentedPublicProperty:PluginAware.kt$PluginAware$val hasAGP: Boolean - UndocumentedPublicProperty:PluginAware.kt$PluginAware$val hasAnvil: Boolean - UndocumentedPublicProperty:PluginAware.kt$PluginAware$val hasKapt: Boolean - UndocumentedPublicProperty:PluginAware.kt$PluginAware$val hasTestFixturesPlugin: Boolean - UndocumentedPublicProperty:ProjectAccessor.kt$ProjectAccessor$val projectPath: ProjectPath - UndocumentedPublicProperty:ProjectAccessor.kt$ProjectAccessor$val statementText: String - UndocumentedPublicProperty:ProjectCache.kt$ProjectCache$val values: MutableCollection<McProject> get() = delegate.values - UndocumentedPublicProperty:ProjectContext.kt$ProjectContext.Element$val key: Key<*> - UndocumentedPublicProperty:ProjectPath.kt$ProjectPath$val typeSafeValue: String by lazy { when (this) { is StringProjectPath -> value.typeSafeName() is TypeSafeProjectPath -> value } } - UndocumentedPublicProperty:PsiElementWithSurroundingText.kt$PsiElementWithSurroundingText$val psiElement: PsiElement - UndocumentedPublicProperty:PsiElementWithSurroundingText.kt$PsiElementWithSurroundingText$val statementText: String = psiElement.text - UndocumentedPublicProperty:RealAndroidPlatformPluginFactory.kt$RealAndroidPlatformPluginFactory.Type$val extension: T - UndocumentedPublicProperty:RealKotlinFile.kt$RealKotlinFile$val constructorInjectedParams: LazyDeferred<Set<QualifiedDeclaredName>> = lazyDeferred { referenceVisitor.constructorInjected.mapNotNull { psiResolver.declaredNameOrNull(it) }.toSet() } - UndocumentedPublicProperty:RedundantDependencyFinding.kt$RedundantDependency$val configurationName: ConfigurationName - UndocumentedPublicProperty:RedundantDependencyFinding.kt$RedundantDependency$val dependency: ProjectDependency - UndocumentedPublicProperty:RedundantDependencyFinding.kt$RedundantDependency$val dependentProject: McProject - UndocumentedPublicProperty:RedundantDependencyFinding.kt$RedundantDependency$val from: List<ProjectDependency> - UndocumentedPublicProperty:RedundantDependencyFinding.kt$RedundantDependencyFinding$val from: List<ProjectDependency> - UndocumentedPublicProperty:RemovesDependency.kt$RemovesDependency$val oldDependency: ConfiguredDependency - UndocumentedPublicProperty:ResolvedDeclaredNames.kt$ResolvedDeclaredNames.McProjectWithSourceSetName$val declaration: QualifiedDeclaredName - UndocumentedPublicProperty:ResolvedDeclaredNames.kt$ResolvedDeclaredNames.McProjectWithSourceSetName$val project: McProject - UndocumentedPublicProperty:ResolvedDeclaredNames.kt$ResolvedDeclaredNames.McProjectWithSourceSetName$val sourceSetName: SourceSetName - UndocumentedPublicProperty:RulesComponent.kt$RulesComponent$val allRules: DaggerList<ModuleCheckRule<*>> - UndocumentedPublicProperty:RunnerComponent.kt$RunnerComponent$val runnerFactory: ModuleCheckRunner.Factory - UndocumentedPublicProperty:SafeCache.kt$SafeCache$val values: Flow<V> - UndocumentedPublicProperty:SarifReport.kt$BaselineState$val value: String - UndocumentedPublicProperty:SarifReport.kt$ColumnKind$val value: String - UndocumentedPublicProperty:SarifReport.kt$Content$val value: String - UndocumentedPublicProperty:SarifReport.kt$Importance$val value: String - UndocumentedPublicProperty:SarifReport.kt$Level$val value: String - UndocumentedPublicProperty:SarifReport.kt$ResultKind$val value: String - UndocumentedPublicProperty:SortDependenciesFinding.kt$SortDependenciesFinding.Companion$val NAME: FindingName = FindingName("sort-dependencies") - UndocumentedPublicProperty:SortPluginsFinding.kt$SortPluginsFinding.Companion$val NAME: FindingName = FindingName("sort-plugins") - UndocumentedPublicProperty:SourceSetDependency.kt$SourceSetDependency$val isTestFixture: Boolean - UndocumentedPublicProperty:SourceSetDependency.kt$SourceSetDependency$val sourceSetName: SourceSetName - UndocumentedPublicProperty:SourceSetDependency.kt$SourceSetDependency.SourceSetExternalDependency$val group: String? - UndocumentedPublicProperty:SourceSetDependency.kt$SourceSetDependency.SourceSetExternalDependency$val moduleName: String - UndocumentedPublicProperty:SourceSetDependency.kt$SourceSetDependency.SourceSetExternalDependency$val version: String? - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName$val value: String - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val ANDROID_TEST: SourceSetName = SourceSetName("androidTest") - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val ANVIL: SourceSetName = SourceSetName("anvil") - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val DEBUG: SourceSetName = SourceSetName("debug") - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val KAPT: SourceSetName = SourceSetName("kapt") - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val MAIN: SourceSetName = SourceSetName("main") - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val RELEASE: SourceSetName = SourceSetName("release") - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val TEST: SourceSetName = SourceSetName("test") - UndocumentedPublicProperty:SourceSetName.kt$SourceSetName.Companion$val TEST_FIXTURES: SourceSetName = SourceSetName("testFixtures") - UndocumentedPublicProperty:TaskComponent.kt$TaskComponent$val projectProvider: GradleProjectProvider - UndocumentedPublicProperty:Trace.kt$HasTraceTags$val tags: Iterable<Any> - UndocumentedPublicProperty:Trace.kt$Trace$abstract val depth: Int - UndocumentedPublicProperty:Trace.kt$Trace$val tags: List<String> - UndocumentedPublicProperty:TransitiveProjectDependency.kt$TransitiveProjectDependency$val contributed: ProjectDependency - UndocumentedPublicProperty:TransitiveProjectDependency.kt$TransitiveProjectDependency$val source: ProjectDependency - UndocumentedPublicProperty:UnusedDependency.kt$UnusedDependency$val configurationName: ConfigurationName - UndocumentedPublicProperty:UnusedDependency.kt$UnusedDependency$val dependency: ConfiguredDependency - UndocumentedPublicProperty:UnusedDependency.kt$UnusedDependency$val dependencyIdentifier: Identifier - UndocumentedPublicProperty:UnusedDependency.kt$UnusedDependency$val dependentProject: McProject - UndocumentedPublicProperty:UnusedKaptProcessorRule.kt$const val KAPT_ALTERNATE_PLUGIN_ID: String = "kotlin-kapt" - UndocumentedPublicProperty:UnusedKaptProcessorRule.kt$const val KAPT_PLUGIN_ID: String = "org.jetbrains.kotlin.kapt" - UndocumentedPublicProperty:UnusedKotlinAndroidExtensionsRule.kt$const val KOTLIN_ANDROID_EXTENSIONS_PLUGIN_ID: String = "org.jetbrains.kotlin.android.extensions" - UndocumentedPublicProperty:UnusedPluginFinding.kt$UnusedPluginFinding$val pluginDefinition: PluginDefinition - UndocumentedPublicProperty:XmlFile.kt$XmlFile$val file: File - UndocumentedPublicProperty:XmlFile.kt$XmlFile$val resourceReferencesAsRReferences: Set<String> - UndocumentedPublicProperty:XmlFile.kt$XmlFile.Companion$val REFERENCE_PREFIXES: List<String> = listOf( "@anim/", "@animator/", "@arrays/", "@color/", "@dimen/", "@drawable/", "@font/", "@layout/", "@menu/", "@mipmap/", "@raw/", "@string/", "@style/" ) - UndocumentedPublicProperty:XmlFile.kt$XmlFile.LayoutFile$val name: String = file.nameWithoutExtension - UndocumentedPublicProperty:XmlFile.kt$XmlFile.ManifestFile$val basePackage: PackageName? by lazy { AndroidManifestParser().parse(file)["package"]?.let { PackageName(it) } } - - diff --git a/detekt/detekt-config.yml b/detekt/detekt-config.yml deleted file mode 100644 index 7d8a88a32d..0000000000 --- a/detekt/detekt-config.yml +++ /dev/null @@ -1,826 +0,0 @@ -build: - maxIssues: 0 - excludeCorrectable: false - weights: - # complexity: 2 - # LongParameterList: 1 - # style: 1 - # comments: 1 - -config: - validation: true - warningsAsErrors: false - checkExhaustiveness: true - # when writing own rules with new properties, exclude the property path e.g.: 'my_rule_set,.*>.*>[my_property]' - excludes: '' - -processors: - active: true - exclude: - - 'DetektProgressListener' - # - 'KtFileCountProcessor' - # - 'PackageCountProcessor' - # - 'ClassCountProcessor' - # - 'FunctionCountProcessor' - # - 'PropertyCountProcessor' - # - 'ProjectComplexityProcessor' - # - 'ProjectCognitiveComplexityProcessor' - # - 'ProjectLLOCProcessor' - # - 'ProjectCLOCProcessor' - # - 'ProjectLOCProcessor' - # - 'ProjectSLOCProcessor' - # - 'LicenseHeaderLoaderExtension' - -console-reports: - active: true - exclude: - - 'ProjectStatisticsReport' - - 'ComplexityReport' - - 'NotificationReport' - - 'FindingsReport' - - 'FileBasedFindingsReport' - # - 'LiteFindingsReport' - -output-reports: - active: true - exclude: - # - 'TxtOutputReport' - # - 'XmlOutputReport' - # - 'HtmlOutputReport' - # - 'MdOutputReport' - # - 'SarifOutputReport' - -comments: - active: true - excludes: [ '**/build-logic/**' ] - AbsentOrWrongFileLicense: - active: true - licenseTemplateFile: 'license.template' - licenseTemplateIsRegex: true - CommentOverPrivateFunction: - active: false - CommentOverPrivateProperty: - active: false - DeprecatedBlockTag: - active: true - EndOfSentenceFormat: - active: false - endOfSentenceFormat: '([.?!][ \t\n\r\f<])|([.?!:]$)' - KDocReferencesNonPublicProperty: - active: false - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - OutdatedDocumentation: - active: true - matchTypeParameters: false - matchDeclarationsOrder: true - allowParamOnConstructorProperties: false - UndocumentedPublicClass: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**', '**/integrationTest/**', '**/iosTest/**' ] - searchInNestedClass: true - searchInInnerClass: true - searchInInnerObject: true - searchInInnerInterface: true - searchInProtectedClass: false - ignoreAnnotated: - - 'dagger.Binds' - - 'dagger.Module' - UndocumentedPublicFunction: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - searchProtectedFunction: false - ignoreAnnotated: - - 'dagger.Binds' - - 'dagger.Module' - UndocumentedPublicProperty: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - searchProtectedProperty: false - ignoreAnnotated: - - 'dagger.Binds' - - 'dagger.Module' - -complexity: - active: true - CognitiveComplexMethod: - active: false - threshold: 15 - ComplexCondition: - active: true - threshold: 4 - ComplexInterface: - active: false - threshold: 10 - includeStaticDeclarations: false - includePrivateDeclarations: false - ignoreOverloaded: false - CyclomaticComplexMethod: - active: true - threshold: 15 - ignoreSingleWhenExpression: true - ignoreSimpleWhenEntries: true - ignoreNestingFunctions: false - nestingFunctions: - - 'also' - - 'apply' - - 'forEach' - - 'isNotNull' - - 'ifNull' - - 'let' - - 'run' - - 'use' - - 'with' - LabeledExpression: - active: false - ignoredLabels: [ ] - LargeClass: - active: true - threshold: 600 - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/integrationTest/**', '**/iosTest/**' ] - LongMethod: - active: false - threshold: 60 - LongParameterList: - active: false - functionThreshold: 6 - constructorThreshold: 7 - ignoreDefaultParameters: false - ignoreDataClasses: true - ignoreAnnotatedParameter: [ ] - MethodOverloading: - active: false - threshold: 6 - NamedArguments: - active: false - threshold: 3 - ignoreArgumentsMatchingNames: false - NestedBlockDepth: - active: true - threshold: 4 - NestedScopeFunctions: - active: false - threshold: 1 - functions: - - 'kotlin.apply' - - 'kotlin.run' - - 'kotlin.with' - - 'kotlin.let' - - 'kotlin.also' - ReplaceSafeCallChainWithRun: - active: false - StringLiteralDuplication: - active: false - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - threshold: 3 - ignoreAnnotation: true - excludeStringsWithLessThan5Characters: true - ignoreStringsRegex: '$^' - TooManyFunctions: - active: false - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - thresholdInFiles: 13 - thresholdInClasses: 13 - thresholdInInterfaces: 13 - thresholdInObjects: 13 - thresholdInEnums: 13 - ignoreDeprecated: false - ignorePrivate: false - ignoreOverridden: false - -coroutines: - active: true - GlobalCoroutineUsage: - active: false - InjectDispatcher: - active: true - dispatcherNames: - - 'IO' - - 'Default' - - 'Unconfined' - RedundantSuspendModifier: - active: true - SleepInsteadOfDelay: - active: true - SuspendFunSwallowedCancellation: - active: true - SuspendFunWithCoroutineScopeReceiver: - active: true - SuspendFunWithFlowReturnType: - active: false - -empty-blocks: - active: true - EmptyCatchBlock: - active: true - allowedExceptionNameRegex: '_|(ignore|expected).*' - EmptyClassBlock: - active: true - EmptyDefaultConstructor: - active: true - EmptyDoWhileBlock: - active: true - EmptyElseBlock: - active: true - EmptyFinallyBlock: - active: true - EmptyForBlock: - active: true - EmptyFunctionBlock: - active: true - ignoreOverridden: false - EmptyIfBlock: - active: true - EmptyInitBlock: - active: true - EmptyKtFile: - active: true - EmptySecondaryConstructor: - active: true - EmptyTryBlock: - active: true - EmptyWhenBlock: - active: true - EmptyWhileBlock: - active: true - -exceptions: - active: true - ExceptionRaisedInUnexpectedLocation: - active: true - methodNames: - - 'equals' - - 'finalize' - - 'hashCode' - - 'toString' - InstanceOfCheckForException: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - NotImplementedDeclaration: - active: false - ObjectExtendsThrowable: - active: false - PrintStackTrace: - active: true - RethrowCaughtException: - active: true - ReturnFromFinally: - active: true - ignoreLabeled: false - SwallowedException: - active: true - ignoredExceptionTypes: - - 'InterruptedException' - - 'MalformedURLException' - - 'NumberFormatException' - - 'ParseException' - allowedExceptionNameRegex: '_|(ignore|expected).*' - ThrowingExceptionFromFinally: - active: true - ThrowingExceptionInMain: - active: false - ThrowingExceptionsWithoutMessageOrCause: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - exceptions: - - 'ArrayIndexOutOfBoundsException' - - 'Exception' - - 'IllegalArgumentException' - - 'IllegalMonitorStateException' - - 'IllegalStateException' - - 'IndexOutOfBoundsException' - - 'NullPointerException' - - 'RuntimeException' - - 'Throwable' - ThrowingNewInstanceOfSameException: - active: true - TooGenericExceptionCaught: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - exceptionNames: - - 'ArrayIndexOutOfBoundsException' - - 'Error' - - 'Exception' - - 'IllegalMonitorStateException' - - 'IndexOutOfBoundsException' - - 'NullPointerException' - - 'RuntimeException' - - 'Throwable' - allowedExceptionNameRegex: '_|(ignore|expected).*' - TooGenericExceptionThrown: - active: true - exceptionNames: - - 'Error' - - 'Exception' - - 'RuntimeException' - - 'Throwable' - -naming: - active: true - BooleanPropertyNaming: - active: false - allowedPattern: '^(is|has|are)' - ClassNaming: - active: true - classPattern: '[A-Z][a-zA-Z0-9]*' - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/integrationTest/**', '**/iosTest/**' ] - ConstructorParameterNaming: - active: true - parameterPattern: '[a-z][A-Za-z0-9]*' - privateParameterPattern: '[a-z][A-Za-z0-9]*' - excludeClassPattern: '$^' - EnumNaming: - active: true - enumEntryPattern: '[A-Z][_a-zA-Z0-9]*' - ForbiddenClassName: - active: false - forbiddenName: [ ] - FunctionMaxLength: - active: false - maximumFunctionNameLength: 30 - FunctionMinLength: - active: false - minimumFunctionNameLength: 3 - FunctionNaming: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - functionPattern: '[a-zA-Z][a-zA-Z0-9]*|`.*`' - excludeClassPattern: '$^' - FunctionParameterNaming: - active: true - parameterPattern: '[a-z][A-Za-z0-9]*' - excludeClassPattern: '$^' - InvalidPackageDeclaration: - active: true - rootPackage: '' - requireRootInDeclaration: false - LambdaParameterNaming: - active: false - parameterPattern: '[a-z][A-Za-z0-9]*|_' - MatchingDeclarationName: - active: true - mustBeFirst: true - MemberNameEqualsClassName: - active: true - ignoreOverridden: true - NoNameShadowing: - active: true - NonBooleanPropertyPrefixedWithIs: - active: false - ObjectPropertyNaming: - active: true - constantPattern: '[A-Za-z][_A-Za-z0-9]*' - propertyPattern: '[A-Za-z][_A-Za-z0-9]*' - privatePropertyPattern: '(_)?[A-Za-z][_A-Za-z0-9]*' - PackageNaming: - active: true - packagePattern: '[a-z]+(\.[a-z][A-Za-z0-9]*)*' - TopLevelPropertyNaming: - active: true - constantPattern: '[A-Z][_A-Z0-9]*' - propertyPattern: '[A-Za-z][_A-Za-z0-9]*' - privatePropertyPattern: '_?[A-Za-z][_A-Za-z0-9]*' - VariableMaxLength: - active: false - maximumVariableNameLength: 64 - VariableMinLength: - active: false - minimumVariableNameLength: 1 - VariableNaming: - active: true - variablePattern: '[a-z][A-Za-z0-9]*' - privateVariablePattern: '(_)?[a-z][A-Za-z0-9]*' - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/integrationTest/**', '**/iosTest/**' ] - excludeClassPattern: '$^' - -performance: - active: true - ArrayPrimitive: - active: true - CouldBeSequence: - active: false - threshold: 3 - ForEachOnRange: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - SpreadOperator: - active: false - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - UnnecessaryPartOfBinaryExpression: - active: false - UnnecessaryTemporaryInstantiation: - active: true - -potential-bugs: - active: true - AvoidReferentialEquality: - active: true - forbiddenTypePatterns: - - 'kotlin.String' - CastNullableToNonNullableType: - active: false - CastToNullableType: - active: false - Deprecation: - active: false - DontDowncastCollectionTypes: - active: false - DoubleMutabilityForCollection: - active: true - mutableTypes: - - 'kotlin.collections.MutableList' - - 'kotlin.collections.MutableMap' - - 'kotlin.collections.MutableSet' - - 'java.util.ArrayList' - - 'java.util.LinkedHashSet' - - 'java.util.HashSet' - - 'java.util.LinkedHashMap' - - 'java.util.HashMap' - ElseCaseInsteadOfExhaustiveWhen: - active: true - ignoredSubjectTypes: [ ] - EqualsAlwaysReturnsTrueOrFalse: - active: true - EqualsWithHashCodeExist: - active: true - ExitOutsideMain: - active: false - ExplicitGarbageCollectionCall: - active: true - HasPlatformType: - active: true - IgnoredReturnValue: - active: true - restrictToConfig: true - returnValueAnnotations: - - 'CheckResult' - - '*.CheckResult' - - 'CheckReturnValue' - - '*.CheckReturnValue' - ignoreReturnValueAnnotations: - - 'CanIgnoreReturnValue' - - '*.CanIgnoreReturnValue' - returnValueTypes: - - 'kotlin.sequences.Sequence' - - 'kotlinx.coroutines.flow.*Flow' - - 'java.util.stream.*Stream' - ignoreFunctionCall: [ ] - ImplicitDefaultLocale: - active: true - ImplicitUnitReturnType: - active: false - allowExplicitReturnType: true - InvalidRange: - active: true - IteratorHasNextCallsNextMethod: - active: true - IteratorNotThrowingNoSuchElementException: - active: true - LateinitUsage: - active: false - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - ignoreOnClassesPattern: '' - MapGetWithNotNullAssertionOperator: - active: true - MissingPackageDeclaration: - active: false - excludes: [ '**/*.kts' ] - NullCheckOnMutableProperty: - active: false - NullableToStringCall: - active: false - PropertyUsedBeforeDeclaration: - active: false - UnconditionalJumpStatementInLoop: - active: false - UnnecessaryNotNullCheck: - active: false - UnnecessaryNotNullOperator: - active: true - UnnecessarySafeCall: - active: true - UnreachableCatchBlock: - active: true - UnreachableCode: - active: true - UnsafeCallOnNullableType: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**' ] - UnsafeCast: - active: true - UnusedUnaryOperator: - active: true - UselessPostfixExpression: - active: true - WrongEqualsTypeParameter: - active: true - -style: - active: true - AlsoCouldBeApply: - active: false - BracesOnIfStatements: - active: true - singleLine: 'never' - multiLine: 'always' - BracesOnWhenStatements: - active: false - singleLine: 'necessary' - multiLine: 'consistent' - CanBeNonNullable: - active: false - CascadingCallWrapping: - active: false - includeElvis: true - ClassOrdering: - active: false - CollapsibleIfStatements: - active: false - DataClassContainsFunctions: - active: false - conversionFunctionPrefix: - - 'to' - allowOperators: false - DataClassShouldBeImmutable: - active: false - DestructuringDeclarationWithTooManyEntries: - active: true - maxDestructuringEntries: 6 - DoubleNegativeLambda: - active: true - negativeFunctions: - - reason: 'Use `takeIf` instead.' - value: 'takeUnless' - - reason: 'Use `all` instead.' - value: 'none' - negativeFunctionNameParts: - - 'not' - - 'non' - EqualsNullCall: - active: true - EqualsOnSignatureLine: - active: false - ExplicitCollectionElementAccessMethod: - active: false - ExplicitItLambdaParameter: - active: true - ExpressionBodySyntax: - active: false - includeLineWrapping: false - ForbiddenAnnotation: - active: true - annotations: - - reason: 'it is a java annotation. Use `Suppress` instead.' - value: 'java.lang.SuppressWarnings' - - reason: 'it is a java annotation. Use `kotlin.Deprecated` instead.' - value: 'java.lang.Deprecated' - - reason: 'it is a java annotation. Use `kotlin.annotation.MustBeDocumented` instead.' - value: 'java.lang.annotation.Documented' - - reason: 'it is a java annotation. Use `kotlin.annotation.Target` instead.' - value: 'java.lang.annotation.Target' - - reason: 'it is a java annotation. Use `kotlin.annotation.Retention` instead.' - value: 'java.lang.annotation.Retention' - - reason: 'it is a java annotation. Use `kotlin.annotation.Repeatable` instead.' - value: 'java.lang.annotation.Repeatable' - - reason: 'Kotlin does not support @Inherited annotation, see https://youtrack.jetbrains.com/issue/KT-22265' - value: 'java.lang.annotation.Inherited' - ForbiddenComment: - active: true - comments: - - reason: 'Forbidden FIXME todo marker in comment, please fix the problem.' - value: 'FIXME:' - - reason: 'Forbidden STOPSHIP todo marker in comment, please address the problem before shipping the code.' - value: 'STOPSHIP:' - - reason: 'Forbidden TODO todo marker in comment, please do the changes.' - value: 'TODO:' - allowedPatterns: '' - ForbiddenImport: - active: true - imports: - - 'com.android.build.*' - - 'groovy.xml.XmlParser' - - 'org.gradle.api.Project' - - 'org.gradle.api.artifacts.ProjectDependency' - - 'org.gradle.api.artifacts.Configuration' - - 'org.gradle.api.tasks.SourceSet' - - 'org.gradle.tooling.model.GradleProject' - forbiddenPatterns: '' - excludes: [ '**/build-logic/**' ] - ForbiddenMethodCall: - active: false - methods: - - reason: 'print does not allow you to configure the output stream. Use a logger instead.' - value: 'kotlin.io.print' - - reason: 'println does not allow you to configure the output stream. Use a logger instead.' - value: 'kotlin.io.println' - ForbiddenSuppress: - active: false - rules: [ ] - ForbiddenVoid: - active: true - ignoreOverridden: false - ignoreUsageInGenerics: false - FunctionOnlyReturningConstant: - active: true - ignoreOverridableFunction: true - ignoreActualFunction: true - excludedFunctions: [ ] - LoopWithTooManyJumpStatements: - active: true - maxJumpCount: 1 - MagicNumber: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/androidUnitTest/**', '**/androidInstrumentedTest/**', '**/jsTest/**','**/integrationTest/**', '**/iosTest/**', '**/*.kts' ] - ignoreNumbers: - - '-1' - - '0' - - '1' - - '2' - ignoreHashCodeFunction: true - ignorePropertyDeclaration: false - ignoreLocalVariableDeclaration: false - ignoreConstantDeclaration: true - ignoreCompanionObjectPropertyDeclaration: true - ignoreAnnotation: false - ignoreNamedArgument: true - ignoreEnums: false - ignoreRanges: false - ignoreExtensionFunctions: true - MandatoryBracesLoops: - active: false - MaxChainedCallsOnSameLine: - active: false - maxChainedCalls: 5 - MaxLineLength: - active: true - maxLineLength: 120 - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/integrationTest/**', '**/iosTest/**' ] - excludePackageStatements: true - excludeImportStatements: true - excludeCommentStatements: false - excludeRawStrings: true - MayBeConst: - active: true - ModifierOrder: - active: true - MultilineLambdaItParameter: - active: false - MultilineRawStringIndentation: - active: false - indentSize: 2 - trimmingMethods: - - 'trimIndent' - - 'trimMargin' - - 'replaceIndentByMargin' - NestedClassesVisibility: - active: true - NewLineAtEndOfFile: - active: true - NoTabs: - active: false - NullableBooleanCheck: - active: false - ObjectLiteralToLambda: - active: true - OptionalAbstractKeyword: - active: true - OptionalUnit: - active: false - PreferToOverPairSyntax: - active: false - ProtectedMemberInFinalClass: - active: true - RedundantExplicitType: - active: false - RedundantHigherOrderMapUsage: - active: true - RedundantVisibilityModifierRule: - active: false - ReturnCount: - active: false - max: 6 - excludedFunctions: - - 'equals' - excludeLabeled: true - excludeReturnFromLambda: true - excludeGuardClauses: true - SafeCast: - active: true - SerialVersionUIDInSerializableClass: - active: true - SpacingBetweenPackageAndImports: - active: true - StringShouldBeRawString: - active: false - maxEscapedCharacterCount: 2 - ignoredCharacters: [ ] - ThrowsCount: - active: true - max: 2 - excludeGuardClauses: false - TrailingWhitespace: - active: true - TrimMultilineRawString: - active: false - trimmingMethods: - - 'trimIndent' - - 'trimMargin' - - 'replaceIndentByMargin' - UnderscoresInNumericLiterals: - active: true - acceptableLength: 4 - allowNonStandardGrouping: false - UnnecessaryAbstractClass: - active: true - UnnecessaryAnnotationUseSiteTarget: - active: false - UnnecessaryApply: - active: true - UnnecessaryBackticks: - active: false - UnnecessaryBracesAroundTrailingLambda: - active: true - UnnecessaryFilter: - active: true - UnnecessaryInheritance: - active: true - UnnecessaryInnerClass: - active: true - ignoreAnnotated: - - 'org.junit.jupiter.api.Nested' - - 'Nested' - UnnecessaryLet: - active: true - UnnecessaryParentheses: - active: false - allowForUnclearPrecedence: true - UntilInsteadOfRangeTo: - active: true - UnusedImports: - active: false - UnusedParameter: - active: true - allowedNames: 'ignored|expected' - UnusedPrivateClass: - active: true - UnusedPrivateMember: - active: true - allowedNames: '' - UnusedPrivateProperty: - active: true - allowedNames: '_|ignored|expected|serialVersionUID' - UseAnyOrNoneInsteadOfFind: - active: true - UseArrayLiteralsInAnnotations: - active: true - UseCheckNotNull: - active: true - UseCheckOrError: - active: true - UseDataClass: - active: false - allowVars: false - UseEmptyCounterpart: - active: true - UseIfEmptyOrIfBlank: - active: true - UseIfInsteadOfWhen: - active: false - ignoreWhenContainingVariableDeclaration: false - UseIsNullOrEmpty: - active: true - UseLet: - active: true - UseOrEmpty: - active: true - UseRequire: - active: true - UseRequireNotNull: - active: true - UseSumOfInsteadOfFlatMapSize: - active: true - UselessCallOnNotNull: - active: true - UtilityClassWithPublicConstructor: - active: true - VarCouldBeVal: - active: true - ignoreLateinitVar: false - WildcardImport: - active: true - excludes: [ '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/integrationTest/**', '**/iosTest/**' ] - excludeImports: - - 'java.util.*' - -libraries: - active: true - excludes: [ '**/build-logic/**', '**/test/**', '**/androidTest/**', '**/commonTest/**', '**/jvmTest/**', '**/jsTest/**', '**/integrationTest/**', '**/iosTest/**' ] - ForbiddenPublicDataClass: - active: false - ignorePackages: - - '*.internal' - - '*.internal.*' - LibraryCodeMustSpecifyReturnType: - active: true - allowOmitUnit: true - LibraryEntitiesShouldNotBePublic: - active: false diff --git a/detekt/license.template b/detekt/license.template deleted file mode 100644 index 43b0c88488..0000000000 --- a/detekt/license.template +++ /dev/null @@ -1 +0,0 @@ -\/\*\n \* Copyright \(C\) 2021-20[0-9]{2}(-20[0-9]{2})?.*\n \* Licensed under the Apache License\, Version 2\.0 \(the \"License\"\)\;\n \* you may not use this file except in compliance with the License\.\n \* You may obtain a copy of the License at\n \*\n \* http\:\/\/www\.apache\.org\/licenses\/LICENSE\-2\.0\n \*\n \* Unless required by applicable law or agreed to in writing\, software\n \* distributed under the License is distributed on an \"AS IS\" BASIS\,\n \* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND\, either express or implied\.\n \* See the License for the specific language governing permissions and\n \* limitations under the License\.\n \*\/ diff --git a/docs/0.10.0/configuration/index.html b/docs/0.10.0/configuration/index.html new file mode 100644 index 0000000000..ef54eabf6b --- /dev/null +++ b/docs/0.10.0/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.10.0

configuration

plugins {
id("com.rickbusarow.module-check") version "0.10.0"
}

moduleCheck {

checks {
redundant.set(false)
disableAndroidResources.set(false)
disableViewBinding.set(false)
}

alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))
ignoreAll.set(setOf(":app_ble"))

additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "Roomigrant",
processor = "com.github.RickBusarow.Roomigrant:RoomigrantCompiler",
annotationImports = listOf(
"dev\\.matrix\\.roomigrant\\.\\*",
"dev\\.matrix\\.roomigrant\\.GenerateRoomMigrations",
"dev\\.matrix\\.roomigrant\\.rules\\.\\*",
"dev\\.matrix\\.roomigrant\\.rules\\.FieldMigrationRule",
"dev\\.matrix\\.roomigrant\\.rules\\.OnMigrationEndRule",
"dev\\.matrix\\.roomigrant\\.rules\\.OnMigrationStartRule"
)
),
modulecheck.api.KaptMatcher(
name = "VMInject",
processor = "my-project.codegen.vminject:processor",
annotationImports = listOf(
"vminject\\.\\*",
"vminject\\.VMInject",
"vminject\\.VMInject\\.Source",
"vminject\\.VMInjectParam",
"vminject\\.VMInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.10.0/index.html b/docs/0.10.0/index.html new file mode 100644 index 0000000000..4fc1ed4aed --- /dev/null +++ b/docs/0.10.0/index.html @@ -0,0 +1,21 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.10.0

Quick Start

note

ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.

However, auto-correction of errors is only done by parsing Kotlin files via PSI. Groovy auto-correction is not supported.

+

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.10.0"
}
+

Configuration

+

See configuration for a full list of options.

+
// top-level build.gradle.kts

configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

// top-level build.gradle.kts

moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.10.0/mdx/index.html b/docs/0.10.0/mdx/index.html new file mode 100644 index 0000000000..faf341dcab --- /dev/null +++ b/docs/0.10.0/mdx/index.html @@ -0,0 +1,16 @@ + + + + + +Powered by MDX | ModuleCheck + + + + + + + +
Version: 0.10.0

Powered by MDX

I can write Markdown alongside my JSX!

+ + \ No newline at end of file diff --git a/docs/0.10.0/rules/android/disable_resources/index.html b/docs/0.10.0/rules/android/disable_resources/index.html new file mode 100644 index 0000000000..b5830065c1 --- /dev/null +++ b/docs/0.10.0/rules/android/disable_resources/index.html @@ -0,0 +1,16 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/android/disable_viewbinding/index.html b/docs/0.10.0/rules/android/disable_viewbinding/index.html new file mode 100644 index 0000000000..9a594746e8 --- /dev/null +++ b/docs/0.10.0/rules/android/disable_viewbinding/index.html @@ -0,0 +1,16 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/kapt/custom_kapt_matchers/index.html b/docs/0.10.0/rules/kapt/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..5cda93008a --- /dev/null +++ b/docs/0.10.0/rules/kapt/custom_kapt_matchers/index.html @@ -0,0 +1,16 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/kapt/unused_kapt_plugin/index.html b/docs/0.10.0/rules/kapt/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..c199522244 --- /dev/null +++ b/docs/0.10.0/rules/kapt/unused_kapt_plugin/index.html @@ -0,0 +1,16 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/kapt/unused_kapt_processor/index.html b/docs/0.10.0/rules/kapt/unused_kapt_processor/index.html new file mode 100644 index 0000000000..be2fbd0b28 --- /dev/null +++ b/docs/0.10.0/rules/kapt/unused_kapt_processor/index.html @@ -0,0 +1,16 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/overshot/index.html b/docs/0.10.0/rules/overshot/index.html new file mode 100644 index 0000000000..cf8c30058b --- /dev/null +++ b/docs/0.10.0/rules/overshot/index.html @@ -0,0 +1,16 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/redundant/index.html b/docs/0.10.0/rules/redundant/index.html new file mode 100644 index 0000000000..467d52dbd9 --- /dev/null +++ b/docs/0.10.0/rules/redundant/index.html @@ -0,0 +1,16 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/sorting/sort_dependencies/index.html b/docs/0.10.0/rules/sorting/sort_dependencies/index.html new file mode 100644 index 0000000000..d78cdc13b5 --- /dev/null +++ b/docs/0.10.0/rules/sorting/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/sorting/sort_plugins/index.html b/docs/0.10.0/rules/sorting/sort_plugins/index.html new file mode 100644 index 0000000000..003caafca3 --- /dev/null +++ b/docs/0.10.0/rules/sorting/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.10.0/rules/unused/index.html b/docs/0.10.0/rules/unused/index.html new file mode 100644 index 0000000000..d8393885c6 --- /dev/null +++ b/docs/0.10.0/rules/unused/index.html @@ -0,0 +1,16 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.0/configuration/index.html b/docs/0.11.0/configuration/index.html new file mode 100644 index 0000000000..fb9e365785 --- /dev/null +++ b/docs/0.11.0/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.11.0

configuration

plugins {
id("com.rickbusarow.module-check") version "0.11.0"
}

moduleCheck {

autoCorrect = true // default is true
deleteUnused = true // default is false

checks {
overshotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedImplementation = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
ignoreAll.set(setOf(":app"))

additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.11.0/index.html b/docs/0.11.0/index.html new file mode 100644 index 0000000000..a82e383c00 --- /dev/null +++ b/docs/0.11.0/index.html @@ -0,0 +1,34 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.11.0

Quick Start

note

ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.

+

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.11.0"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

kapt checks

+
./gradlew moduleCheckKapt
+

sorts

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

unused

+
./gardlew moduleCheckUnused
+

redundant

+
./gradlew moduleCheckRedundant
+

overshot

+
./gradlew moduleCheckOvershot
+

Configuration

+

See configuration for a full list of options.

+
// top-level build.gradle.kts

configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

// top-level build.gradle.kts

moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/android/disable_resources/index.html b/docs/0.11.0/rules/android/disable_resources/index.html new file mode 100644 index 0000000000..44a93facc1 --- /dev/null +++ b/docs/0.11.0/rules/android/disable_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.11.0

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/android/disable_viewbinding/index.html b/docs/0.11.0/rules/android/disable_viewbinding/index.html new file mode 100644 index 0000000000..a8502dbd77 --- /dev/null +++ b/docs/0.11.0/rules/android/disable_viewbinding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.11.0

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/compiler/could_use_anvil_factory/index.html b/docs/0.11.0/rules/compiler/could_use_anvil_factory/index.html new file mode 100644 index 0000000000..416c1945f8 --- /dev/null +++ b/docs/0.11.0/rules/compiler/could_use_anvil_factory/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory | ModuleCheck + + + + + + + +
Version: 0.11.0

Could Use Anvil Factory

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents, +and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/inherited_dependency/index.html b/docs/0.11.0/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..3ae4a2fd97 --- /dev/null +++ b/docs/0.11.0/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.11.0

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/kapt/custom_kapt_matchers/index.html b/docs/0.11.0/rules/kapt/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..db7cda1bc8 --- /dev/null +++ b/docs/0.11.0/rules/kapt/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.11.0

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/kapt/unused_kapt_plugin/index.html b/docs/0.11.0/rules/kapt/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..393502a855 --- /dev/null +++ b/docs/0.11.0/rules/kapt/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + +
Version: 0.11.0

Unused Kapt Plugin

If there are no kapt/kaptTest/etc. processor dependencies in a module, there's no point in applying +the org.jetbrains.kotlin.kapt plugin.

+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/kapt/unused_kapt_processor/index.html b/docs/0.11.0/rules/kapt/unused_kapt_processor/index.html new file mode 100644 index 0000000000..a64d43e688 --- /dev/null +++ b/docs/0.11.0/rules/kapt/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.11.0

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/must_be_api/index.html b/docs/0.11.0/rules/must_be_api/index.html new file mode 100644 index 0000000000..119a9deedf --- /dev/null +++ b/docs/0.11.0/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.11.0

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.11.0/rules/sorting/sort_dependencies/index.html b/docs/0.11.0/rules/sorting/sort_dependencies/index.html new file mode 100644 index 0000000000..2151616462 --- /dev/null +++ b/docs/0.11.0/rules/sorting/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.0/rules/sorting/sort_plugins/index.html b/docs/0.11.0/rules/sorting/sort_plugins/index.html new file mode 100644 index 0000000000..f1e28d69e9 --- /dev/null +++ b/docs/0.11.0/rules/sorting/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.0/rules/unused/index.html b/docs/0.11.0/rules/unused/index.html new file mode 100644 index 0000000000..64203a4887 --- /dev/null +++ b/docs/0.11.0/rules/unused/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.11.0

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.11.1/configuration/index.html b/docs/0.11.1/configuration/index.html new file mode 100644 index 0000000000..8f80107b3c --- /dev/null +++ b/docs/0.11.1/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.11.1

configuration

plugins {
id("com.rickbusarow.module-check") version "0.11.0"
}

moduleCheck {

autoCorrect = true // default is true
deleteUnused = true // default is false

checks {
overshotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedImplementation = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
ignoreAll.set(setOf(":app"))

additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.11.1/index.html b/docs/0.11.1/index.html new file mode 100644 index 0000000000..529bd70b79 --- /dev/null +++ b/docs/0.11.1/index.html @@ -0,0 +1,34 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.11.1

Quick Start

note

ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.

+

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.11.0"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

kapt checks

+
./gradlew moduleCheckKapt
+

sorts

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

unused

+
./gardlew moduleCheckUnused
+

redundant

+
./gradlew moduleCheckRedundant
+

overshot

+
./gradlew moduleCheckOvershot
+

Configuration

+

See configuration for a full list of options.

+
// top-level build.gradle.kts

configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

// top-level build.gradle.kts

moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/android/disable_resources/index.html b/docs/0.11.1/rules/android/disable_resources/index.html new file mode 100644 index 0000000000..e13acfff37 --- /dev/null +++ b/docs/0.11.1/rules/android/disable_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.11.1

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/android/disable_viewbinding/index.html b/docs/0.11.1/rules/android/disable_viewbinding/index.html new file mode 100644 index 0000000000..710d4db4cf --- /dev/null +++ b/docs/0.11.1/rules/android/disable_viewbinding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.11.1

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/compiler/could_use_anvil_factory/index.html b/docs/0.11.1/rules/compiler/could_use_anvil_factory/index.html new file mode 100644 index 0000000000..7279199763 --- /dev/null +++ b/docs/0.11.1/rules/compiler/could_use_anvil_factory/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory | ModuleCheck + + + + + + + +
Version: 0.11.1

Could Use Anvil Factory

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents, +and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/inherited_dependency/index.html b/docs/0.11.1/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..a1eebe570c --- /dev/null +++ b/docs/0.11.1/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.11.1

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/kapt/custom_kapt_matchers/index.html b/docs/0.11.1/rules/kapt/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..fd1a8d8c12 --- /dev/null +++ b/docs/0.11.1/rules/kapt/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.11.1

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/kapt/unused_kapt_plugin/index.html b/docs/0.11.1/rules/kapt/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..fdc5bb65c7 --- /dev/null +++ b/docs/0.11.1/rules/kapt/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + +
Version: 0.11.1

Unused Kapt Plugin

If there are no kapt/kaptTest/etc. processor dependencies in a module, there's no point in applying +the org.jetbrains.kotlin.kapt plugin.

+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/kapt/unused_kapt_processor/index.html b/docs/0.11.1/rules/kapt/unused_kapt_processor/index.html new file mode 100644 index 0000000000..4c70fa5912 --- /dev/null +++ b/docs/0.11.1/rules/kapt/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.11.1

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/must_be_api/index.html b/docs/0.11.1/rules/must_be_api/index.html new file mode 100644 index 0000000000..abd3bbb9ac --- /dev/null +++ b/docs/0.11.1/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.11.1

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.11.1/rules/sorting/sort_dependencies/index.html b/docs/0.11.1/rules/sorting/sort_dependencies/index.html new file mode 100644 index 0000000000..2dba2e7cae --- /dev/null +++ b/docs/0.11.1/rules/sorting/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.1/rules/sorting/sort_plugins/index.html b/docs/0.11.1/rules/sorting/sort_plugins/index.html new file mode 100644 index 0000000000..295fc35dad --- /dev/null +++ b/docs/0.11.1/rules/sorting/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.1/rules/unused/index.html b/docs/0.11.1/rules/unused/index.html new file mode 100644 index 0000000000..91403bca02 --- /dev/null +++ b/docs/0.11.1/rules/unused/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.11.1

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.11.2/ci-workflow/index.html b/docs/0.11.2/ci-workflow/index.html new file mode 100644 index 0000000000..30c52b3a84 --- /dev/null +++ b/docs/0.11.2/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.11.2

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew modulecheck --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/0.11.2/configuration/index.html b/docs/0.11.2/configuration/index.html new file mode 100644 index 0000000000..cfb04fcec2 --- /dev/null +++ b/docs/0.11.2/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.11.2

configuration

plugins {
id("com.rickbusarow.module-check") version "0.11.2"
}

moduleCheck {

autoCorrect = true // default is true
deleteUnused = true // default is false

checks {
overshotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedImplementation = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
alwaysIgnore.set(setOf(":test:core-jvm", ":test:core-android"))

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
ignoreAll.set(setOf(":app"))

additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.11.2/index.html b/docs/0.11.2/index.html new file mode 100644 index 0000000000..4e4d02b3c7 --- /dev/null +++ b/docs/0.11.2/index.html @@ -0,0 +1,34 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.11.2

Quick Start

note

ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.

+

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.11.2"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

kapt checks

+
./gradlew moduleCheckKapt
+

sorts

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

unused

+
./gardlew moduleCheckUnused
+

redundant

+
./gradlew moduleCheckRedundant
+

overshot

+
./gradlew moduleCheckOvershot
+

Configuration

+

See configuration for a full list of options.

+
// top-level build.gradle.kts

configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

// top-level build.gradle.kts

moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/android/disable_resources/index.html b/docs/0.11.2/rules/android/disable_resources/index.html new file mode 100644 index 0000000000..4aefbe9d29 --- /dev/null +++ b/docs/0.11.2/rules/android/disable_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.11.2

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/android/disable_viewbinding/index.html b/docs/0.11.2/rules/android/disable_viewbinding/index.html new file mode 100644 index 0000000000..5d27e3c0fb --- /dev/null +++ b/docs/0.11.2/rules/android/disable_viewbinding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.11.2

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/compiler/could_use_anvil_factory/index.html b/docs/0.11.2/rules/compiler/could_use_anvil_factory/index.html new file mode 100644 index 0000000000..e78e43888d --- /dev/null +++ b/docs/0.11.2/rules/compiler/could_use_anvil_factory/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory | ModuleCheck + + + + + + + +
Version: 0.11.2

Could Use Anvil Factory

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents, +and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/inherited_dependency/index.html b/docs/0.11.2/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..e78ccad840 --- /dev/null +++ b/docs/0.11.2/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.11.2

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/kapt/custom_kapt_matchers/index.html b/docs/0.11.2/rules/kapt/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..85dcb5b1ec --- /dev/null +++ b/docs/0.11.2/rules/kapt/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.11.2

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/kapt/unused_kapt_plugin/index.html b/docs/0.11.2/rules/kapt/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..783d47989d --- /dev/null +++ b/docs/0.11.2/rules/kapt/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + +
Version: 0.11.2

Unused Kapt Plugin

If there are no kapt/kaptTest/etc. processor dependencies in a module, there's no point in applying +the org.jetbrains.kotlin.kapt plugin.

+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/kapt/unused_kapt_processor/index.html b/docs/0.11.2/rules/kapt/unused_kapt_processor/index.html new file mode 100644 index 0000000000..83f3d2d7f7 --- /dev/null +++ b/docs/0.11.2/rules/kapt/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.11.2

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/must_be_api/index.html b/docs/0.11.2/rules/must_be_api/index.html new file mode 100644 index 0000000000..86a498eec9 --- /dev/null +++ b/docs/0.11.2/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.11.2

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.11.2/rules/sorting/sort_dependencies/index.html b/docs/0.11.2/rules/sorting/sort_dependencies/index.html new file mode 100644 index 0000000000..3f7e420131 --- /dev/null +++ b/docs/0.11.2/rules/sorting/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.2/rules/sorting/sort_plugins/index.html b/docs/0.11.2/rules/sorting/sort_plugins/index.html new file mode 100644 index 0000000000..2df0a8a79e --- /dev/null +++ b/docs/0.11.2/rules/sorting/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.2/rules/unused/index.html b/docs/0.11.2/rules/unused/index.html new file mode 100644 index 0000000000..2c3e355a58 --- /dev/null +++ b/docs/0.11.2/rules/unused/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.11.2

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.11.3/ci-workflow/index.html b/docs/0.11.3/ci-workflow/index.html new file mode 100644 index 0000000000..d361220d03 --- /dev/null +++ b/docs/0.11.3/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.11.3

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew modulecheck --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/0.11.3/configuration/index.html b/docs/0.11.3/configuration/index.html new file mode 100644 index 0000000000..5be62d9890 --- /dev/null +++ b/docs/0.11.3/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.11.3

configuration

root/build.gradle.kts
plugins {
id("com.rickbusarow.module-check") version "0.11.3"
}

moduleCheck {

deleteUnused = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalKaptMatchers = listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.3/index.html b/docs/0.11.3/index.html new file mode 100644 index 0000000000..0c364595a3 --- /dev/null +++ b/docs/0.11.3/index.html @@ -0,0 +1,34 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.11.3

Quick Start

note

ModuleCheck leverages Gradle for parsing all build logic, so validation works regardless of whether that logic is expressed in Groovy or Kotlin.

+

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.11.2"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

kapt checks

+
./gradlew moduleCheckKapt
+

sorts

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

unused

+
./gardlew moduleCheckUnused
+

redundant

+
./gradlew moduleCheckRedundant
+

overshot

+
./gradlew moduleCheckOvershot
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/android/disable_resources/index.html b/docs/0.11.3/rules/android/disable_resources/index.html new file mode 100644 index 0000000000..25a7016079 --- /dev/null +++ b/docs/0.11.3/rules/android/disable_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.11.3

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/android/disable_viewbinding/index.html b/docs/0.11.3/rules/android/disable_viewbinding/index.html new file mode 100644 index 0000000000..9b14e4c8cd --- /dev/null +++ b/docs/0.11.3/rules/android/disable_viewbinding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.11.3

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/compiler/could_use_anvil_factory/index.html b/docs/0.11.3/rules/compiler/could_use_anvil_factory/index.html new file mode 100644 index 0000000000..0147113d0a --- /dev/null +++ b/docs/0.11.3/rules/compiler/could_use_anvil_factory/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory | ModuleCheck + + + + + + + +
Version: 0.11.3

Could Use Anvil Factory

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or Subcomponents, +and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/inherited_dependency/index.html b/docs/0.11.3/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..a147bd42a1 --- /dev/null +++ b/docs/0.11.3/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.11.3

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/kapt/custom_kapt_matchers/index.html b/docs/0.11.3/rules/kapt/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..f2879cf3e5 --- /dev/null +++ b/docs/0.11.3/rules/kapt/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.11.3

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/kapt/unused_kapt_plugin/index.html b/docs/0.11.3/rules/kapt/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..780322a89d --- /dev/null +++ b/docs/0.11.3/rules/kapt/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + +
Version: 0.11.3

Unused Kapt Plugin

If there are no kapt/kaptTest/etc. processor dependencies in a module, there's no point in applying +the org.jetbrains.kotlin.kapt plugin.

+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/kapt/unused_kapt_processor/index.html b/docs/0.11.3/rules/kapt/unused_kapt_processor/index.html new file mode 100644 index 0000000000..2ce0c400ad --- /dev/null +++ b/docs/0.11.3/rules/kapt/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.11.3

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/must_be_api/index.html b/docs/0.11.3/rules/must_be_api/index.html new file mode 100644 index 0000000000..92bbb472fa --- /dev/null +++ b/docs/0.11.3/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.11.3

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.11.3/rules/sorting/sort_dependencies/index.html b/docs/0.11.3/rules/sorting/sort_dependencies/index.html new file mode 100644 index 0000000000..f349f9a751 --- /dev/null +++ b/docs/0.11.3/rules/sorting/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.3/rules/sorting/sort_plugins/index.html b/docs/0.11.3/rules/sorting/sort_plugins/index.html new file mode 100644 index 0000000000..d3cec416a5 --- /dev/null +++ b/docs/0.11.3/rules/sorting/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.11.3/rules/unused/index.html b/docs/0.11.3/rules/unused/index.html new file mode 100644 index 0000000000..298e2c90f8 --- /dev/null +++ b/docs/0.11.3/rules/unused/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.11.3

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.11.3/suppressing-findings/index.html b/docs/0.11.3/suppressing-findings/index.html new file mode 100644 index 0000000000..725ee7bca9 --- /dev/null +++ b/docs/0.11.3/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: 0.11.3

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inheritedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky mustBeApi /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unusedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("mustBeApi") // don't switch anything to an api config
dependencies {

@Suppress("unusedDependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inheritedDependency") // don't add dependencies which are inherited from this fat jar
implementation(project(":fat-and-leaky"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.0/ci-workflow/index.html b/docs/0.12.0/ci-workflow/index.html new file mode 100644 index 0000000000..30807c1b8c --- /dev/null +++ b/docs/0.12.0/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.12.0

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew moduleCheckAuto --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/0.12.0/configuration/index.html b/docs/0.12.0/configuration/index.html new file mode 100644 index 0000000000..27750c0d41 --- /dev/null +++ b/docs/0.12.0/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.12.0

configuration

root/build.gradle.kts
plugins {
id("com.rickbusarow.module-check") version "0.12.0"
}

moduleCheck {

deleteUnused = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
unusedKotlinAndroidExtensions = false // default is false
depths = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalKaptMatchers = listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
depths {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"
}
graphs {
enabled = true // default is false
// The root directory of all generated graphs. If set, directories will be created
// for each module, mirroring the structure of the project. If this property is null,
// graphs will be created in the `build/reports/modulecheck/graphs/` relative
// directory of each project.
outputDir = "${project.buildDir}/reports/modulecheck/graphs"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.0/index.html b/docs/0.12.0/index.html new file mode 100644 index 0000000000..16293a4713 --- /dev/null +++ b/docs/0.12.0/index.html @@ -0,0 +1,33 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.12.0

Quick Start

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
// used for Android Gradle Plugin internally
google()
// Add for SNAPSHOT builds
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.12.0"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

all checks with auto-correct

+
./gradlew moduleCheckAuto
+

check sorting

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

apply sorting

+
./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto
+

report depths of each module

+
./gradlew moduleCheckDepths
+

generate (module-only) dependency graphs

+
./gradlew moduleCheckGraphs
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/android/disable_resources/index.html b/docs/0.12.0/rules/android/disable_resources/index.html new file mode 100644 index 0000000000..19685d8a1a --- /dev/null +++ b/docs/0.12.0/rules/android/disable_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.12.0

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/android/disable_viewbinding/index.html b/docs/0.12.0/rules/android/disable_viewbinding/index.html new file mode 100644 index 0000000000..7ba50694d7 --- /dev/null +++ b/docs/0.12.0/rules/android/disable_viewbinding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.12.0

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/android/unused_kotlin_android_extensions/index.html b/docs/0.12.0/rules/android/unused_kotlin_android_extensions/index.html new file mode 100644 index 0000000000..8716c846e6 --- /dev/null +++ b/docs/0.12.0/rules/android/unused_kotlin_android_extensions/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kotlin Android Extensions | ModuleCheck + + + + + + + +
Version: 0.12.0

Unused Kotlin Android Extensions

Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any +synthetic imports or deprecated @Parcelize annotation

+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/compiler/could_use_anvil_factory/index.html b/docs/0.12.0/rules/compiler/could_use_anvil_factory/index.html new file mode 100644 index 0000000000..5c1dafbaf0 --- /dev/null +++ b/docs/0.12.0/rules/compiler/could_use_anvil_factory/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory | ModuleCheck + + + + + + + +
Version: 0.12.0

Could Use Anvil Factory

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or +Subcomponents, and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/depths/index.html b/docs/0.12.0/rules/depths/index.html new file mode 100644 index 0000000000..236fa5f291 --- /dev/null +++ b/docs/0.12.0/rules/depths/index.html @@ -0,0 +1,54 @@ + + + + + +Depths | ModuleCheck + + + + + + + +
Version: 0.12.0

Depths

TL;DR - Low depth values mean faster builds and better all-around scalability.

+
+

It's often useful to think of module dependencies as a directed tree +or directed acyclic graph. If a module is a +node, then each module dependency is a child node, and the dependencies of those dependencies are +grand-child nodes.

+

This is especially useful when thinking about build performance, because the parent-child +relationship is clear: child nodes must build before parent nodes.

+ +

In the above example,

+
    +
  • :lib-1 and :lib-2 must be built before :screen-1.
  • +
  • :lib-2 must be build before :screen-2.
  • +
  • :screen-1 and :screen-2 must be built before :app.
  • +
+

It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build +before their parents.

+

Dependencies and Build Concurrency

+

Individual module builds are always done single-threaded, but multiple modules may build in parallel +so long as no module in the set depends upon another module in that set. In the above graph,

+
    +
  • :lib-1 and :lib-2 may build in parallel
  • +
  • :lib-1 and :screen-2 may build in parallel
  • +
  • :scren-1 and :screen-2 may build in parallel
  • +
+

The maximum number of parallel module builds is determined by the structure of the dependency graph +and the number of available processor cores on the machine which is performing the build.

+

Depth

+

Depth refers to the maximum number of edges between a module and each of its leaf nodes in the +project dependency graph.

+

Low depth values indicate a shallow or flat project structure with loose (or no) coupling between +modules. In a full build, these projects scale well with hardware upgrades because they're able to +build all those independent modules in parallel.

+ +

On the other hand, "deep" projects do not offer many opportunities for parallelization. They have +project dependencies which must be built sequentially. They also perform poorly in incremental +builds, because a single change to even a mid-level module invalidates cached builds for half of the +project.

+
+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/inherited_dependency/index.html b/docs/0.12.0/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..b519f2f868 --- /dev/null +++ b/docs/0.12.0/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.12.0

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/kapt/custom_kapt_matchers/index.html b/docs/0.12.0/rules/kapt/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..586d91a554 --- /dev/null +++ b/docs/0.12.0/rules/kapt/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.12.0

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/kapt/unused_kapt_plugin/index.html b/docs/0.12.0/rules/kapt/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..abff025df9 --- /dev/null +++ b/docs/0.12.0/rules/kapt/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.0/rules/kapt/unused_kapt_processor/index.html b/docs/0.12.0/rules/kapt/unused_kapt_processor/index.html new file mode 100644 index 0000000000..d7844cd37d --- /dev/null +++ b/docs/0.12.0/rules/kapt/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.12.0

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/must_be_api/index.html b/docs/0.12.0/rules/must_be_api/index.html new file mode 100644 index 0000000000..3512e7be0e --- /dev/null +++ b/docs/0.12.0/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.12.0

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/overshot_dependency/index.html b/docs/0.12.0/rules/overshot_dependency/index.html new file mode 100644 index 0000000000..7e5351dd53 --- /dev/null +++ b/docs/0.12.0/rules/overshot_dependency/index.html @@ -0,0 +1,23 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + +
Version: 0.12.0

Overshot Dependency

Finds project dependencies which aren't used by the declaring configuration, but are used by a +dependent, downstream configuration.

+

For instance, assume that :moduleB declares an implementation dependency upon :moduleA.

+
moduleB/build.gradle.kts
dependencies {
implementation(project(":moduleA"))
}
+

If :moduleB doesn't actually use :moduleA in its main source, but it does use it in test +source, it's an overshot dependency. The declaration should be changed to +use testImplementation:

+
moduleB/build.gradle.kts
dependencies {
testImplementation(project(":moduleA"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/redundant_dependency/index.html b/docs/0.12.0/rules/redundant_dependency/index.html new file mode 100644 index 0000000000..f92d84ffb8 --- /dev/null +++ b/docs/0.12.0/rules/redundant_dependency/index.html @@ -0,0 +1,26 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + +
Version: 0.12.0

Redundant Dependency

caution

This rule creates a brittle dependency graph, because some necessary dependencies are only provided +transitively by other dependencies. Any manual changes to dependencies can have unexpected +consequences downstream.

This rule is not recommended and disabled by default, but it's still available for those who +want to keep their build files as small as possible.

+

Finds project dependencies which are declared as api in other dependency projects, but also +declared in the current project. These dependencies can be removed without actually breaking the +build, since they're still provided by an upstream dependency through the api configuration.

+ +

This is the opposite of the inherited dependency rule, which ensures a stable graph by explicitly +declaring each dependency. Inherited dependency is enabled by default, and is the recommended +approach. Both rules may not be enabled at the same time.

+ + \ No newline at end of file diff --git a/docs/0.12.0/rules/sorting/sort_dependencies/index.html b/docs/0.12.0/rules/sorting/sort_dependencies/index.html new file mode 100644 index 0000000000..34f18dba76 --- /dev/null +++ b/docs/0.12.0/rules/sorting/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.0/rules/sorting/sort_plugins/index.html b/docs/0.12.0/rules/sorting/sort_plugins/index.html new file mode 100644 index 0000000000..766ace361f --- /dev/null +++ b/docs/0.12.0/rules/sorting/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.0/rules/unused/index.html b/docs/0.12.0/rules/unused/index.html new file mode 100644 index 0000000000..e79a5b2b54 --- /dev/null +++ b/docs/0.12.0/rules/unused/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.12.0

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.12.0/suppressing-findings/index.html b/docs/0.12.0/suppressing-findings/index.html new file mode 100644 index 0000000000..b5f63be281 --- /dev/null +++ b/docs/0.12.0/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: 0.12.0

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inheritedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky mustBeApi /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unusedDependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("mustBeApi") // don't switch anything to an api config
dependencies {

@Suppress("unusedDependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inheritedDependency") // don't add dependencies which are inherited from this fat jar
implementation(project(":fat-and-leaky"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.1/ci-workflow/index.html b/docs/0.12.1/ci-workflow/index.html new file mode 100644 index 0000000000..8b1ccc9f24 --- /dev/null +++ b/docs/0.12.1/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.12.1

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew moduleCheckAuto --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/0.12.1/configuration/index.html b/docs/0.12.1/configuration/index.html new file mode 100644 index 0000000000..fae7730024 --- /dev/null +++ b/docs/0.12.1/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.12.1

configuration

root/build.gradle.kts
plugins {
id("com.rickbusarow.module-check") version "0.12.1"
}

moduleCheck {

deleteUnused = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
unusedKotlinAndroidExtensions = false // default is false
depths = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalCodeGenerators = listOf(
modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(
name = "My Processor",
generatorMavenCoordinates = "my-project.codegen:processor",
annotationNames = listOf(
"myproject.MyInject",
"myproject.MyInject.Factory",
"myproject.MyInjectParam",
"myproject.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
sarif {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"
}
depths {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"
}
graphs {
enabled = true // default is false
// The root directory of all generated graphs. If set, directories will be created
// for each module, mirroring the structure of the project. If this property is null,
// graphs will be created in the `build/reports/modulecheck/graphs/` relative
// directory of each project.
outputDir = "${project.buildDir}/reports/modulecheck/graphs"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.1/index.html b/docs/0.12.1/index.html new file mode 100644 index 0000000000..0216a0119a --- /dev/null +++ b/docs/0.12.1/index.html @@ -0,0 +1,33 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.12.1

Quick Start

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
// Add for SNAPSHOT builds
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.12.1"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

all checks with auto-correct

+
./gradlew moduleCheckAuto
+

check sorting

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

apply sorting

+
./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto
+

report depths of each module

+
./gradlew moduleCheckDepths
+

generate (module-only) dependency graphs

+
./gradlew moduleCheckGraphs
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/custom_kapt_matchers/index.html b/docs/0.12.1/rules/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..00b94dfa9e --- /dev/null +++ b/docs/0.12.1/rules/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.12.1

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/disable_android_resources/index.html b/docs/0.12.1/rules/disable_android_resources/index.html new file mode 100644 index 0000000000..fdf8532f3d --- /dev/null +++ b/docs/0.12.1/rules/disable_android_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.12.1

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/disable_view_binding/index.html b/docs/0.12.1/rules/disable_view_binding/index.html new file mode 100644 index 0000000000..8aed07d931 --- /dev/null +++ b/docs/0.12.1/rules/disable_view_binding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.12.1

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/inherited_dependency/index.html b/docs/0.12.1/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..13a39a55d9 --- /dev/null +++ b/docs/0.12.1/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.12.1

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/must_be_api/index.html b/docs/0.12.1/rules/must_be_api/index.html new file mode 100644 index 0000000000..81842d182d --- /dev/null +++ b/docs/0.12.1/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.12.1

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/overshot_dependency/index.html b/docs/0.12.1/rules/overshot_dependency/index.html new file mode 100644 index 0000000000..cc61cb9062 --- /dev/null +++ b/docs/0.12.1/rules/overshot_dependency/index.html @@ -0,0 +1,23 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + +
Version: 0.12.1

Overshot Dependency

Finds project dependencies which aren't used by the declaring configuration, but are used by a +dependent, downstream configuration.

+

For instance, assume that :moduleB declares an implementation dependency upon :moduleA.

+
moduleB/build.gradle.kts
dependencies {
implementation(project(":moduleA"))
}
+

If :moduleB doesn't actually use :moduleA in its main source, but it does use it in test +source, it's an overshot dependency. The declaration should be changed to +use testImplementation:

+
moduleB/build.gradle.kts
dependencies {
testImplementation(project(":moduleA"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/project_depth/index.html b/docs/0.12.1/rules/project_depth/index.html new file mode 100644 index 0000000000..f44ded6d2e --- /dev/null +++ b/docs/0.12.1/rules/project_depth/index.html @@ -0,0 +1,54 @@ + + + + + +Project Depth | ModuleCheck + + + + + + + +
Version: 0.12.1

Project Depth

TL;DR - Low depth values mean faster builds and better all-around scalability.

+
+

It's often useful to think of module dependencies as a directed tree +or directed acyclic graph. If a module is a +node, then each module dependency is a child node, and the dependencies of those dependencies are +grand-child nodes.

+

This is especially useful when thinking about build performance, because the parent-child +relationship is clear: child nodes must build before parent nodes.

+ +

In the above example,

+
    +
  • :lib-1 and :lib-2 must be built before :screen-1.
  • +
  • :lib-2 must be build before :screen-2.
  • +
  • :screen-1 and :screen-2 must be built before :app.
  • +
+

It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build +before their parents.

+

Dependencies and Build Concurrency

+

Individual module builds are always done single-threaded, but multiple modules may build in parallel +so long as no module in the set depends upon another module in that set. In the above graph,

+
    +
  • :lib-1 and :lib-2 may build in parallel
  • +
  • :lib-1 and :screen-2 may build in parallel
  • +
  • :scren-1 and :screen-2 may build in parallel
  • +
+

The maximum number of parallel module builds is determined by the structure of the dependency graph +and the number of available processor cores on the machine which is performing the build.

+

Depth

+

Depth refers to the maximum number of edges between a module and each of its leaf nodes in the +project dependency graph.

+

Low depth values indicate a shallow or flat project structure with loose (or no) coupling between +modules. In a full build, these projects scale well with hardware upgrades because they're able to +build all those independent modules in parallel.

+ +

On the other hand, "deep" projects do not offer many opportunities for parallelization. They have +project dependencies which must be built sequentially. They also perform poorly in incremental +builds, because a single change to even a mid-level module invalidates cached builds for half of the +project.

+
+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/redundant_dependency/index.html b/docs/0.12.1/rules/redundant_dependency/index.html new file mode 100644 index 0000000000..3c85545f50 --- /dev/null +++ b/docs/0.12.1/rules/redundant_dependency/index.html @@ -0,0 +1,26 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + +
Version: 0.12.1

Redundant Dependency

caution

This rule creates a brittle dependency graph, because some necessary dependencies are only provided +transitively by other dependencies. Any manual changes to dependencies can have unexpected +consequences downstream.

This rule is not recommended and disabled by default, but it's still available for those who +want to keep their build files as small as possible.

+

Finds project dependencies which are declared as api in other dependency projects, but also +declared in the current project. These dependencies can be removed without actually breaking the +build, since they're still provided by an upstream dependency through the api configuration.

+ +

This is the opposite of the inherited dependency rule, which ensures a stable graph by explicitly +declaring each dependency. Inherited dependency is enabled by default, and is the recommended +approach. Both rules may not be enabled at the same time.

+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/sort_dependencies/index.html b/docs/0.12.1/rules/sort_dependencies/index.html new file mode 100644 index 0000000000..73c05a8002 --- /dev/null +++ b/docs/0.12.1/rules/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.1/rules/sort_plugins/index.html b/docs/0.12.1/rules/sort_plugins/index.html new file mode 100644 index 0000000000..f8ba1f2819 --- /dev/null +++ b/docs/0.12.1/rules/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.1/rules/unused_dependency/index.html b/docs/0.12.1/rules/unused_dependency/index.html new file mode 100644 index 0000000000..51f8344826 --- /dev/null +++ b/docs/0.12.1/rules/unused_dependency/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.12.1

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/unused_kapt_plugin/index.html b/docs/0.12.1/rules/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..8b033ad048 --- /dev/null +++ b/docs/0.12.1/rules/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.1/rules/unused_kapt_processor/index.html b/docs/0.12.1/rules/unused_kapt_processor/index.html new file mode 100644 index 0000000000..732e7d846a --- /dev/null +++ b/docs/0.12.1/rules/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.12.1

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/unused_kotlin_android_extensions/index.html b/docs/0.12.1/rules/unused_kotlin_android_extensions/index.html new file mode 100644 index 0000000000..888ea4a2d3 --- /dev/null +++ b/docs/0.12.1/rules/unused_kotlin_android_extensions/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kotlin Android Extensions | ModuleCheck + + + + + + + +
Version: 0.12.1

Unused Kotlin Android Extensions

Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any +synthetic imports or deprecated @Parcelize annotation

+ + \ No newline at end of file diff --git a/docs/0.12.1/rules/use_anvil_factory_generation/index.html b/docs/0.12.1/rules/use_anvil_factory_generation/index.html new file mode 100644 index 0000000000..a9dd69baf8 --- /dev/null +++ b/docs/0.12.1/rules/use_anvil_factory_generation/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory Generation | ModuleCheck + + + + + + + +
Version: 0.12.1

Could Use Anvil Factory Generation

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or +Subcomponents, and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.12.1/suppressing-findings/index.html b/docs/0.12.1/suppressing-findings/index.html new file mode 100644 index 0000000000..63a23dba81 --- /dev/null +++ b/docs/0.12.1/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: 0.12.1

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("must-be-api") // don't switch anything to an api config
dependencies {

@Suppress("unused-dependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inherited-dependency") // don't add dependencies which are inherited from this library
implementation(project(":leaky"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.2/ci-workflow/index.html b/docs/0.12.2/ci-workflow/index.html new file mode 100644 index 0000000000..7a744613a8 --- /dev/null +++ b/docs/0.12.2/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.12.2

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew moduleCheckAuto --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/0.12.2/configuration/index.html b/docs/0.12.2/configuration/index.html new file mode 100644 index 0000000000..72cd7cc5cd --- /dev/null +++ b/docs/0.12.2/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.12.2

configuration

root/build.gradle.kts
plugins {
id("com.rickbusarow.module-check") version "0.12.2"
}

moduleCheck {

deleteUnused = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
unusedKotlinAndroidExtensions = false // default is false
depths = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalCodeGenerators = listOf(
modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(
name = "My Processor",
generatorMavenCoordinates = "my-project.codegen:processor",
annotationNames = listOf(
"myproject.MyInject",
"myproject.MyInject.Factory",
"myproject.MyInjectParam",
"myproject.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
sarif {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"
}
depths {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"
}
graphs {
enabled = true // default is false
// The root directory of all generated graphs. If set, directories will be created
// for each module, mirroring the structure of the project. If this property is null,
// graphs will be created in the `build/reports/modulecheck/graphs/` relative
// directory of each project.
outputDir = "${project.buildDir}/reports/modulecheck/graphs"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.2/index.html b/docs/0.12.2/index.html new file mode 100644 index 0000000000..ceec696b56 --- /dev/null +++ b/docs/0.12.2/index.html @@ -0,0 +1,33 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.12.2

Quick Start

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
// Add for SNAPSHOT builds
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.12.2"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

all checks with auto-correct

+
./gradlew moduleCheckAuto
+

check sorting

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

apply sorting

+
./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto
+

report depths of each module

+
./gradlew moduleCheckDepths
+

generate (module-only) dependency graphs

+
./gradlew moduleCheckGraphs
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/custom_kapt_matchers/index.html b/docs/0.12.2/rules/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..f0710f84db --- /dev/null +++ b/docs/0.12.2/rules/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.12.2

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/disable_android_resources/index.html b/docs/0.12.2/rules/disable_android_resources/index.html new file mode 100644 index 0000000000..d929ddec0c --- /dev/null +++ b/docs/0.12.2/rules/disable_android_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.12.2

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/disable_view_binding/index.html b/docs/0.12.2/rules/disable_view_binding/index.html new file mode 100644 index 0000000000..12cc9ef183 --- /dev/null +++ b/docs/0.12.2/rules/disable_view_binding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.12.2

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/inherited_dependency/index.html b/docs/0.12.2/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..e85693e42a --- /dev/null +++ b/docs/0.12.2/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.12.2

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/must_be_api/index.html b/docs/0.12.2/rules/must_be_api/index.html new file mode 100644 index 0000000000..31db543e9f --- /dev/null +++ b/docs/0.12.2/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.12.2

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/overshot_dependency/index.html b/docs/0.12.2/rules/overshot_dependency/index.html new file mode 100644 index 0000000000..ed316ab9dd --- /dev/null +++ b/docs/0.12.2/rules/overshot_dependency/index.html @@ -0,0 +1,23 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + +
Version: 0.12.2

Overshot Dependency

Finds project dependencies which aren't used by the declaring configuration, but are used by a +dependent, downstream configuration.

+

For instance, assume that :moduleB declares an implementation dependency upon :moduleA.

+
moduleB/build.gradle.kts
dependencies {
implementation(project(":moduleA"))
}
+

If :moduleB doesn't actually use :moduleA in its main source, but it does use it in test +source, it's an overshot dependency. The declaration should be changed to +use testImplementation:

+
moduleB/build.gradle.kts
dependencies {
testImplementation(project(":moduleA"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/project_depth/index.html b/docs/0.12.2/rules/project_depth/index.html new file mode 100644 index 0000000000..4580c32c63 --- /dev/null +++ b/docs/0.12.2/rules/project_depth/index.html @@ -0,0 +1,54 @@ + + + + + +Project Depth | ModuleCheck + + + + + + + +
Version: 0.12.2

Project Depth

TL;DR - Low depth values mean faster builds and better all-around scalability.

+
+

It's often useful to think of module dependencies as a directed tree +or directed acyclic graph. If a module is a +node, then each module dependency is a child node, and the dependencies of those dependencies are +grand-child nodes.

+

This is especially useful when thinking about build performance, because the parent-child +relationship is clear: child nodes must build before parent nodes.

+ +

In the above example,

+
    +
  • :lib-1 and :lib-2 must be built before :screen-1.
  • +
  • :lib-2 must be build before :screen-2.
  • +
  • :screen-1 and :screen-2 must be built before :app.
  • +
+

It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build +before their parents.

+

Dependencies and Build Concurrency

+

Individual module builds are always done single-threaded, but multiple modules may build in parallel +so long as no module in the set depends upon another module in that set. In the above graph,

+
    +
  • :lib-1 and :lib-2 may build in parallel
  • +
  • :lib-1 and :screen-2 may build in parallel
  • +
  • :scren-1 and :screen-2 may build in parallel
  • +
+

The maximum number of parallel module builds is determined by the structure of the dependency graph +and the number of available processor cores on the machine which is performing the build.

+

Depth

+

Depth refers to the maximum number of edges between a module and each of its leaf nodes in the +project dependency graph.

+

Low depth values indicate a shallow or flat project structure with loose (or no) coupling between +modules. In a full build, these projects scale well with hardware upgrades because they're able to +build all those independent modules in parallel.

+ +

On the other hand, "deep" projects do not offer many opportunities for parallelization. They have +project dependencies which must be built sequentially. They also perform poorly in incremental +builds, because a single change to even a mid-level module invalidates cached builds for half of the +project.

+
+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/redundant_dependency/index.html b/docs/0.12.2/rules/redundant_dependency/index.html new file mode 100644 index 0000000000..d0a7bcd704 --- /dev/null +++ b/docs/0.12.2/rules/redundant_dependency/index.html @@ -0,0 +1,26 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + +
Version: 0.12.2

Redundant Dependency

caution

This rule creates a brittle dependency graph, because some necessary dependencies are only provided +transitively by other dependencies. Any manual changes to dependencies can have unexpected +consequences downstream.

This rule is not recommended and disabled by default, but it's still available for those who +want to keep their build files as small as possible.

+

Finds project dependencies which are declared as api in other dependency projects, but also +declared in the current project. These dependencies can be removed without actually breaking the +build, since they're still provided by an upstream dependency through the api configuration.

+ +

This is the opposite of the inherited dependency rule, which ensures a stable graph by explicitly +declaring each dependency. Inherited dependency is enabled by default, and is the recommended +approach. Both rules may not be enabled at the same time.

+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/sort_dependencies/index.html b/docs/0.12.2/rules/sort_dependencies/index.html new file mode 100644 index 0000000000..994d59fdde --- /dev/null +++ b/docs/0.12.2/rules/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.2/rules/sort_plugins/index.html b/docs/0.12.2/rules/sort_plugins/index.html new file mode 100644 index 0000000000..28579f37a2 --- /dev/null +++ b/docs/0.12.2/rules/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.2/rules/unused_dependency/index.html b/docs/0.12.2/rules/unused_dependency/index.html new file mode 100644 index 0000000000..91ede2f309 --- /dev/null +++ b/docs/0.12.2/rules/unused_dependency/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.12.2

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/unused_kapt_plugin/index.html b/docs/0.12.2/rules/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..52b3066ce9 --- /dev/null +++ b/docs/0.12.2/rules/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.2/rules/unused_kapt_processor/index.html b/docs/0.12.2/rules/unused_kapt_processor/index.html new file mode 100644 index 0000000000..3162674a04 --- /dev/null +++ b/docs/0.12.2/rules/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.12.2

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/unused_kotlin_android_extensions/index.html b/docs/0.12.2/rules/unused_kotlin_android_extensions/index.html new file mode 100644 index 0000000000..bdc097453b --- /dev/null +++ b/docs/0.12.2/rules/unused_kotlin_android_extensions/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kotlin Android Extensions | ModuleCheck + + + + + + + +
Version: 0.12.2

Unused Kotlin Android Extensions

Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any +synthetic imports or deprecated @Parcelize annotation

+ + \ No newline at end of file diff --git a/docs/0.12.2/rules/use_anvil_factory_generation/index.html b/docs/0.12.2/rules/use_anvil_factory_generation/index.html new file mode 100644 index 0000000000..b8d9bd5a14 --- /dev/null +++ b/docs/0.12.2/rules/use_anvil_factory_generation/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory Generation | ModuleCheck + + + + + + + +
Version: 0.12.2

Could Use Anvil Factory Generation

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or +Subcomponents, and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.12.2/suppressing-findings/index.html b/docs/0.12.2/suppressing-findings/index.html new file mode 100644 index 0000000000..e174836f10 --- /dev/null +++ b/docs/0.12.2/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: 0.12.2

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("must-be-api") // don't switch anything to an api config
dependencies {

@Suppress("unused-dependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inherited-dependency") // don't add dependencies which are inherited from this library
implementation(project(":leaky"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.3/ci-workflow/index.html b/docs/0.12.3/ci-workflow/index.html new file mode 100644 index 0000000000..b88bb7d9f0 --- /dev/null +++ b/docs/0.12.3/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.12.3

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew moduleCheckAuto --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/0.12.3/configuration/index.html b/docs/0.12.3/configuration/index.html new file mode 100644 index 0000000000..6e089a47fc --- /dev/null +++ b/docs/0.12.3/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.12.3

configuration

root/build.gradle.kts
plugins {
id("com.rickbusarow.module-check") version "0.12.3"
}

moduleCheck {

deleteUnused = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
unusedKotlinAndroidExtensions = false // default is false
depths = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalCodeGenerators = listOf(
modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(
name = "My Processor",
generatorMavenCoordinates = "my-project.codegen:processor",
annotationNames = listOf(
"myproject.MyInject",
"myproject.MyInject.Factory",
"myproject.MyInjectParam",
"myproject.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
sarif {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"
}
depths {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"
}
graphs {
enabled = true // default is false
// The root directory of all generated graphs. If set, directories will be created
// for each module, mirroring the structure of the project. If this property is null,
// graphs will be created in the `build/reports/modulecheck/graphs/` relative
// directory of each project.
outputDir = "${project.buildDir}/reports/modulecheck/graphs"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.3/index.html b/docs/0.12.3/index.html new file mode 100644 index 0000000000..45f9c0ee29 --- /dev/null +++ b/docs/0.12.3/index.html @@ -0,0 +1,33 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.12.3

Quick Start

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
// Add for SNAPSHOT builds
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.12.3"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

all checks with auto-correct

+
./gradlew moduleCheckAuto
+

check sorting

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

apply sorting

+
./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto
+

report depths of each module

+
./gradlew moduleCheckDepths
+

generate (module-only) dependency graphs

+
./gradlew moduleCheckGraphs
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/custom_kapt_matchers/index.html b/docs/0.12.3/rules/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..4d08da641b --- /dev/null +++ b/docs/0.12.3/rules/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.12.3

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/disable_android_resources/index.html b/docs/0.12.3/rules/disable_android_resources/index.html new file mode 100644 index 0000000000..6d07c60e17 --- /dev/null +++ b/docs/0.12.3/rules/disable_android_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.12.3

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/disable_view_binding/index.html b/docs/0.12.3/rules/disable_view_binding/index.html new file mode 100644 index 0000000000..b4c141ac4b --- /dev/null +++ b/docs/0.12.3/rules/disable_view_binding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.12.3

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/inherited_dependency/index.html b/docs/0.12.3/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..eb40659a1a --- /dev/null +++ b/docs/0.12.3/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.12.3

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/must_be_api/index.html b/docs/0.12.3/rules/must_be_api/index.html new file mode 100644 index 0000000000..68d4827900 --- /dev/null +++ b/docs/0.12.3/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.12.3

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/overshot_dependency/index.html b/docs/0.12.3/rules/overshot_dependency/index.html new file mode 100644 index 0000000000..7b7c5e2856 --- /dev/null +++ b/docs/0.12.3/rules/overshot_dependency/index.html @@ -0,0 +1,23 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + +
Version: 0.12.3

Overshot Dependency

Finds project dependencies which aren't used by the declaring configuration, but are used by a +dependent, downstream configuration.

+

For instance, assume that :moduleB declares an implementation dependency upon :moduleA.

+
moduleB/build.gradle.kts
dependencies {
implementation(project(":moduleA"))
}
+

If :moduleB doesn't actually use :moduleA in its main source, but it does use it in test +source, it's an overshot dependency. The declaration should be changed to +use testImplementation:

+
moduleB/build.gradle.kts
dependencies {
testImplementation(project(":moduleA"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/project_depth/index.html b/docs/0.12.3/rules/project_depth/index.html new file mode 100644 index 0000000000..9d718bca22 --- /dev/null +++ b/docs/0.12.3/rules/project_depth/index.html @@ -0,0 +1,54 @@ + + + + + +Project Depth | ModuleCheck + + + + + + + +
Version: 0.12.3

Project Depth

TL;DR - Low depth values mean faster builds and better all-around scalability.

+
+

It's often useful to think of module dependencies as a directed tree +or directed acyclic graph. If a module is a +node, then each module dependency is a child node, and the dependencies of those dependencies are +grand-child nodes.

+

This is especially useful when thinking about build performance, because the parent-child +relationship is clear: child nodes must build before parent nodes.

+ +

In the above example,

+
    +
  • :lib-1 and :lib-2 must be built before :screen-1.
  • +
  • :lib-2 must be build before :screen-2.
  • +
  • :screen-1 and :screen-2 must be built before :app.
  • +
+

It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build +before their parents.

+

Dependencies and Build Concurrency

+

Individual module builds are always done single-threaded, but multiple modules may build in parallel +so long as no module in the set depends upon another module in that set. In the above graph,

+
    +
  • :lib-1 and :lib-2 may build in parallel
  • +
  • :lib-1 and :screen-2 may build in parallel
  • +
  • :scren-1 and :screen-2 may build in parallel
  • +
+

The maximum number of parallel module builds is determined by the structure of the dependency graph +and the number of available processor cores on the machine which is performing the build.

+

Depth

+

Depth refers to the maximum number of edges between a module and each of its leaf nodes in the +project dependency graph.

+

Low depth values indicate a shallow or flat project structure with loose (or no) coupling between +modules. In a full build, these projects scale well with hardware upgrades because they're able to +build all those independent modules in parallel.

+ +

On the other hand, "deep" projects do not offer many opportunities for parallelization. They have +project dependencies which must be built sequentially. They also perform poorly in incremental +builds, because a single change to even a mid-level module invalidates cached builds for half of the +project.

+
+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/redundant_dependency/index.html b/docs/0.12.3/rules/redundant_dependency/index.html new file mode 100644 index 0000000000..dfe6ac945b --- /dev/null +++ b/docs/0.12.3/rules/redundant_dependency/index.html @@ -0,0 +1,26 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + +
Version: 0.12.3

Redundant Dependency

caution

This rule creates a brittle dependency graph, because some necessary dependencies are only provided +transitively by other dependencies. Any manual changes to dependencies can have unexpected +consequences downstream.

This rule is not recommended and disabled by default, but it's still available for those who +want to keep their build files as small as possible.

+

Finds project dependencies which are declared as api in other dependency projects, but also +declared in the current project. These dependencies can be removed without actually breaking the +build, since they're still provided by an upstream dependency through the api configuration.

+ +

This is the opposite of the inherited dependency rule, which ensures a stable graph by explicitly +declaring each dependency. Inherited dependency is enabled by default, and is the recommended +approach. Both rules may not be enabled at the same time.

+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/sort_dependencies/index.html b/docs/0.12.3/rules/sort_dependencies/index.html new file mode 100644 index 0000000000..54356a5007 --- /dev/null +++ b/docs/0.12.3/rules/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.3/rules/sort_plugins/index.html b/docs/0.12.3/rules/sort_plugins/index.html new file mode 100644 index 0000000000..da538768ab --- /dev/null +++ b/docs/0.12.3/rules/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.3/rules/unused_dependency/index.html b/docs/0.12.3/rules/unused_dependency/index.html new file mode 100644 index 0000000000..ed893c687b --- /dev/null +++ b/docs/0.12.3/rules/unused_dependency/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.12.3

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/unused_kapt_plugin/index.html b/docs/0.12.3/rules/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..ac08019a83 --- /dev/null +++ b/docs/0.12.3/rules/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.3/rules/unused_kapt_processor/index.html b/docs/0.12.3/rules/unused_kapt_processor/index.html new file mode 100644 index 0000000000..d242f2ac68 --- /dev/null +++ b/docs/0.12.3/rules/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.12.3

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/unused_kotlin_android_extensions/index.html b/docs/0.12.3/rules/unused_kotlin_android_extensions/index.html new file mode 100644 index 0000000000..424e04b36e --- /dev/null +++ b/docs/0.12.3/rules/unused_kotlin_android_extensions/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kotlin Android Extensions | ModuleCheck + + + + + + + +
Version: 0.12.3

Unused Kotlin Android Extensions

Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any +synthetic imports or deprecated @Parcelize annotation

+ + \ No newline at end of file diff --git a/docs/0.12.3/rules/use_anvil_factory_generation/index.html b/docs/0.12.3/rules/use_anvil_factory_generation/index.html new file mode 100644 index 0000000000..16467ac1c9 --- /dev/null +++ b/docs/0.12.3/rules/use_anvil_factory_generation/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory Generation | ModuleCheck + + + + + + + +
Version: 0.12.3

Could Use Anvil Factory Generation

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or +Subcomponents, and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.12.3/suppressing-findings/index.html b/docs/0.12.3/suppressing-findings/index.html new file mode 100644 index 0000000000..3869fa7bf0 --- /dev/null +++ b/docs/0.12.3/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: 0.12.3

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("must-be-api") // don't switch anything to an api config
dependencies {

@Suppress("unused-dependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inherited-dependency") // don't add dependencies which are inherited from this library
implementation(project(":leaky"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.4/ci-workflow/index.html b/docs/0.12.4/ci-workflow/index.html new file mode 100644 index 0000000000..a19e24858a --- /dev/null +++ b/docs/0.12.4/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.12.4

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew moduleCheckAuto --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/0.12.4/configuration/index.html b/docs/0.12.4/configuration/index.html new file mode 100644 index 0000000000..5629b1585b --- /dev/null +++ b/docs/0.12.4/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.12.4

configuration

root/build.gradle.kts
plugins {
id("com.rickbusarow.module-check") version "0.12.4"
}

moduleCheck {

deleteUnused = true // default is false
trace = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
unusedKotlinAndroidExtensions = false // default is false
depths = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalCodeGenerators = listOf(
modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(
name = "My Processor",
generatorMavenCoordinates = "my-project.codegen:processor",
annotationNames = listOf(
"myproject.MyInject",
"myproject.MyInject.Factory",
"myproject.MyInjectParam",
"myproject.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
sarif {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"
}
depths {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"
}
graphs {
enabled = true // default is false
// The root directory of all generated graphs. If set, directories will be created
// for each module, mirroring the structure of the project. If this property is null,
// graphs will be created in the `build/reports/modulecheck/graphs/` relative
// directory of each project.
outputDir = "${project.buildDir}/reports/modulecheck/graphs"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.4/index.html b/docs/0.12.4/index.html new file mode 100644 index 0000000000..6e62b2fd51 --- /dev/null +++ b/docs/0.12.4/index.html @@ -0,0 +1,33 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.12.4

Quick Start

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
// Add for SNAPSHOT builds
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.12.4"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

all checks with auto-correct

+
./gradlew moduleCheckAuto
+

check sorting

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

apply sorting

+
./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto
+

report depths of each module

+
./gradlew moduleCheckDepths
+

generate (module-only) dependency graphs

+
./gradlew moduleCheckGraphs
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/custom_kapt_matchers/index.html b/docs/0.12.4/rules/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..dd11093aa6 --- /dev/null +++ b/docs/0.12.4/rules/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.12.4

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/disable_android_resources/index.html b/docs/0.12.4/rules/disable_android_resources/index.html new file mode 100644 index 0000000000..d279c34aeb --- /dev/null +++ b/docs/0.12.4/rules/disable_android_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: 0.12.4

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/disable_view_binding/index.html b/docs/0.12.4/rules/disable_view_binding/index.html new file mode 100644 index 0000000000..ed2fe6d36b --- /dev/null +++ b/docs/0.12.4/rules/disable_view_binding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: 0.12.4

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/inherited_dependency/index.html b/docs/0.12.4/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..91a49e8303 --- /dev/null +++ b/docs/0.12.4/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.12.4

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/must_be_api/index.html b/docs/0.12.4/rules/must_be_api/index.html new file mode 100644 index 0000000000..66e657aa12 --- /dev/null +++ b/docs/0.12.4/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.12.4

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/overshot_dependency/index.html b/docs/0.12.4/rules/overshot_dependency/index.html new file mode 100644 index 0000000000..b67c6141be --- /dev/null +++ b/docs/0.12.4/rules/overshot_dependency/index.html @@ -0,0 +1,23 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + +
Version: 0.12.4

Overshot Dependency

Finds project dependencies which aren't used by the declaring configuration, but are used by a +dependent, downstream configuration.

+

For instance, assume that :moduleB declares an implementation dependency upon :moduleA.

+
moduleB/build.gradle.kts
dependencies {
implementation(project(":moduleA"))
}
+

If :moduleB doesn't actually use :moduleA in its main source, but it does use it in test +source, it's an overshot dependency. The declaration should be changed to +use testImplementation:

+
moduleB/build.gradle.kts
dependencies {
testImplementation(project(":moduleA"))
}
+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/project_depth/index.html b/docs/0.12.4/rules/project_depth/index.html new file mode 100644 index 0000000000..dc588e8106 --- /dev/null +++ b/docs/0.12.4/rules/project_depth/index.html @@ -0,0 +1,54 @@ + + + + + +Project Depth | ModuleCheck + + + + + + + +
Version: 0.12.4

Project Depth

TL;DR - Low depth values mean faster builds and better all-around scalability.

+
+

It's often useful to think of module dependencies as a directed tree +or directed acyclic graph. If a module is a +node, then each module dependency is a child node, and the dependencies of those dependencies are +grand-child nodes.

+

This is especially useful when thinking about build performance, because the parent-child +relationship is clear: child nodes must build before parent nodes.

+ +

In the above example,

+
    +
  • :lib-1 and :lib-2 must be built before :screen-1.
  • +
  • :lib-2 must be build before :screen-2.
  • +
  • :screen-1 and :screen-2 must be built before :app.
  • +
+

It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build +before their parents.

+

Dependencies and Build Concurrency

+

Individual module builds are always done single-threaded, but multiple modules may build in parallel +so long as no module in the set depends upon another module in that set. In the above graph,

+
    +
  • :lib-1 and :lib-2 may build in parallel
  • +
  • :lib-1 and :screen-2 may build in parallel
  • +
  • :scren-1 and :screen-2 may build in parallel
  • +
+

The maximum number of parallel module builds is determined by the structure of the dependency graph +and the number of available processor cores on the machine which is performing the build.

+

Depth

+

Depth refers to the maximum number of edges between a module and each of its leaf nodes in the +project dependency graph.

+

Low depth values indicate a shallow or flat project structure with loose (or no) coupling between +modules. In a full build, these projects scale well with hardware upgrades because they're able to +build all those independent modules in parallel.

+ +

On the other hand, "deep" projects do not offer many opportunities for parallelization. They have +project dependencies which must be built sequentially. They also perform poorly in incremental +builds, because a single change to even a mid-level module invalidates cached builds for half of the +project.

+
+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/redundant_dependency/index.html b/docs/0.12.4/rules/redundant_dependency/index.html new file mode 100644 index 0000000000..f1ce396e56 --- /dev/null +++ b/docs/0.12.4/rules/redundant_dependency/index.html @@ -0,0 +1,26 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + +
Version: 0.12.4

Redundant Dependency

caution

This rule creates a brittle dependency graph, because some necessary dependencies are only provided +transitively by other dependencies. Any manual changes to dependencies can have unexpected +consequences downstream.

This rule is not recommended and disabled by default, but it's still available for those who +want to keep their build files as small as possible.

+

Finds project dependencies which are declared as api in other dependency projects, but also +declared in the current project. These dependencies can be removed without actually breaking the +build, since they're still provided by an upstream dependency through the api configuration.

+ +

This is the opposite of the inherited dependency rule, which ensures a stable graph by explicitly +declaring each dependency. Inherited dependency is enabled by default, and is the recommended +approach. Both rules may not be enabled at the same time.

+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/sort_dependencies/index.html b/docs/0.12.4/rules/sort_dependencies/index.html new file mode 100644 index 0000000000..9264f68433 --- /dev/null +++ b/docs/0.12.4/rules/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.4/rules/sort_plugins/index.html b/docs/0.12.4/rules/sort_plugins/index.html new file mode 100644 index 0000000000..562fc0abee --- /dev/null +++ b/docs/0.12.4/rules/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.4/rules/unused_dependency/index.html b/docs/0.12.4/rules/unused_dependency/index.html new file mode 100644 index 0000000000..194c8b721a --- /dev/null +++ b/docs/0.12.4/rules/unused_dependency/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.12.4

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/unused_kapt_plugin/index.html b/docs/0.12.4/rules/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..c3e187f356 --- /dev/null +++ b/docs/0.12.4/rules/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/0.12.4/rules/unused_kapt_processor/index.html b/docs/0.12.4/rules/unused_kapt_processor/index.html new file mode 100644 index 0000000000..2ef9de4720 --- /dev/null +++ b/docs/0.12.4/rules/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.12.4

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/unused_kotlin_android_extensions/index.html b/docs/0.12.4/rules/unused_kotlin_android_extensions/index.html new file mode 100644 index 0000000000..bdc79c1893 --- /dev/null +++ b/docs/0.12.4/rules/unused_kotlin_android_extensions/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kotlin Android Extensions | ModuleCheck + + + + + + + +
Version: 0.12.4

Unused Kotlin Android Extensions

Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any +synthetic imports or deprecated @Parcelize annotation

+ + \ No newline at end of file diff --git a/docs/0.12.4/rules/use_anvil_factory_generation/index.html b/docs/0.12.4/rules/use_anvil_factory_generation/index.html new file mode 100644 index 0000000000..5ea1edb706 --- /dev/null +++ b/docs/0.12.4/rules/use_anvil_factory_generation/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory Generation | ModuleCheck + + + + + + + +
Version: 0.12.4

Could Use Anvil Factory Generation

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or +Subcomponents, and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/0.12.4/suppressing-findings/index.html b/docs/0.12.4/suppressing-findings/index.html new file mode 100644 index 0000000000..aa7fcd759e --- /dev/null +++ b/docs/0.12.4/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: 0.12.4

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("must-be-api") // don't switch anything to an api config
dependencies {

@Suppress("unused-dependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inherited-dependency") // don't add dependencies which are inherited from this library
implementation(project(":leaky"))
}
+ + \ No newline at end of file diff --git a/docs/ci-workflow/index.html b/docs/ci-workflow/index.html new file mode 100644 index 0000000000..aa661a1e3e --- /dev/null +++ b/docs/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: 0.12.5

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew moduleCheckAuto --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/configuration/index.html b/docs/configuration/index.html new file mode 100644 index 0000000000..0e3d7cc4da --- /dev/null +++ b/docs/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: 0.12.5

configuration

root/build.gradle.kts
plugins {
id("com.rickbusarow.module-check") version "0.13.0-SNAPSHOT"
}

moduleCheck {

deleteUnused = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
unusedKotlinAndroidExtensions = false // default is false
depths = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalCodeGenerators = listOf(
modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(
name = "My Processor",
generatorMavenCoordinates = "my-project.codegen:processor",
annotationNames = listOf(
"myproject.MyInject",
"myproject.MyInject.Factory",
"myproject.MyInjectParam",
"myproject.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
sarif {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"
}
depths {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"
}
graphs {
enabled = true // default is false
// The root directory of all generated graphs. If set, directories will be created
// for each module, mirroring the structure of the project. If this property is null,
// graphs will be created in the `build/reports/modulecheck/graphs/` relative
// directory of each project.
outputDir = "${project.buildDir}/reports/modulecheck/graphs"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000000..278c278b0c --- /dev/null +++ b/docs/index.html @@ -0,0 +1,33 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: 0.12.5

Quick Start

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
// Add for SNAPSHOT builds
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.13.0-SNAPSHOT"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

all checks with auto-correct

+
./gradlew moduleCheckAuto
+

check sorting

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

apply sorting

+
./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto
+

report depths of each module

+
./gradlew moduleCheckDepths
+

generate (module-only) dependency graphs

+
./gradlew moduleCheckGraphs
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/next/ci-workflow/index.html b/docs/next/ci-workflow/index.html new file mode 100644 index 0000000000..8564dcd9df --- /dev/null +++ b/docs/next/ci-workflow/index.html @@ -0,0 +1,40 @@ + + + + + +CI Workflow | ModuleCheck + + + + + + + +
Version: Next

CI Workflow

ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and +automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to +apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. +This is similar to a git pre-commit hook, except the work is delegated to a build server.

+

Using CI over git hooks

+

The traditional method for applying changes automatically is with a git hook, such as pre-commit or +pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor +developer experience. With a CI task, the execution is done automatically and asynchronously, while +the developer is already moving on to something else.

+

A git hook also technically doesn't guarantee that a task is executed before code is checked in to a +main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a +status check. If a branch protection rule is enabled, that status check can be required. This will +then guarantee that the task has run (successfully) before any code is checked in to the protected +branch.

+

Example Flow chart

+

This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The +cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an +"optimistic" workflow, in that it assumes that the modulecheck task will not generate changes +which would trigger a restart.

+ +

Example GitHub Action

+

Here's an Action which will run ModuleCheck, then commit any changes +using Stefanzweifel's auto-commit. This +requires a personal access token secret, or the commit step will fail.

+
name: ModuleCheck

on:
pull_request:

jobs:

cancel-stale-jobs:
name: Cancel stale jobs
runs-on: ubuntu-latest

steps:
# cancel previous jobs
- name: Cancel Previous Runs
uses: styfle/cancel-workflow-action@0.9.0
env:
GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}'

ModuleCheck:
name: ModuleCheck
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
# Must use a personal access token in order to commit changes
token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '11'

# performs tree-shaking on the Gradle dependency graph
- name: modulecheck
run: ./gradlew moduleCheckAuto --no-daemon

# If ModuleCheck generated changes, commit and push those changes.
# If there are no changes, then this is a no-op.
- name: commit changes
uses: stefanzweifel/git-auto-commit-action@v4
with:
commit_message: Apply ModuleCheck changes
commit_options: '--no-verify --signoff'

tests:
name: Unit tests
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v2
with:
ref: ${{ github.event.pull_request.head.ref }}
token: ${{ secrets.GITHUB_TOKEN }}
fetch-depth: 0

- name: Set up JDK
uses : actions/setup-java@v2
with :
distribution : 'temurin'
java-version : '14'

- name: all tests
run: ./gradlew test --no-daemon
+ + \ No newline at end of file diff --git a/docs/next/configuration/index.html b/docs/next/configuration/index.html new file mode 100644 index 0000000000..0094100e9b --- /dev/null +++ b/docs/next/configuration/index.html @@ -0,0 +1,16 @@ + + + + + +configuration | ModuleCheck + + + + + + + +
Version: Next

configuration

plugins {
id("com.rickbusarow.module-check")
}

moduleCheck {

deleteUnused = true // default is false
trace = true // default is false

checks {
overShotDependency = true // default is true
redundantDependency = false // default is false
unusedDependency = true // default is true
mustBeApi = true // default is true
inheritedDependency = true // default is true
sortDependencies = false // default is false
sortPlugins = false // default is false
unusedKapt = true // default is true
anvilFactoryGeneration = true // default is true
disableAndroidResources = false // default is false
disableViewBinding = false // default is false
unusedKotlinAndroidExtensions = false // default is false
depths = false // default is false
}

// allow these modules to be declared as dependency anywhere,
// regardless of whether they're used
ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android")

// do not check the dependencies of these modules.
// in this case, :app could declare any module it wants without issue
doNotCheck = setOf(":app")

additionalCodeGenerators = listOf(
modulecheck.config.CodeGeneratorBinding.AnnotationProcessor(
name = "My Processor",
generatorMavenCoordinates = "my-project.codegen:processor",
annotationNames = listOf(
"myproject.MyInject",
"myproject.MyInject.Factory",
"myproject.MyInjectParam",
"myproject.MyInjectModule"
)
)
)

reports {
checkstyle {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml"
}
sarif {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif"
}
depths {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/depths.txt"
}
graphs {
enabled = true // default is false
// The root directory of all generated graphs. If set, directories will be created
// for each module, mirroring the structure of the project. If this property is null,
// graphs will be created in the `build/reports/modulecheck/graphs/` relative
// directory of each project.
outputDir = "${project.buildDir}/reports/modulecheck/graphs"
}
text {
enabled = true // default is false
outputPath = "${project.buildDir}/reports/modulecheck/report.txt"
}
}
}
+ + \ No newline at end of file diff --git a/docs/next/index.html b/docs/next/index.html new file mode 100644 index 0000000000..548afc25b5 --- /dev/null +++ b/docs/next/index.html @@ -0,0 +1,33 @@ + + + + + +Quick Start | ModuleCheck + + + + + + + +
Version: Next

Quick Start

Dependencies

+
// settings.gradle.kts

pluginManagement {
repositories {
gradlePluginPortal()
// Add for SNAPSHOT builds
maven("https://oss.sonatype.org/content/repositories/snapshots/")
}
}
// top-level build.gradle.kts

plugins {
id("com.rickbusarow.module-check") version "0.13.0-SNAPSHOT"
}
+

Tasks

+

all checks

+
./gradlew moduleCheck
+

all checks with auto-correct

+
./gradlew moduleCheckAuto
+

check sorting

+
./gradlew moduleCheckSortPlugins moduleCheckSortDependencies
+

apply sorting

+
./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto
+

report depths of each module

+
./gradlew moduleCheckDepths
+

generate (module-only) dependency graphs

+
./gradlew moduleCheckGraphs
+

Configuration

+

See configuration for a full list of options.

+
root/build.gradle.kts
configure<com.rickbusarow.modulecheck.ModuleCheckExtension> {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}

--or--

root/build.gradle.kts
moduleCheck {

alwaysIgnore.set(setOf(":app"))

checks {
redundant.set(false)
}
}
+ + \ No newline at end of file diff --git a/docs/next/rules/custom_kapt_matchers/index.html b/docs/next/rules/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..e3875861f8 --- /dev/null +++ b/docs/next/rules/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: Next

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/next/rules/disable_android_resources/index.html b/docs/next/rules/disable_android_resources/index.html new file mode 100644 index 0000000000..1ad9171745 --- /dev/null +++ b/docs/next/rules/disable_android_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + +
Version: Next

Disable Android Resources

If an Android module doesn't actually have any resources in the src/__/res directory, +then android.buildFeatures.androidResources can be disabled.

+
android {
buildFeatures {
androidResource = false
}
}
+ + \ No newline at end of file diff --git a/docs/next/rules/disable_view_binding/index.html b/docs/next/rules/disable_view_binding/index.html new file mode 100644 index 0000000000..20f23890cc --- /dev/null +++ b/docs/next/rules/disable_view_binding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + +
Version: Next

Disable ViewBinding

If an Android module has viewBinding enabled, but doesn't contribute any generated ____Binding +objects from layout files which are actually used, then viewBinding can be disabled.

+
android {
buildFeatures {
viewBinding = false
}
}
+ + \ No newline at end of file diff --git a/docs/next/rules/inherited_dependency/index.html b/docs/next/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..08c8a356cd --- /dev/null +++ b/docs/next/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: Next

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/next/rules/must_be_api/index.html b/docs/next/rules/must_be_api/index.html new file mode 100644 index 0000000000..8182c41f6c --- /dev/null +++ b/docs/next/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: Next

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/next/rules/overshot_dependency/index.html b/docs/next/rules/overshot_dependency/index.html new file mode 100644 index 0000000000..929379b6b1 --- /dev/null +++ b/docs/next/rules/overshot_dependency/index.html @@ -0,0 +1,23 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + +
Version: Next

Overshot Dependency

Finds project dependencies which aren't used by the declaring configuration, but are used by a +dependent, downstream configuration.

+

For instance, assume that :moduleB declares an implementation dependency upon :moduleA.

+
moduleB/build.gradle.kts
dependencies {
implementation(project(":moduleA"))
}
+

If :moduleB doesn't actually use :moduleA in its main source, but it does use it in test +source, it's an overshot dependency. The declaration should be changed to +use testImplementation:

+
moduleB/build.gradle.kts
dependencies {
testImplementation(project(":moduleA"))
}
+ + \ No newline at end of file diff --git a/docs/next/rules/project_depth/index.html b/docs/next/rules/project_depth/index.html new file mode 100644 index 0000000000..707e5bdf2b --- /dev/null +++ b/docs/next/rules/project_depth/index.html @@ -0,0 +1,54 @@ + + + + + +Project Depth | ModuleCheck + + + + + + + +
Version: Next

Project Depth

TL;DR - Low depth values mean faster builds and better all-around scalability.

+
+

It's often useful to think of module dependencies as a directed tree +or directed acyclic graph. If a module is a +node, then each module dependency is a child node, and the dependencies of those dependencies are +grand-child nodes.

+

This is especially useful when thinking about build performance, because the parent-child +relationship is clear: child nodes must build before parent nodes.

+ +

In the above example,

+
    +
  • :lib-1 and :lib-2 must be built before :screen-1.
  • +
  • :lib-2 must be build before :screen-2.
  • +
  • :screen-1 and :screen-2 must be built before :app.
  • +
+

It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build +before their parents.

+

Dependencies and Build Concurrency

+

Individual module builds are always done single-threaded, but multiple modules may build in parallel +so long as no module in the set depends upon another module in that set. In the above graph,

+
    +
  • :lib-1 and :lib-2 may build in parallel
  • +
  • :lib-1 and :screen-2 may build in parallel
  • +
  • :scren-1 and :screen-2 may build in parallel
  • +
+

The maximum number of parallel module builds is determined by the structure of the dependency graph +and the number of available processor cores on the machine which is performing the build.

+

Depth

+

Depth refers to the maximum number of edges between a module and each of its leaf nodes in the +project dependency graph.

+

Low depth values indicate a shallow or flat project structure with loose (or no) coupling between +modules. In a full build, these projects scale well with hardware upgrades because they're able to +build all those independent modules in parallel.

+ +

On the other hand, "deep" projects do not offer many opportunities for parallelization. They have +project dependencies which must be built sequentially. They also perform poorly in incremental +builds, because a single change to even a mid-level module invalidates cached builds for half of the +project.

+
+ + \ No newline at end of file diff --git a/docs/next/rules/redundant_dependency/index.html b/docs/next/rules/redundant_dependency/index.html new file mode 100644 index 0000000000..217320a440 --- /dev/null +++ b/docs/next/rules/redundant_dependency/index.html @@ -0,0 +1,26 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + +
Version: Next

Redundant Dependency

caution

This rule creates a brittle dependency graph, because some necessary dependencies are only provided +transitively by other dependencies. Any manual changes to dependencies can have unexpected +consequences downstream.

This rule is not recommended and disabled by default, but it's still available for those who +want to keep their build files as small as possible.

+

Finds project dependencies which are declared as api in other dependency projects, but also +declared in the current project. These dependencies can be removed without actually breaking the +build, since they're still provided by an upstream dependency through the api configuration.

+ +

This is the opposite of the inherited dependency rule, which ensures a stable graph by explicitly +declaring each dependency. Inherited dependency is enabled by default, and is the recommended +approach. Both rules may not be enabled at the same time.

+ + \ No newline at end of file diff --git a/docs/next/rules/sort_dependencies/index.html b/docs/next/rules/sort_dependencies/index.html new file mode 100644 index 0000000000..979839dda6 --- /dev/null +++ b/docs/next/rules/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/next/rules/sort_plugins/index.html b/docs/next/rules/sort_plugins/index.html new file mode 100644 index 0000000000..04215affba --- /dev/null +++ b/docs/next/rules/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/next/rules/unused_dependency/index.html b/docs/next/rules/unused_dependency/index.html new file mode 100644 index 0000000000..65bc50ab6d --- /dev/null +++ b/docs/next/rules/unused_dependency/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: Next

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/next/rules/unused_kapt_plugin/index.html b/docs/next/rules/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..992382946a --- /dev/null +++ b/docs/next/rules/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/next/rules/unused_kapt_processor/index.html b/docs/next/rules/unused_kapt_processor/index.html new file mode 100644 index 0000000000..075a5d748a --- /dev/null +++ b/docs/next/rules/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: Next

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/next/rules/unused_kotlin_android_extensions/index.html b/docs/next/rules/unused_kotlin_android_extensions/index.html new file mode 100644 index 0000000000..5b4c7ade5e --- /dev/null +++ b/docs/next/rules/unused_kotlin_android_extensions/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kotlin Android Extensions | ModuleCheck + + + + + + + +
Version: Next

Unused Kotlin Android Extensions

Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any +synthetic imports or deprecated @Parcelize annotation

+ + \ No newline at end of file diff --git a/docs/next/rules/use_anvil_factory_generation/index.html b/docs/next/rules/use_anvil_factory_generation/index.html new file mode 100644 index 0000000000..7172000c06 --- /dev/null +++ b/docs/next/rules/use_anvil_factory_generation/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory Generation | ModuleCheck + + + + + + + +
Version: Next

Could Use Anvil Factory Generation

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or +Subcomponents, and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/next/suppressing-findings/index.html b/docs/next/suppressing-findings/index.html new file mode 100644 index 0000000000..aadff92111 --- /dev/null +++ b/docs/next/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: Next

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inherited-dependency /Users/<you>/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky must-be-api /Users/<you>/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unused-dependency /Users/<you>/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("must-be-api") // don't switch anything to an api config
dependencies {

@Suppress("unused-dependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inherited-dependency") // don't add dependencies which are inherited from this library
implementation(project(":leaky"))
}
+ + \ No newline at end of file diff --git a/docs/rules/custom_kapt_matchers/index.html b/docs/rules/custom_kapt_matchers/index.html new file mode 100644 index 0000000000..120e7345c6 --- /dev/null +++ b/docs/rules/custom_kapt_matchers/index.html @@ -0,0 +1,18 @@ + + + + + +Custom Kapt Matchers | ModuleCheck + + + + + + + +
Version: 0.12.5

Custom Kapt Matchers

It's simple to add a custom matcher for an internal-use annotation processor.

+

Just define a list of regex strings for all of the fully qualified names of its annotations.

+
moduleCheck {
additionalKaptMatchers.set(
listOf(
modulecheck.api.KaptMatcher(
name = "MyProcessor",
processor = "my-project.codegen:processor",
annotationImports = listOf(
"myproject\\.\\*",
"myproject\\.MyInject",
"myproject\\.MyInject\\.Factory",
"myproject\\.MyInjectParam",
"myproject\\.MyInjectModule"
)
)
)
)
}
+ + \ No newline at end of file diff --git a/docs/rules/disable_android_resources/index.html b/docs/rules/disable_android_resources/index.html new file mode 100644 index 0000000000..4432c3df59 --- /dev/null +++ b/docs/rules/disable_android_resources/index.html @@ -0,0 +1,18 @@ + + + + + +Disable Android Resources | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/rules/disable_view_binding/index.html b/docs/rules/disable_view_binding/index.html new file mode 100644 index 0000000000..5abd519ce7 --- /dev/null +++ b/docs/rules/disable_view_binding/index.html @@ -0,0 +1,18 @@ + + + + + +Disable ViewBinding | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/rules/inherited_dependency/index.html b/docs/rules/inherited_dependency/index.html new file mode 100644 index 0000000000..fb9fcfe383 --- /dev/null +++ b/docs/rules/inherited_dependency/index.html @@ -0,0 +1,19 @@ + + + + + +Inherited Dependency | ModuleCheck + + + + + + + +
Version: 0.12.5

Inherited Dependency

Assume that :moduleA depends upon :moduleB, and :moduleB depends upon :moduleC via +an api configuration. Also assume that :moduleA uses something from :moduleC, but doesn't +have an explicit dependency for it. It just inherits that dependency from :moduleB.

+

ModuleCheck will recommend adding a direct, explicit dependency for :moduleA -> :moduleC.

+ + \ No newline at end of file diff --git a/docs/rules/must_be_api/index.html b/docs/rules/must_be_api/index.html new file mode 100644 index 0000000000..7bd2aa462b --- /dev/null +++ b/docs/rules/must_be_api/index.html @@ -0,0 +1,21 @@ + + + + + +Must Be Api | ModuleCheck + + + + + + + +
Version: 0.12.5

Must Be Api

Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect +of the dependency in its own API.

+

For instance, if a :moduleA extends a class/interface from :moduleB, or takes a type +from :moduleB as a function parameter, then any consumer of :moduleA's API must also have a +dependency upon :moduleB. In scenarios like this, the dependency module(s) should be declared +using Gradle's api configuration.

+ + \ No newline at end of file diff --git a/docs/rules/overshot_dependency/index.html b/docs/rules/overshot_dependency/index.html new file mode 100644 index 0000000000..83d5828c74 --- /dev/null +++ b/docs/rules/overshot_dependency/index.html @@ -0,0 +1,23 @@ + + + + + +Overshot Dependency | ModuleCheck + + + + + + + +
Version: 0.12.5

Overshot Dependency

Finds project dependencies which aren't used by the declaring configuration, but are used by a +dependent, downstream configuration.

+

For instance, assume that :moduleB declares an implementation dependency upon :moduleA.

+
moduleB/build.gradle.kts
dependencies {
implementation(project(":moduleA"))
}
+

If :moduleB doesn't actually use :moduleA in its main source, but it does use it in test +source, it's an overshot dependency. The declaration should be changed to +use testImplementation:

+
moduleB/build.gradle.kts
dependencies {
testImplementation(project(":moduleA"))
}
+ + \ No newline at end of file diff --git a/docs/rules/project_depth/index.html b/docs/rules/project_depth/index.html new file mode 100644 index 0000000000..def32cd0c6 --- /dev/null +++ b/docs/rules/project_depth/index.html @@ -0,0 +1,54 @@ + + + + + +Project Depth | ModuleCheck + + + + + + + +
Version: 0.12.5

Project Depth

TL;DR - Low depth values mean faster builds and better all-around scalability.

+
+

It's often useful to think of module dependencies as a directed tree +or directed acyclic graph. If a module is a +node, then each module dependency is a child node, and the dependencies of those dependencies are +grand-child nodes.

+

This is especially useful when thinking about build performance, because the parent-child +relationship is clear: child nodes must build before parent nodes.

+ +

In the above example,

+
    +
  • :lib-1 and :lib-2 must be built before :screen-1.
  • +
  • :lib-2 must be build before :screen-2.
  • +
  • :screen-1 and :screen-2 must be built before :app.
  • +
+

It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build +before their parents.

+

Dependencies and Build Concurrency

+

Individual module builds are always done single-threaded, but multiple modules may build in parallel +so long as no module in the set depends upon another module in that set. In the above graph,

+
    +
  • :lib-1 and :lib-2 may build in parallel
  • +
  • :lib-1 and :screen-2 may build in parallel
  • +
  • :scren-1 and :screen-2 may build in parallel
  • +
+

The maximum number of parallel module builds is determined by the structure of the dependency graph +and the number of available processor cores on the machine which is performing the build.

+

Depth

+

Depth refers to the maximum number of edges between a module and each of its leaf nodes in the +project dependency graph.

+

Low depth values indicate a shallow or flat project structure with loose (or no) coupling between +modules. In a full build, these projects scale well with hardware upgrades because they're able to +build all those independent modules in parallel.

+ +

On the other hand, "deep" projects do not offer many opportunities for parallelization. They have +project dependencies which must be built sequentially. They also perform poorly in incremental +builds, because a single change to even a mid-level module invalidates cached builds for half of the +project.

+
+ + \ No newline at end of file diff --git a/docs/rules/redundant_dependency/index.html b/docs/rules/redundant_dependency/index.html new file mode 100644 index 0000000000..cb30f904b7 --- /dev/null +++ b/docs/rules/redundant_dependency/index.html @@ -0,0 +1,26 @@ + + + + + +Redundant Dependency | ModuleCheck + + + + + + + +
Version: 0.12.5

Redundant Dependency

caution

This rule creates a brittle dependency graph, because some necessary dependencies are only provided +transitively by other dependencies. Any manual changes to dependencies can have unexpected +consequences downstream.

This rule is not recommended and disabled by default, but it's still available for those who +want to keep their build files as small as possible.

+

Finds project dependencies which are declared as api in other dependency projects, but also +declared in the current project. These dependencies can be removed without actually breaking the +build, since they're still provided by an upstream dependency through the api configuration.

+ +

This is the opposite of the inherited dependency rule, which ensures a stable graph by explicitly +declaring each dependency. Inherited dependency is enabled by default, and is the recommended +approach. Both rules may not be enabled at the same time.

+ + \ No newline at end of file diff --git a/docs/rules/sort_dependencies/index.html b/docs/rules/sort_dependencies/index.html new file mode 100644 index 0000000000..d86a9da1bb --- /dev/null +++ b/docs/rules/sort_dependencies/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Dependencies | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/rules/sort_plugins/index.html b/docs/rules/sort_plugins/index.html new file mode 100644 index 0000000000..00788b6699 --- /dev/null +++ b/docs/rules/sort_plugins/index.html @@ -0,0 +1,16 @@ + + + + + +Sort Plugins | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/rules/unused_dependency/index.html b/docs/rules/unused_dependency/index.html new file mode 100644 index 0000000000..98156574eb --- /dev/null +++ b/docs/rules/unused_dependency/index.html @@ -0,0 +1,21 @@ + + + + + +Unused Dependency | ModuleCheck + + + + + + + +
Version: 0.12.5

Unused Dependency

Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead +of building modules concurrently, Gradle must wait until the dependency module is built before +beginning to build the dependent one.

+

ModuleCheck determines whether a dependency is unused by looking for all fully qualified names +declared in its API, then searching the dependent module's code for references to any of those +names. If there are no references, the dependency module is considered to be unused.

+ + \ No newline at end of file diff --git a/docs/rules/unused_kapt_plugin/index.html b/docs/rules/unused_kapt_plugin/index.html new file mode 100644 index 0000000000..28f2a689c0 --- /dev/null +++ b/docs/rules/unused_kapt_plugin/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kapt Plugin | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/rules/unused_kapt_processor/index.html b/docs/rules/unused_kapt_processor/index.html new file mode 100644 index 0000000000..01f02e9c48 --- /dev/null +++ b/docs/rules/unused_kapt_processor/index.html @@ -0,0 +1,38 @@ + + + + + +Unused Kapt Processor | ModuleCheck + + + + + + + +
Version: 0.12.5

Unused Kapt Processor

Annotation processors act upon a defined set of annotations. If an annotation processor is +sufficiently popular and its api is stable, then it's relatively simple to define a list of +annotations to search for. For instance, Dagger looks for the following annotations:

+
    +
  • javax.inject.Inject
  • +
  • dagger.Binds
  • +
  • dagger.Module
  • +
  • dagger.multibindings.IntoMap
  • +
  • dagger.multibindings.IntoSet
  • +
  • dagger.BindsInstance
  • +
  • dagger.Component
  • +
  • dagger.assisted.Assisted
  • +
  • dagger.assisted.AssistedInject
  • +
  • dagger.assisted.AssistedFactory
  • +
  • com.squareup.anvil.annotations.ContributesTo
  • +
  • com.squareup.anvil.annotations.MergeComponent
  • +
  • com.squareup.anvil.annotations.MergeSubomponent
  • +
+

If a module has the Dagger kapt dependency, and that module does not have one of the above +annotations somewhere, then Dagger isn't actually doing anything and can be removed.

+

This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of +annotations for any processor may change. If this rule gives a false-positive finding because of a +new annotation, please open an issue and/or pull request.

+ + \ No newline at end of file diff --git a/docs/rules/unused_kotlin_android_extensions/index.html b/docs/rules/unused_kotlin_android_extensions/index.html new file mode 100644 index 0000000000..76a77a81f0 --- /dev/null +++ b/docs/rules/unused_kotlin_android_extensions/index.html @@ -0,0 +1,17 @@ + + + + + +Unused Kotlin Android Extensions | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/docs/rules/use_anvil_factory_generation/index.html b/docs/rules/use_anvil_factory_generation/index.html new file mode 100644 index 0000000000..7200b1dd5c --- /dev/null +++ b/docs/rules/use_anvil_factory_generation/index.html @@ -0,0 +1,26 @@ + + + + + +Could Use Anvil Factory Generation | ModuleCheck + + + + + + + +
Version: 0.12.5

Could Use Anvil Factory Generation

Anvil's factory generation is faster +than Dagger's generation using Kapt. However, it doesn't support generating Components or +Subcomponents, and it doesn't work in Java code.

+

This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation.

+

Criteria:

+
    +
  • Anvil plugin applied with a version greater than 2.0.11
  • +
  • Anvil's factory generation isn't already enabled (nothing to do in this case)
  • +
  • No @MergeComponent, @MergeSubcomponent, @Component or @Subcomponent annotations
  • +
  • No Dagger annotations in .java files
  • +
+ + \ No newline at end of file diff --git a/docs/suppressing-findings/index.html b/docs/suppressing-findings/index.html new file mode 100644 index 0000000000..1396e5ab87 --- /dev/null +++ b/docs/suppressing-findings/index.html @@ -0,0 +1,19 @@ + + + + + +Suppressing Findings | ModuleCheck + + + + + + + +
Version: 0.12.5

Suppressing Findings

You can disable individual ModuleCheck findings via annotation, just like with any other lint tool.

+

The name of the check to disable can be found in the name column of console output:

+
> Task :moduleCheck
ModuleCheck found 3 issues in 6.157 seconds

:app
dependency name build file
:fat-and-leaky inherited-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:fat-and-leaky must-be-api /Users/rbusarow/projects/sample/app/build.gradle.kts: (15, 3):
:unused-lib unused-dependency /Users/rbusarow/projects/sample/app/build.gradle.kts: (49, 3):

+
build.gradle.kts
@Suppress("must-be-api") // don't switch anything to an api config
dependencies {

@Suppress("unused-dependency") // don't comment out or delete this dependency
implementation(project(":unused-lib"))

@Suppress("inherited-dependency") // don't add dependencies which are inherited from this library
implementation(project(":leaky"))
}
+ + \ No newline at end of file diff --git a/dokka-archive/0.12.5.zip b/dokka-archive/0.12.5.zip deleted file mode 100644 index deb957c25a..0000000000 Binary files a/dokka-archive/0.12.5.zip and /dev/null differ diff --git a/gradle.properties b/gradle.properties deleted file mode 100644 index 6e8a73fe44..0000000000 --- a/gradle.properties +++ /dev/null @@ -1,24 +0,0 @@ -# -# Copyright (C) 2021-2023 Rick Busarow -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# -org.gradle.jvmargs=-Xmx12g -XX:MaxMetaspaceSize=1g -XX:+HeapDumpOnOutOfMemoryError -org.gradle.daemon=true -org.gradle.caching=true -org.gradle.parallel=true -org.gradle.vfs.watch=true -android.useAndroidX=true -kotlin.code.style=official -kotlin.caching.enabled=true -kotlin.incremental=true -kapt.include.compile.classpath=false diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml deleted file mode 100644 index 00889dd5bb..0000000000 --- a/gradle/libs.versions.toml +++ /dev/null @@ -1,329 +0,0 @@ -[versions] -# the jdk used to build the project -jdk = "17" -# the jdk used in packaging -jvmTarget = "11" -kotlinApi = "1.8" - -kotlin-gradle = "2.0.21" -kotlin-core = "2.0.21" -google-ksp = "2.0.21-1.0.27" -square-anvil = "2.5.1" - -ajalt-clikt = "5.0.3" -ajalt-mordant = "3.0.2" - -androidTools = "8.10.0" - -antlr = "4.13.2" - -benManes-caffeine = "3.2.2" -benManes-versions = "0.52.0" -buildconfig = "5.6.7" -changeTracker = "0.7.4" -classgraph = "4.8.180" -commons-io = "2.19.0" -dependencyAnalysis = "2.19.0" -detekt = "1.23.6" -diffplug-spotless = "7.1.0" -dokka = "2.0.0" -dokkatoo = "2.4.0" -dropbox-dependencyGuard = "0.5.0" -ec4j = "1.1.1" -exhaustive = "0.2.0" -github-release = "2.5.2" - -google-auto-common = "1.2.2" -google-auto-service = "1.1.1" -google-accompanist = "0.18.0" -google-dagger = "2.56.2" -google-guava = "31.1-jre" -google-material = "1.4.0" -gradle-plugin-publish = "1.3.1" -graphviz = "0.18.1" -groovy = "3.0.25" -jUnit4 = "4.13.2" -jUnit = "5.13.3" -jUnit-platform = "1.13.3" -jackson = "2.13.0" -java-diff-utils = "4.16" -javaParser = "3.27.0" -jetbrains-markdown = "0.7.3" -johnrengelman-shadow = "8.1.1" -kaml = "0.83.0" -kct = "1.6.0" -knit = "0.5.0" -kotest = "5.9.1" -kotlinx-atomicfu = "0.16.3" -kotlinx-binaryCompatibility = "0.18.1" -kotlinx-cli = "0.3.6" -kotlinx-coroutines = "1.10.2" -kotlinx-datetime = "0.7.1-0.6.x-compat" -kotlinx-knit = "0.4.0" -kotlinx-serialization = "1.9.0" -ktlint-lib = "1.5.0" -mavenPublish = "0.13.0" -prettier = "2.8.4" -prettier-plugin-sh = "0.12.8" -rickBusarow-dependencySync = "0.11.2" -rickBusarow-dispatch = "1.0.0-beta10" -rickBusarow-doks = "0.3.0" -rickBusarow-kase = "0.12.0" -rickBusarow-kgx = "0.1.12" -rickBusarow-ktlint = "0.2.2" -rickBusarow-ktrules = "1.5.0" -rickBusarow-moduleCheck = "0.12.5" -rickBusarow-tangle = "0.15.1" -semVer = "2.1.0" -slf4j = "2.0.17" -square-kotlinPoet = "2.2.0" -square-moshi = "1.15.2" -square-okio = "3.15.0" -square-retrofit = "2.9.0" -square-wire = "5.3.5" -square-workflow = "1.0.0" - -taskTree = "4.0.1" - -vanniktech-publish = "0.33.0" - -[plugins] - -anvil = { id = "com.squareup.anvil", version.ref = "square-anvil" } -benManes = { id = "com.github.ben-manes.versions", version.ref = "benManes-versions" } -buildconfig = { id = "com.github.gmazzo.buildconfig", version.ref = "buildconfig" } -dependencyAnalysis = { id = "com.autonomousapps.dependency-analysis", version.ref = "dependencyAnalysis" } -detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detekt" } -dokka = { id = "org.jetbrains.dokka", version.ref = "dokka" } -dokkatoo = { id = "dev.adamko.dokkatoo", version.ref = "dokkatoo" } -dokkatoo-html = { id = "dev.adamko.dokkatoo-html", version.ref = "dokkatoo" } -doks = { id = "com.rickbusarow.doks", version.ref = "rickBusarow-doks" } -dropbox-dependencyGuard = { id = "com.dropbox.dependency-guard", version.ref = "dropbox-dependencyGuard" } -exhaustive = { id = "app.cash.exhaustive:exhaustive-gradle", version.ref = "exhaustive" } -github-release = { id = "com.github.breadmoirai.github-release", version.ref = "github-release" } -google-ksp = { id = "com.google.devtools.ksp", version.ref = "google-ksp" } -gradle-plugin-publish = { id = "com.gradle.plugin-publish", version.ref = "gradle-plugin-publish" } -kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin-gradle" } -kotlinx-binaryCompatibility = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "kotlinx-binaryCompatibility" } -kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin-core" } -ktlint = { id = "com.rickbusarow.ktlint", version.ref = "rickBusarow-ktlint" } -moduleCheck = { id = "com.rickbusarow.module-check", version.ref = "rickBusarow-moduleCheck" } -shadow = { id = "com.github.johnrengelman.shadow", version.ref = "johnrengelman-shadow" } -tangle = { id = "com.rickbusarow.tangle", version.ref = "rickBusarow-tangle" } -taskTree = { id = "com.dorongold.task-tree", version.ref = "taskTree" } -wire = { id = "com.squareup.wire", version.ref = "square-wire" } - -[libraries] -agp = { module = "com.android.tools.build:gradle", version.ref = "androidTools" } -agp-api = { module = "com.android.tools.build:gradle-api", version.ref = "androidTools" } -agp-builder-model = { module = "com.android.tools.build:builder-model", version.ref = "androidTools" } - -antlr-core = { module = "org.antlr:antlr4", version.ref = "antlr" } -antlr-runtime = { module = "org.antlr:antlr4-runtime", version.ref = "antlr" } - -benManes-versions = { module = "com.github.ben-manes:gradle-versions-plugin", version.ref = "benManes-versions" } -benManes-caffeine = { module = "com.github.ben-manes.caffeine:caffeine", version.ref = "benManes-caffeine" } - -buildconfig = { module = "com.github.gmazzo.buildconfig:plugin", version.ref = "buildconfig" } - -classgraph = { module = "io.github.classgraph:classgraph", version.ref = "classgraph" } - -ajalt-clikt = { module = "com.github.ajalt.clikt:clikt", version.ref = "ajalt-clikt" } - -ajalt-mordant = { module = "com.github.ajalt.mordant:mordant", version.ref = "ajalt-mordant" } - -commons-io = { module = "commons-io:commons-io", version.ref = "commons-io" } - -dependency-analysis-gradle-plugin = { module = "com.autonomousapps:dependency-analysis-gradle-plugin", version.ref = "dependencyAnalysis" } - -detekt-api = { module = "io.gitlab.arturbosch.detekt:detekt-api", version.ref = "detekt" } -detekt-cli = { module = "io.gitlab.arturbosch.detekt:detekt-cli", version.ref = "detekt" } -detekt-gradle = { module = "io.gitlab.arturbosch.detekt:detekt-gradle-plugin", version.ref = "detekt" } -detekt-rules-libraries = { module = "io.gitlab.arturbosch.detekt:detekt-rules-libraries", version.ref = "detekt" } -detekt-rules-ruleauthors = { module = "io.gitlab.arturbosch.detekt:detekt-rules-ruleauthors", version.ref = "detekt" } -detekt-test = { module = "io.gitlab.arturbosch.detekt:detekt-test", version.ref = "detekt" } -detekt-test-utils = { module = "io.gitlab.arturbosch.detekt:detekt-test-utils", version.ref = "detekt" } - -diffplug-spotless = { module = "com.diffplug.spotless:spotless-plugin-gradle", version.ref = "diffplug-spotless" } - -dokka-all-modules = { module = "org.jetbrains.dokka:all-modules-page-plugin", version.ref = "dokka" } -dokka-core = { module = "org.jetbrains.dokka:dokka-core", version.ref = "dokka" } -dokka-gradle = { module = "org.jetbrains.dokka:dokka-gradle-plugin", version.ref = "dokka" } -dokka-versioning = { module = "org.jetbrains.dokka:versioning-plugin", version.ref = "dokka" } - -dokkatoo-plugin = { module = "dev.adamko.dokkatoo:dokkatoo-plugin", version.ref = "dokkatoo" } - -dropbox-dependencyGuard = { module = "com.dropbox.dependency-guard:dependency-guard", version.ref = "dropbox-dependencyGuard" } - -ec4j-core = { module = "org.ec4j.core:ec4j-core", version.ref = "ec4j" } - -github-release = { module = "com.github.breadmoirai:github-release", version.ref = "github-release" } - -google-auto-common = { module = "com.google.auto:auto-common", version.ref = "google-auto-common" } - -google-auto-service-annotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "google-auto-service" } -google-auto-service-processor = { module = "com.google.auto.service:auto-service", version.ref = "google-auto-service" } - -google-dagger-api = { module = "com.google.dagger:dagger", version.ref = "google-dagger" } -google-dagger-compiler = { module = "com.google.dagger:dagger-compiler", version.ref = "google-dagger" } - -google-ksp = { module = "com.google.devtools.ksp:symbol-processing-gradle-plugin", version.ref = "google-ksp" } - -gradle-plugin-publish = { module = "com.gradle.publish:plugin-publish-plugin", version.ref = "gradle-plugin-publish" } - -graphviz-java = { module = "guru.nidi:graphviz-java", version.ref = "graphviz" } -graphviz-java-min = { module = "guru.nidi:graphviz-java-min-deps", version.ref = "graphviz" } -graphviz-kotlin = { module = "guru.nidi:graphviz-kotlin", version.ref = "graphviz" } - -groovy = { module = "org.codehaus.groovy:groovy", version.ref = "groovy" } -groovyXml = { module = "org.codehaus.groovy:groovy-xml", version.ref = "groovy" } - -java-diff-utils = { module = "io.github.java-diff-utils:java-diff-utils", version.ref = "java-diff-utils" } - -javaParser-core = { module = "com.github.javaparser:javaparser-core", version.ref = "javaParser" } -javaParser-symbols = { module = "com.github.javaparser:javaparser-symbol-solver-core", version.ref = "javaParser" } - -javax-inject = "javax.inject:javax.inject:1" - -jetbrains-markdown = { module = "org.jetbrains:markdown", version.ref = "jetbrains-markdown" } - -johnrengelman-shadow = { module = "gradle.plugin.com.github.johnrengelman:shadow", version.ref = "johnrengelman-shadow" } - -junit-jupiter = { module = "org.junit.jupiter:junit-jupiter", version.ref = "jUnit" } -junit-jupiter-api = { module = "org.junit.jupiter:junit-jupiter-api", version.ref = "jUnit" } -junit-jupiter-engine = { module = "org.junit.jupiter:junit-jupiter-engine", version.ref = "jUnit" } -junit-jupiter-params = { module = "org.junit.jupiter:junit-jupiter-params", version.ref = "jUnit" } -junit-platform-launcher = { module = "org.junit.platform:junit-platform-launcher", version.ref = "jUnit-platform" } -junit-platform-suite = { module = "org.junit.platform:junit-platform-suite", version.ref = "jUnit-platform" } -junit-platform-suite-api = { module = "org.junit.platform:junit-platform-suite-api", version.ref = "jUnit-platform" } -junit-platform-suite-engine = { module = "org.junit.platform:junit-platform-suite-engine", version.ref = "jUnit-platform" } -junit-vintage-engine = { module = "org.junit.vintage:junit-vintage-engine", version.ref = "jUnit" } -junit4 = { module = "junit:junit", version.ref = "jUnit4" } - -kaml = { module = "com.charleskorn.kaml:kaml", version.ref = "kaml" } - -kct = { module = "com.github.tschuchortdev:kotlin-compile-testing", version.ref = "kct" } - -kotest-assertions-api = { module = "io.kotest:kotest-assertions-api", version.ref = "kotest" } -kotest-assertions-core-jvm = { module = "io.kotest:kotest-assertions-core-jvm", version.ref = "kotest" } -kotest-assertions-shared = { module = "io.kotest:kotest-assertions-shared", version.ref = "kotest" } -kotest-common = { module = "io.kotest:kotest-common", version.ref = "kotest" } -kotest-extensions = { module = "io.kotest:kotest-extensions", version.ref = "kotest" } -kotest-property-jvm = { module = "io.kotest:kotest-property-jvm", version.ref = "kotest" } -kotest-runner-junit5-jvm = { module = "io.kotest:kotest-runner-junit5-jvm", version.ref = "kotest" } - -kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin-gradle" } -kotlin-gradle-plugin-api = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin-api", version.ref = "kotlin-gradle" } - -kotlin-annotation-processing = { module = "org.jetbrains.kotlin:kotlin-annotation-processing-embeddable", version.ref = "kotlin-core" } -kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlin-core" } -kotlin-compiler = { module = "org.jetbrains.kotlin:kotlin-compiler-embeddable", version.ref = "kotlin-core" } -kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin-core" } -kotlin-sam-with-receiver = { module = "org.jetbrains.kotlin:kotlin-sam-with-receiver", version.ref = "kotlin-core" } -kotlin-serialization = { module = "org.jetbrains.kotlin:kotlin-serialization", version.ref = "kotlin-core" } -kotlin-stdlib-jdk7 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk7", version.ref = "kotlin-core" } -kotlin-stdlib-common = { module = "org.jetbrains.kotlin:kotlin-stdlib-common", version.ref = "kotlin-core" } -kotlin-stdlib-jdk8 = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin-core" } - -kotlinx-binaryCompatibility = { module = "org.jetbrains.kotlinx:binary-compatibility-validator", version.ref = "kotlinx-binaryCompatibility" } - -kotlinx-cli = { module = "org.jetbrains.kotlinx:kotlinx-cli", version.ref = "kotlinx-cli" } - -kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinx-coroutines" } -kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" } -kotlinx-coroutines-coreCommon = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-common", version.ref = "kotlinx-coroutines" } -kotlinx-coroutines-debug = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-debug", version.ref = "kotlinx-coroutines" } -kotlinx-coroutines-jdk8 = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-jdk8", version.ref = "kotlinx-coroutines" } -kotlinx-coroutines-jvm = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm", version.ref = "kotlinx-coroutines" } -kotlinx-coroutines-play-services = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-play-services", version.ref = "kotlinx-coroutines" } -kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinx-coroutines" } - -kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinx-datetime" } - -kotlinx-knit = { module = "org.jetbrains.kotlinx:kotlinx-knit", version.ref = "knit" } -kotlinx-knit-pathSaver = { module = "org.jetbrains.kotlinx:dokka-pathsaver-plugin", version.ref = "knit" } - -kotlinx-serialization-core = { module = "org.jetbrains.kotlinx:kotlinx-serialization-core", version.ref = "kotlinx-serialization" } -kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" } -kotlinx-serialization-json-jvm = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json-jvm", version.ref = "kotlinx-serialization" } -kotlinx-serialization-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "kotlinx-serialization" } -kotlinx-serialization-protobuf-jvm = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf-jvm", version.ref = "kotlinx-serialization" } - -ktlint-core = { module = "com.pinterest.ktlint:ktlint-core", version.ref = "ktlint-lib" } -ktlint-ruleset-experimental = { module = "com.pinterest.ktlint:ktlint-ruleset-experimental", version.ref = "ktlint-lib" } -ktlint-ruleset-standard = { module = "com.pinterest.ktlint:ktlint-ruleset-standard", version.ref = "ktlint-lib" } -ktlint-test = { module = "com.pinterest.ktlint:ktlint-test", version.ref = "ktlint-lib" } - -rickBusarow-dispatch-core = { module = "com.rickbusarow.dispatch:dispatch-core", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-detekt = { module = "com.rickbusarow.dispatch:dispatch-detekt", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-espresso = { module = "com.rickbusarow.dispatch:dispatch-android-espresso", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-lifecycle = { module = "com.rickbusarow.dispatch:dispatch-android-lifecycle", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-lifecycleExtensions = { module = "com.rickbusarow.dispatch:dispatch-android-lifecycle-extensions", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-test-core = { module = "com.rickbusarow.dispatch:dispatch-test", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-test-jUnit4 = { module = "com.rickbusarow.dispatch:dispatch-test-junit4", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-test-jUnit5 = { module = "com.rickbusarow.dispatch:dispatch-test-junit5", version.ref = "rickBusarow-dispatch" } -rickBusarow-dispatch-viewModel = { module = "com.rickbusarow.dispatch:dispatch-android-viewmodel", version.ref = "rickBusarow-dispatch" } - -rickBusarow-kase = { module = "com.rickbusarow.kase:kase", version.ref = "rickBusarow-kase" } -rickBusarow-kase-gradle = { module = "com.rickbusarow.kase:kase-gradle", version.ref = "rickBusarow-kase" } -rickBusarow-kase-gradle-dsl = { module = "com.rickbusarow.kase:kase-gradle-dsl", version.ref = "rickBusarow-kase" } - -rickBusarow-kgx = { module = "com.rickbusarow.kgx:kotlin-gradle-extensions", version.ref = "rickBusarow-kgx" } - -rickBusarow-ktlint = { module = "com.rickbusarow.ktlint:ktlint-gradle-plugin", version.ref = "rickBusarow-ktlint" } - -rickBusarow-ktrules = { module = "com.rickbusarow.ktrules:ktrules", version.ref = "rickBusarow-ktrules" } - -scabbard = "gradle.plugin.dev.arunkumar:scabbard-gradle-plugin:0.5.0" - -semVer = { module = "net.swiftzer.semver:semver", version.ref = "semVer" } - -slf4j-api = { module = "org.slf4j:slf4j-api", version.ref = "slf4j" } -slf4j-simple = { module = "org.slf4j:slf4j-simple", version.ref = "slf4j" } - -square-anvil-annotations = { module = "com.squareup.anvil:annotations", version.ref = "square-anvil" } -square-anvil-compiler-api = { module = "com.squareup.anvil:compiler-api", version.ref = "square-anvil" } -square-anvil-compiler-core = { module = "com.squareup.anvil:compiler", version.ref = "square-anvil" } -square-anvil-compiler-utils = { module = "com.squareup.anvil:compiler-utils", version.ref = "square-anvil" } -square-anvil-gradle = { module = "com.squareup.anvil:gradle-plugin", version.ref = "square-anvil" } - -square-kotlinPoet = { module = "com.squareup:kotlinpoet", version.ref = "square-kotlinPoet" } - -square-moshi = { module = "com.squareup.moshi:moshi", version.ref = "square-moshi" } -square-moshi-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "square-moshi" } - -square-okio = { module = "com.squareup.okio:okio", version.ref = "square-okio" } -square-okio-bom = { module = "com.squareup.okio:okio-bom", version.ref = "square-okio" } -square-okio-fakefilesystem = { module = "com.squareup.okio:okio-fakefilesystem-jvm", version.ref = "square-okio" } -square-okio-jvm = { module = "com.squareup.okio:okio-jvm", version.ref = "square-okio" } - -square-wire-compiler = { module = "com.squareup.wire:wire-compiler", version.ref = "square-wire" } -square-wire-gradle-plugin = { module = "com.squareup.wire:wire-gradle-plugin", version.ref = "square-wire" } -square-wire-grpc-client-jvm = { module = "com.squareup.wire:wire-grpc-client-jvm", version.ref = "square-wire" } -square-wire-gson-support = { module = "com.squareup.wire:wire-gson-support", version.ref = "square-wire" } -square-wire-java-generator = { module = "com.squareup.wire:wire-java-generator", version.ref = "square-wire" } -square-wire-kotlin-generator = { module = "com.squareup.wire:wire-kotlin-generator", version.ref = "square-wire" } -square-wire-runtime = { module = "com.squareup.wire:wire-runtime", version.ref = "square-wire" } -square-wire-schema = { module = "com.squareup.wire:wire-schema", version.ref = "square-wire" } -square-wire-schema-tests = { module = "com.squareup.wire:wire-schema-tests", version.ref = "square-wire" } - -square-turbine = "app.cash.turbine:turbine:1.2.1" - -unbescape = "org.unbescape:unbescape:1.1.6.RELEASE" - -vanniktech-publish = { module = "com.vanniktech:gradle-maven-publish-plugin", version.ref = "vanniktech-publish" } - -zacSweers-auto-service-ksp = "dev.zacsweers.autoservice:auto-service-ksp:1.2.0" - -[bundles] -junit = [ - "junit-jupiter-api", - "junit-jupiter-engine", - "junit-jupiter-params" -] -kotest = [ - "kotest-assertions-api", - "kotest-assertions-core-jvm", - "kotest-assertions-shared", - "kotest-property-jvm" -] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index ccebba7710..0000000000 Binary files a/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index e3816d86ea..0000000000 --- a/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,21 +0,0 @@ -# -# Copyright (C) 2021-2025 Rick Busarow -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-all.zip -networkTimeout=10000 -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/gradlew b/gradlew deleted file mode 100755 index 67d83bcb17..0000000000 --- a/gradlew +++ /dev/null @@ -1,243 +0,0 @@ -#!/bin/sh - -# -# Copyright (C) 2021-2023 Rick Busarow -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -# -# Gradle start up script for POSIX generated by Gradle. -# -# Important for running: -# -# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is -# noncompliant, but you have some other compliant shell such as ksh or -# bash, then to run this script, type that shell name before the whole -# command line, like: -# -# ksh Gradle -# -# Busybox and similar reduced shells will NOT work, because this script -# requires all of these POSIX shell features: -# * functions; -# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», -# «${var#prefix}», «${var%suffix}», and «$( cmd )»; -# * compound commands having a testable exit status, especially «case»; -# * various built-in commands including «command», «set», and «ulimit». -# -# Important for patching: -# -# (2) This script targets any POSIX shell, so it avoids extensions provided -# by Bash, Ksh, etc; in particular arrays are avoided. -# -# The "traditional" practice of packing multiple parameters into a -# space-separated string is a well documented source of bugs and security -# problems, so this is (mostly) avoided, by progressively accumulating -# options in "$@", and eventually passing that to Java. -# -# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, -# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; -# see the in-line comments for details. -# -# There are tweaks for specific operating systems such as AIX, CygWin, -# Darwin, MinGW, and NonStop. -# -# (3) This script is generated from the Groovy template -# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt -# within the Gradle project. -# -# You can find Gradle at https://github.com/gradle/gradle/. -# -############################################################################## - -# Attempt to set APP_HOME - -# Resolve links: $0 may be a link -app_path=$0 - -# Need this for daisy-chained symlinks. -while - APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path - [ -h "$app_path" ] -do - ls=$( ls -ld "$app_path" ) - link=${ls#*' -> '} - case $link in #( - /*) app_path=$link ;; #( - *) app_path=$APP_HOME$link ;; - esac -done - -# This is normally unused -# shellcheck disable=SC2034 -APP_BASE_NAME=${0##*/} -APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD=maximum - -warn () { - echo "$*" -} >&2 - -die () { - echo - echo "$*" - echo - exit 1 -} >&2 - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "$( uname )" in #( - CYGWIN* ) cygwin=true ;; #( - Darwin* ) darwin=true ;; #( - MSYS* | MINGW* ) msys=true ;; #( - NONSTOP* ) nonstop=true ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD=$JAVA_HOME/jre/sh/java - else - JAVACMD=$JAVA_HOME/bin/java - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD=java - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then - case $MAX_FD in #( - max*) - # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - MAX_FD=$( ulimit -H -n ) || - warn "Could not query maximum file descriptor limit" - esac - case $MAX_FD in #( - '' | soft) :;; #( - *) - # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. - # shellcheck disable=SC3045 - ulimit -n "$MAX_FD" || - warn "Could not set maximum file descriptor limit to $MAX_FD" - esac -fi - -# Collect all arguments for the java command, stacking in reverse order: -# * args from the command line -# * the main class name -# * -classpath -# * -D...appname settings -# * --module-path (only if needed) -# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. - -# For Cygwin or MSYS, switch paths to Windows format before running java -if "$cygwin" || "$msys" ; then - APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) - - JAVACMD=$( cygpath --unix "$JAVACMD" ) - - # Now convert the arguments - kludge to limit ourselves to /bin/sh - for arg do - if - case $arg in #( - -*) false ;; # don't mess with options #( - /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath - [ -e "$t" ] ;; #( - *) false ;; - esac - then - arg=$( cygpath --path --ignore --mixed "$arg" ) - fi - # Roll the args list around exactly as many times as the number of - # args, so each arg winds up back in the position where it started, but - # possibly modified. - # - # NB: a `for` loop captures its iteration list before it begins, so - # changing the positional parameters here affects neither the number of - # iterations, nor the values presented in `arg`. - shift # remove old arg - set -- "$@" "$arg" # push replacement arg - done -fi - -# Collect all arguments for the java command; -# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of -# shell script including quotes and variable substitutions, so put them in -# double quotes to make sure that they get re-expanded; and -# * put everything else in single quotes, so that it's not re-expanded. - -set -- \ - "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ - "$@" - -# Stop when "xargs" is not available. -if ! command -v xargs >/dev/null 2>&1 -then - die "xargs is not available" -fi - -# Use "xargs" to parse quoted args. -# -# With -n1 it outputs one arg per line, with the quotes and backslashes removed. -# -# In Bash we could simply go: -# -# readarray ARGS < <( xargs -n1 <<<"$var" ) && -# set -- "${ARGS[@]}" "$@" -# -# but POSIX shell has neither arrays nor command substitution, so instead we -# post-process each arg (as a line of input to sed) to backslash-escape any -# character that might be a shell metacharacter, then use eval to reverse -# that process (while maintaining the separation between arguments), and wrap -# the whole thing up as a single "set" statement. -# -# This will of course break if any of these variables contains a newline or -# an unmatched quote. -# - -eval "set -- $( - printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | - xargs -n1 | - sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | - tr '\n' ' ' - )" '"$@"' - -exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat deleted file mode 100644 index 93e3f59f13..0000000000 --- a/gradlew.bat +++ /dev/null @@ -1,92 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%"=="" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%"=="" set DIRNAME=. -@rem This is normally unused -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if %ERRORLEVEL% equ 0 goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if %ERRORLEVEL% equ 0 goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -set EXIT_CODE=%ERRORLEVEL% -if %EXIT_CODE% equ 0 set EXIT_CODE=1 -if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% -exit /b %EXIT_CODE% - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/website/static/img/coffee-solid.svg b/img/coffee-solid.svg similarity index 100% rename from website/static/img/coffee-solid.svg rename to img/coffee-solid.svg diff --git a/website/static/img/favicon.ico b/img/favicon.ico similarity index 100% rename from website/static/img/favicon.ico rename to img/favicon.ico diff --git a/website/static/img/logo.png b/img/logo.png similarity index 100% rename from website/static/img/logo.png rename to img/logo.png diff --git a/website/static/img/modulecheck_diagram.png b/img/modulecheck_diagram.png similarity index 100% rename from website/static/img/modulecheck_diagram.png rename to img/modulecheck_diagram.png diff --git a/website/static/img/power-off-solid.svg b/img/power-off-solid.svg similarity index 100% rename from website/static/img/power-off-solid.svg rename to img/power-off-solid.svg diff --git a/website/static/img/syringe-solid.svg b/img/syringe-solid.svg similarity index 100% rename from website/static/img/syringe-solid.svg rename to img/syringe-solid.svg diff --git a/website/static/img/undraw_docusaurus_mountain.svg b/img/undraw_docusaurus_mountain.svg similarity index 100% rename from website/static/img/undraw_docusaurus_mountain.svg rename to img/undraw_docusaurus_mountain.svg diff --git a/website/static/img/undraw_docusaurus_react.svg b/img/undraw_docusaurus_react.svg similarity index 100% rename from website/static/img/undraw_docusaurus_react.svg rename to img/undraw_docusaurus_react.svg diff --git a/website/static/img/undraw_docusaurus_tree.svg b/img/undraw_docusaurus_tree.svg similarity index 100% rename from website/static/img/undraw_docusaurus_tree.svg rename to img/undraw_docusaurus_tree.svg diff --git a/index.html b/index.html new file mode 100644 index 0000000000..2a9145f109 --- /dev/null +++ b/index.html @@ -0,0 +1,16 @@ + + + + + +ModuleCheck + + + + + + + +

ModuleCheck removes unused module dependencies from your gradle project.

Get Started      
version badge Gradle Plugin Portal Snapshot license
Tree shaking
+ + \ No newline at end of file diff --git a/migrations/index.html b/migrations/index.html new file mode 100644 index 0000000000..cb0081d107 --- /dev/null +++ b/migrations/index.html @@ -0,0 +1,42 @@ + + + + + +ModuleCheck + + + + + + + +

0.12.0 to 0.12.1

+

Standardized Finding names

+

The names of all findings have been updated/standardized. Any declarations which were suppressing +a finding with the old ID (via @Suppress("someFinding") or //suppress=someFinding) will still +work, but they should be updated to use the new names.

+
old namenew name
depthproject-depth
disableAndroidResourcesdisable-android-resources
disableViewBindingdisable-view-binding
inheritedDependencyinherited-dependency
mustBeApimust-be-api
overshotovershot-dependency
redundantredundant-dependency
unsortedDependenciessort-dependencies
unsortedPluginssort-plugins
useAnvilFactoriesuse-anvil-factory-generation
unusedunused-dependency
unusedKaptProcessorunused-kapt-processor
unusedKotlinAndroidExtensionsunused-kotlin-android-extensions
+

CodeGeneratorBinding

+

The KaptMatcher class has been deprecated in favor of modulecheck.config.CodeGeneratorBinding. +This new sealed class has four concrete implementations which can define just about any code +generation tool:

+
    +
  • modulecheck.config.CodeGeneratorBinding.AnnotationProcessor +
      +
    • Note that this class is a model for Kotlin KAPT as well as a standard Java annotation processor.
    • +
    +
  • +
  • modulecheck.config.CodeGeneratorBinding.KspExtension
  • +
  • modulecheck.config.CodeGeneratorBinding.AnvilExtension
  • +
  • modulecheck.config.CodeGeneratorBinding.KotlinCompilerPlugin
  • +
+

To migrate from KaptMatcher:

+
    +
  1. Change references of modulecheck.api.KaptMatcher, +to modulecheck.config.CodeGeneratorBinding.AnnotationProcessor.
  2. +
  3. Replace the regex-styled annotationImports arguments with explicit fully-qualified names. +For instance, replace "com\\.example\\.MyAnnotation", with "com.example.MyAnnotation".
  4. +
+ + \ No newline at end of file diff --git a/modulecheck-api/api/modulecheck-api.api b/modulecheck-api/api/modulecheck-api.api deleted file mode 100644 index 2da172a77e..0000000000 --- a/modulecheck-api/api/modulecheck-api.api +++ /dev/null @@ -1,787 +0,0 @@ -public final class modulecheck/api/DepthFinding : java/lang/Comparable, modulecheck/finding/Finding { - public static final field Companion Lmodulecheck/api/DepthFinding$Companion; - public synthetic fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;ILjava/util/List;Ljava/lang/String;Ljava/io/File;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/api/DepthFinding;)I - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component3 ()I - public final fun component4 ()Ljava/util/List; - public final fun component5-qrJCKeA ()Ljava/lang/String; - public final fun component6 ()Ljava/io/File; - public final fun copy-DW0SUTs (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;ILjava/util/List;Ljava/lang/String;Ljava/io/File;)Lmodulecheck/api/DepthFinding; - public static synthetic fun copy-DW0SUTs$default (Lmodulecheck/api/DepthFinding;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;ILjava/util/List;Ljava/lang/String;Ljava/io/File;ILjava/lang/Object;)Lmodulecheck/api/DepthFinding; - public fun equals (Ljava/lang/Object;)Z - public fun getBuildFile ()Ljava/io/File; - public final fun getChildren ()Ljava/util/List; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public final fun getDepth ()I - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public fun hashCode ()I - public final fun toProjectDepth ()Lmodulecheck/api/context/ProjectDepth; - public fun toResult (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/DepthFinding$Companion { - public final fun getNAME ()Lmodulecheck/finding/FindingName; -} - -public final class modulecheck/api/context/AndroidBasePackages : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AndroidBasePackages$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AndroidBasePackages; - public static synthetic fun copy$default (Lmodulecheck/api/context/AndroidBasePackages;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AndroidBasePackages; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AndroidBasePackages$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidBasePackagesKt { - public static final fun androidBasePackages (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun androidBasePackagesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidDataBindingDeclarations : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AndroidDataBindingDeclarations$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AndroidDataBindingDeclarations; - public static synthetic fun copy$default (Lmodulecheck/api/context/AndroidDataBindingDeclarations;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AndroidDataBindingDeclarations; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AndroidDataBindingDeclarations$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidDataBindingDeclarationsKt { - public static final fun androidDataBindingDeclarations (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun androidDataBindingDeclarationsForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidRDeclaredNames : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AndroidRDeclaredNames$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AndroidRDeclaredNames; - public static synthetic fun copy$default (Lmodulecheck/api/context/AndroidRDeclaredNames;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AndroidRDeclaredNames; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AndroidRDeclaredNames$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidRDeclaredNamesKt { - public static final fun androidRDeclaredNameForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun androidRDeclaredNames (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidResourceDeclaredNames : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AndroidResourceDeclaredNames$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AndroidResourceDeclaredNames; - public static synthetic fun copy$default (Lmodulecheck/api/context/AndroidResourceDeclaredNames;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AndroidResourceDeclaredNames; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AndroidResourceDeclaredNames$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidResourceDeclaredNamesKt { - public static final fun androidResourceDeclaredNames (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun androidResourceDeclaredNamesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidResourceReferences : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AndroidResourceReferences$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AndroidResourceReferences; - public static synthetic fun copy$default (Lmodulecheck/api/context/AndroidResourceReferences;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AndroidResourceReferences; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AndroidResourceReferences$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidResourceReferencesKt { - public static final fun androidResourceReferencesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidStylesFiles : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AndroidStylesFiles$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AndroidStylesFiles; - public static synthetic fun copy$default (Lmodulecheck/api/context/AndroidStylesFiles;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AndroidStylesFiles; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AndroidStylesFiles$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidStylesFilesKt { - public static final fun androidStylesFiles (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun androidStylesFilesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidUnqualifiedResources : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AndroidUnqualifiedResources$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AndroidUnqualifiedResources; - public static synthetic fun copy$default (Lmodulecheck/api/context/AndroidUnqualifiedResources;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AndroidUnqualifiedResources; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AndroidUnqualifiedResources$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AndroidUnqualifiedResourcesKt { - public static final fun androidUnqualifiedResources (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun androidUnqualifiedResourcesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilGraph : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AnvilGraph$Key; - public fun (Lmodulecheck/project/McProject;Lmodulecheck/utils/cache/SafeCache;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/project/McProject;Lmodulecheck/utils/cache/SafeCache;)Lmodulecheck/api/context/AnvilGraph; - public static synthetic fun copy$default (Lmodulecheck/api/context/AnvilGraph;Lmodulecheck/project/McProject;Lmodulecheck/utils/cache/SafeCache;ILjava/lang/Object;)Lmodulecheck/api/context/AnvilGraph; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public final fun mergedScopeNames (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AnvilGraph$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilGraphKt { - public static final fun anvilGraph (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilScopeContributions : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AnvilScopeContributions$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AnvilScopeContributions; - public static synthetic fun copy$default (Lmodulecheck/api/context/AnvilScopeContributions;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AnvilScopeContributions; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AnvilScopeContributions$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilScopeContributionsKt { - public static final fun anvilScopeContributions (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun anvilScopeContributionsForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilScopeDependencies : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AnvilScopeDependencies$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AnvilScopeDependencies; - public static synthetic fun copy$default (Lmodulecheck/api/context/AnvilScopeDependencies;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AnvilScopeDependencies; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AnvilScopeDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilScopeDependenciesKt { - public static final fun anvilScopeDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun anvilScopeDependenciesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilScopeMerges : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/AnvilScopeMerges$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/AnvilScopeMerges; - public static synthetic fun copy$default (Lmodulecheck/api/context/AnvilScopeMerges;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/AnvilScopeMerges; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/AnvilScopeMerges$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilScopeMergesKt { - public static final fun anvilScopeMerges (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun anvilScopeMergesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/AnvilScopedDeclarations { - public fun (Lmodulecheck/parsing/source/AnvilScopeName;Ljava/util/Set;Ljava/util/Set;)V - public final fun component1 ()Lmodulecheck/parsing/source/AnvilScopeName; - public final fun component2 ()Ljava/util/Set; - public final fun component3 ()Ljava/util/Set; - public final fun copy (Lmodulecheck/parsing/source/AnvilScopeName;Ljava/util/Set;Ljava/util/Set;)Lmodulecheck/api/context/AnvilScopedDeclarations; - public static synthetic fun copy$default (Lmodulecheck/api/context/AnvilScopedDeclarations;Lmodulecheck/parsing/source/AnvilScopeName;Ljava/util/Set;Ljava/util/Set;ILjava/lang/Object;)Lmodulecheck/api/context/AnvilScopedDeclarations; - public fun equals (Ljava/lang/Object;)Z - public final fun getContributions ()Ljava/util/Set; - public final fun getMerges ()Ljava/util/Set; - public final fun getScopeName ()Lmodulecheck/parsing/source/AnvilScopeName; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/ClasspathDependencies : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/ClasspathDependencies$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/ClasspathDependencies; - public static synthetic fun copy$default (Lmodulecheck/api/context/ClasspathDependencies;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/ClasspathDependencies; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/ClasspathDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ClasspathDependenciesKt { - public static final fun classpathDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/Declarations : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/Declarations$Key; - public synthetic fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun get-PbJP7P4 (Ljava/lang/String;ZLmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun get-PbJP7P4$default (Lmodulecheck/api/context/Declarations;Ljava/lang/String;ZLmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; -} - -public final class modulecheck/api/context/Declarations$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/DeclarationsKt { - public static final fun declarations (Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/project/ProjectCache;Lmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun declarations (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun declarations$default (Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/project/ProjectCache;Lmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/DependencySources : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/DependencySources$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/DependencySources; - public static synthetic fun copy$default (Lmodulecheck/api/context/DependencySources;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/DependencySources; - public fun equals (Ljava/lang/Object;)Z - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public final fun sourceOfOrNull-iA3lRXU (Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/DependencySources$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/DependencySources$SourceKey { - public synthetic fun (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-qrJCKeA ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath; - public final fun component3 ()Z - public final fun copy-WsCknJc (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;Z)Lmodulecheck/api/context/DependencySources$SourceKey; - public static synthetic fun copy-WsCknJc$default (Lmodulecheck/api/context/DependencySources$SourceKey;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZILjava/lang/Object;)Lmodulecheck/api/context/DependencySources$SourceKey; - public fun equals (Ljava/lang/Object;)Z - public final fun getDependencyProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public final fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public fun hashCode ()I - public final fun isTestFixture ()Z - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/api/context/DependencySources$SourceResult { -} - -public final class modulecheck/api/context/DependencySources$SourceResult$Found : modulecheck/api/context/DependencySources$SourceResult { - public fun (Lmodulecheck/model/dependency/ProjectDependency;)V - public final fun component1 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun copy (Lmodulecheck/model/dependency/ProjectDependency;)Lmodulecheck/api/context/DependencySources$SourceResult$Found; - public static synthetic fun copy$default (Lmodulecheck/api/context/DependencySources$SourceResult$Found;Lmodulecheck/model/dependency/ProjectDependency;ILjava/lang/Object;)Lmodulecheck/api/context/DependencySources$SourceResult$Found; - public fun equals (Ljava/lang/Object;)Z - public final fun getSourceDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/DependencySources$SourceResult$NOT_PRESENT : modulecheck/api/context/DependencySources$SourceResult { - public static final field INSTANCE Lmodulecheck/api/context/DependencySources$SourceResult$NOT_PRESENT; -} - -public final class modulecheck/api/context/DependencySourcesKt { - public static final fun dependencySources (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun requireSourceOf-BhXIJPA (Lmodulecheck/project/McProject;Lmodulecheck/project/McProject;Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/Depths : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/Depths$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/Depths; - public static synthetic fun copy$default (Lmodulecheck/api/context/Depths;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/Depths; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/Depths$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/DepthsKt { - public static final fun depthForSourceSetName-5sj7XBw (Lmodulecheck/project/McProject;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun depths (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/DownstreamProjects : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker, modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/DownstreamProjects$Key; - public fun (Ljava/util/Set;)V - public synthetic fun add (Ljava/lang/Object;)Z - public fun add (Lmodulecheck/model/dependency/DownstreamDependency;)Z - public fun addAll (Ljava/util/Collection;)Z - public fun clear ()V - public final fun contains (Ljava/lang/Object;)Z - public fun contains (Lmodulecheck/model/dependency/DownstreamDependency;)Z - public fun containsAll (Ljava/util/Collection;)Z - public final fun copy (Ljava/util/Set;)Lmodulecheck/api/context/DownstreamProjects; - public static synthetic fun copy$default (Lmodulecheck/api/context/DownstreamProjects;Ljava/util/Set;ILjava/lang/Object;)Lmodulecheck/api/context/DownstreamProjects; - public fun equals (Ljava/lang/Object;)Z - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun getSize ()I - public fun hashCode ()I - public fun isEmpty ()Z - public fun iterator ()Ljava/util/Iterator; - public fun remove (Ljava/lang/Object;)Z - public fun removeAll (Ljava/util/Collection;)Z - public fun retainAll (Ljava/util/Collection;)Z - public final fun size ()I - public fun toArray ()[Ljava/lang/Object; - public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/DownstreamProjects$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/DownstreamProjectsKt { - public static final fun dependents (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/GeneratedDeclarations : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/GeneratedDeclarations$Key; - public synthetic fun (Lmodulecheck/project/McProject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun get-WsCknJc (Ljava/lang/String;Lmodulecheck/utils/lazy/LazySet;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; -} - -public final class modulecheck/api/context/GeneratedDeclarations$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/GeneratedDeclarationsKt { - public static final fun generatedDeclarations (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun generatedDeclarations-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun generatedDeclarations-iA3lRXU (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lmodulecheck/utils/lazy/LazySet;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/Imports : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/Imports$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/Imports; - public static synthetic fun copy$default (Lmodulecheck/api/context/Imports;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/Imports; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/Imports$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ImportsKt { - public static final fun imports (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun importsForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/InheritedDependencyWithSource { - public fun (Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;)V - public final fun component1 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun copy (Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;)Lmodulecheck/api/context/InheritedDependencyWithSource; - public static synthetic fun copy$default (Lmodulecheck/api/context/InheritedDependencyWithSource;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;ILjava/lang/Object;)Lmodulecheck/api/context/InheritedDependencyWithSource; - public fun equals (Ljava/lang/Object;)Z - public final fun getProjectDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun getSource ()Lmodulecheck/model/dependency/ProjectDependency; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/JvmFiles : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/JvmFiles$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/JvmFiles; - public static synthetic fun copy$default (Lmodulecheck/api/context/JvmFiles;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/JvmFiles; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/JvmFiles$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/JvmFilesKt { - public static final fun jvmFiles (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun jvmFilesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/JvmSourceFiles : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/JvmSourceFiles$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/JvmSourceFiles; - public static synthetic fun copy$default (Lmodulecheck/api/context/JvmSourceFiles;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/JvmSourceFiles; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/JvmSourceFiles$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/JvmSourceFilesKt { - public static final fun jvmSourceFiles (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun jvmSourcesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/KaptDependencies : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/KaptDependencies$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/KaptDependencies; - public static synthetic fun copy$default (Lmodulecheck/api/context/KaptDependencies;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/KaptDependencies; - public fun equals (Ljava/lang/Object;)Z - public final fun get-KxNpj4Q (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/KaptDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/KaptDependenciesKt { - public static final fun kaptDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun kaptDependenciesForConfig-vAhOJHc (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/LayoutFiles : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/LayoutFiles$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/LayoutFiles; - public static synthetic fun copy$default (Lmodulecheck/api/context/LayoutFiles;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/LayoutFiles; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/LayoutFiles$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/LayoutFilesKt { - public static final fun layoutFiles (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun layoutFilesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ManifestFiles : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/ManifestFiles$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/ManifestFiles; - public static synthetic fun copy$default (Lmodulecheck/api/context/ManifestFiles;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/ManifestFiles; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/ManifestFiles$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ManifestFilesKt { - public static final fun manifestFileForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun manifestFiles (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/MustBeApi : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker, modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/MustBeApi$Key; - public fun (Ljava/util/Set;)V - public synthetic fun add (Ljava/lang/Object;)Z - public fun add (Lmodulecheck/api/context/InheritedDependencyWithSource;)Z - public fun addAll (Ljava/util/Collection;)Z - public fun clear ()V - public final fun contains (Ljava/lang/Object;)Z - public fun contains (Lmodulecheck/api/context/InheritedDependencyWithSource;)Z - public fun containsAll (Ljava/util/Collection;)Z - public final fun copy (Ljava/util/Set;)Lmodulecheck/api/context/MustBeApi; - public static synthetic fun copy$default (Lmodulecheck/api/context/MustBeApi;Ljava/util/Set;ILjava/lang/Object;)Lmodulecheck/api/context/MustBeApi; - public fun equals (Ljava/lang/Object;)Z - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun getSize ()I - public fun hashCode ()I - public fun isEmpty ()Z - public fun iterator ()Ljava/util/Iterator; - public fun remove (Ljava/lang/Object;)Z - public fun removeAll (Ljava/util/Collection;)Z - public fun retainAll (Ljava/util/Collection;)Z - public final fun size ()I - public fun toArray ()[Ljava/lang/Object; - public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/MustBeApi$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/MustBeApiKt { - public static final fun mustBeApi (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mustBeApiIn-BhXIJPA (Lmodulecheck/project/McProject;Lmodulecheck/project/McProject;Ljava/lang/String;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ProjectDepth : java/lang/Comparable { - public synthetic fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;ILjava/util/List;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/api/context/ProjectDepth;)I - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component3 ()I - public final fun component4 ()Ljava/util/List; - public final fun component5-qrJCKeA ()Ljava/lang/String; - public final fun copy-cFAEbwY (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;ILjava/util/List;Ljava/lang/String;)Lmodulecheck/api/context/ProjectDepth; - public static synthetic fun copy-cFAEbwY$default (Lmodulecheck/api/context/ProjectDepth;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;ILjava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/api/context/ProjectDepth; - public fun equals (Ljava/lang/Object;)Z - public final fun fullTree-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun fullTree-YJqa9SQ$default (Lmodulecheck/api/context/ProjectDepth;Ljava/lang/String;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun getChildren ()Ljava/util/List; - public final fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun getDependentProject ()Lmodulecheck/project/McProject; - public final fun getDepth ()I - public final fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public fun hashCode ()I - public final fun toFinding (Lmodulecheck/finding/FindingName;)Lmodulecheck/api/DepthFinding; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/PublicDependencies : java/util/Set, kotlin/jvm/internal/markers/KMappedMarker, modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/PublicDependencies$Key; - public fun (Ljava/util/Set;)V - public synthetic fun add (Ljava/lang/Object;)Z - public fun add (Lmodulecheck/model/dependency/ProjectDependency;)Z - public fun addAll (Ljava/util/Collection;)Z - public fun clear ()V - public final fun contains (Ljava/lang/Object;)Z - public fun contains (Lmodulecheck/model/dependency/ProjectDependency;)Z - public fun containsAll (Ljava/util/Collection;)Z - public final fun copy (Ljava/util/Set;)Lmodulecheck/api/context/PublicDependencies; - public static synthetic fun copy$default (Lmodulecheck/api/context/PublicDependencies;Ljava/util/Set;ILjava/lang/Object;)Lmodulecheck/api/context/PublicDependencies; - public fun equals (Ljava/lang/Object;)Z - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun getSize ()I - public fun hashCode ()I - public fun isEmpty ()Z - public fun iterator ()Ljava/util/Iterator; - public fun remove (Ljava/lang/Object;)Z - public fun removeAll (Ljava/util/Collection;)Z - public fun retainAll (Ljava/util/Collection;)Z - public final fun size ()I - public fun toArray ()[Ljava/lang/Object; - public fun toArray ([Ljava/lang/Object;)[Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/PublicDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/PublicDependenciesKt { - public static final fun publicDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/References : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/References$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/References; - public static synthetic fun copy$default (Lmodulecheck/api/context/References;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/References; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/References$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ReferencesKt { - public static final fun references (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun referencesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ResSourceFiles : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/ResSourceFiles$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/ResSourceFiles; - public static synthetic fun copy$default (Lmodulecheck/api/context/ResSourceFiles;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/ResSourceFiles; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/ResSourceFiles$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ResSourceFilesKt { - public static final fun resSourceFiles (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun resourceFilesForSourceSetName-5sj7XBw (Lmodulecheck/project/ProjectContext;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ResolvedDeclaredNames : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/ResolvedDeclaredNames$Key; - public synthetic fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public final fun getSource-5sj7XBw (Lmodulecheck/parsing/source/ResolvableMcName;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ResolvedDeclaredNames$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/ResolvedDeclaredNames$McProjectWithSourceSetName { - public synthetic fun (Lmodulecheck/project/McProject;Ljava/lang/String;Lmodulecheck/parsing/source/QualifiedDeclaredName;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2-qrJCKeA ()Ljava/lang/String; - public final fun component3 ()Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun copy-5sj7XBw (Lmodulecheck/project/McProject;Ljava/lang/String;Lmodulecheck/parsing/source/QualifiedDeclaredName;)Lmodulecheck/api/context/ResolvedDeclaredNames$McProjectWithSourceSetName; - public static synthetic fun copy-5sj7XBw$default (Lmodulecheck/api/context/ResolvedDeclaredNames$McProjectWithSourceSetName;Lmodulecheck/project/McProject;Ljava/lang/String;Lmodulecheck/parsing/source/QualifiedDeclaredName;ILjava/lang/Object;)Lmodulecheck/api/context/ResolvedDeclaredNames$McProjectWithSourceSetName; - public fun equals (Ljava/lang/Object;)Z - public final fun getDeclaration ()Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun getProject ()Lmodulecheck/project/McProject; - public final fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/ResolvedDeclaredNamesKt { - public static final fun resolvedDeclaredNames (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/SourceSetDependencies : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/api/context/SourceSetDependencies$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/api/context/SourceSetDependencies; - public static synthetic fun copy$default (Lmodulecheck/api/context/SourceSetDependencies;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/api/context/SourceSetDependencies; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/api/context/SourceSetDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/SourceSetDependenciesKt { - public static final fun sourceSetDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/api/context/UsesKt { - public static final fun uses (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - diff --git a/modulecheck-api/build.gradle.kts b/modulecheck-api/build.gradle.kts deleted file mode 100644 index adf62d06f9..0000000000 --- a/modulecheck-api/build.gradle.kts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - - published( - artifactId = "modulecheck-api" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:android")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-utils:cache")) - api(project(path = ":modulecheck-utils:lazy")) - - implementation(libs.kotlin.compiler) - implementation(libs.kotlinx.coroutines.jvm) - - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/DepthFinding.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/DepthFinding.kt deleted file mode 100644 index 5d54179e7a..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/DepthFinding.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api - -import modulecheck.api.context.ProjectDepth -import modulecheck.finding.Finding -import modulecheck.finding.Finding.FindingResult -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import java.io.File - -data class DepthFinding( - override val dependentProject: McProject, - override val dependentPath: StringProjectPath, - val depth: Int, - val children: List, - val sourceSetName: SourceSetName, - override val buildFile: File -) : Finding, Comparable { - - override val findingName: FindingName = NAME - - override val message: String - get() = "The longest path between this module and its leaf nodes" - override val positionOrNull: LazyDeferred = lazyDeferred { null } - - override val dependencyIdentifier: String = "" - - override suspend fun toResult(fixed: Boolean): FindingResult { - return FindingResult( - dependentPath = dependentPath, - findingName = findingName, - sourceOrNull = null, - configurationName = "", - dependencyIdentifier = dependencyIdentifier, - positionOrNull = positionOrNull.await(), - buildFile = buildFile, - message = message, - fixed = fixed - ) - } - - override fun compareTo(other: DepthFinding): Int { - return depth.compareTo(other.depth) - } - - fun toProjectDepth(): ProjectDepth = ProjectDepth( - dependentProject = dependentProject, - dependentPath = dependentPath, - depth = depth, - children = children.map(DepthFinding::toProjectDepth), - sourceSetName = sourceSetName - ) - - override fun toString(): String { - return "DepthFinding(" + - "dependentPath='$dependentPath', " + - "depth=$depth, " + - "children=$children, " + - "sourceSetName=$sourceSetName" + - ")" - } - - companion object { - val NAME: FindingName = FindingName("project-depth") - } -} diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidBasePackages.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidBasePackages.kt deleted file mode 100644 index 9a8b942251..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidBasePackages.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.PackageName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.isAndroid -import modulecheck.utils.cache.SafeCache - -data class AndroidBasePackages( - private val delegate: SafeCache, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun get(sourceSetName: SourceSetName): PackageName? { - if (!project.isAndroid()) return null - - return delegate.getOrPut(sourceSetName) { - - val namespaces = project.platformPlugin.asAndroidOrNull()?.namespaces - ?: return@getOrPut null - - sourceSetName - .withUpstream(project) - .firstNotNullOfOrNull { sourceSetOrUpstream -> - - // Namespace declarations supersede packages defined in a manifest, even when that - // manifest is in a downstream source set. So, if a namespace is set anywhere, it's set - // everywhere, and a downstream source set like `debugInternalRelease` will return the - // same value as for `main`. - namespaces[sourceSetOrUpstream] - - // Note that this isn't just looking for a manifest file. It's looking for a manifest - // which has a defined base package. It's possible for a manifest to exist, but just - // add an Activity or something, if the package is already defined in an withUpstream - // source set. - ?: project.manifestFileForSourceSetName(sourceSetOrUpstream)?.basePackage - } - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): AndroidBasePackages { - return AndroidBasePackages( - SafeCache(listOf(project.projectPath, AndroidBasePackages::class)), - project - ) - } - } -} - -suspend fun ProjectContext.androidBasePackages(): AndroidBasePackages = get(AndroidBasePackages) - -suspend fun ProjectContext.androidBasePackagesForSourceSetName( - sourceSetName: SourceSetName -): PackageName? = androidBasePackages().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidDataBindingDeclarations.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidDataBindingDeclarations.kt deleted file mode 100644 index a6892402a2..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidDataBindingDeclarations.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AndroidDataBindingDeclaredName -import modulecheck.parsing.source.AndroidResourceDeclaredName -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.isAndroid -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.existsOrNull -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.emptyLazySet -import modulecheck.utils.lazy.toLazySet -import modulecheck.utils.mapToSet - -data class AndroidDataBindingDeclarations( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun get(sourceSetName: SourceSetName): LazySet { - if (!project.isAndroid()) return emptyLazySet() - - return delegate.getOrPut(sourceSetName) { - - val basePackage = project.androidBasePackagesForSourceSetName(sourceSetName) - ?: return@getOrPut emptyLazySet() - - sourceSetName - .withUpstream(project) - .map { sourceSetOrUpstream -> - - dataSource { - project.layoutFilesForSourceSetName(sourceSetOrUpstream) - .mapNotNull { it.file.existsOrNull() } - .mapToSet { layoutFile -> - - val layoutDeclaration = UnqualifiedAndroidResource - .layout(layoutFile.nameWithoutExtension.asSimpleName()) - - // fully qualified - AndroidResourceDeclaredName.dataBinding( - sourceLayoutDeclaration = layoutDeclaration, - packageName = basePackage - ) - } - } - }.toLazySet() - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): AndroidDataBindingDeclarations { - - return AndroidDataBindingDeclarations( - SafeCache(listOf(project.projectPath, AndroidDataBindingDeclarations::class)), - project - ) - } - } -} - -suspend fun ProjectContext.androidDataBindingDeclarations(): AndroidDataBindingDeclarations = - get(AndroidDataBindingDeclarations) - -suspend fun ProjectContext.androidDataBindingDeclarationsForSourceSetName( - sourceSetName: SourceSetName -): LazySet = androidDataBindingDeclarations().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidRDeclaredNames.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidRDeclaredNames.kt deleted file mode 100644 index 2d5541e360..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidRDeclaredNames.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AndroidRDeclaredName -import modulecheck.parsing.source.AndroidResourceDeclaredName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.isAndroid -import modulecheck.utils.cache.SafeCache - -data class AndroidRDeclaredNames( - private val delegate: SafeCache, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): Set { - return project.sourceSets.keys - .mapNotNull { get(it) } - .toSet() - } - - suspend fun get(sourceSetName: SourceSetName): AndroidRDeclaredName? { - if (!project.isAndroid()) return null - - return delegate.getOrPut(sourceSetName) { - project.androidBasePackagesForSourceSetName(sourceSetName) - ?.let { AndroidResourceDeclaredName.r(it) } - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): AndroidRDeclaredNames { - return AndroidRDeclaredNames( - SafeCache(listOf(project.projectPath, AndroidRDeclaredNames::class)), - project - ) - } - } -} - -suspend fun ProjectContext.androidRDeclaredNames(): AndroidRDeclaredNames = - get(AndroidRDeclaredNames) - -suspend fun ProjectContext.androidRDeclaredNameForSourceSetName( - sourceSetName: SourceSetName -): AndroidRDeclaredName? = androidRDeclaredNames().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidResourceDeclaredNames.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidResourceDeclaredNames.kt deleted file mode 100644 index 6e8649e66e..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidResourceDeclaredNames.kt +++ /dev/null @@ -1,168 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.flow.toSet -import modulecheck.model.dependency.AndroidPlatformPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidLibraryPlugin -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.asSourceSetName -import modulecheck.parsing.source.AndroidResourceDeclaredName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.isAndroid -import modulecheck.project.project -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.coroutines.mapAsyncNotNull -import modulecheck.utils.flatMapToSet -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.dataSourceOf -import modulecheck.utils.lazy.emptyLazySet -import modulecheck.utils.lazy.lazySet - -data class AndroidResourceDeclaredNames( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - /** - * @return every [AndroidResourceDeclaredName] declared within any [SourceSetName]. This includes: - * - fully qualified generated resources like `com.example.R.string.app_name` - * - generated data-/view-binding declarations like - * `com.example.databinding.FragmentListBinding` - * - unqualified resources which can be consumed in - * downstream projects, like `R.string.app_name` - * - R declarations, like `com.example.R` - * @since 0.12.0 - */ - suspend fun all(): LazySet { - return delegate.getOrPut("all_source_sets".asSourceSetName()) { - project.platformPlugin - .sourceSets - .keys - .map { get(it) } - .let { lazySet(it) } - } - } - - /** - * @return every [AndroidResourceDeclaredName] declared - * within this [sourceSetName]. This includes: - * - fully qualified generated resources like `com.example.R.string.app_name` - * - generated data-/view-binding declarations like - * `com.example.databinding.FragmentListBinding` - * - unqualified resources which can be consumed in - * downstream projects, like `R.string.app_name` - * - R declarations, like `com.example.R` - * @since 0.12.0 - */ - suspend fun get(sourceSetName: SourceSetName): LazySet { - if (!project.isAndroid()) return emptyLazySet() - - val platformPlugin = project.platformPlugin as? AndroidPlatformPlugin ?: return emptyLazySet() - - if (platformPlugin is AndroidLibraryPlugin && !platformPlugin.androidResourcesEnabled) { - return emptyLazySet() - } - - val rName = project.androidRDeclaredNameForSourceSetName(sourceSetName) - ?: return emptyLazySet() - - return delegate.getOrPut(sourceSetName) { - - val allTransitiveUnqualified = if (!platformPlugin.nonTransientRClass) { - project - .classpathDependencies() - .get(sourceSetName) - .mapAsyncNotNull { tpd -> - - val transitiveSourceSetName = tpd.source.declaringSourceSetName( - tpd.source.project(project).sourceSets - ) - - tpd.contributed.project(project) - .androidUnqualifiedResourcesForSourceSetName(transitiveSourceSetName) - } - } else { - flowOf() - } - - val localUnqualified = project - .androidUnqualifiedResourcesForSourceSetName(sourceSetName) - - val qualified = dataSource { - - val built = allTransitiveUnqualified - .toList(mutableListOf(localUnqualified)) - .flatMapToSet { unqualifiedLazySet -> - - unqualifiedLazySet - .map { unqualified -> - unqualified.toQualifiedDeclaredName(rName) - } - .toSet() - } - built - } - - val dataBinding = project - .androidDataBindingDeclarationsForSourceSetName(sourceSetName) - - val components = listOf( - localUnqualified, - dataSourceOf(rName), - dataBinding, - qualified - ) - - lazySet(components) - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): AndroidResourceDeclaredNames { - return AndroidResourceDeclaredNames( - SafeCache(listOf(project.projectPath, AndroidResourceDeclaredNames::class)), - project - ) - } - } -} - -suspend fun ProjectContext.androidResourceDeclaredNames(): AndroidResourceDeclaredNames = - get(AndroidResourceDeclaredNames) - -/** - * @return every [AndroidResourceDeclaredName] declared within this [sourceSetName]. This includes: - * - * - fully qualified generated resources like `com.example.R.string.app_name` - * - generated data-/view-binding declarations like `com.example.databinding.FragmentListBinding` - * - unqualified resources which can be consumed in downstream projects, like `R.string.app_name` - * - R declarations, like `com.example.R` - * @since 0.12.0 - */ -suspend fun ProjectContext.androidResourceDeclaredNamesForSourceSetName( - sourceSetName: SourceSetName -): LazySet { - return androidResourceDeclaredNames().get(sourceSetName) -} diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidResourceReferences.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidResourceReferences.kt deleted file mode 100644 index 15d2336715..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidResourceReferences.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.flow.toSet -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AndroidResourceReferenceName -import modulecheck.parsing.source.ReferenceName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.isAndroid -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.emptyLazySet -import modulecheck.utils.lazy.lazySet -import modulecheck.utils.lazy.toLazySet - -data class AndroidResourceReferences( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun get(sourceSetName: SourceSetName): LazySet { - return delegate.getOrPut(sourceSetName) { fetchNewReferences(sourceSetName) } - } - - private suspend fun fetchNewReferences(sourceSetName: SourceSetName): LazySet { - - if (!project.isAndroid()) return emptyLazySet() - - val jvm = project.jvmFilesForSourceSetName(sourceSetName) - .map { jvmFile -> - - dataSource { - jvmFile.references - .filterIsInstance() - .toSet() - } - } - .toList() - .toLazySet() - - val layout = project.layoutFilesForSourceSetName(sourceSetName) - .map { it.references } - - val styles = project.androidStylesFilesForSourceSetName(sourceSetName) - .map { it.references } - - val manifest = project.manifestFileForSourceSetName(sourceSetName) - ?.references - - val all = if (manifest != null) { - layout + styles + manifest + jvm - } else { - layout + styles + jvm - } - - return lazySet(all) - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): AndroidResourceReferences { - - return AndroidResourceReferences( - SafeCache(listOf(project.projectPath, AndroidResourceReferences::class)), - project - ) - } - } -} - -suspend fun ProjectContext.androidResourceReferencesForSourceSetName( - sourceSetName: SourceSetName -): LazySet = get(AndroidResourceReferences).get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidStylesFiles.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidStylesFiles.kt deleted file mode 100644 index ce14652826..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidStylesFiles.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.android.AndroidStylesFile -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache - -data class AndroidStylesFiles( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): Map> { - return project.sourceSets - .mapValues { (sourceSetName, _) -> - get(sourceSetName) - } - } - - suspend fun get(sourceSetName: SourceSetName): Set { - - return delegate.getOrPut(sourceSetName) { - - val sourceSet = project.sourceSets[sourceSetName] ?: return@getOrPut emptySet() - sourceSet - .resourceFiles - .map { AndroidStylesFile(it) } - .toSet() - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): AndroidStylesFiles { - - return AndroidStylesFiles( - SafeCache(listOf(project.projectPath, AndroidStylesFiles::class)), - project - ) - } - } -} - -suspend fun ProjectContext.androidStylesFiles(): AndroidStylesFiles = get(AndroidStylesFiles) -suspend fun ProjectContext.androidStylesFilesForSourceSetName( - sourceSetName: SourceSetName -): Set = androidStylesFiles().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidUnqualifiedResources.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidUnqualifiedResources.kt deleted file mode 100644 index 00545d8545..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AndroidUnqualifiedResources.kt +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.AndroidPlatformPlugin -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.android.AndroidResourceParser -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.flatMapToSet -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.emptyLazySet -import modulecheck.utils.lazy.lazySet -import modulecheck.utils.lazy.toLazySet - -/** - * the cache of [UnqualifiedAndroidResource] for this [project][ProjectContext] - * - * @since 0.12.0 - */ -data class AndroidUnqualifiedResources( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - /** - * @return every [UnqualifiedAndroidResource] declared - * within this [sourceSetName], like `R.string.app_name` - * @since 0.12.0 - */ - suspend fun get(sourceSetName: SourceSetName): LazySet { - val platformPlugin = project.platformPlugin as? AndroidPlatformPlugin - ?: return emptyLazySet() - - return delegate.getOrPut(sourceSetName) { - - sourceSetName - .withUpstream(project) - .map { sourceSetOrUpstream -> - - val layoutsAndIds = project - .layoutFilesForSourceSetName(sourceSetOrUpstream) - .map { layoutFile -> - - dataSource { - layoutFile.idDeclarations - .plus(UnqualifiedAndroidResource.fromFile(layoutFile.file)) - .filterNotNull() - .toSet() - } - } - - val resValues = dataSource { - sourceSetName.withUpstream(project) - .flatMapToSet { sourceSetOrUpstream -> - platformPlugin.resValues[sourceSetOrUpstream].orEmpty() - } - } - - val declarations = project - .resourceFilesForSourceSetName(sourceSetOrUpstream) - .map { file -> - dataSource { - - AndroidResourceParser().parseFile(file) - } - } - .plus(layoutsAndIds) - .plus(resValues) - - lazySet(declarations) - }.toLazySet() - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): AndroidUnqualifiedResources { - - return AndroidUnqualifiedResources( - SafeCache(listOf(project.projectPath, AndroidUnqualifiedResources::class)), - project - ) - } - } -} - -/** - * @return the cache of [UnqualifiedAndroidResource] for this [project][ProjectContext] - * @since 0.12.0 - */ -suspend fun ProjectContext.androidUnqualifiedResources(): AndroidUnqualifiedResources = - get(AndroidUnqualifiedResources) - -/** - * @return every [UnqualifiedAndroidResource] declared - * within this [sourceSetName], like `R.string.app_name` - * @since 0.12.0 - */ -suspend fun ProjectContext.androidUnqualifiedResourcesForSourceSetName( - sourceSetName: SourceSetName -): LazySet = androidUnqualifiedResources().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilGraph.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilGraph.kt deleted file mode 100644 index 5e0d7223c7..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilGraph.kt +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.asFlow -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.flow.mapNotNull -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AnvilScopeName -import modulecheck.parsing.source.AnvilScopeNameEntry -import modulecheck.parsing.source.JvmFile -import modulecheck.parsing.source.KotlinFile -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.RawAnvilAnnotatedType -import modulecheck.parsing.source.ReferenceName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.project -import modulecheck.utils.cache.SafeCache -import org.jetbrains.kotlin.name.FqName - -/** - * Represents a set of Anvil scope declarations including both contributions and merges. - * @property scopeName the [AnvilScopeName] for these declarations - * @property contributions mutable set of [QualifiedDeclaredName]s that contribute to this scope - * @property merges mutable set of [QualifiedDeclaredName]s that are merged into this scope - */ -data class AnvilScopedDeclarations( - val scopeName: AnvilScopeName, - val contributions: MutableSet, - val merges: MutableSet -) - -/** - * Represents a graph of Anvil scopes and their associated declarations. - * - * @param project the [McProject] for which this graph is defined - * @param delegate a cache that maps from [SourceSetName] to - * a map of [AnvilScopeName] to [AnvilScopedDeclarations] - */ -data class AnvilGraph( - private val project: McProject, - private val delegate: SafeCache> -) : ProjectContext.Element { - - private val contributeAnnotations = setOf( - "com.squareup.anvil.annotations.ContributesTo", - "com.squareup.anvil.annotations.ContributesBinding", - "com.squareup.anvil.annotations.ContributesMultibinding", - "com.squareup.anvil.annotations.ContributesSubcomponent" - ).map { ReferenceName(it, KOTLIN) } - - private val mergeAnnotations = setOf( - "com.squareup.anvil.annotations.compat.MergeInterfaces", - "com.squareup.anvil.annotations.compat.MergeModules", - "com.squareup.anvil.annotations.MergeComponent", - "com.squareup.anvil.annotations.MergeSubcomponent" - ).map { ReferenceName(it, KOTLIN) } - - private val allAnnotations = mergeAnnotations + contributeAnnotations - - /** @return the unique key of the Anvil graph within the project context */ - override val key: ProjectContext.Key - get() = Key - - /** - * Retrieves a list of all Anvil scoped declarations for each source set in the project. - * @return a list of maps from [AnvilScopeName] to [AnvilScopedDeclarations] for each source set - */ - suspend fun all(): List> { - return project.sourceSets.keys.map { get(it) } - } - - /** - * Retrieves a list of all Anvil scope names that have merges. - * @return a list of [AnvilScopeName]s with merges - */ - suspend fun mergedScopeNames(): List = all() - .asSequence() - .flatMap { it.values } - .filter { it.merges.isNotEmpty() } - .map { it.scopeName } - .toList() - - /** - * Retrieves the Anvil scoped declarations for a specific source set. - * @param sourceSetName the [SourceSetName] for which to get the Anvil scoped declarations - * @return a map from [AnvilScopeName] to [AnvilScopedDeclarations] for the given source set - */ - suspend fun get(sourceSetName: SourceSetName): Map { - if (project.anvilGradlePlugin == null) return emptyMap() - - return delegate.getOrPut(sourceSetName) { - project.declarationsForScopeName(sourceSetName) - } - } - - private suspend fun McProject.declarationsForScopeName( - sourceSetName: SourceSetName - ): MutableMap { - val map = mutableMapOf() - suspend fun RawAnvilAnnotatedType.declarations( - sourceSetName: SourceSetName, - kotlinFile: JvmFile - ): AnvilScopedDeclarations { - val scopeName = getAnvilScopeName( - scopeNameEntry = anvilScopeNameEntry, - sourceSetName = sourceSetName, - kotlinFile = kotlinFile - ) - - return map.getOrPut(scopeName) { - AnvilScopedDeclarations( - scopeName = scopeName, - contributions = mutableSetOf(), - merges = mutableSetOf() - ) - } - } - - jvmFilesForSourceSetName(sourceSetName) - // Anvil only works with Kotlin, so no point in trying to parse Java files - .filterIsInstance() - // only re-visit files which have Anvil annotations - .filter { kotlinFile -> - - allAnnotations.any { annotationName -> - kotlinFile.references.contains(annotationName) - } - } - .collect { kotlinFile -> - - val (merged, contributed) = kotlinFile - .getAnvilScopeArguments(allAnnotations, mergeAnnotations) - - merged - .forEach { rawAnvilAnnotatedType -> - - val declarations = rawAnvilAnnotatedType.declarations(sourceSetName, kotlinFile) - - declarations.merges.add(rawAnvilAnnotatedType.declaredName) - } - contributed - .forEach { rawAnvilAnnotatedType -> - - val declarations = rawAnvilAnnotatedType.declarations(sourceSetName, kotlinFile) - - declarations.contributions.add(rawAnvilAnnotatedType.declaredName) - } - } - - return map - } - - private suspend fun McProject.getAnvilScopeName( - scopeNameEntry: AnvilScopeNameEntry, - sourceSetName: SourceSetName, - kotlinFile: JvmFile - ): AnvilScopeName { - val dependenciesBySourceSetName = dependenciesBySourceSetName() - - val maybeExtraReferences = kotlinFile.references - - // if scope is directly resolved (most likely), - // then use that fully qualified name - val rawScopeName = kotlinFile.references - .firstOrNull { reference -> reference.name.endsWith(scopeNameEntry.name.name) } - ?.let { FqName(it.name) } - // if the scope is wildcard-imported - ?: dependenciesBySourceSetName[sourceSetName] - .orEmpty() - .asFlow() - .mapNotNull { cpd -> - cpd.project(project) - .declarations() - .get(SourceSetName.MAIN, includeUpstream = true) - .filter { maybeExtraReferences.contains(it) } - .firstOrNull { it.name.endsWith(scopeNameEntry.name.name) } - } - .firstOrNull() - ?.let { FqName(it.name) } - // Scope must be defined in this same module - ?: maybeExtraReferences - .mapNotNull { reference -> - reference.takeIf { it.startsWith(kotlinFile.packageName) } - } - .firstOrNull { maybeExtra -> maybeExtra.endsWith(scopeNameEntry.name.name) } - ?.let { FqName(it.name) } - // Scope must be defined in this same package - ?: FqName("${kotlinFile.packageName}.${scopeNameEntry.name}") - - return AnvilScopeName(rawScopeName) - } - - private fun McProject.dependenciesBySourceSetName(): Map> { - return configurations - .map { (configurationName, _) -> - configurationName.toSourceSetName() to projectDependencies[configurationName].orEmpty() - } - .groupBy { it.first } - .map { (sourceSetName, pairs) -> - sourceSetName to pairs.flatMap { it.second } - } - .toMap() - } - - /** Companion object that acts as the key for [AnvilGraph] within a [ProjectContext]. */ - companion object Key : ProjectContext.Key { - /** - * Generates an [AnvilGraph] instance for the given project. - * @param project the project for which to generate the [AnvilGraph] instance - * @return the generated [AnvilGraph] instance - */ - override suspend operator fun invoke(project: McProject): AnvilGraph { - return AnvilGraph( - project = project, - delegate = SafeCache(listOf(project.projectPath, AnvilGraph::class)) - ) - } - } -} - -/** - * Extension function to retrieve [AnvilGraph] from the [ProjectContext]. - * @return the [AnvilGraph] instance from the context - */ -suspend fun ProjectContext.anvilGraph(): AnvilGraph = get(AnvilGraph) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeContributions.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeContributions.kt deleted file mode 100644 index f55337c03c..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeContributions.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AnvilScopeName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache - -data class AnvilScopeContributions( - private val delegate: SafeCache>>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - /** - * @return all contributed interfaces for this [sourceSetName], - * grouped by the [AnvilScopeName] for which they're contributed - * @since 0.12.0 - */ - suspend fun get(sourceSetName: SourceSetName): Map> { - return delegate.getOrPut(sourceSetName) { - project.anvilGraph().get(sourceSetName) - .mapValues { (_, declarations) -> - declarations.contributions - } - .filter { it.value.isNotEmpty() } - } - } - - companion object Key : ProjectContext.Key { - - override suspend operator fun invoke(project: McProject): AnvilScopeContributions { - return AnvilScopeContributions( - SafeCache(listOf(project.projectPath, AnvilScopeContributions::class)), - project - ) - } - } -} - -suspend fun ProjectContext.anvilScopeContributions(): AnvilScopeContributions = - get(AnvilScopeContributions) - -/** - * @return all contributed interfaces for this [sourceSetName], - * grouped by the [AnvilScopeName] for which they're contributed - * @since 0.12.0 - */ -suspend fun ProjectContext.anvilScopeContributionsForSourceSetName( - sourceSetName: SourceSetName -): Map> = anvilScopeContributions().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeDependencies.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeDependencies.kt deleted file mode 100644 index 15c4569305..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeDependencies.kt +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.project -import modulecheck.utils.cache.SafeCache - -data class AnvilScopeDependencies( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun get(sourceSetName: SourceSetName): List { - return delegate.getOrPut(sourceSetName) { - val merged = project.anvilScopeMergesForSourceSetName(sourceSetName) - - // if the project/source set doesn't merge anything, skip looking for contributions - if (merged.isEmpty()) return@getOrPut emptyList() - - project.classpathDependencies() - .get(sourceSetName) - .map { it.contributed } - .distinct() - .filter { cpd -> - - val contributed = cpd.project(project) - .anvilScopeContributionsForSourceSetName(cpd.configurationName.toSourceSetName()) - - contributed.any { (scopeName, _) -> - merged[scopeName]?.isNotEmpty() == true - } - } - } - } - - companion object Key : ProjectContext.Key { - - override suspend operator fun invoke(project: McProject): AnvilScopeDependencies { - return AnvilScopeDependencies( - SafeCache(listOf(project.projectPath, AnvilScopeDependencies::class)), - project - ) - } - } -} - -suspend fun ProjectContext.anvilScopeDependencies(): AnvilScopeDependencies = - get(AnvilScopeDependencies) - -suspend fun ProjectContext.anvilScopeDependenciesForSourceSetName( - sourceSetName: SourceSetName -): List = anvilScopeDependencies().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeMerges.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeMerges.kt deleted file mode 100644 index a6a18cf2b4..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/AnvilScopeMerges.kt +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AnvilScopeName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache - -data class AnvilScopeMerges( - private val delegate: SafeCache>>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - /** - * @return all scope merges from any source set - * @since 0.12.0 - */ - suspend fun all(): List>> { - return project.sourceSets.keys.map { get(it) } - } - - /** - * @return all merged interfaces for this [sourceSetName], - * grouped by the [AnvilScopeName] for which they're merged - * @since 0.12.0 - */ - suspend fun get(sourceSetName: SourceSetName): Map> { - return delegate.getOrPut(sourceSetName) { - project.anvilGraph().get(sourceSetName) - .mapValues { (_, declarations) -> - declarations.merges - } - .filter { it.value.isNotEmpty() } - } - } - - companion object Key : ProjectContext.Key { - - override suspend operator fun invoke(project: McProject): AnvilScopeMerges { - return AnvilScopeMerges( - SafeCache(listOf(project.projectPath, AnvilScopeMerges::class)), - project - ) - } - } -} - -suspend fun ProjectContext.anvilScopeMerges(): AnvilScopeMerges = get(AnvilScopeMerges) - -/** - * @return all merged interfaces for this [sourceSetName], - * grouped by the [AnvilScopeName] for which they're merged - * @since 0.12.0 - */ -suspend fun ProjectContext.anvilScopeMergesForSourceSetName( - sourceSetName: SourceSetName -): Map> = anvilScopeMerges().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ClasspathDependencies.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/ClasspathDependencies.kt deleted file mode 100644 index 6fd1946189..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ClasspathDependencies.kt +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.TransitiveProjectDependency -import modulecheck.model.dependency.apiConfig -import modulecheck.model.dependency.isTestingOnly -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.mapToSet - -data class ClasspathDependencies( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): List { - return project.sourceSets.keys.flatMap { get(it) } - } - - suspend fun get(key: SourceSetName): List { - if (!project.sourceSets.containsKey(key)) { - return emptyList() - } - - return delegate.getOrPut(key) { project.fullTree(key) } - } - - private suspend fun McProject.fullTree( - sourceSetName: SourceSetName - ): List { - - fun sourceApiConfigs( - sourceSetName: SourceSetName, - isTestFixtures: Boolean - ): Set = setOfNotNull( - if (sourceSetName.isTestingOnly(this.sourceSets)) { - SourceSetName.DEBUG.apiConfig() - } else { - sourceSetName.apiConfig() - }, - ConfigurationName.api, - if (isTestFixtures) SourceSetName.TEST_FIXTURES.apiConfig() else null - ) - - val directDependencies = projectDependencies[sourceSetName] - .filterNot { it.project() == project } - - val directDependencyPaths = directDependencies.mapToSet { it.projectPath } - - val inherited = directDependencies.flatMap { sourceCpd -> - sourceApiConfigs(sourceSetName, sourceCpd.isTestFixture) - .flatMap { apiConfig -> - - sourceCpd.project() - .classpathDependencies() - .get(apiConfig.toSourceSetName()) - .asSequence() - .filter { it.contributed.configurationName.isApi() } - .filterNot { it.contributed.projectPath in directDependencyPaths } - .map { transitiveCpd -> - TransitiveProjectDependency(sourceCpd, transitiveCpd.contributed) - } - } - } - .toSet() - - val directTransitive = directDependencies.map { TransitiveProjectDependency(it, it) } - - val mainFromTestFixtures = directDependencies.filter { it.isTestFixture } - .map { TransitiveProjectDependency(it, it.copy(isTestFixture = false)) } - - return directTransitive + mainFromTestFixtures + inherited - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): ClasspathDependencies { - return ClasspathDependencies( - SafeCache(listOf(project.projectPath, ClasspathDependencies::class)), - project - ) - } - } -} - -suspend fun ProjectContext.classpathDependencies(): ClasspathDependencies = - get(ClasspathDependencies) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/Declarations.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/Declarations.kt deleted file mode 100644 index feef78c0bd..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/Declarations.kt +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.toList -import modulecheck.api.context.Declarations.DeclarationsKey.ALL -import modulecheck.api.context.Declarations.DeclarationsKey.Parameterized -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.nonTestSourceSetName -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.PackageName -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.ProjectContext -import modulecheck.project.isAndroid -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.LazySet.DataSource -import modulecheck.utils.lazy.LazySetComponent -import modulecheck.utils.lazy.asDataSource -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.dataSourceOf -import modulecheck.utils.lazy.lazySet -import modulecheck.utils.letIf - -class Declarations private constructor( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - // Allow for caching full hierarchies of declarations in a single `LazySet`. - // Without this, a full-hierarchy LazySet needs to be rebuilt from cached elements for every - // `mustBeApi` or `all` query, and that turns out to be very expensive. - private sealed interface DeclarationsKey { - object ALL : DeclarationsKey - data class Parameterized( - val sourceSetName: SourceSetName, - val includeUpstream: Boolean, - val packageNameOrNull: PackageName? - ) : DeclarationsKey - } - - suspend fun all(): LazySet { - return delegate.getOrPut(ALL) { - project.sourceSets - .keys - .map { project.declarations().get(it, includeUpstream = false, packageNameOrNull = null) } - .let { lazySet(it) } - } - } - - suspend fun get( - sourceSetName: SourceSetName, - includeUpstream: Boolean, - packageNameOrNull: PackageName? = null - ): LazySet { - val key = Parameterized(sourceSetName, includeUpstream, packageNameOrNull) - return delegate.getOrPut(key) { - val components = mutableListOf>() - - if (includeUpstream) { - sourceSetName.withUpstream(project) - .filterNot { it == SourceSetName.TEST_FIXTURES } - .forEach { sourceSetOrUpstream -> - components.add(get(sourceSetOrUpstream, includeUpstream = false)) - } - } else { - - val rNameOrNull = project.androidRDeclaredNameForSourceSetName(sourceSetName) - - project.jvmFilesForSourceSetName(sourceSetName) - .toList() - .letIf(packageNameOrNull != null) { files -> - files.filter { it.packageName == packageNameOrNull } - } - .map { dataSource(DataSource.Priority.HIGH) { it.declarations } } - .let { components.addAll(it) } - - if (rNameOrNull != null) { - check(project.isAndroid()) - - val resources = project.androidResourceDeclaredNamesForSourceSetName(sourceSetName) - .asDataSource() - - components.add(resources) - - components.add(dataSourceOf(rNameOrNull)) - - components.add( - project.androidDataBindingDeclarationsForSourceSetName(sourceSetName) - ) - } - } - - lazySet(components) - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): Declarations { - return Declarations( - SafeCache(listOf(project.projectPath, Declarations::class)), - project - ) - } - } -} - -suspend fun ProjectContext.declarations(): Declarations = get(Declarations) - -suspend fun ProjectDependency.declarations( - projectCache: ProjectCache, - packageNameOrNull: PackageName? = null -): LazySet { - val project = projectCache.getValue(projectPath) - if (isTestFixture) { - return project.declarations() - .get( - sourceSetName = SourceSetName.TEST_FIXTURES, - includeUpstream = false, - packageNameOrNull = packageNameOrNull - ) - } - - // If the dependency config is `testImplementation(...)` or `androidTestImplementation(...)`: - // If the dependency is an Android module, then it automatically targets the `debug` source. - // If the dependency is a Kotlin/Java module, then it automatically targets 'main'. - // - // If the dependency is something like `debugImplementation(...)`, the dependency is providing its - // `debug` source, which in turn provides its upstream `main` source. - val nonTestSourceSetName = configurationName.toSourceSetName() - .nonTestSourceSetName(project.sourceSets) - - // If we got something like `debug` as a source set, that just means that the dependent project - // has a `debug` source set. If the dependency project has `debug`, that's what it'll provide. - // If it doesn't have `debug`, it'll just provide `main`. - val declarationsSourceSetName = nonTestSourceSetName - .takeIf { project.sourceSets.containsKey(nonTestSourceSetName) } - ?: SourceSetName.MAIN - - return project.declarations() - .get( - sourceSetName = declarationsSourceSetName, - includeUpstream = true, - packageNameOrNull = packageNameOrNull - ) -} diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/DependencySources.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/DependencySources.kt deleted file mode 100644 index d7050fdcaf..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/DependencySources.kt +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.api.context.DependencySources.SourceResult.Found -import modulecheck.api.context.DependencySources.SourceResult.NOT_PRESENT -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache - -data class DependencySources( - private val delegate: SafeCache, - private val project: McProject -) : ProjectContext.Element { - - data class SourceKey( - val sourceSetName: SourceSetName, - val dependencyProjectPath: ProjectPath, - val isTestFixture: Boolean - ) - - sealed interface SourceResult { - data class Found(val sourceDependency: ProjectDependency) : SourceResult - object NOT_PRESENT : SourceResult - } - - override val key: ProjectContext.Key - get() = DependencySources - - suspend fun sourceOfOrNull( - dependencyProjectPath: ProjectPath, - sourceSetName: SourceSetName, - isTestFixture: Boolean - ): ProjectDependency? { - - val key = SourceKey( - sourceSetName = sourceSetName, - dependencyProjectPath = dependencyProjectPath, - isTestFixture = isTestFixture - ) - - val fromCacheOrNull = delegate.getOrPut(key) { - - val sourceOrNull = project.classpathDependencies() - .get(sourceSetName) - .firstOrNull { transitive -> - transitive.contributed.projectPath == dependencyProjectPath && - transitive.contributed.isTestFixture == isTestFixture - } - ?.source - - if (sourceOrNull != null) { - Found(sourceOrNull) - } else { - NOT_PRESENT - } - } - - return when (fromCacheOrNull) { - is Found -> fromCacheOrNull.sourceDependency - NOT_PRESENT -> null - } - } - - companion object Key : ProjectContext.Key { - override suspend fun invoke(project: McProject): DependencySources { - return DependencySources( - SafeCache(listOf(project.projectPath, DependencySources::class)), - project - ) - } - } -} - -suspend fun ProjectContext.dependencySources(): DependencySources = get(DependencySources) - -suspend fun McProject.requireSourceOf( - dependencyProject: McProject, - sourceSetName: SourceSetName, - isTestFixture: Boolean -): ProjectDependency { - return dependencySources().sourceOfOrNull( - dependencyProjectPath = dependencyProject.projectPath, - sourceSetName = sourceSetName, - isTestFixture = isTestFixture - ) - ?: throw IllegalArgumentException( - "Unable to find source of the dependency project '${dependencyProject.projectPath}' " + - "for SourceSet `${sourceSetName.value}` in the dependent project '$projectPath', " + - "including transitive dependencies." - ) -} diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/Depths.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/Depths.kt deleted file mode 100644 index f632c8734e..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/Depths.kt +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.api.DepthFinding -import modulecheck.finding.FindingName -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.project -import modulecheck.utils.cache.SafeCache - -data class Depths( - private val delegate: SafeCache, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - /** - * @return a [ProjectDepth] for each - * [SourceSet][modulecheck.model.dependency.McSourceSet] in this project. - * @since 0.12.0 - */ - suspend fun all(): List = project.sourceSets.map { get(it.key) } - - suspend fun get(key: SourceSetName): ProjectDepth { - return delegate.getOrPut(key) { fetchForSourceSet(key) } - } - - private suspend fun fetchForSourceSet(sourceSetName: SourceSetName): ProjectDepth { - val (childDepth, children) = project.projectDependencies[sourceSetName] - .map { it.project(project) } - .distinct() - .map { it.depthForSourceSetName(SourceSetName.MAIN) } - .groupBy { it.depth } - .let { map -> - val max = map.keys.maxOrNull() ?: -1 - max to map[max].orEmpty() - } - - return ProjectDepth( - dependentProject = project, - dependentPath = project.projectPath, - depth = childDepth + 1, - children = children, - sourceSetName = sourceSetName - ) - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): Depths { - - return Depths(SafeCache(listOf(project.projectPath, Depths::class)), project) - } - } -} - -suspend fun McProject.depths(): Depths = get(Depths) - -suspend fun McProject.depthForSourceSetName(sourceSetName: SourceSetName): ProjectDepth { - return get(Depths).get(sourceSetName) -} - -data class ProjectDepth( - val dependentProject: McProject, - val dependentPath: StringProjectPath, - val depth: Int, - val children: List, - val sourceSetName: SourceSetName -) : Comparable { - private val treeCache = SafeCache>( - listOf(dependentProject.projectPath, ProjectDepth::class) - ) - - fun toFinding(name: FindingName): DepthFinding = DepthFinding( - dependentProject = dependentProject, - dependentPath = dependentPath, - depth = depth, - children = children.map { it.toFinding(name) }, - sourceSetName = sourceSetName, - buildFile = dependentProject.buildFile - ) - - suspend fun fullTree(sourceSetName: SourceSetName = this.sourceSetName): Set { - return treeCache.getOrPut(sourceSetName) { - val children = dependentProject - .projectDependencies[sourceSetName] - .flatMap { - it.project(dependentProject.projectCache) - .depthForSourceSetName(SourceSetName.MAIN) - .fullTree(SourceSetName.MAIN) - } - children.toSet() + this - } - } - - override fun compareTo(other: ProjectDepth): Int { - return depth.compareTo(other.depth) - } -} diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/DownstreamProjects.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/DownstreamProjects.kt deleted file mode 100644 index ef17311076..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/DownstreamProjects.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.DownstreamDependency -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.project -import modulecheck.utils.flatMapToSet - -data class DownstreamProjects( - private val delegate: Set -) : Set by delegate, - ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): DownstreamProjects { - val others = project.projectCache - .values - .flatMapToSet { otherProject -> - - otherProject - .classpathDependencies() - .all() - .filter { it.contributed.project(project) == project } - .map { transitive -> - DownstreamDependency( - dependentProjectPath = otherProject.projectPath, - projectDependency = transitive.withContributedConfiguration().contributed - ) - } - } - - return DownstreamProjects(others) - } - } -} - -/** - * All projects which are downstream of the receiver project, including those which only inherit - * via another dependency's `api` configuration without declaring the dependency directly. - * - * @since 0.12.0 - */ -suspend fun ProjectContext.dependents(): DownstreamProjects = get(DownstreamProjects) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/GeneratedDeclarations.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/GeneratedDeclarations.kt deleted file mode 100644 index 66d38d98d7..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/GeneratedDeclarations.kt +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.filterIsInstance -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.Generated -import modulecheck.parsing.source.McName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.coroutines.flatMapSetConcat -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.lazySet -import modulecheck.utils.lazy.toLazySet - -/** - * Cache of all [Generated] declarations created by this project, - * where each [Generated] lists its [sources][Generated.sources]. - */ -class GeneratedDeclarations private constructor( - private val project: McProject -) : ProjectContext.Element { - - private val allGenerated: SafeCache> by lazy { - SafeCache(listOf(project.projectPath, GeneratedDeclarations::class)) - } - - /** - * the map holds all generated declarations for a given - * [ReferenceName][modulecheck.parsing.source.ReferenceName]. This - * is more efficient than a linear search/filter of a full list of - * [Generated] when there will be lookups for more than one source. - */ - private val reversed: SafeCache>> by lazy { - SafeCache(listOf(project.projectPath, GeneratedDeclarations::class)) - } - - /** Just a cache of the results from filtering all generated for a particular set of sources. */ - private val filtered: SafeCache> by lazy { - SafeCache(listOf(project.projectPath, GeneratedDeclarations::class)) - } - - private data class SourceSetWithDeclarations( - val sourceSetName: SourceSetName, - val sourceDeclarations: LazySet - ) - - override val key: ProjectContext.Key - get() = Key - - /** @return all [Generated] declarations for a given source set */ - suspend fun get(sourceSetName: SourceSetName): LazySet { - - return allGenerated.getOrPut(sourceSetName) { - project.declarations() - .get(sourceSetName, includeUpstream = true) - .filterIsInstance() - .toLazySet() - } - } - - /** - * @return all [Generated] declarations from a given source set which - * reference a declaration contained in [sourceDeclarations]. One example - * would be generated Android resources which come from another module. - */ - suspend fun get( - sourceSetName: SourceSetName, - sourceDeclarations: LazySet - ): LazySet = - filtered.getOrPut(SourceSetWithDeclarations(sourceSetName, sourceDeclarations)) { - lazySet { - val cache = sourcesToGenerated(sourceSetName) - - sourceDeclarations - .flatMapSetConcat { declaredName -> - cache[declaredName].orEmpty() - } - } - } - - private suspend fun sourcesToGenerated( - sourceSetName: SourceSetName - ): Map> { - return reversed.getOrPut(sourceSetName) { - - buildMap> { - - project.generatedDeclarations(sourceSetName) - .collect { generated -> - - generated.sources.forEach { referenceName -> - - get(referenceName)?.add(generated) - ?: put(referenceName, mutableSetOf(generated)) - } - } - } - } - } - - /** The [ProjectContext] key for [GeneratedDeclarations]. */ - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): GeneratedDeclarations { - return GeneratedDeclarations(project) - } - } -} - -/** shorthand for `project.get(GeneratedDeclarations)` */ -suspend fun ProjectContext.generatedDeclarations(): GeneratedDeclarations = - get(GeneratedDeclarations) - -/** @return all [Generated] declarations for a given source set */ -suspend fun ProjectContext.generatedDeclarations(sourceSetName: SourceSetName): LazySet = - generatedDeclarations().get(sourceSetName) - -/** - * @return all [Generated] declarations from a given source set which - * reference a declaration contained in [sourceDeclarations]. One example - * would be generated Android resources which come from another module. - */ -suspend fun ProjectContext.generatedDeclarations( - sourceSetName: SourceSetName, - sourceDeclarations: LazySet -): LazySet = generatedDeclarations().get(sourceSetName, sourceDeclarations) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/Imports.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/Imports.kt deleted file mode 100644 index e47bda7f02..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/Imports.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.toList -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.ReferenceName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.LazySet.DataSource -import modulecheck.utils.lazy.asDataSource -import modulecheck.utils.lazy.lazySet - -data class Imports( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun get(sourceSetName: SourceSetName): LazySet { - return delegate.getOrPut(sourceSetName) { - - val jvm: List> = project.get(JvmFiles) - .get(sourceSetName) - .map { it.importsLazy.asDataSource(DataSource.Priority.HIGH) } - .toList() - - val layout = project.get(LayoutFiles) - .get(sourceSetName) - .map { it.customViews.asDataSource() } - - lazySet(layout + jvm) - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): Imports { - - return Imports(SafeCache(listOf(project.projectPath, Imports::class)), project) - } - } -} - -suspend fun ProjectContext.imports(): Imports = get(Imports) -suspend fun ProjectContext.importsForSourceSetName( - sourceSetName: SourceSetName -): LazySet { - return imports().get(sourceSetName) -} diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/JvmFiles.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/JvmFiles.kt deleted file mode 100644 index a18d8d8f91..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/JvmFiles.kt +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.asFlow -import kotlinx.coroutines.flow.flatMapConcat -import kotlinx.coroutines.flow.mapNotNull -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.JvmFile -import modulecheck.project.JvmFileProvider -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import java.io.File - -/** - * Represents a collection of JVM files for a project. - * - * @property fileFactoryCache a cache for mapping source - * set names to corresponding JVM file providers - * @param project the project for which the JVM files are needed - */ -data class JvmFiles( - internal val fileFactoryCache: SafeCache, - private val project: McProject -) : ProjectContext.Element { - - /** @return the unique key of the JVM files within the project context */ - override val key: ProjectContext.Key - get() = Key - - /** - * Retrieves a flow of JVM files corresponding to the provided source set name. - * - * @param sourceSetName the name of the source set for which JVM files are needed - * @return a flow of [JvmFile]s for the requested source set name - */ - suspend fun get(sourceSetName: SourceSetName): Flow { - - return project - .sourceSets[sourceSetName] - ?.jvmFiles - .orEmpty() - .asFlow() - .flatMapConcat { directory -> - directory.walkTopDown() - .filter { maybeFile -> maybeFile.isFile } - .asFlow() - .mapNotNull { file -> getFile(file, sourceSetName) } - } - } - - /** - * Retrieves the JVM file corresponding to the given file and source set name. - * - * @param file the file to get the JVM file for - * @param sourceSetName the name of the source set to which the file belongs - * @return the [JvmFile] for the requested file, or `null` if not found - */ - private suspend fun getFile(file: File, sourceSetName: SourceSetName): JvmFile? { - - return fileFactoryCache.getOrPut(sourceSetName) { - project.jvmFileProviderFactory.create(project, sourceSetName) - }.getOrNull(file) - } - - /** Companion object that acts as the key for [JvmFiles] within a [ProjectContext]. */ - companion object Key : ProjectContext.Key { - /** - * Generates a [JvmFiles] instance for the given project. - * - * @param project the project for which to generate the [JvmFiles] instance - * @return the generated [JvmFiles] instance - */ - override suspend operator fun invoke(project: McProject): JvmFiles { - - return JvmFiles(SafeCache(listOf(project.projectPath, JvmFiles::class)), project) - } - } -} - -/** - * Retrieves [JvmFiles] from the [ProjectContext]. - * @return the [JvmFiles] instance from the context - */ -suspend fun ProjectContext.jvmFiles(): JvmFiles = get(JvmFiles) - -/** - * Retrieves a flow of JVM files corresponding to the - * provided source set name from the [ProjectContext]. - * - * @param sourceSetName the name of the source set for which JVM files are needed - * @return a flow of [JvmFile]s for the requested source set name - */ -suspend fun ProjectContext.jvmFilesForSourceSetName(sourceSetName: SourceSetName): Flow = - jvmFiles().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/JvmSourceFiles.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/JvmSourceFiles.kt deleted file mode 100644 index 44d29dd257..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/JvmSourceFiles.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import java.io.File - -/** - * All JVM source files for a specific source set in a project. - * - * @param delegate a [SafeCache] instance which manages a cache - * of source set names to the associated JVM source files. - * @param project the [McProject] for which the source files are retrieved. - */ -data class JvmSourceFiles( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - /** Key used to identify this [JvmSourceFiles] instance within [ProjectContext]. */ - override val key: ProjectContext.Key - get() = Key - - /** - * Retrieves the JVM source files for a given source set. - * - * @param sourceSetName The name of the source set for which to retrieve the JVM source files. - * @return A set of [File]s representing the JVM source files in the requested source set. - */ - suspend fun get(sourceSetName: SourceSetName): Set { - return delegate.getOrPut(sourceSetName) { - val sourceSet = project.sourceSets[sourceSetName] ?: return@getOrPut emptySet() - - sourceSet.jvmFiles - } - } - - /** Key object used to identify [JvmSourceFiles] within [ProjectContext]. */ - companion object Key : ProjectContext.Key { - /** - * Creates a new instance of [JvmSourceFiles] for a given project. - * - * @param project The project for which to create the [JvmSourceFiles] instance. - * @return A new instance of [JvmSourceFiles]. - */ - override suspend operator fun invoke(project: McProject): JvmSourceFiles { - - return JvmSourceFiles(SafeCache(listOf(project.projectPath, JvmSourceFiles::class)), project) - } - } -} - -/** @return The [JvmSourceFiles] instance for this context. */ -suspend fun ProjectContext.jvmSourceFiles(): JvmSourceFiles = get(JvmSourceFiles) - -/** - * @param sourceSetName The name of the source set for which to retrieve the JVM source files. - * @return A set of [File]s representing the JVM source files in the requested source set. - */ -suspend fun ProjectContext.jvmSourcesForSourceSetName(sourceSetName: SourceSetName): Set = - jvmSourceFiles().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/KaptDependencies.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/KaptDependencies.kt deleted file mode 100644 index a0dd4407d2..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/KaptDependencies.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.ProjectContext.Element -import modulecheck.utils.allValues -import modulecheck.utils.cache.SafeCache - -data class KaptDependencies( - private val delegate: SafeCache>, - private val project: McProject -) : Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): List { - return project.configurations - .filterNot { it.key.value.startsWith("_") } - .filter { it.key.value.contains("kapt", true) } - .flatMap { get(it.key) } - } - - suspend fun get(configurationName: ConfigurationName): Set { - return delegate.getOrPut(configurationName) { - val external = project.externalDependencies[configurationName].orEmpty() - val internal = project - .projectDependencies - .allValues() - - val allDependencies = external + internal - - allDependencies - .filterNot { it.identifier == KAPT_PLUGIN_COORDS } - .filter { it.configurationName == configurationName } - .toSet() - } - } - - companion object Key : ProjectContext.Key { - - internal val KAPT_PLUGIN_COORDS = MavenCoordinates( - group = "org.jetbrains.kotlin", - moduleName = "kotlin-annotation-processing-gradle", - version = null - ) - - override suspend operator fun invoke(project: McProject): KaptDependencies { - return KaptDependencies( - SafeCache(listOf(project.projectPath, KaptDependencies::class)), - project - ) - } - } -} - -suspend fun ProjectContext.kaptDependencies(): KaptDependencies = get(KaptDependencies) -suspend fun ProjectContext.kaptDependenciesForConfig( - configurationName: ConfigurationName -): Set = kaptDependencies().get(configurationName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/LayoutFiles.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/LayoutFiles.kt deleted file mode 100644 index 1b26f3df62..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/LayoutFiles.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.android.XmlFile -import modulecheck.parsing.android.XmlFile.LayoutFile -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache - -data class LayoutFiles( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): Map> { - return project.sourceSets - .mapValues { (sourceSetName, _) -> - get(sourceSetName) - } - } - - suspend fun get(sourceSetName: SourceSetName): Set { - - return delegate.getOrPut(sourceSetName) { - - val sourceSet = project.sourceSets[sourceSetName] ?: return@getOrPut emptySet() - sourceSet - .layoutFiles - .map { XmlFile.LayoutFile(it) } - .toSet() - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): LayoutFiles { - - return LayoutFiles(SafeCache(listOf(project.projectPath, LayoutFiles::class)), project) - } - } -} - -suspend fun ProjectContext.layoutFiles(): LayoutFiles = get(LayoutFiles) -suspend fun ProjectContext.layoutFilesForSourceSetName( - sourceSetName: SourceSetName -): Set = layoutFiles().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ManifestFiles.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/ManifestFiles.kt deleted file mode 100644 index 2ebc93d1ac..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ManifestFiles.kt +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.isAndroid -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.android.XmlFile -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.existsOrNull - -data class ManifestFiles( - private val delegate: SafeCache, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun get(sourceSetName: SourceSetName): XmlFile.ManifestFile? { - - val platformPlugin = project.platformPlugin - - if (!platformPlugin.isAndroid()) return null - - return delegate.getOrPut(sourceSetName) { - sourceSetName - .withUpstream(project) - .firstNotNullOfOrNull { sourceSetOrUpstream -> - - platformPlugin.manifests[sourceSetOrUpstream]?.existsOrNull() - } - ?.let { file -> XmlFile.ManifestFile(file) } - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): ManifestFiles { - - return ManifestFiles(SafeCache(listOf(project.projectPath, ManifestFiles::class)), project) - } - } -} - -suspend fun ProjectContext.manifestFiles(): ManifestFiles = get(ManifestFiles) - -suspend fun ProjectContext.manifestFileForSourceSetName( - sourceSetName: SourceSetName -): XmlFile.ManifestFile? = manifestFiles().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/MustBeApi.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/MustBeApi.kt deleted file mode 100644 index 67d9a0c1cd..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/MustBeApi.kt +++ /dev/null @@ -1,267 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.asFlow -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.flattenMerge -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.flow.toSet -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ConfiguredDependency.Companion.copy -import modulecheck.model.dependency.ExternalDependency -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.apiConfig -import modulecheck.model.dependency.isTestingOnly -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.McName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.UnqualifiedAndroidResourceReferenceName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.project -import modulecheck.utils.coroutines.any -import modulecheck.utils.coroutines.filterAsync -import modulecheck.utils.coroutines.flatMapListConcat -import modulecheck.utils.coroutines.mapAsync -import modulecheck.utils.flatMapToSet -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.lazy.lazySet - -data class MustBeApi( - private val delegate: Set -) : Set by delegate, - ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): MustBeApi { - val apiSet = project.sourceSets - .keys - .flatMapToSet { sourceSetName -> - - // this is anything in the classpath, including inherited dependencies - val mainDependencies = project.classpathDependencies() - .get(sourceSetName) - .map { it.contributed } - - val mergedScopeNames = project.anvilGraph() - .mergedScopeNames() - - // projects with a @Contributes(...) annotation somewhere - val scopeContributingProjects = mainDependencies - .filter { (_, projectDependencyPath) -> - - val contributions = project.projectCache - .getValue(projectDependencyPath) - .anvilScopeContributionsForSourceSetName(sourceSetName) - - mergedScopeNames.any { contributions.containsKey(it) } - } - .filterNot { it.configurationName == ConfigurationName.api } - - val importsFromDependencies = project.referencesFromDependencies(sourceSetName) - - val directApiProjects = project.projectDependencies[sourceSetName.apiConfig()] - .orEmpty() - .toSet() - - val directMainDependencies by lazy { - project.projectDependencies[sourceSetName].map { it.project(project) } - } - - mainDependencies - .asSequence() - // Anything with an `api` config must be inherited, - // and will be handled by the InheritedDependencyRule. - .filterNot { it.configurationName.isApi() } - .plus(scopeContributingProjects) - .distinctBy { it.projectPath } - .filterNot { cpd -> - // exclude anything which is inherited but already included in local `api` deps - cpd.copy(configurationName = cpd.configurationName.apiVariant()) in directApiProjects - } - .filterAsync { - !sourceSetName.isTestingOnly(project.sourceSets) && it.project(project) - .mustBeApiIn( - dependentProject = project, - referencesFromDependencies = importsFromDependencies, - sourceSetName = it.configurationName.toSourceSetName(), - isTestFixtures = it.isTestFixture, - directMainDependencies = directMainDependencies - ) - } - .map { cpd -> - val source = project - .projectDependencies[sourceSetName] - .let { dependencies -> - - // First try to find a normal "implementation" version of the dependency. - dependencies - .firstOrNull { declared -> - declared.projectPath == cpd.projectPath && - declared.isTestFixture == cpd.isTestFixture - } - // If that didn't work, look for something where the project matches - // (which means it's testFixtures) - ?: dependencies.firstOrNull { it.projectPath == cpd.projectPath } - } - ?: project.dependencySources() - .sourceOfOrNull( - dependencyProjectPath = cpd.projectPath, - sourceSetName = sourceSetName, - isTestFixture = cpd.isTestFixture - ) - InheritedDependencyWithSource(cpd, source) - } - .toList() - .distinctBy { it.projectDependency } - .toSet() - } - - return MustBeApi(apiSet) - } - } -} - -private suspend fun McProject.referencesFromDependencies( - sourceSetName: SourceSetName -): Set { - return sourceSetName.withUpstream(this) - .flatMapToSet { sourceSetOrUpstream -> - - val declarationsInProject = declarations() - .get(sourceSetOrUpstream, includeUpstream = true) - - jvmFilesForSourceSetName(sourceSetOrUpstream) - .flatMapListConcat { jvmFile -> - - jvmFile.apiReferences.await() - .filterNot { declarationsInProject.contains(it) } - } - } -} - -suspend fun McProject.mustBeApiIn( - dependentProject: McProject, - sourceSetName: SourceSetName, - isTestFixtures: Boolean -): Boolean { - // `testApi` and `androidTestApi` are not valid configurations - if (sourceSetName.isTestingOnly(dependentProject.sourceSets)) return false - - val referencesFromDependencies = dependentProject.referencesFromDependencies(sourceSetName) - val directDependencies = sourceSetName.withUpstream(dependentProject) - .flatMap { sourceSetOrUpstream -> - dependentProject.projectDependencies[sourceSetOrUpstream] - .map { it.project() } - } - return mustBeApiIn( - dependentProject = dependentProject, - referencesFromDependencies = referencesFromDependencies, - sourceSetName = sourceSetName, - isTestFixtures = isTestFixtures, - directMainDependencies = directDependencies - ) -} - -private suspend fun McProject.mustBeApiIn( - dependentProject: McProject, - referencesFromDependencies: Set, - sourceSetName: SourceSetName, - isTestFixtures: Boolean, - directMainDependencies: List -): Boolean { - suspend fun McProject.declarations(isTestFixtures: Boolean): LazySet { - return if (isTestFixtures) { - declarations().get(SourceSetName.TEST_FIXTURES, includeUpstream = false) - } else { - sourceSetName.withUpstream(dependentProject) - .map { declarations().get(it, false) } - .let { lazySet(it) } - } - } - - val declarations = declarations(isTestFixtures) - - val rTypeMatcher = "^R(?:\\.\\w+)?$".toRegex() - - val (rTypes, nonRTypeReferences) = referencesFromDependencies - .partition { it is UnqualifiedAndroidResourceReferenceName } - - nonRTypeReferences - .firstOrNull { ref -> - declarations.contains(ref) - } - ?.also { return true } - - val rTypesFromExisting: LazyDeferred> = lazyDeferred { - directMainDependencies - .mapAsync { directProject -> - directProject.declarations(isTestFixtures = false) - .filter { rType -> rTypeMatcher.matches(rType.name) } - } - .flattenMerge() - .toSet() - } - - return rTypes.asFlow() - .filter { declarations.contains(it) } - .any { rReference -> rTypesFromExisting.await().contains(rReference) } -} - -/** - * @return Returns a [ConfiguredDependency] with an `-api` variant configuration - * if the dependency should be `api`, or `-implementation` otherwise. - * @since 0.12.0 - */ -suspend inline fun T.maybeAsApi(dependentProject: McProject): T { - val mustBeApi = when (val dep: ConfiguredDependency = this@maybeAsApi) { - is ExternalDependency -> false - is ProjectDependency -> when { - configurationName.isKapt() -> false - else -> dep.project(dependentProject.projectCache) - .mustBeApiIn( - dependentProject = dependentProject, - sourceSetName = configurationName.toSourceSetName(), - isTestFixtures = isTestFixture - ) - } - } - - val newConfig = when { - mustBeApi -> configurationName.apiVariant() - configurationName.isKapt() -> configurationName.kaptVariant() - else -> configurationName.implementationVariant() - } - - return copy(configurationName = newConfig) as T -} - -data class InheritedDependencyWithSource( - val projectDependency: ProjectDependency, - val source: ProjectDependency? -) - -suspend fun ProjectContext.mustBeApi(): MustBeApi = get(MustBeApi) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/PublicDependencies.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/PublicDependencies.kt deleted file mode 100644 index 3c87749156..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/PublicDependencies.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.allValues - -data class PublicDependencies( - private val delegate: Set -) : Set by delegate, - ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): PublicDependencies { - return PublicDependencies( - project.allPublicClassPathDependencyDeclarations() - ) - } - - private fun McProject.allPublicClassPathDependencyDeclarations( - includePrivate: Boolean = true - ): Set { - val privateDependencies = if (includePrivate) { - projectDependencies.allValues() - } else { - emptyList() - } - - val combined = privateDependencies + projectDependencies[ConfigurationName.api] - .orEmpty() - - val inherited = combined - .flatMap { cpd -> - cpd - .project() - .allPublicClassPathDependencyDeclarations(false) - } - - return inherited - .plus(combined) - .toSet() - } - } -} - -suspend fun ProjectContext.publicDependencies(): PublicDependencies = get(PublicDependencies) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/References.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/References.kt deleted file mode 100644 index 3e77af08c3..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/References.kt +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import kotlinx.coroutines.flow.toList -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.ReferenceName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.ProjectContext.Element -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.coroutines.mapAsync -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.lazySet -import modulecheck.utils.lazy.toLazySet - -data class References( - private val delegate: SafeCache>, - private val project: McProject -) : Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): LazySet { - - return project.sourceSets - .keys - .mapAsync { get(it) } - .toList() - .let { lazySet(it) } - } - - suspend fun get(sourceSetName: SourceSetName): LazySet { - return delegate.getOrPut(sourceSetName) { fetchNewReferences(sourceSetName) } - } - - private suspend fun fetchNewReferences(sourceSetName: SourceSetName): LazySet { - - return project.jvmFilesForSourceSetName(sourceSetName) - .toList() - .plus(project.layoutFilesForSourceSetName(sourceSetName)) - .plus(project.androidStylesFilesForSourceSetName(sourceSetName)) - .plus(listOfNotNull(project.manifestFileForSourceSetName(sourceSetName))) - .map { it.references } - .toLazySet() - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): References { - - return References( - SafeCache(listOf(project.projectPath, References::class)), - project - ) - } - } -} - -suspend fun ProjectContext.references(): References = get(References) - -suspend fun ProjectContext.referencesForSourceSetName( - sourceSetName: SourceSetName -): LazySet = references().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ResSourceFiles.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/ResSourceFiles.kt deleted file mode 100644 index a8b7716f40..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ResSourceFiles.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import java.io.File - -data class ResSourceFiles( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): Set { - return project.sourceSets.keys - .flatMap { get(it) } - .toSet() - } - - suspend fun get(sourceSetName: SourceSetName): Set { - return delegate.getOrPut(sourceSetName) { - project.sourceSets[sourceSetName] - ?.resourceFiles - .orEmpty() - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): ResSourceFiles { - return ResSourceFiles(SafeCache(listOf(project.projectPath, ResSourceFiles::class)), project) - } - } -} - -suspend fun ProjectContext.resSourceFiles(): ResSourceFiles = get(ResSourceFiles) -suspend fun ProjectContext.resourceFilesForSourceSetName(sourceSetName: SourceSetName): Set = - resSourceFiles().get(sourceSetName) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ResolvedDeclaredNames.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/ResolvedDeclaredNames.kt deleted file mode 100644 index 05eff803d9..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/ResolvedDeclaredNames.kt +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.api.context.ResolvedDeclaredNames.SourceResult.Found -import modulecheck.api.context.ResolvedDeclaredNames.SourceResult.NOT_PRESENT -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ResolvableMcName -import modulecheck.parsing.source.getNameOrNull -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.project.project -import modulecheck.utils.cache.SafeCache - -class ResolvedDeclaredNames private constructor( - private val delegate: SafeCache, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - internal sealed interface SourceResult { - data class Found(val sourceProject: McProjectWithSourceSetName) : SourceResult - object NOT_PRESENT : SourceResult - } - - data class McProjectWithSourceSetName( - val project: McProject, - val sourceSetName: SourceSetName, - val declaration: QualifiedDeclaredName - ) - - suspend fun getSource( - name: ResolvableMcName, - sourceSetName: SourceSetName - ): McProjectWithSourceSetName? { - val nameInSourceSet = NameInSourceSet(name, sourceSetName) - - val existing = delegate - .getOrPut(nameInSourceSet) { fetchNewSource(name, sourceSetName) } - - return (existing as? Found)?.sourceProject - } - - private suspend fun fetchNewSource( - name: ResolvableMcName, - sourceSetName: SourceSetName - ): SourceResult { - - return sourceSetName.withUpstream(project) - .firstNotNullOfOrNull { sourceSetOrUpstream -> - - project.declarations() - .get(sourceSetOrUpstream, includeUpstream = false) - .getNameOrNull(name) - ?.let { - Found( - McProjectWithSourceSetName( - project = project, - sourceSetName = sourceSetOrUpstream, - declaration = it - ) - ) - } - } ?: project.classpathDependencies() - .get(sourceSetName) - .asSequence() - .map { it.contributed } - .distinctBy { it.project(project) to it.isTestFixture } - .firstNotNullOfOrNull { sourceCpd -> - - listOfNotNull( - SourceSetName.MAIN, - SourceSetName.TEST_FIXTURES.takeIf { sourceCpd.isTestFixture } - ) - .firstNotNullOfOrNull { dependencySourceSetName -> - sourceCpd.project(project) - .resolvedDeclaredNames() - .getSource(name, dependencySourceSetName) - } - } - ?.let { Found(it) } - ?: NOT_PRESENT - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): ResolvedDeclaredNames { - return ResolvedDeclaredNames( - SafeCache(listOf(project.projectPath, ResolvedDeclaredNames::class)), - project - ) - } - } - - private data class NameInSourceSet( - val name: ResolvableMcName, - val sourceSetName: SourceSetName - ) -} - -suspend fun ProjectContext.resolvedDeclaredNames(): ResolvedDeclaredNames = - get(ResolvedDeclaredNames) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/SourceSetDependencies.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/SourceSetDependencies.kt deleted file mode 100644 index eade3b4ecc..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/SourceSetDependencies.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.TransitiveProjectDependency -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache - -data class SourceSetDependencies( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun get(sourceSetName: SourceSetName): List { - return delegate.getOrPut(sourceSetName) { project.fullTree(sourceSetName) } - } - - private suspend fun McProject.fullTree( - sourceSetName: SourceSetName - ): List { - - fun sourceConfigs(isTestFixtures: Boolean): Set = setOfNotNull( - SourceSetName.MAIN, - SourceSetName.TEST_FIXTURES.takeIf { isTestFixtures } - ) - - val directDependencies = projectDependencies[sourceSetName] - .filterNot { it.projectPath == project.projectPath } - .toSet() - - val directDependencyPaths = directDependencies.map { it.projectPath }.toSet() - - val inherited = directDependencies.flatMap { sourceCpd -> - sourceConfigs(sourceCpd.isTestFixture) - .flatMap { dependencySourceSetName -> - - sourceCpd.project() - .sourceSetDependencies() - .get(dependencySourceSetName) - .filterNot { it.contributed.projectPath in directDependencyPaths } - .map { transitiveCpd -> - TransitiveProjectDependency(sourceCpd, transitiveCpd.contributed) - } - } - } - .toSet() - - val directTransitive = directDependencies.map { TransitiveProjectDependency(it, it) } - - val mainFromTestFixtures = directDependencies.filter { it.isTestFixture } - .map { TransitiveProjectDependency(it, it.copy(isTestFixture = false)) } - - return directTransitive + inherited + mainFromTestFixtures - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): SourceSetDependencies { - return SourceSetDependencies( - SafeCache(listOf(project.projectPath, SourceSetDependencies::class)), - project - ) - } - } -} - -suspend fun ProjectContext.sourceSetDependencies(): SourceSetDependencies = - get(SourceSetDependencies) diff --git a/modulecheck-api/src/main/kotlin/modulecheck/api/context/uses.kt b/modulecheck-api/src/main/kotlin/modulecheck/api/context/uses.kt deleted file mode 100644 index 99d6537ad9..0000000000 --- a/modulecheck-api/src/main/kotlin/modulecheck/api/context/uses.kt +++ /dev/null @@ -1,137 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.api.context - -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ExternalDependency.ExternalCodeGeneratorDependency -import modulecheck.model.dependency.ExternalDependency.ExternalRuntimeDependency -import modulecheck.model.dependency.MightHaveCodeGeneratorBinding -import modulecheck.model.dependency.ProjectDependency.CodeGeneratorProjectDependency -import modulecheck.model.dependency.ProjectDependency.RuntimeProjectDependency -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.Generated -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazySet - -suspend fun McProject.uses(dependency: ConfiguredDependency): Boolean { - - return when (dependency) { - is RuntimeProjectDependency -> usesRuntimeDependency(dependency) - is ExternalRuntimeDependency -> { - // External runtime dependencies aren't parsed yet, so treat them all as used. - true - } - - is ExternalCodeGeneratorDependency -> usesCodeGenDependency(dependency) - is CodeGeneratorProjectDependency -> usesCodeGenDependency(dependency) - } -} - -private suspend fun McProject.usesCodeGenDependency( - dependency: T -): Boolean where T : ConfiguredDependency, - T : MightHaveCodeGeneratorBinding { - - val codeGeneratorBinding = dependency.codeGeneratorBindingOrNull - // If the dependency doesn't have a binding, default to treating it as used - ?: return true - - val referencesSourceSetName = dependency.configurationName.toSourceSetName() - - val refs = referencesForSourceSetName(referencesSourceSetName) - - return codeGeneratorBinding.annotationNames - .any { annotationName -> - val split = annotationName.split('.') - - refs.contains( - DeclaredName.agnostic( - packageName = PackageName(split.dropLast(1).joinToString(".")), - simpleNames = listOf(split.last().asSimpleName()) - ) - ) - } -} - -private suspend fun McProject.usesRuntimeDependency(dependency: RuntimeProjectDependency): Boolean { - - val dependencyDeclarations = dependency.declarations(projectCache) - - val referencesSourceSetName = dependency.configurationName.toSourceSetName() - - val refs = referencesForSourceSetName(referencesSourceSetName) - - // Check whether human-written code references the dependency first. - val usedInStaticSource = refs.containsAny(dependencyDeclarations) - - if (usedInStaticSource) return true - - // Any references in the receiver project's generated code - // which reference a declaration from this dependency - val generatedRefs = generatedDeclarations( - sourceSetName = referencesSourceSetName, - sourceDeclarations = dependencyDeclarations - ) - - val usedForGeneration = when { - generatedRefs.isEmpty() -> false - refs.containsAny(generatedRefs) -> true - else -> generationIsUsedDownstream( - generatedRefs = generatedRefs, - referencesSourceSetName = referencesSourceSetName - ) - } - - if (usedForGeneration) return true - - // If there are no references is manually/human written static code, then parse the Anvil graph. - val anvilContributions = dependency.project() - .anvilScopeContributionsForSourceSetName(SourceSetName.MAIN) - - return anvilGraph() - .mergedScopeNames() - .any { anvilContributions.containsKey(it) } -} - -private suspend fun McProject.generationIsUsedDownstream( - generatedRefs: LazySet, - referencesSourceSetName: SourceSetName -): Boolean { - - return dependents() - .asSequence() - .map { downstreamDependency -> - - val downstreamProject = projectCache.getValue(downstreamDependency.dependentProjectPath) - val downstreamSourceSet = downstreamDependency.projectDependency - .declaringSourceSetName(downstreamProject.sourceSets) - - downstreamProject to downstreamSourceSet - } - .filter { (_, downstreamSourceSet: SourceSetName) -> - downstreamSourceSet == referencesSourceSetName - } - .distinct() - .any { (downstreamProject, downstreamSourceSet) -> - - downstreamProject - .referencesForSourceSetName(downstreamSourceSet) - .containsAny(generatedRefs) - } -} diff --git a/modulecheck-config/api/api/api.api b/modulecheck-config/api/api/api.api deleted file mode 100644 index 1444e76914..0000000000 --- a/modulecheck-config/api/api/api.api +++ /dev/null @@ -1,218 +0,0 @@ -public final class modulecheck/api/KaptMatcher { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/api/KaptMatcher; - public static synthetic fun copy$default (Lmodulecheck/api/KaptMatcher;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/api/KaptMatcher; - public fun equals (Ljava/lang/Object;)Z - public final fun getAnnotationImports ()Ljava/util/List; - public final fun getName ()Ljava/lang/String; - public final fun getProcessor ()Ljava/lang/String; - public fun hashCode ()I - public final fun toCodeGeneratorBinding ()Lmodulecheck/config/CodeGeneratorBinding$AnnotationProcessor; - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/config/ChecksSettings { - public static final field ANVIL_FACTORY_GENERATION_DEFAULT Z - public static final field Companion Lmodulecheck/config/ChecksSettings$Companion; - public static final field DEPTHS_DEFAULT Z - public static final field DISABLE_ANDROID_RESOURCES_DEFAULT Z - public static final field DISABLE_VIEW_BINDING_DEFAULT Z - public static final field INHERITED_DEPENDENCY_DEFAULT Z - public static final field MUST_BE_API_DEFAULT Z - public static final field OVERSHOT_DEPENDENCY_DEFAULT Z - public static final field REDUNDANT_DEPENDENCY_DEFAULT Z - public static final field SORT_DEPENDENCIES_DEFAULT Z - public static final field SORT_PLUGINS_DEFAULT Z - public static final field UNUSED_DEPENDENCY_DEFAULT Z - public static final field UNUSED_KAPT_DEFAULT Z - public static final field UNUSED_KOTLIN_ANDROID_EXTENSIONS_DEFAULT Z - public abstract fun getAnvilFactoryGeneration ()Z - public abstract fun getDepths ()Z - public abstract fun getDisableAndroidResources ()Z - public abstract fun getDisableViewBinding ()Z - public abstract fun getInheritedDependency ()Z - public abstract fun getMustBeApi ()Z - public abstract fun getOverShotDependency ()Z - public abstract fun getRedundantDependency ()Z - public abstract fun getSortDependencies ()Z - public abstract fun getSortPlugins ()Z - public abstract fun getUnusedDependency ()Z - public abstract fun getUnusedKapt ()Z - public abstract fun getUnusedKotlinAndroidExtensions ()Z - public abstract fun setAnvilFactoryGeneration (Z)V - public abstract fun setDepths (Z)V - public abstract fun setDisableAndroidResources (Z)V - public abstract fun setDisableViewBinding (Z)V - public abstract fun setInheritedDependency (Z)V - public abstract fun setMustBeApi (Z)V - public abstract fun setOverShotDependency (Z)V - public abstract fun setRedundantDependency (Z)V - public abstract fun setSortDependencies (Z)V - public abstract fun setSortPlugins (Z)V - public abstract fun setUnusedDependency (Z)V - public abstract fun setUnusedKapt (Z)V - public abstract fun setUnusedKotlinAndroidExtensions (Z)V -} - -public final class modulecheck/config/ChecksSettings$Companion { - public static final field ANVIL_FACTORY_GENERATION_DEFAULT Z - public static final field DEPTHS_DEFAULT Z - public static final field DISABLE_ANDROID_RESOURCES_DEFAULT Z - public static final field DISABLE_VIEW_BINDING_DEFAULT Z - public static final field INHERITED_DEPENDENCY_DEFAULT Z - public static final field MUST_BE_API_DEFAULT Z - public static final field OVERSHOT_DEPENDENCY_DEFAULT Z - public static final field REDUNDANT_DEPENDENCY_DEFAULT Z - public static final field SORT_DEPENDENCIES_DEFAULT Z - public static final field SORT_PLUGINS_DEFAULT Z - public static final field UNUSED_DEPENDENCY_DEFAULT Z - public static final field UNUSED_KAPT_DEFAULT Z - public static final field UNUSED_KOTLIN_ANDROID_EXTENSIONS_DEFAULT Z -} - -public abstract class modulecheck/config/CodeGeneratorBinding : modulecheck/model/dependency/CodeGenerator { - public synthetic fun (Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getBaseConfigNames ()Ljava/util/List; - public fun getExtensionTypeName ()Ljava/lang/String; -} - -public final class modulecheck/config/CodeGeneratorBinding$AnnotationProcessor : modulecheck/config/CodeGeneratorBinding { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/config/CodeGeneratorBinding$AnnotationProcessor; - public static synthetic fun copy$default (Lmodulecheck/config/CodeGeneratorBinding$AnnotationProcessor;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/config/CodeGeneratorBinding$AnnotationProcessor; - public fun equals (Ljava/lang/Object;)Z - public fun getAnnotationNames ()Ljava/util/List; - public fun getGeneratorMavenCoordinates ()Ljava/lang/String; - public fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/CodeGeneratorBinding$AnvilExtension : modulecheck/config/CodeGeneratorBinding { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/config/CodeGeneratorBinding$AnvilExtension; - public static synthetic fun copy$default (Lmodulecheck/config/CodeGeneratorBinding$AnvilExtension;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/config/CodeGeneratorBinding$AnvilExtension; - public fun equals (Ljava/lang/Object;)Z - public fun getAnnotationNames ()Ljava/util/List; - public fun getGeneratorMavenCoordinates ()Ljava/lang/String; - public fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/CodeGeneratorBinding$KotlinCompilerPlugin : modulecheck/config/CodeGeneratorBinding { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/model/dependency/PluginDefinition;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Lmodulecheck/model/dependency/PluginDefinition; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/model/dependency/PluginDefinition;)Lmodulecheck/config/CodeGeneratorBinding$KotlinCompilerPlugin; - public static synthetic fun copy$default (Lmodulecheck/config/CodeGeneratorBinding$KotlinCompilerPlugin;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/model/dependency/PluginDefinition;ILjava/lang/Object;)Lmodulecheck/config/CodeGeneratorBinding$KotlinCompilerPlugin; - public fun equals (Ljava/lang/Object;)Z - public fun getAnnotationNames ()Ljava/util/List; - public fun getGeneratorMavenCoordinates ()Ljava/lang/String; - public final fun getGradlePlugin ()Lmodulecheck/model/dependency/PluginDefinition; - public fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/CodeGeneratorBinding$KspExtension : modulecheck/config/CodeGeneratorBinding { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/config/CodeGeneratorBinding$KspExtension; - public static synthetic fun copy$default (Lmodulecheck/config/CodeGeneratorBinding$KspExtension;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/config/CodeGeneratorBinding$KspExtension; - public fun equals (Ljava/lang/Object;)Z - public fun getAnnotationNames ()Ljava/util/List; - public fun getGeneratorMavenCoordinates ()Ljava/lang/String; - public fun getName ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/config/ModuleCheckSettings { - public abstract fun getAdditionalCodeGenerators ()Ljava/util/List; - public abstract fun getAdditionalKaptMatchers ()Ljava/util/List; - public abstract fun getChecks ()Lmodulecheck/config/ChecksSettings; - public abstract fun getDeleteUnused ()Z - public abstract fun getDoNotCheck ()Ljava/util/Set; - public abstract fun getIgnoreUnusedFinding ()Ljava/util/Set; - public abstract fun getReports ()Lmodulecheck/config/ReportsSettings; - public abstract fun getSort ()Lmodulecheck/config/SortSettings; - public abstract fun getTrace ()Z - public abstract fun setAdditionalCodeGenerators (Ljava/util/List;)V - public abstract fun setAdditionalKaptMatchers (Ljava/util/List;)V - public abstract fun setDeleteUnused (Z)V - public abstract fun setDoNotCheck (Ljava/util/Set;)V - public abstract fun setIgnoreUnusedFinding (Ljava/util/Set;)V - public abstract fun setTrace (Z)V -} - -public abstract interface class modulecheck/config/PerModuleReportSettings { - public abstract fun getEnabled ()Z - public abstract fun getOutputDir ()Ljava/lang/String; - public abstract fun setEnabled (Z)V - public abstract fun setOutputDir (Ljava/lang/String;)V -} - -public abstract interface class modulecheck/config/ReportSettings { - public abstract fun getEnabled ()Z - public abstract fun getOutputPath ()Ljava/lang/String; - public abstract fun setEnabled (Z)V - public abstract fun setOutputPath (Ljava/lang/String;)V -} - -public abstract interface class modulecheck/config/ReportsSettings { - public static final field CHECKSTYLE_ENABLED_DEFAULT Z - public static final field CHECKSTYLE_PATH_DEFAULT Ljava/lang/String; - public static final field Companion Lmodulecheck/config/ReportsSettings$Companion; - public static final field DEPTHS_ENABLED_DEFAULT Z - public static final field DEPTHS_PATH_DEFAULT Ljava/lang/String; - public static final field GRAPH_ENABLED_DEFAULT Z - public static final field SARIF_ENABLED_DEFAULT Z - public static final field SARIF_PATH_DEFAULT Ljava/lang/String; - public static final field TEXT_ENABLED_DEFAULT Z - public static final field TEXT_PATH_DEFAULT Ljava/lang/String; - public abstract fun getCheckstyle ()Lmodulecheck/config/ReportSettings; - public abstract fun getDepths ()Lmodulecheck/config/ReportSettings; - public abstract fun getGraphs ()Lmodulecheck/config/PerModuleReportSettings; - public abstract fun getSarif ()Lmodulecheck/config/ReportSettings; - public abstract fun getText ()Lmodulecheck/config/ReportSettings; -} - -public final class modulecheck/config/ReportsSettings$Companion { - public static final field CHECKSTYLE_ENABLED_DEFAULT Z - public static final field CHECKSTYLE_PATH_DEFAULT Ljava/lang/String; - public static final field DEPTHS_ENABLED_DEFAULT Z - public static final field DEPTHS_PATH_DEFAULT Ljava/lang/String; - public static final field GRAPH_ENABLED_DEFAULT Z - public static final field SARIF_ENABLED_DEFAULT Z - public static final field SARIF_PATH_DEFAULT Ljava/lang/String; - public static final field TEXT_ENABLED_DEFAULT Z - public static final field TEXT_PATH_DEFAULT Ljava/lang/String; -} - -public abstract interface class modulecheck/config/SortSettings { - public static final field Companion Lmodulecheck/config/SortSettings$Companion; - public abstract fun getDependencyComparators ()Ljava/util/List; - public abstract fun getPluginComparators ()Ljava/util/List; - public abstract fun setDependencyComparators (Ljava/util/List;)V - public abstract fun setPluginComparators (Ljava/util/List;)V -} - -public final class modulecheck/config/SortSettings$Companion { - public final fun getDEPENDENCY_COMPARATORS_DEFAULT ()Ljava/util/List; - public final fun getPLUGIN_COMPARATORS_DEFAULT ()Ljava/util/List; -} - diff --git a/modulecheck-config/api/build.gradle.kts b/modulecheck-config/api/build.gradle.kts deleted file mode 100644 index 9abec694a8..0000000000 --- a/modulecheck-config/api/build.gradle.kts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-config-api" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-model:dependency:api")) - - compileOnly(gradleApi()) - - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-config/api/src/main/kotlin/modulecheck/api/KaptMatcher.kt b/modulecheck-config/api/src/main/kotlin/modulecheck/api/KaptMatcher.kt deleted file mode 100644 index 67cc21a7e3..0000000000 --- a/modulecheck-config/api/src/main/kotlin/modulecheck/api/KaptMatcher.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("MatchingDeclarationName") - -package modulecheck.api - -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.CodeGeneratorBinding.AnnotationProcessor -import modulecheck.utils.remove - -@Deprecated("Use `modulecheck.config.CodeGeneratorBinding` instead.") -data class KaptMatcher( - val name: String, - val processor: String, - val annotationImports: List -) { - - fun toCodeGeneratorBinding(): AnnotationProcessor = CodeGeneratorBinding.AnnotationProcessor( - name = name, - generatorMavenCoordinates = processor, - annotationNames = annotationImports - .filterNot { it.contains("*") } - .map { importRegex -> - importRegex.remove("\\") - } - ) - - @Suppress("DEPRECATION") - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is KaptMatcher) return false - - if (processor != other.processor) return false - - return true - } - - override fun hashCode(): Int = processor.hashCode() - - override fun toString(): String { - return """ - |KaptMatcher( - | name='$name', - | processor='$processor', - | annotationImports=${annotationImports.joinToString("\n ", "\n ")} - |) - """.replaceIndentByMargin() - } -} diff --git a/modulecheck-config/api/src/main/kotlin/modulecheck/config/CodeGeneratorBinding.kt b/modulecheck-config/api/src/main/kotlin/modulecheck/config/CodeGeneratorBinding.kt deleted file mode 100644 index 8a4794640a..0000000000 --- a/modulecheck-config/api/src/main/kotlin/modulecheck/config/CodeGeneratorBinding.kt +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.config - -import modulecheck.model.dependency.CodeGenerator -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.PluginDefinition - -/** - * Models a special kind of dependency, where the symbols which determine - * whether it's "used" are actually provided by a different artifact. - * - * For instance, an annotation processor `com.example.foo:foo-generator` does not have any - * declarations which show up in a library's source code. Instead, it looks for annotations - * from `com.example.foo:foo-annotations` in order to trigger code generation. So, in order - * for us to determine whether `foo-generator` is used, we must look for those annotations. If - * there are no annotations, then `foo-generator` isn't triggered and could probably be removed. - * - * N.B. Code generators often evolve over time, adding new annotations. So if a - * defined generator is throwing a false positive saying it's unused, it's best - * to first check the list of [annotationNames] to make sure it's exhaustive. - * - * @since 0.12.0 - */ -// TODO (maybe) - 99.9% of code generators will be triggered by annotations, but technically they -// don't have to be. Code generators can be triggered by any symbol, such as keywords like `data` -// or `suspend`. Maybe expand this class to support other predicates, like `(File) -> Boolean` -// and/or a keyword matcher. -sealed class CodeGeneratorBinding( - /** - * The human-readable name for this type of extension, - * like 'annotation processor' or 'KSP extension' - * - * @since 0.12.0 - */ - override val extensionTypeName: String, - /** - * The configuration name(s) used when adding this extension to the "main" source set's - * compilation, such as `kapt`, `annotationProcessor`, `ksp`, or `anvil`. All other configuration - * names for downstream source sets are derived from these base names, like `kapt` -> `kaptTest`. - * - * This should almost always just be a single name. It's a List because - * annotations processors may be `kapt` or `annotationProcessor` depending - * upon whether they're applied to a Kotlin module or a pure Java one. - * - * @since 0.12.0 - */ - override val baseConfigNames: List -) : CodeGenerator { - - /** - * Represents an annotation processor like Dagger or Room, which could be used - * via `kapt` in a Kotlin library or `annotationProcessor` in a pure Java library. - * - * For any processor which also has a KSP implementation, - * that extension should just be listed twice. - * - * @since 0.12.0 - */ - data class AnnotationProcessor( - override val name: String, - override val generatorMavenCoordinates: String, - override val annotationNames: List - ) : CodeGeneratorBinding( - "annotation processor", - listOf(ConfigurationName.kapt, ConfigurationName.annotationProcessor) - ) - - /** - * Represents KSP extensions, like Moshi or Room. - * - * For any extension which also has annotation processor - * implementation, that extension should just be listed twice. - * - * @since 0.12.0 - */ - data class KspExtension( - override val name: String, - override val generatorMavenCoordinates: String, - override val annotationNames: List - ) : CodeGeneratorBinding( - "KSP extension", - listOf(ConfigurationName.ksp) - ) - - /** - * Represents code generators which **extend** Anvil's - * codegen functionality, but **not Anvil itself**. - * - * @see KotlinCompilerPlugin - * @since 0.12.0 - */ - data class AnvilExtension( - override val name: String, - override val generatorMavenCoordinates: String, - override val annotationNames: List - ) : CodeGeneratorBinding( - "Anvil extension", - listOf(ConfigurationName.anvil) - ) - - /** - * Pure Kotlin compiler plugins, like Anvil. - * - * @since 0.12.0 - */ - data class KotlinCompilerPlugin( - override val name: String, - override val generatorMavenCoordinates: String, - override val annotationNames: List, - val gradlePlugin: PluginDefinition - ) : CodeGeneratorBinding( - "Kotlin compiler plugin", - listOf(ConfigurationName.kotlinCompileClasspath) - ) -} diff --git a/modulecheck-config/api/src/main/kotlin/modulecheck/config/ModuleCheckSettings.kt b/modulecheck-config/api/src/main/kotlin/modulecheck/config/ModuleCheckSettings.kt deleted file mode 100644 index 71aa452b1e..0000000000 --- a/modulecheck-config/api/src/main/kotlin/modulecheck/config/ModuleCheckSettings.kt +++ /dev/null @@ -1,234 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("DEPRECATION") - -package modulecheck.config - -import modulecheck.api.KaptMatcher - -interface ModuleCheckSettings { - - /** - * If true, ModuleCheck will delete declarations of unused dependencies entirely. - * - * If false, ModuleCheck will comment out declarations of unused dependencies. - * - * Default value is false. - * - * @since 0.12.0 - */ - var deleteUnused: Boolean - - /** - * If true, ModuleCheck will collect a trace of expensive and delicate - * operations. This trace is added to any thrown exceptions. Tracing - * is disabled by default, as it does incur a performance penalty. - * - * Default value is false - * - * @since 0.12.0 - */ - var trace: Boolean - - /** - * Set of modules which are allowed to be unused. - * - * For instance, given: - * - * ``` - * ignoreUnusedFinding = setOf(":core") - * ``` - * - * If a module declares `:core` as a dependency but does not use it, no finding will be reported. - * - * @since 0.12.0 - */ - var ignoreUnusedFinding: Set - - /** - * Set of modules which will not be excluded from error reporting. The most common use-case - * would be if the module is the root of a dependency graph, like an Android application - * module, and it needs everything in its classpath for dependency injection purposes. - * - * @since 0.12.0 - */ - var doNotCheck: Set - - /** - * List of [KaptMatcher]'s to be checked, which aren't included by default with ModuleCheck. - * - * @since 0.12.0 - */ - @Suppress("DEPRECATION") - @Deprecated("use additionalCodeGenerators instead") - var additionalKaptMatchers: List - - /** - * List of [CodeGeneratorBinding]'s to be checked, - * which aren't included by default with ModuleCheck. - * - * ``` - * moduleCheck { - * additionalCompilerExtensions = listOf( - * modulecheck.config.CompilerExtension.AnnotationProcessor( - * name = "My Processor", - * generatorMavenCoordinates = "my-project.codegen:processor", - * annotationNames = listOf( - * "myproject.MyInject", - * "myproject.MyInject.Factory", - * "myproject.MyInjectParam", - * "myproject.MyInjectModule" - * ) - * ) - * ) - * } - * ``` - * - * @since 0.12.0 - */ - var additionalCodeGenerators: List - - val checks: ChecksSettings - - val sort: SortSettings - - /** - * Configures reporting options - * - * @since 0.12.0 - */ - val reports: ReportsSettings -} - -interface SortSettings { - var pluginComparators: List - var dependencyComparators: List - - companion object { - - val PLUGIN_COMPARATORS_DEFAULT: List = listOf( - """id\("com\.android.*"\)""", - """id\("android-.*"\)""", - """id\("java-library"\)""", - """kotlin\("jvm"\)""", - """android.*""", - """javaLibrary.*""", - """kotlin.*""", - """id.*""" - ) - val DEPENDENCY_COMPARATORS_DEFAULT: List = listOf( - """.*""", - """kapt.*""" - ) - } -} - -interface ChecksSettings { - var redundantDependency: Boolean - var unusedDependency: Boolean - var overShotDependency: Boolean - var mustBeApi: Boolean - var inheritedDependency: Boolean - var sortDependencies: Boolean - var sortPlugins: Boolean - var unusedKapt: Boolean - var anvilFactoryGeneration: Boolean - var disableAndroidResources: Boolean - var disableViewBinding: Boolean - var unusedKotlinAndroidExtensions: Boolean - var depths: Boolean - - companion object { - - const val REDUNDANT_DEPENDENCY_DEFAULT: Boolean = false - const val UNUSED_DEPENDENCY_DEFAULT: Boolean = true - const val OVERSHOT_DEPENDENCY_DEFAULT: Boolean = true - const val MUST_BE_API_DEFAULT: Boolean = true - const val INHERITED_DEPENDENCY_DEFAULT: Boolean = true - const val SORT_DEPENDENCIES_DEFAULT: Boolean = false - const val SORT_PLUGINS_DEFAULT: Boolean = false - const val UNUSED_KAPT_DEFAULT: Boolean = true - const val UNUSED_KOTLIN_ANDROID_EXTENSIONS_DEFAULT: Boolean = false - const val ANVIL_FACTORY_GENERATION_DEFAULT: Boolean = true - const val DISABLE_ANDROID_RESOURCES_DEFAULT: Boolean = false - const val DISABLE_VIEW_BINDING_DEFAULT: Boolean = false - const val DEPTHS_DEFAULT: Boolean = false - } -} - -interface ReportsSettings { - - /** - * checkstyle-formatted xml report - * - * @since 0.12.0 - */ - val checkstyle: ReportSettings - - /** - * SARIF-formatted report - * - * @since 0.12.0 - */ - val sarif: ReportSettings - - /** - * plain-text report file matching the console output - * - * @since 0.12.0 - */ - val text: ReportSettings - - /** - * report of the depth for each source set for each module - * - * @since 0.12.0 - */ - val depths: ReportSettings - - /** - * create dependency graphs for each source set for each module - * - * @since 0.12.0 - */ - val graphs: PerModuleReportSettings - - companion object { - const val CHECKSTYLE_ENABLED_DEFAULT: Boolean = false - const val CHECKSTYLE_PATH_DEFAULT: String = "build/reports/modulecheck/report.xml" - - const val TEXT_ENABLED_DEFAULT: Boolean = false - const val TEXT_PATH_DEFAULT: String = "build/reports/modulecheck/report.txt" - - const val DEPTHS_ENABLED_DEFAULT: Boolean = false - const val DEPTHS_PATH_DEFAULT: String = "build/reports/modulecheck/depths.txt" - - const val SARIF_ENABLED_DEFAULT: Boolean = false - const val SARIF_PATH_DEFAULT: String = "build/reports/modulecheck/modulecheck.sarif" - - const val GRAPH_ENABLED_DEFAULT: Boolean = false - } -} - -interface ReportSettings { - var enabled: Boolean - var outputPath: String -} - -interface PerModuleReportSettings { - var enabled: Boolean - var outputDir: String? -} diff --git a/modulecheck-config/fake/api/fake.api b/modulecheck-config/fake/api/fake.api deleted file mode 100644 index 88f5c337e2..0000000000 --- a/modulecheck-config/fake/api/fake.api +++ /dev/null @@ -1,155 +0,0 @@ -public final class modulecheck/config/fake/TestChecksSettings : modulecheck/config/ChecksSettings { - public fun ()V - public fun (ZZZZZZZZZZZZZ)V - public synthetic fun (ZZZZZZZZZZZZZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Z - public final fun component10 ()Z - public final fun component11 ()Z - public final fun component12 ()Z - public final fun component13 ()Z - public final fun component2 ()Z - public final fun component3 ()Z - public final fun component4 ()Z - public final fun component5 ()Z - public final fun component6 ()Z - public final fun component7 ()Z - public final fun component8 ()Z - public final fun component9 ()Z - public final fun copy (ZZZZZZZZZZZZZ)Lmodulecheck/config/fake/TestChecksSettings; - public static synthetic fun copy$default (Lmodulecheck/config/fake/TestChecksSettings;ZZZZZZZZZZZZZILjava/lang/Object;)Lmodulecheck/config/fake/TestChecksSettings; - public fun equals (Ljava/lang/Object;)Z - public fun getAnvilFactoryGeneration ()Z - public fun getDepths ()Z - public fun getDisableAndroidResources ()Z - public fun getDisableViewBinding ()Z - public fun getInheritedDependency ()Z - public fun getMustBeApi ()Z - public fun getOverShotDependency ()Z - public fun getRedundantDependency ()Z - public fun getSortDependencies ()Z - public fun getSortPlugins ()Z - public fun getUnusedDependency ()Z - public fun getUnusedKapt ()Z - public fun getUnusedKotlinAndroidExtensions ()Z - public fun hashCode ()I - public fun setAnvilFactoryGeneration (Z)V - public fun setDepths (Z)V - public fun setDisableAndroidResources (Z)V - public fun setDisableViewBinding (Z)V - public fun setInheritedDependency (Z)V - public fun setMustBeApi (Z)V - public fun setOverShotDependency (Z)V - public fun setRedundantDependency (Z)V - public fun setSortDependencies (Z)V - public fun setSortPlugins (Z)V - public fun setUnusedDependency (Z)V - public fun setUnusedKapt (Z)V - public fun setUnusedKotlinAndroidExtensions (Z)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/fake/TestPerModuleReportSettings : modulecheck/config/PerModuleReportSettings { - public fun (ZLjava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;)Lmodulecheck/config/fake/TestPerModuleReportSettings; - public static synthetic fun copy$default (Lmodulecheck/config/fake/TestPerModuleReportSettings;ZLjava/lang/String;ILjava/lang/Object;)Lmodulecheck/config/fake/TestPerModuleReportSettings; - public fun equals (Ljava/lang/Object;)Z - public fun getEnabled ()Z - public fun getOutputDir ()Ljava/lang/String; - public fun hashCode ()I - public fun setEnabled (Z)V - public fun setOutputDir (Ljava/lang/String;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/fake/TestReportSettings : modulecheck/config/ReportSettings { - public fun (ZLjava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;)Lmodulecheck/config/fake/TestReportSettings; - public static synthetic fun copy$default (Lmodulecheck/config/fake/TestReportSettings;ZLjava/lang/String;ILjava/lang/Object;)Lmodulecheck/config/fake/TestReportSettings; - public fun equals (Ljava/lang/Object;)Z - public fun getEnabled ()Z - public fun getOutputPath ()Ljava/lang/String; - public fun hashCode ()I - public fun setEnabled (Z)V - public fun setOutputPath (Ljava/lang/String;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/fake/TestReportsSettings : modulecheck/config/ReportsSettings { - public fun ()V - public fun (Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/PerModuleReportSettings;)V - public synthetic fun (Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/PerModuleReportSettings;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/config/ReportSettings; - public final fun component2 ()Lmodulecheck/config/ReportSettings; - public final fun component3 ()Lmodulecheck/config/ReportSettings; - public final fun component4 ()Lmodulecheck/config/ReportSettings; - public final fun component5 ()Lmodulecheck/config/PerModuleReportSettings; - public final fun copy (Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/PerModuleReportSettings;)Lmodulecheck/config/fake/TestReportsSettings; - public static synthetic fun copy$default (Lmodulecheck/config/fake/TestReportsSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/ReportSettings;Lmodulecheck/config/PerModuleReportSettings;ILjava/lang/Object;)Lmodulecheck/config/fake/TestReportsSettings; - public fun equals (Ljava/lang/Object;)Z - public fun getCheckstyle ()Lmodulecheck/config/ReportSettings; - public fun getDepths ()Lmodulecheck/config/ReportSettings; - public fun getGraphs ()Lmodulecheck/config/PerModuleReportSettings; - public fun getSarif ()Lmodulecheck/config/ReportSettings; - public fun getText ()Lmodulecheck/config/ReportSettings; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/fake/TestSettings : modulecheck/config/ModuleCheckSettings { - public fun ()V - public fun (ZZLjava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Lmodulecheck/config/ChecksSettings;Lmodulecheck/config/SortSettings;Lmodulecheck/config/ReportsSettings;)V - public synthetic fun (ZZLjava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Lmodulecheck/config/ChecksSettings;Lmodulecheck/config/SortSettings;Lmodulecheck/config/ReportsSettings;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun checks (Lkotlin/jvm/functions/Function1;)V - public final fun component1 ()Z - public final fun component2 ()Z - public final fun component3 ()Ljava/util/Set; - public final fun component4 ()Ljava/util/Set; - public final fun component5 ()Ljava/util/List; - public final fun component6 ()Ljava/util/List; - public final fun component7 ()Lmodulecheck/config/ChecksSettings; - public final fun component8 ()Lmodulecheck/config/SortSettings; - public final fun component9 ()Lmodulecheck/config/ReportsSettings; - public final fun copy (ZZLjava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Lmodulecheck/config/ChecksSettings;Lmodulecheck/config/SortSettings;Lmodulecheck/config/ReportsSettings;)Lmodulecheck/config/fake/TestSettings; - public static synthetic fun copy$default (Lmodulecheck/config/fake/TestSettings;ZZLjava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Lmodulecheck/config/ChecksSettings;Lmodulecheck/config/SortSettings;Lmodulecheck/config/ReportsSettings;ILjava/lang/Object;)Lmodulecheck/config/fake/TestSettings; - public fun equals (Ljava/lang/Object;)Z - public fun getAdditionalCodeGenerators ()Ljava/util/List; - public fun getAdditionalKaptMatchers ()Ljava/util/List; - public fun getChecks ()Lmodulecheck/config/ChecksSettings; - public fun getDeleteUnused ()Z - public fun getDoNotCheck ()Ljava/util/Set; - public fun getIgnoreUnusedFinding ()Ljava/util/Set; - public fun getReports ()Lmodulecheck/config/ReportsSettings; - public fun getSort ()Lmodulecheck/config/SortSettings; - public fun getTrace ()Z - public fun hashCode ()I - public fun setAdditionalCodeGenerators (Ljava/util/List;)V - public fun setAdditionalKaptMatchers (Ljava/util/List;)V - public fun setDeleteUnused (Z)V - public fun setDoNotCheck (Ljava/util/Set;)V - public fun setIgnoreUnusedFinding (Ljava/util/Set;)V - public fun setTrace (Z)V - public final fun sort (Lkotlin/jvm/functions/Function1;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/config/fake/TestSortSettings : modulecheck/config/SortSettings { - public fun ()V - public fun (Ljava/util/List;Ljava/util/List;)V - public synthetic fun (Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/util/List; - public final fun copy (Ljava/util/List;Ljava/util/List;)Lmodulecheck/config/fake/TestSortSettings; - public static synthetic fun copy$default (Lmodulecheck/config/fake/TestSortSettings;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/config/fake/TestSortSettings; - public fun equals (Ljava/lang/Object;)Z - public fun getDependencyComparators ()Ljava/util/List; - public fun getPluginComparators ()Ljava/util/List; - public fun hashCode ()I - public fun setDependencyComparators (Ljava/util/List;)V - public fun setPluginComparators (Ljava/util/List;)V - public fun toString ()Ljava/lang/String; -} - diff --git a/modulecheck-config/fake/build.gradle.kts b/modulecheck-config/fake/build.gradle.kts deleted file mode 100644 index ef0f497557..0000000000 --- a/modulecheck-config/fake/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-config-fake" - ) - anvil() -} - -dependencies { - - api(project(path = ":modulecheck-config:api")) - - compileOnly(gradleApi()) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-config/fake/src/main/kotlin/modulecheck/config/fake/TestSettings.kt b/modulecheck-config/fake/src/main/kotlin/modulecheck/config/fake/TestSettings.kt deleted file mode 100644 index 087039bf21..0000000000 --- a/modulecheck-config/fake/src/main/kotlin/modulecheck/config/fake/TestSettings.kt +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("DEPRECATION") - -package modulecheck.config.fake - -import modulecheck.api.KaptMatcher -import modulecheck.config.ChecksSettings -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.ModuleCheckSettings -import modulecheck.config.PerModuleReportSettings -import modulecheck.config.ReportSettings -import modulecheck.config.ReportsSettings -import modulecheck.config.SortSettings - -@Suppress("UNUSED_PARAMETER") -data class TestSettings( - override var deleteUnused: Boolean = false, - override var trace: Boolean = false, - override var ignoreUnusedFinding: Set = emptySet(), - override var doNotCheck: Set = emptySet(), - @Deprecated("use additionalCodeGenerators instead") - override var additionalKaptMatchers: List = emptyList(), - override var additionalCodeGenerators: List = emptyList(), - override val checks: ChecksSettings = TestChecksSettings(), - override val sort: SortSettings = TestSortSettings(), - override val reports: ReportsSettings = TestReportsSettings() -) : ModuleCheckSettings { - @Suppress("UNUSED") - fun checks(block: ChecksSettings.() -> Unit): Unit = Unit - - @Suppress("UNUSED") - fun sort(block: SortSettings.() -> Unit): Unit = Unit -} - -data class TestChecksSettings( - override var redundantDependency: Boolean = ChecksSettings.REDUNDANT_DEPENDENCY_DEFAULT, - override var unusedDependency: Boolean = ChecksSettings.UNUSED_DEPENDENCY_DEFAULT, - override var overShotDependency: Boolean = ChecksSettings.OVERSHOT_DEPENDENCY_DEFAULT, - override var mustBeApi: Boolean = ChecksSettings.MUST_BE_API_DEFAULT, - override var inheritedDependency: Boolean = ChecksSettings.INHERITED_DEPENDENCY_DEFAULT, - override var sortDependencies: Boolean = ChecksSettings.SORT_DEPENDENCIES_DEFAULT, - override var sortPlugins: Boolean = ChecksSettings.SORT_PLUGINS_DEFAULT, - override var unusedKapt: Boolean = ChecksSettings.UNUSED_KAPT_DEFAULT, - override var anvilFactoryGeneration: Boolean = ChecksSettings.ANVIL_FACTORY_GENERATION_DEFAULT, - override var disableAndroidResources: Boolean = ChecksSettings.DISABLE_ANDROID_RESOURCES_DEFAULT, - override var disableViewBinding: Boolean = ChecksSettings.DISABLE_VIEW_BINDING_DEFAULT, - override var unusedKotlinAndroidExtensions: Boolean = ChecksSettings.UNUSED_KOTLIN_ANDROID_EXTENSIONS_DEFAULT, - override var depths: Boolean = ChecksSettings.DEPTHS_DEFAULT -) : ChecksSettings - -data class TestSortSettings( - override var pluginComparators: List = SortSettings.PLUGIN_COMPARATORS_DEFAULT, - override var dependencyComparators: List = SortSettings.DEPENDENCY_COMPARATORS_DEFAULT -) : SortSettings - -data class TestReportsSettings( - override val checkstyle: ReportSettings = TestReportSettings( - ReportsSettings.CHECKSTYLE_ENABLED_DEFAULT, - ReportsSettings.CHECKSTYLE_PATH_DEFAULT - ), - override val sarif: ReportSettings = TestReportSettings( - ReportsSettings.SARIF_ENABLED_DEFAULT, - ReportsSettings.SARIF_PATH_DEFAULT - ), - override val text: ReportSettings = TestReportSettings( - ReportsSettings.TEXT_ENABLED_DEFAULT, - ReportsSettings.TEXT_PATH_DEFAULT - ), - override val depths: ReportSettings = TestReportSettings( - ReportsSettings.DEPTHS_ENABLED_DEFAULT, - ReportsSettings.DEPTHS_PATH_DEFAULT - ), - override val graphs: PerModuleReportSettings = TestPerModuleReportSettings( - enabled = ReportsSettings.GRAPH_ENABLED_DEFAULT, - outputDir = null - ) -) : ReportsSettings - -data class TestReportSettings( - override var enabled: Boolean, - override var outputPath: String -) : ReportSettings - -data class TestPerModuleReportSettings( - override var enabled: Boolean, - override var outputDir: String? -) : PerModuleReportSettings diff --git a/modulecheck-config/impl/api/impl.api b/modulecheck-config/impl/api/impl.api deleted file mode 100644 index 743b64c752..0000000000 --- a/modulecheck-config/impl/api/impl.api +++ /dev/null @@ -1,28 +0,0 @@ -public final class anvil/hint/Modulecheck_config_internal_CodeGeneratorBindingsModule_66130738Kt { - public static final fun getModulecheck_config_internal_CodeGeneratorBindingsModule_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_config_internal_CodeGeneratorBindingsModule_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/config/internal/CodeGeneratorBindingsModule { - public static final field INSTANCE Lmodulecheck/config/internal/CodeGeneratorBindingsModule; - public final fun provideCodeGeneratorBindings (Lmodulecheck/config/ModuleCheckSettings;)Ljava/util/List; -} - -public final class modulecheck/config/internal/CodeGeneratorBindingsModule_ProvideCodeGeneratorBindingsFactory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/config/internal/CodeGeneratorBindingsModule_ProvideCodeGeneratorBindingsFactory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/config/internal/CodeGeneratorBindingsModule_ProvideCodeGeneratorBindingsFactory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Ljava/util/List; - public static final fun provideCodeGeneratorBindings (Lmodulecheck/config/ModuleCheckSettings;)Ljava/util/List; -} - -public final class modulecheck/config/internal/CodeGeneratorBindingsModule_ProvideCodeGeneratorBindingsFactory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/config/internal/CodeGeneratorBindingsModule_ProvideCodeGeneratorBindingsFactory; - public final fun provideCodeGeneratorBindings (Lmodulecheck/config/ModuleCheckSettings;)Ljava/util/List; -} - -public final class modulecheck/config/internal/DefaultCodeGeneratorBindingsKt { - public static final fun defaultCodeGeneratorBindings ()Ljava/util/List; -} - diff --git a/modulecheck-config/impl/build.gradle.kts b/modulecheck-config/impl/build.gradle.kts deleted file mode 100644 index a493141a69..0000000000 --- a/modulecheck-config/impl/build.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-config-impl" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-dagger")) - - compileOnly(gradleApi()) - - implementation(project(path = ":modulecheck-model:dependency:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-config/impl/src/main/kotlin/modulecheck/config/internal/CodeGeneratorBindingsModule.kt b/modulecheck-config/impl/src/main/kotlin/modulecheck/config/internal/CodeGeneratorBindingsModule.kt deleted file mode 100644 index c13bfb46c5..0000000000 --- a/modulecheck-config/impl/src/main/kotlin/modulecheck/config/internal/CodeGeneratorBindingsModule.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.config.internal - -import com.squareup.anvil.annotations.ContributesTo -import dagger.Provides -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.ModuleCheckSettings -import modulecheck.dagger.DaggerList -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.CodeGenerator -import modulecheck.utils.mapToSet - -/** - * Dagger bindings for [CodeGenerator] - * - * @since 0.12.0 - */ -@dagger.Module -@ContributesTo(TaskScope::class) -object CodeGeneratorBindingsModule { - - /** - * @return the default [CodeGeneratorBindings][defaultCodeGeneratorBindings] - * with custom ones defined in [ModuleCheckSettings] - * @since 0.12.0 - */ - @Provides - fun provideCodeGeneratorBindings( - settings: ModuleCheckSettings - ): DaggerList { - return settings.additionalCodeGenerators - .plus(defaultCodeGeneratorBindings()) - .plus( - @Suppress("DEPRECATION") - settings.additionalKaptMatchers.mapToSet { it.toCodeGeneratorBinding() } - ) - } -} diff --git a/modulecheck-config/impl/src/main/kotlin/modulecheck/config/internal/defaultCodeGeneratorBindings.kt b/modulecheck-config/impl/src/main/kotlin/modulecheck/config/internal/defaultCodeGeneratorBindings.kt deleted file mode 100644 index 24bdf2148a..0000000000 --- a/modulecheck-config/impl/src/main/kotlin/modulecheck/config/internal/defaultCodeGeneratorBindings.kt +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.config.internal - -import modulecheck.config.CodeGeneratorBinding -import modulecheck.model.dependency.PluginDefinition - -fun defaultCodeGeneratorBindings(): List = listOf( - CodeGeneratorBinding.KotlinCompilerPlugin( - name = "Anvil", - generatorMavenCoordinates = "com.squareup.anvil:compiler", - annotationNames = listOf( - "com.squareup.anvil.annotations.ContributesBinding", - "com.squareup.anvil.annotations.ContributesMultibinding", - "com.squareup.anvil.annotations.ContributesSubcomponent", - "com.squareup.anvil.annotations.ContributesTo", - "com.squareup.anvil.annotations.MergeComponent", - "com.squareup.anvil.annotations.MergeSubcomponent", - "com.squareup.anvil.annotations.compat.MergeInterfaces", - "com.squareup.anvil.annotations.compat.MergeModules", - "dagger.Binds", - "dagger.BindsInstance", - "dagger.Component", - "dagger.Module", - "dagger.assisted.Assisted", - "dagger.assisted.AssistedFactory", - "dagger.assisted.AssistedInject", - "dagger.multibindings.IntoMap", - "dagger.multibindings.IntoSet", - "javax.inject.Inject" - ), - gradlePlugin = PluginDefinition( - name = "Anvil", - qualifiedId = "com.squareup.anvil", - legacyIdOrNull = null, - precompiledAccessorOrNull = null, - kotlinFunctionArgumentOrNull = null - ) - ), - CodeGeneratorBinding.KotlinCompilerPlugin( - name = "Kotlin Parcelize", - generatorMavenCoordinates = "com.squareup.anvil:compiler", - annotationNames = listOf( - "kotlinx.parcelize.Parcelize" - ), - gradlePlugin = PluginDefinition( - name = "Kotlin Parcelize", - qualifiedId = "org.jetbrains.kotlin.plugin.parcelize", - legacyIdOrNull = "kotlin-parcelize", - precompiledAccessorOrNull = null, - kotlinFunctionArgumentOrNull = "parcelize" - ) - ), - CodeGeneratorBinding.AnvilExtension( - name = "Tangle Core", - generatorMavenCoordinates = "com.rickbusarow.tangle:tangle-compiler", - annotationNames = listOf( - "tangle.inject.TangleParam", - "tangle.inject.TangleScope" - ) - ), - CodeGeneratorBinding.AnvilExtension( - name = "Tangle Fragments", - generatorMavenCoordinates = "com.rickbusarow.tangle:tangle-fragment-compiler", - annotationNames = listOf( - "tangle.fragment.ContributesFragment", - "tangle.fragment.FragmentInject", - "tangle.fragment.FragmentInjectFactory", - "tangle.fragment.FragmentKey", - "tangle.fragment.TangleFragmentProviderMap" - ) - ), - CodeGeneratorBinding.AnvilExtension( - name = "Tangle ViewModels", - generatorMavenCoordinates = "com.rickbusarow.tangle:tangle-viewmodel-compiler", - annotationNames = listOf( - "tangle.viewmodel.TangleViewModelProviderMap", - "tangle.viewmodel.VMInject" - ) - ), - CodeGeneratorBinding.AnvilExtension( - name = "Tangle Work", - generatorMavenCoordinates = "com.rickbusarow.tangle:tangle-work-compiler", - annotationNames = listOf( - "tangle.work.TangleAssistedWorkerFactoryMap", - "tangle.work.TangleWorker" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Dagger Hilt", - generatorMavenCoordinates = "com.google.dagger:hilt-compiler", - annotationNames = listOf( - "dagger.hilt.DefineComponent", - "dagger.hilt.EntryPoint", - "dagger.hilt.InstallIn" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Dagger Hilt Android", - generatorMavenCoordinates = "com.google.dagger:hilt-android-compiler", - annotationNames = listOf( - "dagger.hilt.DefineComponent", - "dagger.hilt.EntryPoint", - "dagger.hilt.InstallIn", - "dagger.hilt.android.AndroidEntryPoint", - "dagger.hilt.android.HiltAndroidApp", - "dagger.hilt.android.WithFragmentBindings" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Moshi Kotlin codegen (kapt)", - generatorMavenCoordinates = "com.squareup.moshi:moshi-kotlin-codegen", - annotationNames = listOf( - "com.squareup.moshi.Json", - "com.squareup.moshi.JsonClass" - ) - ), - CodeGeneratorBinding.KspExtension( - name = "Moshi Kotlin codegen (KSP)", - generatorMavenCoordinates = "com.squareup.moshi:moshi-kotlin-codegen", - annotationNames = listOf( - "com.squareup.moshi.Json", - "com.squareup.moshi.JsonClass" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Dagger", - generatorMavenCoordinates = "com.google.dagger:dagger-compiler", - annotationNames = listOf( - "javax.inject.Inject", - "dagger.Binds", - "dagger.Module", - "dagger.multibindings.IntoMap", - "dagger.multibindings.IntoSet", - "dagger.BindsInstance", - "dagger.Component", - "dagger.assisted.Assisted", - "dagger.assisted.AssistedInject", - "dagger.assisted.AssistedFactory", - "com.squareup.anvil.annotations.ContributesTo", - "com.squareup.anvil.annotations.MergeComponent", - "com.squareup.anvil.annotations.MergeSubomponent" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Dagger Android", - generatorMavenCoordinates = "com.google.dagger:dagger-android-processor", - annotationNames = listOf( - "dagger.android.ContributesAndroidInjector" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Inflation Inject (Square)", - generatorMavenCoordinates = "com.squareup.inject:inflation-inject-processor", - annotationNames = listOf( - "com.squareup.inject.inflation.InflationInject", - "com.squareup.inject.inflation.InflationInjectModule" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Inflation Inject (Cash App)", - generatorMavenCoordinates = "app.cash.inject:inflation-inject-processor", - annotationNames = listOf( - "app.cash.inject.inflation.InflationInject", - "app.cash.inject.inflation.InflationModule", - "app.cash.inject.inflation.ViewFactory" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Assisted Inject Dagger (Legacy Square library)", - generatorMavenCoordinates = "com.squareup.inject:assisted-inject-processor-dagger2", - annotationNames = listOf( - "com.squareup.inject.assisted.dagger2.AssistedModule" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Assisted Inject (Legacy Square library)", - generatorMavenCoordinates = "com.squareup.inject:assisted-inject-processor", - annotationNames = listOf( - "com.squareup.inject.assisted.AssistedInject", - "com.squareup.inject.assisted.AssistedInject.Factory", - "com.squareup.inject.assisted.Assisted" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Roomigrant", - generatorMavenCoordinates = "com.github.MatrixDev.Roomigrant:RoomigrantCompiler", - annotationNames = listOf( - "dev.matrix.roomigrant.GenerateRoomMigrations", - "dev.matrix.roomigrant.rules.FieldMigrationRule", - "dev.matrix.roomigrant.rules.OnMigrationEndRule", - "dev.matrix.roomigrant.rules.OnMigrationStartRule" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Room (annotation processor)", - generatorMavenCoordinates = "androidx.room:room-compiler", - annotationNames = listOf( - "androidx.room.Database" - ) - ), - CodeGeneratorBinding.KspExtension( - name = "Room (KSP)", - generatorMavenCoordinates = "androidx.room:room-compiler", - annotationNames = listOf( - "androidx.room.Database" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "AutoService (annotation processor)", - generatorMavenCoordinates = "com.google.auto.service:auto-service", - annotationNames = listOf( - "com.google.auto.service.AutoService" - ) - ), - CodeGeneratorBinding.KspExtension( - name = "AutoService (Zac Sweers KSP)", - generatorMavenCoordinates = "dev.zacsweers.autoservice:compiler", - annotationNames = listOf( - "com.google.auto.service.AutoService" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "AutoFactory", - generatorMavenCoordinates = "com.google.auto.factory:auto-factory", - annotationNames = listOf( - "com.google.auto.factory.AutoFactory" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Gradle Incap Helper", - generatorMavenCoordinates = "net.ltgt.gradle.incap:incap-processor", - annotationNames = listOf( - "net.ltgt.gradle.incap.IncrementalAnnotationProcessor" - ) - ), - CodeGeneratorBinding.AnnotationProcessor( - name = "Epoxy", - generatorMavenCoordinates = "com.airbnb.android:epoxy-processor", - annotationNames = listOf( - "com.airbnb.epoxy.AfterPropsSet", - "com.airbnb.epoxy.AutoModel", - "com.airbnb.epoxy.CallbackProp", - "com.airbnb.epoxy.EpoxyAttribute", - "com.airbnb.epoxy.EpoxyDataBindingLayouts", - "com.airbnb.epoxy.EpoxyDataBindingPattern", - "com.airbnb.epoxy.EpoxyModelClass", - "com.airbnb.epoxy.ModelProp", - "com.airbnb.epoxy.ModelView", - "com.airbnb.epoxy.OnViewRecycled", - "com.airbnb.epoxy.OnVisibilityChanged", - "com.airbnb.epoxy.OnVisibilityStateChanged", - "com.airbnb.epoxy.PackageEpoxyConfig", - "com.airbnb.epoxy.PackageModelViewConfig", - "com.airbnb.epoxy.TextProp" - ) - ) -) diff --git a/modulecheck-core/api/modulecheck-core.api b/modulecheck-core/api/modulecheck-core.api deleted file mode 100644 index 51683bfb49..0000000000 --- a/modulecheck-core/api/modulecheck-core.api +++ /dev/null @@ -1,84 +0,0 @@ -public final class modulecheck/core/context/OverShotDependencies : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/core/context/OverShotDependencies$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/core/context/OverShotDependencies; - public static synthetic fun copy$default (Lmodulecheck/core/context/OverShotDependencies;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/core/context/OverShotDependencies; - public fun equals (Ljava/lang/Object;)Z - public final fun get-KxNpj4Q (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/core/context/OverShotDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/core/context/OverShotDependenciesKt { - public static final fun overshotDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/core/context/RedundantDependencies : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/core/context/RedundantDependencies$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/core/context/RedundantDependencies; - public static synthetic fun copy$default (Lmodulecheck/core/context/RedundantDependencies;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/core/context/RedundantDependencies; - public fun equals (Ljava/lang/Object;)Z - public final fun get-YJqa9SQ (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/core/context/RedundantDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/core/context/RedundantDependenciesKt { - public static final fun redundantDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/core/context/UnusedDependencies : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/core/context/UnusedDependencies$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/core/context/UnusedDependencies; - public static synthetic fun copy$default (Lmodulecheck/core/context/UnusedDependencies;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/core/context/UnusedDependencies; - public fun equals (Ljava/lang/Object;)Z - public final fun get-KxNpj4Q (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/core/context/UnusedDependencies$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/core/context/UnusedDependenciesKt { - public static final fun unusedDependencies (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/core/context/UnusedKaptProcessors : modulecheck/project/ProjectContext$Element { - public static final field Key Lmodulecheck/core/context/UnusedKaptProcessors$Key; - public fun (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)V - public final fun all (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun copy (Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;)Lmodulecheck/core/context/UnusedKaptProcessors; - public static synthetic fun copy$default (Lmodulecheck/core/context/UnusedKaptProcessors;Lmodulecheck/utils/cache/SafeCache;Lmodulecheck/project/McProject;ILjava/lang/Object;)Lmodulecheck/core/context/UnusedKaptProcessors; - public fun equals (Ljava/lang/Object;)Z - public final fun get-KxNpj4Q (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getKey ()Lmodulecheck/project/ProjectContext$Key; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/core/context/UnusedKaptProcessors$Key : modulecheck/project/ProjectContext$Key { - public fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/core/context/UnusedKaptProcessorsKt { - public static final fun unusedKaptProcessors (Lmodulecheck/project/ProjectContext;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - diff --git a/modulecheck-core/build.gradle.kts b/modulecheck-core/build.gradle.kts deleted file mode 100644 index a51d860e6b..0000000000 --- a/modulecheck-core/build.gradle.kts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-core" - ) - anvil() - - buildConfig("test") { - field("websiteDir") { rootDir.resolve("website").invariantSeparatorsPath } - } -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.rickBusarow.dispatch.core) - - api(project(path = ":modulecheck-finding:impl")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-utils:cache")) - - implementation(libs.kotlinx.coroutines.jvm) - implementation(libs.semVer) - - implementation(project(path = ":modulecheck-api")) - implementation(project(path = ":modulecheck-finding:name")) - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.rickBusarow.dispatch.test.core) - - testImplementation(project(path = ":modulecheck-config:api")) - testImplementation(project(path = ":modulecheck-config:fake")) - testImplementation(project(path = ":modulecheck-finding:api")) - testImplementation(project(path = ":modulecheck-internal-testing")) - testImplementation(project(path = ":modulecheck-parsing:source:api")) - testImplementation(project(path = ":modulecheck-project-generation:api")) - testImplementation(project(path = ":modulecheck-rule:api")) - testImplementation(project(path = ":modulecheck-rule:impl")) - testImplementation(project(path = ":modulecheck-rule:impl-factory")) - testImplementation(project(path = ":modulecheck-runtime:testing")) - testImplementation(project(path = ":modulecheck-utils:stdlib")) -} diff --git a/modulecheck-core/src/main/kotlin/modulecheck/core/context/OverShotDependencies.kt b/modulecheck-core/src/main/kotlin/modulecheck/core/context/OverShotDependencies.kt deleted file mode 100644 index b00ca7d520..0000000000 --- a/modulecheck-core/src/main/kotlin/modulecheck/core/context/OverShotDependencies.kt +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core.context - -import modulecheck.api.context.maybeAsApi -import modulecheck.api.context.uses -import modulecheck.finding.OverShotDependency -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency.Companion.copy -import modulecheck.model.dependency.toSourceSetDependency -import modulecheck.model.dependency.withDownStream -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.lazy.unsafeLazy -import modulecheck.utils.mapToSet - -data class OverShotDependencies( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): List { - return project.configurations.keys.flatMap { get(it) } - } - - suspend fun get(configurationName: ConfigurationName): List { - return delegate.getOrPut(configurationName) { - - project.unusedDependencies() - .get(configurationName) - .flatMap { unused -> - - val unusedCpd = unused.dependency - val unusedSsd = unusedCpd - .toSourceSetDependency(unused.configurationName.toSourceSetName()) - val unusedSourceSetName = unused.configurationName.toSourceSetName() - - val allUsedByConfigName = unusedSourceSetName - .withDownStream(project) - .mapNotNull { sourceSetName -> - - val existingDependencies by unsafeLazy { - project.projectDependencies[sourceSetName] - .mapToSet { it.toSourceSetDependency(sourceSetName) } - } - - val configName = unused.configurationName.switchSourceSet(sourceSetName) - - val seed = when { - - // If the SourceSet is the same as the original unused dependency, then the original - // must be testFixtures. Only check the non-testFixtures version. - sourceSetName == unusedSourceSetName -> sequenceOf(configName to false) - - // If the unused was testFixture, that testFixture source may be used downstream. - // So, check testFixture first, then the normal/main source. - unusedCpd.isTestFixture -> sequenceOf(configName to true, configName to false) - // If the unused wasn't a testFixture, then just check normal/main source. - else -> sequenceOf(configName to false) - } - - seed - .map { (configName, isTestFixture) -> - unused.dependency.copy( - configurationName = configName, - isTestFixture = isTestFixture - ) - } - .filterNot { - - val asSsd = it.toSourceSetDependency(sourceSetName) - - asSsd == unusedSsd || existingDependencies.contains(asSsd) - } - .firstNotNullOfOrNull { cpd -> - - cpd.takeIf { project.uses(it) } - } - } - .groupBy { it.configurationName } - - val allConfigs = allUsedByConfigName.keys - .mapNotNull { configurationName -> - project.configurations[configurationName] - } - .distinct() - - // Remove redundant configs - // For instance, don't add a `testImplementation` declaration if `implementation` is - // already being added. - val trimmedConfigs = allConfigs.filter { cfg -> - cfg.upstream.none { it in allConfigs } - } - - trimmedConfigs.flatMap { allUsedByConfigName.getValue(it.name) } - .filter { project.projectDependencies[it.configurationName]?.contains(it) != true } - .map { it to unused.dependency } - .toSet() - } - .map { (overshot, original) -> - - val newDependency = overshot.maybeAsApi(project) - - OverShotDependency( - dependentProject = project, - newDependency = newDependency, - oldDependency = original - ) - } - .sortedBy { it.newDependency.identifier.name } - // Only report each new path/configuration pair once. So we can add multiple dependencies - // for the `testImplementation` config, or multiple configurations of the `:lib1` project, - // but we'll only add `testImplementation(project(":lib1"))` once. - .distinctBy { it.newDependency.identifier to it.newDependency.configurationName } - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): OverShotDependencies { - - return OverShotDependencies( - SafeCache(listOf(project.projectPath, OverShotDependencies::class)), - project - ) - } - } -} - -suspend fun ProjectContext.overshotDependencies(): OverShotDependencies = get(OverShotDependencies) diff --git a/modulecheck-core/src/main/kotlin/modulecheck/core/context/RedundantDependencies.kt b/modulecheck-core/src/main/kotlin/modulecheck/core/context/RedundantDependencies.kt deleted file mode 100644 index 806b66d1f4..0000000000 --- a/modulecheck-core/src/main/kotlin/modulecheck/core/context/RedundantDependencies.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core.context - -import kotlinx.coroutines.flow.toList -import modulecheck.api.context.classpathDependencies -import modulecheck.finding.RedundantDependency -import modulecheck.model.dependency.javaConfigurationNames -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.coroutines.mapAsync - -data class RedundantDependencies( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): List { - return project.sourceSets - .keys - .mapAsync { get(it) } - .toList() - .flatten() - } - - suspend fun get(sourceSetName: SourceSetName): List { - - return delegate.getOrPut(sourceSetName) { - - val allDirect = sourceSetName.javaConfigurationNames() - .flatMap { project.projectDependencies[it].orEmpty() } - .toSet() - - val inheritedDependencyProjects = project - .classpathDependencies() - .get(sourceSetName) - .groupBy { it.contributed.projectPath } - - allDirect - .mapNotNull { direct -> - - val fromCpd = inheritedDependencyProjects[direct.projectPath] - ?.map { it.source } - ?: return@mapNotNull null - - RedundantDependency( - dependentProject = project, - dependency = direct, - configurationName = direct.configurationName, - from = fromCpd - ) - } - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): RedundantDependencies { - - return RedundantDependencies( - SafeCache(listOf(project.projectPath, RedundantDependencies::class)), - project - ) - } - } -} - -suspend fun ProjectContext.redundantDependencies(): RedundantDependencies = - get(RedundantDependencies) diff --git a/modulecheck-core/src/main/kotlin/modulecheck/core/context/UnusedDependencies.kt b/modulecheck-core/src/main/kotlin/modulecheck/core/context/UnusedDependencies.kt deleted file mode 100644 index 6bae1adae9..0000000000 --- a/modulecheck-core/src/main/kotlin/modulecheck/core/context/UnusedDependencies.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core.context - -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.flow.toSet -import modulecheck.api.context.uses -import modulecheck.finding.UnusedDependency -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.javaConfigurationNames -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.coroutines.filterAsync -import modulecheck.utils.coroutines.mapAsync - -data class UnusedDependencies( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - override val key: ProjectContext.Key - get() = Key - - suspend fun all(): List { - return project.sourceSets - .flatMap { it.key.javaConfigurationNames() } - .mapAsync { configurationName -> get(configurationName) } - .toList() - .flatten() - .distinct() - } - - suspend fun get(configurationName: ConfigurationName): Set { - - return delegate.getOrPut(configurationName) { - val external = project.externalDependencies[configurationName].orEmpty() - val internal = project.projectDependencies[configurationName].orEmpty() - - val dependencies = external + internal - - dependencies - // test configurations have the main source project as a dependency. - // without this filter, every project will report itself as unused. - .filterNot { cd -> (cd as? ProjectDependency)?.projectPath == project.projectPath } - .filterAsync { dependency -> - !project.uses(dependency) - } - .map { dependency -> - UnusedDependency( - dependentProject = project, - dependency = dependency, - dependencyIdentifier = dependency.identifier, - configurationName = dependency.configurationName - ) - } - .toSet() - } - } - - companion object Key : ProjectContext.Key { - override suspend operator fun invoke(project: McProject): UnusedDependencies { - - return UnusedDependencies( - SafeCache(listOf(project.projectPath, UnusedDependencies::class)), - project - ) - } - } -} - -suspend fun ProjectContext.unusedDependencies(): UnusedDependencies = get(UnusedDependencies) diff --git a/modulecheck-core/src/main/kotlin/modulecheck/core/context/UnusedKaptProcessors.kt b/modulecheck-core/src/main/kotlin/modulecheck/core/context/UnusedKaptProcessors.kt deleted file mode 100644 index dae782bd57..0000000000 --- a/modulecheck-core/src/main/kotlin/modulecheck/core/context/UnusedKaptProcessors.kt +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core.context - -import kotlinx.coroutines.flow.toList -import modulecheck.finding.FindingName -import modulecheck.finding.UnusedKaptProcessorFinding -import modulecheck.model.dependency.ConfigurationName -import modulecheck.project.McProject -import modulecheck.project.ProjectContext -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.coroutines.mapAsync -import modulecheck.utils.mapToSet - -/** - * Represents a data class that contains all unused Kapt processors in a project. - * - * @param delegate a [SafeCache] instance which manages a cache of - * configuration names to the associated unused Kapt processors. - * @param project the [McProject] for which the unused Kapt processors are retrieved. - */ -data class UnusedKaptProcessors( - private val delegate: SafeCache>, - private val project: McProject -) : ProjectContext.Element { - - /** Key used to identify this [UnusedKaptProcessors] instance within [ProjectContext]. */ - override val key: ProjectContext.Key - get() = Key - - /** - * Retrieves all unused Kapt processors in the project. - * - * @return A list of [UnusedKaptProcessorFinding]s - * representing all unused Kapt processors in the project. - */ - suspend fun all(): List { - return project - .configurations - .keys - .filter { it.isKapt() } - .mapAsync { configurationName -> get(configurationName) } - .toList() - .flatten() - .distinct() - } - - /** - * Retrieves the unused Kapt processors for a given configuration. - * - * @param configurationName The name of the configuration - * for which to retrieve the unused Kapt processors. - * @return A set of [UnusedKaptProcessorFinding]s representing - * the unused Kapt processors in the requested configuration. - */ - suspend fun get(configurationName: ConfigurationName): Set { - - return delegate.getOrPut(configurationName) { - - project.unusedDependencies() - .get(configurationName) - .mapToSet { unusedDependency -> - UnusedKaptProcessorFinding( - findingName = FindingName("unused-kapt-processor"), - dependentProject = project, - dependentPath = project.projectPath, - buildFile = project.buildFile, - oldDependency = unusedDependency.dependency, - configurationName = unusedDependency.configurationName - ) - } - } - } - - /** Key object used to identify [UnusedKaptProcessors] within [ProjectContext]. */ - companion object Key : ProjectContext.Key { - /** - * Creates a new instance of [UnusedKaptProcessors] for a given project. - * - * @param project The project for which to create the [UnusedKaptProcessors] instance. - * @return A new instance of [UnusedKaptProcessors]. - */ - override suspend operator fun invoke(project: McProject): UnusedKaptProcessors { - - return UnusedKaptProcessors( - SafeCache(listOf(project.projectPath, UnusedKaptProcessors::class)), - project - ) - } - } -} - -/** - * Extension function on [ProjectContext] to get [UnusedKaptProcessors] instance. - * - * @return The [UnusedKaptProcessors] instance for this context. - */ -suspend fun ProjectContext.unusedKaptProcessors(): UnusedKaptProcessors = get(UnusedKaptProcessors) diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/AnvilScopesTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/AnvilScopesTest.kt deleted file mode 100644 index 9e94763a46..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/AnvilScopesTest.kt +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.parsing.source.AnvilGradlePlugin -import modulecheck.runtime.test.ProjectFindingReport.unusedDependency -import modulecheck.runtime.test.RunnerTest -import net.swiftzer.semver.SemVer -import org.junit.jupiter.api.Test - -class AnvilScopesTest : RunnerTest() { - - @Test - fun `module which contributes anvil scopes should not be unused in module which merges that scope`() = - test { - - val lib1 = kotlinProject(":lib1") { - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), true) - - buildFile { - """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") - } - - dependencies { - implementation("javax.inject:javax.inject:1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.squareup.anvil.annotations.ContributesBinding - import javax.inject.Inject - - @ContributesBinding(Unit::class) - class Lib1FooImpl @Inject constructor(): Foo - - interface Foo - """ - ) - } - - kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), false) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - id("com.squareup.anvil") - } - - dependencies { - api(project(path = ":lib1")) - implementation("com.google.dagger:dagger:2.38.1") - kapt("com.google.dagger:dagger-compiler:2.38.1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.squareup.anvil.annotations.MergeComponent - - @MergeComponent(Unit::class) - interface AppComponent - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - } - - @Test - fun `module which contributes anvil scopes with named argument should not be unused in module which merges that scope`() = - test { - - val lib1 = kotlinProject(":lib1") { - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), true) - buildFile { - """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") - } - - dependencies { - implementation("javax.inject:javax.inject:1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.squareup.anvil.annotations.ContributesBinding - import javax.inject.Inject - - @ContributesBinding(scope = Unit::class) - class Lib1FooImpl @Inject constructor(): Foo - - interface Foo - """ - ) - } - - kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), false) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - id("com.squareup.anvil") - } - - dependencies { - api(project(path = ":lib1")) - implementation("com.google.dagger:dagger:2.38.1") - kapt("com.google.dagger:dagger-compiler:2.38.1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.squareup.anvil.annotations.MergeComponent - - @MergeComponent(scope = Unit::class) - interface AppComponent - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - } - - @Test - fun `module which contributes anvil scopes with named argument and wrong order should not be unused in module which merges that scope`() = - test { - - val lib1 = kotlinProject(":lib1") { - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), true) - buildFile { - """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") - } - - dependencies { - implementation("javax.inject:javax.inject:1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.squareup.anvil.annotations.ContributesBinding - import javax.inject.Inject - - @ContributesBinding(boundType = Foo::class, scope = Unit::class) - class Lib1FooImpl @Inject constructor(): Foo - - interface Foo - """ - ) - } - - kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), false) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - id("com.squareup.anvil") - } - - dependencies { - api(project(path = ":lib1")) - implementation("com.google.dagger:dagger:2.38.1") - kapt("com.google.dagger:dagger-compiler:2.38.1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.squareup.anvil.annotations.MergeComponent - - @MergeComponent(scope = Unit::class) - interface AppComponent - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - } - - @Test - fun `module which contributes anvil scopes should be unused in module which does not merge that scope`() = - test { - - val lib1 = kotlinProject(":lib1") { - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), true) - buildFile { - """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") - } - - dependencies { - implementation("javax.inject:javax.inject:1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.squareup.anvil.annotations.ContributesBinding - import javax.inject.Inject - - @ContributesBinding(boundType = Foo::class, scope = Unit::class) - class Lib1FooImpl @Inject constructor(): Foo - - interface Foo - """ - ) - } - - kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - anvilGradlePlugin = AnvilGradlePlugin(SemVer.parse("2.4.0"), false) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - id("com.squareup.anvil") - } - - dependencies { - api(project(path = ":lib1")) - implementation("com.google.dagger:dagger:2.38.1") - kapt("com.google.dagger:dagger-compiler:2.38.1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.squareup.anvil.annotations.MergeComponent - - // This is a different scope - @MergeComponent(scope = String::class) - interface AppComponent - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = "8, 3" - ) - ) - ) - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/CheckstyleReportingTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/CheckstyleReportingTest.kt deleted file mode 100644 index 0d9e854e55..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/CheckstyleReportingTest.kt +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.fake.TestSettings -import modulecheck.finding.CouldUseAnvilFinding -import modulecheck.finding.Finding.FindingResult -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import org.junit.jupiter.api.Test -import java.io.File - -internal class CheckstyleReportingTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings().apply { - reports.checkstyle.outputPath = File(workingDir, reports.checkstyle.outputPath).path - } - } - - @Test - fun `checkstyle report should not be created if disabled in settings`() = test { - - settings.reports.checkstyle.enabled = false - - val outputFile = File(settings.reports.checkstyle.outputPath) - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("some-name"), - dependentProject = kotlinProject(":lib1"), - buildFile = workingDir - ) - ) - ), - findingResultFactory = { _, _, _ -> - listOf( - FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("some-name"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = true - ) - ) - } - ).isSuccess shouldBe true - - outputFile.exists() shouldBe false - } - - @Test - fun `checkstyle report should be created if enabled in settings`() = test { - - settings.reports.checkstyle.enabled = true - - val outputFile = File(settings.reports.checkstyle.outputPath) - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("some-name"), - dependentProject = kotlinProject(":lib1"), - buildFile = workingDir - ) - ) - ), - findingResultFactory = { findings, _, _ -> - findings.map { - FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("some-name"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = true - ) - } - } - ).isSuccess shouldBe true - - outputFile shouldHaveText """ - - - - - - - """ - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/ConsoleReportingTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/ConsoleReportingTest.kt deleted file mode 100644 index 3ea039aac3..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/ConsoleReportingTest.kt +++ /dev/null @@ -1,206 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import io.kotest.matchers.string.shouldContain -import modulecheck.finding.CouldUseAnvilFinding -import modulecheck.finding.Finding.FindingResult -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.runtime.test.RunnerTest -import modulecheck.utils.remove -import org.junit.jupiter.api.Test -import java.io.File - -internal class ConsoleReportingTest : RunnerTest() { - - @Test - fun `zero findings should report '0 issues' to console`() = test { - - run( - autoCorrect = false, - findingFactory = findingFactory() - ) - - logger.collectReport() - .joinToString() - .clean() - .remove("\u200B") shouldBe "ModuleCheck found 0 issues" - } - - @Test - fun `one finding should report '1 issue' to console`() = test { - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib1"), - buildFile = File(workingDir, "lib1/build.gradle.kts") - ) - ) - ) - ) - - logger.collectReport() - .joinToString() - .clean() - .remove("\u200B") shouldBeNoTrimIndent """ - | :lib1 - | configuration dependency name source build file - | X com.google.dagger:dagger-compiler use-anvil-factory-generation /lib1/build.gradle.kts: - | - |ModuleCheck found 1 issue - """.trimMargin() - } - - @Test - fun `multiple findings should report 'n issues' to console`() = test { - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib1"), - buildFile = File(workingDir, "lib1/build.gradle.kts") - ), - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib2"), - buildFile = File(workingDir, "lib2/build.gradle.kts") - ) - ) - ) - ) - - logger.collectReport() - .joinToString() - .clean() - .remove("\u200B") shouldBeNoTrimIndent """ - | :lib1 - | configuration dependency name source build file - | X com.google.dagger:dagger-compiler use-anvil-factory-generation /lib1/build.gradle.kts: - | - | :lib2 - | configuration dependency name source build file - | X com.google.dagger:dagger-compiler use-anvil-factory-generation /lib2/build.gradle.kts: - | - |ModuleCheck found 2 issues - """.trimMargin() - } - - @Test - fun `non-zero findings should print suppression advice to console`() = test { - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib1"), - buildFile = File(workingDir, "lib1/build.gradle.kts") - ) - ) - ) - ) - - logger.collectReport() - .joinToString() shouldContain "To ignore any of these findings, " + - "annotate the dependency declaration with " + - """@Suppress("") in Kotlin, """ + - "or //noinspection in Groovy.\n" + - "See https://rbusarow.github.io/ModuleCheck/docs/suppressing-findings for more info." - } - - @Test - fun `zero findings should succeed`() = test { - - run( - autoCorrect = false, - findingFactory = findingFactory() - ).isSuccess shouldBe true - } - - @Test - fun `all findings fixed should succeed`() = test { - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib1"), - buildFile = File(workingDir, "lib1/build.gradle.kts") - ) - ) - ), - findingResultFactory = { _, _, _ -> - listOf( - FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("use-anvil-factory-generation"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = true - ) - ) - } - ).isSuccess shouldBe true - } - - @Test - fun `non-zero unfixed findings should fail`() = test { - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib1"), - buildFile = File(workingDir, "lib1/build.gradle.kts") - ) - ) - ), - findingResultFactory = { _, _, _ -> - listOf( - FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("use-anvil-factory-generation"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = false - ) - ) - } - ).isFailure shouldBe true - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/DepthOutputTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/DepthOutputTest.kt deleted file mode 100644 index 866ffdf887..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/DepthOutputTest.kt +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import com.rickbusarow.kase.Kase3 -import com.rickbusarow.kase.ParamTestEnvironmentFactory -import com.rickbusarow.kase.asTests -import com.rickbusarow.kase.kases -import io.kotest.matchers.file.shouldNotExist -import modulecheck.config.ModuleCheckSettings -import modulecheck.config.fake.TestChecksSettings -import modulecheck.config.fake.TestSettings -import modulecheck.model.dependency.ConfigurationName -import modulecheck.project.ProjectCache -import modulecheck.rule.impl.FindingFactoryImpl -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.utils.remove -import modulecheck.utils.resolve -import org.junit.jupiter.api.DynamicNode -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestFactory -import java.io.File -import java.util.stream.Stream - -internal class DepthOutputTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> ModuleCheckSettings = { - TestSettings( - checks = TestChecksSettings( - redundantDependency = false, - unusedDependency = false, - overShotDependency = false, - mustBeApi = false, - inheritedDependency = false, - sortDependencies = false, - sortPlugins = false, - unusedKapt = false, - anvilFactoryGeneration = false, - disableAndroidResources = false, - disableViewBinding = false, - unusedKotlinAndroidExtensions = false, - depths = true - ) - ).apply { - reports.depths.outputPath = File(workingDir, reports.depths.outputPath).path - reports.graphs.outputDir = workingDir.resolve("graphs").absolutePath - } - } - - val RunnerTestEnvironment.depthsOutput - get() = File(settings.reports.depths.outputPath) - - @Test - fun `main source set depths should be reported`() = test { - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run( - autoCorrect = false, - findingFactory = findingFactory - ) - - logger.collectReport() - .joinToString() - .clean() shouldBe """ - -- ModuleCheck main source set depth results -- - depth modules - 0 [:lib1] - 1 [:lib2] - 2 [:app] - - ModuleCheck found 0 issues - """ - } - - @Test - fun `reported depths should be from after fixes are applied`() = test { - - settings.checks.unusedDependency = true - settings.checks.depths = true - - val lib1 = kotlinProject(":lib1") - - kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - } - - run( - findingFactory = FindingFactoryImpl(rules) - ).isSuccess shouldBe true - - logger.collectReport() - .joinToString() - .clean() - .remove("\u200B") shouldBe """ - :lib2 - configuration dependency name source build file - ✔ implementation :lib1 unused-dependency /lib2/build.gradle.kts: (6, 3): - - -- ModuleCheck main source set depth results -- - depth modules - 0 [:lib1, :lib2] - - ModuleCheck found 1 issue - """ - } - - @Test - fun `test source set depths should not be reported`() = test { - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - lib1.addDependency(ConfigurationName("testImplementation"), lib2) - - run( - autoCorrect = false, - findingFactory = findingFactory - ) - - logger.collectReport() - .joinToString() - .clean() shouldBe """ - -- ModuleCheck main source set depth results -- - depth modules - 0 [:lib1] - 1 [:lib2] - 2 [:app] - - ModuleCheck found 0 issues - """ - } - - @Test - fun `debug source set depth should not be reported even if it's longer`() = test { - - val lib1 = kotlinProject(":lib1") - val debug1 = kotlinProject(":debug1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - val debug2 = kotlinProject(":debug2") { - addDependency(ConfigurationName.implementation, debug1) - addDependency(ConfigurationName.implementation, lib2) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - addDependency(ConfigurationName("debugImplementation"), debug2) - } - - run( - autoCorrect = false, - findingFactory = findingFactory - ) - - logger.collectReport() - .joinToString() - .clean() shouldBe """ - -- ModuleCheck main source set depth results -- - depth modules - 0 [:debug1, :lib1] - 1 [:lib2] - 2 [:app, :debug2] - - ModuleCheck found 0 issues - """ - } - - @TestFactory - fun `all outputs around depth findings should behave according to their own settings`() = - flags { (depthsConsole, depthsReport, graphsReport) -> - - settings.checks.depths = depthsConsole - settings.reports.depths.enabled = depthsReport - settings.reports.graphs.enabled = graphsReport - - if (graphsReport) { - settings.reports.graphs.outputDir = workingDir.resolve("graphs").absolutePath - } - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run().isSuccess shouldBe true - - val consoleOutput = logger.collectReport() - .joinToString() - .clean() - .remove("\u200B") - - if (depthsConsole || depthsReport || graphsReport) { - consoleOutput shouldBe """ - -- ModuleCheck main source set depth results -- - depth modules - 0 [:lib1] - 1 [:lib2] - 2 [:app] - - ModuleCheck found 0 issues - """ - } else { - consoleOutput shouldBe """ - ModuleCheck found 0 issues - """ - } - - if (depthsReport) { - depthsOutput shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - main 2 [:lib2] - - :lib2 - source set depth most expensive dependencies - main 1 [:lib1] - - """ - } else { - depthsOutput.shouldNotExist() - } - - if (graphsReport) { - workingDir.resolve("graphs", "app", "main.dot") shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":app" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - } else { - workingDir.resolve("graphs", "app", "main.dot").shouldNotExist() - } - } - - fun flags( - block: suspend RunnerTestEnvironment.(Kase3) -> Unit - ): Stream { - - return kases( - listOf(true, false), - listOf(true, false), - listOf(true, false), - displayNameFactory = { "depthsConsole: $a1 | depthsReport: $a2 | graphsReport: $a3" } - ) - .asTests( - testEnvironmentFactory = ParamTestEnvironmentFactory { kase, names, location -> - RunnerTestEnvironment( - projectCache = ProjectCache(), - logger = logger(), - ruleFilter = ruleFilter(), - settings = settings, - codeGeneratorBindings = codeGeneratorBindings, - rules = rules, - findingFactory = findingFactory, - names = names + kase.displayName, - testLocation = location - ) - }, - testAction = block - ) - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/DepthReportTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/DepthReportTest.kt deleted file mode 100644 index abe5c0ef89..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/DepthReportTest.kt +++ /dev/null @@ -1,362 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.ModuleCheckSettings -import modulecheck.config.fake.TestSettings -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.generation.maybeAddSourceSet -import modulecheck.rule.ModuleCheckRule -import modulecheck.rule.RuleFilter -import modulecheck.rule.impl.DepthRule -import modulecheck.rule.impl.FindingFactoryImpl -import modulecheck.rule.impl.UnusedDependencyRule -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.utils.remove -import org.junit.jupiter.api.Test -import java.io.File - -internal class DepthReportTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings().apply { - reports.depths.outputPath = File(workingDir, reports.depths.outputPath).path - } - } - - override val rules: (ModuleCheckSettings, RuleFilter) -> List> = { _, _ -> - listOf(DepthRule()) - } - - val RunnerTestEnvironment.outputFile - get() = File(settings.reports.depths.outputPath) - - @Test - fun `depth report should not be created if disabled in settings`() = test { - - settings.reports.depths.enabled = false - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - outputFile.exists() shouldBe false - } - - @Test - fun `depth report should be created if enabled in settings`() = test { - - settings.reports.depths.enabled = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - outputFile shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - main 2 [:lib2] - - :lib2 - source set depth most expensive dependencies - main 1 [:lib1] - - """ - } - - @Test - fun `depth report should include zero-depth source sets if they're not empty`() = test { - - settings.reports.depths.enabled = true - - val lib1 = kotlinProject(":lib1") { - addKotlinSource("", directory = "com/test", fileName = "MyFile.kt") - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - outputFile shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - main 2 [:lib2] - - :lib1 - source set depth most expensive dependencies - main 0 [] - - :lib2 - source set depth most expensive dependencies - main 1 [:lib1] - - """ - } - - @Test - fun `depth report should not include zero-depth source sets if they have no files`() = test { - - settings.reports.depths.enabled = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - outputFile shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - main 2 [:lib2] - - :lib2 - source set depth most expensive dependencies - main 1 [:lib1] - - """ - } - - @Test - fun `test source set depths should use the main depth of the dependency`() = test { - - settings.reports.depths.enabled = true - - val lib1 = kotlinProject(":lib1") { - maybeAddSourceSet(SourceSetName.TEST) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - lib1.addDependency(ConfigurationName("testImplementation"), lib2) - - run(autoCorrect = false).isSuccess shouldBe true - - outputFile shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - main 2 [:lib2] - - :lib1 - source set depth most expensive dependencies - test 2 [:lib2] - - :lib2 - source set depth most expensive dependencies - main 1 [:lib1] - - """ - } - - @Test - fun `depth report should be calculated after fixes are applied`() = test { - - settings.checks.depths = true - settings.reports.depths.enabled = true - - val lib1 = kotlinProject(":lib1") { - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - addKotlinSource( - """ - package com.modulecheck.lib2 - - class Lib2Class - """.trimIndent() - ) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - - addKotlinSource( - """ - package com.modulecheck.app - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class App { - private val lib1Class = Lib1Class() - private val lib2Class = Lib2Class() - } - """.trimIndent() - ) - } - - run( - findingFactory = FindingFactoryImpl( - listOf(DepthRule(), UnusedDependencyRule(settings)) - ), - rules = listOf(DepthRule(), UnusedDependencyRule(settings)) - ).isSuccess shouldBe true - - logger.collectReport() - .joinToString() - .clean() - .remove("\u200B") shouldBe """ - :lib2 - configuration dependency name source build file - ✔ implementation :lib1 unused-dependency /lib2/build.gradle.kts: (6, 3): - - -- ModuleCheck main source set depth results -- - depth modules - 0 [:lib1, :lib2] - 1 [:app] - - ModuleCheck found 1 issue - """ - - outputFile shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - main 1 [:lib1, :lib2] - - :lib1 - source set depth most expensive dependencies - main 0 [] - - :lib2 - source set depth most expensive dependencies - main 0 [] - - """ - } - - @Test - fun `debug source set depth should be reported`() = test { - - settings.reports.depths.enabled = true - - val lib1 = kotlinProject(":lib1") - val debug1 = kotlinProject(":debug1") { - addDependency(ConfigurationName.implementation, lib1) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - val debug2 = kotlinProject(":debug2") { - addDependency(ConfigurationName.implementation, debug1) - addDependency(ConfigurationName.implementation, lib2) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - addSourceSet(SourceSetName("debug")) - addDependency(ConfigurationName("debugImplementation"), debug2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - outputFile shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - debug 3 [:debug2] - main 2 [:lib2] - - :debug1 - source set depth most expensive dependencies - main 1 [:lib1] - - :debug2 - source set depth most expensive dependencies - main 2 [:debug1, :lib2] - - :lib2 - source set depth most expensive dependencies - main 1 [:lib1] - - """ - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/DisableAndroidResourcesTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/DisableAndroidResourcesTest.kt deleted file mode 100644 index 874543dd1f..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/DisableAndroidResourcesTest.kt +++ /dev/null @@ -1,1085 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.fake.TestChecksSettings -import modulecheck.config.fake.TestSettings -import modulecheck.model.dependency.ConfigurationName -import modulecheck.runtime.test.ProjectFindingReport.disableAndroidResources -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test - -class DisableAndroidResourcesTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings( - checks = TestChecksSettings(disableAndroidResources = true) - ) - } - - @Test - fun `resource generation is used in contributing module with no changes`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - addResourceFile( - "values/strings.xml", - """ - | MyApp - | - """.trimMargin() - ) - addKotlinSource( - """ - package com.modulecheck.lib1 - - val string = R.string.app_name - """ - ) - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `resource generation is used in dependent module with no changes`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addResourceFile( - "values/strings.xml", - """ - - MyApp - - """ - ) - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - platformPlugin.androidResourcesEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - val name = R.string.app_name - """ - ) - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused resource generation should be ignored in application module`() = test { - - val lib1 = androidApplication(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.application") - kotlin("android") - } - """ - } - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.application") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused resource generation should pass if suppressed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - @Suppress("disable-android-resources") - buildFeatures.androidResources = true - } - """ - } - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - @Suppress("disable-android-resources") - buildFeatures.androidResources = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused resource generation should be ignored in dynamic-feature module`() = test { - - val lib1 = androidDynamicFeature(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.dynamic-feature") - kotlin("android") - } - """ - } - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.dynamic-feature") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused resource generation should be ignored in test module`() = test { - - val lib1 = androidTest(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.test") - kotlin("android") - } - """ - } - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.test") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused resource generation without autocorrect should fail and be reported`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - } - - run(autoCorrect = false).isSuccess shouldBe false - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(false, null) - ) - ) - } - - @Test - fun `unused resource generation when scoped and then qualified should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - android { - buildFeatures.androidResources = true - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - android { - buildFeatures.androidResources = false - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, "6, 3") - ) - ) - } - - @Test - fun `unused resource generation without buildFeatures block should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - mindSdk(21) - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - mindSdk(21) - buildFeatures.androidResources = false - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, null) - ) - ) - } - - @Test - fun `unused resource generation without android block should add android block under existing plugins block -- kotlin`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures { - androidResources = false - } - } - - dependencies { - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, null) - ) - ) - } - - @Test - fun `unused resource generation without android block should add android block under existing plugins block -- groovy`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - - buildFile.delete() - buildFile = projectDir.resolve("build.gradle") - .createSafely( - """ - plugins { - id 'com.android.library' - id 'kotlin-android' - } - - dependencies { - } - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'com.android.library' - id 'kotlin-android' - } - - android { - buildFeatures { - androidResources = false - } - } - - dependencies { - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, null) - ) - ) - } - - @Test - fun `resource generation is used if R is imported locally`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - addSource( - "com/modulecheck/lib1/internal/Source.kt", - """ - package com.modulecheck.lib1.internal - - import com.modulecheck.lib1.R - - val r = R - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `resource generation is used if R is imported in downstream module`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - platformPlugin.androidResourcesEnabled = false - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures.androidResources = false - - dependencies { - api(project(":lib1")) - } - """ - } - addSource( - "com/modulecheck/lib2/internal/Source.kt", - """ - package com.modulecheck.lib1.internal - - import com.modulecheck.lib1.R - - val r = R - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `resource generation is used if a layout is used downstream`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - platformPlugin.viewBindingEnabled = true - - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - val layout = R.layout.fragment_lib1 - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `resource generation is used if an ID declared in a layout is used downstream`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - platformPlugin.viewBindingEnabled = true - - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - val id = R.id.fragment_container - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `resource generation is used if R is fully qualified without import in downstream module`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - platformPlugin.androidResourcesEnabled = false - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures.androidResources = false - - dependencies { - api(project(":lib1")) - } - """ - } - addSource( - "com/modulecheck/lib2/internal/Source.kt", - """ - package com.modulecheck.lib1.internal - - val r = com.modulecheck.lib1.R - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `resource generation is used if R is imported with alias in downstream module`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - platformPlugin.androidResourcesEnabled = false - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures.androidResources = false - - dependencies { - api(project(":lib1")) - } - """ - } - addSource( - "com/modulecheck/lib2/internal/Source.kt", - """ - package com.modulecheck.lib1.internal - - import com.modulecheck.lib1.R as Lib1R - - val r = Lib1R - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `resource generation is used in intermediary module if its R is imported with alias in downstream module`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - addResourceFile( - "values/strings.xml", - """ - | lib1 - | - """.trimMargin() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - platformPlugin.androidResourcesEnabled = false - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(":lib1")) - } - """ - } - addSource( - "com/modulecheck/lib2/internal/Source.kt", - """ - package com.modulecheck.lib1.internal - - import com.modulecheck.lib1.R as Lib1R - - val r = Lib1R - """ - ) - } - - androidLibrary(":lib3", "com.modulecheck.lib3") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - platformPlugin.androidResourcesEnabled = false - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures.androidResources = false - - dependencies { - implementation(project(":lib1")) - implementation(project(":lib2")) - } - """ - } - addSource( - "com/modulecheck/lib3/internal/Source.kt", - """ - package com.modulecheck.lib2.internal - - import com.modulecheck.lib2.R as lib2R - - val r = lib2R.string.lib1_name - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused resource generation without android or plugins block should add android block above dependencies block`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - apply(plugin = "com.android.library") - apply(plugin = "org.jetbrains.kotlin-android") - - dependencies { - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - apply(plugin = "com.android.library") - apply(plugin = "org.jetbrains.kotlin-android") - - android { - buildFeatures { - androidResources = false - } - } - - dependencies { - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, null) - ) - ) - } - - @Test - fun `unused resource generation when fully qualified should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - android.buildFeatures.androidResources = true - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - android.buildFeatures.androidResources = false - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, "5, 1") - ) - ) - } - - @Test - fun `unused resource generation when qualified and then scoped should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - android.buildFeatures { - androidResources = true - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - android.buildFeatures { - androidResources = false - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, "6, 3") - ) - ) - } - - @Test - fun `unused resource generation when fully scoped should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - android { - buildFeatures { - androidResources = true - } - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - android { - buildFeatures { - androidResources = false - } - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, "7, 5") - ) - ) - } - - @Test - fun `unused resource generation with autocorrect and no explicit buildFeatures property should be fixed`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures { - androidResources = false - } - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, null) - ) - ) - } - - @Test - fun `unused resource generation with autocorrect and no android block should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - } - - run().isSuccess shouldBe true - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - disableAndroidResources(true, null) - ) - ) - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures { - androidResources = false - } - } - """ - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/DisableViewBindingTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/DisableViewBindingTest.kt deleted file mode 100644 index 64e1e80443..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/DisableViewBindingTest.kt +++ /dev/null @@ -1,909 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.fake.TestChecksSettings -import modulecheck.config.fake.TestSettings -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.runtime.test.ProjectFindingReport.disableViewBinding -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test - -class DisableViewBindingTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings( - checks = TestChecksSettings(disableViewBinding = true) - ) - } - - @Test - fun `used ViewBinding from main sourceset in dependent module with no changes`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.databinding.FragmentLib1Binding - - val binding = FragmentLib1Binding() - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used ViewBinding from debug sourceset in dependent module with no changes`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """, - SourceSetName.DEBUG - ) - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency("debugImplementation".asConfigurationName(), lib1) - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.databinding.FragmentLib1Binding - - private val binding = FragmentLib1Binding() - """, - SourceSetName.DEBUG - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used ViewBinding in contributing module`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.modulecheck.lib1.databinding.FragmentLib1Binding - - val binding = FragmentLib1Binding() - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `ViewBinding from main is used in debug source set`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - - // Setting a debug base package, but it's never used. The inferred FqName for the generated - // binding should still reflect the main source set even though it's evaluating a file in - // debug. - platformPlugin.manifests[SourceSetName.DEBUG] = projectDir - .resolve("src/debug/AndroidManifest.xml") - .createSafely("") - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.modulecheck.lib1.databinding.FragmentLib1Binding - - val binding = FragmentLib1Binding() - """, - SourceSetName.DEBUG - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `ViewBinding from debug & release is used in main source set`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """, - SourceSetName.DEBUG - ) - addLayoutFile( - "fragment_lib1.xml", - """ - - - - - """, - SourceSetName.RELEASE - ) - - // Setting a debug base package, but it's never used. The inferred FqName for the generated - // binding should still reflect the main source set even though it's evaluating a file in - // debug. - platformPlugin.manifests[SourceSetName.DEBUG] = projectDir - .resolve("src/debug/AndroidManifest.xml") - .createSafely("") - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.modulecheck.lib1.databinding.FragmentLib1Binding - - val binding = FragmentLib1Binding() - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `ViewBinding from debug with different base package is used in debug source set`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """, - SourceSetName.DEBUG - ) - - platformPlugin.manifests[SourceSetName.DEBUG] = projectDir - .resolve("src/debug/AndroidManifest.xml") - .createSafely("") - - addKotlinSource( - """ - package com.modulecheck.lib1.debug - - import com.modulecheck.lib1.debug.databinding.FragmentLib1Binding - - val binding = FragmentLib1Binding() - """, - SourceSetName.DEBUG - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `ViewBinding from debug without different base package is used in debug source set`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """, - SourceSetName.DEBUG - ) - - // The layout file is in debug, so it's generated in debug. But it doesn't have a custom - // package for debug, so it should be generated using the base package from main. - - addKotlinSource( - """ - package com.modulecheck.lib1.debug - - import com.modulecheck.lib1.databinding.FragmentLib1Binding - - val binding = FragmentLib1Binding() - """, - SourceSetName.DEBUG - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused ViewBinding should pass if check is disabled`() = test { - - settings.checks.disableViewBinding = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused ViewBinding should pass if suppressed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - @Suppress("disable-view-binding") - buildFeatures.viewBinding = true - } - """ - } - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - @Suppress("disable-view-binding") - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused ViewBinding without auto-correct should fail`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(false, "7, 3")) - ) - } - - @Test - fun `unused ViewBinding when scoped and then qualified should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = true - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures.viewBinding = false - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(true, "7, 3")) - ) - } - - @Test - fun `unused ViewBinding without buildFeatures block should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - mindSdk(21) - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - mindSdk(21) - buildFeatures.viewBinding = false - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(true, null)) - ) - } - - @Test - fun `unused ViewBinding without android block should add android block under existing plugins block`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures { - viewBinding = false - } - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(true, null)) - ) - } - - @Test - fun `unused ViewBinding without android or plugins block should add android block above dependencies block`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - apply(plugin = "com.android.library") - apply(plugin = "org.jetbrains.kotlin-android") - - dependencies { - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - apply(plugin = "com.android.library") - apply(plugin = "org.jetbrains.kotlin-android") - - android { - buildFeatures { - viewBinding = false - } - } - - dependencies { - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(true, null)) - ) - } - - @Test - fun `unused ViewBinding when fully qualified should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures.viewBinding = true - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures.viewBinding = false - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(true, "6, 1")) - ) - } - - @Test - fun `unused ViewBinding when fully scoped should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures { - viewBinding = true - } - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - buildFeatures { - viewBinding = false - } - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(true, "8, 5")) - ) - } - - @Test - fun `unused ViewBinding when qualified and then scoped should be fixed`() = test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures { - viewBinding = true - } - """ - } - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - android.buildFeatures { - viewBinding = false - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(disableViewBinding(true, "7, 3")) - ) - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/InheritedDependenciesTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/InheritedDependenciesTest.kt deleted file mode 100644 index 98299c12d4..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/InheritedDependenciesTest.kt +++ /dev/null @@ -1,4117 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.asSourceSetName -import modulecheck.runtime.test.ProjectFindingReport.inheritedDependency -import modulecheck.runtime.test.ProjectFindingReport.mustBeApi -import modulecheck.runtime.test.ProjectFindingReport.overshot -import modulecheck.runtime.test.ProjectFindingReport.unusedDependency -import modulecheck.runtime.test.RunnerTest -import org.junit.jupiter.api.Test - -class InheritedDependenciesTest : RunnerTest() { - - @Test - fun `inherited from api dependency without auto-correct should fail`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `not inherited when source only declares as implementation config`() = test { - - // A Kotlin build of this kotlinProject would actually fail since :lib1 isn't in :lib3's classpath, - // but the test is still useful since it's just assuring that behavior is consistent - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - - open class Lib2Class - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run( - autoCorrect = false, - strictResolution = false - ).isSuccess shouldBe true - - logger.parsedReport() shouldBe emptyList() - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - - @Test - fun `not inherited when target and subject are the same`() = test { - - val lib1 = kotlinProject(":lib1") { - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.modulecheck.lib2.Lib2Class - - abstract class Lib1Class : Lib2Class() - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - abstract class Lib2Class - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val clazz : Lib2Class = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - lib1.addDependency(ConfigurationName.api, lib2) - - run(autoCorrect = false).isSuccess shouldBe true - - logger.parsedReport() shouldBe emptyList() - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - } - - @Test - fun `inherited from api dependency with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - // https://github.com/RBusarow/ModuleCheck/issues/569 - @Test - fun `inherited with same-config token with type-safe accessor should also use type-safe accessor`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(projects.lib2) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(projects.lib1) - api(projects.lib2) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - // https://github.com/RBusarow/ModuleCheck/issues/569 - @Test - fun `inherited with different-config token with type-safe accessor should also use type-safe accessor`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.implementation, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(projects.lib2) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(projects.lib1) - implementation(projects.lib2) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited with different-config tokens with mixed accessor types but type-safe source should use type-safe`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - open class Lib3Class : Lib1Class() - """.trimIndent() - ) - } - - val lib4 = kotlinProject(":lib4") { - addDependency(ConfigurationName.implementation, lib2) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(projects.lib2) - implementation(project(path = ":lib3")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(projects.lib1) - implementation(projects.lib2) - implementation(project(path = ":lib3")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited with different-config tokens with mixed accessor types but path source should use path`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - open class Lib3Class : Lib1Class() - """.trimIndent() - ) - } - - val lib4 = kotlinProject(":lib4") { - addDependency(ConfigurationName.implementation, lib2) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib2")) - implementation(projects.lib3) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - implementation(project(path = ":lib2")) - implementation(projects.lib3) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited as api from invisible dependency with a visible unrelated api project dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """.trimIndent() - ) - } - - val lib4 = kotlinProject(":lib4") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - addDependency(ConfigurationName.api, lib3, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib3")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - val clazz = Lib1Class() - val clazz2 = Lib2Class() - val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - api(project(path = ":lib3")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as api from invisible dependency with a visible unrelated implementation project dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """.trimIndent() - ) - } - - val lib4 = kotlinProject(":lib4") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - addDependency(ConfigurationName.implementation, lib3, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib3")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - val clazz = Lib1Class() - val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as implementation from invisible dependency with a visible unrelated api project dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """.trimIndent() - ) - } - - val lib4 = kotlinProject(":lib4") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - addDependency(ConfigurationName.api, lib3, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib3")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - api(project(path = ":lib3")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as implementation from invisible dependency with a visible unrelated implementation project dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """.trimIndent() - ) - } - - val lib4 = kotlinProject(":lib4") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - addDependency(ConfigurationName.implementation, lib3, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib3")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as implementation from invisible dependency with an empty multi-line dependencies block`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as implementation from invisible dependency with an empty single-line dependencies block`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as implementation from invisible dependency with no dependencies block`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as implementation from invisible dependency with only external implementation dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(":lib1")) - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as implementation from invisible dependency with only external api dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - // lib2 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(":lib1")) - - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = null - ) - ) - ) - } - - @Test - fun `inherited as internalImplementation from internalApi dependency with auto-correct should be fixed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency("internalApi".asConfigurationName(), lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - "internalApi"(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - """.trimIndent(), - SourceSetName("internal") - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - "internalImplementation"(project(path = ":lib1")) - "internalApi"(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "internalImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited from dependency with config block should not duplicate config block`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) { - exclude(group = "androidx.appcompat") - } - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val lib1Class = Lib1Class() - val lib2Class = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - api(project(path = ":lib2")) { - exclude(group = "androidx.appcompat") - } - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited from dependency with comments should not duplicate the comments`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - // preceding comment - api(project(path = ":lib2")) // trailing comment - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val lib1Class = Lib1Class() - val lib2Class = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // preceding comment - api(project(path = ":lib2")) // trailing comment - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited as in main but also used in debug should only be added to main`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - val clazz2 = Lib2Class() - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """.trimIndent(), - sourceSetName = SourceSetName.DEBUG - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited as implementation in debug should be added to debug`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency("debugApi".asConfigurationName(), lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - debugApi(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - val lib3 = androidLibrary(":lib3", "com.modulecheck.lib3") { - addDependency("debugImplementation".asConfigurationName(), lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - debugImplementation(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val lib1Class = Lib1Class() - private val lib2Class = Lib2Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - debugApi(project(path = ":lib1")) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - debugApi(project(path = ":lib1")) - debugImplementation(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "debugApi", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited as internalImplementation from api dependency with auto-correct should be fixed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - addSourceSet(SourceSetName("internal"), upstreamNames = listOf(SourceSetName.MAIN)) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib2.Lib2Class - - val clazz2 = Lib2Class() - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName("internal") - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - "internalImplementation"(project(path = ":lib1")) - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "internalImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited into mid-level source set should not also be added to downstream source sets`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - addSourceSet(SourceSetName("middle"), upstreamNames = listOf(SourceSetName.MAIN)) - addSourceSet( - SourceSetName("leafOne"), - upstreamNames = listOf("middle".asSourceSetName()) - ) - addSourceSet( - SourceSetName("leafTwo"), - upstreamNames = listOf("middle".asSourceSetName()) - ) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib2.Lib2Class - - val clazz2 = Lib2Class() - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName("middle") - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - "middleImplementation"(project(path = ":lib1")) - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "middleImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `non-standard config name should be invoked as function if it's already used that way`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - - addSourceSet("internal".asSourceSetName(), upstreamNames = listOf(SourceSetName.MAIN)) - - addDependency("internalImplementation".asConfigurationName(), lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - internalImplementation(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - private val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent(), - SourceSetName("internal") - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - internalImplementation(project(path = ":lib1")) - internalImplementation(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "internalImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited via testApi should not cause infinite loop`() = test { - - val lib1 = kotlinProject(":lib1") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.modulecheck.lib2.Lib2Class - - open class Lib1Class - private val lib2Class = Lib2Class() - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testApi, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testApi(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - class Lib2Class - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - lib1.addDependency(ConfigurationName.implementation, lib2) - - run().isSuccess shouldBe true - - logger.parsedReport() shouldBe emptyList() - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib2")) - } - """ - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testApi(project(path = ":lib1")) - } - """ - } - - @Test - fun `inherited from implementation dependency with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.implementation, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - private val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited implementation from implementation with string extension should be added with string invocation`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.implementation, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - "implementation"(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - private val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - "implementation"(project(path = ":lib1")) - "implementation"(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited implementation from api with string extension should be added with precompiled function`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - "api"(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - private val clazz = Lib1Class() - val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - "api"(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited novel debugImplementation in android project should use precompiled function`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class - """.trimIndent() - ) - } - - val lib3 = androidLibrary(":lib3", "com.modulecheck.lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib2.Lib2Class - - val clazz2 = Lib2Class() - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - debugImplementation(project(path = ":lib1")) - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "debugImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited novel androidTestDebugImplementation in android project should use precompiled function`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class - """.trimIndent() - ) - } - - val lib3 = androidLibrary(":lib3", "com.modulecheck.lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib2.Lib2Class - - val clazz2 = Lib2Class() - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - "androidTestDebug".asSourceSetName() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - androidTestDebugImplementation(project(path = ":lib1")) - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "androidTestDebugImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited from implementation dependency and part of API with auto-correct should be fixed as api config`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.implementation, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - implementation(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `deeply inherited from testImplementation dependency with auto-correct should be fixed as testImplementation`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - - open class Lib3Class : Lib1Class() - """.trimIndent() - ) - } - - val lib4 = kotlinProject(":lib4") { - addDependency(ConfigurationName.testImplementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib3")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - private val clazz3 = Lib3Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - testImplementation(project(path = ":lib2")) - testImplementation(project(path = ":lib3")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "api", - dependency = ":lib2", - position = "6, 3" - ) - ), - ":lib4" to listOf( - inheritedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - source = ":lib3", - position = "6, 3" - ), - inheritedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib2", - source = ":lib3", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited testFixtures and implementation from testFixtures with auto-correct should be fixed as testFixtures via testImplementation`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - interface Lib1Interface - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - hasTestFixturesPlugin = true - addDependency("testFixturesImplementation".asConfigurationName(), lib1) - addDependency("testFixturesApi".asConfigurationName(), lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesImplementation(project(path = ":lib1")) - testFixturesApi(testFixtures(project(path = ":lib1"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib1.Lib1Interface - - open class Lib2Class : Lib1Class(), Lib1Interface - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.testImplementation, lib2, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesApi(project(path = ":lib1")) - // testFixturesImplementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - testFixturesApi(testFixtures(project(path = ":lib1"))) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "testFixturesImplementation", - dependency = ":lib1", - position = "6, 3" - ) - ), - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited testFixtures from testFixtures with auto-correct should be fixed as testFixtures via testImplementation`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency("testFixturesApi".asConfigurationName(), lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesApi(testFixtures(project(path = ":lib1"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.testImplementation, lib2, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesApi(testFixtures(project(path = ":lib1"))) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited testFixtures from api with auto-correct should be fixed as testFixtures via testImplementation`() = - test { - - val lib1 = kotlinProject(":lib1") { - hasTestFixturesPlugin = true - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - hasTestFixturesPlugin = true - addDependency("api".asConfigurationName(), lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(testFixtures(project(path = ":lib1"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.testImplementation, lib2, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesApi(testFixtures(project(path = ":lib1"))) - // api(testFixtures(project(path = ":lib1"))) // ModuleCheck finding [unused-dependency] - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testFixturesApi", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - position = "6, 3" - ) - ), - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited main source should be added as non-test-fixtures testImplementation`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency("testFixturesApi".asConfigurationName(), lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesApi(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.testImplementation, lib2, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - inheritedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - source = ":lib2", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited main source testFixture in same module with auto-correct should be fixed as normal testImplementation`() = - test { - - val lib1 = kotlinProject(":lib1") { - hasTestFixturesPlugin = true - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib1.test - - import com.modulecheck.lib1.Lib1Class - - open class FakeLib1Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib1.test.FakeLib1Class - - val clazz = Lib1Class() - private val clazz2 = FakeLib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - testImplementation(testFixtures(project(path = ":lib1"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - inheritedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - source = null, - position = "6, 3" - ) - ) - ) - } - - @Test - fun `inherited main source testFixture in same module with auto-correct should be fixed as normal api`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - addKotlinSource( - """ - package com.modulecheck.lib1.test - - import com.modulecheck.lib1.Lib1Class - - open class FakeLib1Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(testFixtures(project(path = ":lib1"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib1.test.FakeLib1Class - - val clazz = Lib1Class() - private val clazz2 = FakeLib1Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - implementation(testFixtures(project(path = ":lib1"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - inheritedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - source = null, - position = "6, 3" - ) - ) - ) - } - - @Test - fun `not inherited when only used in tests and already declared as testImplementation`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `not inherited when exposed as api but used in tests and already declared as testImplementation`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.testImplementation, lib1) - addDependency(ConfigurationName.testImplementation, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - testImplementation(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val clazz = Lib1Class() - private val clazz2 = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - testImplementation(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/MustBeApiTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/MustBeApiTest.kt deleted file mode 100644 index 06a92d753d..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/MustBeApiTest.kt +++ /dev/null @@ -1,2411 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.runtime.test.ProjectFindingReport.mustBeApi -import modulecheck.runtime.test.RunnerTest -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test - -class MustBeApiTest : RunnerTest() { - - @Test - fun `public property from implementation without auto-correct should fail`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `public generic property from implementation without auto-correct should fail`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `public property from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - // https://github.com/RBusarow/ModuleCheck/issues/443 - @Test - fun `switching to api dependency after a blank line should preserve all newlines -- kotlin`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - class Lib2Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """ - ) - } - - val lib4 = kotlinProject(":lib4") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - - implementation(project(path = ":lib2")) - implementation(project(path = ":lib3")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - val lib1Class = Lib1Class() - val lib2Class = Lib2Class() - val lib3Class = Lib3Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - - api(project(path = ":lib2")) - // implementation(project(path = ":lib2")) // ModuleCheck finding [must-be-api] - api(project(path = ":lib3")) - // implementation(project(path = ":lib3")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib2", - position = "8, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "9, 3" - ) - ) - ) - } - - // https://github.com/RBusarow/ModuleCheck/issues/443 - @Test - fun `switching to api dependency after a blank line should preserve all newlines -- groovy`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - class Lib2Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """ - ) - } - - val lib4 = kotlinProject(":lib4") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - addDependency(ConfigurationName.implementation, lib3) - - buildFile.delete() - buildFile = projectDir.resolve("build.gradle") - .createSafely( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' version '1.6.10' - } - - dependencies { - implementation project(':lib1') - - implementation project(':lib2') - implementation project(':lib3') - } - """.trimIndent() - ) - - addKotlinSource( - """ - package com.modulecheck.lib4 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - import com.modulecheck.lib3.Lib3Class - - val lib1Class = Lib1Class() - val lib2Class = Lib2Class() - val lib3Class = Lib3Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib4.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' version '1.6.10' - } - - dependencies { - api project(':lib1') - // implementation project(':lib1') // ModuleCheck finding [must-be-api] - - api project(':lib2') - // implementation project(':lib2') // ModuleCheck finding [must-be-api] - api project(':lib3') - // implementation project(':lib3') // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib4" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib2", - position = "8, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "9, 3" - ) - ) - ) - } - - @Test - fun `private property from implementation with auto-correct should not be changed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val lib1Class = Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `private property from implementation inside public class with auto-correct should not be changed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - class Lib2Class { - private val lib1Class = Lib1Class() - } - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `internal property from implementation with auto-correct should not be changed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - internal val lib1Class = Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `api and implementation of the same dependency with auto-correct should not be changed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `public property from dependency in test source should not require API`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """, - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `internal property in class from implementation with auto-correct should not be changed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - class Lib2Class { - internal val lib1Class = Lib1Class() - } - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `supertype from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - class Lib2Class : Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `must be api from invisible dependency with unrelated api dependency declaration`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - class Lib2Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.implementation, lib1, addToBuildFile = false) - addDependency(ConfigurationName.api, lib2, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib2")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class Lib3Class : Lib1Class() - val lib2Class = Lib2Class() - """ - ) - } - - run().isSuccess shouldBe false - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - api(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `must be api from invisible dependency with unrelated implementation dependency declaration`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - class Lib2Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.implementation, lib1, addToBuildFile = false) - addDependency(ConfigurationName.implementation, lib2, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib2")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class Lib3Class : Lib1Class() - private val lib2Class = Lib2Class() - """ - ) - } - - run().isSuccess shouldBe false - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - implementation(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `must be api from invisible dependency with unrelated implementation external dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.implementation, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class Lib3Class : Lib1Class() - private val lib2Class = Lib2Class() - """ - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(":lib1")) - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `must be api from invisible dependency with unrelated api external dependency`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.implementation, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class Lib3Class : Lib1Class() - private val lib2Class = Lib2Class() - """ - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(":lib1")) - - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `must be api from invisible dependency with empty multi-line dependencies block`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.implementation, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class Lib3Class : Lib1Class() - private val lib2Class = Lib2Class() - """ - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `must be api from invisible dependency with empty single-line dependencies block`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.implementation, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class Lib3Class : Lib1Class() - private val lib2Class = Lib2Class() - """ - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `must be api from invisible dependency with no dependencies block`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.implementation, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - class Lib3Class : Lib1Class() - private val lib2Class = Lib2Class() - """ - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `auto-correct should only replace the configuration invocation text`() = test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":implementation") { - addKotlinSource( - """ - package com.modulecheck.implementation - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - // this module dependency is an implementation - // implementation can be the beginning of the comment - implementation(project(path = ":implementation")) // it's an implementation - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.implementation.Lib1Class - - class Lib2Class : Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - // this module dependency is an implementation - // implementation can be the beginning of the comment - api(project(path = ":implementation")) // it's an implementation - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":implementation", - position = "8, 3" - ) - ) - ) - } - - @Test - fun `supertype of internal class from implementation with auto-correct should not be changed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - internal class Lib2Class : Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `public return type from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - fun lib1Class(): Lib1Class = Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `internal return type from implementation with auto-correct should not be changed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - internal fun lib1Class(): Lib1Class = Lib1Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `public argument type from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - fun bindLib1(clazz: Lib1Class): Lib1Class = clazz - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `public type argument from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - fun foo(t: List) = Unit - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `public generic bound type from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - fun foo(t: T) = Unit - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `public generic fully qualified bound type from implementation with auto-correct should be fixed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - fun foo(t: T) = Unit - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `two public public properties from implementation with auto-correct should be fixed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib3.Lib3Class - - val lib1Class = Lib1Class() - val lib3Class = Lib3Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - api(project(path = ":lib3")) - // implementation(project(path = ":lib3")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `two public supertypes from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - addKotlinSource( - """ - package com.modulecheck.lib3 - - interface Lib3Interface - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib3.Lib3Interface - - class Lib2Class : Lib1Class(), Lib3Interface - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - api(project(path = ":lib3")) - // implementation(project(path = ":lib3")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `two public return types from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib3.Lib3Class - - fun lib1Class(): Lib1Class = Lib1Class() - fun lib3Class(): Lib3Class = Lib3Class() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - api(project(path = ":lib3")) - // implementation(project(path = ":lib3")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `two public argument types from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib3.Lib3Class - - fun bindLib1(clazz: Lib1Class): Lib1Class = clazz - fun bindLib3(clazz: Lib3Class): Lib3Class = clazz - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - api(project(path = ":lib3")) - // implementation(project(path = ":lib3")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `two public type arguments from implementation with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib3.Lib3Class - - fun foo(lib1s: List, lib3Comparator: Comparator) = Unit - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - api(project(path = ":lib3")) - // implementation(project(path = ":lib3")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `two public generic bound types from implementation with auto-correct should be fixed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - val lib3 = kotlinProject(":lib3") { - addKotlinSource( - """ - package com.modulecheck.lib3 - - class Lib3Class - """ - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib3) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - implementation(project(path = ":lib3")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib3.Lib3Class - - fun foo(t: T): R = TODO() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [must-be-api] - api(project(path = ":lib3")) - // implementation(project(path = ":lib3")) // ModuleCheck finding [must-be-api] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ), - mustBeApi( - fixed = true, - configuration = "implementation", - dependency = ":lib3", - position = "7, 3" - ) - ) - ) - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/OverShotDependenciesTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/OverShotDependenciesTest.kt deleted file mode 100644 index 00a2da53e5..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/OverShotDependenciesTest.kt +++ /dev/null @@ -1,1458 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.runtime.test.ProjectFindingReport.overshot -import modulecheck.runtime.test.ProjectFindingReport.unsortedDependencies -import modulecheck.runtime.test.ProjectFindingReport.unusedDependency -import modulecheck.runtime.test.RunnerTest -import org.junit.jupiter.api.Test - -class OverShotDependenciesTest : RunnerTest() { - - @Test - fun `overshot as api but used in test without auto-correct should fail`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run(autoCorrect = false).isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = false, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `overshot as implementation but used in debug without auto-correct should fail`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - run(autoCorrect = false).isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = false, - configuration = "debugApi", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `overshot as api but used in test with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - // api(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `overshot as implementation should be debugApi`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - debugApi(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "debugApi", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `overshot as implementation should be debugImplementation`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val lib1Class = Lib1Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - debugImplementation(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "debugImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `overshot in non-android as implementation should be debugApi with quotes`() = test { - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - "debugApi"(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "debugApi", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `overshot as api but used in test with another testFixture with auto-correct should be fixed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName("testFixturesApi"), lib1) - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib1) - addDependency(ConfigurationName.testImplementation, lib2, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val lib1Class = Lib1Class() - val lib2Class = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - // api(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `unused in main but used in both test and androidTest should be added to both`() = test { - - settings.checks.sortDependencies = true - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - interface Lib1Interface - """.trimIndent() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2.debug - - import com.modulecheck.lib1.Lib1Interface - - class Lib2ClassAndroidTest : Lib1Interface - """.trimIndent(), - SourceSetName.ANDROID_TEST - ) - addKotlinSource( - """ - package com.modulecheck.lib2.test - - import com.modulecheck.lib1.Lib1Interface - - class Lib2ClassTest : Lib1Interface - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - androidTestImplementation(project(path = ":lib1")) - - testImplementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unsortedDependencies(fixed = true), - overshot( - fixed = true, - configuration = "androidTestImplementation", - dependency = ":lib1", - position = "7, 3" - ), - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "7, 3" - ), - unusedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `overshot as api with config block and comment with auto-correct should be fixed`() = test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent() - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib1) - addDependency(ConfigurationName.testImplementation, lib2) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - // a comment - api(project(path = ":lib1")) { - because("this is a test") - } - testImplementation(project(path = ":lib2")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val lib1Class = Lib1Class() - val lib2Class = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - // a comment - testImplementation(project(path = ":lib1")) { - because("this is a test") - } - // a comment - // api(project(path = ":lib1")) { - // because("this is a test") - // } // ModuleCheck finding [unused-dependency] - testImplementation(project(path = ":lib2")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "7, 3" - ), - unusedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `overshot testFixture as api but used in test with another testFixture with auto-correct should be fixed`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName("testFixturesApi"), lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesApi(testFixtures(project(path = ":lib1"))) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - open class Lib2Class : Lib1Class() - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib3 = kotlinProject(":lib3") { - addDependency(ConfigurationName.api, lib1, asTestFixture = true) - addDependency(ConfigurationName.testImplementation, lib2, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(testFixtures(project(path = ":lib1"))) - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib1.Lib1Class - import com.modulecheck.lib2.Lib2Class - - val lib1Class = Lib1Class() - val lib2Class = Lib2Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testFixturesApi(testFixtures(project(path = ":lib1"))) - } - """ - - lib3.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - // api(testFixtures(project(path = ":lib1"))) // ModuleCheck finding [unused-dependency] - testImplementation(testFixtures(project(path = ":lib2"))) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib3" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "api", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `overshot as testImplementation from invisible dependency with a visible unrelated api project dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib4")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - kotlinProject(":lib4") - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - api(project(path = ":lib4")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } - - // https://github.com/RBusarow/ModuleCheck/issues/520 - @Test - fun `overshot as debugApi from invisible dependency with a visible unrelated debugApi project dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - debugApi(project(path = ":lib4")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.DEBUG - ) - } - - kotlinProject(":lib4") - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - debugApi(project(path = ":lib1")) - debugApi(project(path = ":lib4")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "debugApi", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - - logger.clear() - - // this second run should not have an overshot finding, and shouldn't modify the build file - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - debugApi(project(path = ":lib1")) - debugApi(project(path = ":lib4")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `overshot as testImplementation from invisible dependency with a visible unrelated implementation project dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib4")) - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - kotlinProject(":lib4") - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - implementation(project(path = ":lib4")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `overshot as testImplementation from invisible dependency with an empty multi-line dependencies block`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `overshot as testImplementation from invisible dependency with an empty single-line dependencies block`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `overshot as testImplementation from invisible dependency with no dependencies block`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `overshot as testImplementation from invisible dependency with only external implementation dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(":lib1")) - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } - - @Test - fun `overshot as implementation from invisible dependency with only external api dependency`() = - test { - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - open class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - // lib1 is added as a dependency, but it's not in the build file. - // This is intentional, because it mimics the behavior of a convention plugin - // which adds a dependency without any visible declaration in the build file - addDependency(ConfigurationName.api, lib1, addToBuildFile = false) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - private val clazz = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(":lib1")) - - api("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = false, - configuration = "api", - dependency = ":lib1", - position = null - ) - ) - ) - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/RuleUrlValidationTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/RuleUrlValidationTest.kt deleted file mode 100644 index 16bd6684cd..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/RuleUrlValidationTest.kt +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import io.kotest.assertions.asClue -import io.kotest.inspectors.forAll -import io.kotest.matchers.collections.shouldContain -import io.kotest.matchers.file.shouldExist -import io.kotest.matchers.nulls.shouldNotBeNull -import modulecheck.rule.impl.DocumentedRule.Companion.RULES_BASE_URL -import modulecheck.runtime.test.RunnerTest -import modulecheck.utils.remove -import modulecheck.utils.requireNotNull -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test -import java.io.File - -class RuleUrlValidationTest : RunnerTest() { - - @Test - fun `each rule documentation url must correspond to a docs file and sidebar entry`() = test { - - val websiteDir = File(BuildProperties.websiteDir) - - """ - The path must point to the project website: $websiteDir - - If this doesn't point to the website, something has moved. - """.trimIndent().asClue { - websiteDir.shouldExist() - } - - val sidebarsFile = websiteDir.resolve("sidebars.js") - - "The path must point to the project website's `sidebars.js` file: $sidebarsFile ".asClue { - sidebarsFile.shouldExist() - } - - val sidebarsRules = sidebarsFile.readText().lines() - .asSequence() - .map { it.trim() } - // strip out comments - .filterNot { it.startsWith("//") || it.startsWith("/*") || it.startsWith("*") } - .joinToString("\n") - .let { text -> - """"rules/([^"]+)"""".toRegex().findAll(text) - .map { it.groupValues[1] } - } - .toSet() - - val rulesDocsDir = websiteDir.resolve("docs", "rules") - - // Find all markdown docs within the /website/docs/rules directory, - // then parse their defined IDs and slugs. - // - // The ID looks like a relative path, but it's not. It's the relative path in terms of the - // *directory*, but it doesn't use the file name for the last element -- it uses the "id" in the - // file's header. - // Given a file `/website/docs/rules/compiler/ksp/foo.md` with an id of `id: bar`, - // the full sidebar id is `rules/compiler/ksp/bar`. - val ruleSlugsToDocIds = rulesDocsDir.walkTopDown() - .filter { it.isFile } - .filter { it.extension == "md" || it.extension == "mdx" } - .map { file -> - val relativeDir = file.parentFile.relativeTo(rulesDocsDir).path - - val header = "---([\\s\\S]*)(?=---)".toRegex().find(file.readText()) - .requireNotNull { "This file ($file) doesn't appear to have a header?" } - .groupValues[1] - .trim() - - // the value in the line `id: some_value` - val simpleId = header.lines() - .firstNotNullOf { line -> - """id\s?:\s?(\S+).*""".toRegex() - .find(line) - .requireNotNull { "Could not find an ID in the header of file ($file)" } - .groupValues[1] - } - - // If the file is in the root of `/rules/`, then just return the id. - // Otherwise, include the relative path. - val id = when { - relativeDir.isEmpty() -> simpleId - else -> "$relativeDir/$simpleId" - } - - // the value in the line `slug: some_value` - val slug = header.lines() - .firstNotNullOf { line -> - """slug\s?:\s?(\S+).*""".toRegex() - .find(line) - ?.groupValues - ?.get(1) - } - .requireNotNull { "Could not find a slug in the header of file ($file)" } - - slug to id - } - .toMap() - - val rulesToSlugs = rules.map { rule -> - rule.name.id to "/rules/${rule.documentationUrl.remove(RULES_BASE_URL)}" - } - .sortedBy { it.first } - - /* This seems bad, but it's simple: - Each rule must have a `url`. - Each `url` has a slug. - Each slug must correspond to a rule document which defines that slug. - For each rule document, there must be a corresponding entry in the sidebars.js file. - */ - rulesToSlugs - .forAll { (ruleId, ruleSlug) -> - - var docId: String? = null - - "a rule doc with a slug of `$ruleSlug` should exist for rule with id `$ruleId`".asClue { - - docId = ruleSlugsToDocIds[ruleSlug] - - docId.shouldNotBeNull() - } - - "a rule doc with an id of `$docId` should be defined in the sidebar".asClue { - - sidebarsRules shouldContain docId - } - } - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/SortDependenciesTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/SortDependenciesTest.kt deleted file mode 100644 index 8040bc27d9..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/SortDependenciesTest.kt +++ /dev/null @@ -1,718 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.fake.TestChecksSettings -import modulecheck.config.fake.TestSettings -import modulecheck.runtime.test.ProjectFindingReport.unsortedDependencies -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.testing.writeGroovy -import org.junit.jupiter.api.Test -import java.io.File - -class SortDependenciesTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings(checks = TestChecksSettings(sortDependencies = true)) - } - - @Test - fun `kts out-of-order dependencies should be sorted`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - runtimeOnly(project(path = ":lib-1")) - api(project(path = ":lib-3")) - implementation(project(path = ":lib-7")) - compileOnly(project(path = ":lib-4")) - api(project(path = ":lib-0")) - testImplementation(project(path = ":lib-5")) - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - compileOnly(project(path = ":lib-6")) - implementation(project(path = ":lib-2")) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - testImplementation(project(path = ":lib-8")) - implementation(project(path = ":lib-9")) - api("com.squareup:kotlinpoet:1.7.2") - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api("com.squareup:kotlinpoet:1.7.2") - - api(project(path = ":lib-0")) - api(project(path = ":lib-3")) - - compileOnly(project(path = ":lib-4")) - compileOnly(project(path = ":lib-6")) - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - - implementation(project(path = ":lib-2")) - implementation(project(path = ":lib-7")) - implementation(project(path = ":lib-9")) - - runtimeOnly(project(path = ":lib-1")) - - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - - testImplementation(project(path = ":lib-5")) - testImplementation(project(path = ":lib-8")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `kts multi-line comments should move with their declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - - /* - a multi-line comment - */ - runtimeOnly(project(path = ":lib-1")) - api(project(path = ":lib-3")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - - api(project(path = ":lib-3")) - - /* - a multi-line comment - */ - runtimeOnly(project(path = ":lib-1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `kts multi-line kdoc comments should move with their declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - - /** - * a multi-line comment - */ - runtimeOnly(project(path = ":lib-1")) - api(project(path = ":lib-3")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - - api(project(path = ":lib-3")) - - /** - * a multi-line comment - */ - runtimeOnly(project(path = ":lib-1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `kts preceding comments should move with their declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - - // preceding comment - runtimeOnly(project(path = ":lib-1")) - api(project(path = ":lib-3")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - - api(project(path = ":lib-3")) - - // preceding comment - runtimeOnly(project(path = ":lib-1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `kts trailing comments should move with their declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - - runtimeOnly(project(path = ":lib-1")) // trailing comment - api(project(path = ":lib-3")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - - api(project(path = ":lib-3")) - - runtimeOnly(project(path = ":lib-1")) // trailing comment - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `kts sorting should be idempotent`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - runtimeOnly(project(path = ":lib-1")) - api(project(path = ":lib-3")) - implementation(project(path = ":lib-7")) - compileOnly(project(path = ":lib-4")) - api(project(path = ":lib-0")) - testImplementation(project(path = ":lib-5")) - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - compileOnly(project(path = ":lib-6")) - implementation(project(path = ":lib-2")) - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - testImplementation(project(path = ":lib-8")) - implementation(project(path = ":lib-9")) - api("com.squareup:kotlinpoet:1.7.2") - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api("com.squareup:kotlinpoet:1.7.2") - - api(project(path = ":lib-0")) - api(project(path = ":lib-3")) - - compileOnly(project(path = ":lib-4")) - compileOnly(project(path = ":lib-6")) - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - - implementation(project(path = ":lib-2")) - implementation(project(path = ":lib-7")) - implementation(project(path = ":lib-9")) - - runtimeOnly(project(path = ":lib-1")) - - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - - testImplementation(project(path = ":lib-5")) - testImplementation(project(path = ":lib-8")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - - logger.clear() - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api("com.squareup:kotlinpoet:1.7.2") - - api(project(path = ":lib-0")) - api(project(path = ":lib-3")) - - compileOnly(project(path = ":lib-4")) - compileOnly(project(path = ":lib-6")) - - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2") - - implementation(project(path = ":lib-2")) - implementation(project(path = ":lib-7")) - implementation(project(path = ":lib-9")) - - runtimeOnly(project(path = ":lib-1")) - - testImplementation("org.junit.jupiter:junit-jupiter-api:5.7.0") - - testImplementation(project(path = ":lib-5")) - testImplementation(project(path = ":lib-8")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `groovy out-of-order plugins should be sorted`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - runtimeOnly project(path = ":lib-1") - api project(path = ":lib-3") - implementation project(path = ":lib-7") - compileOnly project(path = ":lib-4") - api project(path = ":lib-0") - testImplementation project(path = ":lib-5") - compileOnly project(path = ":lib-6") - implementation project(path = ":lib-2") - testImplementation project(path = ":lib-8") - implementation project(path = ":lib-9") - - - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2' - api 'com.squareup:kotlinpoet:1.7.2' - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - api 'com.squareup:kotlinpoet:1.7.2' - - api project(path = ":lib-0") - api project(path = ":lib-3") - - compileOnly project(path = ":lib-4") - compileOnly project(path = ":lib-6") - - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2' - - implementation project(path = ":lib-2") - implementation project(path = ":lib-7") - implementation project(path = ":lib-9") - - runtimeOnly project(path = ":lib-1") - - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - - testImplementation project(path = ":lib-5") - testImplementation project(path = ":lib-8") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `groovy multi-line comments should move with declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - /* - a multi-line comment - */ - runtimeOnly project(path = ":lib-1") - api project(path = ":lib-3") - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - api project(path = ":lib-3") - - /* - a multi-line comment - */ - runtimeOnly project(path = ":lib-1") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `groovy multi-line javadoc comments should move with declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - /** - * a multi-line comment - */ - runtimeOnly project(path = ":lib-1") - api project(path = ":lib-3") - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - api project(path = ":lib-3") - - /** - * a multi-line comment - */ - runtimeOnly project(path = ":lib-1") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `groovy preceding comments should move with declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - // preceding comment - runtimeOnly project(path = ":lib-1") - api project(path = ":lib-3") - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - api project(path = ":lib-3") - - // preceding comment - runtimeOnly project(path = ":lib-1") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `groovy trailing comments should move with declarations`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - runtimeOnly project(path = ":lib-1") // trailing comment - api project(path = ":lib-3") - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - - api project(path = ":lib-3") - - runtimeOnly project(path = ":lib-1") // trailing comment - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - } - - @Test - fun `groovy sorting should be idempotent`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - runtimeOnly project(path = ":lib-1") - api project(path = ":lib-3") - implementation project(path = ":lib-9") - - - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2' - api 'com.squareup:kotlinpoet:1.7.2' - - implementation project(path = ":lib-7") - compileOnly project(path = ":lib-4") - api project(path = ":lib-0") - testImplementation project(path = ":lib-5") - compileOnly project(path = ":lib-6") - implementation project(path = ":lib-2") - testImplementation project(path = ":lib-8") - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - api 'com.squareup:kotlinpoet:1.7.2' - - api project(path = ":lib-0") - api project(path = ":lib-3") - - compileOnly project(path = ":lib-4") - compileOnly project(path = ":lib-6") - - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2' - - implementation project(path = ":lib-2") - implementation project(path = ":lib-7") - implementation project(path = ":lib-9") - - runtimeOnly project(path = ":lib-1") - - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - - testImplementation project(path = ":lib-5") - testImplementation project(path = ":lib-8") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedDependencies(fixed = true)) - ) - logger.clear() - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - id 'org.jetbrains.kotlin.jvm' - } - - dependencies { - api 'com.squareup:kotlinpoet:1.7.2' - - api project(path = ":lib-0") - api project(path = ":lib-3") - - compileOnly project(path = ":lib-4") - compileOnly project(path = ":lib-6") - - implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2' - - implementation project(path = ":lib-2") - implementation project(path = ":lib-7") - implementation project(path = ":lib-9") - - runtimeOnly project(path = ":lib-1") - - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0' - - testImplementation project(path = ":lib-5") - testImplementation project(path = ":lib-8") - } - """ - - logger.parsedReport() shouldBe emptyList() - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/SortPluginsTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/SortPluginsTest.kt deleted file mode 100644 index e25aee7d33..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/SortPluginsTest.kt +++ /dev/null @@ -1,182 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.fake.TestChecksSettings -import modulecheck.config.fake.TestSettings -import modulecheck.runtime.test.ProjectFindingReport.unsortedPlugins -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.testing.writeGroovy -import org.junit.jupiter.api.Test -import java.io.File - -class SortPluginsTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings(checks = TestChecksSettings(sortPlugins = true)) - } - - @Test - fun `kts out-of-order plugins should be sorted`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - id("io.gitlab.arturbosch.detekt") version "1.15.0" - javaLibrary - kotlin("jvm") - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - javaLibrary - id("io.gitlab.arturbosch.detekt") version "1.15.0" - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedPlugins(fixed = true)) - ) - } - - @Test - fun `kts sorting should be idempotent`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - id("io.gitlab.arturbosch.detekt") version "1.15.0" - javaLibrary - kotlin("jvm") - } - """ - } - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - javaLibrary - id("io.gitlab.arturbosch.detekt") version "1.15.0" - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedPlugins(fixed = true)) - ) - logger.clear() - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - javaLibrary - id("io.gitlab.arturbosch.detekt") version "1.15.0" - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `groovy out-of-order plugins should be sorted`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - javaLibrary - id 'org.jetbrains.kotlin.jvm' - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - javaLibrary - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - id 'org.jetbrains.kotlin.jvm' - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedPlugins(fixed = true)) - ) - } - - @Test - fun `groovy sorting should be idempotent`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile.delete() - buildFile = File(projectDir, "build.gradle") - buildFile.writeGroovy( - """ - plugins { - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - javaLibrary - id 'org.jetbrains.kotlin.jvm' - } - """ - ) - } - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - javaLibrary - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - id 'org.jetbrains.kotlin.jvm' - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unsortedPlugins(fixed = true)) - ) - logger.clear() - - run().isSuccess shouldBe true - - lib1.buildFile shouldHaveText """ - plugins { - javaLibrary - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - id 'org.jetbrains.kotlin.jvm' - } - """ - - logger.parsedReport() shouldBe emptyList() - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/TextReportingTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/TextReportingTest.kt deleted file mode 100644 index 7ae247817e..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/TextReportingTest.kt +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.fake.TestSettings -import modulecheck.finding.CouldUseAnvilFinding -import modulecheck.finding.Finding -import modulecheck.finding.FindingName -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import org.junit.jupiter.api.Test -import java.io.File - -internal class TextReportingTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings().apply { - reports.text.outputPath = File(workingDir, reports.text.outputPath).path - } - } - - @Test - fun `text report should not be created if disabled in settings`() = test { - - settings.reports.text.enabled = false - - val outputFile = File(settings.reports.text.outputPath) - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib1"), - buildFile = workingDir - ) - ) - ), - findingResultFactory = { _, _, _ -> - listOf( - Finding.FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("use-anvil-factory-generation"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Finding.Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = true - ) - ) - } - ).isSuccess shouldBe true - - outputFile.exists() shouldBe false - } - - @Test - fun `text report should be created if enabled in settings`() = test { - - settings.reports.text.enabled = true - - val outputFile = File(settings.reports.text.outputPath) - - run( - autoCorrect = false, - findingFactory = findingFactory( - listOf( - CouldUseAnvilFinding( - findingName = FindingName("use-anvil-factory-generation"), - dependentProject = kotlinProject(":lib1"), - buildFile = workingDir - ) - ) - ), - findingResultFactory = { findings, _, _ -> - findings.map { - Finding.FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("use-anvil-factory-generation"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Finding.Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = true - ) - } - } - ).isSuccess shouldBe true - - outputFile.readText() - .clean() shouldBeNoTrimIndent """ - | :dependentPath - | configuration dependency name source build file - | ✔ configurationName dependencyIdentifier use-anvil-factory-generation sourceOrNull buildFile: (1, 2): - """.trimMargin() - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedDependenciesTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedDependenciesTest.kt deleted file mode 100644 index c7f6e25ec6..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedDependenciesTest.kt +++ /dev/null @@ -1,2492 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AnvilGradlePlugin -import modulecheck.runtime.test.ProjectFindingReport.overshot -import modulecheck.runtime.test.ProjectFindingReport.unusedDependency -import modulecheck.runtime.test.RunnerTest -import net.swiftzer.semver.SemVer -import org.junit.jupiter.api.Test - -class UnusedDependenciesTest : RunnerTest() { - - @Test - fun `unused without auto-correct should fail`() = test { - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - } - - run(autoCorrect = false).isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `unused with auto-correct should be commented out`() = test { - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - // implementation(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `unused with auto-correct and deleteUnused should be deleted`() = test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `unused but suppressed with auto-correct and deleteUnused should not be changed`() = test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - @Suppress("unused-dependency") - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - @Suppress("unused-dependency") - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused but suppressed at the block level should not be changed`() = test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - @Suppress("unused-dependency") - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - @Suppress("unused-dependency") - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused and suppressed with legacy name should not be changed`() = test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - @Suppress("unused") - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - @Suppress("unused") - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused with auto-correct with preceding typesafe external dependency should be deleted`() = - test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(libs.javax.inject) - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(libs.javax.inject) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "7, 3" - ) - ) - ) - } - - @Test - fun `unused with auto-correct with string extension function for config should be deleted`() = - test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - "implementation"(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `unused without auto-correct with string extension function for config should fail`() = test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - "implementation"(project(path = ":lib1")) - } - """ - } - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - "implementation"(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = false, - configuration = "implementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `unused with auto-correct and deleteUnused following dependency config block should be deleted`() = - test { - - settings.deleteUnused = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(libs.javax.inject) { - } - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(libs.javax.inject) { - } - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "8, 3" - ) - ) - ) - } - - @Test - fun `unused with auto-correct following dependency config block should be commented out`() = - test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(libs.javax.inject) { - } - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(libs.javax.inject) { - } - // implementation(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "8, 3" - ) - ) - ) - } - - @Test - fun `dependencies from non-jvm configurations should be ignored`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - configurations.create("fakeConfig") - - dependencies { - fakeConfig(project(path = ":lib1")) - implementation(project(path = ":lib1")) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - configurations.create("fakeConfig") - - dependencies { - fakeConfig(project(path = ":lib1")) - // implementation(project(path = ":lib1")) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "implementation", - dependency = ":lib1", - position = "9, 3" - ) - ) - ) - } - - @Test - fun `fully qualified reference from kotlin file should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - object Lib1Class { - fun foo() = Unit - } - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile.writeText( - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """.trimIndent() - ) - - addKotlinSource( - """ - package com.modulecheck.lib2 - - fun someFunction() { - com.modulecheck.lib1.Lib1Class.foo() - } - """.trimIndent() - ) - } - - run( - autoCorrect = true - ).isSuccess shouldBe true - - lib2.buildFile.readText() shouldBe """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.collectReport() - .joinToString() - .clean() shouldBe """ModuleCheck found 0 issues""" - } - - @Test - fun `fully qualified method reference from java file should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - object Lib1Class { - @JvmStatic fun foo() = Unit - } - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile.writeText( - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """.trimIndent() - ) - - addJavaSource( - """ - package com.modulecheck.lib2; - - public class Lib2Class { - void someFunction() { - com.modulecheck.lib1.Lib1Class.foo(); - foo2(); - } - } - """.trimIndent() - ) - } - - run( - autoCorrect = true - ).isSuccess shouldBe true - - lib2.buildFile.readText() shouldBe """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.collectReport() - .joinToString() - .clean() shouldBe """ModuleCheck found 0 issues""" - } - - @Test - fun `fully qualified property reference from java file should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - object Lib1Class { - @JvmStatic val property = 1 - } - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile.writeText( - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """.trimIndent() - ) - - addJavaSource( - """ - package com.modulecheck.lib2; - - public class Lib2Class { - void someFunction() { - int i = com.modulecheck.lib1.Lib1Class.getProperty(); - } - } - """.trimIndent() - ) - } - - run( - autoCorrect = true - ).isSuccess shouldBe true - - lib2.buildFile.readText() shouldBe """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.collectReport() - .joinToString() - .clean() shouldBe """ModuleCheck found 0 issues""" - } - - @Test - fun `static import from java file should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - object Lib1Class { - @JvmStatic fun foo() = Unit - } - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile.writeText( - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """.trimIndent() - ) - - addJavaSource( - """ - package com.modulecheck.lib2; - - import static com.modulecheck.lib1.Lib1Class.foo; - - public class Lib2Class { - } - """.trimIndent() - ) - } - - run( - autoCorrect = true - ).isSuccess shouldBe true - - lib2.buildFile.readText() shouldBe """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.collectReport() - .joinToString() - .clean() shouldBe """ModuleCheck found 0 issues""" - } - - @Test - fun `module contributing a named companion object, consumed in the same package should not be unused`() = - test { - // https://github.com/RBusarow/ModuleCheck/issues/705 - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.common - - class Lib1Class { - companion object Factory { - fun create() = Lib1Class() - } - } - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.common - - fun foo() { - bar(Lib1Class.create()) - } - - fun bar(any: Any) = Unit - """.trimIndent(), - SourceSetName.MAIN - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `module contributing a named companion object, consumed by the companion name should not be unused`() = - test { - // https://github.com/RBusarow/ModuleCheck/issues/705 - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.common - - class Lib1Class { - companion object Factory { - fun create() = Lib1Class() - } - } - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.common - - import com.modulecheck.common.Lib1Class.Factory - - fun foo() { - bar(Factory.create()) - } - - fun bar(any: Any) = Unit - """.trimIndent(), - SourceSetName.MAIN - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `testImplementation used in test should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `androidTestImplementation used in androidTest should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """.trimIndent() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.androidTestImplementation, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - androidTestImplementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """.trimIndent(), - SourceSetName.ANDROID_TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - androidTestImplementation(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `custom view used in a layout file should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1View - """.trimIndent() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - - addLayoutFile( - "fragment_lib2.xml", - """ - - - - - - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `module contributing a used generated DataBinding object should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - platformPlugin.viewBindingEnabled = true - - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.databinding.FragmentLib1Binding - - val binding = FragmentLib1Binding() - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `module contributing a used layout with non-transitive R should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - platformPlugin.viewBindingEnabled = true - - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.R - - val layout = R.layout.fragment_lib1 - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `module contributing a used layout with local R should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - platformPlugin.viewBindingEnabled = true - - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - val layout = R.layout.fragment_lib1 - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `module contributing a used id from a layout with non-transitive R should not be unused`() = - test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - platformPlugin.viewBindingEnabled = true - - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.R - - val id = R.id.fragment_container - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `module contributing a used id from a layout with local R should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - platformPlugin.viewBindingEnabled = true - - addLayoutFile( - "fragment_lib1.xml", - """ - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - platformPlugin.viewBindingEnabled = false - - addKotlinSource( - """ - package com.modulecheck.lib2 - - val id = R.id.fragment_container - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `declaration used via a wildcard import should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.* - - val lib1Class = Lib1Class() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `testFixtures declaration used in test should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.* - - val lib1Class = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused from testFixtures with auto-correct should be fixed`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - } - """ - } - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - // testImplementation(testFixtures(project(path = ":lib1"))) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - unusedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `unused from testFixtures but used main source should be fixed`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """.trimIndent(), - SourceSetName.MAIN - ) - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class TestLib1Class - """.trimIndent(), - SourceSetName.TEST_FIXTURES - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.testImplementation, lib1, asTestFixture = true) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(testFixtures(project(path = ":lib1"))) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """.trimIndent(), - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - testImplementation(project(path = ":lib1")) - // testImplementation(testFixtures(project(path = ":lib1"))) // ModuleCheck finding [unused-dependency] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib2" to listOf( - overshot( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ), - unusedDependency( - fixed = true, - configuration = "testImplementation", - dependency = ":lib1", - position = "6, 3" - ) - ) - ) - } - - @Test - fun `string resource declaration should not be unused if's used with a different R namespace`() = - test { - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - """ - } - addResourceFile( - "values/strings.xml", - """ - | lib1 - | - """.trimMargin() - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(":lib1")) - } - """ - } - } - - androidLibrary(":lib3", "com.modulecheck.lib3") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - platformPlugin.androidResourcesEnabled = false - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - implementation(project(":lib1")) - implementation(project(":lib2")) - } - """ - } - addSource( - "com/modulecheck/lib3/internal/Source.kt", - """ - package com.modulecheck.lib3 - - import com.modulecheck.lib2.R - - val r = R.string.string_from_lib1 - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `static member declaration used via wildcard import should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class { - companion object { - fun build(): Lib1Class = Lib1Class() - } - } - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.* - - val lib1Class = Lib1Class.build() - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `string resource used in module should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - - addResourceFile( - "values/strings.xml", - """ - - MyApp - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - val theString = R.string.app_name - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `string resource used in manifest should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - - addResourceFile( - "values/strings.xml", - """ - - MyApp - - """ - ) - } - - val lib2 = androidLibrary(":lib2", "com.modulecheck.lib2") { - addDependency(ConfigurationName.api, lib1) - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - - addManifest( - """ - - - - - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `style resource with dot-qualified name used in kotlin source should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - - addResourceFile( - "values/strings.xml", - """ - - - - """ - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - id("com.android.library") - kotlin("android") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `declaration used via class reference with wildcard import should not be unused`() = test { - - settings.deleteUnused = false - - val lib1 = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.modulecheck.lib1 - - abstract class Lib1Class private constructor() - """.trimIndent() - ) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.api, lib1) - anvilGradlePlugin = AnvilGradlePlugin(SemVer(2, 3, 8), true) - - buildFile { - """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.* - import com.squareup.anvil.annotations.ContributesTo - import dagger.Module - - @Module - @ContributesTo(Lib1Class::class) - object MyModule - """.trimIndent() - ) - } - - run().isSuccess shouldBe true - - lib2.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") - } - - dependencies { - api(project(path = ":lib1")) - } - """ - - logger.parsedReport() shouldBe emptyList() - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKaptPluginTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKaptPluginTest.kt deleted file mode 100644 index c58f7a6895..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKaptPluginTest.kt +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@file:Suppress("DEPRECATION") - -package modulecheck.core - -import modulecheck.api.KaptMatcher -import modulecheck.config.CodeGeneratorBinding -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.runtime.test.ProjectFindingReport.unusedKaptPlugin -import modulecheck.runtime.test.RunnerTest -import org.junit.jupiter.api.Test - -class UnusedKaptPluginTest : RunnerTest() { - - val dagger = "com.google.dagger:dagger-compiler:2.40.5" - - @Test - fun `plugin applied but with processor in non-kapt configuration without autoCorrect should remove plugin`() = - test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.api, dagger) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - api("$dagger") - } - """ - } - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - // kotlin("kapt") // ModuleCheck finding [unused-kapt-plugin] - } - - dependencies { - api("$dagger") - } - """ - - logger.parsedReport() shouldBe listOf( - ":app" to listOf( - unusedKaptPlugin( - fixed = true, - dependency = "org.jetbrains.kotlin.kapt", - position = "3, 3" - ) - ) - ) - } - - @Test - fun `unused with main kapt no other processors should remove plugin`() = test { - - val app = kotlinProject(":app") { - hasKapt = true - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - """ - } - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - // id("kotlin-kapt") // ModuleCheck finding [unused-kapt-plugin] - } - """ - - logger.parsedReport() shouldBe listOf( - ":app" to listOf( - unusedKaptPlugin( - fixed = true, - dependency = "org.jetbrains.kotlin.kapt", - position = "3, 3" - ) - ) - ) - } - - @Test - fun `unused kapt should be ignored if suppressed at the statement`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - hasKapt = true - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unused-kapt-plugin") - id("org.jetbrains.kotlin.kapt") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unused-kapt-plugin") - id("org.jetbrains.kotlin.kapt") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused kapt should be ignored if suppressed with old finding name`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - hasKapt = true - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unusedkaptplugin") - id("org.jetbrains.kotlin.kapt") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unusedkaptplugin") - id("org.jetbrains.kotlin.kapt") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused kapt should be fixed if suppressed with some other finding name`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - hasKapt = true - - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("some-other-name") - id("org.jetbrains.kotlin.kapt") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("some-other-name") - // id("org.jetbrains.kotlin.kapt") // ModuleCheck finding [unused-kapt-plugin] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf( - unusedKaptPlugin( - fixed = true, - dependency = "org.jetbrains.kotlin.kapt", - position = "5, 3" - ) - ) - ) - } - - @Test - fun `unused kapt should be ignored if suppressed at the block`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - hasKapt = true - buildFile { - """ - @Suppress("unused-kapt-plugin") - plugins { - id("com.android.library") - kotlin("android") - id("org.jetbrains.kotlin.kapt") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - @Suppress("unused-kapt-plugin") - plugins { - id("com.android.library") - kotlin("android") - id("org.jetbrains.kotlin.kapt") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused processor should not make the plugin unused if the processor is suppressed`() = test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, dagger) - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - @Suppress("unused-kapt-processor") - kapt("$dagger") - } - """ - } - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - @Suppress("unused-kapt-processor") - kapt("$dagger") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used custom processor using KaptMatcher should not make the plugin unused`() = test { - - @Suppress("DEPRECATION") - settings.additionalKaptMatchers = listOf( - KaptMatcher( - name = "Processor", - processor = "com.modulecheck:processor", - annotationImports = listOf( - """com\.modulecheck\.annotations\.\*""", - """com\.modulecheck\.annotations\.TheAnnotation""" - ) - ) - ) - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, "com.modulecheck:processor:0.0.1") - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kapt("com.modulecheck:processor:0.0.1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.modulecheck.annotations.TheAnnotation - - @TheAnnotation - class Lib1Class - """ - ) - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kapt("com.modulecheck:processor:0.0.1") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used custom processor in test source using KaptMatcher should not make the plugin unused`() = - test { - - @Suppress("DEPRECATION") - settings.additionalKaptMatchers = listOf( - KaptMatcher( - name = "Processor", - processor = "com.modulecheck:processor", - annotationImports = listOf( - """com\.modulecheck\.annotations\.TheAnnotation""" - ) - ) - ) - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency("kaptTest".asConfigurationName(), "com.modulecheck:processor:0.0.1") - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kaptTest("com.modulecheck:processor:0.0.1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.annotations - - @TheAnnotation - class Lib1Class - """, - SourceSetName.TEST - ) - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kaptTest("com.modulecheck:processor:0.0.1") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used custom annotation processor using CodeGeneratorBinding should not make the plugin unused`() = - test { - - settings.additionalCodeGenerators = listOf( - CodeGeneratorBinding.AnnotationProcessor( - "Processor", - "com.modulecheck:processor", - listOf( - "com.modulecheck.annotations.TheAnnotation" - ) - ) - ) - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, "com.modulecheck:processor:0.0.1") - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kapt("com.modulecheck:processor:0.0.1") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - import com.modulecheck.annotations.TheAnnotation - - @TheAnnotation - class Lib1Class - """ - ) - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kapt("com.modulecheck:processor:0.0.1") - } - """ - - logger.parsedReport() shouldBe emptyList() - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKaptProcessorTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKaptProcessorTest.kt deleted file mode 100644 index 8077eea48f..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKaptProcessorTest.kt +++ /dev/null @@ -1,488 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.runtime.test.ProjectFindingReport.overshot -import modulecheck.runtime.test.ProjectFindingReport.unusedKaptPlugin -import modulecheck.runtime.test.ProjectFindingReport.unusedKaptProcessor -import modulecheck.runtime.test.RunnerTest -import org.junit.jupiter.api.Test - -class UnusedKaptProcessorTest : RunnerTest() { - - val dagger = "com.google.dagger:dagger-compiler:2.40.5" - - @Test - fun `unused from kapt configuration without autoCorrect should fail`() = test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, dagger) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kapt("$dagger") - } - """ - } - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - app.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kapt("$dagger") - } - """ - - logger.parsedReport() shouldBe listOf( - ":app" to listOf( - unusedKaptProcessor( - fixed = false, - configuration = "kapt", - dependency = dagger, - position = "7, 3" - ), - unusedKaptPlugin( - fixed = false, - dependency = "org.jetbrains.kotlin.kapt", - position = "3, 3" - ) - ) - ) - } - - @Test - fun `unused from kapt configuration with alternate plugin id without autoCorrect should fail`() = - test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, dagger) - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kapt("$dagger") - } - """ - } - } - - run( - autoCorrect = false - ).isSuccess shouldBe false - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kapt("$dagger") - } - """ - - logger.parsedReport() shouldBe listOf( - ":app" to listOf( - unusedKaptProcessor( - fixed = false, - configuration = "kapt", - dependency = dagger, - position = "7, 3" - ), - unusedKaptPlugin( - fixed = false, - dependency = "org.jetbrains.kotlin.kapt", - position = "3, 3" - ) - ) - ) - } - - @Test - fun `processor in non-kapt configuration without autoCorrect should pass without changes`() = - test { - - val app = kotlinProject(":app") { - - addExternalDependency(ConfigurationName.api, dagger) - - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - api("$dagger") - } - """ - } - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - api("$dagger") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used in main with main kapt should pass without changes`() = test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, dagger) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kapt("$dagger") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.app - - import javax.inject.Inject - - class App @Inject constructor() - """ - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kapt("$dagger") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used in test with test kapt should pass without changes`() = test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency("kaptTest".asConfigurationName(), dagger) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kaptTest("$dagger") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.app - - import javax.inject.Inject - - class App @Inject constructor() - """, - SourceSetName.TEST - ) - } - - run( - autoCorrect = false - ).isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kaptTest("$dagger") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used in debug with main kapt should be auto-corrected to kaptDebug as overshot`() = test { - - val app = androidLibrary(":app", "com.modulecheck.app") { - hasKapt = true - - addExternalDependency("kapt".asConfigurationName(), dagger) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kapt("$dagger") - } - """ - } - addKotlinSource( - """ - package com.modulecheck.app - - import javax.inject.Inject - - class App @Inject constructor() - """, - SourceSetName.DEBUG - ) - } - - run( - autoCorrect = true - ).isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kaptDebug("$dagger") - // kapt("$dagger") // ModuleCheck finding [unused-kapt-processor] - } - """ - - logger.parsedReport() shouldBe listOf( - ":app" to listOf( - overshot( - fixed = true, - configuration = "kaptDebug", - dependency = dagger, - position = "7, 3" - ), - unusedKaptProcessor( - fixed = true, - configuration = "kapt", - dependency = dagger, - position = "7, 3" - ) - ) - ) - } - - @Test - fun `unused with main kapt with autoCorrect and no other processors should remove processor and plugin`() = - test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, dagger) - - buildFile { - """ - plugins { - kotlin("jvm") - kotlin("kapt") - } - - dependencies { - kapt("$dagger") - } - """ - } - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - // kotlin("kapt") // ModuleCheck finding [unused-kapt-plugin] - } - - dependencies { - // kapt("$dagger") // ModuleCheck finding [unused-kapt-processor] - } - """ - - logger.parsedReport() shouldBe listOf( - ":app" to listOf( - unusedKaptProcessor( - fixed = true, - configuration = "kapt", - dependency = dagger, - position = "7, 3" - ), - unusedKaptPlugin( - fixed = true, - dependency = "org.jetbrains.kotlin.kapt", - position = "3, 3" - ) - ) - ) - } - - @Test - fun `unused with main kapt with alternate plugin id with autoCorrect and no other processors should remove processor and plugin`() = - test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, dagger) - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - kapt("$dagger") - } - """ - } - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - // id("kotlin-kapt") // ModuleCheck finding [unused-kapt-plugin] - } - - dependencies { - // kapt("$dagger") // ModuleCheck finding [unused-kapt-processor] - } - """ - - logger.parsedReport() shouldBe listOf( - ":app" to listOf( - unusedKaptProcessor( - fixed = true, - configuration = "kapt", - dependency = dagger, - position = "7, 3" - ), - unusedKaptPlugin( - fixed = true, - dependency = "org.jetbrains.kotlin.kapt", - position = "3, 3" - ) - ) - ) - } - - @Test - fun `unused processor should not be unused if suppressed`() = test { - - val app = kotlinProject(":app") { - hasKapt = true - - addExternalDependency(ConfigurationName.kapt, dagger) - - buildFile { - """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - @Suppress("unused-kapt-processor") - kapt("$dagger") - } - """ - } - } - - run().isSuccess shouldBe true - - app.buildFile shouldHaveText """ - plugins { - id("kotlin-jvm") - id("kotlin-kapt") - } - - dependencies { - @Suppress("unused-kapt-processor") - kapt("$dagger") - } - """ - - logger.parsedReport() shouldBe emptyList() - } -} diff --git a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKotlinAndroidExtensionsTest.kt b/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKotlinAndroidExtensionsTest.kt deleted file mode 100644 index 9c2b9684a7..0000000000 --- a/modulecheck-core/src/test/kotlin/modulecheck/core/UnusedKotlinAndroidExtensionsTest.kt +++ /dev/null @@ -1,345 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.core - -import modulecheck.config.fake.TestChecksSettings -import modulecheck.config.fake.TestSettings -import modulecheck.project.generation.AndroidPlatformPluginBuilder -import modulecheck.project.generation.McProjectBuilder -import modulecheck.runtime.test.ProjectFindingReport.unusedKotlinAndroidExtensions -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.testing.writeKotlin -import org.junit.jupiter.api.Test - -class UnusedKotlinAndroidExtensionsTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings( - checks = TestChecksSettings( - unusedKotlinAndroidExtensions = true - ) - ) - } - - @Test - fun `unused KotlinAndroidExtensions should pass if check is disabled`() = test { - settings.checks.unusedKotlinAndroidExtensions = false - - androidLibrary(":lib1", "com.modulecheck.lib1") { - writeBuildFileWithPlugin() - addAnyLayoutFile() - } - - run(autoCorrect = false).isSuccess shouldBe true - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused KotlinAndroidExtensions without auto-correct should fail`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - writeBuildFileWithPlugin() - addAnyLayoutFile() - } - - run(autoCorrect = false).isSuccess shouldBe false - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - kotlin("android-extensions") - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unusedKotlinAndroidExtensions(fixed = false, position = "4, 3")) - ) - } - - @Test - fun `used KotlinAndroidExtensions synthetics should pass and should not be corrected`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - writeBuildFileWithPlugin() - addAnyLayoutFile() - addKotlinSource( - """ - package com.modulecheck.lib1 - - import android.app.Activity - import kotlinx.android.synthetic.main.fragment_lib1.* - - class SampleActivity : Activity { - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.fragment_lib1) - - text_view.setText("Some text") - } - } - """ - ) - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - kotlin("android-extensions") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `used KotlinAndroidExtensions parcelize should pass and should not be corrected`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - writeBuildFileWithPlugin() - addKotlinSource( - """ - package com.modulecheck.lib1 - - import android.os.Parcelable - import kotlinx.android.parcel.Parcelize - - @Parcelize - class SomeClass : Parcelable - """ - ) - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - kotlin("android-extensions") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused KotlinAndroidExtensions should be fixed`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - writeBuildFileWithPlugin() - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - // kotlin("android-extensions") // ModuleCheck finding [unused-kotlin-android-extensions] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unusedKotlinAndroidExtensions(fixed = true, position = "4, 3")) - ) - } - - @Test - fun `unused KotlinAndroidExtensions from id should be fixed`() = test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - id("org.jetbrains.kotlin.android.extensions") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - // id("org.jetbrains.kotlin.android.extensions") // ModuleCheck finding [unused-kotlin-android-extensions] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unusedKotlinAndroidExtensions(fixed = true, position = "4, 3")) - ) - } - - @Test - fun `unused KotlinAndroidExtensions from id should be ignored if suppressed at the statement`() = - test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unused-kotlin-android-extensions") - id("org.jetbrains.kotlin.android.extensions") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unused-kotlin-android-extensions") - id("org.jetbrains.kotlin.android.extensions") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused KotlinAndroidExtensions from id should be ignored if suppressed with old finding name`() = - test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unusedkotlinandroidextensions") - id("org.jetbrains.kotlin.android.extensions") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("unusedkotlinandroidextensions") - id("org.jetbrains.kotlin.android.extensions") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - @Test - fun `unused KotlinAndroidExtensions from id should be fixed if suppressed with some other finding name`() = - test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("some-other-name") - id("org.jetbrains.kotlin.android.extensions") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - plugins { - id("com.android.library") - kotlin("android") - @Suppress("some-other-name") - // id("org.jetbrains.kotlin.android.extensions") // ModuleCheck finding [unused-kotlin-android-extensions] - } - """ - - logger.parsedReport() shouldBe listOf( - ":lib1" to listOf(unusedKotlinAndroidExtensions(fixed = true, position = "5, 3")) - ) - } - - @Test - fun `unused KotlinAndroidExtensions from id should be ignored if suppressed at the block`() = - test { - val lib1 = androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - @Suppress("unused-kotlin-android-extensions") - plugins { - id("com.android.library") - kotlin("android") - id("org.jetbrains.kotlin.android.extensions") - } - """ - } - } - - run(autoCorrect = true).isSuccess shouldBe true - - lib1.buildFile.readText() shouldBe """ - @Suppress("unused-kotlin-android-extensions") - plugins { - id("com.android.library") - kotlin("android") - id("org.jetbrains.kotlin.android.extensions") - } - """ - - logger.parsedReport() shouldBe emptyList() - } - - private fun McProjectBuilder<*>.writeBuildFileWithPlugin() { - buildFile.writeKotlin( - """ - plugins { - id("com.android.library") - kotlin("android") - kotlin("android-extensions") - } - """ - ) - } - - private fun > McProjectBuilder.addAnyLayoutFile() { - addLayoutFile( - "fragment_lib1.xml", - """ - - - - - - """ - ) - } -} diff --git a/modulecheck-dagger/api/modulecheck-dagger.api b/modulecheck-dagger/api/modulecheck-dagger.api deleted file mode 100644 index 87352189f3..0000000000 --- a/modulecheck-dagger/api/modulecheck-dagger.api +++ /dev/null @@ -1,22 +0,0 @@ -public abstract interface class modulecheck/dagger/DocsWebsiteUrlProvider : javax/inject/Provider { - public abstract fun get ()Ljava/lang/String; -} - -public abstract interface class modulecheck/dagger/ModuleCheckVersionProvider : javax/inject/Provider { - public abstract fun get ()Ljava/lang/String; -} - -public abstract interface annotation class modulecheck/dagger/RootGradleProject : java/lang/annotation/Annotation { -} - -public abstract interface annotation class modulecheck/dagger/SingleIn : java/lang/annotation/Annotation { - public abstract fun scope ()Ljava/lang/Class; -} - -public abstract interface class modulecheck/dagger/SourceWebsiteUrlProvider : javax/inject/Provider { - public abstract fun get ()Ljava/lang/String; -} - -public abstract class modulecheck/dagger/TaskScope { -} - diff --git a/modulecheck-dagger/build.gradle.kts b/modulecheck-dagger/build.gradle.kts deleted file mode 100644 index 34b17abea8..0000000000 --- a/modulecheck-dagger/build.gradle.kts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-dagger" - ) - anvil() -} - -dependencies { - - compileOnly(libs.google.dagger.api) - compileOnly(libs.javax.inject) - compileOnly(libs.square.anvil.annotations) -} diff --git a/modulecheck-dagger/src/main/kotlin/modulecheck/dagger/TaskScope.kt b/modulecheck-dagger/src/main/kotlin/modulecheck/dagger/TaskScope.kt deleted file mode 100644 index cbff2376a1..0000000000 --- a/modulecheck-dagger/src/main/kotlin/modulecheck/dagger/TaskScope.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.dagger - -import javax.inject.Provider -import javax.inject.Qualifier -import javax.inject.Scope -import kotlin.reflect.KClass - -/** Tied to a single Gradle task. Currently, that's essentially the same as an `AppScope`. */ -@Suppress("UnnecessaryAbstractClass") -abstract class TaskScope private constructor() - -/** path of ":" */ -@Qualifier -annotation class RootGradleProject - -/** - * Indicates that the annotated dependency will be a singleton within this scope. - * - * @property scope the scope in which this will be a singleton. - * @since 0.12.0 - */ -@Scope -@Retention(AnnotationRetention.RUNTIME) -annotation class SingleIn( - @Suppress("UNUSED") - val scope: KClass<*> -) - -/** - * example: "https://github.com/rbusarow/ModuleCheck" - * - * taken from the generated BuildProperties class - * - * @since 0.12.0 - */ -fun interface SourceWebsiteUrlProvider : Provider { - override fun get(): String -} - -/** - * example: "0.13.0" - * - * @since 0.12.0 - */ -fun interface ModuleCheckVersionProvider : Provider { - override fun get(): String -} - -/** - * example: "https://rbusarow.github.io/ModuleCheck" - * - * taken from the generated BuildProperties class - * - * @since 0.12.0 - */ -fun interface DocsWebsiteUrlProvider : Provider { - override fun get(): String -} diff --git a/modulecheck-dagger/src/main/kotlin/modulecheck/dagger/typealias.kt b/modulecheck-dagger/src/main/kotlin/modulecheck/dagger/typealias.kt deleted file mode 100644 index 09c83d8ec4..0000000000 --- a/modulecheck-dagger/src/main/kotlin/modulecheck/dagger/typealias.kt +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.dagger - -/** - * shorthand for `Set<@JvmSuppressWildcards T>` - * - * @since 0.12.0 - */ -typealias DaggerSet = Set<@JvmSuppressWildcards T> - -/** - * shorthand for `List<@JvmSuppressWildcards T>` - * - * @since 0.12.0 - */ -typealias DaggerList = List<@JvmSuppressWildcards T> - -/** shorthand for `dagger.Lazy<@JvmSuppressWildcards T>` */ -typealias DaggerLazy = dagger.Lazy<@JvmSuppressWildcards T> diff --git a/modulecheck-finding/api/api/api.api b/modulecheck-finding/api/api/api.api deleted file mode 100644 index 5de623fa3b..0000000000 --- a/modulecheck-finding/api/api/api.api +++ /dev/null @@ -1,138 +0,0 @@ -public abstract interface class modulecheck/finding/AddsDependency : modulecheck/finding/Fixable { - public fun addDependency (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getNewDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; -} - -public abstract interface class modulecheck/finding/ConfigurationFinding { - public abstract fun getConfigurationName-9LqIWVA ()Ljava/lang/String; -} - -public abstract interface class modulecheck/finding/ConfiguredDependencyFinding : modulecheck/finding/ConfigurationFinding { - public abstract fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public abstract fun getDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; -} - -public abstract interface class modulecheck/finding/Deletable : modulecheck/finding/DependencyFinding, modulecheck/finding/Finding { - public fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/finding/DependencyFinding { - public abstract fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public abstract interface class modulecheck/finding/Finding { - public abstract fun getBuildFile ()Ljava/io/File; - public abstract fun getDependencyIdentifier ()Ljava/lang/String; - public abstract fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public abstract fun getDependentProject ()Lmodulecheck/project/McProject; - public abstract fun getFindingName ()Lmodulecheck/finding/FindingName; - public abstract fun getMessage ()Ljava/lang/String; - public abstract fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun toResult (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/finding/Finding$FindingResult { - public fun (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/finding/FindingName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/finding/Finding$Position;Ljava/io/File;Ljava/lang/String;Z)V - public final fun component1 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component2 ()Lmodulecheck/finding/FindingName; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Lmodulecheck/finding/Finding$Position; - public final fun component7 ()Ljava/io/File; - public final fun component8 ()Ljava/lang/String; - public final fun component9 ()Z - public final fun copy (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/finding/FindingName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/finding/Finding$Position;Ljava/io/File;Ljava/lang/String;Z)Lmodulecheck/finding/Finding$FindingResult; - public static synthetic fun copy$default (Lmodulecheck/finding/Finding$FindingResult;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/finding/FindingName;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/finding/Finding$Position;Ljava/io/File;Ljava/lang/String;ZILjava/lang/Object;)Lmodulecheck/finding/Finding$FindingResult; - public fun equals (Ljava/lang/Object;)Z - public final fun getBuildFile ()Ljava/io/File; - public final fun getConfigurationName ()Ljava/lang/String; - public final fun getDependencyIdentifier ()Ljava/lang/String; - public final fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun getFilePathString ()Ljava/lang/String; - public final fun getFindingName ()Lmodulecheck/finding/FindingName; - public final fun getFixed ()Z - public final fun getMessage ()Ljava/lang/String; - public final fun getPositionOrNull ()Lmodulecheck/finding/Finding$Position; - public final fun getSourceOrNull ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/Finding$Position : java/lang/Comparable { - public fun (II)V - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/finding/Finding$Position;)I - public final fun component1 ()I - public final fun component2 ()I - public final fun copy (II)Lmodulecheck/finding/Finding$Position; - public static synthetic fun copy$default (Lmodulecheck/finding/Finding$Position;IIILjava/lang/Object;)Lmodulecheck/finding/Finding$Position; - public fun equals (Ljava/lang/Object;)Z - public final fun getColumn ()I - public final fun getRow ()I - public fun hashCode ()I - public final fun logString ()Ljava/lang/String; - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/finding/FindingResultFactory { - public abstract fun create (Ljava/util/List;ZZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/finding/Fixable : modulecheck/finding/Finding, modulecheck/finding/Problem { - public static final field Companion Lmodulecheck/finding/Fixable$Companion; - public static final field FIX_LABEL Ljava/lang/String; - public fun fix (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun fixLabel ()Ljava/lang/String; -} - -public final class modulecheck/finding/Fixable$Companion { - public static final field FIX_LABEL Ljava/lang/String; -} - -public abstract interface class modulecheck/finding/ModifiesProjectDependency : modulecheck/finding/AddsDependency, modulecheck/finding/RemovesDependency { -} - -public abstract interface class modulecheck/finding/Problem : modulecheck/finding/DependencyFinding, modulecheck/finding/Finding { - public fun isSuppressed ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun toResult (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/finding/ProjectDependencyFinding : modulecheck/finding/ConfigurationFinding, modulecheck/finding/ConfiguredDependencyFinding { - public abstract fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public abstract fun getDependency ()Lmodulecheck/model/dependency/ProjectDependency; -} - -public abstract interface class modulecheck/finding/RemovesDependency : modulecheck/finding/Fixable { - public abstract fun getOldDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun removeDependency (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/finding/RemovesDependency$RemovalStrategy : java/lang/Enum { - public static final field COMMENT Lmodulecheck/finding/RemovesDependency$RemovalStrategy; - public static final field DELETE Lmodulecheck/finding/RemovesDependency$RemovalStrategy; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/finding/RemovesDependency$RemovalStrategy; - public static fun values ()[Lmodulecheck/finding/RemovesDependency$RemovalStrategy; -} - -public final class modulecheck/finding/Suppressions { - public fun (Ljava/util/Map;)V - public final fun get (Lmodulecheck/finding/FindingName;)Ljava/util/Set; - public final fun get (Lmodulecheck/model/dependency/Dependency;)Ljava/util/Set; -} - -public final class modulecheck/finding/SuppressionsKt { - public static final fun getSuppressions (Lmodulecheck/parsing/gradle/dsl/HasBuildFile;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/finding/internal/McProjectKt { - public static final fun positionIn (Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun statementOrNullIn (Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/finding/internal/StringKt { - public static final fun positionOfStatement (Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/finding/Finding$Position; -} - diff --git a/modulecheck-finding/api/build.gradle.kts b/modulecheck-finding/api/build.gradle.kts deleted file mode 100644 index 12ce264401..0000000000 --- a/modulecheck-finding/api/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-finding-api" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-project:api")) - - implementation(project(path = ":modulecheck-parsing:gradle:dsl:precompiled")) - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/AddsDependency.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/AddsDependency.kt deleted file mode 100644 index aa96f4f13f..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/AddsDependency.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.parsing.gradle.dsl.addDependency -import modulecheck.parsing.gradle.dsl.asDeclaration - -interface AddsDependency : Fixable { - - /** - * The dependency to be added - * - * @since 0.12.0 - */ - val newDependency: ConfiguredDependency - - suspend fun addDependency(): Boolean { - - val (newDeclaration, tokenOrNull) = newDependency - .asDeclaration(dependentProject) - - dependentProject.addDependency(newDependency, newDeclaration, tokenOrNull) - - return true - } -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Deletable.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Deletable.kt deleted file mode 100644 index fe7869c58b..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Deletable.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.parsing.gradle.dsl.removeDependencyWithDelete - -interface Deletable : - Finding, - DependencyFinding { - - suspend fun delete(): Boolean { - - val declaration = statementOrNull.await() ?: return false - - require(this is RemovesDependency) - - dependentProject.removeDependencyWithDelete(declaration, oldDependency) - - return true - } -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Finding.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Finding.kt deleted file mode 100644 index cde0947960..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Finding.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import java.io.File - -interface Finding { - - val dependentProject: McProject - - val findingName: FindingName - - val dependentPath: StringProjectPath - val message: String - val buildFile: File - - val dependencyIdentifier: String - - val positionOrNull: LazyDeferred - - suspend fun toResult(fixed: Boolean): FindingResult - - data class Position( - val row: Int, - val column: Int - ) : Comparable { - fun logString(): String = "($row, $column): " - override fun compareTo(other: Position): Int { - return row.compareTo(other.row) - } - } - - data class FindingResult( - val dependentPath: StringProjectPath, - val findingName: FindingName, - val sourceOrNull: String?, - val configurationName: String, - val dependencyIdentifier: String, - val positionOrNull: Position?, - val buildFile: File, - val message: String, - val fixed: Boolean - ) { - val filePathString: String = "${buildFile.path}: ${positionOrNull?.logString().orEmpty()}" - } -} - -interface DependencyFinding { - - val statementOrNull: LazyDeferred - val statementTextOrNull: LazyDeferred -} - -interface ConfigurationFinding { - - val configurationName: ConfigurationName -} - -interface ProjectDependencyFinding : - ConfiguredDependencyFinding, - ConfigurationFinding { - override val dependency: ProjectDependency - - override val configurationName: ConfigurationName -} - -interface ConfiguredDependencyFinding : ConfigurationFinding { - val dependency: ConfiguredDependency - - override val configurationName: ConfigurationName -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/FindingResultFactory.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/FindingResultFactory.kt deleted file mode 100644 index 5e334f6f73..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/FindingResultFactory.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.FindingResult - -fun interface FindingResultFactory { - - suspend fun create( - findings: List, - autoCorrect: Boolean, - deleteUnused: Boolean - ): List -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Fixable.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Fixable.kt deleted file mode 100644 index bdece8533d..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Fixable.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.RemovesDependency.RemovalStrategy - -interface ModifiesProjectDependency : RemovesDependency, AddsDependency - -interface Fixable : Finding, Problem { - - suspend fun fix(removalStrategy: RemovalStrategy): Boolean { - - var addSuccessful = true - var removeSuccessful = true - - if (this is AddsDependency) { - addSuccessful = addDependency() - } - - if (this is RemovesDependency) { - - removeSuccessful = removeDependency(removalStrategy) - } - - return addSuccessful && removeSuccessful - } - - fun fixLabel(): String = " $FIX_LABEL [${findingName.id}]" - - companion object { - - const val FIX_LABEL: String = "// ModuleCheck finding" - } -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Problem.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Problem.kt deleted file mode 100644 index 5b3955c2be..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Problem.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.FindingResult -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.safeAs - -interface Problem : - Finding, - DependencyFinding { - - /** - * Whether this Problem should be ignored. True if the associated statement - * is annotated with `@Suppress` and the corresponding finding ID. - * - * @since 0.12.0 - */ - val isSuppressed: LazyDeferred - get() = lazyDeferred { - statementOrNull.await() - ?.suppressed - ?.contains(findingName.id) - ?: false - } - - override suspend fun toResult(fixed: Boolean): FindingResult { - return FindingResult( - dependentPath = dependentPath, - findingName = findingName, - sourceOrNull = null, - configurationName = safeAs()?.configurationName?.value.orEmpty(), - dependencyIdentifier = dependencyIdentifier, - positionOrNull = positionOrNull.await(), - buildFile = buildFile, - message = message, - fixed = fixed - ) - } -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/RemovesDependency.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/RemovesDependency.kt deleted file mode 100644 index ff9733cceb..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/RemovesDependency.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.RemovesDependency.RemovalStrategy.COMMENT -import modulecheck.finding.RemovesDependency.RemovalStrategy.DELETE -import modulecheck.finding.internal.statementOrNullIn -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ProjectDependency -import modulecheck.parsing.gradle.dsl.removeDependencyWithComment -import modulecheck.parsing.gradle.dsl.removeDependencyWithDelete - -interface RemovesDependency : Fixable { - - val oldDependency: ConfiguredDependency - - suspend fun removeDependency(removalStrategy: RemovalStrategy): Boolean { - - val oldDeclaration = (oldDependency as? ProjectDependency) - ?.statementOrNullIn(dependentProject) - ?: statementOrNull.await() - ?: return false - - when (removalStrategy) { - DELETE -> dependentProject.removeDependencyWithDelete(oldDeclaration, oldDependency) - COMMENT -> dependentProject.removeDependencyWithComment( - statement = oldDeclaration, - fixLabel = fixLabel(), - configuredDependency = oldDependency - ) - } - return true - } - - enum class RemovalStrategy { - DELETE, - COMMENT - } -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Suppressions.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Suppressions.kt deleted file mode 100644 index 820f7f7459..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/Suppressions.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.model.dependency.Dependency -import modulecheck.model.dependency.PluginDependency.Companion.toPluginDependency -import modulecheck.parsing.gradle.dsl.HasBuildFile -import modulecheck.project.HasProjectCache - -class Suppressions( - private val delegate: Map> -) { - - private val reverseMap by lazy { - buildMap> { - delegate.forEach { (cpd, names) -> - - names.forEach { name -> - val setWithNewCpd = getOrPut(name) { mutableSetOf() } - .apply { add(cpd) } - put(name, setWithNewCpd) - } - } - } - } - - fun get(dependency: Dependency): Set { - return delegate[dependency].orEmpty() - } - - fun get(findingName: FindingName): Set { - return reverseMap[findingName].orEmpty() - } -} - -suspend fun T.getSuppressions(): Suppressions - where T : HasBuildFile, - T : HasProjectCache { - val fromDependencies = buildFileParser.dependenciesBlocks() - .map { it.allSuppressions } - .fold(mutableMapOf>()) { acc, block -> - - block.forEach { (cpd, newNames) -> - - val cachedNames = acc.getOrPut(cpd) { mutableSetOf() } - - cachedNames.addAll(newNames) - } - acc - } - - buildFileParser.pluginsBlock() - ?.let { pluginsBlock -> - - pluginsBlock.allSuppressions.forEach { (pluginDeclaration, newNames) -> - val dependency = pluginDeclaration.accessor.toPluginDependency() - - val cachedNames = fromDependencies.getOrPut(dependency) { mutableSetOf() } - - cachedNames.addAll(newNames) - } - } - - return Suppressions(fromDependencies) -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/internal/mcProject.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/internal/mcProject.kt deleted file mode 100644 index e8082b0f6b..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/internal/mcProject.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding.internal - -import modulecheck.finding.Finding.Position -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ExternalDependency -import modulecheck.model.dependency.ProjectDependency -import modulecheck.parsing.gradle.dsl.DependencyDeclaration -import modulecheck.project.McProject - -/** - * Tries to find the corresponding - * [DependencyDeclaration][modulecheck.parsing.gradle.dsl.DependencyDeclaration] for - * this [ConfiguredDependency][modulecheck.model.dependency.ConfiguredDependency] - * in a given project's build file. - * - * @param dependentProject The project whose build file to search in. - * @receiver The [ConfiguredDependency] to find the statement for. - * @return The corresponding [DependencyDeclaration] if found, null otherwise. - */ -suspend fun ConfiguredDependency.statementOrNullIn( - dependentProject: McProject -): DependencyDeclaration? { - return dependentProject.buildFileParser - .dependenciesBlocks() - .firstNotNullOfOrNull { block -> - - when (this) { - is ExternalDependency -> block.getOrEmpty(mavenCoordinates, configurationName) - .takeIf { it.isNotEmpty() } - - is ProjectDependency -> block.getOrEmpty(projectPath, configurationName, isTestFixture) - .takeIf { it.isNotEmpty() } - } - } - ?.firstOrNull() -} - -/** - * Finds the position of this - * [ConfiguredDependency][modulecheck.model.dependency.ConfiguredDependency] - * in the given project's build file. - * - * @param dependentProject The project whose build file to search in. - * @receiver The [ConfiguredDependency] to find the position for. - * @return The [Position] of the dependency in the build file if found, null otherwise. - */ -suspend fun ConfiguredDependency.positionIn(dependentProject: McProject): Position? { - - val statement = statementOrNullIn(dependentProject) ?: return null - - return dependentProject.buildFile.readText() - .positionOfStatement(statement.statementWithSurroundingText) -} diff --git a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/internal/string.kt b/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/internal/string.kt deleted file mode 100644 index 207c8a6e65..0000000000 --- a/modulecheck-finding/api/src/main/kotlin/modulecheck/finding/internal/string.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding.internal - -import modulecheck.finding.Finding.Position - -fun String.positionOfStatement(statement: String): Position { - - val lines = lines() - - var index = indexOf(statement.trimStart()) - - var row = 0 - - while (lines[row].length < index) { - // if the current row's string isn't long enough, subtract its length from the total index - // and move on to the next row. Subtract an additional 1 because the newline character - // in the full string isn't included in the line's string. - @Suppress("UnnecessaryParentheses") - index -= (lines[row].length + 1) - row++ - } - return Position(row + 1, index + 1) -} diff --git a/modulecheck-finding/impl-android/api/impl-android.api b/modulecheck-finding/impl-android/api/impl-android.api deleted file mode 100644 index 3eabc7e994..0000000000 --- a/modulecheck-finding/impl-android/api/impl-android.api +++ /dev/null @@ -1,54 +0,0 @@ -public final class modulecheck/finding/android/DisableViewBindingGenerationFinding : modulecheck/finding/Finding, modulecheck/finding/Fixable { - public static final field Companion Lmodulecheck/finding/android/DisableViewBindingGenerationFinding$Companion; - public fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component3 ()Ljava/io/File; - public final fun copy (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;)Lmodulecheck/finding/android/DisableViewBindingGenerationFinding; - public static synthetic fun copy$default (Lmodulecheck/finding/android/DisableViewBindingGenerationFinding;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;ILjava/lang/Object;)Lmodulecheck/finding/android/DisableViewBindingGenerationFinding; - public fun equals (Ljava/lang/Object;)Z - public fun fix (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getBuildFile ()Ljava/io/File; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/android/DisableViewBindingGenerationFinding$Companion { - public final fun getNAME ()Lmodulecheck/finding/FindingName; -} - -public final class modulecheck/finding/android/UnusedResourcesGenerationFinding : modulecheck/finding/Finding, modulecheck/finding/Fixable { - public static final field Companion Lmodulecheck/finding/android/UnusedResourcesGenerationFinding$Companion; - public fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component3 ()Ljava/io/File; - public final fun copy (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;)Lmodulecheck/finding/android/UnusedResourcesGenerationFinding; - public static synthetic fun copy$default (Lmodulecheck/finding/android/UnusedResourcesGenerationFinding;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;ILjava/lang/Object;)Lmodulecheck/finding/android/UnusedResourcesGenerationFinding; - public fun equals (Ljava/lang/Object;)Z - public fun fix (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getBuildFile ()Ljava/io/File; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/android/UnusedResourcesGenerationFinding$Companion { - public final fun getNAME ()Lmodulecheck/finding/FindingName; -} - diff --git a/modulecheck-finding/impl-android/build.gradle.kts b/modulecheck-finding/impl-android/build.gradle.kts deleted file mode 100644 index dd70528296..0000000000 --- a/modulecheck-finding/impl-android/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-finding-impl-android" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-project:api")) - - implementation(project(path = ":modulecheck-parsing:gradle:dsl:api")) - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-finding/impl-android/src/main/kotlin/modulecheck/finding/android/DisableViewBindingGenerationFinding.kt b/modulecheck-finding/impl-android/src/main/kotlin/modulecheck/finding/android/DisableViewBindingGenerationFinding.kt deleted file mode 100644 index a8ed5cba07..0000000000 --- a/modulecheck-finding/impl-android/src/main/kotlin/modulecheck/finding/android/DisableViewBindingGenerationFinding.kt +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding.android - -import modulecheck.finding.Finding -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.finding.Fixable -import modulecheck.finding.RemovesDependency.RemovalStrategy -import modulecheck.finding.internal.positionOfStatement -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.findMinimumIndent -import modulecheck.utils.indent -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.suffixIfNot -import java.io.File - -data class DisableViewBindingGenerationFinding( - override val dependentProject: McProject, - override val dependentPath: ProjectPath.StringProjectPath, - override val buildFile: File -) : Finding, Fixable { - - override val findingName: FindingName = NAME - - override val message: String - get() = "Android viewBinding generation is enabled, but no generated code is being used." - - override val dependencyIdentifier: String = "" - - override val statementOrNull: LazyDeferred = lazyDeferred { - dependentProject.buildFileParser.androidSettings() - .assignments - .firstOrNull { it.propertyFullName == "viewBinding" } - } - - override val statementTextOrNull: LazyDeferred = lazyDeferred { - statementOrNull.await()?.declarationText - } - - override val positionOrNull: LazyDeferred = lazyDeferred { - val statement = statementTextOrNull.await() ?: return@lazyDeferred null - - val fileText = buildFile.readText() - - fileText.positionOfStatement(statement) - } - - override suspend fun fix(removalStrategy: RemovalStrategy): Boolean { - - val settings = dependentProject.buildFileParser.androidSettings() - - val newText = settings.assignments - .filter { it.propertyFullName == "viewBinding" && it.value == "true" } - .takeIf { it.isNotEmpty() } - ?.fold(buildFile.readText()) { oldText, assignment -> - - val newAssignmentText = assignment.declarationText.replace(assignment.value, "false") - - val newFullText = assignment.fullText - .replace(assignment.declarationText, newAssignmentText) - - oldText.replace(assignment.fullText, newFullText) - } - ?: settings.buildFeaturesBlocks.firstOrNull() - ?.withAddedStatement("viewBinding = false") - ?: settings.androidBlocks.firstOrNull() - ?.withAddedStatement("buildFeatures.viewBinding = false") - ?: newAndroidBlock() - - buildFile.writeText(newText) - - return true - } - - private suspend fun newAndroidBlock(): String { - - val indent = buildFile.findMinimumIndent() - - val androidBlock = buildString { - appendLine("android {") - indent(indent) { - appendLine("buildFeatures {") - - indent(indent) { - appendLine("viewBinding = false") - } - appendLine('}') - } - appendLine('}') - } - - val oldText = buildFile.readText() - - return dependentProject.buildFileParser - .pluginsBlock() - ?.fullText - ?.let { oldPlugins -> - - val new = "$oldPlugins\n\n$androidBlock" - - oldText.replace(oldPlugins, new) - } - ?: dependentProject.buildFileParser - .dependenciesBlocks() - .firstOrNull() - ?.fullText - ?.let { oldDependencies -> - - val new = "$androidBlock\n$oldDependencies" - oldText.replace(oldDependencies, new) - } - ?: (oldText.suffixIfNot("\n") + "\n$androidBlock") - } - - private fun AgpBlock.withAddedStatement(newStatement: String): String { - - val indent = lambdaContent.findMinimumIndent() - - val newContent = lambdaContent.plus("\n$indent$newStatement") - - val newBlockText = fullText.replace(lambdaContent, newContent) - - return buildFile.readText().replace(fullText, newBlockText) - } - - companion object { - /** - * @since 0.12.0 - * @suppress - */ - val NAME: FindingName = FindingName("disable-view-binding") - } -} diff --git a/modulecheck-finding/impl-android/src/main/kotlin/modulecheck/finding/android/UnusedResourcesGenerationFinding.kt b/modulecheck-finding/impl-android/src/main/kotlin/modulecheck/finding/android/UnusedResourcesGenerationFinding.kt deleted file mode 100644 index 85bde7d9db..0000000000 --- a/modulecheck-finding/impl-android/src/main/kotlin/modulecheck/finding/android/UnusedResourcesGenerationFinding.kt +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding.android - -import modulecheck.finding.Finding -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.finding.Fixable -import modulecheck.finding.RemovesDependency.RemovalStrategy -import modulecheck.finding.internal.positionOfStatement -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.findMinimumIndent -import modulecheck.utils.indent -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.suffixIfNot -import java.io.File - -data class UnusedResourcesGenerationFinding( - override val dependentProject: McProject, - override val dependentPath: ProjectPath.StringProjectPath, - override val buildFile: File -) : Finding, Fixable { - - override val findingName: FindingName = NAME - - override val message: String - get() = "`androidResources` generation is enabled, but no resources are defined in this module." - - override val dependencyIdentifier: String = "" - - override val statementOrNull: LazyDeferred = lazyDeferred { - dependentProject.buildFileParser.androidSettings() - .assignments - .firstOrNull { it.propertyFullName == "androidResources" } - } - - override val statementTextOrNull: LazyDeferred = lazyDeferred { - statementOrNull.await()?.declarationText - } - - override val positionOrNull: LazyDeferred = lazyDeferred { - val statement = statementTextOrNull.await() ?: return@lazyDeferred null - - val fileText = buildFile.readText() - - fileText.positionOfStatement(statement) - } - - override suspend fun fix(removalStrategy: RemovalStrategy): Boolean { - - val settings = dependentProject.buildFileParser.androidSettings() - - val newText = settings.assignments - .filter { it.propertyFullName == "androidResources" && it.value == "true" } - .takeIf { it.isNotEmpty() } - ?.fold(buildFile.readText()) { oldText, assignment -> - - val newAssignmentText = assignment.declarationText.replace(assignment.value, "false") - - val newFullText = assignment.fullText - .replace(assignment.declarationText, newAssignmentText) - - oldText.replace(assignment.fullText, newFullText) - } - ?: settings.buildFeaturesBlocks.firstOrNull() - ?.withAddedStatement("androidResources = false") - ?: settings.androidBlocks.firstOrNull() - ?.withAddedStatement("buildFeatures.androidResources = false") - ?: newAndroidBlock() - - buildFile.writeText(newText) - - return true - } - - private suspend fun newAndroidBlock(): String { - - val indent = buildFile.findMinimumIndent() - - val androidBlock = buildString { - appendLine("android {") - indent(indent) { - appendLine("buildFeatures {") - - indent(indent) { - appendLine("androidResources = false") - } - appendLine('}') - } - appendLine('}') - } - - val oldText = buildFile.readText() - - return dependentProject.buildFileParser - .pluginsBlock() - ?.fullText - ?.let { oldPlugins -> - - val new = "$oldPlugins\n\n$androidBlock" - .removeSuffix("\n") - - oldText.replace(oldPlugins, new) - } - ?: dependentProject.buildFileParser - .dependenciesBlocks() - .firstOrNull() - ?.fullText - ?.let { oldDependencies -> - - val new = "$androidBlock\n$oldDependencies" - oldText.replace(oldDependencies, new) - } - ?: (oldText.suffixIfNot("\n") + "\n$androidBlock") - } - - private fun AgpBlock.withAddedStatement(newStatement: String): String { - - val indent = lambdaContent.findMinimumIndent() - - val newContent = lambdaContent.plus("\n$indent$newStatement") - - val newBlockText = fullText.replace(lambdaContent, newContent) - - return buildFile.readText().replace(fullText, newBlockText) - } - - companion object { - /** - * @since 0.12.0 - * @suppress - */ - val NAME: FindingName = FindingName("disable-android-resources") - } -} diff --git a/modulecheck-finding/impl-sort/api/impl-sort.api b/modulecheck-finding/impl-sort/api/impl-sort.api deleted file mode 100644 index 8dedd2d406..0000000000 --- a/modulecheck-finding/impl-sort/api/impl-sort.api +++ /dev/null @@ -1,38 +0,0 @@ -public final class modulecheck/finding/sort/SortDependenciesFinding : modulecheck/finding/Finding, modulecheck/finding/Fixable { - public fun (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Ljava/util/Comparator;)V - public fun fix (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getBuildFile ()Ljava/io/File; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public final class modulecheck/finding/sort/SortPluginsFinding : modulecheck/finding/Finding, modulecheck/finding/Fixable { - public static final field Companion Lmodulecheck/finding/sort/SortPluginsFinding$Companion; - public fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Ljava/util/Comparator;)V - public fun fix (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getBuildFile ()Ljava/io/File; - public final fun getComparator ()Ljava/util/Comparator; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public final class modulecheck/finding/sort/SortPluginsFinding$Companion { - public final fun getNAME ()Lmodulecheck/finding/FindingName; -} - -public final class modulecheck/finding/sort/SortPluginsFindingKt { - public static final fun sortedPlugins (Lmodulecheck/parsing/gradle/dsl/PluginsBlock;Ljava/util/Comparator;)Ljava/lang/String; -} - diff --git a/modulecheck-finding/impl-sort/build.gradle.kts b/modulecheck-finding/impl-sort/build.gradle.kts deleted file mode 100644 index f9bed0258d..0000000000 --- a/modulecheck-finding/impl-sort/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-finding-impl-sort" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-project:api")) - - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-finding/impl-sort/src/main/kotlin/modulecheck/finding/sort/SortDependenciesFinding.kt b/modulecheck-finding/impl-sort/src/main/kotlin/modulecheck/finding/sort/SortDependenciesFinding.kt deleted file mode 100644 index 70fb6cb6f5..0000000000 --- a/modulecheck-finding/impl-sort/src/main/kotlin/modulecheck/finding/sort/SortDependenciesFinding.kt +++ /dev/null @@ -1,122 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding.sort - -import modulecheck.finding.Finding -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.finding.Fixable -import modulecheck.finding.RemovesDependency.RemovalStrategy -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.parsing.gradle.dsl.DependenciesBlock -import modulecheck.parsing.gradle.dsl.DependencyDeclaration -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.suffixIfNot -import java.io.File -import java.util.Locale - -class SortDependenciesFinding( - override val findingName: FindingName, - override val dependentProject: McProject, - override val dependentPath: ProjectPath.StringProjectPath, - override val buildFile: File, - private val comparator: Comparator -) : Finding, Fixable { - - override val message: String - get() = "Project/external dependency declarations are not sorted " + - "according to the defined pattern." - - override val dependencyIdentifier: String = "" - - override val positionOrNull: LazyDeferred = lazyDeferred { null } - - override val statementOrNull: LazyDeferred = lazyDeferred { null } - - override val statementTextOrNull: LazyDeferred = lazyDeferred { null } - - override suspend fun fix(removalStrategy: RemovalStrategy): Boolean { - var fileText = buildFile.readText() - - dependentProject.buildFileParser - .dependenciesBlocks() - .forEach { block -> - - fileText = sortedDependenciesFileText(block, fileText, comparator) - } - - buildFile.writeText(fileText) - - return true - } -} - -internal fun sortedDependenciesFileText( - block: DependenciesBlock, - fileText: String, - comparator: Comparator -): String { - val sorted = block.sortedDeclarations(comparator) - - val trimmedContent = block.lambdaContent - .trimStart('\n') - .trimEnd() - - val escapedContent = Regex.escape(trimmedContent) - - val blockRegex = """$escapedContent[\n\r]*(\s*)}""".toRegex() - - return fileText.replace(blockRegex) { mr -> - - val whitespaceBeforeBrace = mr.destructured.component1() - - "$sorted$whitespaceBeforeBrace}" - } -} - -internal fun DependenciesBlock.sortedDeclarations(comparator: Comparator): String { - return settings - .grouped(comparator) - .joinToString("\n\n") { declarations -> - - declarations - .sortedBy { declaration -> - declaration.declarationText.lowercase(Locale.US) - } - .joinToString("\n") { - it.statementWithSurroundingText - .trimStart('\n') - .trimEnd() - .lines() - .joinToString("\n") - } - } - .suffixIfNot("\n") -} - -internal fun List.grouped(comparator: Comparator) = - groupBy { declaration -> - declaration.declarationText - .split("[^a-zA-Z-]".toRegex()) - .filterNot { it.isEmpty() } - .take(2) - .joinToString("-") - } - .toSortedMap(comparator) - .map { it.value } diff --git a/modulecheck-finding/impl-sort/src/main/kotlin/modulecheck/finding/sort/SortPluginsFinding.kt b/modulecheck-finding/impl-sort/src/main/kotlin/modulecheck/finding/sort/SortPluginsFinding.kt deleted file mode 100644 index 21d96d68a4..0000000000 --- a/modulecheck-finding/impl-sort/src/main/kotlin/modulecheck/finding/sort/SortPluginsFinding.kt +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package modulecheck.finding.sort - -import modulecheck.finding.Finding -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.finding.Fixable -import modulecheck.finding.RemovesDependency.RemovalStrategy -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.parsing.gradle.dsl.PluginDeclaration -import modulecheck.parsing.gradle.dsl.PluginsBlock -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.suffixIfNot -import java.io.File - -/** - * A [Finding] implementation that represents a finding where plugin - * declarations are not sorted according to the defined pattern. - * - * @property dependentProject the dependent project where the finding was detected - * @property dependentPath the path of the dependent project - * @property buildFile the build file where the finding was detected - * @property comparator the comparator used to sort plugin declarations - */ -class SortPluginsFinding( - override val dependentProject: McProject, - override val dependentPath: ProjectPath.StringProjectPath, - override val buildFile: File, - val comparator: Comparator -) : Finding, Fixable { - - override val findingName: FindingName = NAME - - /** Returns the message associated with this finding. */ - override val message: String - get() = "Plugin declarations are not sorted according to the defined pattern." - - override val dependencyIdentifier: String = "" - - override val positionOrNull: LazyDeferred = lazyDeferred { null } - - override val statementOrNull: LazyDeferred = lazyDeferred { null } - - override val statementTextOrNull: LazyDeferred = lazyDeferred { null } - - /** - * Fixes the finding by sorting the plugin declarations according to the defined pattern. - * - * @param removalStrategy the removal strategy to be applied if fixing is possible - * @return `true` if the finding was fixed successfully, `false` otherwise - */ - override suspend fun fix(removalStrategy: RemovalStrategy): Boolean { - val block = dependentProject.buildFileParser.pluginsBlock() ?: return false - - var fileText = buildFile.readText() - - val sorted = block.sortedPlugins(comparator) - - fileText = fileText.replace(block.lambdaContent, sorted) - - buildFile.writeText(fileText) - - return true - } - - companion object { - val NAME: FindingName = FindingName("sort-plugins") - } -} - -/** - * Sorts the plugins in this [PluginsBlock] using the specified [comparator]. - * - * @param comparator the comparator used to sort the plugin declarations - * @receiver the [PluginsBlock] to be sorted - * @return the sorted plugins as a string - */ -fun PluginsBlock.sortedPlugins(comparator: Comparator): String { - // Groovy parsing has the last whitespace at the end of the contentString block, - // so it gets chopped off when doing the replacement. - // Kotlin parsing includes it as part of the wrapping brackets, - // so there is no newline whitespace in the block. - // This regex finds whatever trailing whitespace/newline there is and carries it over to the new - // block. - val suffix = "(\\s*)\\z".toRegex() - .find(lambdaContent) - ?.destructured - ?.component1() - .orEmpty() - - return settings - .sortedWith(comparator) - .joinToString("\n") { it.statementWithSurroundingText } - .suffixIfNot(suffix) -} diff --git a/modulecheck-finding/impl/api/impl.api b/modulecheck-finding/impl/api/impl.api deleted file mode 100644 index 0bfb874f63..0000000000 --- a/modulecheck-finding/impl/api/impl.api +++ /dev/null @@ -1,299 +0,0 @@ -public abstract class modulecheck/finding/AbstractProjectDependencyFinding : modulecheck/finding/ConfiguredDependencyFinding, modulecheck/finding/DependencyFinding, modulecheck/finding/Finding, modulecheck/finding/Fixable, modulecheck/finding/Problem { - public fun ()V - public fun equals (Ljava/lang/Object;)Z - public abstract fun fromStringOrEmpty ()Ljava/lang/String; - public final fun getBuildFile ()Ljava/io/File; - public final fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun isSuppressed ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun toResult (ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/finding/CouldUseAnvilFinding : modulecheck/finding/Finding, modulecheck/finding/Fixable { - public fun (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Ljava/io/File;)V - public final fun component1 ()Lmodulecheck/finding/FindingName; - public final fun component2 ()Lmodulecheck/project/McProject; - public final fun component3 ()Ljava/io/File; - public final fun copy (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Ljava/io/File;)Lmodulecheck/finding/CouldUseAnvilFinding; - public static synthetic fun copy$default (Lmodulecheck/finding/CouldUseAnvilFinding;Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Ljava/io/File;ILjava/lang/Object;)Lmodulecheck/finding/CouldUseAnvilFinding; - public fun equals (Ljava/lang/Object;)Z - public fun getBuildFile ()Ljava/io/File; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/InheritedDependencyFinding : modulecheck/finding/AbstractProjectDependencyFinding, java/lang/Comparable, modulecheck/finding/AddsDependency { - public fun (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;)V - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/finding/InheritedDependencyFinding;)I - public final fun component1 ()Lmodulecheck/finding/FindingName; - public final fun component2 ()Lmodulecheck/project/McProject; - public final fun component3 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun component4 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun copy (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;)Lmodulecheck/finding/InheritedDependencyFinding; - public static synthetic fun copy$default (Lmodulecheck/finding/InheritedDependencyFinding;Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;ILjava/lang/Object;)Lmodulecheck/finding/InheritedDependencyFinding; - public fun equals (Ljava/lang/Object;)Z - public fun fromStringOrEmpty ()Ljava/lang/String; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public synthetic fun getDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public synthetic fun getNewDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getNewDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getSource ()Lmodulecheck/model/dependency/ProjectDependency; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/MustBeApiFinding : modulecheck/finding/AbstractProjectDependencyFinding, modulecheck/finding/AddsDependency, modulecheck/finding/ModifiesProjectDependency, modulecheck/finding/RemovesDependency { - public synthetic fun (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectDependency;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/finding/FindingName; - public final fun component2 ()Lmodulecheck/project/McProject; - public final fun component3 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun component4 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun component5-9LqIWVA ()Ljava/lang/String; - public final fun component6 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun copy-Ln3dr_g (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectDependency;)Lmodulecheck/finding/MustBeApiFinding; - public static synthetic fun copy-Ln3dr_g$default (Lmodulecheck/finding/MustBeApiFinding;Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectDependency;ILjava/lang/Object;)Lmodulecheck/finding/MustBeApiFinding; - public fun equals (Ljava/lang/Object;)Z - public fun fromStringOrEmpty ()Ljava/lang/String; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public synthetic fun getDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public synthetic fun getNewDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getNewDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public synthetic fun getOldDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getOldDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun getSource ()Lmodulecheck/model/dependency/ProjectDependency; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/OverShotDependency { - public fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/ConfiguredDependency;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun component3 ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun copy (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/ConfiguredDependency;)Lmodulecheck/finding/OverShotDependency; - public static synthetic fun copy$default (Lmodulecheck/finding/OverShotDependency;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/ConfiguredDependency;ILjava/lang/Object;)Lmodulecheck/finding/OverShotDependency; - public fun equals (Ljava/lang/Object;)Z - public final fun getDependentProject ()Lmodulecheck/project/McProject; - public final fun getNewDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun getOldDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun hashCode ()I - public final fun toFinding ()Lmodulecheck/finding/OverShotDependencyFinding; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/OverShotDependencyFinding : modulecheck/finding/AbstractProjectDependencyFinding, modulecheck/finding/AddsDependency { - public static final field Companion Lmodulecheck/finding/OverShotDependencyFinding$Companion; - public fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/ConfiguredDependency;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun component3 ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun copy (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/ConfiguredDependency;)Lmodulecheck/finding/OverShotDependencyFinding; - public static synthetic fun copy$default (Lmodulecheck/finding/OverShotDependencyFinding;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/ConfiguredDependency;ILjava/lang/Object;)Lmodulecheck/finding/OverShotDependencyFinding; - public fun equals (Ljava/lang/Object;)Z - public fun fromStringOrEmpty ()Ljava/lang/String; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public fun getDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getNewDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun getOldDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/OverShotDependencyFinding$Companion { - public final fun getNAME ()Lmodulecheck/finding/FindingName; -} - -public final class modulecheck/finding/RedundantDependency { - public synthetic fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun component3-9LqIWVA ()Ljava/lang/String; - public final fun component4 ()Ljava/util/List; - public final fun copy-TQCk69c (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/finding/RedundantDependency; - public static synthetic fun copy-TQCk69c$default (Lmodulecheck/finding/RedundantDependency;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/finding/RedundantDependency; - public fun equals (Ljava/lang/Object;)Z - public final fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public final fun getDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun getDependentProject ()Lmodulecheck/project/McProject; - public final fun getFrom ()Ljava/util/List; - public fun hashCode ()I - public final fun toFinding (Lmodulecheck/finding/FindingName;)Lmodulecheck/finding/RedundantDependencyFinding; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/RedundantDependencyFinding : modulecheck/finding/AbstractProjectDependencyFinding, modulecheck/finding/Deletable, modulecheck/finding/RemovesDependency { - public synthetic fun (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/finding/FindingName; - public final fun component2 ()Lmodulecheck/project/McProject; - public final fun component3 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun component4-9LqIWVA ()Ljava/lang/String; - public final fun component5 ()Ljava/util/List; - public final fun copy-qNb6-3M (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/finding/RedundantDependencyFinding; - public static synthetic fun copy-qNb6-3M$default (Lmodulecheck/finding/RedundantDependencyFinding;Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/finding/RedundantDependencyFinding; - public fun equals (Ljava/lang/Object;)Z - public fun fromStringOrEmpty ()Ljava/lang/String; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public synthetic fun getDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public final fun getFrom ()Ljava/util/List; - public fun getMessage ()Ljava/lang/String; - public synthetic fun getOldDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getOldDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/SortDependenciesFinding : modulecheck/finding/Finding, modulecheck/finding/Fixable { - public static final field Companion Lmodulecheck/finding/SortDependenciesFinding$Companion; - public fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Ljava/util/Comparator;)V - public fun fix (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getBuildFile ()Ljava/io/File; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public final class modulecheck/finding/SortDependenciesFinding$Companion { - public final fun getNAME ()Lmodulecheck/finding/FindingName; -} - -public final class modulecheck/finding/SortDependenciesFindingKt { - public static final fun sortedDependenciesFileText (Lmodulecheck/parsing/gradle/dsl/DependenciesBlock;Ljava/lang/String;Ljava/util/Comparator;)Ljava/lang/String; -} - -public final class modulecheck/finding/UnusedDependency { - public synthetic fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/Identifier;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun component3 ()Lmodulecheck/model/dependency/Identifier; - public final fun component4-9LqIWVA ()Ljava/lang/String; - public final fun copy-2WiO4sE (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/Identifier;Ljava/lang/String;)Lmodulecheck/finding/UnusedDependency; - public static synthetic fun copy-2WiO4sE$default (Lmodulecheck/finding/UnusedDependency;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/model/dependency/Identifier;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/finding/UnusedDependency; - public fun equals (Ljava/lang/Object;)Z - public final fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public final fun getDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun getDependencyIdentifier ()Lmodulecheck/model/dependency/Identifier; - public final fun getDependentProject ()Lmodulecheck/project/McProject; - public fun hashCode ()I - public final fun toFinding (Lmodulecheck/finding/FindingName;)Lmodulecheck/finding/UnusedDependencyFinding; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/UnusedDependencyFinding : modulecheck/finding/AbstractProjectDependencyFinding, modulecheck/finding/Deletable, modulecheck/finding/RemovesDependency { - public synthetic fun (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/finding/FindingName; - public final fun component2 ()Lmodulecheck/project/McProject; - public final fun component3 ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun component4 ()Ljava/lang/String; - public final fun component5-9LqIWVA ()Ljava/lang/String; - public final fun copy-qOEscpI (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/finding/UnusedDependencyFinding; - public static synthetic fun copy-qOEscpI$default (Lmodulecheck/finding/UnusedDependencyFinding;Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/finding/UnusedDependencyFinding; - public fun equals (Ljava/lang/Object;)Z - public fun fromStringOrEmpty ()Ljava/lang/String; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public fun getDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getOldDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/UnusedKaptProcessorFinding : modulecheck/finding/ConfigurationFinding, modulecheck/finding/DependencyFinding, modulecheck/finding/Finding, modulecheck/finding/Fixable, modulecheck/finding/Problem, modulecheck/finding/RemovesDependency { - public synthetic fun (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/finding/FindingName; - public final fun component2 ()Lmodulecheck/project/McProject; - public final fun component3 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component4 ()Ljava/io/File; - public final fun component5 ()Lmodulecheck/model/dependency/ConfiguredDependency; - public final fun component6-9LqIWVA ()Ljava/lang/String; - public final fun copy-pQ-XbRs (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;)Lmodulecheck/finding/UnusedKaptProcessorFinding; - public static synthetic fun copy-pQ-XbRs$default (Lmodulecheck/finding/UnusedKaptProcessorFinding;Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/finding/UnusedKaptProcessorFinding; - public fun equals (Ljava/lang/Object;)Z - public fun getBuildFile ()Ljava/io/File; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public fun getOldDependency ()Lmodulecheck/model/dependency/ConfiguredDependency; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/UnusedPluginFinding : modulecheck/finding/Deletable, modulecheck/finding/Finding, modulecheck/finding/Fixable, modulecheck/finding/Problem { - public fun (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Lmodulecheck/finding/FindingName;Lmodulecheck/model/dependency/PluginDefinition;)V - public final fun component1 ()Lmodulecheck/project/McProject; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component3 ()Ljava/io/File; - public final fun component4 ()Lmodulecheck/finding/FindingName; - public final fun component5 ()Lmodulecheck/model/dependency/PluginDefinition; - public final fun copy (Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Lmodulecheck/finding/FindingName;Lmodulecheck/model/dependency/PluginDefinition;)Lmodulecheck/finding/UnusedPluginFinding; - public static synthetic fun copy$default (Lmodulecheck/finding/UnusedPluginFinding;Lmodulecheck/project/McProject;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Lmodulecheck/finding/FindingName;Lmodulecheck/model/dependency/PluginDefinition;ILjava/lang/Object;)Lmodulecheck/finding/UnusedPluginFinding; - public fun delete (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun equals (Ljava/lang/Object;)Z - public fun fix (Lmodulecheck/finding/RemovesDependency$RemovalStrategy;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getBuildFile ()Ljava/io/File; - public fun getDependencyIdentifier ()Ljava/lang/String; - public fun getDependentPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getDependentProject ()Lmodulecheck/project/McProject; - public fun getFindingName ()Lmodulecheck/finding/FindingName; - public fun getMessage ()Ljava/lang/String; - public final fun getPluginDefinition ()Lmodulecheck/model/dependency/PluginDefinition; - public fun getPositionOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getStatementTextOrNull ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun hashCode ()I - public fun isSuppressed ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/internal/ListKt { - public static final fun positionOf-oid5b2s (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/finding/Finding$Position; -} - diff --git a/modulecheck-finding/impl/build.gradle.kts b/modulecheck-finding/impl/build.gradle.kts deleted file mode 100644 index 9491e0c92f..0000000000 --- a/modulecheck-finding/impl/build.gradle.kts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-finding-impl" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-project:api")) - - implementation(project(path = ":modulecheck-parsing:gradle:dsl:precompiled")) - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/AbstractProjectDependencyFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/AbstractProjectDependencyFinding.kt deleted file mode 100644 index f1e81a19f4..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/AbstractProjectDependencyFinding.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.FindingResult -import modulecheck.finding.Finding.Position -import modulecheck.finding.internal.positionOfStatement -import modulecheck.finding.internal.statementOrNullIn -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import java.io.File - -abstract class AbstractProjectDependencyFinding : - Problem, - Fixable, - Finding, - DependencyFinding, - ConfiguredDependencyFinding { - - final override val dependentPath: StringProjectPath get() = dependentProject.projectPath - final override val buildFile: File get() = dependentProject.buildFile - - override val isSuppressed: LazyDeferred = lazyDeferred { - dependentProject.getSuppressions() - .get(findingName) - .contains(dependency) - } - - override val positionOrNull: LazyDeferred = lazyDeferred { - val statement = statementOrNull.await()?.declarationText ?: return@lazyDeferred null - - buildFile.readText() - .positionOfStatement(statement) - } - - override val statementOrNull: LazyDeferred = lazyDeferred { - dependency.statementOrNullIn(dependentProject) - } - override val statementTextOrNull: LazyDeferred = lazyDeferred { - statementOrNull.await()?.statementWithSurroundingText - } - - override suspend fun toResult(fixed: Boolean): FindingResult { - return FindingResult( - dependentPath = dependentPath, - findingName = findingName, - sourceOrNull = fromStringOrEmpty(), - configurationName = configurationName.value, - dependencyIdentifier = dependency.identifier.name, - positionOrNull = positionOrNull.await(), - buildFile = buildFile, - message = message, - fixed = fixed - ) - } - - abstract fun fromStringOrEmpty(): String - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is AbstractProjectDependencyFinding) return false - - if (findingName != other.findingName) return false - if (dependency != other.dependency) return false - if (configurationName != other.configurationName) return false - - return true - } - - override fun hashCode(): Int { - var result = findingName.hashCode() - result = 31 * result + dependency.hashCode() - result = 31 * result + configurationName.hashCode() - return result - } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/CouldUseAnvilFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/CouldUseAnvilFinding.kt deleted file mode 100644 index 6e7e731105..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/CouldUseAnvilFinding.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.Position -import modulecheck.finding.internal.positionOf -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.existsOrNull -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import java.io.File - -data class CouldUseAnvilFinding( - override val findingName: FindingName, - override val dependentProject: McProject, - override val buildFile: File -) : Finding, Fixable { - - override val dependentPath: ProjectPath.StringProjectPath = dependentProject.projectPath - - override val message: String - get() = "Dagger's compiler could be replaced with Anvil's factory generation for faster builds." - - override val dependencyIdentifier: String = "com.google.dagger:dagger-compiler" - - override val statementOrNull: LazyDeferred = lazyDeferred { null } - - override val positionOrNull: LazyDeferred = lazyDeferred { - - val statement = statementTextOrNull.await() ?: return@lazyDeferred null - - buildFile - .existsOrNull() - ?.readText() - ?.lines() - ?.positionOf(statement, ConfigurationName.kapt) - } - - override val statementTextOrNull: LazyDeferred = lazyDeferred { null } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/InheritedDependencyFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/InheritedDependencyFinding.kt deleted file mode 100644 index 96a83269de..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/InheritedDependencyFinding.kt +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.Position -import modulecheck.finding.internal.positionIn -import modulecheck.finding.internal.statementOrNullIn -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred - -data class InheritedDependencyFinding( - override val findingName: FindingName, - override val dependentProject: McProject, - override val newDependency: ProjectDependency, - val source: ProjectDependency -) : AbstractProjectDependencyFinding(), - AddsDependency, - Comparable { - - override val message: String - get() = "Transitive dependencies which are directly referenced should be declared in this module." - - override val dependencyIdentifier: String - get() = newDependency.projectPath.value + fromStringOrEmpty() - override val dependency: ProjectDependency - get() = newDependency - - override val configurationName: ConfigurationName - get() = newDependency.configurationName - - override val statementOrNull: LazyDeferred = lazyDeferred { - source.statementOrNullIn(dependentProject) - } - override val positionOrNull: LazyDeferred = lazyDeferred { - source.positionIn(dependentProject) - } - - override fun fromStringOrEmpty(): String { - return if (dependency.projectPath == source.projectPath) { - "" - } else { - source.projectPath.value - } - } - - override fun compareTo(other: InheritedDependencyFinding): Int { - - return compareBy( - { it.configurationName }, - { it.source.isTestFixture }, - { it.newDependency.projectPath } - ).compare(this, other) - } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/MustBeApiFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/MustBeApiFinding.kt deleted file mode 100644 index 8d77cb8d80..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/MustBeApiFinding.kt +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.internal.statementOrNullIn -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred - -data class MustBeApiFinding( - override val findingName: FindingName, - override val dependentProject: McProject, - override val newDependency: ProjectDependency, - override val oldDependency: ProjectDependency, - override val configurationName: ConfigurationName, - val source: ProjectDependency? -) : AbstractProjectDependencyFinding(), - ModifiesProjectDependency, - AddsDependency, - RemovesDependency { - - override val dependency: ProjectDependency - get() = oldDependency - - override val message: String - get() = "The dependency should be declared via an `api` configuration, since it provides " + - "a declaration which is referenced in this module's public API." - - override val dependencyIdentifier: String = dependency.projectPath.value + fromStringOrEmpty() - - override val statementOrNull: LazyDeferred = lazyDeferred { - super.statementOrNull.await() - ?: source?.statementOrNullIn(dependentProject) - } - - override fun fromStringOrEmpty(): String { - return if (dependency.projectPath == source?.projectPath) { - "" - } else { - "${source?.projectPath?.value}" - } - } - - override fun toString(): String { - return """ - |MustBeApiFinding( - | dependentPath='$dependentPath', - | buildFile=$buildFile, - | dependency=$dependency, - | configurationName=$configurationName, - | source=$source, - | dependencyIdentifier='$dependencyIdentifier' - |) - """.trimMargin() - } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/OverShotDependencyFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/OverShotDependencyFinding.kt deleted file mode 100644 index 1d234bdb3a..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/OverShotDependencyFinding.kt +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.Position -import modulecheck.finding.internal.positionOfStatement -import modulecheck.finding.internal.statementOrNullIn -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred - -/** - * Represents a [ConfiguredDependency] which is unused in the - * [SourceSet][modulecheck.model.dependency.McSourceSet] to which it's - * added, but *is* used in another source set downstream. For instance, a - * dependency is overshot if it's added to `main`, but only used in `test`. - * - * @property dependentProject the [McProject] declaring the dependency - * @property newDependency the [ConfiguredDependency] which should be added - * @property oldDependency the [ConfiguredDependency] which adds the unused dependency - * @since 0.12.0 - */ -data class OverShotDependency( - val dependentProject: McProject, - val newDependency: ConfiguredDependency, - val oldDependency: ConfiguredDependency -) { - /** - * Converts the `OverShotDependency` to an [OverShotDependencyFinding]. - * - * @return the finding matching this [OverShotDependency] - * @since 0.12.0 - */ - fun toFinding(): OverShotDependencyFinding = OverShotDependencyFinding( - dependentProject = dependentProject, - newDependency = newDependency, - oldDependency = oldDependency - ) -} - -data class OverShotDependencyFinding( - override val dependentProject: McProject, - override val newDependency: ConfiguredDependency, - val oldDependency: ConfiguredDependency -) : AbstractProjectDependencyFinding(), - AddsDependency { - - override val findingName: FindingName = NAME - - override val configurationName: ConfigurationName = newDependency.configurationName - - override val statementOrNull: LazyDeferred - // intentionally look this up every time, since the declaration doesn't exist at first - get() = lazyDeferred { - dependency.statementOrNullIn(dependentProject) - } - - override val positionOrNull: LazyDeferred - get() = lazyDeferred { - val statement = statementOrNull.await()?.declarationText - ?: oldDependency.statementOrNullIn(dependentProject)?.declarationText - ?: return@lazyDeferred null - - buildFile.readText() - .positionOfStatement(statement) - } - - override val dependency: ConfiguredDependency get() = newDependency - override val dependencyIdentifier: String get() = newDependency.identifier.name - - override val message: String - get() = "The dependency is not used in the source set for which it is configured, but it is " + - "used in another source set which inherits from the first. For example, a test-only " + - "dependency which is declared via `implementation` instead of `testImplementation`." - - override fun fromStringOrEmpty(): String = "" - - override fun toString(): String { - return """ - |OverShotDependency( - | dependentPath='$dependentPath', - | buildFile=$buildFile, - | dependency=$dependency, - | dependencyIdentifier='$dependencyIdentifier', - | configurationName=$configurationName - |) - """.replaceIndentByMargin() - } - - companion object { - val NAME: FindingName = FindingName("overshot-dependency") - } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/RedundantDependencyFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/RedundantDependencyFinding.kt deleted file mode 100644 index 5594cd7d00..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/RedundantDependencyFinding.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency -import modulecheck.project.McProject - -data class RedundantDependency( - val dependentProject: McProject, - val dependency: ProjectDependency, - val configurationName: ConfigurationName, - val from: List -) { - fun toFinding(findingName: FindingName): RedundantDependencyFinding = RedundantDependencyFinding( - findingName = findingName, - dependentProject = dependentProject, - oldDependency = dependency, - configurationName = configurationName, - from = from - ) -} - -data class RedundantDependencyFinding( - override val findingName: FindingName, - override val dependentProject: McProject, - override val oldDependency: ProjectDependency, - override val configurationName: ConfigurationName, - val from: List -) : AbstractProjectDependencyFinding(), - RemovesDependency, - Deletable { - - override val dependency: ProjectDependency - get() = oldDependency - - override val message: String - get() = "The dependency is declared as `api` in a dependency module, but also explicitly " + - "declared in the current module. This is technically unnecessary " + - "if a \"minimalist\" build file is desired." - - override val dependencyIdentifier: String = oldDependency.projectPath.value + fromStringOrEmpty() - - override fun fromStringOrEmpty(): String { - - return if (from.all { dependency.projectPath == it.projectPath }) { - "" - } else { - from.joinToString { it.projectPath.value } - } - } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/SortDependenciesFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/SortDependenciesFinding.kt deleted file mode 100644 index ef39b2f3cf..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/SortDependenciesFinding.kt +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.Position -import modulecheck.finding.RemovesDependency.RemovalStrategy -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.parsing.gradle.dsl.DependenciesBlock -import modulecheck.parsing.gradle.dsl.DependencyDeclaration -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.suffixIfNot -import java.io.File -import java.util.Locale - -class SortDependenciesFinding( - override val dependentProject: McProject, - override val dependentPath: ProjectPath.StringProjectPath, - override val buildFile: File, - private val comparator: Comparator -) : Finding, Fixable { - override val findingName: FindingName = NAME - - override val message: String - get() = "Project/external dependency declarations are not sorted " + - "according to the defined pattern." - - override val dependencyIdentifier: String = "" - - override val positionOrNull: LazyDeferred = lazyDeferred { null } - - override val statementOrNull: LazyDeferred = lazyDeferred { null } - - override val statementTextOrNull: LazyDeferred = lazyDeferred { null } - - override suspend fun fix(removalStrategy: RemovalStrategy): Boolean { - var fileText = buildFile.readText() - - dependentProject.buildFileParser - .dependenciesBlocks() - .forEach { block -> - - fileText = sortedDependenciesFileText(block, fileText, comparator) - } - - buildFile.writeText(fileText) - - return true - } - - companion object { - val NAME: FindingName = FindingName("sort-dependencies") - } -} - -fun sortedDependenciesFileText( - block: DependenciesBlock, - fileText: String, - comparator: Comparator -): String { - val sorted = block.sortedDeclarations(comparator) - - val trimmedContent = block.lambdaContent - .trimStart('\n') - .trimEnd() - - val escapedContent = Regex.escape(trimmedContent) - - val blockRegex = """$escapedContent[\n\r]*(\s*)}""".toRegex() - - return fileText.replace(blockRegex) { mr -> - - val whitespaceBeforeBrace = mr.destructured.component1() - - "$sorted$whitespaceBeforeBrace}" - } -} - -internal fun DependenciesBlock.sortedDeclarations(comparator: Comparator): String { - return settings - .grouped(comparator) - .joinToString("\n\n") { declarations -> - - declarations - .sortedBy { declaration -> - declaration.declarationText.lowercase(Locale.US) - } - .joinToString("\n") { - it.statementWithSurroundingText - .trimStart('\n') - .trimEnd() - .lines() - .joinToString("\n") - } - } - .suffixIfNot("\n") -} - -internal fun List.grouped(comparator: Comparator) = - groupBy { declaration -> - declaration - .declarationText - .split("[^a-zA-Z-]".toRegex()) - .filterNot { it.isEmpty() } - .take(2) - .joinToString("-") - } - .toSortedMap(comparator) - .map { it.value } diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedDependency.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedDependency.kt deleted file mode 100644 index e1d2adfd50..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedDependency.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.Identifier -import modulecheck.project.McProject - -data class UnusedDependency( - val dependentProject: McProject, - val dependency: ConfiguredDependency, - val dependencyIdentifier: Identifier, - val configurationName: ConfigurationName -) { - - fun toFinding(findingName: FindingName): UnusedDependencyFinding = UnusedDependencyFinding( - findingName = findingName, - dependentProject = dependentProject, - oldDependency = dependency, - dependencyIdentifier = dependencyIdentifier.name, - configurationName = configurationName - ) -} - -data class UnusedDependencyFinding( - override val findingName: FindingName, - override val dependentProject: McProject, - override val oldDependency: ConfiguredDependency, - override val dependencyIdentifier: String, - override val configurationName: ConfigurationName -) : AbstractProjectDependencyFinding(), - RemovesDependency, - Deletable { - - override val dependency: ConfiguredDependency - get() = oldDependency - - override val message: String - get() = when { - dependency.isTestFixture -> { - "The declared dependency " + - "`${configurationName.value}(testFixtures(\"${dependency.identifier}\"))` " + - "is not used in this module." - } - - else -> { - "The declared dependency `${configurationName.value}(\"${dependency.identifier}\")` " + - "is not used in this module." - } - } - - override fun toString(): String { - return """ - UnusedDependency( - dependentPath='$dependentPath', - buildFile=$buildFile, - dependency=$dependency, - dependencyIdentifier='$dependencyIdentifier', - configurationName=$configurationName - ) - """.trimIndent() - } - - override fun fromStringOrEmpty(): String = "" -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedKaptProcessorFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedKaptProcessorFinding.kt deleted file mode 100644 index d05518651d..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedKaptProcessorFinding.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.Position -import modulecheck.finding.internal.positionOfStatement -import modulecheck.finding.internal.statementOrNullIn -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ExternalDependency -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import java.io.File - -data class UnusedKaptProcessorFinding( - override val findingName: FindingName, - override val dependentProject: McProject, - override val dependentPath: ProjectPath.StringProjectPath, - override val buildFile: File, - override val oldDependency: ConfiguredDependency, - override val configurationName: ConfigurationName -) : Finding, - Problem, - Fixable, - DependencyFinding, - ConfigurationFinding, - RemovesDependency { - - override val message: String - get() = "The annotation processor dependency is not used in this module. " + - "This can be a significant performance hit." - - override val dependencyIdentifier: String = when (oldDependency) { - is ProjectDependency -> oldDependency.projectPath - is ExternalDependency -> oldDependency.identifier - }.name - - override val statementOrNull: LazyDeferred = lazyDeferred { - when (oldDependency) { - is ProjectDependency -> - oldDependency.statementOrNullIn(dependentProject) - - is ExternalDependency -> - oldDependency.statementOrNullIn(dependentProject) - } - } - - override val statementTextOrNull: LazyDeferred = lazyDeferred { - statementOrNull.await()?.statementWithSurroundingText - } - - override val positionOrNull: LazyDeferred = lazyDeferred { - val statement = statementOrNull.await()?.declarationText ?: return@lazyDeferred null - - buildFile.readText() - .positionOfStatement(statement) - } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedPluginFinding.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedPluginFinding.kt deleted file mode 100644 index 201e5c8fd8..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/UnusedPluginFinding.kt +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.finding.Finding.Position -import modulecheck.finding.RemovesDependency.RemovalStrategy -import modulecheck.model.dependency.PluginAccessor -import modulecheck.model.dependency.PluginDefinition -import modulecheck.model.dependency.PluginDependency -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.parsing.gradle.dsl.BuildFileStatement -import modulecheck.parsing.gradle.dsl.removeDependencyWithComment -import modulecheck.parsing.gradle.dsl.removeDependencyWithDelete -import modulecheck.project.McProject -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import java.io.File - -data class UnusedPluginFinding( - override val dependentProject: McProject, - override val dependentPath: StringProjectPath, - override val buildFile: File, - override val findingName: FindingName, - val pluginDefinition: PluginDefinition -) : Finding, Problem, Fixable, Deletable { - - override val message: String - get() = "The `${pluginDefinition.qualifiedId}` plugin dependency declared, " + - "but no processor dependencies are declared." - - override val dependencyIdentifier: String = pluginDefinition.qualifiedId - - override val isSuppressed: LazyDeferred = lazyDeferred { - dependentProject.getSuppressions() - .get(findingName) - .any { (it as? PluginDependency)?.accessor in pluginDefinition.accessors } - } - - override val positionOrNull: LazyDeferred = lazyDeferred { - val text = buildFile - .readText() - - val lines = text.lines() - - val row = lines - .indexOfFirst { line -> - - pluginDefinition.accessors.contains(PluginAccessor(line.trim())) || - line.contains("plugin = \"${pluginDefinition.qualifiedId}\")") || - ( - pluginDefinition.legacyIdOrNull != null && - line.contains("plugin = \"${pluginDefinition.legacyIdOrNull}\")") - ) - } - - if (row < 0) return@lazyDeferred null - - val col = lines[row] - .indexOfFirst { it != ' ' } - - Position(row + 1, col + 1) - } - - override val statementOrNull: LazyDeferred = lazyDeferred { - - pluginDefinition.accessors - .firstNotNullOfOrNull { id -> - dependentProject.buildFileParser.pluginsBlock()?.getById(id.text) - } - } - override val statementTextOrNull: LazyDeferred = lazyDeferred { - statementOrNull.await()?.statementWithSurroundingText - } - - override suspend fun fix(removalStrategy: RemovalStrategy): Boolean { - - println("############################### 1") - - val declaration = statementOrNull.await() ?: return false - - println("############################### 2") - - dependentProject.removeDependencyWithComment(declaration, fixLabel()) - - return true - } - - override suspend fun delete(): Boolean { - - val declaration = statementOrNull.await() ?: return false - - dependentProject.removeDependencyWithDelete(declaration) - - return true - } -} diff --git a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/internal/list.kt b/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/internal/list.kt deleted file mode 100644 index 8d0f271725..0000000000 --- a/modulecheck-finding/impl/src/main/kotlin/modulecheck/finding/internal/list.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding.internal - -import modulecheck.finding.Finding.Position -import modulecheck.model.dependency.ConfigurationName - -/** - * Finds the position of a specific Gradle project path and configuration in a list of strings. - * - * @param path The Gradle project path to find. - * @param configuration The [ConfigurationName] related to the dependency to find. - * @receiver The list of strings to search in, typically lines of a build.gradle file. - * @return The [Position] of the dependency in the list - * if found, null otherwise. The position is 1-indexed. - */ -fun List.positionOf(path: String, configuration: ConfigurationName): Position? { - val reg = """.*"?${configuration.value}"?\(project[(]?(?:path =\s*)"$path".*""".toRegex() - - val row = indexOfFirst { it.trim().matches(reg) } - - if (row < 0) return null - - val col = get(row).indexOfFirst { it != ' ' } - - return Position(row + 1, col + 1) -} diff --git a/modulecheck-finding/name/api/name.api b/modulecheck-finding/name/api/name.api deleted file mode 100644 index ec481b5b8f..0000000000 --- a/modulecheck-finding/name/api/name.api +++ /dev/null @@ -1,21 +0,0 @@ -public final class modulecheck/finding/FindingName { - public static final field Companion Lmodulecheck/finding/FindingName$Companion; - public fun (Ljava/lang/String;)V - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lmodulecheck/finding/FindingName; - public static synthetic fun copy$default (Lmodulecheck/finding/FindingName;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/finding/FindingName; - public fun equals (Ljava/lang/Object;)Z - public final fun getId ()Ljava/lang/String; - public final fun getPascalCase ()Ljava/lang/String; - public final fun getSnakeCase ()Ljava/lang/String; - public final fun getTitleCase ()Ljava/lang/String; - public final fun getWords ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/finding/FindingName$Companion { - public final fun migrateLegacyIdOrNull (Ljava/lang/String;Lmodulecheck/reporting/logging/McLogger;)Ljava/lang/String; - public final fun safe (Ljava/lang/String;)Lmodulecheck/finding/FindingName; -} - diff --git a/modulecheck-finding/name/build.gradle.kts b/modulecheck-finding/name/build.gradle.kts deleted file mode 100644 index c3ab7d2395..0000000000 --- a/modulecheck-finding/name/build.gradle.kts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-finding-name" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-reporting:logging:api")) - - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-finding/name/src/main/kotlin/modulecheck/finding/FindingName.kt b/modulecheck-finding/name/src/main/kotlin/modulecheck/finding/FindingName.kt deleted file mode 100644 index 953565e374..0000000000 --- a/modulecheck-finding/name/src/main/kotlin/modulecheck/finding/FindingName.kt +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.finding - -import modulecheck.reporting.logging.McLogger -import modulecheck.utils.CaseMatcher -import modulecheck.utils.capitalize -import modulecheck.utils.decapitalize - -data class FindingName( - /** - * some-finding-name - * - * @since 0.12.0 - */ - val id: String -) { - init { - check(CaseMatcher.KebabCaseMatcher().matches(id)) { - "The base name of a finding must be 'kebab-case', such as 'some-finding-name'." + - " This provided name was '$id'." - } - } - - /** - * SomeFindingName - * - * @since 0.12.0 - */ - val titleCase: String - get() = id.split('-').joinToString("") { it.capitalize() } - - /** - * some_finding_name - * - * @since 0.12.0 - */ - val snakeCase: String get() = id.replace('-', '_') - - /** - * someFindingName - * - * @since 0.12.0 - */ - val pascalCase: String - get() = id.split('-') - .joinToString("") { it.capitalize() } - .decapitalize() - - /** - * 'Some finding Name' - * - * @since 0.12.0 - */ - val words: String - get() = id.split('-') - .joinToString(" ") { it.capitalize() } - .decapitalize() - - companion object { - - /** - * @return a [FindingName] if [maybeFindingName] is `kebab-case`, otherwise `null`. - * @since 0.12.4 - */ - fun safe(maybeFindingName: String): FindingName? { - return if (CaseMatcher.KebabCaseMatcher().matches(maybeFindingName)) { - FindingName(maybeFindingName) - } else { - null - } - } - - @Deprecated("This will be removed soon.") - fun migrateLegacyIdOrNull(legacyID: String, logger: McLogger): String? { - - @Suppress("SpellCheckingInspection") - val migrated = when (legacyID.lowercase()) { - "useanvilfactories" -> "use-anvil-factory-generation" - "depth" -> "project-depth" - "disableandroidresources" -> "disable-android-resources" - "disableviewbinding" -> "disable-view-binding" - "inheriteddependency" -> "inherited-dependency" - "mustbeapi" -> "must-be-api" - "overshot" -> "overshot-dependency" - "redundant" -> "redundant-dependency" - "unsorteddependencies" -> "sort-dependencies" - "unsortedplugins" -> "sort-plugins" - "unused" -> "unused-dependency" - "unusedkaptplugin" -> "unused-kapt-plugin" - "unusedkaptprocessor" -> "unused-kapt-processor" - "unusedkotlinandroidextensions" -> "unused-kotlin-android-extensions" - else -> null - } - - if (migrated != null) { - logger.warning( - "The suppressed issue `$legacyID` is using a deprecated ID. " + - "The new name for this issue is `$migrated`." - ) - } - - return migrated - } - } -} diff --git a/modulecheck-gradle/platforms/api/api/api.api b/modulecheck-gradle/platforms/api/api/api.api deleted file mode 100644 index 575b38f252..0000000000 --- a/modulecheck-gradle/platforms/api/api/api.api +++ /dev/null @@ -1,111 +0,0 @@ -public abstract interface class modulecheck/gradle/platforms/ConfigurationsFactory { - public abstract fun create (Lorg/gradle/api/Project;)Lmodulecheck/model/dependency/Configurations; -} - -public final class modulecheck/gradle/platforms/JvmPlatformPluginFactory { - public fun (Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)V - public final fun create (Lorg/gradle/api/Project;Z)Lmodulecheck/model/dependency/JvmPlatformPlugin; -} - -public final class modulecheck/gradle/platforms/JvmPlatformPluginFactoryKt { - public static final fun getKotlinExtensionOrNull (Lorg/gradle/api/Project;)Lorg/jetbrains/kotlin/gradle/dsl/KotlinProjectExtension; -} - -public final class modulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory; - public static final fun newInstance (Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory; -} - -public final class modulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory; - public final fun newInstance (Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory; -} - -public abstract interface class modulecheck/gradle/platforms/KotlinEnvironmentFactory { - public abstract fun create-Flv3FUE (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/lang/String;Lmodulecheck/utils/lazy/LazyDeferred;Ljava/util/Collection;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;)Lmodulecheck/parsing/kotlin/compiler/KotlinEnvironment; -} - -public final class modulecheck/gradle/platforms/SourceSetsFactory { - public fun (Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser;Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser$Factory;)V - public final fun create (Lorg/gradle/api/Project;Lmodulecheck/model/dependency/Configurations;Z)Lmodulecheck/model/dependency/SourceSets; -} - -public final class modulecheck/gradle/platforms/SourceSetsFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/gradle/platforms/SourceSetsFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/SourceSetsFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/SourceSetsFactory; - public static final fun newInstance (Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser;Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser$Factory;)Lmodulecheck/gradle/platforms/SourceSetsFactory; -} - -public final class modulecheck/gradle/platforms/SourceSetsFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/SourceSetsFactory_Factory; - public final fun newInstance (Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser;Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser$Factory;)Lmodulecheck/gradle/platforms/SourceSetsFactory; -} - -public final class modulecheck/gradle/platforms/android/AgpApiAccess { - public fun ()V - public final fun getAgpVersionOrNull ()Lnet/swiftzer/semver/SemVer; - public final fun getAndroidIsInClasspath ()Z - public final fun ifSafeOrNull (Lorg/gradle/api/Project;Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; -} - -public final class modulecheck/gradle/platforms/android/AgpApiAccessKt { - public static final fun isAndroid (Lorg/gradle/api/Project;Lmodulecheck/gradle/platforms/android/AgpApiAccess;)Z -} - -public final class modulecheck/gradle/platforms/android/AgpApiAccess_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/gradle/platforms/android/AgpApiAccess_Factory; - public static final fun create ()Lmodulecheck/gradle/platforms/android/AgpApiAccess_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/android/AgpApiAccess; - public static final fun newInstance ()Lmodulecheck/gradle/platforms/android/AgpApiAccess; -} - -public abstract interface class modulecheck/gradle/platforms/android/AndroidPlatformPluginFactory { - public abstract fun create (Lorg/gradle/api/Project;Lcom/android/build/api/dsl/CommonExtension;Z)Lmodulecheck/model/dependency/AndroidPlatformPlugin; -} - -public final class modulecheck/gradle/platforms/android/SafeAgpApiReferenceScope { - public fun (Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lorg/gradle/api/Project;)V - public final fun create (Lmodulecheck/gradle/platforms/android/AndroidPlatformPluginFactory;Z)Lmodulecheck/model/dependency/AndroidPlatformPlugin; - public final fun create (Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser$Factory;Lmodulecheck/model/dependency/Configurations;Z)Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser; - public final fun isAndroidAppExtension (Ljava/lang/Object;)Z - public final fun isAndroidBaseExtension (Ljava/lang/Object;)Z - public final fun isAndroidCommonExtension (Ljava/lang/Object;)Z - public final fun isAndroidLibraryExtension (Ljava/lang/Object;)Z - public final fun isAndroidTestedExtension (Ljava/lang/Object;)Z - public final fun requireBaseExtension ()Lcom/android/build/gradle/BaseExtension; - public final fun requireCommonExtension ()Lcom/android/build/api/dsl/CommonExtension; -} - -public abstract interface annotation class modulecheck/gradle/platforms/android/UnsafeDirectAgpApiReference : java/lang/annotation/Annotation { -} - -public final class modulecheck/gradle/platforms/internal/JavaVersionKt { - public static final fun toJavaVersion (Lorg/gradle/api/JavaVersion;)Lorg/jetbrains/kotlin/config/JvmTarget; -} - -public abstract interface class modulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser { - public abstract fun parse ()Lmodulecheck/model/dependency/SourceSets; -} - -public abstract interface class modulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser$Factory { - public abstract fun create (Lmodulecheck/model/dependency/Configurations;Lcom/android/build/gradle/BaseExtension;ZLorg/gradle/api/Project;)Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser; -} - -public abstract interface class modulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser { - public abstract fun parse (Lmodulecheck/model/dependency/Configurations;Lorg/gradle/api/Project;)Lmodulecheck/model/dependency/SourceSets; -} - -public final class modulecheck/gradle/platforms/sourcesets/JvmTargetKt { - public static final fun existingFiles (Lorg/gradle/api/file/FileCollection;)Lorg/gradle/api/file/FileCollection; - public static final fun jvmTarget (Lorg/gradle/api/Project;)Lorg/jetbrains/kotlin/config/JvmTarget; - public static final fun kotlinLanguageVersionOrNull (Lorg/gradle/api/Project;)Lorg/jetbrains/kotlin/config/LanguageVersion; -} - diff --git a/modulecheck-gradle/platforms/api/build.gradle.kts b/modulecheck-gradle/platforms/api/build.gradle.kts deleted file mode 100644 index acb0c46991..0000000000 --- a/modulecheck-gradle/platforms/api/build.gradle.kts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-gradle-platform-api" - ) - anvil() -} - -dependencies { - - api(libs.javax.inject) - api(libs.kotlin.compiler) - api(libs.semVer) - - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - api(project(path = ":modulecheck-utils:lazy")) - - compileOnly(gradleApi()) - - compileOnly(libs.agp) - compileOnly(libs.agp.api) - compileOnly(libs.agp.builder.model) - compileOnly(libs.kotlin.gradle.plugin) - compileOnly(libs.kotlin.gradle.plugin.api) - - implementation(libs.kotlin.reflect) - - implementation(project(path = ":modulecheck-dagger")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/ConfigurationsFactory.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/ConfigurationsFactory.kt deleted file mode 100644 index ff06524b5b..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/ConfigurationsFactory.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms - -import modulecheck.model.dependency.Configurations -import modulecheck.parsing.gradle.model.GradleProject - -interface ConfigurationsFactory { - fun create(gradleProject: GradleProject): Configurations -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/JvmPlatformPluginFactory.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/JvmPlatformPluginFactory.kt deleted file mode 100644 index 8f0ebcfdbb..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/JvmPlatformPluginFactory.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms - -import modulecheck.model.dependency.JvmPlatformPlugin -import modulecheck.model.dependency.JvmPlatformPlugin.JavaLibraryPlugin -import modulecheck.model.dependency.JvmPlatformPlugin.KotlinJvmPlugin -import modulecheck.parsing.gradle.model.GradleProject -import org.jetbrains.kotlin.gradle.dsl.KotlinProjectExtension -import javax.inject.Inject - -class JvmPlatformPluginFactory @Inject constructor( - private val configurationsFactory: ConfigurationsFactory, - private val sourceSetsFactory: SourceSetsFactory -) { - - fun create(gradleProject: GradleProject, hasTestFixturesPlugin: Boolean): JvmPlatformPlugin { - - val configurations = configurationsFactory.create(gradleProject) - - val sourceSets = sourceSetsFactory.create( - gradleProject = gradleProject, - configurations = configurations, - hasTestFixturesPlugin = hasTestFixturesPlugin - ) - - return if (gradleProject.getKotlinExtensionOrNull() != null) { - KotlinJvmPlugin(sourceSets, configurations) - } else { - JavaLibraryPlugin(sourceSets, configurations) - } - } -} - -fun GradleProject.getKotlinExtensionOrNull(): KotlinProjectExtension? = - extensions.findByName("kotlin") as? KotlinProjectExtension diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/KotlinEnvironmentFactory.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/KotlinEnvironmentFactory.kt deleted file mode 100644 index f9a32363bb..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/KotlinEnvironmentFactory.kt +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms - -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.KotlinEnvironment -import modulecheck.utils.lazy.LazyDeferred -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.LanguageVersion -import java.io.File - -/** - * Kotlin environment factory - * - * @since 0.12.0 - */ -fun interface KotlinEnvironmentFactory { - /** - * @return a kotlin environment for these many arguments - * @since 0.12.0 - */ - fun create( - projectPath: StringProjectPath, - sourceSetName: SourceSetName, - classpathFiles: LazyDeferred>, - sourceDirs: Collection, - kotlinLanguageVersion: LanguageVersion?, - jvmTarget: JvmTarget - ): KotlinEnvironment -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/SourceSetsFactory.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/SourceSetsFactory.kt deleted file mode 100644 index e9e501c811..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/SourceSetsFactory.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms - -import modulecheck.gradle.platforms.android.AgpApiAccess -import modulecheck.gradle.platforms.sourcesets.AndroidSourceSetsParser -import modulecheck.gradle.platforms.sourcesets.JvmSourceSetsParser -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.SourceSets -import modulecheck.parsing.gradle.model.GradleProject -import javax.inject.Inject - -class SourceSetsFactory @Inject constructor( - private val agpApiAccess: AgpApiAccess, - private val jvmSourceSetsParser: JvmSourceSetsParser, - private val androidSourceSetsParserFactory: AndroidSourceSetsParser.Factory -) { - - fun create( - gradleProject: GradleProject, - configurations: Configurations, - hasTestFixturesPlugin: Boolean - ): SourceSets { - - return agpApiAccess.ifSafeOrNull(gradleProject) { - androidSourceSetsParserFactory.create( - mcConfigurations = configurations, - hasTestFixturesPlugin = hasTestFixturesPlugin - ).parse() - } ?: jvmSourceSetsParser.parse( - parsedConfigurations = configurations, - gradleProject = gradleProject - ) - } -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/AgpApiAccess.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/AgpApiAccess.kt deleted file mode 100644 index 742c59f3c7..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/AgpApiAccess.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.android - -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import modulecheck.parsing.gradle.model.GradleProject -import net.swiftzer.semver.SemVer -import javax.inject.Inject - -/** - * This class provides: - * - * 1. 'Static', project-independent information about AGP in the build classpath. - * 2. A gateway to [SafeAgpApiReferenceScope], which allows access to AGP - * classes after it's verified that they exist in the classpath. - * - * @since 0.12.0 - */ -@SingleIn(TaskScope::class) -class AgpApiAccess @Inject constructor() { - - /** - * Checks that [com.android.build.gradle.BasePlugin] is in the project's *build* classpath. - * - * @since 0.12.0 - */ - val androidIsInClasspath: Boolean by lazy { - @Suppress("SwallowedException") - try { - @Suppress("SENSELESS_COMPARISON") - Class.forName( - "com.android.build.gradle.BasePlugin", - false, - this::class.java.classLoader - ) != null - } catch (e: ClassNotFoundException) { - false - } - } - - /** - * The target project's AGP version, such as '7.0.4' or '7.1.3'. - * - * @since 0.12.0 - */ - val agpVersionOrNull: SemVer? by lazy { - if (androidIsInClasspath) { - // `com.android.builder.model.Version` shouldn't really be deprecated, - // since they removed the suggested replacement. - @Suppress("DEPRECATION") - (SemVer.parse(com.android.builder.model.Version.ANDROID_GRADLE_PLUGIN_VERSION)) - } else { - null - } - } - - /** - * performs [action] if AGP is in the classpath and AGP is applied to this specific [project]. - * - * @param project the project to be used for this [SafeAgpApiReferenceScope] - * @param action the action to perform if AGP is in the - * classpath and AGP is applied to this specific [project] - * @return the output `T` of this [action], or `null` if AGP is not in the classpath - * @since 0.12.0 - */ - inline fun ifSafeOrNull( - project: GradleProject, - action: SafeAgpApiReferenceScope.() -> T - ): T? { - return if (androidIsInClasspath && project.isAndroid(this)) { - SafeAgpApiReferenceScope(this, project).action() - } else { - null - } - } -} - -/** - * @return `true` if the project has a `com.android.*` plugin applied, else false - * @since 0.12.0 - */ -fun GradleProject.isAndroid(agpApiAccess: AgpApiAccess): Boolean { - - if (!agpApiAccess.androidIsInClasspath) return false - - val extension = extensions.findByName("android") ?: return false - - return with(SafeAgpApiReferenceScope(agpApiAccess, this)) { - extension.isAndroidCommonExtension() - } -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/AndroidPlatformPluginFactory.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/AndroidPlatformPluginFactory.kt deleted file mode 100644 index e83f7b9f49..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/AndroidPlatformPluginFactory.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.android - -import modulecheck.model.dependency.AndroidPlatformPlugin - -interface AndroidPlatformPluginFactory { - /** - * @param gradleProject the target project - * @param agpCommonExtension the instance of AGP extension applied to this project - * @param hasTestFixturesPlugin has either the `java-test-fixtures` - * plugin or `buildFeatures.testFixtures` is enabled in the extension - * @return the [AndroidPlatformPlugin] capturing all of this project's settings - * @since 0.12.0 - */ - @UnsafeDirectAgpApiReference - fun create( - gradleProject: org.gradle.api.Project, - agpCommonExtension: AgpCommonExtension, - hasTestFixturesPlugin: Boolean - ): AndroidPlatformPlugin -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/SafeAgpApiReferenceScope.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/SafeAgpApiReferenceScope.kt deleted file mode 100644 index 6e984245f7..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/SafeAgpApiReferenceScope.kt +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.android - -import modulecheck.gradle.platforms.sourcesets.AndroidSourceSetsParser -import modulecheck.model.dependency.AndroidPlatformPlugin -import modulecheck.model.dependency.Configurations -import modulecheck.parsing.gradle.model.GradleProject -import net.swiftzer.semver.SemVer - -/** - * Wrapper for accessing AGP declarations only after it's - * been established that they exist in the classpath. - * - * @see AgpApiAccess - * @see UnsafeDirectAgpApiReference - * @since 0.12.0 - */ -@OptIn(UnsafeDirectAgpApiReference::class) -class SafeAgpApiReferenceScope @PublishedApi internal constructor( - private val agpApiAccess: AgpApiAccess, - private val gradleProject: GradleProject -) { - - /** - * Helper function for `this is AndroidAppExtension` which bypasses the opt-in requirement. - * - * @since 0.12.0 - */ - fun Any?.isAndroidAppExtension(): Boolean = this is AgpAppExtension - - /** - * Helper function for `this is AndroidBaseExtension` which bypasses the opt-in requirement. - * - * @since 0.12.0 - */ - fun Any?.isAndroidBaseExtension(): Boolean = this is AgpBaseExtension - - /** - * Helper function for `this is AndroidCommonExtension` which bypasses the opt-in requirement. - * - * @since 0.12.0 - */ - fun Any?.isAndroidCommonExtension(): Boolean = this is AgpCommonExtension - - /** - * Helper function for `this is AndroidLibraryExtension` which bypasses the opt-in requirement. - * - * @since 0.12.0 - */ - fun Any?.isAndroidLibraryExtension(): Boolean = this is AgpLibraryExtension - - /** - * Helper function for `this is AndroidTestedExtension` which bypasses the opt-in requirement. - * - * @since 0.12.0 - */ - fun Any?.isAndroidTestedExtension(): Boolean = this is AgpTestedExtension - - /** - * Direct access to the AGP [com.android.build.api.dsl.CommonExtension] type, - * only accessible after it's been established that the type is in the classpath. - * - * @since 0.12.0 - */ - fun requireCommonExtension(): AgpCommonExtension = gradleProject.extensions - .getByType(com.android.build.api.dsl.CommonExtension::class.java) - - /** - * Direct access to the AGP [AndroidBaseExtension] type, only accessible - * after it's been established that the type is in the classpath. - * - * @since 0.12.0 - */ - fun requireBaseExtension(): AgpBaseExtension = gradleProject.extensions - .getByType(AgpBaseExtension::class.java) - - private fun hasAgpTestFixtures(): Boolean = gradleProject.extensions - .findByType(AgpTestedExtension::class.java) - ?.takeIf { - val agpVersion = agpApiAccess.agpVersionOrNull ?: return@takeIf false - // minimum API version which actually contains the testFixtures property is 7.1.0 - agpVersion >= SemVer.parse("7.1.0") - } - ?.let { extension -> - @Suppress("UnstableApiUsage") - extension.testFixtures.enable - } ?: false - - /** - * @return A new [AndroidPlatformPlugin] using this scope's [gradleProject] - * @since 0.12.0 - */ - fun AndroidPlatformPluginFactory.create(hasTestFixturesPlugin: Boolean): AndroidPlatformPlugin { - return create( - gradleProject = gradleProject, - agpCommonExtension = requireCommonExtension(), - hasTestFixturesPlugin = hasTestFixturesPlugin || hasAgpTestFixtures() - ) - } - - /** - * @return A new [AndroidSourceSetsParser] using this scope's [gradleProject] - * @since 0.12.0 - */ - fun AndroidSourceSetsParser.Factory.create( - mcConfigurations: Configurations, - hasTestFixturesPlugin: Boolean - ): AndroidSourceSetsParser { - return create( - parsedConfigurations = mcConfigurations, - extension = requireBaseExtension(), - hasTestFixturesPlugin = hasTestFixturesPlugin || hasAgpTestFixtures(), - gradleProject = gradleProject - ) - } -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/UnsafeDirectAgpApiReference.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/UnsafeDirectAgpApiReference.kt deleted file mode 100644 index c00decf75e..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/android/UnsafeDirectAgpApiReference.kt +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.android - -/** - * Any reference to AGP code is annotated with this opt-in - * requirement. AGP code can only be referenced if AGP is in the target - * project's *build* classpath, so it needs to be handled carefully. - * - * Using [AgpApiAccess.ifSafeOrNull] is the easiest and - * safest way to ensure there are no runtime exceptions. - * - * @since 0.12.0 - */ -@Target( - AnnotationTarget.TYPEALIAS, - AnnotationTarget.VALUE_PARAMETER, - AnnotationTarget.FUNCTION, - AnnotationTarget.CLASS -) -@RequiresOptIn( - message = "This reference will probably cause a runtime exception " + - "if the Android Gradle Plugin is not in the classpath. " + - "Wrap this reference in `AgpApiAccess.ifSafeOrNull { ... } to be safe.", - level = RequiresOptIn.Level.ERROR -) -annotation class UnsafeDirectAgpApiReference - -/** [com.android.build.gradle.AppExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpAppExtension = com.android.build.gradle.AppExtension - -/** [com.android.build.api.dsl.ApplicationExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpApplicationExtension = com.android.build.api.dsl.ApplicationExtension - -/** [com.android.build.api.dsl.DynamicFeatureExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpDynamicFeatureExtension = com.android.build.api.dsl.DynamicFeatureExtension - -/** [com.android.build.gradle.BaseExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpBaseExtension = com.android.build.gradle.BaseExtension - -/** [com.android.build.gradle.BasePlugin] */ -@UnsafeDirectAgpApiReference -typealias AgpBasePlugin = com.android.build.gradle.BasePlugin - -/** [com.android.build.gradle.api.AndroidBasePlugin] */ -@UnsafeDirectAgpApiReference -typealias AgpApiBasePlugin = com.android.build.gradle.api.AndroidBasePlugin - -/** [com.android.build.api.dsl.CommonExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpCommonExtension = com.android.build.api.dsl.CommonExtension<*, *, *, *, *, *> - -/** [com.android.build.gradle.LibraryExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpLibraryExtension = com.android.build.gradle.LibraryExtension - -/** [com.android.build.api.variant.AndroidComponentsExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpComponentsExtension = com.android.build.api.variant.AndroidComponentsExtension<*, *, *> - -/** [com.android.build.gradle.TestExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpTestExtension = com.android.build.gradle.TestExtension - -/** [com.android.build.gradle.TestedExtension] */ -@UnsafeDirectAgpApiReference -typealias AgpTestedExtension = com.android.build.gradle.TestedExtension - -/** [com.android.build.api.dsl.AndroidSourceSet] */ -@UnsafeDirectAgpApiReference -typealias AgpSourceSet = com.android.build.api.dsl.AndroidSourceSet - -/** [com.android.build.gradle.api.BaseVariant] */ -@Suppress("DEPRECATION") -@UnsafeDirectAgpApiReference -typealias AgpBaseVariant = com.android.build.gradle.api.BaseVariant - -/** [com.android.build.gradle.internal.api.TestedVariant] */ -@Suppress("DEPRECATION") -@UnsafeDirectAgpApiReference -typealias AgpTestedVariant = com.android.build.gradle.internal.api.TestedVariant - -/** [com.android.build.gradle.api.TestVariant] */ -@Suppress("DEPRECATION") -@UnsafeDirectAgpApiReference -typealias AgpTestVariant = com.android.build.gradle.api.TestVariant - -/** [com.android.build.gradle.api.UnitTestVariant] */ -@Suppress("DEPRECATION") -@UnsafeDirectAgpApiReference -typealias AgpUnitTestVariant = com.android.build.gradle.api.UnitTestVariant - -/** [com.android.build.gradle.internal.core.InternalBaseVariant.MergedFlavor] */ -@UnsafeDirectAgpApiReference -typealias AgpMergedFlavor = com.android.build.gradle.internal.core.InternalBaseVariant.MergedFlavor - -/** [com.android.build.gradle.internal.api.ApplicationVariantImpl] */ -@UnsafeDirectAgpApiReference -typealias AgpApplicationVariantImpl = com.android.build.gradle.internal.api.ApplicationVariantImpl - -/** [com.android.build.gradle.internal.api.LibraryVariantImpl] */ -@UnsafeDirectAgpApiReference -typealias AgpLibraryVariantImpl = com.android.build.gradle.internal.api.LibraryVariantImpl - -/** [com.android.build.gradle.internal.api.DefaultAndroidSourceDirectorySet] */ -@UnsafeDirectAgpApiReference -typealias AgpDefaultAndroidSourceDirectorySet = - com.android.build.gradle.internal.api.DefaultAndroidSourceDirectorySet - -/** [com.android.build.gradle.internal.res.GenerateLibraryRFileTask] */ -@UnsafeDirectAgpApiReference -typealias AgpGenerateLibraryRFileTask = com.android.build.gradle.internal.res.GenerateLibraryRFileTask - -/** [com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask] */ -@UnsafeDirectAgpApiReference -typealias AgpLinkApplicationAndroidResourcesTask = - com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask - -/** [com.android.build.gradle.tasks.GenerateBuildConfig] */ -@UnsafeDirectAgpApiReference -typealias AgpGenerateBuildConfig = com.android.build.gradle.tasks.GenerateBuildConfig - -/** [com.android.build.gradle.tasks.ManifestProcessorTask] */ -@UnsafeDirectAgpApiReference -typealias AgpManifestProcessorTask = com.android.build.gradle.tasks.ManifestProcessorTask diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/internal/javaVersion.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/internal/javaVersion.kt deleted file mode 100644 index 1d4d151a54..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/internal/javaVersion.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.internal - -import org.gradle.api.JavaVersion.VERSION_11 -import org.gradle.api.JavaVersion.VERSION_12 -import org.gradle.api.JavaVersion.VERSION_13 -import org.gradle.api.JavaVersion.VERSION_14 -import org.gradle.api.JavaVersion.VERSION_15 -import org.gradle.api.JavaVersion.VERSION_16 -import org.gradle.api.JavaVersion.VERSION_17 -import org.gradle.api.JavaVersion.VERSION_18 -import org.gradle.api.JavaVersion.VERSION_1_1 -import org.gradle.api.JavaVersion.VERSION_1_10 -import org.gradle.api.JavaVersion.VERSION_1_2 -import org.gradle.api.JavaVersion.VERSION_1_3 -import org.gradle.api.JavaVersion.VERSION_1_4 -import org.gradle.api.JavaVersion.VERSION_1_5 -import org.gradle.api.JavaVersion.VERSION_1_6 -import org.gradle.api.JavaVersion.VERSION_1_7 -import org.gradle.api.JavaVersion.VERSION_1_8 -import org.gradle.api.JavaVersion.VERSION_1_9 -import org.gradle.api.JavaVersion.VERSION_HIGHER -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.JvmTarget.JVM_10 -import org.jetbrains.kotlin.config.JvmTarget.JVM_11 -import org.jetbrains.kotlin.config.JvmTarget.JVM_12 -import org.jetbrains.kotlin.config.JvmTarget.JVM_13 -import org.jetbrains.kotlin.config.JvmTarget.JVM_14 -import org.jetbrains.kotlin.config.JvmTarget.JVM_15 -import org.jetbrains.kotlin.config.JvmTarget.JVM_16 -import org.jetbrains.kotlin.config.JvmTarget.JVM_17 -import org.jetbrains.kotlin.config.JvmTarget.JVM_1_6 -import org.jetbrains.kotlin.config.JvmTarget.JVM_1_8 -import org.jetbrains.kotlin.config.JvmTarget.JVM_9 - -typealias GradleJavaVersion = org.gradle.api.JavaVersion - -/** - * @return the [JvmTarget] version for this receiver [JavaVersion][GradleJavaVersion] - * @since 0.12.0 - */ -@Suppress("ComplexMethod") -fun GradleJavaVersion.toJavaVersion(): JvmTarget { - @Suppress("ElseCaseInsteadOfExhaustiveWhen") - return when (this) { - VERSION_1_1 -> error("Unsupported Java version: $this") - VERSION_1_2 -> error("Unsupported Java version: $this") - VERSION_1_3 -> error("Unsupported Java version: $this") - VERSION_1_4 -> error("Unsupported Java version: $this") - VERSION_1_5 -> error("Unsupported Java version: $this") - VERSION_1_6 -> JVM_1_6 - VERSION_1_7 -> JVM_1_6 - VERSION_1_8 -> JVM_1_8 - VERSION_1_9 -> JVM_9 - VERSION_1_10 -> JVM_10 - VERSION_11 -> JVM_11 - VERSION_12 -> JVM_12 - VERSION_13 -> JVM_13 - VERSION_14 -> JVM_14 - VERSION_15 -> JVM_15 - VERSION_16 -> JVM_16 - VERSION_17 -> JVM_17 - // VERSION_18 -> JVM_18 - VERSION_18 -> error("Unsupported Java version: $this") - VERSION_HIGHER -> error("Unsupported Java version: $this") - else -> error("Unsupported Java version: $this") - } -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser.kt deleted file mode 100644 index 248487312c..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.sourcesets - -import modulecheck.gradle.platforms.android.AgpBaseExtension -import modulecheck.gradle.platforms.android.UnsafeDirectAgpApiReference -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.SourceSets -import modulecheck.parsing.gradle.model.GradleProject - -fun interface AndroidSourceSetsParser { - fun parse(): SourceSets - - fun interface Factory { - /** - * @param parsedConfigurations the configurations for this target project - * @param extension the instance of AGP extension applied to this project - * @param hasTestFixturesPlugin has either the `java-test-fixtures` - * plugin or `buildFeatures.testFixtures` is enabled in the extension - * @param gradleProject the project being parsed - * @return the [AndroidSourceSetsParser] for this project - * @since 0.12.0 - */ - @UnsafeDirectAgpApiReference - fun create( - parsedConfigurations: Configurations, - extension: AgpBaseExtension, - hasTestFixturesPlugin: Boolean, - gradleProject: GradleProject - ): AndroidSourceSetsParser - } -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser.kt deleted file mode 100644 index 9c360d43e1..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.sourcesets - -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.SourceSets -import modulecheck.parsing.gradle.model.GradleProject - -fun interface JvmSourceSetsParser { - fun parse(parsedConfigurations: Configurations, gradleProject: GradleProject): SourceSets -} diff --git a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/jvmTarget.kt b/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/jvmTarget.kt deleted file mode 100644 index 1805475032..0000000000 --- a/modulecheck-gradle/platforms/api/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/jvmTarget.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.sourcesets - -import modulecheck.gradle.platforms.getKotlinExtensionOrNull -import modulecheck.gradle.platforms.internal.toJavaVersion -import modulecheck.parsing.gradle.model.GradleProject -import org.gradle.api.file.FileCollection -import org.gradle.api.plugins.JavaPluginExtension -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.LanguageVersion - -/** - * @return every file which is an actual file (not - * directory), and actually exists in this file system - * @since 0.12.0 - */ -fun FileCollection.existingFiles(): FileCollection = filter { it.isFile && it.exists() } - -/** - * @return the Java version used to compile this project - * @since 0.12.0 - */ -fun GradleProject.jvmTarget(): JvmTarget { - return extensions.findByType(JavaPluginExtension::class.java) - ?.sourceCompatibility - ?.toJavaVersion() - ?: JvmTarget.JVM_1_8 -} - -/** - * @return the Kotlin language version used to compile this project - * @since 0.12.0 - */ -fun GradleProject.kotlinLanguageVersionOrNull(): LanguageVersion? { - - return getKotlinExtensionOrNull()?.let { kotlinExtension -> - LanguageVersion.fromFullVersionString(kotlinExtension.coreLibrariesVersion) - } -} diff --git a/modulecheck-gradle/platforms/impl/api/impl.api b/modulecheck-gradle/platforms/impl/api/impl.api deleted file mode 100644 index 3310b74234..0000000000 --- a/modulecheck-gradle/platforms/impl/api/impl.api +++ /dev/null @@ -1,32 +0,0 @@ -public final class anvil/hint/Modulecheck_gradle_platforms_RealConfigurationsFactory_ConfigurationsFactory_TaskScope_BindingModule_07a98a9c_1c815900Kt { - public static final fun getModulecheck_gradle_platforms_RealConfigurationsFactory_ConfigurationsFactory_TaskScope_BindingModule_07a98a9c_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_platforms_RealConfigurationsFactory_ConfigurationsFactory_TaskScope_BindingModule_07a98a9c_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/gradle/platforms/RealConfigurationsFactory : modulecheck/gradle/platforms/ConfigurationsFactory { - public static final field Companion Lmodulecheck/gradle/platforms/RealConfigurationsFactory$Companion; - public fun (Lmodulecheck/model/dependency/ProjectDependency$Factory;Lmodulecheck/model/dependency/ExternalDependency$Factory;)V - public fun create (Lorg/gradle/api/Project;)Lmodulecheck/model/dependency/Configurations; -} - -public final class modulecheck/gradle/platforms/RealConfigurationsFactory$Companion { -} - -public abstract interface class modulecheck/gradle/platforms/RealConfigurationsFactory_ConfigurationsFactory_TaskScope_BindingModule_07a98a9c { - public abstract fun bindConfigurationsFactory (Lmodulecheck/gradle/platforms/RealConfigurationsFactory;)Lmodulecheck/gradle/platforms/ConfigurationsFactory; -} - -public final class modulecheck/gradle/platforms/RealConfigurationsFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/gradle/platforms/RealConfigurationsFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/RealConfigurationsFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/RealConfigurationsFactory; - public static final fun newInstance (Lmodulecheck/model/dependency/ProjectDependency$Factory;Lmodulecheck/model/dependency/ExternalDependency$Factory;)Lmodulecheck/gradle/platforms/RealConfigurationsFactory; -} - -public final class modulecheck/gradle/platforms/RealConfigurationsFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/RealConfigurationsFactory_Factory; - public final fun newInstance (Lmodulecheck/model/dependency/ProjectDependency$Factory;Lmodulecheck/model/dependency/ExternalDependency$Factory;)Lmodulecheck/gradle/platforms/RealConfigurationsFactory; -} - diff --git a/modulecheck-gradle/platforms/impl/build.gradle.kts b/modulecheck-gradle/platforms/impl/build.gradle.kts deleted file mode 100644 index 54b0c67320..0000000000 --- a/modulecheck-gradle/platforms/impl/build.gradle.kts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-gradle-platform-impl" - ) - anvil() -} - -dependencies { - - api(libs.javax.inject) - - api(project(path = ":modulecheck-gradle:platforms:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - - compileOnly(gradleApi()) - - compileOnly(libs.kotlin.gradle.plugin) - compileOnly(libs.kotlin.gradle.plugin.api) - - implementation(libs.rickBusarow.kgx) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-gradle/platforms/impl/src/main/kotlin/modulecheck/gradle/platforms/RealConfigurationsFactory.kt b/modulecheck-gradle/platforms/impl/src/main/kotlin/modulecheck/gradle/platforms/RealConfigurationsFactory.kt deleted file mode 100644 index 29d093c7dd..0000000000 --- a/modulecheck-gradle/platforms/impl/src/main/kotlin/modulecheck/gradle/platforms/RealConfigurationsFactory.kt +++ /dev/null @@ -1,99 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.ConfigFactory -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.ExternalDependency -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.asConfigurationName -import modulecheck.parsing.gradle.model.GradleConfiguration -import modulecheck.parsing.gradle.model.GradleProject -import modulecheck.parsing.gradle.model.GradleProjectDependency -import modulecheck.utils.mapToSet -import org.gradle.api.artifacts.ExternalModuleDependency -import org.gradle.api.artifacts.ModuleDependency -import org.gradle.api.initialization.dsl.ScriptHandler -import org.gradle.internal.component.external.model.ProjectDerivedCapability -import javax.inject.Inject - -@ContributesBinding(TaskScope::class) -class RealConfigurationsFactory @Inject constructor( - private val projectDependencyFactory: ProjectDependency.Factory, - private val externalDependencyFactory: ExternalDependency.Factory -) : ConfigurationsFactory { - - override fun create(gradleProject: GradleProject): Configurations { - - val configFactory = ConfigFactory( - identifier = { name }, - projectDependencies = { projectDependencies(this) }, - externalDependencies = { externalDependencies(this) }, - allFactory = { gradleProject.configurations.asSequence() }, - extendsFrom = { - gradleProject.configurations.findByName(this) - ?.extendsFrom - ?.toList() - .orEmpty() - } - ) - - val map = gradleProject.configurations - .filterNot { it.name == ScriptHandler.CLASSPATH_CONFIGURATION } - .associate { configuration -> - - configuration.name.asConfigurationName() to configFactory.create(configuration) - } - return Configurations(map) - } - - private fun projectDependencies(configuration: GradleConfiguration): Set = - configuration.dependencies - .withType(GradleProjectDependency::class.java) - .mapToSet { gradleProjectDependency -> - - projectDependencyFactory.create( - configurationName = configuration.name.asConfigurationName(), - path = StringProjectPath(gradleProjectDependency.dependencyProject.path), - isTestFixture = gradleProjectDependency.isTestFixtures() - ) - } - - private fun externalDependencies(configuration: GradleConfiguration): Set = - configuration.dependencies - .filterIsInstance() - .mapToSet { dep -> - - externalDependencyFactory.create( - configurationName = configuration.name.asConfigurationName(), - group = dep.group, - moduleName = dep.name, - version = dep.version, - isTestFixture = dep.isTestFixtures() - ) - } - - private fun ModuleDependency.isTestFixtures() = requestedCapabilities - .filterIsInstance() - .any { capability -> capability.capabilityId.endsWith(TEST_FIXTURES_SUFFIX) } - - companion object { - private const val TEST_FIXTURES_SUFFIX = "-test-fixtures" - } -} diff --git a/modulecheck-gradle/platforms/internal-android/api/internal-android.api b/modulecheck-gradle/platforms/internal-android/api/internal-android.api deleted file mode 100644 index eb472e8391..0000000000 --- a/modulecheck-gradle/platforms/internal-android/api/internal-android.api +++ /dev/null @@ -1,129 +0,0 @@ -public final class anvil/hint/Modulecheck_gradle_platforms_android_RealAndroidPlatformPluginFactory_AndroidPlatformPluginFactory_TaskScope_BindingModule_c3aae00d_284c2c20Kt { - public static final fun getModulecheck_gradle_platforms_android_RealAndroidPlatformPluginFactory_AndroidPlatformPluginFactory_TaskScope_BindingModule_c3aae00d_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_platforms_android_RealAndroidPlatformPluginFactory_AndroidPlatformPluginFactory_TaskScope_BindingModule_c3aae00d_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_gradle_platforms_android_sourcesets_Factory_Factory_TaskScope_BindingModule_b5d09f9c_7cf27766Kt { - public static final fun getModulecheck_gradle_platforms_android_sourcesets_Factory_Factory_TaskScope_BindingModule_b5d09f9c_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_platforms_android_sourcesets_Factory_Factory_TaskScope_BindingModule_b5d09f9c_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory : modulecheck/gradle/platforms/android/AndroidPlatformPluginFactory { - public fun (Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)V - public fun create (Lorg/gradle/api/Project;Lcom/android/build/api/dsl/CommonExtension;Z)Lmodulecheck/model/dependency/AndroidPlatformPlugin; -} - -public abstract interface class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType { - public static final field Companion Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Companion; - public abstract fun getExtension ()Lcom/android/build/api/dsl/CommonExtension; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Application : modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType { - public fun (Lcom/android/build/api/dsl/ApplicationExtension;)V - public final fun component1 ()Lcom/android/build/api/dsl/ApplicationExtension; - public final fun copy (Lcom/android/build/api/dsl/ApplicationExtension;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Application; - public static synthetic fun copy$default (Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Application;Lcom/android/build/api/dsl/ApplicationExtension;ILjava/lang/Object;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Application; - public fun equals (Ljava/lang/Object;)Z - public fun getExtension ()Lcom/android/build/api/dsl/ApplicationExtension; - public synthetic fun getExtension ()Lcom/android/build/api/dsl/CommonExtension; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Companion { - public final fun from (Ljava/lang/Object;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$DynamicFeature : modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType { - public fun (Lcom/android/build/api/dsl/DynamicFeatureExtension;)V - public final fun component1 ()Lcom/android/build/api/dsl/DynamicFeatureExtension; - public final fun copy (Lcom/android/build/api/dsl/DynamicFeatureExtension;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$DynamicFeature; - public static synthetic fun copy$default (Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$DynamicFeature;Lcom/android/build/api/dsl/DynamicFeatureExtension;ILjava/lang/Object;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$DynamicFeature; - public fun equals (Ljava/lang/Object;)Z - public synthetic fun getExtension ()Lcom/android/build/api/dsl/CommonExtension; - public fun getExtension ()Lcom/android/build/api/dsl/DynamicFeatureExtension; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Library : modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType { - public fun (Lcom/android/build/gradle/LibraryExtension;)V - public final fun component1 ()Lcom/android/build/gradle/LibraryExtension; - public final fun copy (Lcom/android/build/gradle/LibraryExtension;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Library; - public static synthetic fun copy$default (Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Library;Lcom/android/build/gradle/LibraryExtension;ILjava/lang/Object;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Library; - public fun equals (Ljava/lang/Object;)Z - public synthetic fun getExtension ()Lcom/android/build/api/dsl/CommonExtension; - public fun getExtension ()Lcom/android/build/gradle/LibraryExtension; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Test : modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType { - public fun (Lcom/android/build/gradle/TestExtension;)V - public final fun component1 ()Lcom/android/build/gradle/TestExtension; - public final fun copy (Lcom/android/build/gradle/TestExtension;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Test; - public static synthetic fun copy$default (Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Test;Lcom/android/build/gradle/TestExtension;ILjava/lang/Object;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory$AgpExtensionType$Test; - public fun equals (Ljava/lang/Object;)Z - public synthetic fun getExtension ()Lcom/android/build/api/dsl/CommonExtension; - public fun getExtension ()Lcom/android/build/gradle/TestExtension; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory_AndroidPlatformPluginFactory_TaskScope_BindingModule_c3aae00d { - public abstract fun bindAndroidPlatformPluginFactory (Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory;)Lmodulecheck/gradle/platforms/android/AndroidPlatformPluginFactory; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory; - public static final fun newInstance (Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory; -} - -public final class modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory_Factory; - public final fun newInstance (Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)Lmodulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory; -} - -public final class modulecheck/gradle/platforms/android/internal/ProjectKt { - public static final fun androidManifests (Lorg/gradle/api/Project;Lmodulecheck/gradle/platforms/android/AgpApiAccess;)Ljava/util/Map; - public static final fun androidNamespaces (Lorg/gradle/api/Project;Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/model/dependency/SourceSets;)Ljava/util/Map; - public static final fun files (Lkotlin/io/FileTreeWalk;)Lkotlin/sequences/Sequence; - public static final fun generatesBuildConfig (Lorg/gradle/api/Project;Lmodulecheck/gradle/platforms/android/AgpApiAccess;)Z - public static final fun isMissingManifestFile (Lorg/gradle/api/Project;Lmodulecheck/gradle/platforms/android/AgpApiAccess;)Z - public static final fun mainAndroidManifest (Lorg/gradle/api/Project;Lmodulecheck/gradle/platforms/android/AgpApiAccess;)Ljava/io/File; - public static final fun orPropertyDefault (Ljava/lang/Boolean;Lorg/gradle/api/Project;Ljava/lang/String;Z)Z -} - -public abstract interface class modulecheck/gradle/platforms/android/sourcesets/Factory_Factory_TaskScope_BindingModule_b5d09f9c { - public abstract fun bindFactory (Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser$Factory;)Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser$Factory; -} - -public final class modulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser : modulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser { - public synthetic fun (Lmodulecheck/model/dependency/Configurations;Lcom/android/build/gradle/BaseExtension;ZLorg/gradle/api/Project;Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun parse ()Lmodulecheck/model/dependency/SourceSets; -} - -public final class modulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser$Factory : modulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser$Factory { - public fun (Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory;)V - public fun create (Lmodulecheck/model/dependency/Configurations;Lcom/android/build/gradle/BaseExtension;ZLorg/gradle/api/Project;)Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser; - public synthetic fun create (Lmodulecheck/model/dependency/Configurations;Lcom/android/build/gradle/BaseExtension;ZLorg/gradle/api/Project;)Lmodulecheck/gradle/platforms/sourcesets/AndroidSourceSetsParser; -} - -public final class modulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser_Factory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser_Factory_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser_Factory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser$Factory; - public static final fun newInstance (Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory;)Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser$Factory; -} - -public final class modulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser_Factory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser_Factory_Factory; - public final fun newInstance (Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory;)Lmodulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser$Factory; -} - diff --git a/modulecheck-gradle/platforms/internal-android/build.gradle.kts b/modulecheck-gradle/platforms/internal-android/build.gradle.kts deleted file mode 100644 index 9c8be648e9..0000000000 --- a/modulecheck-gradle/platforms/internal-android/build.gradle.kts +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-gradle-platform-internal-android" - ) - anvil() -} - -kotlin { - compilerOptions { - optIn.add("modulecheck.gradle.platforms.android.UnsafeDirectAgpApiReference") - } -} - -dependencies { - - api(libs.javax.inject) - - api(project(path = ":modulecheck-gradle:platforms:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-utils:lazy")) - - compileOnly(gradleApi()) - - compileOnly(libs.agp) - compileOnly(libs.agp.api) - compileOnly(libs.agp.builder.model) - compileOnly(libs.kotlin.gradle.plugin) - compileOnly(libs.kotlin.gradle.plugin.api) - - implementation(libs.kotlin.compiler) - implementation(libs.rickBusarow.kgx) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory.kt b/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory.kt deleted file mode 100644 index 6cf58e02a9..0000000000 --- a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/RealAndroidPlatformPluginFactory.kt +++ /dev/null @@ -1,270 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.android - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.gradle.platforms.ConfigurationsFactory -import modulecheck.gradle.platforms.SourceSetsFactory -import modulecheck.gradle.platforms.android.RealAndroidPlatformPluginFactory.AgpExtensionType.Application -import modulecheck.gradle.platforms.android.RealAndroidPlatformPluginFactory.AgpExtensionType.DynamicFeature -import modulecheck.gradle.platforms.android.RealAndroidPlatformPluginFactory.AgpExtensionType.Library -import modulecheck.gradle.platforms.android.RealAndroidPlatformPluginFactory.AgpExtensionType.Test -import modulecheck.gradle.platforms.android.internal.androidManifests -import modulecheck.gradle.platforms.android.internal.androidNamespaces -import modulecheck.gradle.platforms.android.internal.orPropertyDefault -import modulecheck.model.dependency.AndroidPlatformPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidApplicationPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidDynamicFeaturePlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidLibraryPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidTestPlugin -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.asSourceSetName -import modulecheck.parsing.gradle.model.GradleProject -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.utils.cast -import modulecheck.utils.requireNotNull -import net.swiftzer.semver.SemVer -import javax.inject.Inject -import kotlin.LazyThreadSafetyMode.NONE - -/** - * Factory for creating [AndroidPlatformPlugin] instances - * based on the type of Android Gradle Plugin (AGP) extension. - * - * @param agpApiAccess Provides access to AGP APIs. - * @param configurationsFactory Factory for creating [Configurations] instances. - * @param sourceSetsFactory Factory for creating [SourceSets] instances. - */ -@ContributesBinding(TaskScope::class) -class RealAndroidPlatformPluginFactory @Inject constructor( - private val agpApiAccess: AgpApiAccess, - private val configurationsFactory: ConfigurationsFactory, - private val sourceSetsFactory: SourceSetsFactory -) : AndroidPlatformPluginFactory { - - private val agp8 by lazy(NONE) { SemVer(major = 8, minor = 0, patch = 0) } - - /** - * Creates an [AndroidPlatformPlugin] based on the provided parameters. It - * handles different AGP extension types and applies the necessary configurations. - * - * @param gradleProject The Gradle project information. - * @param agpCommonExtension Common AGP extension interface. - * @param hasTestFixturesPlugin Flag indicating if the test fixtures plugin is present. - * @return The created [AndroidPlatformPlugin] instance. - */ - @UnsafeDirectAgpApiReference - override fun create( - gradleProject: GradleProject, - agpCommonExtension: AgpCommonExtension, - hasTestFixturesPlugin: Boolean - ): AndroidPlatformPlugin { - - val type = AgpExtensionType.from(agpCommonExtension) - - val configurations = configurationsFactory.create(gradleProject) - - val sourceSets = sourceSetsFactory.create( - gradleProject = gradleProject, - configurations = configurations, - hasTestFixturesPlugin = hasTestFixturesPlugin - ) - - val manifests = gradleProject.androidManifests(agpApiAccess).orEmpty() - - val namespaces = gradleProject.androidNamespaces(agpApiAccess, sourceSets).orEmpty() - - val resValuesLazy = lazy { parseResValues(type) } - - val hasKotlinAndroidExtensions = gradleProject - .pluginManager - .hasPlugin("android-extensions") - - // Defaults for `nonTransitiveRClass` and `buildconfig` changed with AGP 8.0, - // so we have to do the version check. - // https://developer.android.com/build/releases/gradle-plugin#default-changes - val agpVersion = agpApiAccess.agpVersionOrNull - .requireNotNull { "Could not parse the AGP version" } - - val nonTransientRClass = gradleProject - .findProperty("android.nonTransitiveRClass")?.toString() - ?.toBooleanStrictOrNull() - ?: (agpVersion >= agp8) - - @Suppress("UnstableApiUsage") - val buildConfigEnabled = type.extension.buildFeatures.buildConfig - .orPropertyDefault( - gradleProject = gradleProject, - key = "android.defaults.buildfeatures.buildconfig", - defaultValue = agpVersion < agp8 - ) - - @Suppress("UnstableApiUsage") - val viewBindingEnabled = type.extension.buildFeatures.viewBinding - .orPropertyDefault( - gradleProject = gradleProject, - key = "android.defaults.buildfeatures.viewbinding", - defaultValue = false - ) - - @Suppress("UnstableApiUsage") - val androidResourcesEnabled = (type.extension as? AgpLibraryExtension) - ?.buildFeatures - ?.androidResources - .orPropertyDefault( - gradleProject = gradleProject, - key = "android.library.defaults.buildfeatures.androidresources", - defaultValue = true - ) - - return when (type) { - is Application -> AndroidApplicationPlugin( - sourceSets = sourceSets, - configurations = configurations, - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = hasKotlinAndroidExtensions, - manifests = manifests, - namespaces = namespaces, - resValuesLazy = resValuesLazy - ) - - is DynamicFeature -> AndroidDynamicFeaturePlugin( - sourceSets = sourceSets, - configurations = configurations, - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = hasKotlinAndroidExtensions, - manifests = manifests, - namespaces = namespaces, - buildConfigEnabled = buildConfigEnabled, - resValuesLazy = resValuesLazy - ) - - is Library -> AndroidLibraryPlugin( - sourceSets = sourceSets, - configurations = configurations, - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = hasKotlinAndroidExtensions, - manifests = manifests, - namespaces = namespaces, - androidResourcesEnabled = androidResourcesEnabled, - buildConfigEnabled = buildConfigEnabled, - resValuesLazy = resValuesLazy - ) - - is Test -> AndroidTestPlugin( - sourceSets = sourceSets, - configurations = configurations, - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = hasKotlinAndroidExtensions, - manifests = manifests, - namespaces = namespaces, - buildConfigEnabled = buildConfigEnabled, - resValuesLazy = resValuesLazy - ) - } - } - - @UnsafeDirectAgpApiReference - private fun parseResValues( - type: AgpExtensionType<*> - ): MutableMap> { - fun Any.mergedFlavors(): List { - return when (this) { - is AgpAppExtension -> applicationVariants.map { it.cast().mergedFlavor } - is AgpLibraryExtension -> libraryVariants.map { it.cast().mergedFlavor } - else -> emptyList() - } - } - - fun Any.buildTypes(): List { - return when (this) { - is AgpAppExtension -> applicationVariants.mapNotNull { it.buildType } - is AgpLibraryExtension -> libraryVariants.mapNotNull { it.buildType } - else -> emptyList() - } - } - - val map = type.extension.mergedFlavors() - .associate { mergedFlavor -> - val sourceSetName = mergedFlavor.name.asSourceSetName() - - sourceSetName to mergedFlavor.resValues.values - .mapNotNull { classField -> - UnqualifiedAndroidResource.fromValuePair(classField.type, classField.name) - }.toSet() - }.toMutableMap() - - type.extension.buildTypes() - .forEach { buildType -> - val sourceSetName = buildType.name.asSourceSetName() - - map[sourceSetName] = buildType.resValues.values - .mapNotNull { classField -> - UnqualifiedAndroidResource.fromValuePair(classField.type, classField.name) - }.toSet() - } - - return map - } - - /** Makes the base AGP extension types exhaustive. */ - sealed interface AgpExtensionType { - /** */ - val extension: T - - /** [com.android.build.gradle.LibraryExtension] */ - data class Library( - override val extension: AgpLibraryExtension - ) : AgpExtensionType - - /** [com.android.build.api.dsl.ApplicationExtension] */ - data class Application( - override val extension: AgpApplicationExtension - ) : AgpExtensionType - - /** [com.android.build.gradle.TestExtension] */ - data class Test(override val extension: AgpTestExtension) : AgpExtensionType - - /** [com.android.build.api.dsl.DynamicFeatureExtension] */ - data class DynamicFeature( - override val extension: AgpDynamicFeatureExtension - ) : AgpExtensionType - - companion object { - /** - * Factory method to create an [AgpExtensionType] from the given extension object. - * - * @param extension The extension object. - * @return The corresponding [AgpExtensionType]. - * @throws IllegalArgumentException If the extension type is unrecognized. - */ - fun from(extension: Any): AgpExtensionType<*> { - return when (extension) { - is AgpLibraryExtension -> Library(extension) - is AgpApplicationExtension -> Application(extension) - is AgpTestExtension -> Test(extension) - is AgpDynamicFeatureExtension -> DynamicFeature(extension) - else -> error("unrecognized Android extension ${extension::class.java.canonicalName}") - } - } - } - } -} diff --git a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/internal/project.kt b/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/internal/project.kt deleted file mode 100644 index 40d64db94f..0000000000 --- a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/internal/project.kt +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:JvmMultifileClass - -package modulecheck.gradle.platforms.android.internal - -import modulecheck.gradle.platforms.android.AgpApiAccess -import modulecheck.gradle.platforms.android.AgpTestedExtension -import modulecheck.gradle.platforms.android.UnsafeDirectAgpApiReference -import modulecheck.model.dependency.SourceSets -import modulecheck.model.dependency.isTestingOnly -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.asSourceSetName -import modulecheck.parsing.gradle.model.GradleProject -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.PackageName.Companion.asPackageName -import java.io.File - -fun FileTreeWalk.files(): Sequence = asSequence().filter { it.isFile } - -/** - * @param agpApiAccess the [AgpApiAccess] to use for safe access - * @return A map of the [SourceSetName] to manifest [File] if - * the AGP plugin is applied, or null if AGP isn't applied - * @since 0.12.0 - */ -@UnsafeDirectAgpApiReference -fun GradleProject.androidManifests(agpApiAccess: AgpApiAccess): Map? = - agpApiAccess.ifSafeOrNull(this) { - requireBaseExtension() - .sourceSets - .associate { it.name.asSourceSetName() to it.manifest.srcFile } - } - -/** - * @param agpApiAccess the [AgpApiAccess] to use for safe access - * @param mcSourceSets the [SourceSets] from this project, used to look up hierarchies - * @return A map of the [SourceSetName] to base package names if the - * [namespace][com.android.build.api.dsl.CommonExtension.namespace] is defined - * @since 0.12.0 - */ -@UnsafeDirectAgpApiReference -fun GradleProject.androidNamespaces( - agpApiAccess: AgpApiAccess, - mcSourceSets: SourceSets -): Map? = agpApiAccess.ifSafeOrNull(this) { - - val baseExtension = requireBaseExtension() - - val namespace = baseExtension.namespace?.asPackageName() - val testNameSpaceOrNull = - (baseExtension as? AgpTestedExtension)?.testNamespace?.asPackageName() - - baseExtension.sourceSets - .mapNotNull { androidSourceSet -> - - val name = androidSourceSet.name.asSourceSetName() - - val isTestingSourceSet = name.isTestingOnly(mcSourceSets) - - val thisNamespace = testNameSpaceOrNull.takeIf { isTestingSourceSet } - ?: namespace - ?: return@mapNotNull null - - name to thisNamespace - } - .toMap() -} - -/** - * @param agpApiAccess the [AgpApiAccess] to use for safe access - * @return the main src `AndroidManifest.xml` file if it exists. This will - * typically be `$projectDir/src/main/AndroidManifest.xml`, but if the position - * has been changed in the Android extension, the new path will be used. - * @since 0.12.0 - */ -fun GradleProject.mainAndroidManifest(agpApiAccess: AgpApiAccess): File? { - - return agpApiAccess.ifSafeOrNull(this) { - - requireCommonExtension().sourceSets - .findByName("main") - ?.manifest - ?.let { it as? com.android.build.gradle.internal.api.DefaultAndroidSourceFile } - ?.srcFile - } -} - -/** - * @param agpApiAccess the [AgpApiAccess] to use for safe access - * @return true if the project is an Android project and no manifest - * file exists at the location defined in the Android extension - * @since 0.12.0 - */ -fun GradleProject.isMissingManifestFile(agpApiAccess: AgpApiAccess): Boolean { - - return mainAndroidManifest(agpApiAccess) - // the file must be declared, but not exist in order for this to be triggered - ?.let { !it.exists() } - ?: false -} - -/** - * @param agpApiAccess the [AgpApiAccess] to use for safe access - * @return true if the project is an Android library, dynamic feature, or test - * extensions module and BuildConfig generation has NOT been explicitly disabled. - * @since 0.12.0 - */ -fun GradleProject.generatesBuildConfig(agpApiAccess: AgpApiAccess): Boolean { - - return agpApiAccess.ifSafeOrNull(this) { - requireCommonExtension().buildFeatures.buildConfig != false - } - ?.orPropertyDefault( - gradleProject = this, - key = "android.defaults.buildfeatures.buildconfig", - defaultValue = true - ) - ?: false -} - -fun Boolean?.orPropertyDefault( - gradleProject: GradleProject, - key: String, - defaultValue: Boolean -): Boolean { - if (this != null) return this - return gradleProject.findProperty(key) as? Boolean ?: defaultValue -} diff --git a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser.kt b/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser.kt deleted file mode 100644 index 860f6e6b61..0000000000 --- a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/sourcesets/RealAndroidSourceSetsParser.kt +++ /dev/null @@ -1,667 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("DEPRECATION", "ForbiddenImport") - -package modulecheck.gradle.platforms.android.sourcesets - -import com.android.build.gradle.BaseExtension -import com.android.build.gradle.TestedExtension -import com.android.build.gradle.api.BaseVariant -import com.android.build.gradle.api.TestVariant -import com.android.build.gradle.api.UnitTestVariant -import com.android.build.gradle.internal.api.DefaultAndroidSourceSet -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.gradle.platforms.KotlinEnvironmentFactory -import modulecheck.gradle.platforms.android.AgpAppExtension -import modulecheck.gradle.platforms.android.AgpLibraryExtension -import modulecheck.gradle.platforms.android.AgpTestExtension -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName.BuildTypeName -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName.ConcatenatedFlavorsName -import modulecheck.gradle.platforms.android.sourcesets.internal.ParsedNames -import modulecheck.gradle.platforms.sourcesets.AndroidSourceSetsParser -import modulecheck.gradle.platforms.sourcesets.jvmTarget -import modulecheck.gradle.platforms.sourcesets.kotlinLanguageVersionOrNull -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.McSourceSet -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.SourceSets -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.dependency.distinctSourceSetNames -import modulecheck.model.dependency.names -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.asSourceSetName -import modulecheck.model.sourceset.removePrefix -import modulecheck.parsing.gradle.model.GradleProject -import modulecheck.utils.capitalize -import modulecheck.utils.existsOrNull -import modulecheck.utils.flatMapToSet -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.mapToSet -import org.gradle.api.DomainObjectSet -import org.gradle.api.artifacts.ExternalModuleDependency -import java.io.File -import javax.inject.Inject - -/** - * Given this Android config block: - * - * ``` - * android { - * buildTypes { - * register("internalRelease").configure { - * isMinifyEnabled = true - * isShrinkResources = true - * matchingFallbacks.add("release") - * } - * } - * flavorDimensions("shade", "color") - * productFlavors { - * create("light") { dimension = "shade" } - * create("dark") { dimension = "shade" } - * create("red") { dimension = "color" } - * create("blue") { dimension = "color" } - * } - * } - * ``` - * - * `BuildType` names: [[debug, internalRelease, release]] - * - * Primitive flavor names: [[light, dark, red, blue]] - * - * Combined flavor names: [[lightRed, lightBlue, darkRed, darkBlue]] - * - * Flavor dimensions are just arbitrary keys which allow us to group flavors together. - * These names are not used to create SourceSets. The final collection of SourceSets - * would be unaffected if these were just named something like [["a", "b"]]. - * - * ``` - * Flavor dimensions (these do not become SourceSets): [[shade, color]] - * Product flavors: { color: [[blue, red]], shade: [[light, dark]] } - * ``` - * - * Flavors get combined via matrix multiplication and string concatenation in order to - * create more SourceSets. The order of the concatenated string components ("light", - * "red", etc.) is determined by the order in which their corresponding flavor dimensions - * are added. In this example, since "shade" is added before "color", then the flavors - * of "shade" ("light", "dark") will be before the flavors of "color" ("red", "blue"). - * - * ``` - * [light, dark] x [red, blue] = [lightRed, lightBlue, darkRed, darkBlue] - * ``` - * - * Build Variants are now created via more matrix multiplication and string concatenation, - * between the `BuildType` and combined flavor names. **BuildType names are always last.** - * - * ``` - * [lightRed, lightBlue, darkRed, darkBlue] x [debug, internalRelease, release] = - * [ - * lightRedDebug, lightRedRelease, lightRedInternalRelease, - * lightBlueDebug, lightBlueRelease, lightBlueInternalRelease, - * darkRedDebug, darkRedRelease, darkRedInternalRelease, - * darkBlueDebug, darkBlueRelease, darkBlueInternalRelease - * ] - * ``` - * - * Finally, a "main" SourceSet is always created. - * - * So just within the *production code* sources, we get all these SourceSets: - * - * ``` - * // primitives - * main - * light dark - * red blue - * debug internalRelease release - * - * // flavor combinations - * lightRed darkRed lightBlue darkBlue - * - * // flavor combinations with build types - * lightRedDebug lightRedInternalRelease lightRedRelease - * darkRedDebug darkRedInternalRelease darkRedRelease - * lightBlueDebug lightBlueInternalRelease lightBlueRelease - * darkBlueDebug darkBlueInternalRelease darkBlueRelease - * ``` - * - * @since 0.12.0 - */ -class RealAndroidSourceSetsParser private constructor( - private val parsedConfigurations: Configurations, - private val extension: BaseExtension, - private val hasTestFixturesPlugin: Boolean, - private val gradleProject: GradleProject, - private val kotlinEnvironmentFactory: KotlinEnvironmentFactory -) : AndroidSourceSetsParser { - - private val projectPath = StringProjectPath(gradleProject.path) - - private val gradleAndroidSourceSets by lazy { - extension.sourceSets - .filterIsInstance() - .associateBy { it.name } - } - - private val buildTypeNames by lazy { - extension.buildTypes.map { - BuildTypeName(it.name) - } - } - private val flavorDimensions by lazy { - extension.flavorDimensionList - .ifEmpty { listOf("default_flavor_dimension") } - } - private val productFlavors2D by lazy { - val mapped = extension.productFlavors - .groupBy { it.dimension ?: "default_flavor_dimension" } - .mapValues { (_, productFlavors) -> - productFlavors.map { GradleSourceSetName.FlavorName(it.name) } - } - - flavorDimensions.map { mapped.getValue(it) } - } - - private val variantMap by lazy { - - val tested = (extension as? TestedExtension) - ?.let { it.testVariants + it.unitTestVariants } - .orEmpty() - - extension.publishedVariants() - .plus(tested) - .associateBy { GradleSourceSetName.VariantName(it.name) } - } - - private val sourceSetNameToUpstreamMap = buildMap> { - - put(GradleSourceSetName.MainName, emptyList()) - // `test` and `androidTest` source sets automatically target the `debug` build type, - // which means they get `debug` and `main` source sets automatically - put( - GradleSourceSetName.AndroidTestName, - listOf(GradleSourceSetName.MainName, BuildTypeName.DEBUG) - ) - put(GradleSourceSetName.UnitTestName, listOf(GradleSourceSetName.MainName, BuildTypeName.DEBUG)) - - extension.publishedVariants() - .map { GradleSourceSetName.VariantName(it.name) } - .forEach { variantName -> - - val parsed = variantName.parseNames(null) - - saveNameHierarchy(parsed) - } - - if (extension is TestedExtension) { - - extension.testVariants - .map { GradleSourceSetName.VariantName(it.nameWithoutAndroidTestSuffix()) } - .forEach { variantName -> - - val parsed = variantName.parseNames(GradleSourceSetName.AndroidTestName) - - saveNameHierarchy(parsed) - } - - extension.unitTestVariants - .map { GradleSourceSetName.VariantName(it.nameWithoutUnitTestSuffix()) } - .forEach { variantName -> - - val parsed = variantName.parseNames(GradleSourceSetName.UnitTestName) - - saveNameHierarchy(parsed) - } - } - } - - private val sourceSetCache = mutableMapOf() - - override fun parse(): SourceSets { - - val m = gradleAndroidSourceSets.values - .mapNotNull { it.toSourceSetOrNull() } - .associateBy { it.name } - .toMutableMap() - .maybeAddTestFixturesSourceSets() - - return SourceSets(m) - } - - private fun GradleSourceSetName.VariantName.parseNames( - testTypeOrNull: GradleSourceSetName.TestType? - ): ParsedNames { - - if (extension.productFlavors.isEmpty()) { - return ParsedNames( - variantName = this, - concatenatedFlavorsName = null, - buildTypeName = BuildTypeName(value), - flavors = emptyList(), - testTypeOrNull = testTypeOrNull - ) - } - - val (concatenatedFlavorsName, buildTypeName) = splitFlavorAndBuildType() - - val flavors = concatenatedFlavorsName.upstreamFlavors() - - return ParsedNames( - variantName = this, - concatenatedFlavorsName = concatenatedFlavorsName, - buildTypeName = buildTypeName, - flavors = flavors, - testTypeOrNull = testTypeOrNull - ) - } - - private fun MutableMap>.put( - key: GradleSourceSetName, - values: List - ) { - if (key is GradleSourceSetName.TestSourceName<*>) { - putIfAbsent(key.value, (values + key.published).filterNot { it.value == key.value }) - } else { - putIfAbsent(key.value, values.filterNot { it.value == key.value }) - } - } - - private fun MutableMap>.saveNameHierarchy( - parsedNames: ParsedNames - ) { - - val ( - variantName, - concatenatedFlavorsName, - buildTypeName, - flavors, - testTypeOrNull - ) = parsedNames - - // either [main], [androidTest, main], or [test, main] - val commonTypes = listOfNotNull(testTypeOrNull, GradleSourceSetName.MainName) - - val maybeTestVariant = testTypeOrNull - ?.let { GradleSourceSetName.TestSourceName(testTypeOrNull, variantName) } - ?: variantName - - val maybeTestConcatenatedFlavors = concatenatedFlavorsName?.let { - testTypeOrNull - ?.let { GradleSourceSetName.TestSourceName(testTypeOrNull, concatenatedFlavorsName) } - ?: concatenatedFlavorsName - } - - val maybeTestFlavors = testTypeOrNull - ?.let { - flavors - .map { flavorName -> GradleSourceSetName.TestSourceName(testTypeOrNull, flavorName) } - .plus(flavors) - } - ?: flavors - - val maybeTestBuildType = testTypeOrNull - ?.let { GradleSourceSetName.TestSourceName(testTypeOrNull, buildTypeName) } - ?: buildTypeName - - if (maybeTestConcatenatedFlavors != null) { - put(maybeTestConcatenatedFlavors, maybeTestFlavors + commonTypes) - } - put(maybeTestBuildType, commonTypes) - - val concatenatedUpstream = concatenatedFlavorsName?.let { - getValue(concatenatedFlavorsName.value) - }.orEmpty() - - val upstreamOfVariant = maybeTestFlavors - .asSequence() - .plus(maybeTestConcatenatedFlavors) - .plus(concatenatedUpstream) - .plus(maybeTestBuildType) - .plus(buildTypeName) - .plus(GradleSourceSetName.MainName) - .distinct() - .toList() - .filterNotNull() - - put(maybeTestVariant, upstreamOfVariant) - - maybeTestFlavors.forEach { flavor -> - put(flavor, commonTypes) - } - } - - private fun DefaultAndroidSourceSet.toSourceSetOrNull(): McSourceSet? { - - if (!sourceSetNameToUpstreamMap.containsKey(name)) return null - - val sourceSetName = name.asSourceSetName() - - return sourceSetCache.getOrPut(sourceSetName) { - - val jvmFiles = javaDirectories - .plus(kotlinDirectories) - .flatMapToSet { it.walkTopDown().toList() } - - val resourceFiles = resDirectories - .flatMap { it.walkTopDown() } - .toSet() - - val layoutFiles = resourceFiles - .filter { - it.isFile && it.path - // replace `\` from Windows paths with `/`. - .replace(File.separator, "/") - .contains("""/res/layout.*/.*.xml""".toRegex()) - } - .toSet() - - val namesMap = sourceSetNameToUpstreamMap - - val upstreamNames = namesMap.getValue(sourceSetName.value) - - val upstreamLazy = lazy { - - upstreamNames - .flatMap { upstreamName -> - sourceSetNameToUpstreamMap.getValue(upstreamName.value) - .plus(upstreamName) - .filter { gradleAndroidSourceSets.containsKey(it.value) } - } - .distinct() - .map { it.value.asSourceSetName() } - } - - val downstreamLazy = lazy { - namesMap.entries - .filter { (_, upstream) -> - upstream.any { it.value == sourceSetName.value } - } - .mapToSet { it.key } - .distinct() - .filter { gradleAndroidSourceSets.containsKey(it) } - .map { it.asSourceSetName() } - } - - val classpath = lazyDeferred { - upstreamLazy.value - .asSequence() - .map { it.value } - .plus(name) - .mapNotNull { variantMap[GradleSourceSetName.VariantName(it)] } - .flatMap { variant -> - sequenceOf( - variant.compileConfiguration, - variant.runtimeConfiguration - ) - .flatMap { config -> - config.fileCollection { dependency -> - dependency is ExternalModuleDependency - } - .mapNotNull { it.existsOrNull() } - } - .toSet() - } - .toList() - } - - val kotlinEnvironmentDeferred = lazyDeferred { - kotlinEnvironmentFactory.create( - projectPath = projectPath, - sourceSetName = sourceSetName, - classpathFiles = classpath, - sourceDirs = jvmFiles, - kotlinLanguageVersion = gradleProject.kotlinLanguageVersionOrNull(), - jvmTarget = gradleProject.jvmTarget() - ) - } - - McSourceSet( - name = sourceSetName, - compileOnlyConfiguration = parsedConfigurations - .getValue(compileOnlyConfigurationName.asConfigurationName()), - apiConfiguration = parsedConfigurations[apiConfigurationName.asConfigurationName()], - implementationConfiguration = parsedConfigurations - .getValue(implementationConfigurationName.asConfigurationName()), - runtimeOnlyConfiguration = parsedConfigurations - .getValue(runtimeOnlyConfigurationName.asConfigurationName()), - annotationProcessorConfiguration = parsedConfigurations - .getValue(annotationProcessorConfigurationName.asConfigurationName()), - jvmFiles = jvmFiles, - resourceFiles = resourceFiles, - layoutFiles = layoutFiles, - jvmTarget = gradleProject.jvmTarget(), - kotlinEnvironmentDeferred = kotlinEnvironmentDeferred, - upstreamLazy = upstreamLazy, - downstreamLazy = downstreamLazy - ) - } - } - - private fun ConcatenatedFlavorsName.upstreamFlavors(): List { - val upstreamNames = mutableListOf() - - var runningName = value - - productFlavors2D.forEachIndexed { index, flavors -> - - fun String.expectedCapitalization() = if (index == 0) { - this - } else { - capitalize() - } - - val match = flavors - .sortedByDescending { it.value.length } - .first { runningName.startsWith(it.value.expectedCapitalization()) } - - upstreamNames.add(match) - - runningName = runningName.removePrefix(match.value.expectedCapitalization()) - } - - return upstreamNames.distinct() - } - - private fun BaseExtension.publishedVariants(): DomainObjectSet = when (this) { - is AgpAppExtension -> applicationVariants - is AgpLibraryExtension -> libraryVariants - is AgpTestExtension -> applicationVariants - else -> error( - "Expected the extension to be `AppExtension`, `LibraryExtension`, or `TestExtension`, " + - "but it was `${this::class.qualifiedName}`." - ) - } - - private fun GradleSourceSetName.VariantName.splitFlavorAndBuildType(): Pair { - buildTypeNames - // Sort descending by length because there may be multiple build types with the same - // suffix, like ["internalRelease", "Release"]. In that example, it's important that - // "internalRelease" is removed first, because otherwise a source set name of - // "fooInternalRelease" would be parsed as "fooInternal", which isn't valid. - .sortedByDescending { it.value.length } - .forEach { buildTypeName -> - - val buildTypeCapitalized = buildTypeName.value.capitalize() - - if (value.endsWith(buildTypeCapitalized)) { - val withoutBuildType = value.removeSuffix(buildTypeCapitalized) - return ConcatenatedFlavorsName(withoutBuildType) to buildTypeName - } - } - error( - """Unable to find a matching build type name from the provided build variant name. - | build variant name --- $value - | possible build types - ${buildTypeNames.map { it.value }} - """.trimMargin() - ) - } - - /* - TestFixtures aren't actually defined completely in Gradle. The source sets and their - configurations are defined. The configurations have a bit of a hierarchy, but they don't leave - the scope of the java-test-fixtures plugin. Nothing extends "main" source stuff. - - So, for each testFixtures source set name, remove the `testFixtures-` prefix in order to determine - its upstream source set, then look up that source set and add its upstream sets to the - corresponding testFixtures one. - */ - private fun MutableMap.maybeAddTestFixturesSourceSets() = apply { - // The testFixtures source sets are defined regardless of whether the testFixtures feature is - // actually enabled. If it isn't enabled, don't add the Gradle source sets to our types. - if (!hasTestFixturesPlugin) return@apply - - gradleAndroidSourceSets.values - .filter { it.name.contains(SourceSetName.TEST_FIXTURES.value) } - .forEach { androidSourceSet -> - - val sourceSetName = androidSourceSet.name.asSourceSetName() - - val configs = listOf( - androidSourceSet.compileOnlyConfigurationName, - androidSourceSet.apiConfigurationName, - androidSourceSet.implementationConfigurationName, - androidSourceSet.runtimeOnlyConfigurationName - ).mapNotNull { parsedConfigurations[it.asConfigurationName()] } - - val upstreamLazy = lazy { - val upstream = androidSourceSet.name.removeTestFixturesPrefix() - .let { this.getValue(it) } - .withUpstream() - .plus(SourceSetName.MAIN) - - configs - .names() - .distinctSourceSetNames() - .filter { containsKey(it) } - .plus(upstream) - .filterNot { it == sourceSetName } - .distinct() - } - - val downstreamLazy = lazy { - configs - .names() - .distinctSourceSetNames() - .mapNotNull { this[it] } - .names() - .filterNot { it == sourceSetName } - .distinct() - } - - val jvmFiles = androidSourceSet.javaDirectories - .plus(androidSourceSet.kotlinDirectories) - .flatMapToSet { it.walkTopDown().toList() } - - val resourceFiles = androidSourceSet.resDirectories - .flatMap { it.walkTopDown() } - .toSet() - - val layoutFiles = resourceFiles - .filter { - it.isFile && it.path - // replace `\` from Windows paths with `/`. - .replace(File.separator, "/") - .contains("""/res/layout.*/.*.xml""".toRegex()) - } - .toSet() - - val kotlinEnvironmentDeferred = lazyDeferred { - kotlinEnvironmentFactory.create( - projectPath = projectPath, - sourceSetName = sourceSetName, - classpathFiles = lazyDeferred { extension.bootClasspath.toList() }, - sourceDirs = jvmFiles, - kotlinLanguageVersion = gradleProject.kotlinLanguageVersionOrNull(), - jvmTarget = gradleProject.jvmTarget() - ) - } - - put( - sourceSetName, - McSourceSet( - name = sourceSetName, - compileOnlyConfiguration = parsedConfigurations - .getValue(androidSourceSet.compileOnlyConfigurationName.asConfigurationName()), - apiConfiguration = parsedConfigurations - .get(androidSourceSet.apiConfigurationName.asConfigurationName()), - implementationConfiguration = parsedConfigurations - .getValue(androidSourceSet.implementationConfigurationName.asConfigurationName()), - runtimeOnlyConfiguration = parsedConfigurations - .getValue(androidSourceSet.runtimeOnlyConfigurationName.asConfigurationName()), - annotationProcessorConfiguration = parsedConfigurations - .getValue( - androidSourceSet.annotationProcessorConfigurationName.asConfigurationName() - ), - jvmFiles = jvmFiles, - resourceFiles = resourceFiles, - layoutFiles = layoutFiles, - jvmTarget = gradleProject.jvmTarget(), - kotlinEnvironmentDeferred = kotlinEnvironmentDeferred, - upstreamLazy = upstreamLazy, - downstreamLazy = downstreamLazy - ) - ) - } - } - - /** - * This removes the `-AndroidTest` suffix from **variant** - * names. SourceSet names don't get this suffix - * - * @since 0.12.0 - */ - @Suppress("DEPRECATION") - private fun TestVariant.nameWithoutAndroidTestSuffix(): String { - return name.removeSuffix("AndroidTest") - } - - /** - * This removes the `-UnitTest` suffix from **variant** - * names. SourceSet names don't get this suffix - * - * @since 0.12.0 - */ - @Suppress("DEPRECATION") - private fun UnitTestVariant.nameWithoutUnitTestSuffix(): String { - return name.removeSuffix("UnitTest") - } - - private fun String.removeTestFixturesPrefix(): SourceSetName { - return asSourceSetName().removePrefix(SourceSetName.TEST_FIXTURES) - .takeIf { it.value.isNotBlank() } - ?: SourceSetName.MAIN - } - - @ContributesBinding(TaskScope::class) - class Factory @Inject constructor( - private val kotlinEnvironmentFactory: KotlinEnvironmentFactory - ) : AndroidSourceSetsParser.Factory { - override fun create( - parsedConfigurations: Configurations, - extension: BaseExtension, - hasTestFixturesPlugin: Boolean, - gradleProject: GradleProject - ): RealAndroidSourceSetsParser { - return RealAndroidSourceSetsParser( - parsedConfigurations = parsedConfigurations, - extension = extension, - hasTestFixturesPlugin = hasTestFixturesPlugin, - gradleProject = gradleProject, - kotlinEnvironmentFactory = kotlinEnvironmentFactory - ) - } - } -} diff --git a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/sourcesets/internal/GradleSourceSetName.kt b/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/sourcesets/internal/GradleSourceSetName.kt deleted file mode 100644 index 1ee3d3c9f0..0000000000 --- a/modulecheck-gradle/platforms/internal-android/src/main/kotlin/modulecheck/gradle/platforms/android/sourcesets/internal/GradleSourceSetName.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.android.sourcesets.internal - -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName.BuildTypeName -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName.ConcatenatedFlavorsName -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName.FlavorName -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName.TestType -import modulecheck.gradle.platforms.android.sourcesets.internal.GradleSourceSetName.VariantName -import modulecheck.utils.capitalize - -internal data class ParsedNames( - val variantName: VariantName, - val concatenatedFlavorsName: ConcatenatedFlavorsName?, - val buildTypeName: BuildTypeName, - val flavors: List, - val testTypeOrNull: TestType? -) - -internal sealed interface GradleSourceSetName : Comparable { - val value: String - - sealed interface TestType : GradleSourceSetName - - @JvmInline - value class VariantName(override val value: String) : GradleSourceSetName - - @JvmInline - value class BuildTypeName(override val value: String) : GradleSourceSetName { - companion object { - val DEBUG = BuildTypeName("debug") - val RELEASE = BuildTypeName("release") - } - } - - @JvmInline - value class FlavorName(override val value: String) : GradleSourceSetName - - @JvmInline - value class ConcatenatedFlavorsName(override val value: String) : GradleSourceSetName - - object MainName : GradleSourceSetName { - override val value = "main" - } - - object AndroidTestName : GradleSourceSetName, TestType { - override val value = "androidTest" - } - - object UnitTestName : GradleSourceSetName, TestType { - override val value = "test" - } - - /** - * Represents the `test` or `androidTest` corollary to a normal/published source set. - * - * For instance, a source set of `testDebug` has a test - * prefix of `test` and a published property of `debug`. - * - * @since 0.12.0 - */ - data class TestSourceName( - val testPrefix: TestType, - val published: T - ) : GradleSourceSetName { - override val value = "${testPrefix.value}${published.value.capitalize()}" - } - - override fun compareTo(other: GradleSourceSetName): Int { - - @Suppress("MagicNumber") - fun GradleSourceSetName.score(): Int { - return when (this) { - is BuildTypeName -> 4 - is ConcatenatedFlavorsName -> 7 - is FlavorName -> 10 - MainName -> 0 - is VariantName -> 2 - AndroidTestName -> 1 - UnitTestName -> 1 - is TestSourceName<*> -> 2 - } - } - - val score1 = score() - val score2 = other.score() - - return score1.compareTo(score2) - } -} diff --git a/modulecheck-gradle/platforms/internal-jvm/api/internal-jvm.api b/modulecheck-gradle/platforms/internal-jvm/api/internal-jvm.api deleted file mode 100644 index 8572d7db94..0000000000 --- a/modulecheck-gradle/platforms/internal-jvm/api/internal-jvm.api +++ /dev/null @@ -1,47 +0,0 @@ -public final class anvil/hint/Modulecheck_gradle_platforms_sourcesets_RealJvmSourceSetsParser_JvmSourceSetsParser_TaskScope_BindingModule_5527c16a_dc4a0426Kt { - public static final fun getModulecheck_gradle_platforms_sourcesets_RealJvmSourceSetsParser_JvmSourceSetsParser_TaskScope_BindingModule_5527c16a_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_platforms_sourcesets_RealJvmSourceSetsParser_JvmSourceSetsParser_TaskScope_BindingModule_5527c16a_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/gradle/platforms/JvmPlatformPluginFactory { - public fun (Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)V - public final fun create (Lorg/gradle/api/Project;Z)Lmodulecheck/model/dependency/JvmPlatformPlugin; -} - -public final class modulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory; - public static final fun newInstance (Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory; -} - -public final class modulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory_Factory; - public final fun newInstance (Lmodulecheck/gradle/platforms/ConfigurationsFactory;Lmodulecheck/gradle/platforms/SourceSetsFactory;)Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory; -} - -public final class modulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser : modulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser { - public fun (Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory;)V - public fun parse (Lmodulecheck/model/dependency/Configurations;Lorg/gradle/api/Project;)Lmodulecheck/model/dependency/SourceSets; -} - -public final class modulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser; - public static final fun newInstance (Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory;)Lmodulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser; -} - -public final class modulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser_Factory; - public final fun newInstance (Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory;)Lmodulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser; -} - -public abstract interface class modulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser_JvmSourceSetsParser_TaskScope_BindingModule_5527c16a { - public abstract fun bindJvmSourceSetsParser (Lmodulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser;)Lmodulecheck/gradle/platforms/sourcesets/JvmSourceSetsParser; -} - diff --git a/modulecheck-gradle/platforms/internal-jvm/build.gradle.kts b/modulecheck-gradle/platforms/internal-jvm/build.gradle.kts deleted file mode 100644 index 03046a8bb2..0000000000 --- a/modulecheck-gradle/platforms/internal-jvm/build.gradle.kts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-gradle-platform-internal-jvm" - ) - anvil() -} - -dependencies { - - api(libs.javax.inject) - api(libs.kotlin.compiler) - - api(project(path = ":modulecheck-gradle:platforms:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - api(project(path = ":modulecheck-utils:lazy")) - - compileOnly(gradleApi()) - - compileOnly(libs.kotlin.gradle.plugin) - compileOnly(libs.kotlin.gradle.plugin.api) - - implementation(libs.rickBusarow.kgx) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-model:sourceset:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-gradle/platforms/internal-jvm/src/main/kotlin/modulecheck/gradle/platforms/JvmPlatformPluginFactory.kt b/modulecheck-gradle/platforms/internal-jvm/src/main/kotlin/modulecheck/gradle/platforms/JvmPlatformPluginFactory.kt deleted file mode 100644 index b21996e90d..0000000000 --- a/modulecheck-gradle/platforms/internal-jvm/src/main/kotlin/modulecheck/gradle/platforms/JvmPlatformPluginFactory.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms - -import modulecheck.model.dependency.JvmPlatformPlugin -import modulecheck.model.dependency.JvmPlatformPlugin.JavaLibraryPlugin -import modulecheck.model.dependency.JvmPlatformPlugin.KotlinJvmPlugin -import modulecheck.parsing.gradle.model.GradleProject -import javax.inject.Inject - -class JvmPlatformPluginFactory @Inject constructor( - private val configurationsFactory: ConfigurationsFactory, - private val sourceSetsFactory: SourceSetsFactory -) { - - fun create(gradleProject: GradleProject, hasTestFixturesPlugin: Boolean): JvmPlatformPlugin { - - val configurations = configurationsFactory.create(gradleProject) - - val sourceSets = sourceSetsFactory.create( - gradleProject = gradleProject, - configurations = configurations, - hasTestFixturesPlugin = hasTestFixturesPlugin - ) - - return if (gradleProject.getKotlinExtensionOrNull() != null) { - KotlinJvmPlugin(sourceSets, configurations) - } else { - JavaLibraryPlugin(sourceSets, configurations) - } - } -} diff --git a/modulecheck-gradle/platforms/internal-jvm/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser.kt b/modulecheck-gradle/platforms/internal-jvm/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser.kt deleted file mode 100644 index 35dd2deaac..0000000000 --- a/modulecheck-gradle/platforms/internal-jvm/src/main/kotlin/modulecheck/gradle/platforms/sourcesets/RealJvmSourceSetsParser.kt +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.platforms.sourcesets - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.gradle.platforms.KotlinEnvironmentFactory -import modulecheck.gradle.platforms.getKotlinExtensionOrNull -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.McConfiguration -import modulecheck.model.dependency.McSourceSet -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.SourceSets -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.asSourceSetName -import modulecheck.parsing.gradle.model.GradleProject -import modulecheck.parsing.gradle.model.GradleSourceSet -import modulecheck.utils.flatMapToSet -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.requireNotNull -import org.gradle.api.plugins.JavaPluginExtension -import org.jetbrains.kotlin.gradle.plugin.KotlinSourceSet -import javax.inject.Inject - -@ContributesBinding(TaskScope::class) -class RealJvmSourceSetsParser @Inject constructor( - private val kotlinEnvironmentFactory: KotlinEnvironmentFactory -) : JvmSourceSetsParser { - - override fun parse( - parsedConfigurations: Configurations, - gradleProject: GradleProject - ): SourceSets { - val map = buildMap { - val kotlinExtensionOrNull = gradleProject.getKotlinExtensionOrNull() - - val javaExtension = gradleProject.extensions - .findByType(JavaPluginExtension::class.java) - - val jvmTarget = gradleProject.jvmTarget() - - val projectPath = StringProjectPath(gradleProject.path) - - if (kotlinExtensionOrNull != null) { - kotlinExtensionOrNull.sourceSets - .forEach { kotlinSourceSet: KotlinSourceSet -> - - val sourceSetName = kotlinSourceSet.name.asSourceSetName() - - val configs = listOf( - kotlinSourceSet.compileOnlyConfigurationName, - kotlinSourceSet.apiConfigurationName, - kotlinSourceSet.implementationConfigurationName, - kotlinSourceSet.runtimeOnlyConfigurationName - ).mapNotNull { parsedConfigurations[it.asConfigurationName()] } - - val ( - upstreamLazy, - downstreamLazy - ) = parseHierarchy(sourceSetName, configs) - - val classpath = lazyDeferred { - javaExtension?.sourceSets - ?.findByName(sourceSetName.value) - ?.classpath() - ?.filter { it.exists() } - ?.filterNotNull() - ?.toList() - .orEmpty() - } - - val kotlinVersion = gradleProject.kotlinLanguageVersionOrNull() - .requireNotNull { - "kotlin version is null for project -- ${gradleProject.path}" - } - - val jvmFiles = kotlinSourceSet.kotlin.srcDirs - - val kotlinEnvironmentDeferred = lazyDeferred { - kotlinEnvironmentFactory.create( - projectPath = projectPath, - sourceSetName = sourceSetName, - classpathFiles = classpath, - sourceDirs = jvmFiles, - kotlinLanguageVersion = kotlinVersion, - jvmTarget = jvmTarget - ) - } - - put( - kotlinSourceSet.name.asSourceSetName(), - McSourceSet( - name = sourceSetName, - compileOnlyConfiguration = parsedConfigurations - .getValue(kotlinSourceSet.compileOnlyConfigurationName.asConfigurationName()), - apiConfiguration = parsedConfigurations - .get(kotlinSourceSet.apiConfigurationName.asConfigurationName()), - implementationConfiguration = parsedConfigurations - .getValue(kotlinSourceSet.implementationConfigurationName.asConfigurationName()), - runtimeOnlyConfiguration = parsedConfigurations - .getValue(kotlinSourceSet.runtimeOnlyConfigurationName.asConfigurationName()), - annotationProcessorConfiguration = null, - jvmFiles = jvmFiles, - resourceFiles = kotlinSourceSet.resources.sourceDirectories.files, - layoutFiles = emptySet(), - jvmTarget = jvmTarget, - kotlinEnvironmentDeferred = kotlinEnvironmentDeferred, - upstreamLazy = upstreamLazy, - downstreamLazy = downstreamLazy - ) - ) - } - } else { - gradleProject.extensions - .findByType(JavaPluginExtension::class.java) - ?.sourceSets - ?.forEach { gradleSourceSet -> - - val sourceSetName = gradleSourceSet.name.asSourceSetName() - - val configs = listOf( - gradleSourceSet.compileOnlyConfigurationName, - gradleSourceSet.apiConfigurationName, - gradleSourceSet.implementationConfigurationName, - gradleSourceSet.runtimeOnlyConfigurationName - ).mapNotNull { parsedConfigurations[it.asConfigurationName()] } - - val ( - upstreamLazy, - downstreamLazy - ) = parseHierarchy(sourceSetName, configs) - - val jvmFiles = gradleSourceSet.allJava.srcDirs - - val kotlinEnvironmentDeferred = lazyDeferred { - kotlinEnvironmentFactory.create( - projectPath = projectPath, - sourceSetName = sourceSetName, - classpathFiles = lazyDeferred { gradleSourceSet.classpath() }, - sourceDirs = jvmFiles, - kotlinLanguageVersion = null, - jvmTarget = jvmTarget - ) - } - - put( - gradleSourceSet.name.asSourceSetName(), - McSourceSet( - name = sourceSetName, - compileOnlyConfiguration = parsedConfigurations - .getValue(gradleSourceSet.compileOnlyConfigurationName.asConfigurationName()), - apiConfiguration = parsedConfigurations - .get(gradleSourceSet.apiConfigurationName.asConfigurationName()), - implementationConfiguration = parsedConfigurations - .getValue(gradleSourceSet.implementationConfigurationName.asConfigurationName()), - runtimeOnlyConfiguration = parsedConfigurations - .getValue(gradleSourceSet.runtimeOnlyConfigurationName.asConfigurationName()), - annotationProcessorConfiguration = null, - jvmFiles = jvmFiles, - resourceFiles = gradleSourceSet.resources.sourceDirectories.files, - layoutFiles = emptySet(), - jvmTarget = jvmTarget, - kotlinEnvironmentDeferred = kotlinEnvironmentDeferred, - upstreamLazy = upstreamLazy, - downstreamLazy = downstreamLazy - ) - ) - } - } - } - - return SourceSets(map) - } - - private fun MutableMap.parseHierarchy( - sourceSetName: SourceSetName, - configurations: List - ): Pair>, Lazy>> { - // Get the up/downstream configurations for this source set. Parse the SourceSetName out of the - // ConfigurationName, and **if that name is in this map**, that SourceSetName must be - // up/downstream of this particular source set. - - val upstreamLazy = lazy { - configurations - .flatMapToSet { it.upstream.map { upstreamConfig -> upstreamConfig.name.toSourceSetName() } } - .filterNot { it == sourceSetName } - .filter { this@parseHierarchy.contains(it) } - .distinct() - } - - val downstreamLazy = lazy { - configurations - .flatMapToSet { it.downstream.map { downstreamConfig -> downstreamConfig.name.toSourceSetName() } } - .filterNot { it == sourceSetName } - .filter { this@parseHierarchy.contains(it) } - .distinct() - } - - return upstreamLazy to downstreamLazy - } - - private fun GradleSourceSet.classpath() = compileClasspath.existingFiles() - .plus(output.classesDirs.existingFiles()) - .toList() -} diff --git a/modulecheck-gradle/plugin/api/plugin.api b/modulecheck-gradle/plugin/api/plugin.api deleted file mode 100644 index 4b112c7751..0000000000 --- a/modulecheck-gradle/plugin/api/plugin.api +++ /dev/null @@ -1,362 +0,0 @@ -public final class anvil/hint/Modulecheck_gradle_GradleMcLogger_McLogger_TaskScope_BindingModule_4e9c3b03_27e42822Kt { - public static final fun getModulecheck_gradle_GradleMcLogger_McLogger_TaskScope_BindingModule_4e9c3b03_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_GradleMcLogger_McLogger_TaskScope_BindingModule_4e9c3b03_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_gradle_internal_GradleProjectProvider_ProjectProvider_TaskScope_BindingModule_5a875a70_0b43ebafKt { - public static final fun getModulecheck_gradle_internal_GradleProjectProvider_ProjectProvider_TaskScope_BindingModule_5a875a70_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_internal_GradleProjectProvider_ProjectProvider_TaskScope_BindingModule_5a875a70_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_gradle_internal_RealDocsWebsiteUrlProvider_DocsWebsiteUrlProvider_TaskScope_BindingModule_c5ad305f_7d731fc7Kt { - public static final fun getModulecheck_gradle_internal_RealDocsWebsiteUrlProvider_DocsWebsiteUrlProvider_TaskScope_BindingModule_c5ad305f_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_internal_RealDocsWebsiteUrlProvider_DocsWebsiteUrlProvider_TaskScope_BindingModule_c5ad305f_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_gradle_internal_RealModuleCheckVersionProvider_ModuleCheckVersionProvider_TaskScope_BindingModule_2d6f69be_90fe7a49Kt { - public static final fun getModulecheck_gradle_internal_RealModuleCheckVersionProvider_ModuleCheckVersionProvider_TaskScope_BindingModule_2d6f69be_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_internal_RealModuleCheckVersionProvider_ModuleCheckVersionProvider_TaskScope_BindingModule_2d6f69be_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_gradle_internal_RealSourceWebsiteUrlProvider_SourceWebsiteUrlProvider_TaskScope_BindingModule_70a21c45_74044ecfKt { - public static final fun getModulecheck_gradle_internal_RealSourceWebsiteUrlProvider_SourceWebsiteUrlProvider_TaskScope_BindingModule_70a21c45_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_gradle_internal_RealSourceWebsiteUrlProvider_SourceWebsiteUrlProvider_TaskScope_BindingModule_70a21c45_scope0 ()Lkotlin/reflect/KClass; -} - -public class modulecheck/gradle/ChecksExtension : modulecheck/config/ChecksSettings { - public fun (Lorg/gradle/api/model/ObjectFactory;)V - public fun getAnvilFactoryGeneration ()Z - public fun getDepths ()Z - public fun getDisableAndroidResources ()Z - public fun getDisableViewBinding ()Z - public fun getInheritedDependency ()Z - public fun getMustBeApi ()Z - public fun getOverShotDependency ()Z - public fun getRedundantDependency ()Z - public fun getSortDependencies ()Z - public fun getSortPlugins ()Z - public fun getUnusedDependency ()Z - public fun getUnusedKapt ()Z - public fun getUnusedKotlinAndroidExtensions ()Z - public fun setAnvilFactoryGeneration (Z)V - public fun setDepths (Z)V - public fun setDisableAndroidResources (Z)V - public fun setDisableViewBinding (Z)V - public fun setInheritedDependency (Z)V - public fun setMustBeApi (Z)V - public fun setOverShotDependency (Z)V - public fun setRedundantDependency (Z)V - public fun setSortDependencies (Z)V - public fun setSortPlugins (Z)V - public fun setUnusedDependency (Z)V - public fun setUnusedKapt (Z)V - public fun setUnusedKotlinAndroidExtensions (Z)V -} - -public final class modulecheck/gradle/ChecksExtension_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;)Lmodulecheck/gradle/ChecksExtension_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/ChecksExtension; - public static fun newInstance (Lorg/gradle/api/model/ObjectFactory;)Lmodulecheck/gradle/ChecksExtension; -} - -public final class modulecheck/gradle/GradleMcLogger : modulecheck/reporting/logging/McLogger { - public fun (Lcom/github/ajalt/mordant/terminal/Terminal;)V - public fun failure (Ljava/lang/String;)V - public fun info (Ljava/lang/String;)V - public fun printReport (Lmodulecheck/reporting/logging/Report;)V - public fun success (Ljava/lang/String;)V - public fun warning (Ljava/lang/String;)V -} - -public final class modulecheck/gradle/GradleMcLogger_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;)Lmodulecheck/gradle/GradleMcLogger_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/GradleMcLogger; - public static fun newInstance (Lcom/github/ajalt/mordant/terminal/Terminal;)Lmodulecheck/gradle/GradleMcLogger; -} - -public abstract interface class modulecheck/gradle/GradleMcLogger_McLogger_TaskScope_BindingModule_4e9c3b03 { - public abstract fun bindMcLogger (Lmodulecheck/gradle/GradleMcLogger;)Lmodulecheck/reporting/logging/McLogger; -} - -public class modulecheck/gradle/ModuleCheckExtension : modulecheck/config/ModuleCheckSettings { - public fun (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/file/ProjectLayout;)V - public final fun checks (Lorg/gradle/api/Action;)V - public fun getAdditionalCodeGenerators ()Ljava/util/List; - public fun getAdditionalKaptMatchers ()Ljava/util/List; - public fun getChecks ()Lmodulecheck/config/ChecksSettings; - public fun getDeleteUnused ()Z - public fun getDoNotCheck ()Ljava/util/Set; - public fun getIgnoreUnusedFinding ()Ljava/util/Set; - public synthetic fun getReports ()Lmodulecheck/config/ReportsSettings; - public fun getReports ()Lmodulecheck/gradle/ReportsExtension; - public synthetic fun getSort ()Lmodulecheck/config/SortSettings; - public fun getSort ()Lmodulecheck/gradle/SortExtension; - public fun getTrace ()Z - public final fun reports (Lorg/gradle/api/Action;)V - public fun setAdditionalCodeGenerators (Ljava/util/List;)V - public fun setAdditionalKaptMatchers (Ljava/util/List;)V - public fun setDeleteUnused (Z)V - public fun setDoNotCheck (Ljava/util/Set;)V - public fun setIgnoreUnusedFinding (Ljava/util/Set;)V - public fun setTrace (Z)V - public final fun sort (Lorg/gradle/api/Action;)V -} - -public final class modulecheck/gradle/ModuleCheckExtension_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;Ldagger/internal/Provider;)Lmodulecheck/gradle/ModuleCheckExtension_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/ModuleCheckExtension; - public static fun newInstance (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/file/ProjectLayout;)Lmodulecheck/gradle/ModuleCheckExtension; -} - -public final class modulecheck/gradle/ModuleCheckPlugin : org/gradle/api/Plugin { - public fun ()V - public synthetic fun apply (Ljava/lang/Object;)V - public fun apply (Lorg/gradle/api/Project;)V -} - -public class modulecheck/gradle/PerModuleReportExtension : modulecheck/config/PerModuleReportSettings { - public fun (Lorg/gradle/api/model/ObjectFactory;ZLjava/lang/String;)V - public fun getEnabled ()Z - public fun getOutputDir ()Ljava/lang/String; - public fun setEnabled (Z)V - public fun setOutputDir (Ljava/lang/String;)V -} - -public class modulecheck/gradle/ReportExtension : modulecheck/config/ReportSettings { - public fun (Lorg/gradle/api/model/ObjectFactory;ZLjava/lang/String;)V - public fun getEnabled ()Z - public fun getOutputPath ()Ljava/lang/String; - public fun setEnabled (Z)V - public fun setOutputPath (Ljava/lang/String;)V -} - -public class modulecheck/gradle/ReportsExtension : modulecheck/config/ReportsSettings { - public fun (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/file/ProjectLayout;)V - public final fun checkstyle (Lorg/gradle/api/Action;)V - public final fun depths (Lorg/gradle/api/Action;)V - public synthetic fun getCheckstyle ()Lmodulecheck/config/ReportSettings; - public fun getCheckstyle ()Lmodulecheck/gradle/ReportExtension; - public synthetic fun getDepths ()Lmodulecheck/config/ReportSettings; - public fun getDepths ()Lmodulecheck/gradle/ReportExtension; - public synthetic fun getGraphs ()Lmodulecheck/config/PerModuleReportSettings; - public fun getGraphs ()Lmodulecheck/gradle/PerModuleReportExtension; - public synthetic fun getSarif ()Lmodulecheck/config/ReportSettings; - public fun getSarif ()Lmodulecheck/gradle/ReportExtension; - public synthetic fun getText ()Lmodulecheck/config/ReportSettings; - public fun getText ()Lmodulecheck/gradle/ReportExtension; - public final fun graphs (Lorg/gradle/api/Action;)V - public final fun sarif (Lorg/gradle/api/Action;)V - public final fun text (Lorg/gradle/api/Action;)V -} - -public final class modulecheck/gradle/ReportsExtension_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;Ldagger/internal/Provider;)Lmodulecheck/gradle/ReportsExtension_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/ReportsExtension; - public static fun newInstance (Lorg/gradle/api/model/ObjectFactory;Lorg/gradle/api/file/ProjectLayout;)Lmodulecheck/gradle/ReportsExtension; -} - -public class modulecheck/gradle/SortExtension : modulecheck/config/SortSettings { - public fun (Lorg/gradle/api/model/ObjectFactory;)V - public fun getDependencyComparators ()Ljava/util/List; - public fun getPluginComparators ()Ljava/util/List; - public fun setDependencyComparators (Ljava/util/List;)V - public fun setPluginComparators (Ljava/util/List;)V -} - -public final class modulecheck/gradle/SortExtension_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;)Lmodulecheck/gradle/SortExtension_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/SortExtension; - public static fun newInstance (Lorg/gradle/api/model/ObjectFactory;)Lmodulecheck/gradle/SortExtension; -} - -public final class modulecheck/gradle/internal/GradleProjectProvider : modulecheck/model/dependency/AllProjectPathsProvider, modulecheck/project/ProjectProvider { - public static final field Companion Lmodulecheck/gradle/internal/GradleProjectProvider$Companion; - public fun (Lorg/gradle/api/Project;Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/project/ProjectCache;Lmodulecheck/gradle/GradleMcLogger;Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/parsing/gradle/dsl/BuildFileParser$Factory;Lmodulecheck/parsing/wiring/RealJvmFileProvider$Factory;Lmodulecheck/gradle/platforms/android/AndroidPlatformPluginFactory;Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory;Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;Lmodulecheck/model/dependency/AllProjectPathsProvider;)V - public fun clearCaches ()V - public fun get (Lmodulecheck/model/dependency/ProjectPath;)Lmodulecheck/project/McProject; - public fun getAll ()Ljava/util/List; - public fun getAllPaths ()Ljava/util/List; - public fun getProjectCache ()Lmodulecheck/project/ProjectCache; -} - -public final class modulecheck/gradle/internal/GradleProjectProvider$Companion { -} - -public final class modulecheck/gradle/internal/GradleProjectProvider_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;)Lmodulecheck/gradle/internal/GradleProjectProvider_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/internal/GradleProjectProvider; - public static fun newInstance (Lorg/gradle/api/Project;Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/project/ProjectCache;Lmodulecheck/gradle/GradleMcLogger;Lmodulecheck/gradle/platforms/android/AgpApiAccess;Lmodulecheck/parsing/gradle/dsl/BuildFileParser$Factory;Lmodulecheck/parsing/wiring/RealJvmFileProvider$Factory;Lmodulecheck/gradle/platforms/android/AndroidPlatformPluginFactory;Lmodulecheck/gradle/platforms/JvmPlatformPluginFactory;Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;Lmodulecheck/model/dependency/AllProjectPathsProvider;)Lmodulecheck/gradle/internal/GradleProjectProvider; -} - -public abstract interface class modulecheck/gradle/internal/GradleProjectProvider_ProjectProvider_TaskScope_BindingModule_5a875a70 { - public abstract fun bindProjectProvider (Lmodulecheck/gradle/internal/GradleProjectProvider;)Lmodulecheck/project/ProjectProvider; -} - -public final class modulecheck/gradle/internal/RealDocsWebsiteUrlProvider : modulecheck/dagger/DocsWebsiteUrlProvider { - public fun ()V - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Ljava/lang/String; -} - -public abstract interface class modulecheck/gradle/internal/RealDocsWebsiteUrlProvider_DocsWebsiteUrlProvider_TaskScope_BindingModule_c5ad305f { - public abstract fun bindDocsWebsiteUrlProvider (Lmodulecheck/gradle/internal/RealDocsWebsiteUrlProvider;)Lmodulecheck/dagger/DocsWebsiteUrlProvider; -} - -public final class modulecheck/gradle/internal/RealDocsWebsiteUrlProvider_Factory : dagger/internal/Factory { - public fun ()V - public static fun create ()Lmodulecheck/gradle/internal/RealDocsWebsiteUrlProvider_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/internal/RealDocsWebsiteUrlProvider; - public static fun newInstance ()Lmodulecheck/gradle/internal/RealDocsWebsiteUrlProvider; -} - -public final class modulecheck/gradle/internal/RealModuleCheckVersionProvider : modulecheck/dagger/ModuleCheckVersionProvider { - public fun ()V - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Ljava/lang/String; -} - -public final class modulecheck/gradle/internal/RealModuleCheckVersionProvider_Factory : dagger/internal/Factory { - public fun ()V - public static fun create ()Lmodulecheck/gradle/internal/RealModuleCheckVersionProvider_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/internal/RealModuleCheckVersionProvider; - public static fun newInstance ()Lmodulecheck/gradle/internal/RealModuleCheckVersionProvider; -} - -public abstract interface class modulecheck/gradle/internal/RealModuleCheckVersionProvider_ModuleCheckVersionProvider_TaskScope_BindingModule_2d6f69be { - public abstract fun bindModuleCheckVersionProvider (Lmodulecheck/gradle/internal/RealModuleCheckVersionProvider;)Lmodulecheck/dagger/ModuleCheckVersionProvider; -} - -public final class modulecheck/gradle/internal/RealSourceWebsiteUrlProvider : modulecheck/dagger/SourceWebsiteUrlProvider { - public fun ()V - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Ljava/lang/String; -} - -public final class modulecheck/gradle/internal/RealSourceWebsiteUrlProvider_Factory : dagger/internal/Factory { - public fun ()V - public static fun create ()Lmodulecheck/gradle/internal/RealSourceWebsiteUrlProvider_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/internal/RealSourceWebsiteUrlProvider; - public static fun newInstance ()Lmodulecheck/gradle/internal/RealSourceWebsiteUrlProvider; -} - -public abstract interface class modulecheck/gradle/internal/RealSourceWebsiteUrlProvider_SourceWebsiteUrlProvider_TaskScope_BindingModule_70a21c45 { - public abstract fun bindSourceWebsiteUrlProvider (Lmodulecheck/gradle/internal/RealSourceWebsiteUrlProvider;)Lmodulecheck/dagger/SourceWebsiteUrlProvider; -} - -public abstract class modulecheck/gradle/task/AbstractModuleCheckTask : org/gradle/api/DefaultTask { - public fun (ZZ)V - protected final fun getComponent ()Lmodulecheck/gradle/task/TaskComponent; - public final fun getSettings ()Lmodulecheck/gradle/ModuleCheckExtension; - protected abstract fun ruleFilter ()Lmodulecheck/rule/RuleFilter; - public final fun run ()V -} - -public final class modulecheck/gradle/task/DaggerTaskComponent { - public static fun factory ()Lmodulecheck/gradle/task/TaskComponent$Factory; -} - -public class modulecheck/gradle/task/MultiRuleModuleCheckTask : modulecheck/gradle/task/AbstractModuleCheckTask { - public fun (ZZ)V - protected fun ruleFilter ()Lmodulecheck/rule/RuleFilter; -} - -public final class modulecheck/gradle/task/MultiRuleModuleCheckTask_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;Ldagger/internal/Provider;)Lmodulecheck/gradle/task/MultiRuleModuleCheckTask_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/task/MultiRuleModuleCheckTask; - public static fun newInstance (ZZ)Lmodulecheck/gradle/task/MultiRuleModuleCheckTask; -} - -public class modulecheck/gradle/task/SingleRuleModuleCheckTask : modulecheck/gradle/task/AbstractModuleCheckTask { - public fun (Lmodulecheck/finding/FindingName;ZZ)V - protected fun ruleFilter ()Lmodulecheck/rule/RuleFilter; -} - -public final class modulecheck/gradle/task/SingleRuleModuleCheckTask_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;)Lmodulecheck/gradle/task/SingleRuleModuleCheckTask_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/gradle/task/SingleRuleModuleCheckTask; - public static fun newInstance (Lmodulecheck/finding/FindingName;ZZ)Lmodulecheck/gradle/task/SingleRuleModuleCheckTask; -} - -public abstract interface class modulecheck/gradle/task/TaskComponent : modulecheck/rule/RulesComponent, modulecheck/runtime/RunnerComponent, modulecheck/utils/coroutines/impl/DispatcherProviderComponent { - public abstract fun getProjectProvider ()Lmodulecheck/gradle/internal/GradleProjectProvider; -} - -public abstract interface class modulecheck/gradle/task/TaskComponent$Factory { - public abstract fun create (Lorg/gradle/api/Project;Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/RuleFilter;Lmodulecheck/project/ProjectRoot;)Lmodulecheck/gradle/task/TaskComponent; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser_Factory : dagger/internal/Factory { - public fun ()V - public static fun create ()Lmodulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser; - public static fun newInstance ()Lmodulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;Ldagger/internal/Provider;)Lmodulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser; - public static fun newInstance (Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/model/dependency/ProjectDependency$Factory;)Lmodulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;)Lmodulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser; - public static fun newInstance (Lmodulecheck/reporting/logging/McLogger;)Lmodulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser; -} - -public final class modulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory_Factory : dagger/internal/Factory { - public fun ()V - public static fun create ()Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory; - public static fun newInstance ()Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory; -} - -public final class modulecheck/parsing/psi/KotlinAndroidGradleParser_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;)Lmodulecheck/parsing/psi/KotlinAndroidGradleParser_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/psi/KotlinAndroidGradleParser; - public static fun newInstance (Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;)Lmodulecheck/parsing/psi/KotlinAndroidGradleParser; -} - -public final class modulecheck/parsing/psi/KotlinDependenciesBlockParser_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;Ldagger/internal/Provider;Ldagger/internal/Provider;)Lmodulecheck/parsing/psi/KotlinDependenciesBlockParser_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/psi/KotlinDependenciesBlockParser; - public static fun newInstance (Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;Lmodulecheck/model/dependency/ProjectDependency$Factory;)Lmodulecheck/parsing/psi/KotlinDependenciesBlockParser; -} - -public final class modulecheck/parsing/psi/KotlinPluginsBlockParser_Factory : dagger/internal/Factory { - public fun (Ldagger/internal/Provider;)V - public static fun create (Ldagger/internal/Provider;)Lmodulecheck/parsing/psi/KotlinPluginsBlockParser_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/psi/KotlinPluginsBlockParser; - public static fun newInstance (Lmodulecheck/reporting/logging/McLogger;)Lmodulecheck/parsing/psi/KotlinPluginsBlockParser; -} - diff --git a/modulecheck-gradle/plugin/build.gradle.kts b/modulecheck-gradle/plugin/build.gradle.kts deleted file mode 100644 index b220b97c56..0000000000 --- a/modulecheck-gradle/plugin/build.gradle.kts +++ /dev/null @@ -1,203 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import com.rickbusarow.kgx.dependsOn -import modulecheck.builds.ShardTestTask -import modulecheck.builds.shards.registerYamlShardsTasks - -plugins { - id("mcbuild") - id("com.gradle.plugin-publish") - id("java-gradle-plugin") - idea -} - -val pluginId = "com.rickbusarow.module-check" - -@Suppress("UnstableApiUsage") -val pluginDeclaration: NamedDomainObjectProvider = gradlePlugin.plugins - .register("generateProtos") { - id = pluginId - group = modulecheck.builds.GROUP - displayName = "ModuleCheck" - implementationClass = "modulecheck.gradle.ModuleCheckPlugin" - version = modulecheck.builds.VERSION_NAME - description = "Fast dependency graph validation for gradle" - tags.addAll("kotlin", "dependencies", "android", "gradle-plugin", "kotlin-compiler-plugin") - } - -mcbuild { - published( - artifactId = "modulecheck-gradle-plugin" - ) - publishedPlugin(pluginDeclaration) - dagger() - - buildConfig { - packageName.set("modulecheck.gradle.internal") - field("version") { modulecheck.builds.VERSION_NAME } - field("sourceWebsite") { modulecheck.builds.SOURCE_WEBSITE } - field("docsWebsite") { modulecheck.builds.DOCS_WEBSITE } - } - buildConfig("integrationTest") { - packageName.set("modulecheck.gradle.internal") - field("version") { modulecheck.builds.VERSION_NAME } - field("sourceWebsite") { modulecheck.builds.SOURCE_WEBSITE } - field("docsWebsite") { modulecheck.builds.DOCS_WEBSITE } - } -} - -val main by sourceSets.getting -val test by sourceSets.getting - -val integrationTest by java.sourceSets.registering { - kotlin.apply { - compileClasspath += main.output - .plus(test.output) - .plus(configurations.testRuntimeClasspath.get()) - runtimeClasspath += output + compileClasspath - } -} - -// mark the integrationTest directory as a test directory in the IDE -idea { - module { - integrationTest.configure { - allSource.srcDirs - .forEach { srcDir -> - module.testSources.from(srcDir) - } - } - } -} - -val integrationTestCompile by configurations.registering { - extendsFrom(configurations["testCompileOnly"]) -} -val integrationTestRuntime by configurations.registering { - extendsFrom(configurations["testRuntimeOnly"]) -} - -dependencies { - - api(libs.javax.inject) - api(libs.rickBusarow.dispatch.core) - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-gradle:platforms:api")) - api(project(path = ":modulecheck-gradle:platforms:internal-jvm")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - api(project(path = ":modulecheck-parsing:wiring")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-reporting:logging:api")) - api(project(path = ":modulecheck-rule:api")) - api(project(path = ":modulecheck-runtime:api")) - - compileOnly(gradleApi()) - - compileOnly(libs.agp) - compileOnly(libs.agp.api) - compileOnly(libs.agp.builder.model) - compileOnly(libs.kotlin.gradle.plugin) - compileOnly(libs.kotlin.gradle.plugin.api) - compileOnly(libs.square.anvil.gradle) - - implementation(libs.ajalt.mordant) - implementation(libs.google.dagger.api) - implementation(libs.semVer) - - implementation(project(path = ":modulecheck-config:impl")) - implementation(project(path = ":modulecheck-gradle:platforms:impl")) - implementation(project(path = ":modulecheck-gradle:platforms:internal-android")) - implementation(project(path = ":modulecheck-model:dependency:impl")) - implementation(project(path = ":modulecheck-parsing:gradle:dsl:internal")) - implementation(project(path = ":modulecheck-parsing:gradle:model:impl-typesafe")) - implementation(project(path = ":modulecheck-parsing:kotlin-compiler:impl")) - implementation(project(path = ":modulecheck-parsing:source:api")) - implementation(project(path = ":modulecheck-project:impl")) - implementation(project(path = ":modulecheck-rule:impl")) - implementation(project(path = ":modulecheck-rule:impl-factory")) - implementation(project(path = ":modulecheck-utils:coroutines:impl")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - "integrationTestImplementation"(project(path = ":modulecheck-config:impl")) - "integrationTestImplementation"(project(path = ":modulecheck-gradle:platforms:impl")) - "integrationTestImplementation"(project(path = ":modulecheck-gradle:platforms:internal-android")) - "integrationTestImplementation"(project(path = ":modulecheck-gradle:platforms:internal-jvm")) - "integrationTestImplementation"(project(path = ":modulecheck-internal-testing")) - "integrationTestImplementation"(project(path = ":modulecheck-model:dependency:impl")) - "integrationTestImplementation"(project(path = ":modulecheck-model:sourceset:api")) - "integrationTestImplementation"(project(path = ":modulecheck-parsing:gradle:dsl:internal")) - "integrationTestImplementation"(project(path = ":modulecheck-parsing:gradle:model:impl-typesafe")) - "integrationTestImplementation"(project(path = ":modulecheck-parsing:kotlin-compiler:impl")) - "integrationTestImplementation"(project(path = ":modulecheck-parsing:wiring")) - "integrationTestImplementation"(project(path = ":modulecheck-reporting:logging:api")) - "integrationTestImplementation"(project(path = ":modulecheck-rule:api")) - "integrationTestImplementation"(project(path = ":modulecheck-rule:impl")) - "integrationTestImplementation"(project(path = ":modulecheck-rule:impl-factory")) - "integrationTestImplementation"(project(path = ":modulecheck-utils:coroutines:impl")) - "integrationTestImplementation"(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - - testImplementation(project(path = ":modulecheck-internal-testing")) - testImplementation(project(path = ":modulecheck-project-generation:api")) - testImplementation(project(path = ":modulecheck-utils:stdlib")) -} - -val integrationTestTask = tasks.register("integrationTest", Test::class) { - val integrationTestSourceSet = java.sourceSets["integrationTest"] - testClassesDirs = integrationTestSourceSet.output.classesDirs - classpath = integrationTestSourceSet.runtimeClasspath - dependsOn(":publishToMavenLocalNoDokka") -} - -val shardCount = 6 -(1..shardCount).forEach { - - tasks.register("integrationTestShard$it", ShardTestTask::class) { - shardNumber.set(it) - totalShards.set(shardCount) - testClassesDirs = integrationTest.get().output.classesDirs - classpath = integrationTest.get().runtimeClasspath - doFirst { - setFilter() - } - dependsOn("integrationTestClasses", ":publishToMavenLocalNoDokka") - } -} - -registerYamlShardsTasks( - shardCount = shardCount, - startTagName = "### ", - endTagName = "### ", - taskNamePart = "integrationTest", - yamlFile = rootProject.file(".github/workflows/ci.yml") -) - -tasks.named("check").dependsOn(integrationTestTask) - -kotlin { - val compilations = target.compilations - - compilations.getByName("integrationTest") { - associateWith(compilations.getByName("main")) - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/AndroidBuildConfigAvoidanceTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/AndroidBuildConfigAvoidanceTest.kt deleted file mode 100644 index 89e75b6967..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/AndroidBuildConfigAvoidanceTest.kt +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import io.kotest.matchers.collections.shouldNotContainAnyOf -import org.junit.jupiter.api.TestFactory - -class AndroidBuildConfigAvoidanceTest : BaseGradleTest() { - - @TestFactory - fun `buildConfig task not should be required if not explicitly enabled in android library module`() = - factory { - androidLibrary(":lib", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - defaultConfig { - minSdk = 23 - compileSdk = 33 - targetSdk = 33 - } - namespace = "com.modulecheck.lib1" - } - """ - } - } - - shouldSucceed(":lib:assembleDebug") - - shouldSucceed("moduleCheck").apply { - // Assert that nothing else executed. - // If ModuleCheck is relying upon buildConfig tasks, they'll be in this list. - tasks.map { it.path }.sorted() shouldNotContainAnyOf listOf( - ":lib:generateDebugAndroidTestBuildConfig", - ":lib:generateDebugBuildConfig", - ":lib:generateReleaseBuildConfig" - ) - } - } - - @TestFactory - fun `buildConfig task should not be required when disabled in android library module`() = - factory { - androidLibrary(":lib", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - defaultConfig { - minSdk = 23 - compileSdk = 33 - targetSdk = 33 - } - buildFeatures.buildConfig = false - namespace = "com.modulecheck.lib1" - } - """ - } - } - - shouldSucceed("moduleCheck").apply { - // Assert that nothing else executed. - // If ModuleCheck were relying upon buildConfig tasks, they'd be in this list. - tasks.map { it.path } shouldNotContainAnyOf listOf( - ":lib:generateDebugAndroidTestBuildConfig", - ":lib:generateDebugBuildConfig", - ":lib:generateReleaseBuildConfig" - ) - } - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/AnvilPluginParsingTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/AnvilPluginParsingTest.kt deleted file mode 100644 index d460c57178..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/AnvilPluginParsingTest.kt +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import modulecheck.testing.assertions.replaceOrFail -import org.junit.jupiter.api.TestFactory - -class AnvilPluginParsingTest : BaseGradleTest() { - - @TestFactory - fun `anvil may be added to the root project buildScript classpath`() = factory { - rootBuild { - DEFAULT_BUILD_FILE.replaceOrFail( - """(\s*buildscript\s*\{\s*dependencies\s*\{)(\s*)""".toRegex(), - "$1$2classpath(\"com.squareup.anvil:gradle-plugin:$anvilVersion\")$2" - ) - } - - kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """, - sourceDirName = "kotlin" - ) - } - - shouldSucceed("moduleCheck") - } - - @TestFactory - fun `anvil may be added directly to a subproject only`() = factory { - - kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - id("com.squareup.anvil") version "$anvilVersion" - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """, - sourceDirName = "kotlin" - ) - } - - shouldSucceed("moduleCheck") - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/ConfigValidationTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/ConfigValidationTest.kt deleted file mode 100644 index 1afa426239..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/ConfigValidationTest.kt +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import modulecheck.testing.writeGroovy -import modulecheck.testing.writeKotlin -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test -import kotlin.reflect.full.memberProperties - -class ConfigValidationTest : BaseGradleTest() { - - @Test - fun `all properties`() = test { - - ModuleCheckExtension::class.memberProperties - .map { it.name } shouldBe listOf( - "additionalCodeGenerators", - "additionalKaptMatchers", - "checks", - "deleteUnused", - "doNotCheck", - "ignoreUnusedFinding", - "reports", - "sort", - "trace" - ) - - ChecksExtension::class.memberProperties - .map { it.name } shouldBe listOf( - "anvilFactoryGeneration", - "depths", - "disableAndroidResources", - "disableViewBinding", - "inheritedDependency", - "mustBeApi", - "overShotDependency", - "redundantDependency", - "sortDependencies", - "sortPlugins", - "unusedDependency", - "unusedKapt", - "unusedKotlinAndroidExtensions" - ) - - SortExtension::class.memberProperties - .map { it.name } shouldBe listOf("dependencyComparators", "pluginComparators") - - ReportsExtension::class.memberProperties - .map { it.name } shouldBe listOf("checkstyle", "depths", "graphs", "sarif", "text") - } - - val kotlinConfig = """ - plugins { - id("com.rickbusarow.module-check") - } - - moduleCheck { - - deleteUnused = true // default is false - trace = true // default is false - - checks { - overShotDependency = true // default is true - redundantDependency = false // default is false - unusedDependency = true // default is true - mustBeApi = true // default is true - inheritedDependency = true // default is true - sortDependencies = false // default is false - sortPlugins = false // default is false - unusedKapt = true // default is true - anvilFactoryGeneration = true // default is true - disableAndroidResources = false // default is false - disableViewBinding = false // default is false - unusedKotlinAndroidExtensions = false // default is false - depths = false // default is false - } - - // allow these modules to be declared as dependency anywhere, - // regardless of whether they're used - ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android") - - // do not check the dependencies of these modules. - // in this case, :app could declare any module it wants without issue - doNotCheck = setOf(":app") - - additionalCodeGenerators = listOf( - modulecheck.config.CodeGeneratorBinding.AnnotationProcessor( - name = "My Processor", - generatorMavenCoordinates = "my-project.codegen:processor", - annotationNames = listOf( - "myproject.MyInject", - "myproject.MyInject.Factory", - "myproject.MyInjectParam", - "myproject.MyInjectModule" - ) - ) - ) - - reports { - checkstyle { - enabled = true // default is false - outputPath = "${'$'}{project.buildDir}/reports/modulecheck/checkstyle.xml" - } - sarif { - enabled = true // default is false - outputPath = "${'$'}{project.buildDir}/reports/modulecheck/modulecheck.sarif" - } - depths { - enabled = true // default is false - outputPath = "${'$'}{project.buildDir}/reports/modulecheck/depths.txt" - } - graphs { - enabled = true // default is false - // The root directory of all generated graphs. If set, directories will be created - // for each module, mirroring the structure of the project. If this property is null, - // graphs will be created in the `build/reports/modulecheck/graphs/` relative - // directory of each project. - outputDir = "${'$'}{project.buildDir}/reports/modulecheck/graphs" - } - text { - enabled = true // default is false - outputPath = "${'$'}{project.buildDir}/reports/modulecheck/report.txt" - } - } - } - """.trimIndent() - - @Test - fun `Kotlin configuration`() = test { - - rootBuild.writeKotlin(kotlinConfig) - - shouldSucceed("moduleCheck", withPluginClasspath = true) - } - - val groovyConfig = """ - plugins { - id 'com.rickbusarow.module-check' - } - - moduleCheck { - deleteUnused = true // default is false - trace = true // default is false - - checks { - overShotDependency = true // default is true - redundantDependency = false // default is false - unusedDependency = true // default is true - mustBeApi = true // default is true - inheritedDependency = true // default is true - sortDependencies = false // default is false - sortPlugins = false // default is false - unusedKapt = true // default is true - anvilFactoryGeneration = true // default is true - disableAndroidResources = false // default is false - disableViewBinding = false // default is false - unusedKotlinAndroidExtensions = false // default is false - depths = false // default is false - } - - // allow these modules to be declared as dependency anywhere, - // regardless of whether they're used - ignoreUnusedFinding = [':test:core-jvm', ':test:core-android'] - - // do not check the dependencies of these modules. - // in this case, :app could declare any module it wants without issue - doNotCheck = [':app'] - - additionalCodeGenerators = [ - new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor( - 'My Processor', - 'my-project.codegen:processor', - [ - "myproject.MyInject", - "myproject.MyInject.Factory", - "myproject.MyInjectParam", - "myproject.MyInjectModule" - ] - ) - ] - - reports { - checkstyle { - it.enabled = true // default is false - it.outputPath = "${'$'}{project.buildDir}/reports/modulecheck/checkstyle.xml" - } - sarif { - it.enabled = true // default is false - it.outputPath = "${'$'}{project.buildDir}/reports/modulecheck/modulecheck.sarif" - } - depths { - it.enabled = true // default is false - it.outputPath = "${'$'}{project.buildDir}/reports/modulecheck/depths.txt" - } - graphs { - it.enabled = true // default is false - // The root directory of all generated graphs. If set, directories will be created - // for each module, mirroring the structure of the project. If this property is null, - // graphs will be created in the `build/reports/modulecheck/graphs/` relative - // directory of each project. - it.outputDir = "${'$'}{project.buildDir}/reports/modulecheck/graphs" - } - text { - it.enabled = true // default is false - it.outputPath = "${'$'}{project.buildDir}/reports/modulecheck/report.txt" - } - } - - } - """.trimIndent() - - @Test - fun `Groovy configuration`() = test { - - rootBuild.delete() - val buildFile = root.resolve("build.gradle") - buildFile.writeGroovy(groovyConfig) - - shouldSucceed("moduleCheck", withPluginClasspath = true) - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/DepthReportTaskTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/DepthReportTaskTest.kt deleted file mode 100644 index ddd55ab210..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/DepthReportTaskTest.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test - -internal class DepthReportTaskTest : BaseGradleTest() { - - @Test - fun `depth report should be created if depth task is invoked with default settings`() = test { - - kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - } - - kotlinProject(":lib2") { - buildFile { - """ - plugins { - kotlin("jvm") - } - dependencies { - implementation(project(":lib1")) - } - """ - } - } - - kotlinProject(":app") { - buildFile { - """ - plugins { - kotlin("jvm") - } - dependencies { - implementation(project(":lib1")) - implementation(project(":lib2")) - } - """ - } - } - - shouldSucceed("moduleCheckDepths") - - root.resolve( - "build", - "reports", - "modulecheck", - "depths.txt" - ) shouldHaveText """ - -- ModuleCheck Depth results -- - - :app - source set depth most expensive dependencies - main 2 [:lib2] - - :lib2 - source set depth most expensive dependencies - main 1 [:lib1] - - """ - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/GraphReportTaskTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/GraphReportTaskTest.kt deleted file mode 100644 index f17df41ac7..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/GraphReportTaskTest.kt +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test - -internal class GraphReportTaskTest : BaseGradleTest() { - - @Test - fun `graphs report should be created if graph task is invoked with default settings`() = test { - - kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - } - - kotlinProject(":lib2") { - buildFile { - """ - plugins { - kotlin("jvm") - } - dependencies { - implementation(project(":lib1")) - } - """ - } - } - - val app = kotlinProject(":app") { - buildFile { - """ - plugins { - kotlin("jvm") - } - dependencies { - implementation(project(":lib1")) - implementation(project(":lib2")) - } - """ - } - } - - shouldSucceed("moduleCheckGraphs") - - app.projectDir.resolve( - "build", - "reports", - "modulecheck", - "graphs", - "main.dot" - ) shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":app" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/RuntimeClasspathValidationTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/RuntimeClasspathValidationTest.kt deleted file mode 100644 index b76857b784..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/RuntimeClasspathValidationTest.kt +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import io.kotest.inspectors.forAll -import io.kotest.matchers.string.shouldContain -import modulecheck.gradle.internal.BuildProperties -import modulecheck.utils.remove -import org.junit.jupiter.api.TestFactory - -class RuntimeClasspathValidationTest : BaseGradleTest() { - - @TestFactory - fun `all tasks should succeed without any other libraries in the build classpath`() = factory { - rootBuild.writeText( - """ - plugins { - id("com.rickbusarow.module-check") - } - """ - ) - // This is the same settings as the default used in other tests, - // except no `google()` repository. `google()` shouldn't be necessary since there should be - // no dependency upon AGP. - rootSettings.writeText( - """ - rootProject.name = "root" - - pluginManagement { - repositories { - gradlePluginPortal() - mavenCentral() - mavenLocal() - } - resolutionStrategy { - eachPlugin { - if (requested.id.id.startsWith("com.android")) { - useVersion("$agpVersion") - } - if (requested.id.id == "com.rickbusarow.module-check") { - useVersion("${BuildProperties.version}") - } - if (requested.id.id.startsWith("org.jetbrains.kotlin")) { - useVersion("$kotlinVersion") - } - if (requested.id.id == "com.squareup.anvil") { - useVersion("$anvilVersion") - } - } - } - } - dependencyResolutionManagement { - @Suppress("UnstableApiUsage") - repositories { - mavenCentral() - mavenLocal() - } - } - """.trimIndent() - ) - - // just double-check that this settings file is in sync with the default - rootSettings shouldHaveText DEFAULT_SETTINGS_FILE.remove("\\s*google\\(\\)".toRegex()) - - listOf( - "moduleCheckAuto", - "moduleCheckDepths", - "moduleCheckGraphs", - "moduleCheckSortDependenciesAuto", - "moduleCheckSortPluginsAuto" - ).forAll { taskName -> - shouldSucceed(taskName) - } - } - - @TestFactory - fun `test project should have its own versions for AGP and KGP in classpath`() = factory { - rootBuild.writeText( - """ - plugins { - id("com.android.library") - kotlin("android") - id("com.rickbusarow.module-check") - } - - android { - namespace = "com.modulecheck.lib" - defaultConfig { - minSdkVersion(23) - compileSdkVersion(30) - targetSdkVersion(30) - } - } - - val printClasspath by tasks.registering { - doLast { - project.buildscript - .configurations["classpath"]!! - .allDependencies.forEach { - println("${'$'}{it.group}:${'$'}{it.name}:${'$'}{it.version}") - } - } - } - """ - ) - - shouldSucceed("printClasspath") { - - output shouldContain "com.android.library:com.android.library.gradle.plugin:$agpVersion" - output shouldContain "org.jetbrains.kotlin.android:org.jetbrains.kotlin.android.gradle.plugin:$kotlinVersion" - } - } - - @TestFactory - fun `test project should build with any kotlin version`() = factory { - kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - shouldSucceed("compileKotlin") - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/SortingTaskTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/SortingTaskTest.kt deleted file mode 100644 index 46547f9274..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/SortingTaskTest.kt +++ /dev/null @@ -1,118 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import org.junit.jupiter.api.Test - -internal class SortingTaskTest : BaseGradleTest() { - - @Test - fun `dependency sort task should execute even if disabled in multi rule settings`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation("javax.inject:javax.inject:1") - implementation("com.google.auto:auto-common:1.2.1") - } - """ - } - } - - rootBuild { - """ - buildscript { - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - } - } - - plugins { - id("com.rickbusarow.module-check") - } - - moduleCheck { - checks { - sortDependencies = false - } - } - """ - } - - shouldSucceed("moduleCheckSortDependenciesAuto") - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - } - - dependencies { - implementation("com.google.auto:auto-common:1.2.1") - - implementation("javax.inject:javax.inject:1") - } - """ - } - - @Test - fun `plugin sort task should execute even if disabled in multi rule settings`() = test { - - val lib1 = kotlinProject(":lib1") { - buildFile { - """ - plugins { - base - kotlin("jvm") - } - """ - } - } - - rootBuild { - """ - buildscript { - dependencies { - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - } - } - - plugins { - id("com.rickbusarow.module-check") - } - - moduleCheck { - checks { - sortPlugins = false - } - } - """ - } - - shouldSucceed("moduleCheckSortPluginsAuto") - - lib1.buildFile shouldHaveText """ - plugins { - kotlin("jvm") - base - } - """ - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/TaskLifecycleTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/TaskLifecycleTest.kt deleted file mode 100644 index e8193541f0..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/TaskLifecycleTest.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.gradle.testkit.runner.TaskOutcome.SUCCESS -import org.junit.jupiter.api.TestFactory - -class TaskLifecycleTest : BaseGradleTest() { - - @TestFactory - fun `the modulecheck task should be invoked for the base plugin check task`() = factory { - - kotlinProject(":") { - buildFile { - """ - plugins { - id("com.rickbusarow.module-check") - base - } - """ - } - - projectDir.resolve("settings.gradle.kts").createSafely() - } - - shouldSucceed( - "check", - withPluginClasspath = true - ) { - - task(":moduleCheck")!!.outcome shouldBe SUCCESS - - tasks shouldBe listOf( - task(":moduleCheck"), - task(":check") - ) - } - } - - @TestFactory - fun `the modulecheck task should be invoked for a late, manually created check task`() = factory { - - kotlinProject(":") { - buildFile { - """ - plugins { - id("com.rickbusarow.module-check") - } - - afterEvaluate { - task("check") - } - """ - } - - projectDir.resolve("settings.gradle.kts").createSafely() - } - - shouldSucceed( - "check", - withPluginClasspath = true - ) { - - task(":moduleCheck")!!.outcome shouldBe SUCCESS - - tasks shouldBe listOf( - task(":moduleCheck"), - task(":check") - ) - } - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/TasksValidationTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/TasksValidationTest.kt deleted file mode 100644 index fa2fed0480..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/TasksValidationTest.kt +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import com.rickbusarow.kase.kases -import io.kotest.matchers.string.shouldContain -import io.kotest.matchers.string.shouldNotContain -import org.junit.jupiter.api.Disabled -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestFactory - -class TasksValidationTest : BaseGradleTest() { - @Test - fun `all tasks with descriptions`() = test { - - rootBuild.appendText( - """ - val mcTasks by tasks.registering { - doLast { - val message = tasks - .matching { it.group == "moduleCheck" } - .sortedBy { it.name } - .joinToString("\n") { it.name + " - " + it.description } - - println(message) - } - } - """.trimIndent() - ) - - shouldSucceed( - "mcTasks", - withPluginClasspath = true - ) withTrimmedMessage """ - moduleCheck - runs all enabled ModuleCheck rules - moduleCheckAuto - runs all enabled ModuleCheck rules with auto-correct - moduleCheckDepths - runs the project-depth ModuleCheck rule - moduleCheckGraphs - runs the project-depth ModuleCheck rule - moduleCheckSortDependencies - runs the sort-dependencies ModuleCheck rule - moduleCheckSortDependenciesAuto - runs the sort-dependencies ModuleCheck rule with auto-correct - moduleCheckSortPlugins - runs the sort-plugins ModuleCheck rule - moduleCheckSortPluginsAuto - runs the sort-plugins ModuleCheck rule with auto-correct - """ - } - - @Disabled - @TestFactory - fun `all tasks should ignore configuration caching`() = - kases( - - listOf( - "moduleCheck", - "moduleCheckAuto", - "moduleCheckDepths", - "moduleCheckGraphs", - "moduleCheckSortDependencies", - "moduleCheckSortDependenciesAuto", - "moduleCheckSortPlugins", - "moduleCheckSortPluginsAuto" - ) - ).asContainers { (taskName) -> - params.asTests { - - val calculatingMessage = - when { - gradleVersion >= - "8.5" -> "Calculating task graph as no cached configuration is available for tasks: $taskName" - - else -> "Calculating task graph as no configuration cache is available for tasks: $taskName" - } - - val storedMessage = "Configuration cache entry stored." - val reusedMessage = "Configuration cache entry reused." - - // The first invocation would always succeed, but will generate a cache if caching isn't ignored - shouldSucceed( - taskName, - "--configuration-cache", - withPluginClasspath = true - ).output.clean().let { output -> - output shouldContain calculatingMessage - output shouldContain storedMessage - output shouldNotContain reusedMessage - } - - // The second invocation will fail if a cache exists and caching isn't ignored. - shouldSucceed(taskName, "--configuration-cache").output.clean().let { output -> - output shouldNotContain calculatingMessage - output shouldNotContain storedMessage - output shouldContain reusedMessage - } - } - } -} diff --git a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/UnusedDependenciesPluginTest.kt b/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/UnusedDependenciesPluginTest.kt deleted file mode 100644 index 9d8c736181..0000000000 --- a/modulecheck-gradle/plugin/src/integrationTest/kotlin/modulecheck/gradle/UnusedDependenciesPluginTest.kt +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import modulecheck.model.sourceset.SourceSetName -import org.junit.jupiter.api.TestFactory - -class UnusedDependenciesPluginTest : BaseGradleTest() { - - @TestFactory - fun `module with a declaration used in an android module with kotlin source directory should not be unused`() = - factory { - - androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - namespace = "com.modulecheck.lib1" - defaultConfig { - minSdk = 23 - compileSdk = 32 - } - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """, - sourceDirName = "kotlin" - ) - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - namespace = "com.modulecheck.lib2" - defaultConfig { - minSdk = 23 - compileSdk = 32 - } - } - - dependencies { - api(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """ - ) - } - - shouldSucceed("moduleCheck") - } - - @TestFactory - fun `android test fixtures from android DSL should be treated as test fixtures`() = factory( - exhaustive = true - ) { - - androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - namespace = "com.modulecheck.lib1" - defaultConfig { - minSdk = 23 - compileSdk = 32 - } - testFixtures.enable = true - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """, - SourceSetName.TEST_FIXTURES - ) - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - namespace = "com.modulecheck.lib2" - defaultConfig { - minSdk = 23 - compileSdk = 32 - } - } - - dependencies { - api(testFixtures(project(path = ":lib1"))) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - import com.modulecheck.lib1.Lib1Class - - val lib1Class = Lib1Class() - """ - ) - } - - shouldSucceed("moduleCheck") - } - - @TestFactory - fun `module with generated string resource used in subject module should not be unused`() = - factory { - - androidLibrary(":lib1", "com.modulecheck.lib1") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - namespace = "com.modulecheck.lib1" - defaultConfig { - resValue("string", "app_name", "AppName") - - minSdk = 23 - compileSdk = 32 - } - buildTypes { - getByName("debug") { - resValue("string", "debug_thing", "debug!") - } - } - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class - """ - ) - } - - androidLibrary(":lib2", "com.modulecheck.lib2") { - buildFile { - """ - plugins { - id("com.android.library") - kotlin("android") - } - - android { - namespace = "com.modulecheck.lib2" - defaultConfig { - minSdk = 23 - compileSdk = 32 - } - } - - dependencies { - implementation(project(path = ":lib1")) - } - """ - } - - addKotlinSource( - """ - package com.modulecheck.lib2 - - val lib1Name = R.string.app_name - """ - ) - } - - shouldSucceed("moduleCheck") - } -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/GradleMcLogger.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/GradleMcLogger.kt deleted file mode 100644 index f9c33b72c4..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/GradleMcLogger.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import com.github.ajalt.mordant.rendering.Theme -import com.github.ajalt.mordant.terminal.Terminal -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.parsing.gradle.model.GradleLogging -import modulecheck.reporting.logging.McLogger -import modulecheck.reporting.logging.Report -import modulecheck.reporting.logging.Report.ReportEntry.Failure -import modulecheck.reporting.logging.Report.ReportEntry.Info -import modulecheck.reporting.logging.Report.ReportEntry.Success -import modulecheck.reporting.logging.Report.ReportEntry.Warning -import org.gradle.api.logging.Logger -import javax.inject.Inject - -@ContributesBinding(TaskScope::class) -class GradleMcLogger @Inject constructor( - private val terminal: Terminal -) : McLogger { - - private val logger: Logger by lazy { GradleLogging.getLogger("ktlint logger Gradle") } - - private val theme: Theme by lazy { terminal.theme } - - override fun printReport(report: Report) { - report.entries - .forEach { reportEntry -> - when (reportEntry) { - is Failure -> failure(reportEntry.message) - is Info -> info(reportEntry.message) - is Success -> success(reportEntry.message) - is Warning -> warning(reportEntry.message) - } - } - } - - override fun warning(message: String) { - logger.lifecycle(theme.warning(message)) - } - - override fun info(message: String) { - logger.lifecycle(theme.info(message)) - } - - override fun failure(message: String) { - logger.lifecycle(theme.danger(message)) - } - - override fun success(message: String) { - logger.lifecycle(theme.success(message)) - } -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/ModuleCheckExtension.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/ModuleCheckExtension.kt deleted file mode 100644 index 90d22b048a..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/ModuleCheckExtension.kt +++ /dev/null @@ -1,327 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("DEPRECATION", "unused") - -package modulecheck.gradle - -import modulecheck.api.KaptMatcher -import modulecheck.config.ChecksSettings -import modulecheck.config.ChecksSettings.Companion.ANVIL_FACTORY_GENERATION_DEFAULT -import modulecheck.config.ChecksSettings.Companion.DEPTHS_DEFAULT -import modulecheck.config.ChecksSettings.Companion.DISABLE_ANDROID_RESOURCES_DEFAULT -import modulecheck.config.ChecksSettings.Companion.DISABLE_VIEW_BINDING_DEFAULT -import modulecheck.config.ChecksSettings.Companion.INHERITED_DEPENDENCY_DEFAULT -import modulecheck.config.ChecksSettings.Companion.MUST_BE_API_DEFAULT -import modulecheck.config.ChecksSettings.Companion.OVERSHOT_DEPENDENCY_DEFAULT -import modulecheck.config.ChecksSettings.Companion.REDUNDANT_DEPENDENCY_DEFAULT -import modulecheck.config.ChecksSettings.Companion.SORT_DEPENDENCIES_DEFAULT -import modulecheck.config.ChecksSettings.Companion.SORT_PLUGINS_DEFAULT -import modulecheck.config.ChecksSettings.Companion.UNUSED_DEPENDENCY_DEFAULT -import modulecheck.config.ChecksSettings.Companion.UNUSED_KAPT_DEFAULT -import modulecheck.config.ChecksSettings.Companion.UNUSED_KOTLIN_ANDROID_EXTENSIONS_DEFAULT -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.ModuleCheckSettings -import modulecheck.config.PerModuleReportSettings -import modulecheck.config.ReportSettings -import modulecheck.config.ReportsSettings -import modulecheck.config.ReportsSettings.Companion.CHECKSTYLE_ENABLED_DEFAULT -import modulecheck.config.ReportsSettings.Companion.CHECKSTYLE_PATH_DEFAULT -import modulecheck.config.ReportsSettings.Companion.DEPTHS_ENABLED_DEFAULT -import modulecheck.config.ReportsSettings.Companion.DEPTHS_PATH_DEFAULT -import modulecheck.config.ReportsSettings.Companion.GRAPH_ENABLED_DEFAULT -import modulecheck.config.ReportsSettings.Companion.SARIF_ENABLED_DEFAULT -import modulecheck.config.ReportsSettings.Companion.SARIF_PATH_DEFAULT -import modulecheck.config.ReportsSettings.Companion.TEXT_ENABLED_DEFAULT -import modulecheck.config.ReportsSettings.Companion.TEXT_PATH_DEFAULT -import modulecheck.config.SortSettings -import modulecheck.config.SortSettings.Companion.DEPENDENCY_COMPARATORS_DEFAULT -import modulecheck.config.SortSettings.Companion.PLUGIN_COMPARATORS_DEFAULT -import modulecheck.gradle.internal.listProperty -import modulecheck.gradle.internal.nullableProperty -import modulecheck.gradle.internal.property -import modulecheck.gradle.internal.setProperty -import org.gradle.api.Action -import org.gradle.api.file.ProjectLayout -import org.gradle.api.model.ObjectFactory -import javax.inject.Inject - -open class ModuleCheckExtension @Inject constructor( - objects: ObjectFactory, - projectLayout: ProjectLayout -) : ModuleCheckSettings { - - /** - * If true, ModuleCheck will delete declarations of unused dependencies entirely. - * - * If false, ModuleCheck will comment out declarations of unused dependencies. - * - * Default value is false. - * - * @since 0.12.0 - */ - override var deleteUnused: Boolean by objects.property(false) - - /** - * If true, ModuleCheck will collect a trace of expensive and delicate - * operations. This trace is added to any thrown exceptions. Tracing - * is disabled by default, as it does incur a performance penalty. - * - * Default value is false - * - * @since 0.12.0 - */ - override var trace: Boolean by objects.property(false) - - /** - * Set of modules which are allowed to be unused. - * - * For instance, given: - * - * ``` - * ignoreUnusedFinding = setOf(":core") - * ``` - * - * If a module declares `:core` as a dependency but does not use it, no finding will be reported. - * - * @since 0.12.0 - */ - override var ignoreUnusedFinding: Set by objects.setProperty() - - /** - * Set of modules which will not be excluded from error reporting. The most common use-case - * would be if the module is the root of a dependency graph, like an Android application - * module, and it needs everything in its classpath for dependency injection purposes. - * - * @since 0.12.0 - */ - override var doNotCheck: Set by objects.setProperty() - - /** - * List of [KaptMatcher]'s to be checked, which aren't included by default with ModuleCheck. - * - * @since 0.12.0 - */ - @Suppress("DEPRECATION") - @Deprecated("use additionalCodeGenerators instead") - override var additionalKaptMatchers: List by objects.listProperty() - - /** - * List of [CodeGeneratorBinding]'s to be checked, - * which aren't included by default with ModuleCheck. - * - * @since 0.12.0 - */ - override var additionalCodeGenerators: List by objects.listProperty() - - override val checks: ChecksSettings = ChecksExtension(objects) - fun checks(action: Action) { - action.execute(checks) - } - - override val sort: SortExtension = SortExtension(objects) - fun sort(action: Action) { - action.execute(sort) - } - - /** - * Configures reporting options - * - * @since 0.12.0 - */ - override val reports: ReportsExtension = ReportsExtension(objects, projectLayout) - - /** - * Configures reporting options - * - * @since 0.12.0 - */ - fun reports(action: Action) { - action.execute(reports) - } -} - -open class ChecksExtension @Inject constructor( - objects: ObjectFactory -) : ChecksSettings { - override var redundantDependency: Boolean by objects.property(REDUNDANT_DEPENDENCY_DEFAULT) - override var unusedDependency: Boolean by objects.property(UNUSED_DEPENDENCY_DEFAULT) - override var overShotDependency: Boolean by objects.property(OVERSHOT_DEPENDENCY_DEFAULT) - override var mustBeApi: Boolean by objects.property(MUST_BE_API_DEFAULT) - override var inheritedDependency: Boolean by objects.property(INHERITED_DEPENDENCY_DEFAULT) - override var sortDependencies: Boolean by objects.property(SORT_DEPENDENCIES_DEFAULT) - override var sortPlugins: Boolean by objects.property(SORT_PLUGINS_DEFAULT) - override var unusedKapt: Boolean by objects.property(UNUSED_KAPT_DEFAULT) - override var anvilFactoryGeneration: Boolean by objects.property(ANVIL_FACTORY_GENERATION_DEFAULT) - override var disableAndroidResources: Boolean by objects.property( - DISABLE_ANDROID_RESOURCES_DEFAULT - ) - override var disableViewBinding: Boolean by objects.property(DISABLE_VIEW_BINDING_DEFAULT) - override var unusedKotlinAndroidExtensions: Boolean by objects.property( - UNUSED_KOTLIN_ANDROID_EXTENSIONS_DEFAULT - ) - override var depths: Boolean by objects.property(DEPTHS_DEFAULT) -} - -open class SortExtension @Inject constructor( - objects: ObjectFactory -) : SortSettings { - override var pluginComparators: List by objects - .listProperty(PLUGIN_COMPARATORS_DEFAULT) - - override var dependencyComparators: List by objects - .listProperty(DEPENDENCY_COMPARATORS_DEFAULT) -} - -open class ReportsExtension @Inject constructor( - objects: ObjectFactory, - projectLayout: ProjectLayout -) : ReportsSettings { - - /** - * checkstyle-formatted xml report - * - * @since 0.12.0 - */ - override val checkstyle: ReportExtension = ReportExtension( - objects = objects, - enabledDefault = CHECKSTYLE_ENABLED_DEFAULT, - outputPath = projectLayout.projectDirectory.dir(CHECKSTYLE_PATH_DEFAULT).toString() - ) - - /** - * checkstyle-formatted xml report - * - * @since 0.12.0 - */ - fun checkstyle(action: Action) { - action.execute(checkstyle) - } - - /** - * SARIF-formatted report - * - * @since 0.12.0 - */ - override val sarif: ReportExtension = ReportExtension( - objects = objects, - enabledDefault = SARIF_ENABLED_DEFAULT, - outputPath = projectLayout.projectDirectory.dir(SARIF_PATH_DEFAULT).toString() - ) - - /** - * SARIF-formatted report - * - * @since 0.12.0 - */ - fun sarif(action: Action) { - action.execute(sarif) - } - - /** - * plain-text report file matching the console output - * - * @since 0.12.0 - */ - override val text: ReportExtension = ReportExtension( - objects = objects, - enabledDefault = TEXT_ENABLED_DEFAULT, - outputPath = projectLayout.projectDirectory.dir(TEXT_PATH_DEFAULT).toString() - ) - - /** - * plain-text report file matching the console output - * - * @since 0.12.0 - */ - fun text(action: Action) { - action.execute(text) - } - - /** - * report of the depth for each source set for each module - * - * @since 0.12.0 - */ - override val depths: ReportExtension = ReportExtension( - objects = objects, - enabledDefault = DEPTHS_ENABLED_DEFAULT, - outputPath = projectLayout.projectDirectory.dir(DEPTHS_PATH_DEFAULT).toString() - ) - - /** - * report of the depth for each source set for each module - * - * @since 0.12.0 - */ - fun depths(action: Action) { - action.execute(depths) - } - - /** - * create dependency graphs for each source set for each module - * - * @since 0.12.0 - */ - override val graphs: PerModuleReportExtension = PerModuleReportExtension( - objects = objects, - enabledDefault = GRAPH_ENABLED_DEFAULT, - outputDir = null - ) - - /** - * create dependency graphs for each source set for each module - * - * @since 0.12.0 - */ - fun graphs(action: Action) { - action.execute(graphs) - } -} - -open class ReportExtension( - objects: ObjectFactory, - enabledDefault: Boolean, - outputPath: String -) : ReportSettings { - - override var enabled: Boolean by objects.property(enabledDefault) - - /** - * Path for the generated file, relative to the project root. - * - * @since 0.12.0 - */ - override var outputPath: String by objects.property(outputPath) -} - -open class PerModuleReportExtension( - objects: ObjectFactory, - enabledDefault: Boolean, - outputDir: String? -) : PerModuleReportSettings { - - override var enabled: Boolean by objects.property(enabledDefault) - - /** - * Path to the root directory of the generated files, relative to the project root. - * - * If this is null, then reports will be created in - * `$projectDir/build/reports/modulecheck/graphs/`. - * - * @since 0.12.0 - */ - override var outputDir: String? by objects.nullableProperty(outputDir) -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/ModuleCheckPlugin.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/ModuleCheckPlugin.kt deleted file mode 100644 index df08de98d0..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/ModuleCheckPlugin.kt +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import modulecheck.finding.FindingName -import modulecheck.gradle.platforms.android.AgpApiAccess -import modulecheck.gradle.platforms.android.internal.generatesBuildConfig -import modulecheck.gradle.platforms.android.internal.isMissingManifestFile -import modulecheck.gradle.task.MultiRuleModuleCheckTask -import modulecheck.gradle.task.SingleRuleModuleCheckTask -import modulecheck.parsing.gradle.model.GradleProject -import org.gradle.api.Plugin -import org.gradle.api.tasks.TaskProvider -import org.gradle.language.base.plugins.LifecycleBasePlugin - -class ModuleCheckPlugin : Plugin { - - override fun apply(target: GradleProject) { - val settings = target.extensions - .create("moduleCheck", ModuleCheckExtension::class.java) - - val gradleVersion = target.gradle.gradleVersion.split('.') - .let { segments -> - // Gradle doesn't use semantic versioning, so for instance `7.4` is "7.4" and not "7.4.0". - // Fortunately `7.0` was "7.0" and not "7". - val major = segments[0] - val minor = segments.getOrElse(1) { "0" } - "$major.$minor" - } - - val disableConfigCache = gradleVersion >= "7.4" - - val agpApiAccess = AgpApiAccess() - - target.registerTasks( - name = "moduleCheckSortDependencies", - findingName = FindingName("sort-dependencies"), - includeAuto = true, - disableConfigCache = disableConfigCache, - agpApiAccess = agpApiAccess - ) - target.registerTasks( - name = "moduleCheckSortPlugins", - findingName = FindingName("sort-plugins"), - includeAuto = true, - disableConfigCache = disableConfigCache, - agpApiAccess = agpApiAccess - ) - target.registerTasks( - name = "moduleCheckDepths", - findingName = FindingName("project-depth"), - includeAuto = false, - disableConfigCache = disableConfigCache, - agpApiAccess = agpApiAccess, - doFirstAction = { - settings.checks.depths = true - settings.reports.depths.enabled = true - } - ) - target.registerTasks( - name = "moduleCheckGraphs", - findingName = FindingName("project-depth"), - includeAuto = false, - disableConfigCache = disableConfigCache, - agpApiAccess = agpApiAccess, - doFirstAction = { - settings.reports.graphs.enabled = true - } - ) - target.registerTasks( - name = "moduleCheck", - findingName = null, - includeAuto = true, - disableConfigCache = disableConfigCache, - agpApiAccess = agpApiAccess - ) - - target.tasks - .matching { it.name == LifecycleBasePlugin.CHECK_TASK_NAME } - .configureEach { - it.dependsOn("moduleCheck") - } - } - - private fun GradleProject.registerTasks( - name: String, - findingName: FindingName?, - includeAuto: Boolean, - disableConfigCache: Boolean, - agpApiAccess: AgpApiAccess, - doFirstAction: (() -> Unit)? = null - ) { - - fun TaskProvider<*>.maybeAddDependencies() { - configure { mcTask -> - allprojects - .filter { it.isMissingManifestFile(agpApiAccess) } - .flatMap { - it.tasks.withType( - com.android.build.gradle.tasks.ManifestProcessorTask::class.java - ) - } - .forEach { mcTask.dependsOn(it) } - - allprojects - .filter { it.generatesBuildConfig(agpApiAccess) } - .flatMap { - it.tasks.withType( - com.android.build.gradle.tasks.GenerateBuildConfig::class.java - ) - } - .forEach { mcTask.dependsOn(it) } - } - } - - val tasks = if (findingName != null) { - listOfNotNull( - tasks.register( - name, - SingleRuleModuleCheckTask::class.java, - findingName, - false, - disableConfigCache - ), - if (includeAuto) { - tasks.register( - "${name}Auto", - SingleRuleModuleCheckTask::class.java, - findingName, - true, - disableConfigCache - ) - } else { - null - } - ) - } else { - listOfNotNull( - tasks.register(name, MultiRuleModuleCheckTask::class.java, false, disableConfigCache), - if (includeAuto) { - tasks.register( - "${name}Auto", - MultiRuleModuleCheckTask::class.java, - true, - disableConfigCache - ) - } else { - null - } - ) - } - - tasks.forEach { taskProvider -> - if (doFirstAction != null) { - taskProvider.configure { task -> - task.doFirst { doFirstAction() } - } - } - - taskProvider.maybeAddDependencies() - } - } -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/GradleProjectProvider.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/GradleProjectProvider.kt deleted file mode 100644 index 4b3e580a15..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/GradleProjectProvider.kt +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.internal - -import com.squareup.anvil.annotations.ContributesBinding -import com.squareup.anvil.plugin.AnvilExtension -import modulecheck.config.ModuleCheckSettings -import modulecheck.dagger.RootGradleProject -import modulecheck.dagger.TaskScope -import modulecheck.gradle.GradleMcLogger -import modulecheck.gradle.platforms.JvmPlatformPluginFactory -import modulecheck.gradle.platforms.android.AgpApiAccess -import modulecheck.gradle.platforms.android.AndroidPlatformPluginFactory -import modulecheck.gradle.platforms.sourcesets.jvmTarget -import modulecheck.model.dependency.AllProjectPathsProvider -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath -import modulecheck.model.dependency.TypeSafeProjectPathResolver -import modulecheck.parsing.gradle.dsl.BuildFileParser -import modulecheck.parsing.gradle.model.GradleProject -import modulecheck.parsing.source.AnvilGradlePlugin -import modulecheck.parsing.wiring.RealJvmFileProvider -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.ProjectProvider -import modulecheck.project.impl.RealMcProject -import modulecheck.rule.impl.KAPT_PLUGIN_ID -import net.swiftzer.semver.SemVer -import javax.inject.Inject - -@ContributesBinding(TaskScope::class, ProjectProvider::class) -class GradleProjectProvider @Inject constructor( - @RootGradleProject - private val rootGradleProject: GradleProject, - private val settings: ModuleCheckSettings, - override val projectCache: ProjectCache, - private val gradleLogger: GradleMcLogger, - private val agpApiAccess: AgpApiAccess, - private val buildFileParserFactory: BuildFileParser.Factory, - private val jvmFileProviderFactory: RealJvmFileProvider.Factory, - private val androidPlatformPluginFactory: AndroidPlatformPluginFactory, - private val jvmPlatformPluginFactory: JvmPlatformPluginFactory, - private val typeSafeProjectPathResolver: TypeSafeProjectPathResolver, - private val allProjectPathsProviderDelegate: AllProjectPathsProvider -) : ProjectProvider, AllProjectPathsProvider by allProjectPathsProviderDelegate { - - private val gradleProjects = rootGradleProject.allprojects - .associateBy { StringProjectPath(it.path) } - - override fun get(path: ProjectPath): McProject { - return projectCache.getOrPut(path) { - - when (path) { - is StringProjectPath -> createProject(path) - is TypeSafeProjectPath -> createProject( - typeSafeProjectPathResolver.resolveStringProjectPath(path) - ) - } - } - } - - override fun getAll(): List { - return rootGradleProject.allprojects - .filter { it.buildFile.exists() } - .filterNot { it.path in settings.doNotCheck } - .map { get(StringProjectPath(it.path)) } - } - - override fun getAllPaths(): List { - return allProjectPathsProviderDelegate.getAllPaths() - } - - override fun clearCaches() { - projectCache.clearContexts() - } - - private fun createProject(path: StringProjectPath): McProject { - val gradleProject = gradleProjects.getValue(path) - - val hasKapt = gradleProject - .pluginManager - .hasPlugin(KAPT_PLUGIN_ID) - - val hasTestFixturesPlugin = gradleProject - .pluginManager - .hasPlugin(TEST_FIXTURES_PLUGIN_ID) - - val platformPlugin = agpApiAccess.ifSafeOrNull(gradleProject) { - - androidPlatformPluginFactory.create( - hasTestFixturesPlugin = hasTestFixturesPlugin - ) - } ?: jvmPlatformPluginFactory.create( - gradleProject = gradleProject, - hasTestFixturesPlugin = hasTestFixturesPlugin - ) - - return RealMcProject( - projectPath = path, - projectDir = gradleProject.projectDir, - buildFile = gradleProject.buildFile, - hasKapt = hasKapt, - hasTestFixturesPlugin = hasTestFixturesPlugin, - projectCache = projectCache, - anvilGradlePlugin = gradleProject.anvilGradlePluginOrNull(), - logger = gradleLogger, - jvmFileProviderFactory = jvmFileProviderFactory, - jvmTarget = gradleProject.jvmTarget(), - buildFileParserFactory = buildFileParserFactory, - platformPlugin = platformPlugin - ) - } - - private fun GradleProject.anvilGradlePluginOrNull(): AnvilGradlePlugin? { - /* - Before Kotlin 1.5.0, Anvil was applied to the `kotlinCompilerPluginClasspath` config. - - In 1.5.0+, it's applied to individual source sets, such as - `kotlinCompilerPluginClasspathMain`, `kotlinCompilerPluginClasspathTest`, etc. - */ - val version = configurations - .asSequence() - .filter { it.name.startsWith("kotlinCompilerPluginClasspath") } - .flatMap { it.dependencies } - .firstOrNull { it.group == "com.squareup.anvil" } - ?.version - ?.let { versionString -> SemVer.parse(versionString) } - ?: return null - - // TODO This is something of a band-aid, because it means that if the plugin is only applied to - // a sub-project, it won't be parsed at all. Anvil should probably be shaded, unless/until - // classpath isolation with the Worker API is working. - @Suppress("SwallowedException") - val enabled = try { - extensions.findByType(AnvilExtension::class.java) - ?.generateDaggerFactories - ?.get() == true - } catch (e: NoClassDefFoundError) { - return null - } - - return AnvilGradlePlugin(version, enabled) - } - - companion object { - private const val TEST_FIXTURES_PLUGIN_ID = "java-test-fixtures" - } -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/PropertyDelegates.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/PropertyDelegates.kt deleted file mode 100644 index 9504760fcc..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/PropertyDelegates.kt +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.internal - -import org.gradle.api.model.ObjectFactory -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -internal inline fun ObjectFactory.setProperty( - initialValue: Set = emptySet() -): ReadWriteProperty> = object : ReadWriteProperty> { - - val delegate = setProperty(T::class.java).convention(initialValue) - - override fun getValue(thisRef: Any, property: KProperty<*>): Set { - return delegate.get() - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: Set) { - delegate.set(value) - } -} - -internal inline fun ObjectFactory.listProperty( - initialValue: List = emptyList() -): ReadWriteProperty> = object : ReadWriteProperty> { - - val delegate = listProperty(T::class.java).convention(initialValue) - - override fun getValue(thisRef: Any, property: KProperty<*>): List { - return delegate.get() - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: List) { - delegate.set(value) - } -} - -internal inline fun ObjectFactory.property( - initialValue: T -): ReadWriteProperty = object : ReadWriteProperty { - - val delegate = property(T::class.java).convention(initialValue) - - override fun getValue(thisRef: Any, property: KProperty<*>): T { - return delegate.get() - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: T) { - delegate.set(value) - } -} - -internal inline fun ObjectFactory.nullableProperty( - initialValue: T? -): ReadWriteProperty = object : ReadWriteProperty { - - val delegate = property(T::class.java).convention(initialValue) - - override fun getValue(thisRef: Any, property: KProperty<*>): T? { - return delegate.orNull - } - - override fun setValue(thisRef: Any, property: KProperty<*>, value: T?) { - delegate.set(value) - } -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/RealDocsWebsiteUrlProvider.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/RealDocsWebsiteUrlProvider.kt deleted file mode 100644 index f65020adb9..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/internal/RealDocsWebsiteUrlProvider.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.internal - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.DocsWebsiteUrlProvider -import modulecheck.dagger.ModuleCheckVersionProvider -import modulecheck.dagger.SourceWebsiteUrlProvider -import modulecheck.dagger.TaskScope -import javax.inject.Inject - -@ContributesBinding(TaskScope::class) -class RealDocsWebsiteUrlProvider @Inject constructor() : DocsWebsiteUrlProvider { - override fun get(): String = BuildProperties.docsWebsite -} - -@ContributesBinding(TaskScope::class) -class RealSourceWebsiteUrlProvider @Inject constructor() : SourceWebsiteUrlProvider { - override fun get(): String = BuildProperties.sourceWebsite -} - -@ContributesBinding(TaskScope::class) -class RealModuleCheckVersionProvider @Inject constructor() : ModuleCheckVersionProvider { - override fun get(): String = BuildProperties.version -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/task/AbstractModuleCheckTask.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/task/AbstractModuleCheckTask.kt deleted file mode 100644 index e82d030c79..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/task/AbstractModuleCheckTask.kt +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.task - -import kotlinx.coroutines.cancel -import modulecheck.finding.FindingName -import modulecheck.gradle.ModuleCheckExtension -import modulecheck.rule.RuleFilter -import modulecheck.utils.cast -import modulecheck.utils.coroutines.impl.DispatcherProviderComponent -import org.gradle.api.DefaultTask -import org.gradle.api.GradleException -import org.gradle.api.tasks.Input -import org.gradle.api.tasks.Internal -import org.gradle.api.tasks.TaskAction -import javax.inject.Inject - -abstract class AbstractModuleCheckTask( - private val autoCorrect: Boolean, - disableConfigCache: Boolean -) : DefaultTask() { - - init { - group = "moduleCheck" - - if (disableConfigCache) { - // If the runtime Gradle distro is 7.4+, disable configuration caching. - // This function was introduced in 7.4. - @Suppress("LeakingThis") - notCompatibleWithConfigurationCache("Not supported yet") - } - } - - protected abstract fun ruleFilter(): RuleFilter - - @get:Input - val settings: ModuleCheckExtension = project.extensions - .getByType(ModuleCheckExtension::class.java) - - @get:Internal - protected val component: TaskComponent by lazy { - DaggerTaskComponent.factory() - .create( - rootProject = project, - moduleCheckSettings = settings, - ruleFilter = ruleFilter(), - projectRoot = { project.rootDir } - ) - } - - @TaskAction - fun run() { - try { - - val projectProvider = component.projectProvider - val runner = component.runnerFactory.create(autoCorrect) - - val projects = projectProvider.getAll() - - val result = runner.run(projects) - - result.exceptionOrNull() - ?.let { - @Suppress("UnsafeCallOnNullableType") - throw GradleException(it.message!!, it) - } - } finally { - - val dispatcherProvider = component.cast() - .dispatcherProvider - - dispatcherProvider.default.cancel() - dispatcherProvider.io.cancel() - } - } -} - -open class MultiRuleModuleCheckTask @Inject constructor( - autoCorrect: Boolean, - disableConfigCache: Boolean -) : AbstractModuleCheckTask(autoCorrect, disableConfigCache) { - - init { - description = if (autoCorrect) { - "runs all enabled ModuleCheck rules with auto-correct" - } else { - "runs all enabled ModuleCheck rules" - } - } - - override fun ruleFilter(): RuleFilter = RuleFilter.DEFAULT -} - -open class SingleRuleModuleCheckTask @Inject constructor( - private val findingName: FindingName, - autoCorrect: Boolean, - disableConfigCache: Boolean -) : AbstractModuleCheckTask(autoCorrect, disableConfigCache) { - - init { - description = if (autoCorrect) { - "runs the ${findingName.id} ModuleCheck rule with auto-correct" - } else { - "runs the ${findingName.id} ModuleCheck rule" - } - } - - override fun ruleFilter(): RuleFilter = RuleFilter { rule, _ -> - rule.name == findingName - } -} diff --git a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/task/TaskComponent.kt b/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/task/TaskComponent.kt deleted file mode 100644 index df9a80a276..0000000000 --- a/modulecheck-gradle/plugin/src/main/kotlin/modulecheck/gradle/task/TaskComponent.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle.task - -import com.squareup.anvil.annotations.MergeComponent -import dagger.BindsInstance -import dagger.Component -import modulecheck.config.ModuleCheckSettings -import modulecheck.dagger.RootGradleProject -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import modulecheck.gradle.internal.GradleProjectProvider -import modulecheck.parsing.gradle.model.GradleProject -import modulecheck.project.ProjectRoot -import modulecheck.rule.RuleFilter -import modulecheck.rule.RulesComponent -import modulecheck.runtime.RunnerComponent - -@SingleIn(TaskScope::class) -@MergeComponent(TaskScope::class) -interface TaskComponent : RunnerComponent, RulesComponent { - - val projectProvider: GradleProjectProvider - - @Component.Factory - interface Factory { - /** - * @param rootProject the root (`:`) rootProject - * @param moduleCheckSettings settings... - * @param ruleFilter this lets the tasks define which rule(s) they're going to apply - * @param projectRoot the root directory for the rootProject. - * This is the same as calling `rootProject.rootDir`. - * @since 0.12.0 - */ - fun create( - @RootGradleProject - @BindsInstance - rootProject: GradleProject, - @BindsInstance - moduleCheckSettings: ModuleCheckSettings, - @BindsInstance - ruleFilter: RuleFilter, - @BindsInstance - projectRoot: ProjectRoot - ): TaskComponent - } -} diff --git a/modulecheck-gradle/plugin/src/test/kotlin/modulecheck/gradle/BaseGradleTest.kt b/modulecheck-gradle/plugin/src/test/kotlin/modulecheck/gradle/BaseGradleTest.kt deleted file mode 100644 index ddfedd1ed2..0000000000 --- a/modulecheck-gradle/plugin/src/test/kotlin/modulecheck/gradle/BaseGradleTest.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import com.rickbusarow.kase.HasKaseMatrix -import com.rickbusarow.kase.HasParams -import com.rickbusarow.kase.asClueCatching -import com.rickbusarow.kase.files.TestLocation -import kotlinx.coroutines.runBlocking -import modulecheck.testing.McTestVersions -import modulecheck.testing.McVersionMatrix -import modulecheck.testing.VersionsFactoryTest -import modulecheck.testing.assertions.TrimmedAsserts -import org.junit.jupiter.api.parallel.Execution -import org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD -import org.junit.jupiter.api.parallel.ResourceLock - -@Suppress("UnnecessaryAbstractClass") -@ResourceLock("Gradle") -@Execution(SAME_THREAD) -abstract class BaseGradleTest( - final override val kaseMatrix: McVersionMatrix = McVersionMatrix() -) : VersionsFactoryTest, - HasParams, - TrimmedAsserts, - HasKaseMatrix { - - override val params: List by lazy { versions() } - - override val testEnvironmentFactory = McGradleTestEnvironmentFactory() - - /** shorthand for executing a test in a hermetic TestEnvironment but without any kase parameters */ - fun test( - testLocation: TestLocation = TestLocation.get(), - testAction: suspend McGradleTestEnvironment.() -> Unit - ) { - val testEnvironment = testEnvironmentFactory.create( - params = params.last(), - names = emptyList(), - location = testLocation - ) - - runBlocking { - testEnvironment.asClueCatching { - testEnvironment.testAction() - println(testEnvironment) - } - } - } -} diff --git a/modulecheck-gradle/plugin/src/test/kotlin/modulecheck/gradle/McGradleTestEnvironment.kt b/modulecheck-gradle/plugin/src/test/kotlin/modulecheck/gradle/McGradleTestEnvironment.kt deleted file mode 100644 index c04f6ca981..0000000000 --- a/modulecheck-gradle/plugin/src/test/kotlin/modulecheck/gradle/McGradleTestEnvironment.kt +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.gradle - -import com.rickbusarow.kase.ParamTestEnvironmentFactory -import com.rickbusarow.kase.files.TestLocation -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.internal.defaultCodeGeneratorBindings -import modulecheck.gradle.internal.BuildProperties -import modulecheck.parsing.kotlin.compiler.impl.DependencyModuleDescriptorAccess -import modulecheck.project.ProjectCache -import modulecheck.project.generation.ProjectCollector -import modulecheck.testing.HasTestVersions -import modulecheck.testing.McTestVersions -import modulecheck.testing.TestEnvironment -import modulecheck.testing.clean -import modulecheck.utils.createSafely -import modulecheck.utils.letIf -import modulecheck.utils.remove -import modulecheck.utils.resolve -import org.gradle.testkit.runner.BuildResult -import org.gradle.testkit.runner.GradleRunner -import org.gradle.testkit.runner.TaskOutcome -import java.io.File -import kotlin.text.RegexOption.IGNORE_CASE - -class McGradleTestEnvironment( - override val testVersions: McTestVersions, - override val projectCache: ProjectCache, - testVariantNames: List, - testLocation: TestLocation -) : TestEnvironment(testVariantNames, testLocation), - ProjectCollector, - HasTestVersions { - - override val root: File get() = workingDir - - val kotlinVersion get() = testVersions.kotlinVersion - val agpVersion get() = testVersions.agpVersion - val gradleVersion get() = testVersions.gradleVersion - val anvilVersion get() = testVersions.anvilVersion - - override val dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess by lazy { - DependencyModuleDescriptorAccess(projectCache) - } - - override val codeGeneratorBindings: List by lazy { - defaultCodeGeneratorBindings() - } - - @Suppress("PropertyName", "VariableNaming") - val DEFAULT_BUILD_FILE by lazy { - """ - buildscript { - dependencies { - classpath("com.android.tools.build:gradle:$agpVersion") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlinVersion") - } - } - - plugins { - id("com.rickbusarow.module-check") - } - """.trimIndent() - } - - val rootBuild by lazy { - root.resolve("build.gradle.kts") - .createSafely(DEFAULT_BUILD_FILE, overwrite = false) - } - - @Suppress("PropertyName", "VariableNaming") - val DEFAULT_SETTINGS_FILE by lazy { - """ - rootProject.name = "root" - - pluginManagement { - repositories { - gradlePluginPortal() - mavenCentral() - mavenLocal() - google() - } - resolutionStrategy { - eachPlugin { - if (requested.id.id.startsWith("com.android")) { - useVersion("$agpVersion") - } - if (requested.id.id == "com.rickbusarow.module-check") { - useVersion("${BuildProperties.version}") - } - if (requested.id.id.startsWith("org.jetbrains.kotlin")) { - useVersion("$kotlinVersion") - } - if (requested.id.id == "com.squareup.anvil") { - useVersion("$anvilVersion") - } - } - } - } - dependencyResolutionManagement { - @Suppress("UnstableApiUsage") - repositories { - mavenCentral() - mavenLocal() - google() - } - } - """.trimIndent() - } - - val rootSettings by lazy { - root.resolve("settings.gradle.kts") - .createSafely(DEFAULT_SETTINGS_FILE) - } - - val rootProject by lazy { - rootBuild - rootSettings - root - } - - val gradleRunner: GradleRunner by lazy { - GradleRunner.create() - .forwardOutput() - .withGradleVersion(gradleVersion) - // .withTestKitDir(testKitDir) - // .withPluginClasspath() - .withDebug(true) - .withProjectDir(workingDir) - } - - // Make sure that every project in the cache is also added to the root project's settings file - private fun addIncludes() { - val includes = projectCache.values.map { it.projectPath.value } - .joinToString(separator = "\n", prefix = "\n", postfix = "\n") { "include(\"$it\")" } - rootSettings.appendText(includes) - } - - fun build(vararg tasks: String, withPluginClasspath: Boolean, stacktrace: Boolean): BuildResult { - - // make sure that the root project is initialized - rootProject - addIncludes() - - return gradleRunner - .letIf(withPluginClasspath) { it.withPluginClasspath() } - .withArguments(tasks.toList().letIf(stacktrace) { it + "--stacktrace" }) - .build() - } - - fun shouldSucceed( - vararg tasks: String, - withPluginClasspath: Boolean = false, - stacktrace: Boolean = true, - assertions: BuildResult.() -> Unit = {} - ): BuildResult { - val result = build( - *tasks, - withPluginClasspath = withPluginClasspath, - stacktrace = stacktrace - ) - - result.tasks.last().outcome shouldBe TaskOutcome.SUCCESS - - result.assertions() - - return result - } - - fun shouldFail(vararg tasks: String): BuildResult { - // make sure that the root project is initialized - rootProject - addIncludes() - - val result = gradleRunner.withArguments(*tasks) - .buildAndFail() - - result.tasks.last().outcome shouldBe TaskOutcome.FAILED - - return result - } - - infix fun BuildResult.withTrimmedMessage(message: String) { - val trimmed = output - .clean(workingDir) - .remove( - "FAILURE: Build failed with an exception.", - "* What went wrong:", - "* Try:", - "> Run with --stacktrace option to get the stack trace.", - "> Run with --info or --debug option to get more log output.", - "> Run with --scan to get full insights.", - "* Get more help at https://help.gradle.org", - "Daemon will be stopped at the end of the build after running out of JVM memory" - ) - // remove standard Gradle output noise - .remove( - """Execution failed for task ':moduleCheck(?:Auto|)'.""".toRegex(IGNORE_CASE), - "> Task [^\\n]*".toRegex(), - ".*Run with --.*".toRegex(), - """See https://docs\.gradle\.org/[^/]+/userguide/command_line_interface\.html#sec:command_line_warnings""".toRegex(), - "BUILD (?:SUCCESSFUL|FAILED) in .*".toRegex(), - """\d+ actionable tasks?: \d+ executed""".toRegex(), - """> ModuleCheck found \d+ issues? which (?:was|were) not auto-corrected.""".toRegex() - ) - .removeDuration() - .remove("\u200B") - .trim() - - trimmed shouldBe message - } - - /** - * replace `ModuleCheck found 2 issues in 1.866 seconds.` with `ModuleCheck found 2 issues` - * - * @since 0.12.0 - */ - fun String.removeDuration(): String { - return replace(durationSuffixRegex) { it.destructured.component1() } - } - - companion object { - protected val durationSuffixRegex: Regex = - """(ModuleCheck found \d+ issues?) in [\d.]+ seconds\.[\s\S]*""".toRegex() - } -} - -class McGradleTestEnvironmentFactory : ParamTestEnvironmentFactory { - override fun create( - params: McTestVersions, - names: List, - location: TestLocation - ): McGradleTestEnvironment = McGradleTestEnvironment( - testVersions = params, - projectCache = ProjectCache(), - testVariantNames = names, - testLocation = location - ) -} diff --git a/modulecheck-internal-testing/build.gradle.kts b/modulecheck-internal-testing/build.gradle.kts deleted file mode 100644 index e13b74b3ac..0000000000 --- a/modulecheck-internal-testing/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - versionsMatrix("main", "modulecheck.testing") -} - -dependencies { - - api(libs.bundles.junit) - api(libs.bundles.kotest) - api(libs.rickBusarow.kase) - api(libs.rickBusarow.kase.gradle) - - compileOnly(gradleApi()) - - compileOnly(libs.groovyXml) - - implementation(libs.kotlin.compiler) - implementation(libs.kotlin.reflect) - - implementation(project(path = ":modulecheck-utils:stdlib")) -} diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/BaseTest.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/BaseTest.kt deleted file mode 100644 index 7c83f4894d..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/BaseTest.kt +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import com.rickbusarow.kase.DefaultTestEnvironment -import com.rickbusarow.kase.HasTestEnvironmentFactory -import com.rickbusarow.kase.TestEnvironment -import com.rickbusarow.kase.asClueCatching -import com.rickbusarow.kase.files.TestLocation -import kotlinx.coroutines.runBlocking -import modulecheck.testing.assertions.TrimmedAsserts -import modulecheck.utils.mapLines -import modulecheck.utils.noAnsi -import modulecheck.utils.normaliseLineSeparators -import modulecheck.utils.remove -import java.io.File - -/** */ -interface BaseTest : - HasTestEnvironmentFactory, - TrimmedAsserts { - override val testEnvironmentFactory: DefaultTestEnvironment.Factory - get() = DefaultTestEnvironment.Factory() - - /** shorthand for executing a test in a hermetic TestEnvironment but without any kase parameters */ - fun test( - testLocation: TestLocation = TestLocation.get(), - testAction: suspend TestEnvironment.() -> Unit - ) { - val testEnvironment = testEnvironmentFactory.create( - names = emptyList(), - location = testLocation - ) - - runBlocking { - testEnvironment.asClueCatching { - testEnvironment.testAction() - println(testEnvironment) - } - } - } -} - -/** - * Replace Windows file separators with Unix ones, just for string comparison in tests - * - * @since 0.12.0 - */ -fun String.alwaysUnixFileSeparators(): String = replace(File.separator, "/") - -/** - * replace absolute paths with relative ones - * - * @since 0.12.0 - */ -fun String.useRelativePaths(workingDir: File): String { - return alwaysUnixFileSeparators() - .remove( - // order matters here!! absolute must go first - workingDir.absolutePath.alwaysUnixFileSeparators(), - workingDir.path.alwaysUnixFileSeparators() - ) -} - -/** - * Removes various bits of noise and machine-specific variables from a console or report output. - * Cleans the provided string by applying various modifications such as normalising line separators, - * using relative paths, enforcing Unix file separators, and removing specific strings or patterns. - * - * @param workingDir The working directory that will be used when making paths relative. - * @receiver The raw string that needs to be cleaned. - * @return The cleaned string after all the modifications have been applied. - */ -fun String.clean(workingDir: File): String { - return normaliseLineSeparators() - .useRelativePaths(workingDir) - .alwaysUnixFileSeparators() - .remove( - "Type-safe dependency accessors is an incubating feature.", - "Type-safe project accessors is an incubating feature.", - "-- ModuleCheck results --", - "Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.", - "You can use '--warning-mode all' to show the individual deprecation warnings " + - "and determine if they come from your own scripts or plugins.", - "To ignore any of these findings, " + - "annotate the dependency declaration with " + - "@Suppress(\"\") in Kotlin, " + - "or //noinspection in Groovy.", - "See https://rbusarow.github.io/ModuleCheck/docs/suppressing-findings for more info." - ) - .remove("in [\\d.]+ seconds\\.".toRegex()) - .noAnsi() - .mapLines { it.trimEnd() } - .trimEnd() - .trimStart('\n') -} diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/McTestVersions.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/McTestVersions.kt deleted file mode 100644 index 35c5f8148e..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/McTestVersions.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import com.rickbusarow.kase.Kase4 -import com.rickbusarow.kase.KaseMatrix -import com.rickbusarow.kase.get -import com.rickbusarow.kase.gradle.AgpDependencyVersion -import com.rickbusarow.kase.gradle.AnvilDependencyVersion -import com.rickbusarow.kase.gradle.GradleDependencyVersion -import com.rickbusarow.kase.gradle.GradleKotlinTestVersions -import com.rickbusarow.kase.gradle.GradleTestVersions -import com.rickbusarow.kase.gradle.HasAgpDependencyVersion -import com.rickbusarow.kase.gradle.HasAnvilDependencyVersion -import com.rickbusarow.kase.gradle.HasGradleDependencyVersion -import com.rickbusarow.kase.gradle.HasKotlinDependencyVersion -import com.rickbusarow.kase.gradle.KotlinDependencyVersion -import com.rickbusarow.kase.gradle.TestVersionsFactory -import com.rickbusarow.kase.kase - -/** - * The versions of dependencies which are changed during parameterized tests. - * - * @param a1 Gradle - * @param a2 Kotlin - * @param a3 Anvil - * @param a4 AGP - */ -class McTestVersions( - a1: GradleDependencyVersion, - a2: KotlinDependencyVersion, - a3: AnvilDependencyVersion, - a4: AgpDependencyVersion -) : GradleKotlinAnvilAgpTestVersions by DefaultGradleKotlinAnvilAgpTestVersions( - a1 = a1, - a2 = a2, - a3 = a3, - a4 = a4 -) - -/** Trait interface for [McTestVersions]*/ -interface HasTestVersions { - /** immutable */ - val testVersions: McTestVersions -} - -/** - * Holds [GradleDependencyVersion], [KotlinDependencyVersion], and [AgpDependencyVersion] versions - */ -interface GradleKotlinAnvilAgpTestVersions : - com.rickbusarow.kase.gradle.TestVersions, - HasGradleDependencyVersion, - HasKotlinDependencyVersion, - HasAnvilDependencyVersion, - HasAgpDependencyVersion, - Kase4, - GradleTestVersions, - GradleKotlinTestVersions { - - companion object : TestVersionsFactory { - override fun extract(matrix: KaseMatrix): List = matrix.get( - a1Key = GradleDependencyVersion, - a2Key = KotlinDependencyVersion, - a3Key = AnvilDependencyVersion, - a4Key = AgpDependencyVersion, - instanceFactory = ::DefaultGradleKotlinAnvilAgpTestVersions - ) - } -} - -/** - * Holds [GradleDependencyVersion], [KotlinDependencyVersion], - * [AnvilDependencyVersion], and [AgpDependencyVersion] versions - */ -class DefaultGradleKotlinAnvilAgpTestVersions( - override val a1: GradleDependencyVersion, - override val a2: KotlinDependencyVersion, - override val a3: AnvilDependencyVersion, - override val a4: AgpDependencyVersion -) : GradleKotlinAnvilAgpTestVersions, - HasGradleDependencyVersion by HasGradleDependencyVersion(a1), - HasKotlinDependencyVersion by HasKotlinDependencyVersion(a2), - HasAnvilDependencyVersion by HasAnvilDependencyVersion(a3), - HasAgpDependencyVersion by HasAgpDependencyVersion(a4), - Kase4 - by kase(a1, a2, a3, a4) { - - override val displayName: String = toString() - override fun toString(): String = "[gradle $gradle | agp $agp | anvil $anvil | kotlin $kotlin]" -} diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/McVersionMatrix.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/McVersionMatrix.kt deleted file mode 100644 index db6fc97566..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/McVersionMatrix.kt +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import com.rickbusarow.kase.KaseMatrix -import com.rickbusarow.kase.get -import com.rickbusarow.kase.gradle.AgpDependencyVersion -import com.rickbusarow.kase.gradle.AnvilDependencyVersion -import com.rickbusarow.kase.gradle.GradleDependencyVersion -import com.rickbusarow.kase.gradle.KotlinDependencyVersion -import modulecheck.utils.letIf -import kotlin.LazyThreadSafetyMode.NONE - -/** */ -class McVersionMatrix( - gradleVersions: List = Versions.gradleList, - agpVersions: List = Versions.agpList, - anvilVersions: List = Versions.anvilList, - kotlinVersions: List = Versions.kotlinList -) : KaseMatrix by KaseMatrix.invoke( - listOf( - gradleVersions.map(::GradleDependencyVersion), - agpVersions.map(::AgpDependencyVersion), - anvilVersions.map(::AnvilDependencyVersion), - kotlinVersions.map(::KotlinDependencyVersion) - ) -) { - - /** every permutation in the matrix without any filtering */ - val allVersions: List by lazy(NONE) { - get( - GradleDependencyVersion, - KotlinDependencyVersion, - AnvilDependencyVersion, - AgpDependencyVersion, - ::McTestVersions - ) - .filter { (gradle, kotlin, anvil, agp) -> - - when { - anvil.value.endsWith("-1-8") -> kotlin.value < "1.9.0" - agp >= AgpDependencyVersion("8.10.0") -> gradle >= GradleDependencyVersion("8.11.1") - else -> kotlin.value >= "1.9.0" - } - } - } - - /** either all permutations or just the last */ - fun versions(exhaustive: Boolean): List { - return allVersions.letIf(!exhaustive) { it.takeLast(1) } - } -} diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/SkipInStackTrace.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/SkipInStackTrace.kt deleted file mode 100644 index d88f879baf..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/SkipInStackTrace.kt +++ /dev/null @@ -1,165 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import java.lang.StackWalker.StackFrame -import java.lang.reflect.AnnotatedElement -import java.lang.reflect.Method -import kotlin.annotation.AnnotationRetention.RUNTIME -import kotlin.annotation.AnnotationTarget.CLASS -import kotlin.annotation.AnnotationTarget.FUNCTION -import kotlin.annotation.AnnotationTarget.PROPERTY -import kotlin.annotation.AnnotationTarget.PROPERTY_GETTER -import kotlin.annotation.AnnotationTarget.PROPERTY_SETTER - -/** - * Indicates that the annotated function/property should be ignored when walking a - * stack trace, such as in assertions or when trying to parse a test function's name. - * - * @see StackTraceElement.isSkipped - */ -@Target( - FUNCTION, - PROPERTY, - PROPERTY_GETTER, - PROPERTY_SETTER, - CLASS -) -@Retention(RUNTIME) -annotation class SkipInStackTrace - -/** - * Checks if an [AnnotatedElement] is annotated with [SkipInStackTrace]. - * - * @receiver [AnnotatedElement] The element to check. - * @return `true` if the [AnnotatedElement] is annotated with [SkipInStackTrace], `false` otherwise. - */ -@PublishedApi -internal fun AnnotatedElement.hasSkipAnnotation(): Boolean { - return isAnnotationPresent(SkipInStackTrace::class.java) -} - -private val sdkPackagePrefixes = setOf("java", "jdk", "kotlin") - -/** - * Checks if the [StackTraceElement] should be skipped based on the [SkipInStackTrace] annotation. - * - * @receiver [StackTraceElement] The element to check. - * @return `true` if the [StackTraceElement] should be skipped, `false` otherwise. - */ -@SkipInStackTrace -@PublishedApi -internal fun StackTraceElement.isSkipped(): Boolean { - // return declaringClass().isSkipped(methodName = methodName.removeSuffix("\$default")) - return isSkipped(clazz = declaringClass(), methodName = methodName.substringBeforeLast('$')) -} - -/** - * Retrieves the class from a [StackTraceElement]. - * - * @receiver [StackTraceElement] The element to inspect. - * @return The class object for the stack trace element. - */ -@SkipInStackTrace -@PublishedApi -internal fun StackTraceElement.declaringClass(): Class<*> = Class.forName(className) - -/** - * Checks if the [StackFrame] should be skipped based on the [SkipInStackTrace] annotation. - * - * @receiver [StackFrame] The frame to check. - * @return `true` if the [StackFrame] should be skipped, `false` otherwise. - */ -@SkipInStackTrace -@PublishedApi -internal fun StackFrame.isSkipped(): Boolean { - val clazz = declaringClass ?: return true - return isSkipped( - clazz = clazz, - methodName = methodName.removeSuffix("\$default") - ) -} - -/** - * Retrieves the class from a [StackFrame]. - * - * @receiver [StackFrame] The frame to inspect. - * @return The class object for the stack frame. - */ -@SkipInStackTrace -@PublishedApi -internal fun StackFrame.declaringClass(): Class<*> = declaringClass - -/** - * Determines whether a method within the given class should be skipped. - * - * @param clazz The class in which the method is declared. - * @param methodName The name of the method. - * @return `true` if the method should be skipped, `false` otherwise. - */ -internal fun isSkipped(clazz: Class<*>, methodName: String): Boolean { - - // trim off all the stuff like "$$inlined$$execute$1"" - val actualClass = clazz.firstNonSyntheticClass() - - val enclosingClasses = generateSequence(clazz) { c -> c.enclosingClass } - - if (enclosingClasses.any { it.hasSkipAnnotation() }) return true - - val packageRoot = clazz.canonicalName?.split('.')?.firstOrNull() - - if (packageRoot in sdkPackagePrefixes) { - return true - } - - // nested classes and functions have the java `$` delimiter - // ex: "com.example.MyTest$nested class$my test" - fun String.segments(): List = split(".", "$") - .filter { it.isNotBlank() } - - val actualMethodName = clazz.name.removePrefix(actualClass.name) - .segments() - .firstOrNull() - ?: methodName - - return actualClass - .methods - .filter { it.name == actualMethodName } - .requireAllOrNoneAreAnnotated() -} - -/** - * Validates that all methods in the list are either annotated with [SkipInStackTrace] - * or not. If only some methods are annotated, an exception will be thrown. - * - * @receiver List of [Method] to check. - * @return `true` if all methods are annotated with [SkipInStackTrace], `false` otherwise. - */ -@SkipInStackTrace -private fun List.requireAllOrNoneAreAnnotated(): Boolean { - - val (annotated, notAnnotated) = partition { - it.hasSkipAnnotation() - } - - require(annotated.size == size || notAnnotated.size == size) { - "The function named '${first().name}' is overloaded, " + - "and only some those overloads are annotated with `@SkipInStackTrace`. " + - "Either all must be annotated or none of them." - } - - return annotated.size == size -} diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/TestEnvironment.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/TestEnvironment.kt deleted file mode 100644 index 7d5c73440e..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/TestEnvironment.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import com.rickbusarow.kase.DefaultTestEnvironment -import com.rickbusarow.kase.TestEnvironment -import com.rickbusarow.kase.files.TestLocation -import modulecheck.testing.assertions.TrimmedAsserts -import java.io.File - -/** */ -open class TestEnvironment( - names: List, - testLocation: TestLocation = TestLocation.get() -) : TestEnvironment by DefaultTestEnvironment(names = names, testLocation = testLocation), - TrimmedAsserts { - - /** - * Asserts that the provided [File] has the expected - * text after reading it and using relative paths. - * - * @param expected The expected text that should be present in the file. - */ - override infix fun File.shouldHaveText(expected: String) { - asClueCatching { - readText().useRelativePaths(workingDir) shouldBe expected - } - } - - /** - * replace absolute paths with relative ones - * - * @see modulecheck.testing.useRelativePaths - */ - fun String.useRelativePaths(): String = useRelativePaths(workingDir) - - /** - * Cleans the provided string in the context of the [TestEnvironment]'s working directory. - * - * @receiver The raw string that needs to be cleaned. - * @return The cleaned string. - * @see modulecheck.testing.clean - */ - fun String.clean(): String = clean(workingDir) -} - -/** */ -interface TestEnvironmentParams diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/VersionsFactoryTest.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/VersionsFactoryTest.kt deleted file mode 100644 index faccaa410f..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/VersionsFactoryTest.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import com.rickbusarow.kase.HasKaseMatrix -import com.rickbusarow.kase.KaseTestFactory -import com.rickbusarow.kase.TestEnvironmentFactory -import com.rickbusarow.kase.TestNodeBuilder -import io.kotest.assertions.asClue -import io.kotest.matchers.collections.shouldNotBeEmpty -import modulecheck.utils.letIf -import modulecheck.utils.requireNotNull -import org.junit.jupiter.api.DynamicNode -import org.junit.jupiter.api.DynamicTest -import java.util.stream.Stream - -/** - * Convenience interface for a test which uses [KaseTestFactory] - * in order to create [DynamicTest]s for a JUnit5 test factory. - */ -interface VersionsFactoryTest : - KaseTestFactory, - HasKaseMatrix - where ENV : TestEnvironment, - ENV : HasTestVersions, - FACT : TestEnvironmentFactory { - - /** */ - override val kaseMatrix: McVersionMatrix - - /** If false, then tests will only use the latest version of each dependency */ - val exhaustive: Boolean - get() = Versions.exhaustive - - /** @return the latest version of valid dependencies which is not excluded by the current rules */ - fun defaultTestVersions(): McTestVersions = kaseMatrix.allVersions.last() - - /** - * @return a stream of [DynamicTest] from all valid versions combinations, - * optionally filtered by [filter]. [action] is performed against each element. - */ - @SkipInStackTrace - fun factory( - exhaustive: Boolean = this.exhaustive, - filter: ((McTestVersions) -> Boolean)? = null, - testEnvironmentFactory: TestEnvironmentFactory = - this@VersionsFactoryTest.testEnvironmentFactory, - testAction: suspend ENV.(McTestVersions) -> Unit - ): Stream = testVersionsPrivate(exhaustive, filter) - .asTests( - testEnvironmentFactory = testEnvironmentFactory, - testAction = testAction - ) - - /** - * @return a stream of [DynamicNode] from all valid versions combinations, - * optionally filtered by [filter]. [builder] is performed against each element. - */ - @SkipInStackTrace - fun factoryContainers( - exhaustive: Boolean = this.exhaustive, - filter: ((McTestVersions) -> Boolean)? = null, - builder: TestNodeBuilder.(McTestVersions) -> Stream - ): Stream = testVersionsPrivate(exhaustive, filter) - .asContainers { testVersions -> builder(testVersions) } - - /** either all permutations or just the last */ - fun versions(exhaustive: Boolean = this.exhaustive): List { - return kaseMatrix.allVersions.letIf(!exhaustive) { it.takeLast(1) } - } -} - -@PublishedApi -internal fun VersionsFactoryTest<*, *>.testVersionsPrivate( - exhaustive: Boolean, - filter: ((McTestVersions) -> Boolean)? -): List = kaseMatrix.versions(exhaustive = exhaustive) - .letIf(filter != null) { versions -> - - val (included, excluded) = kaseMatrix.allVersions - .partition(filter.requireNotNull()) - - "The filter excludes all possible versions".asClue { - included.shouldNotBeEmpty() - } - - "The filter does not exclude any versions".asClue { - excluded.shouldNotBeEmpty() - } - - versions.filter(filter.requireNotNull()) - } diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/assertions/TrimmedAsserts.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/assertions/TrimmedAsserts.kt deleted file mode 100644 index a09813e09f..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/assertions/TrimmedAsserts.kt +++ /dev/null @@ -1,185 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing.assertions - -import com.rickbusarow.kase.files.HasWorkingDir -import modulecheck.testing.BaseTest -import modulecheck.testing.SkipInStackTrace -import modulecheck.testing.asClueCatching -import modulecheck.testing.declaringClass -import modulecheck.testing.hasSkipAnnotation -import modulecheck.testing.isSkipped -import modulecheck.testing.withClueCatching -import modulecheck.utils.flatMapToSet -import modulecheck.utils.requireNotNull -import org.jetbrains.kotlin.util.prefixIfNot -import java.io.File -import kotlin.reflect.KClass -import io.kotest.matchers.shouldBe as kotestShouldBe - -/** - * Contains wrappers for Kotest's assertions which catch - * AssertionErrors and clean up stack traces before rethrowing. - */ -@SkipInStackTrace -interface TrimmedAsserts { - - /** reads the file's text and asserts */ - infix fun File.shouldHaveText(expected: String) { - asClueCatching { - readText() shouldBe expected - } - } - - /** A special String-only version of `shouldBe` which calls `trimIndent` first. */ - infix fun String.shouldBe(expected: String) { - - val actualClean = prefixIfNot("\n").trimIndent() - val expectedClean = expected.trimIndent() - - withClueCatching( - { - "This assertion is automatically applying `trimIndent`. " + - "Use `shouldBeNoTrimIndent` for the normal assertion." - } - ) { - actualClean.trimmedShouldBe(expectedClean) - } - } - - /** - * An alternative to the overloaded String-only `shouldBe`, since - * the overloaded version automatically applies `trimIndent`. - */ - infix fun String.shouldBeNoTrimIndent(expected: String) { - trimmedShouldBe(expected) - } - - /** - * Delegates to Kotest's [shouldBe][io.kotest.matchers.shouldBe], - * but removes all the noise at the beginning of a stacktrace, like: - * - * ```text - * at app//kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) - * at app//kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) - * ``` - * - * @see io.kotest.matchers.shouldBe - * @see trimmedAssert - * @see trimmedShouldBe - */ - infix fun T.shouldBe(expected: U?) { - trimmedShouldBe(expected) - } - - /** - * Delegates to Kotest's [shouldBe][io.kotest.matchers.shouldBe], - * but removes all the noise at the beginning of a stacktrace, like: - * - * ```text - * at app//kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) - * at app//kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) - * ``` - * - * @see io.kotest.matchers.shouldBe - * @see trimmedAssert - * @see trimmedShouldBe - */ - fun T.trimmedShouldBe(expected: U?, vararg excludeFromStack: KClass<*>) { - trimmedAssert(*excludeFromStack) { - kotestShouldBe(expected) - } - } - - /** Treat sequences like lists when asserting. */ - infix fun Sequence<*>.shouldBe(expected: List<*>) { - toList().shouldBe(expected) - } -} - -/** - * returns the output of [assertion], or cleans up the - * stacktrace of any assertion errors before rethrowing - * - * @since 0.12.4 - */ -inline fun trimmedAssert( - vararg excludeFromStack: KClass<*>, - crossinline assertion: () -> R -): R = Unit.trimmedAssert(*excludeFromStack) { assertion() } - -/** Removes the noise at the beginning of a stacktrace, in the event that [assertion] fails. */ -inline fun T.trimmedAssert( - vararg excludeFromStack: KClass<*>, - crossinline assertion: T.() -> R -): R { - - // Any AssertionError generated by this function will have this function at the top of its - // stacktrace, followed by lots of coroutines noise. So we can catch the assertion error, - // remove the noise from the stacktrace, and rethrow. - return try { - assertion() - } catch (assertionError: AssertionError) { - - val excludes = sequenceOf(TrimmedAsserts::class, BaseTest::class, HasWorkingDir::class) - .plus(excludeFromStack) - .map { it.qualifiedName.requireNotNull() } - .flatMapToSet { fqName -> setOf(fqName, "${fqName}Kt") } - .flatMapToSet { fqName -> - setOf( - fqName, - "${fqName}\$runBlocking\$1", - "${fqName}\$shouldBe\$1", - "${fqName}\$trimmedAssert\$1", - "${fqName}\$trimmedShouldBe\$1" - ) - } - - // remove this function from the stacktrace and rethrow - @Suppress("MagicNumber") - assertionError.stackTrace = assertionError - .stackTrace - // Note that this is `dropWhile` instead of `filter`. - // We only remove lines until we reach something which isn't skipped. - .dropWhile { - when { - it.className in excludes -> true - it.className in coroutinesClasses -> true - it.methodName == "shouldBe" -> true - it.declaringClass().hasSkipAnnotation() -> true - it.isSkipped() -> true - else -> false - } - } - .filterNot { it.methodName == "invoke" && it.lineNumber < 0 } - .take(15) // keep stack traces short - .toTypedArray() - throw assertionError - } -} - -@PublishedApi -internal val coroutinesClasses: Set = setOf( - "io.kotest.common.runBlocking", - "kotlin.coroutines.jvm.internal.BaseContinuationImpl", - "kotlinx.coroutines.AbstractCoroutine", - "kotlinx.coroutines.BlockingCoroutine", - "kotlinx.coroutines.BuildersKt", - "kotlinx.coroutines.BuildersKt__BuildersKt", - "kotlinx.coroutines.DispatchedTask", - "kotlinx.coroutines.EventLoopImplBase", - "kotlinx.coroutines.internal.ScopeCoroutine" -) diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/assertions/asserts.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/assertions/asserts.kt deleted file mode 100644 index 17ca41474c..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/assertions/asserts.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package modulecheck.testing.assertions - -import io.kotest.assertions.asClue -import io.kotest.matchers.shouldNotBe -import org.junit.jupiter.api.fail - -/** - * Asserts that the receiver is not null. If it is null, throws - * an [AssertionError] with the message provided by [lazyMessage]. - * - * @param lazyMessage the function to provide a message in case the receiver is null. - * Default message states "The receiver cannot be null, but it was. ¯\\_(ツ)_/¯" - * @return the receiver if it is not null - * @throws AssertionError if the receiver is null - */ -fun T?.requireNotNullOrFail( - lazyMessage: () -> String = { "The receiver cannot be null, but it was. ¯\\_(ツ)_/¯" } -): T { - if (this != null) return this - - fail(lazyMessage) -} - -/** - * Asserts that the receiver string changes after calling - * [String.replace] with [oldValue] and [replacement]. - * - * @param oldValue the old value to be replaced - * @param replacement the new value to replace the old value - * @return the new string after replacement - * @throws AssertionError if the string does not change after replacement - */ -fun String.replaceOrFail(oldValue: String, replacement: String): String { - return assertChanged( - oldString = this@replaceOrFail, - newString = replace(oldValue, replacement), - token = oldValue, - replacement = replacement - ) -} - -/** - * Asserts that the receiver string changes after calling - * [String.replace] with [regex] and [replacement]. - * - * @param regex the regular expression to be replaced - * @param replacement the new value to replace the matched regular expression - * @return the new string after replacement - * @throws AssertionError if the string does not change after replacement - */ -fun String.replaceOrFail(regex: Regex, replacement: String): String { - return assertChanged( - oldString = this@replaceOrFail, - newString = replace(regex, replacement), - token = regex, - replacement = replacement - ) -} - -/** - * Asserts that [oldString] changes after replacing a [token] with [replacement]. - * - * @param oldString the original string before replacement - * @param newString the new string after replacement - * @param token the value that is replaced - * @param replacement the new value that replaces the token - * @return the new string - * @throws AssertionError if the original string does not change after the replacement - */ -private fun assertChanged(oldString: String, newString: String, token: Any, replacement: String) = - newString.also { new -> - trimmedAssert { - - @Suppress("MagicNumber") - val tokenName = (if (token is Regex) "regex" else "oldValue").padStart(9) - - """ - |String replacement did not change the original string. - | - | $tokenName: $token - | replacement: $replacement - | - |original string (starting on the new line): - |$oldString - |____________________________________________________ - """.replaceIndentByMargin() - .asClue { new shouldNotBe oldString } - } - } diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/clues.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/clues.kt deleted file mode 100644 index 9c5c295028..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/clues.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -/** - * Catch anything and rethrow, but prepend the [clue]'s toString(). This - * is basically the same as just using Kotest's `clue.asClue { ... }`, - * except that `asClue` only catches assertion errors from inside Kotest. - */ -inline fun withClueCatching(clue: () -> Any?, thunk: () -> R): R { - try { - return thunk() - } catch (@Suppress("TooGenericExceptionCaught") throwable: Throwable) { - System.err.println(clue.invoke()) - throw throwable - } -} - -/** - * Catch anything and rethrow, but prepend the receiver's toString(). This - * toString is evaluated lazily, meaning that it should reflect its state at the - * time of the exception (possibly excluding weirdness caused by concurrency). - * - * This is basically the same as just using Kotest's `__.asClue { ... }`, - * except that `asClue` only catches assertion errors from inside Kotest. - */ -inline fun T.asClueCatching(block: T.() -> R): R = - withClueCatching({ this.toString() }) { block() } diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/file.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/file.kt deleted file mode 100644 index 94a9c6c3d3..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/file.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import modulecheck.utils.createSafely -import org.intellij.lang.annotations.Language -import java.io.File - -fun File.writeKotlin( - @Language("kotlin") - content: String -) { - check(extension in listOf("kts", "kt")) { - "Writing Kotlin to a non-Kotlin file with extension `$extension`." - } - createSafely(content.trimIndent()) -} - -fun File.writeGroovy( - @Language("groovy") - content: String -) { - check(extension in listOf("groovy", "gradle")) { - "Writing Groovy to a non-Groovy file with extension `$extension`." - } - createSafely(content.trimIndent()) -} - -fun File.writeJava( - @Language("java") - content: String -) { - check(extension == "java") { - "Writing Java to a non-Java file with extension `$extension`." - } - createSafely(content.trimIndent()) -} diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/propTest.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/propTest.kt deleted file mode 100644 index 0ec5d4972e..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/propTest.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import io.kotest.common.ExperimentalKotest -import io.kotest.property.Gen -import io.kotest.property.PropTestConfig -import io.kotest.property.PropertyContext -import kotlinx.coroutines.runBlocking - -/** - * shorthand for the Kotest `forAll`, but blocking and always returning Unit - * - * @since 0.12.0 - */ -fun forAllBlocking(genA: Gen, property: suspend PropertyContext.(A) -> Unit) { - runBlocking { - @OptIn(ExperimentalKotest::class) - io.kotest.property.forAll(PropTestConfig(), genA) { arg -> - property.invoke(this, arg) - true - } - } -} - -/** - * shorthand for the Kotest `forAll`, but blocking and always returning Unit - * - * @since 0.12.0 - */ -@JvmName("forAllBlockingExtension") -fun Gen.forAllBlocking(property: suspend PropertyContext.(A) -> Unit) { - forAllBlocking(genA = this) { arg -> - property.invoke(this, arg) - } -} diff --git a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/reflection.kt b/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/reflection.kt deleted file mode 100644 index 1b3e2bd6c7..0000000000 --- a/modulecheck-internal-testing/src/main/kotlin/modulecheck/testing/reflection.kt +++ /dev/null @@ -1,125 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import modulecheck.testing.assertions.requireNotNullOrFail -import kotlin.reflect.KClass -import kotlin.reflect.KFunction -import kotlin.reflect.full.memberProperties -import kotlin.reflect.full.primaryConstructor -import kotlin.reflect.jvm.isAccessible - -/** - * Returns the full tree of classes which implement a base sealed class/interface, - * including grandchildren, great-grandchildren, etc. This is different from - * [KClass.sealedSubclasses] in that the latter only returns the direct children. - * - * @since 0.12.0 - */ -inline fun KClass.sealedSubclassesRecursive(): Sequence> { - return generateSequence(sealedSubclasses.asSequence()) { subs -> - subs - .flatMap { it.sealedSubclasses } - .takeIf { it.iterator().hasNext() } - } - .flatten() - .distinct() -} - -/** - * Provides a sequence of the primary constructors of all non-abstract, non-sealed - * subclasses of the sealed class or interface that implement this [KClass]. - * - * @return A [Sequence] of the primary [KFunction] constructors of all descendant classes. - */ -inline fun KClass.sealedSubclassConstructorsRecursive(): Sequence> { - return sealedSubclassesRecursive() - .filter { !it.isAbstract && !it.isSealed } - .map { clazz -> - clazz.primaryConstructor - .requireNotNullOrFail { "no primary constructor for $clazz???" } - } -} - -/** - * Provides a sequence of instances of all non-abstract, non-sealed subclasses of the - * sealed class or interface that implement this [KClass]. The instances are created - * using the primary constructor of each subclass, with the provided arguments. - * - * @param args The arguments to be passed to the primary constructor of each subclass. - * @return A [Sequence] of instances of all descendant classes. - */ -inline fun KClass.sealedSubclassInstances(vararg args: Any?): Sequence { - return sealedSubclassConstructorsRecursive() - .mapNotNull { - kotlin.runCatching { it.call(*args) }.getOrNull() - } -} - -/** - * Retrieves the value of a private property in the receiver instance by its name. - * - * @param name The name of the private property. - * @return The value of the private property. - * @throws IllegalArgumentException if the receiver does - * not have a private property with the given name. - */ -inline fun T.getPrivateFieldByName(name: String): R { - val kClass = T::class - - val property = kClass.memberProperties.find { it.name == name } - - requireNotNull(property) { "Cannot find a property named `$name` in ${kClass.qualifiedName}." } - - property.isAccessible = true - - return property.get(this) as R -} - -/** - * Returns the current class if it's a real class, otherwise walks up - * the hierarchy of enclosing/nesting classes until it finds a real one. - * - * In practical terms, this strips away Kotlin's anonymous lambda - * "classes" and other compatibility shims, returning the real class. - */ -tailrec fun Class<*>.firstNonSyntheticClass(): Class<*> { - return when { - canonicalName != null -> this - else -> enclosingClass.firstNonSyntheticClass() - } -} - -/** - * Provides a sequence of all the enclosing classes of this [Class]. - * - * @param includeSelf Determines whether to include the current class in the returned sequence. - * @return A [Sequence] of all enclosing classes. - */ -fun Class<*>.enclosingClasses(includeSelf: Boolean = false): Sequence> { - return generateSequence(if (includeSelf) this else enclosingClass) { it.enclosingClass } -} - -/** - * Provides a sequence of the canonical names of all enclosing classes of this [Class]. - * - * @param includeSelf Determines whether to include the canonical - * name of the current class in the returned sequence. - * @return A [Sequence] of the canonical names of all enclosing classes. - */ -fun Class<*>.enclosingCanonicalNames(includeSelf: Boolean = false): Sequence { - return enclosingClasses(includeSelf = includeSelf).mapNotNull { it.canonicalName } -} diff --git a/modulecheck-internal-testing/src/test/kotlin/modulecheck/testing/VersionsFactoryFilteringTest.kt b/modulecheck-internal-testing/src/test/kotlin/modulecheck/testing/VersionsFactoryFilteringTest.kt deleted file mode 100644 index 9c91d36a36..0000000000 --- a/modulecheck-internal-testing/src/test/kotlin/modulecheck/testing/VersionsFactoryFilteringTest.kt +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.testing - -import com.rickbusarow.kase.ParamTestEnvironmentFactory -import com.rickbusarow.kase.files.TestLocation -import io.kotest.matchers.ints.shouldBeGreaterThan -import io.kotest.matchers.shouldBe -import modulecheck.testing.VersionFactoryTestTestEnvironment.Factory -import org.junit.jupiter.api.Test - -internal class VersionsFactoryFilteringTest : - VersionsFactoryTest { - - override val kaseMatrix = McVersionMatrix() - - override val exhaustive: Boolean = true - override val params: List - get() = kaseMatrix.versions(exhaustive) - - override val testEnvironmentFactory: Factory = Factory() - - @Test - fun `class-level 'exhaustive' value of true makes the function exhaustive by default`() { - - // the class-level variable can't be changed - exhaustive shouldBe true - - versions().size shouldBeGreaterThan 1 - versions() shouldBe kaseMatrix.versions(exhaustive = true) - } - - @Test - fun `calling 'versions' with 'exhaustive = false' overrides the exhaustive property behavior`() { - - // the class-level variable can't be changed - exhaustive shouldBe true - - kaseMatrix.versions(false) shouldBe listOf(defaultTestVersions()) - } -} - -/** unused */ -internal data class VersionFactoryTestTestEnvironment( - override val testVersions: McTestVersions, - val testVariantNames: List, - val testLocation: TestLocation -) : TestEnvironment(testVariantNames, testLocation), - HasTestVersions { - - class Factory : ParamTestEnvironmentFactory { - - override fun create( - params: McTestVersions, - names: List, - location: TestLocation - ): VersionFactoryTestTestEnvironment = VersionFactoryTestTestEnvironment( - testVersions = params, - testVariantNames = names, - testLocation = location - ) - } -} diff --git a/modulecheck-model/dependency/api/api/api.api b/modulecheck-model/dependency/api/api/api.api deleted file mode 100644 index b3eb543ddf..0000000000 --- a/modulecheck-model/dependency/api/api/api.api +++ /dev/null @@ -1,720 +0,0 @@ -public abstract interface class modulecheck/model/dependency/AllProjectPathsProvider { - public abstract fun getAllPaths ()Ljava/util/List; -} - -public abstract interface class modulecheck/model/dependency/AndroidPlatformPlugin : modulecheck/model/dependency/PlatformPlugin { - public abstract fun getKotlinAndroidExtensionEnabled ()Z - public abstract fun getManifests ()Ljava/util/Map; - public abstract fun getNamespaces ()Ljava/util/Map; - public abstract fun getNonTransientRClass ()Z - public abstract fun getResValues ()Ljava/util/Map; - public abstract fun getViewBindingEnabled ()Z -} - -public final class modulecheck/model/dependency/AndroidPlatformPlugin$AndroidApplicationPlugin : modulecheck/model/dependency/AndroidPlatformPlugin, modulecheck/model/dependency/PlatformPlugin { - public fun (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;ZZZLjava/util/Map;Ljava/util/Map;Lkotlin/Lazy;)V - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; - public fun getViewBindingEnabled ()Z -} - -public final class modulecheck/model/dependency/AndroidPlatformPlugin$AndroidDynamicFeaturePlugin : modulecheck/model/dependency/AndroidPlatformPlugin, modulecheck/model/dependency/AndroidPlatformPlugin$CanDisableAndroidBuildConfig, modulecheck/model/dependency/PlatformPlugin { - public fun (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;ZZZLjava/util/Map;Ljava/util/Map;ZLkotlin/Lazy;)V - public fun getBuildConfigEnabled ()Z - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; - public fun getViewBindingEnabled ()Z -} - -public final class modulecheck/model/dependency/AndroidPlatformPlugin$AndroidLibraryPlugin : modulecheck/model/dependency/AndroidPlatformPlugin, modulecheck/model/dependency/AndroidPlatformPlugin$CanDisableAndroidBuildConfig, modulecheck/model/dependency/AndroidPlatformPlugin$CanDisableAndroidResources, modulecheck/model/dependency/PlatformPlugin { - public fun (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;ZZZLjava/util/Map;Ljava/util/Map;ZZLkotlin/Lazy;)V - public fun getAndroidResourcesEnabled ()Z - public fun getBuildConfigEnabled ()Z - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; - public fun getViewBindingEnabled ()Z -} - -public final class modulecheck/model/dependency/AndroidPlatformPlugin$AndroidTestPlugin : modulecheck/model/dependency/AndroidPlatformPlugin, modulecheck/model/dependency/AndroidPlatformPlugin$CanDisableAndroidBuildConfig, modulecheck/model/dependency/PlatformPlugin { - public fun (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;ZZZLjava/util/Map;Ljava/util/Map;ZLkotlin/Lazy;)V - public fun getBuildConfigEnabled ()Z - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; - public fun getViewBindingEnabled ()Z -} - -public abstract interface class modulecheck/model/dependency/AndroidPlatformPlugin$CanDisableAndroidBuildConfig { - public abstract fun getBuildConfigEnabled ()Z -} - -public abstract interface class modulecheck/model/dependency/AndroidPlatformPlugin$CanDisableAndroidResources { - public abstract fun getAndroidResourcesEnabled ()Z -} - -public abstract interface class modulecheck/model/dependency/CodeGenerator { - public abstract fun getAnnotationNames ()Ljava/util/List; - public abstract fun getBaseConfigNames ()Ljava/util/List; - public abstract fun getExtensionTypeName ()Ljava/lang/String; - public abstract fun getGeneratorMavenCoordinates ()Ljava/lang/String; - public abstract fun getName ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/CodeGeneratorKt { - public static final fun asMap (Ljava/util/List;)Ljava/util/Map; -} - -public final class modulecheck/model/dependency/ConfigFactory { - public fun (Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;)V - public final fun create (Ljava/lang/Object;)Lmodulecheck/model/dependency/McConfiguration; -} - -public final class modulecheck/model/dependency/ConfigurationName : java/lang/Comparable { - public static final field Companion Lmodulecheck/model/dependency/ConfigurationName$Companion; - public static final fun apiVariant-9LqIWVA (Ljava/lang/String;)Ljava/lang/String; - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/model/dependency/ConfigurationName; - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo-WhtmYgw (Ljava/lang/String;)I - public static fun compareTo-WhtmYgw (Ljava/lang/String;Ljava/lang/String;)I - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public final fun getValue ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public static final fun implementationVariant-9LqIWVA (Ljava/lang/String;)Ljava/lang/String; - public static final fun isApi-impl (Ljava/lang/String;)Z - public static final fun isImplementation-impl (Ljava/lang/String;)Z - public static final fun isKapt-impl (Ljava/lang/String;)Z - public static final fun kaptVariant-9LqIWVA (Ljava/lang/String;)Ljava/lang/String; - public static final fun nameWithoutSourceSet-impl (Ljava/lang/String;)Ljava/lang/String; - public static final fun switchSourceSet-277IKfY (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun toSourceSetName-qrJCKeA (Ljava/lang/String;)Ljava/lang/String; - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/ConfigurationName$Companion { - public final fun getAndroidTestImplementation-9LqIWVA ()Ljava/lang/String; - public final fun getAnnotationProcessor-9LqIWVA ()Ljava/lang/String; - public final fun getAnvil-9LqIWVA ()Ljava/lang/String; - public final fun getApi-9LqIWVA ()Ljava/lang/String; - public final fun getCompile-9LqIWVA ()Ljava/lang/String; - public final fun getCompileOnly-9LqIWVA ()Ljava/lang/String; - public final fun getCompileOnlyApi-9LqIWVA ()Ljava/lang/String; - public final fun getImplementation-9LqIWVA ()Ljava/lang/String; - public final fun getKapt-9LqIWVA ()Ljava/lang/String; - public final fun getKotlinCompileClasspath-9LqIWVA ()Ljava/lang/String; - public final fun getKsp-9LqIWVA ()Ljava/lang/String; - public final fun getMainConfigurations ()Ljava/util/List; - public final fun getRuntime-9LqIWVA ()Ljava/lang/String; - public final fun getRuntimeOnly-9LqIWVA ()Ljava/lang/String; - public final fun getTestApi-9LqIWVA ()Ljava/lang/String; - public final fun getTestImplementation-9LqIWVA ()Ljava/lang/String; - public final fun main ()Ljava/util/List; - public final fun private ()Ljava/util/List; - public final fun public ()Ljava/util/List; -} - -public final class modulecheck/model/dependency/ConfigurationNameKt { - public static final fun asConfigurationName (Ljava/lang/String;)Ljava/lang/String; - public static final fun distinctSourceSetNames (Ljava/lang/Iterable;)Ljava/util/List; - public static final fun distinctSourceSetNames (Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; - public static final fun main (Ljava/util/Map;)Ljava/util/List; -} - -public final class modulecheck/model/dependency/Configurations : java/util/Map, kotlin/jvm/internal/markers/KMappedMarker { - public fun (Ljava/util/Map;)V - public fun clear ()V - public synthetic fun compute (Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; - public fun compute-KxNpj4Q (Ljava/lang/String;Ljava/util/function/BiFunction;)Lmodulecheck/model/dependency/McConfiguration; - public synthetic fun computeIfAbsent (Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object; - public fun computeIfAbsent-KxNpj4Q (Ljava/lang/String;Ljava/util/function/Function;)Lmodulecheck/model/dependency/McConfiguration; - public synthetic fun computeIfPresent (Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; - public fun computeIfPresent-KxNpj4Q (Ljava/lang/String;Ljava/util/function/BiFunction;)Lmodulecheck/model/dependency/McConfiguration; - public final fun containsKey (Ljava/lang/Object;)Z - public fun containsKey-WhtmYgw (Ljava/lang/String;)Z - public final fun containsValue (Ljava/lang/Object;)Z - public fun containsValue (Lmodulecheck/model/dependency/McConfiguration;)Z - public final fun entrySet ()Ljava/util/Set; - public final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object; - public final fun get (Ljava/lang/Object;)Lmodulecheck/model/dependency/McConfiguration; - public fun get-WhtmYgw (Ljava/lang/String;)Lmodulecheck/model/dependency/McConfiguration; - public fun getEntries ()Ljava/util/Set; - public fun getKeys ()Ljava/util/Set; - public fun getSize ()I - public fun getValues ()Ljava/util/Collection; - public fun isEmpty ()Z - public final fun keySet ()Ljava/util/Set; - public synthetic fun merge (Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; - public fun merge-9A_UJks (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;Ljava/util/function/BiFunction;)Lmodulecheck/model/dependency/McConfiguration; - public synthetic fun put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public fun put-KxNpj4Q (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;)Lmodulecheck/model/dependency/McConfiguration; - public fun putAll (Ljava/util/Map;)V - public synthetic fun putIfAbsent (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public fun putIfAbsent-KxNpj4Q (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;)Lmodulecheck/model/dependency/McConfiguration; - public synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object; - public fun remove (Ljava/lang/Object;)Lmodulecheck/model/dependency/McConfiguration; - public fun remove (Ljava/lang/Object;Ljava/lang/Object;)Z - public synthetic fun replace (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public synthetic fun replace (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z - public fun replace-9A_UJks (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;)Z - public fun replace-KxNpj4Q (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;)Lmodulecheck/model/dependency/McConfiguration; - public fun replaceAll (Ljava/util/function/BiFunction;)V - public final fun size ()I - public fun toString ()Ljava/lang/String; - public final fun values ()Ljava/util/Collection; -} - -public abstract interface class modulecheck/model/dependency/ConfiguredDependency : modulecheck/model/dependency/Dependency { - public static final field Companion Lmodulecheck/model/dependency/ConfiguredDependency$Companion; - public abstract fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public abstract fun getIdentifier ()Lmodulecheck/model/dependency/Identifier; - public abstract fun isTestFixture ()Z -} - -public final class modulecheck/model/dependency/ConfiguredDependency$Companion { -} - -public abstract interface class modulecheck/model/dependency/Dependency { -} - -public final class modulecheck/model/dependency/DownstreamDependency { - public fun (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependency;)V - public final fun component1 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun copy (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependency;)Lmodulecheck/model/dependency/DownstreamDependency; - public static synthetic fun copy$default (Lmodulecheck/model/dependency/DownstreamDependency;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependency;ILjava/lang/Object;)Lmodulecheck/model/dependency/DownstreamDependency; - public fun equals (Ljava/lang/Object;)Z - public final fun getDependentProjectPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun getProjectDependency ()Lmodulecheck/model/dependency/ProjectDependency; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/ExternalDependencies : java/util/Map, kotlin/jvm/internal/markers/KMutableMap { - public fun (Ljava/util/Map;)V - public final fun add (Lmodulecheck/model/dependency/ExternalDependency;)V - public fun clear ()V - public final fun containsKey (Ljava/lang/Object;)Z - public fun containsKey-WhtmYgw (Ljava/lang/String;)Z - public final fun containsValue (Ljava/lang/Object;)Z - public fun containsValue (Ljava/util/Set;)Z - public final fun entrySet ()Ljava/util/Set; - public final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object; - public final fun get (Ljava/lang/Object;)Ljava/util/Set; - public fun get-WhtmYgw (Ljava/lang/String;)Ljava/util/Set; - public final fun get-WkhsVnw (Ljava/lang/String;)Ljava/util/Set; - public fun getEntries ()Ljava/util/Set; - public fun getKeys ()Ljava/util/Set; - public fun getSize ()I - public fun getValues ()Ljava/util/Collection; - public fun isEmpty ()Z - public final fun keySet ()Ljava/util/Set; - public final fun main ()Ljava/util/Set; - public final fun private ()Ljava/util/Set; - public final fun public ()Ljava/util/Set; - public synthetic fun put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public fun put-KxNpj4Q (Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set; - public fun putAll (Ljava/util/Map;)V - public final synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object; - public final fun remove (Ljava/lang/Object;)Ljava/util/Set; - public final fun remove (Lmodulecheck/model/dependency/ExternalDependency;)V - public fun remove-WhtmYgw (Ljava/lang/String;)Ljava/util/Set; - public final fun size ()I - public final fun values ()Ljava/util/Collection; -} - -public abstract class modulecheck/model/dependency/ExternalDependency : modulecheck/model/dependency/ConfiguredDependency, modulecheck/model/dependency/HasMavenCoordinates { - public final fun copy-FdhTdL0 (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lmodulecheck/model/dependency/ExternalDependency; - public static synthetic fun copy-FdhTdL0$default (Lmodulecheck/model/dependency/ExternalDependency;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Lmodulecheck/model/dependency/ExternalDependency; - public fun equals (Ljava/lang/Object;)Z - public abstract fun getGroup ()Ljava/lang/String; - public synthetic fun getIdentifier ()Lmodulecheck/model/dependency/Identifier; - public fun getIdentifier ()Lmodulecheck/model/dependency/MavenCoordinates; - public fun getMavenCoordinates ()Lmodulecheck/model/dependency/MavenCoordinates; - public abstract fun getModuleName ()Ljava/lang/String; - public final fun getNameWithVersion ()Ljava/lang/String; - public final fun getNameWithoutVersion ()Ljava/lang/String; - public abstract fun getVersion ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/ExternalDependency$ExternalCodeGeneratorDependency : modulecheck/model/dependency/ExternalDependency, modulecheck/model/dependency/MightHaveCodeGeneratorBinding { - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLmodulecheck/model/dependency/CodeGenerator;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getCodeGeneratorBindingOrNull ()Lmodulecheck/model/dependency/CodeGenerator; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public fun getGroup ()Ljava/lang/String; - public fun getModuleName ()Ljava/lang/String; - public fun getVersion ()Ljava/lang/String; - public fun isTestFixture ()Z -} - -public final class modulecheck/model/dependency/ExternalDependency$ExternalRuntimeDependency : modulecheck/model/dependency/ExternalDependency { - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public fun getGroup ()Ljava/lang/String; - public fun getModuleName ()Ljava/lang/String; - public fun getVersion ()Ljava/lang/String; - public fun isTestFixture ()Z -} - -public abstract interface class modulecheck/model/dependency/ExternalDependency$Factory { - public abstract fun create-FdhTdL0 (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lmodulecheck/model/dependency/ExternalDependency; -} - -public abstract interface class modulecheck/model/dependency/HasConfigurations { - public abstract fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; -} - -public abstract interface class modulecheck/model/dependency/HasDependencies { - public abstract fun getExternalDependencies ()Lmodulecheck/model/dependency/ExternalDependencies; - public abstract fun getProjectDependencies ()Lmodulecheck/model/dependency/ProjectDependencies; -} - -public abstract interface class modulecheck/model/dependency/HasIdentifier { - public abstract fun getIdentifier ()Lmodulecheck/model/dependency/Identifier; -} - -public abstract interface class modulecheck/model/dependency/HasMavenCoordinates : modulecheck/model/dependency/HasIdentifier { - public fun getIdentifier ()Lmodulecheck/model/dependency/Identifier; - public abstract fun getMavenCoordinates ()Lmodulecheck/model/dependency/MavenCoordinates; -} - -public abstract interface class modulecheck/model/dependency/HasProjectPath : modulecheck/model/dependency/HasIdentifier { - public fun getIdentifier ()Lmodulecheck/model/dependency/Identifier; - public abstract fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; -} - -public abstract interface class modulecheck/model/dependency/HasSourceSets { - public abstract fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; -} - -public abstract interface class modulecheck/model/dependency/Identifier { - public abstract fun getName ()Ljava/lang/String; -} - -public abstract interface class modulecheck/model/dependency/JvmPlatformPlugin : modulecheck/model/dependency/PlatformPlugin { -} - -public final class modulecheck/model/dependency/JvmPlatformPlugin$JavaLibraryPlugin : modulecheck/model/dependency/JvmPlatformPlugin { - public fun (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;)V - public final fun component1 ()Lmodulecheck/model/dependency/SourceSets; - public final fun component2 ()Lmodulecheck/model/dependency/Configurations; - public final fun copy (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;)Lmodulecheck/model/dependency/JvmPlatformPlugin$JavaLibraryPlugin; - public static synthetic fun copy$default (Lmodulecheck/model/dependency/JvmPlatformPlugin$JavaLibraryPlugin;Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;ILjava/lang/Object;)Lmodulecheck/model/dependency/JvmPlatformPlugin$JavaLibraryPlugin; - public fun equals (Ljava/lang/Object;)Z - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/JvmPlatformPlugin$KotlinJvmPlugin : modulecheck/model/dependency/JvmPlatformPlugin { - public fun (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;)V - public final fun component1 ()Lmodulecheck/model/dependency/SourceSets; - public final fun component2 ()Lmodulecheck/model/dependency/Configurations; - public final fun copy (Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;)Lmodulecheck/model/dependency/JvmPlatformPlugin$KotlinJvmPlugin; - public static synthetic fun copy$default (Lmodulecheck/model/dependency/JvmPlatformPlugin$KotlinJvmPlugin;Lmodulecheck/model/dependency/SourceSets;Lmodulecheck/model/dependency/Configurations;ILjava/lang/Object;)Lmodulecheck/model/dependency/JvmPlatformPlugin$KotlinJvmPlugin; - public fun equals (Ljava/lang/Object;)Z - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/MavenCoordinates : java/lang/Comparable, modulecheck/model/dependency/Identifier { - public static final field Companion Lmodulecheck/model/dependency/MavenCoordinates$Companion; - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/model/dependency/MavenCoordinates;)I - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/model/dependency/MavenCoordinates; - public static synthetic fun copy$default (Lmodulecheck/model/dependency/MavenCoordinates;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/model/dependency/MavenCoordinates; - public fun equals (Ljava/lang/Object;)Z - public final fun getGroup ()Ljava/lang/String; - public final fun getModuleName ()Ljava/lang/String; - public fun getName ()Ljava/lang/String; - public final fun getVersion ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/MavenCoordinates$Companion { - public final fun parseOrNull (Ljava/lang/String;)Lmodulecheck/model/dependency/MavenCoordinates; -} - -public final class modulecheck/model/dependency/McConfiguration { - public synthetic fun (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lkotlin/sequences/Sequence;Lkotlin/sequences/Sequence;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-9LqIWVA ()Ljava/lang/String; - public final fun component2 ()Ljava/util/Set; - public final fun component3 ()Ljava/util/Set; - public final fun copy-FdhTdL0 (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lkotlin/sequences/Sequence;Lkotlin/sequences/Sequence;)Lmodulecheck/model/dependency/McConfiguration; - public static synthetic fun copy-FdhTdL0$default (Lmodulecheck/model/dependency/McConfiguration;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Lkotlin/sequences/Sequence;Lkotlin/sequences/Sequence;ILjava/lang/Object;)Lmodulecheck/model/dependency/McConfiguration; - public fun equals (Ljava/lang/Object;)Z - public final fun getDownstream ()Ljava/util/List; - public final fun getExternalDependencies ()Ljava/util/Set; - public final fun getName-9LqIWVA ()Ljava/lang/String; - public final fun getProjectDependencies ()Ljava/util/Set; - public final fun getUpstream ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; - public final fun withDownstream ()Ljava/util/List; - public final fun withUpstream ()Ljava/util/List; -} - -public final class modulecheck/model/dependency/McConfigurationKt { - public static final fun names (Ljava/lang/Iterable;)Ljava/util/List; - public static final fun names (Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; -} - -public final class modulecheck/model/dependency/McSourceSet : java/lang/Comparable { - public synthetic fun (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lorg/jetbrains/kotlin/config/JvmTarget;Lmodulecheck/utils/lazy/LazyDeferred;Lkotlin/Lazy;Lkotlin/Lazy;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/model/dependency/McSourceSet;)I - public final fun getAnnotationProcessorConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getApiConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getCompileOnlyConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public final fun getDownstream ()Ljava/util/List; - public final fun getExternalDependencies ()Lmodulecheck/model/dependency/ExternalDependencies; - public final fun getHasExistingSourceFiles ()Z - public final fun getImplementationConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getJvmFiles ()Ljava/util/Set; - public final fun getJvmTarget ()Lorg/jetbrains/kotlin/config/JvmTarget; - public final fun getKotlinEnvironmentDeferred ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getLayoutFiles ()Ljava/util/Set; - public final fun getName-qrJCKeA ()Ljava/lang/String; - public final fun getProjectDependencies ()Lmodulecheck/model/dependency/ProjectDependencies; - public final fun getResourceFiles ()Ljava/util/Set; - public final fun getRuntimeOnlyConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getUpstream ()Ljava/util/List; - public fun toString ()Ljava/lang/String; - public final fun withDownstream ()Ljava/util/List; - public final fun withUpstream ()Ljava/util/List; -} - -public final class modulecheck/model/dependency/McSourceSetKt { - public static final fun inheritsFrom-dcwb87M (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/HasSourceSets;)Z - public static final fun names (Ljava/lang/Iterable;)Ljava/util/List; - public static final fun names (Lkotlin/sequences/Sequence;)Lkotlin/sequences/Sequence; - public static final fun sortedByInheritance (Ljava/util/Collection;)Lkotlin/sequences/Sequence; - public static final fun upstream-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/HasSourceSets;)Ljava/util/List; - public static final fun withDownStream-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/HasSourceSets;)Ljava/util/List; - public static final fun withUpstream-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/HasSourceSets;)Ljava/util/List; -} - -public abstract interface class modulecheck/model/dependency/MightHaveCodeGeneratorBinding { - public abstract fun getCodeGeneratorBindingOrNull ()Lmodulecheck/model/dependency/CodeGenerator; -} - -public abstract interface class modulecheck/model/dependency/PlatformPlugin : modulecheck/model/dependency/HasConfigurations, modulecheck/model/dependency/HasSourceSets { - public fun asAndroidOrNull ()Lmodulecheck/model/dependency/AndroidPlatformPlugin; -} - -public final class modulecheck/model/dependency/PlatformPluginKt { - public static final fun isAndroid (Lmodulecheck/model/dependency/PlatformPlugin;)Z -} - -public final class modulecheck/model/dependency/PluginAccessor { - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/model/dependency/PluginAccessor; - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public final fun getText ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/PluginDefinition { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/model/dependency/PluginDefinition; - public static synthetic fun copy$default (Lmodulecheck/model/dependency/PluginDefinition;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/model/dependency/PluginDefinition; - public fun equals (Ljava/lang/Object;)Z - public final fun getAccessors ()Ljava/util/Set; - public final fun getKotlinFunctionArgumentOrNull ()Ljava/lang/String; - public final fun getLegacyIdOrNull ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public final fun getPrecompiledAccessorOrNull ()Ljava/lang/String; - public final fun getQualifiedId ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/PluginDependency : modulecheck/model/dependency/Dependency { - public static final field Companion Lmodulecheck/model/dependency/PluginDependency$Companion; - public synthetic fun (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-HL50354 ()Ljava/lang/String; - public final fun copy-QvTcrwM (Ljava/lang/String;)Lmodulecheck/model/dependency/PluginDependency; - public static synthetic fun copy-QvTcrwM$default (Lmodulecheck/model/dependency/PluginDependency;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/model/dependency/PluginDependency; - public fun equals (Ljava/lang/Object;)Z - public final fun getAccessor-HL50354 ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/PluginDependency$Companion { - public final fun toPluginDependency-QvTcrwM (Ljava/lang/String;)Lmodulecheck/model/dependency/PluginDependency; -} - -public final class modulecheck/model/dependency/ProjectDependencies : java/util/Map, kotlin/jvm/internal/markers/KMutableMap { - public fun (Ljava/util/Map;)V - public final fun add (Lmodulecheck/model/dependency/ProjectDependency;)V - public fun clear ()V - public final fun containsKey (Ljava/lang/Object;)Z - public fun containsKey-WhtmYgw (Ljava/lang/String;)Z - public final fun containsValue (Ljava/lang/Object;)Z - public fun containsValue (Ljava/util/Set;)Z - public final fun entrySet ()Ljava/util/Set; - public final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object; - public final fun get (Ljava/lang/Object;)Ljava/util/Set; - public fun get-WhtmYgw (Ljava/lang/String;)Ljava/util/Set; - public final fun get-WkhsVnw (Ljava/lang/String;)Ljava/util/Set; - public fun getEntries ()Ljava/util/Set; - public fun getKeys ()Ljava/util/Set; - public fun getSize ()I - public fun getValues ()Ljava/util/Collection; - public fun isEmpty ()Z - public final fun keySet ()Ljava/util/Set; - public final fun main ()Ljava/util/Set; - public final fun private ()Ljava/util/Set; - public final fun public ()Ljava/util/Set; - public synthetic fun put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public fun put-KxNpj4Q (Ljava/lang/String;Ljava/util/Set;)Ljava/util/Set; - public fun putAll (Ljava/util/Map;)V - public final synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object; - public final fun remove (Ljava/lang/Object;)Ljava/util/Set; - public final fun remove (Lmodulecheck/model/dependency/ProjectDependency;)V - public fun remove-WhtmYgw (Ljava/lang/String;)Ljava/util/Set; - public final fun size ()I - public final fun values ()Ljava/util/Collection; -} - -public abstract class modulecheck/model/dependency/ProjectDependency : modulecheck/model/dependency/ConfiguredDependency, modulecheck/model/dependency/HasProjectPath { - public final fun component1-9LqIWVA ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath; - public final fun component3 ()Z - public final fun copy-9A_UJks (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;Z)Lmodulecheck/model/dependency/ProjectDependency; - public static synthetic fun copy-9A_UJks$default (Lmodulecheck/model/dependency/ProjectDependency;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZILjava/lang/Object;)Lmodulecheck/model/dependency/ProjectDependency; - public final fun declaringSourceSetName-FjqR9C0 (Lmodulecheck/model/dependency/SourceSets;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public synthetic fun getIdentifier ()Lmodulecheck/model/dependency/Identifier; - public fun getIdentifier ()Lmodulecheck/model/dependency/ProjectPath; - public fun hashCode ()I - public final fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/ProjectDependency$CodeGeneratorProjectDependency : modulecheck/model/dependency/ProjectDependency, modulecheck/model/dependency/MightHaveCodeGeneratorBinding { - public synthetic fun (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZLmodulecheck/model/dependency/CodeGenerator;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getCodeGeneratorBindingOrNull ()Lmodulecheck/model/dependency/CodeGenerator; - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public fun isTestFixture ()Z -} - -public abstract interface class modulecheck/model/dependency/ProjectDependency$Factory { - public abstract fun create-9A_UJks (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;Z)Lmodulecheck/model/dependency/ProjectDependency; -} - -public final class modulecheck/model/dependency/ProjectDependency$RuntimeProjectDependency : modulecheck/model/dependency/ProjectDependency { - public synthetic fun (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getConfigurationName-9LqIWVA ()Ljava/lang/String; - public fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public fun isTestFixture ()Z -} - -public abstract class modulecheck/model/dependency/ProjectPath : java/lang/Comparable, modulecheck/model/dependency/Identifier { - public static final field Companion Lmodulecheck/model/dependency/ProjectPath$Companion; - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/model/dependency/ProjectPath;)I - public fun equals (Ljava/lang/Object;)Z - public fun getName ()Ljava/lang/String; - public final fun getTypeSafeValue ()Ljava/lang/String; - public abstract fun getValue ()Ljava/lang/String; - public fun hashCode ()I - public abstract fun pathValue (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;)Ljava/lang/String; - public fun toString ()Ljava/lang/String; - public abstract fun toTypeSafe ()Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath; -} - -public final class modulecheck/model/dependency/ProjectPath$Companion { - public final fun from (Ljava/lang/String;)Lmodulecheck/model/dependency/ProjectPath; -} - -public final class modulecheck/model/dependency/ProjectPath$StringProjectPath : modulecheck/model/dependency/ProjectPath { - public fun (Ljava/lang/String;)V - public fun getValue ()Ljava/lang/String; - public fun pathValue (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;)Ljava/lang/String; - public fun toTypeSafe ()Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath; -} - -public final class modulecheck/model/dependency/ProjectPath$TypeSafeProjectPath : modulecheck/model/dependency/ProjectPath { - public fun (Ljava/lang/String;)V - public fun getValue ()Ljava/lang/String; - public fun pathValue (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;)Ljava/lang/String; - public fun toTypeSafe ()Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath; -} - -public abstract interface class modulecheck/model/dependency/SourceSetDependency : modulecheck/model/dependency/HasIdentifier { - public abstract fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public abstract fun isTestFixture ()Z -} - -public final class modulecheck/model/dependency/SourceSetDependency$SourceSetExternalDependency : modulecheck/model/dependency/HasMavenCoordinates, modulecheck/model/dependency/SourceSetDependency { - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-qrJCKeA ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Z - public final fun copy-0iidsrc (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lmodulecheck/model/dependency/SourceSetDependency$SourceSetExternalDependency; - public static synthetic fun copy-0iidsrc$default (Lmodulecheck/model/dependency/SourceSetDependency$SourceSetExternalDependency;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)Lmodulecheck/model/dependency/SourceSetDependency$SourceSetExternalDependency; - public fun equals (Ljava/lang/Object;)Z - public final fun getGroup ()Ljava/lang/String; - public fun getMavenCoordinates ()Lmodulecheck/model/dependency/MavenCoordinates; - public final fun getModuleName ()Ljava/lang/String; - public fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public final fun getVersion ()Ljava/lang/String; - public fun hashCode ()I - public fun isTestFixture ()Z - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/SourceSetDependency$SourceSetProjectDependency : modulecheck/model/dependency/HasProjectPath, modulecheck/model/dependency/SourceSetDependency { - public synthetic fun (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZLkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-qrJCKeA ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath; - public final fun component3 ()Z - public final fun copy-WsCknJc (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;Z)Lmodulecheck/model/dependency/SourceSetDependency$SourceSetProjectDependency; - public static synthetic fun copy-WsCknJc$default (Lmodulecheck/model/dependency/SourceSetDependency$SourceSetProjectDependency;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZILjava/lang/Object;)Lmodulecheck/model/dependency/SourceSetDependency$SourceSetProjectDependency; - public fun equals (Ljava/lang/Object;)Z - public fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public fun hashCode ()I - public fun isTestFixture ()Z - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/model/dependency/SourceSetDependencyKt { - public static final fun toSourceSetDependency-wYXeOjA (Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;)Lmodulecheck/model/dependency/SourceSetDependency; - public static synthetic fun toSourceSetDependency-wYXeOjA$default (Lmodulecheck/model/dependency/ConfiguredDependency;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/model/dependency/SourceSetDependency; -} - -public final class modulecheck/model/dependency/SourceSetNameKt { - public static final fun apiConfig-WkhsVnw (Ljava/lang/String;)Ljava/lang/String; - public static final fun implementationConfig-WkhsVnw (Ljava/lang/String;)Ljava/lang/String; - public static final fun isTestingOnly-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/SourceSets;)Z - public static final fun javaConfigurationNames-WkhsVnw (Ljava/lang/String;)Ljava/util/List; - public static final fun kaptVariant-WkhsVnw (Ljava/lang/String;)Ljava/lang/String; - public static final fun nonTestSourceSetName-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/SourceSets;)Ljava/lang/String; -} - -public final class modulecheck/model/dependency/SourceSets : java/util/Map, kotlin/jvm/internal/markers/KMappedMarker { - public fun (Ljava/util/Map;)V - public fun clear ()V - public synthetic fun compute (Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; - public fun compute-YJqa9SQ (Ljava/lang/String;Ljava/util/function/BiFunction;)Lmodulecheck/model/dependency/McSourceSet; - public synthetic fun computeIfAbsent (Ljava/lang/Object;Ljava/util/function/Function;)Ljava/lang/Object; - public fun computeIfAbsent-YJqa9SQ (Ljava/lang/String;Ljava/util/function/Function;)Lmodulecheck/model/dependency/McSourceSet; - public synthetic fun computeIfPresent (Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; - public fun computeIfPresent-YJqa9SQ (Ljava/lang/String;Ljava/util/function/BiFunction;)Lmodulecheck/model/dependency/McSourceSet; - public final fun containsKey (Ljava/lang/Object;)Z - public fun containsKey-WkhsVnw (Ljava/lang/String;)Z - public final fun containsValue (Ljava/lang/Object;)Z - public fun containsValue (Lmodulecheck/model/dependency/McSourceSet;)Z - public final fun entrySet ()Ljava/util/Set; - public final synthetic fun get (Ljava/lang/Object;)Ljava/lang/Object; - public final fun get (Ljava/lang/Object;)Lmodulecheck/model/dependency/McSourceSet; - public fun get-WkhsVnw (Ljava/lang/String;)Lmodulecheck/model/dependency/McSourceSet; - public fun getEntries ()Ljava/util/Set; - public fun getKeys ()Ljava/util/Set; - public fun getSize ()I - public fun getValues ()Ljava/util/Collection; - public fun isEmpty ()Z - public final fun keySet ()Ljava/util/Set; - public synthetic fun merge (Ljava/lang/Object;Ljava/lang/Object;Ljava/util/function/BiFunction;)Ljava/lang/Object; - public fun merge-WsCknJc (Ljava/lang/String;Lmodulecheck/model/dependency/McSourceSet;Ljava/util/function/BiFunction;)Lmodulecheck/model/dependency/McSourceSet; - public synthetic fun put (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public fun put-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/McSourceSet;)Lmodulecheck/model/dependency/McSourceSet; - public fun putAll (Ljava/util/Map;)V - public synthetic fun putIfAbsent (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public fun putIfAbsent-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/McSourceSet;)Lmodulecheck/model/dependency/McSourceSet; - public synthetic fun remove (Ljava/lang/Object;)Ljava/lang/Object; - public fun remove (Ljava/lang/Object;)Lmodulecheck/model/dependency/McSourceSet; - public fun remove (Ljava/lang/Object;Ljava/lang/Object;)Z - public synthetic fun replace (Ljava/lang/Object;Ljava/lang/Object;)Ljava/lang/Object; - public synthetic fun replace (Ljava/lang/Object;Ljava/lang/Object;Ljava/lang/Object;)Z - public fun replace-WsCknJc (Ljava/lang/String;Lmodulecheck/model/dependency/McSourceSet;Lmodulecheck/model/dependency/McSourceSet;)Z - public fun replace-YJqa9SQ (Ljava/lang/String;Lmodulecheck/model/dependency/McSourceSet;)Lmodulecheck/model/dependency/McSourceSet; - public fun replaceAll (Ljava/util/function/BiFunction;)V - public final fun size ()I - public final fun values ()Ljava/util/Collection; -} - -public final class modulecheck/model/dependency/TransitiveProjectDependency { - public fun (Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;)V - public final fun component1 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun copy (Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;)Lmodulecheck/model/dependency/TransitiveProjectDependency; - public static synthetic fun copy$default (Lmodulecheck/model/dependency/TransitiveProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;Lmodulecheck/model/dependency/ProjectDependency;ILjava/lang/Object;)Lmodulecheck/model/dependency/TransitiveProjectDependency; - public fun equals (Ljava/lang/Object;)Z - public final fun getContributed ()Lmodulecheck/model/dependency/ProjectDependency; - public final fun getSource ()Lmodulecheck/model/dependency/ProjectDependency; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; - public final fun withContributedConfiguration-WhtmYgw (Ljava/lang/String;)Lmodulecheck/model/dependency/TransitiveProjectDependency; - public static synthetic fun withContributedConfiguration-WhtmYgw$default (Lmodulecheck/model/dependency/TransitiveProjectDependency;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/model/dependency/TransitiveProjectDependency; -} - -public final class modulecheck/model/dependency/TypeSafeProjectPathResolver { - public fun (Lmodulecheck/model/dependency/AllProjectPathsProvider;)V - public final fun resolveStringProjectPath (Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath;)Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; -} - -public final class modulecheck/model/dependency/TypeSafeProjectPathResolver_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/model/dependency/TypeSafeProjectPathResolver_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/model/dependency/TypeSafeProjectPathResolver_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/model/dependency/TypeSafeProjectPathResolver; - public static final fun newInstance (Lmodulecheck/model/dependency/AllProjectPathsProvider;)Lmodulecheck/model/dependency/TypeSafeProjectPathResolver; -} - -public final class modulecheck/model/dependency/TypeSafeProjectPathResolver_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/model/dependency/TypeSafeProjectPathResolver_Factory; - public final fun newInstance (Lmodulecheck/model/dependency/AllProjectPathsProvider;)Lmodulecheck/model/dependency/TypeSafeProjectPathResolver; -} - diff --git a/modulecheck-model/dependency/api/build.gradle.kts b/modulecheck-model/dependency/api/build.gradle.kts deleted file mode 100644 index c6b16de773..0000000000 --- a/modulecheck-model/dependency/api/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-model-dependency-api" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-utils:lazy")) - - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/CodeGenerator.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/CodeGenerator.kt deleted file mode 100644 index c7b77c605c..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/CodeGenerator.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -/** - * Models a special kind of dependency, where the symbols which determine - * whether it's "used" are actually provided by a different artifact. - * - * For instance, an annotation processor `com.example.foo:foo-generator` does not have any - * declarations which show up in a library's source code. Instead, it looks for annotations - * from `com.example.foo:foo-annotations` in order to trigger code generation. So, in order - * for us to determine whether `foo-generator` is used, we must look for those annotations. If - * there are no annotations, then `foo-generator` isn't triggered and could probably be removed. - * - * N.B. Code generators often evolve over time, adding new annotations. So if a - * defined generator is throwing a false positive saying it's unused, it's best - * to first check the list of [annotationNames] to make sure it's exhaustive. - */ -interface CodeGenerator { - /** - * The human-readable name for this type of extension, - * like 'annotation processor' or 'KSP extension' - * - * @since 0.12.0 - */ - val extensionTypeName: String - - /** - * The configuration name(s) used when adding this extension to the "main" source set's - * compilation, such as `kapt`, `annotationProcessor`, `ksp`, or `anvil`. All other configuration - * names for downstream source sets are derived from these base names, like `kapt` -> `kaptTest`. - * - * This should almost always just be a single name. It's a List because - * annotations processors may be `kapt` or `annotationProcessor` depending - * upon whether they're applied to a Kotlin module or a pure Java one. - * - * @since 0.12.0 - */ - val baseConfigNames: List - - /** - * A human-readable, descriptive name for this specific compiler - * extension, such as 'Hilt Android' or 'Moshi Kotlin codegen (KSP)'. - * - * This name doesn't strictly need to be unique, but that's probably a good idea. For instance, - * instead of two extensions named 'Room', we have 'Room (annotation processor)' and 'Room (KSP)'. - * - * @since 0.12.0 - */ - val name: String - - /** - * This is the .jar for the compiler library, not the Gradle plugin. For - * instance, `androidx.room:room-compiler` or `com.squareup.anvil:compiler`. - * - * For KSP, annotation processors, and Anvil, the extensions are typically added in the - * build file like `kapt("com.example.foo:compiler:1.2.3")`. For a Kotlin compiler plugin, - * this will probably be an "invisible" dependency added via the library's Gradle plugin. - * - * @since 0.12.0 - */ - val generatorMavenCoordinates: String - - /** - * The *fully qualified* names of all annotations which make this compiler - * extension do something -- typically code generation or perhaps static analysis. - * - * For instance, `androidx.room.Database` triggers compilation - * for the Room compiler, so it would be included in this list. - * - * The annotations don't necessarily need to come from the same library, so - * long as the compiler extension looks for them. For instance, `javax.Inject` - * is included in the list of annotations for both Anvil and Dagger. - * - * On the other hand, an annotation from the library does not need to be - * listed just because it's an annotation. An example of this would be - * `tangle.inject.InternalTangleApi`, which is not used by the compiler. - * - * @since 0.12.0 - */ - val annotationNames: List -} - -fun List.asMap(): Map = - associateBy { it.generatorMavenCoordinates } - -/** - * Indicates that some type (probably a - * [ConfiguredDependency][modulecheck.parsing.gradle.model.ConfiguredDependency]) - * is associated with an established [CodeGenerator]. - * - * @since 0.12.0 - */ -interface MightHaveCodeGeneratorBinding { - /** - * The [CodeGenerator] if it is defined, or null. - * - * @since 0.12.0 - */ - val codeGeneratorBindingOrNull: CodeGenerator? -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfigFactory.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfigFactory.kt deleted file mode 100644 index 795731c367..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfigFactory.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.utils.decapitalize -import modulecheck.utils.mapToSet - -class ConfigFactory( - private val identifier: T.() -> String, - private val projectDependencies: T.() -> Set, - private val externalDependencies: T.() -> Set, - private val allFactory: () -> Sequence, - private val extendsFrom: String.() -> List -) { - fun create(t: T): McConfiguration { - - return McConfiguration( - name = t.identifier().asConfigurationName(), - projectDependencies = projectDependencies(t), - externalDependencies = externalDependencies(t), - upstreamSequence = t.withUpstream() - .drop(1) - .map { create(it) }, - downstreamSequence = t.withDownstream() - .drop(1) - .map { create(it) } - ) - } - - private fun T.withUpstream(): Sequence { - - return generateSequence(sequenceOf(this)) { configurations -> - configurations - .flatMap { t -> - - val identifier = t.identifier() - - if (identifier.startsWith("testFixtures")) { - identifier.removePrefix("testFixtures") - .decapitalize() - .extendsFrom() - .plus(identifier.extendsFrom()) - } else { - identifier.extendsFrom() - } - } - .takeIf { it.iterator().hasNext() } - } - .flatten() - .distinct() - } - - private fun T.withDownstream(): Sequence { - return generateSequence(sequenceOf(this)) { configurations -> - configurations - .flatMap { config -> - allFactory() - .filter { otherConfig -> - otherConfig.identifier() - .extendsFrom() - .mapToSet { it.identifier() } - .contains(config.identifier()) - } - } - .takeIf { it.iterator().hasNext() } - } - .flatten() - .distinct() - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfigurationName.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfigurationName.kt deleted file mode 100644 index e1d01057ed..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfigurationName.kt +++ /dev/null @@ -1,337 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.asSourceSetName -import modulecheck.utils.capitalize -import modulecheck.utils.decapitalize - -/** - * Wraps the unqualified, simple name of a Gradle - * Configuration, like `implementation` or `debugApi`. - * - * @property value the name - */ -@JvmInline -value class ConfigurationName(val value: String) : Comparable { - - /** - * Strips the "base Configuration name" (`api`, `implementation`, `compileOnly`, - * `runtimeOnly`) from an aggregate name like `debugImplementation`. - * - * examples: - * - * ``` - * Config SourceSet - * | api | main - * | compileOnlyApi | main - * | implementation | main - * | debugImplementation | debug - * | testImplementation | test - * | internalReleaseImplementation | internalRelease - * ``` - * - * @return the name of the source set used with this configuration, wrapped in [SourceSetName] - */ - fun toSourceSetName(): SourceSetName = when (this.value) { - // "main" source set configurations omit the "main" from their name, - // creating "implementation" instead of "mainImplementation" - in mainConfigurations -> SourceSetName.MAIN - // all other configurations (like "test", "debug", or "androidTest") - // are just "$sourceSetName${baseConfigurationName.capitalize()}" - else -> this.value.extractSourceSetName() - } - - /** - * Returns the base name of the Configuration without any source set prefix. - * - * For "main" source sets, this function just returns the same string, - * e.g.: ConfigurationName("api").nameWithoutSourceSet() == "api" - * ConfigurationName("implementation").nameWithoutSourceSet() == "implementation" - * - * For other source sets, it returns the base configuration names: - * ConfigurationName("debugApi").nameWithoutSourceSet() == "Api" - * ConfigurationName("testImplementation").nameWithoutSourceSet() == "Implementation" - * - * @since 0.12.0 - */ - fun nameWithoutSourceSet(): String { - return when { - isKapt() -> ConfigurationName.kapt.value - else -> value.removePrefix(toSourceSetName().value) - } - } - - /** - * Returns the base name of the Configuration without any source set prefix. - * - * For "main" source sets, this function just returns the same string, - * e.g.: ConfigurationName("api").nameWithoutSourceSet() == "api" - * ConfigurationName("implementation").nameWithoutSourceSet() == "implementation" - * - * For other source sets, it returns the base configuration names: - * ConfigurationName("debugApi").nameWithoutSourceSet() == "Api" - * ConfigurationName("testImplementation").nameWithoutSourceSet() == "Implementation" - * - * @since 0.12.0 - */ - fun switchSourceSet(newSourceSetName: SourceSetName): ConfigurationName { - - return when { - isKapt() -> ConfigurationName( - "${nameWithoutSourceSet()}${newSourceSetName.value.capitalize()}" - ) - - else -> ConfigurationName( - "${newSourceSetName.value}${nameWithoutSourceSet().capitalize()}" - ) - } - } - - /** - * find the "base" configuration name and remove it - * - * For instance, `debugCompileOnly` would find the "CompileOnly" - * and remove it, returning "debug" as the sourceSet name - * - * @since 0.12.0 - */ - private fun String.extractSourceSetName(): SourceSetName { - // All kapt configurations start with `kapt` - // - // Config SourceSet - // | kaptAndroidTest | androidTest - // | kaptTest | test - // | kapt | main - // etc. - if (this.startsWith(kapt.value)) { - return removePrefix(kapt.value) - .decapitalize() - .asSourceSetName() - } - - // All the base JVM configurations omit "main" from their configuration name - // - // Config SourceSet - // | api | main - // | compileOnlyApi | main - // | implementation | main - // etc. - val configType = mainConfigurationsCapitalized - .find { this.endsWith(it) } - ?: return asSourceSetName() - - // For any other configuration, the formula is $sourceSetName${baseConfigurationName.capitalize()} - // - // Config SourceSet - // | debugApi | debug - // | releaseCompileOnly | release - // | testImplementation | test - // etc. - return removeSuffix(configType) - .decapitalize() - .asSourceSetName() - } - - /** - * Returns the '-api' version of the current configuration. - * - * In Returns | api | api | implementation | api | compileOnly | api | testImplementation - * | testApi | debug | debugApi | androidTestImplementation | androidTestApi - * - * @return for any main/common configuration, just returns `api`. For any - * other configuration, it returns the [SourceSetName] appended with `Api`. - * @since 0.12.0 - */ - fun apiVariant(): ConfigurationName = toSourceSetName().apiConfig() - - /** - * Returns the '-implementation' version of the current configuration. - * - * In Returns | implementation | implementation | implementation | implementation - * | compileOnly | implementation | testImplementation | testImplementation | debug - * | debugImplementation | androidTestImplementation | androidTestImplementation - * - * @return for any main/common configuration, just returns `implementation`. For any - * other configuration, it returns the [SourceSetName] appended with `Implementation`. - * @since 0.12.0 - */ - fun implementationVariant(): ConfigurationName = toSourceSetName().implementationConfig() - - /** - * Returns the 'kapt-' version of the current configuration. - * - * @return for any main/common configuration, just returns `kapt`. For any - * other configuration, it returns `kapt` appended with the [SourceSetName]. - * @since 0.12.0 - */ - fun kaptVariant(): ConfigurationName = toSourceSetName().kaptVariant() - - /** - * @return true if the configuration is an `api` variant - * @since 0.12.0 - */ - fun isApi(): Boolean = this == apiVariant() - - /** - * @return true if the configuration is an `implementation` variant - * @since 0.12.0 - */ - fun isImplementation(): Boolean = this == implementationVariant() - - /** - * @return true if the configuration is a `kapt` variant - * @since 0.12.0 - */ - fun isKapt(): Boolean = this == kaptVariant() - - override fun compareTo(other: ConfigurationName): Int { - return value.compareTo(other.value) - } - - override fun toString(): String = "(ConfigurationName) `$value`" - - companion object { - - /** name of the 'androidTestImplementation' configuration */ - val androidTestImplementation: ConfigurationName = - ConfigurationName("androidTestImplementation") - - /** name of the 'annotationProcessor' configuration */ - val annotationProcessor: ConfigurationName = ConfigurationName("annotationProcessor") - - /** name of the 'anvil' configuration */ - val anvil: ConfigurationName = ConfigurationName("anvil") - - /** name of the 'api' configuration */ - val api: ConfigurationName = ConfigurationName("api") - - /** name of the 'compile' configuration */ - val compile: ConfigurationName = ConfigurationName("compile") - - /** name of the 'compileOnly' configuration */ - val compileOnly: ConfigurationName = ConfigurationName("compileOnly") - - /** name of the 'compileOnlyApi' configuration */ - val compileOnlyApi: ConfigurationName = ConfigurationName("compileOnlyApi") - - /** name of the 'implementation' configuration */ - val implementation: ConfigurationName = ConfigurationName("implementation") - - /** name of the 'kapt' configuration */ - val kapt: ConfigurationName = ConfigurationName("kapt") - - /** name of the 'kotlinCompilerPluginClasspathMain' configuration */ - val kotlinCompileClasspath: ConfigurationName = - ConfigurationName("kotlinCompilerPluginClasspathMain") - - /** name of the 'ksp' configuration */ - val ksp: ConfigurationName = ConfigurationName("ksp") - - /** name of the 'runtime' configuration */ - val runtime: ConfigurationName = ConfigurationName("runtime") - - /** name of the 'runtimeOnly' configuration */ - val runtimeOnly: ConfigurationName = ConfigurationName("runtimeOnly") - - /** name of the 'testApi' configuration */ - val testApi: ConfigurationName = ConfigurationName("testApi") - - /** name of the 'testImplementation' configuration */ - val testImplementation: ConfigurationName = ConfigurationName("testImplementation") - - /** */ - val mainConfigurations: List = listOf( - api.value, - compile.value, - compileOnly.value, - compileOnlyApi.value, - implementation.value, - kapt.value, - // kotlinCompilerPluginClasspath is a special case, - // since the main config is suffixed with "Main" - kotlinCompileClasspath.value, - runtime.value, - runtimeOnly.value - ) - // The order of this list matters. CompileOnlyApi must be before `api` or - // `extractSourceSetName` below will match the wrong suffix. - .sortedByDescending { it.length } - - internal val mainCommonConfigurations: List = listOf( - api.value, - implementation.value - ) - - private val mainConfigurationsCapitalized: Set = mainConfigurations - .map { it.capitalize() } - .toSet() - - /** the names of all configurations consumed by the main source set */ - fun main(): List = listOf( - compileOnlyApi, - api, - implementation, - compileOnly, - compile, - kapt, - runtimeOnly, - runtime - ) - - /** - * the base configurations which do not leak their transitive dependencies (basically not `api`) - */ - fun private(): List = listOf( - implementation, - compileOnly, - compile, - runtimeOnly, - runtime - ) - - /** - * the base configurations which include their dependencies as "compile" dependencies in the POM - */ - fun public(): List = listOf( - compileOnlyApi, - api - ) - } -} - -/** @return a ConfigurationName from this raw string */ -fun String.asConfigurationName(): ConfigurationName = ConfigurationName(this) - -fun Map>.main(): List { - return listOfNotNull( - get(ConfigurationName.api), - get(ConfigurationName.compileOnly), - get(ConfigurationName.implementation), - get(ConfigurationName.runtimeOnly) - ).flatten() -} - -/** @return all source set names from this configuration names, without duplicates */ -fun Iterable.distinctSourceSetNames(): List = - map { it.toSourceSetName() } - .distinct() - -/** @return all source set names from this configuration names, without duplicates */ -fun Sequence.distinctSourceSetNames(): Sequence = - map { it.toSourceSetName() } - .distinct() diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfiguredDependency.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfiguredDependency.kt deleted file mode 100644 index 2d6f976e7c..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ConfiguredDependency.kt +++ /dev/null @@ -1,96 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -sealed interface ConfiguredDependency : Dependency { - - val configurationName: ConfigurationName - - /** - * The path/id/coordinates of the dependency. - * - * For a [ProjectDependency], this is a Gradle path like `:common:ui:widgets`. - * - * For an [ExternalDependency], this is the Maven coordinates with - * or without a version, like `com.example.foo:ui-widgets:1.0.0`. - * - * @since 0.12.0 - */ - val identifier: Identifier - - /** - * Is the dependency being invoked via `testFixtures(project(...))`? - * - * @since 0.12.0 - */ - val isTestFixture: Boolean - - /** */ - companion object { - - inline fun T.copy( - configurationName: ConfigurationName = this.configurationName, - isTestFixture: Boolean = this.isTestFixture - ): ConfiguredDependency { - return when (val dep: ConfiguredDependency = this@copy) { - is ExternalDependency -> dep.copy( - configurationName = configurationName, - group = dep.group, - moduleName = dep.moduleName, - version = dep.version, - isTestFixture = isTestFixture - ) - - is ProjectDependency -> dep.copy( - configurationName = configurationName, - path = dep.projectPath, - isTestFixture = isTestFixture - ) - } - } - } -} - -sealed interface Dependency - -/** - * [https://docs.gradle.org/current/userguide/plugins.html#sec:binary_plugins] - * - * @property accessor Could be any of: - * - * - standard `id` invocations - * - `id 'org.jetbrains.kotlin.kapt'` (groovy) or `id("org.jetbrains.kotlin.kapt")` (kotlin) - * - `id 'kotlin-kapt'` (groovy) or `id("kotlin-kapt")` (kotlin) - * - precompiled accessor for Gradle plugins or `buildSrc` - * - `java`, `maven-publish`, `my-convention-plugin` - * - function invocations for Kotlin libraries in the Kotlin DSL only - * - `kotlin("kapt")` - * - alias invocations for Gradle's type-safe catalogs - * - `alias(libs.plugins.anvil)` - * @since 0.12.0 - */ -data class PluginDependency( - val accessor: PluginAccessor -) : Dependency { - /** */ - companion object { - /** - * @return a [PluginDependency] wrapping the [PluginAccessor] receiver - * @since 0.12.0 - */ - fun PluginAccessor.toPluginDependency(): PluginDependency = PluginDependency(this) - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/DownstreamDependency.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/DownstreamDependency.kt deleted file mode 100644 index 7a799cc596..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/DownstreamDependency.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -data class DownstreamDependency( - val dependentProjectPath: ProjectPath.StringProjectPath, - val projectDependency: ProjectDependency -) diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ExternalDependencies.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ExternalDependencies.kt deleted file mode 100644 index 06e8f55b8e..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ExternalDependencies.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.utils.filterToSet -import modulecheck.utils.flatMapToSet - -class ExternalDependencies( - map: Map> -) : MutableMap> by map.toMutableMap() { - fun main(): Set = ConfigurationName.main() - .flatMapToSet { configurationName -> - get(configurationName).orEmpty() - } - - fun public(): Set = ConfigurationName.public() - .flatMapToSet { configurationName -> - get(configurationName).orEmpty() - } - - fun private(): Set = ConfigurationName.private() - .flatMapToSet { configurationName -> - get(configurationName).orEmpty() - } - - operator fun get(sourceSetName: SourceSetName): Set { - return sourceSetName.javaConfigurationNames().flatMapToSet { get(it).orEmpty() } - } - - fun add(dependency: ExternalDependency) { - val oldDependencies = get(dependency.configurationName).orEmpty() - put(dependency.configurationName, oldDependencies + dependency) - } - - fun remove(dependency: ExternalDependency) { - val oldDependencies = get(dependency.configurationName).orEmpty() - put(dependency.configurationName, oldDependencies.filterToSet { it != dependency }) - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ExternalDependency.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ExternalDependency.kt deleted file mode 100644 index aaa9a9d705..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ExternalDependency.kt +++ /dev/null @@ -1,142 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.utils.lazy.unsafeLazy - -sealed class ExternalDependency : - ConfiguredDependency, - HasMavenCoordinates { - abstract val group: String? - abstract val moduleName: String - abstract val version: String? - - override val mavenCoordinates: MavenCoordinates by unsafeLazy { - MavenCoordinates( - group = group, - moduleName = moduleName, - version = version - ) - } - override val identifier: MavenCoordinates by unsafeLazy { mavenCoordinates } - val nameWithVersion: String by unsafeLazy { "${group.orEmpty()}:$moduleName:${version.orEmpty()}" } - val nameWithoutVersion: String by unsafeLazy { "${group.orEmpty()}:$moduleName" } - - class ExternalRuntimeDependency( - override val configurationName: ConfigurationName, - override val group: String?, - override val moduleName: String, - override val version: String?, - override val isTestFixture: Boolean - ) : ExternalDependency() - - class ExternalCodeGeneratorDependency( - override val configurationName: ConfigurationName, - override val group: String?, - override val moduleName: String, - override val version: String?, - override val isTestFixture: Boolean, - override val codeGeneratorBindingOrNull: CodeGenerator? - ) : ExternalDependency(), MightHaveCodeGeneratorBinding - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ExternalDependency - - if (configurationName != other.configurationName) return false - if (group != other.group) return false - if (moduleName != other.moduleName) return false - if (version != other.version) return false - - return true - } - - override fun hashCode(): Int { - var result = javaClass.hashCode() - result = 31 * result + configurationName.hashCode() - result = 31 * result + group.hashCode() - result = 31 * result + moduleName.hashCode() - result = 31 * result + version.hashCode() - return result - } - - /** - * Let's pretend this is a data class. - * - * @since 0.12.0 - */ - fun copy( - configurationName: ConfigurationName = this.configurationName, - group: String? = this.group, - moduleName: String = this.moduleName, - version: String? = this.version, - isTestFixture: Boolean = this.isTestFixture - ): ExternalDependency { - return when (this) { - is ExternalRuntimeDependency -> ExternalRuntimeDependency( - configurationName = configurationName, - group = group, - moduleName = moduleName, - version = version, - isTestFixture = isTestFixture - ) - - is ExternalCodeGeneratorDependency -> ExternalCodeGeneratorDependency( - configurationName = configurationName, - group = group, - moduleName = moduleName, - version = version, - isTestFixture = isTestFixture, - codeGeneratorBindingOrNull = codeGeneratorBindingOrNull - ) - } - } - - override fun toString(): String { - - val declaration = if (isTestFixture) { - "${configurationName.value}(testFixtures(\"${nameWithVersion}\"))" - } else { - "${configurationName.value}(\"${nameWithVersion}\")" - } - - return "${javaClass.simpleName}( $declaration )" - } - - /** - * Creates an [ExternalDependency] for given arguments, a - * `List` to look up a [CodeGenerator] in the event - * that the project dependency in question is an annotation processor. - * - * @since 0.12.0 - */ - fun interface Factory { - - /** - * @return the [ProjectDependency] for this dependency declaration - * @since 0.12.0 - */ - fun create( - configurationName: ConfigurationName, - group: String?, - moduleName: String, - version: String?, - isTestFixture: Boolean - ): ExternalDependency - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/HasConfigurations.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/HasConfigurations.kt deleted file mode 100644 index 53151b0724..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/HasConfigurations.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -interface HasConfigurations { - val configurations: Configurations -} - -interface HasDependencies { - val projectDependencies: ProjectDependencies - val externalDependencies: ExternalDependencies -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/HasIdentifier.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/HasIdentifier.kt deleted file mode 100644 index 54cfa2d587..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/HasIdentifier.kt +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -/** Something associated with a specific [ProjectPath][modulecheck.model.dependency.ProjectPath]. */ -interface HasProjectPath : HasIdentifier { - val projectPath: ProjectPath - override val identifier: Identifier get() = projectPath -} - -interface HasIdentifier { - val identifier: Identifier -} - -interface HasMavenCoordinates : HasIdentifier { - val mavenCoordinates: MavenCoordinates - override val identifier: Identifier get() = mavenCoordinates -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/MavenCoordinates.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/MavenCoordinates.kt deleted file mode 100644 index b76632b99b..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/MavenCoordinates.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.utils.lazy.unsafeLazy - -data class MavenCoordinates( - /** - * In `com.google.dagger:dagger:2.32`, this is `com.google.dagger:__:__`. - * - * @since 0.12.0 - */ - val group: String?, - - /** - * In `com.google.dagger:dagger:2.32`, this is `__:dagger:__`. - * - * @since 0.12.0 - */ - val moduleName: String, - - /** - * In `com.google.dagger:dagger:2.32`, this is `__:__:2.32`. - * - * @since 0.12.0 - */ - val version: String? -) : Identifier, Comparable { - - override val name: String by unsafeLazy { "${group.orEmpty()}:$moduleName:${version.orEmpty()}" } - - companion object { - - private val MATCHER = """([\w\.]+):([\w\-]+):([\w\.]+)""".toRegex() - - fun parseOrNull(coordinateString: String): MavenCoordinates? { - return MATCHER.find(coordinateString) - ?.destructured - ?.let { (group, moduleName, version) -> - MavenCoordinates(group, moduleName, version) - } - } - } - - override fun compareTo(other: MavenCoordinates): Int { - return name.compareTo(other.name) - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as MavenCoordinates - - if (group != other.group) return false - if (moduleName != other.moduleName) return false - // if either version is null (or both), that's a wildcard, and they match - if (version != null && other.version != null && version != other.version) return false - - return true - } - - override fun hashCode(): Int { - var result = group?.hashCode() ?: 0 - result = 31 * result + moduleName.hashCode() - result = 31 * result + (version?.hashCode() ?: 0) - return result - } -} - -sealed interface Identifier { - val name: String -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/McConfiguration.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/McConfiguration.kt deleted file mode 100644 index e3e206427f..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/McConfiguration.kt +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -/** Cache of [configurations][McConfiguration], probably at the project level. */ -class Configurations( - delegate: Map -) : Map by delegate { - - override fun toString(): String { - return toList().joinToString("\n") - } -} - -data class McConfiguration( - val name: ConfigurationName, - val projectDependencies: Set, - val externalDependencies: Set, - private val upstreamSequence: Sequence, - private val downstreamSequence: Sequence -) { - - /** - * @return list of all other configurations which this configuration depends upon. - * The list is breadth-first, with the most-downstream configurations being last. - */ - val upstream: List by lazy { upstreamSequence.toList() } - - /** - * @return list of all other configurations which depend upon this configuration. - * The list is breadth-first, with the most-downstream configurations being last. - */ - val downstream: List by lazy { downstreamSequence.toList() } - - /** - * @return list of this configuration and all other configurations which it depends - * upon. The list is breadth-first, with the most-upstream configurations being last. - */ - fun withUpstream(): List = listOf(this) + upstream - - /** - * @return list of this configuration and all other configurations which depend upon - * it. The list is breadth-first, with the most-downstream configurations being last. - */ - fun withDownstream(): List = listOf(this) + downstream - - override fun toString(): String { - return """Config -- name=${name.value} - | upstream=${upstream.map { it.name.value }} - | downstream=${downstream.map { it.name.value }} - |) - """.trimMargin() - } -} - -/** convenience for `map { it.name }` */ -fun Iterable.names(): List = map { it.name } - -/** convenience for `map { it.name }` */ -fun Sequence.names(): Sequence = map { it.name } diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/McSourceSet.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/McSourceSet.kt deleted file mode 100644 index c6277c661b..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/McSourceSet.kt +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.KotlinEnvironment -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.sequenceOfNotNull -import org.jetbrains.kotlin.config.JvmTarget -import java.io.File - -interface HasSourceSets { - val sourceSets: SourceSets -} - -/** Cache of [sourceSets][McSourceSet], probably at the project level. */ -class SourceSets( - delegate: Map -) : Map by delegate - -/** - * Models all the particulars for a compilation unit, roughly equivalent - * to the source set models in AGP, KGP, and the Java Gradle Plugin. - * - * @property name the name of this source set, like 'main' or 'internalRelease' - * @property compileOnlyConfiguration the configuration name of this source set's 'compileOnly' - * configuration, like 'compileOnly' for 'main' or 'debugCompileOnly' for 'debug' - * @property apiConfiguration the configuration name of this source set's - * 'api' configuration, like 'api' for 'main' or 'debugApi' for 'debug' - * @property implementationConfiguration the configuration name - * of this source set's 'implementation' configuration, like - * 'implementation' for 'main' or 'debugImplementation' for 'debug' - * @property runtimeOnlyConfiguration the configuration name of this source set's 'runtimeOnly' - * configuration, like 'runtimeOnly' for 'main' or 'debugRuntimeOnly' for 'debug' - * @property annotationProcessorConfiguration the configuration name - * of this source set's 'annotationProcessor' configuration, like - * 'annotationProcessor' for 'main' or 'debugAnnotationProcessor' for 'debug' - * @property jvmFiles all java/kotlin/scala/groovy files in this source set - * @property resourceFiles all xml 'res' files for this source set - * @property layoutFiles all android layout files for - * this source set. This is a subset of [resourceFiles]. - * @property jvmTarget the Java version used when compiling this source set - * @property kotlinEnvironmentDeferred the kotlin environment - * used for "compiling" and parsing this source set - * @param upstreamLazy all source sets upstream of - * this one, like `main` if this source set is `test` - * @param downstreamLazy all source sets downstream of - * this one, like `test` if this source set is `main` - * @since 0.12.0 - */ -class McSourceSet( - val name: SourceSetName, - val compileOnlyConfiguration: McConfiguration, - val apiConfiguration: McConfiguration?, - val implementationConfiguration: McConfiguration, - val runtimeOnlyConfiguration: McConfiguration, - val annotationProcessorConfiguration: McConfiguration?, - val jvmFiles: Set, - val resourceFiles: Set, - val layoutFiles: Set, - val jvmTarget: JvmTarget, - val kotlinEnvironmentDeferred: LazyDeferred, - private val upstreamLazy: Lazy>, - private val downstreamLazy: Lazy> -) : Comparable { - - val configurations: Configurations by lazy { - Configurations( - sequenceOfNotNull( - compileOnlyConfiguration, - apiConfiguration, - implementationConfiguration, - runtimeOnlyConfiguration, - annotationProcessorConfiguration - ).associateBy { it.name } - ) - } - - val projectDependencies: ProjectDependencies by lazy { - ProjectDependencies( - configurations.mapValues { (_, configuration) -> - configuration.projectDependencies - } - ) - } - - val externalDependencies: ExternalDependencies by lazy { - ExternalDependencies( - configurations.mapValues { (_, configuration) -> - configuration.externalDependencies - } - ) - } - - /** - * upstream source set names - * - * @since 0.12.0 - */ - val upstream: List by upstreamLazy - - /** - * downstream source set names - * - * @since 0.12.0 - */ - val downstream: List by downstreamLazy - - fun withUpstream(): List = listOf(name) + upstream - fun withDownstream(): List = listOf(name) + downstream - - val hasExistingSourceFiles: Boolean by lazy { - jvmFiles.hasExistingFiles() || - resourceFiles.hasExistingFiles() || - layoutFiles.hasExistingFiles() - } - - private fun Set.hasExistingFiles(): Boolean { - return any { dir -> - dir.walkBottomUp() - .any { file -> file.isFile && file.exists() } - } - } - - /** - * If one source set extends another, then the extended one should come before it in a collection. - * For instance, in [withUpstream] for `TestDebug`, the list would be `[main, debug, testDebug]`. - * - * If two source sets are siblings (neither extends the other, such as in build - * flavors from different dimensions), then they should be sorted alphabetically - * (by name). The alphabetical sort just ensures that all lists are stable. - * - * @since 0.12.0 - */ - override fun compareTo(other: McSourceSet): Int { - - if (this == other) return 0 - - return when { - upstream.contains(other.name) -> 1 - other.upstream.contains(name) -> -1 - else -> name.value.compareTo(other.name.value) - } - } - - override fun toString(): String { - return """SourceSet( - | name=$name, - | compileOnlyConfiguration=$compileOnlyConfiguration, - | apiConfiguration=$apiConfiguration, - | implementationConfiguration=$implementationConfiguration, - | runtimeOnlyConfiguration=$runtimeOnlyConfiguration, - | kaptConfiguration=$annotationProcessorConfiguration, - | jvmFiles=$jvmFiles, - | resourceFiles=$resourceFiles, - | layoutFiles=$layoutFiles, - | upstreamLazy=${upstreamLazy.value.map { it.value }}, - | downstreamLazy=${downstreamLazy.value.map { it.value }} - |) - """.trimMargin() - } -} - -fun Iterable.names(): List = map { it.name } -fun Sequence.names(): Sequence = map { it.name } - -fun Collection.sortedByInheritance(): Sequence { - - val pending = sortedBy { it.upstream.size }.toMutableList() - val history = mutableSetOf() - - return generateSequence { - - pending.firstOrNull { pendingSourceSet -> - // find the first SourceSet where everything upstream has already been yielded to the sequence - pendingSourceSet.upstream.isEmpty() || pendingSourceSet.upstream.all { history.contains(it) } - } - ?.also { - history.add(it.name) - pending.remove(it) - } - } -} - -/** Upstream source set names **not** including the receiver name. */ -fun SourceSetName.upstream(hasSourceSets: HasSourceSets): List = - hasSourceSets.sourceSets[this] - ?.upstream - .orEmpty() - -/** - * Upstream source set names *including the receiver name.* - * - * ### Ordering - * - * Order is based upon proximity to the receiver name. This is a breadth-first traversal - * of a directed graph where the receiver [SourceSetName] is the root. The first - * returned name is the receiver, followed by the source sets it directly inherits. - */ -fun SourceSetName.withUpstream(hasSourceSets: HasSourceSets): List = - hasSourceSets.sourceSets[this] - ?.withUpstream() - .orEmpty() - -fun SourceSetName.withDownStream(hasSourceSets: HasSourceSets): List = - hasSourceSets.sourceSets[this] - ?.withDownstream() - .orEmpty() - -fun SourceSetName.inheritsFrom(other: SourceSetName, hasSourceSets: HasSourceSets): Boolean { - - // SourceSets can't inherit from themselves, so quit early and skip some lookups. - if (this == other) return false - - return hasSourceSets.sourceSets[this] - ?.upstream - ?.contains(other) - ?: false -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/PlatformPlugin.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/PlatformPlugin.kt deleted file mode 100644 index 4249de49dc..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/PlatformPlugin.kt +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.UnqualifiedAndroidResource -import java.io.File -import kotlin.contracts.contract - -/** - * This represents the *prevailing* build/platform plugin for a given module. - * - * In JVM platform projects, the Kotlin jvm plugin automatically applies the `java-library` - * plugin, but the latter is really just an implementation detail for Kotlin. - * - * In Android projects, the Kotlin Android plugin *must* be added in order - * to use Kotlin. In this case, kotlin is the implementation detail, since - * it's just enabling kotlin compilation in the build configured by AGP. - * - * @since 0.12.0 - */ -sealed interface PlatformPlugin : HasConfigurations, HasSourceSets { - - fun asAndroidOrNull(): AndroidPlatformPlugin? = this as? AndroidPlatformPlugin -} - -fun PlatformPlugin.isAndroid(): Boolean { - - contract { - returns(true) implies (this@isAndroid is AndroidPlatformPlugin) - } - - return this is AndroidPlatformPlugin -} - -sealed interface JvmPlatformPlugin : PlatformPlugin { - - data class JavaLibraryPlugin( - override val sourceSets: SourceSets, - override val configurations: Configurations - ) : JvmPlatformPlugin - - data class KotlinJvmPlugin( - override val sourceSets: SourceSets, - override val configurations: Configurations - ) : JvmPlatformPlugin -} - -sealed interface AndroidPlatformPlugin : PlatformPlugin { - - val nonTransientRClass: Boolean - val viewBindingEnabled: Boolean - val kotlinAndroidExtensionEnabled: Boolean - val manifests: Map - - /** - * Base packages as defined via the AGP DSL. There are only two versions - * - the "main" `namespace` which is the default for everything, and `testNamespace` - * which is applied to all `test` and `androidTest` source sets. - */ - val namespaces: Map - - /** - * All resource declarations -- without a package -- grouped by [SourceSetName] - * - * @since 0.12.0 - */ - val resValues: Map> - - interface CanDisableAndroidResources { - val androidResourcesEnabled: Boolean - } - - interface CanDisableAndroidBuildConfig { - val buildConfigEnabled: Boolean - } - - class AndroidApplicationPlugin( - override val sourceSets: SourceSets, - override val configurations: Configurations, - override val nonTransientRClass: Boolean, - override val viewBindingEnabled: Boolean, - override val kotlinAndroidExtensionEnabled: Boolean, - override val manifests: Map, - override val namespaces: Map, - resValuesLazy: Lazy>> - ) : PlatformPlugin, AndroidPlatformPlugin { - override val resValues: Map> by resValuesLazy - } - - class AndroidLibraryPlugin( - override val sourceSets: SourceSets, - override val configurations: Configurations, - override val nonTransientRClass: Boolean, - override val viewBindingEnabled: Boolean, - override val kotlinAndroidExtensionEnabled: Boolean, - override val manifests: Map, - override val namespaces: Map, - override val androidResourcesEnabled: Boolean, - override val buildConfigEnabled: Boolean, - resValuesLazy: Lazy>> - ) : PlatformPlugin, - AndroidPlatformPlugin, - CanDisableAndroidResources, - CanDisableAndroidBuildConfig { - override val resValues: Map> by resValuesLazy - } - - class AndroidDynamicFeaturePlugin( - override val sourceSets: SourceSets, - override val configurations: Configurations, - override val nonTransientRClass: Boolean, - override val viewBindingEnabled: Boolean, - override val kotlinAndroidExtensionEnabled: Boolean, - override val manifests: Map, - override val namespaces: Map, - override val buildConfigEnabled: Boolean, - resValuesLazy: Lazy>> - ) : PlatformPlugin, - AndroidPlatformPlugin, - CanDisableAndroidBuildConfig { - override val resValues: Map> by resValuesLazy - } - - class AndroidTestPlugin( - override val sourceSets: SourceSets, - override val configurations: Configurations, - override val nonTransientRClass: Boolean, - override val viewBindingEnabled: Boolean, - override val kotlinAndroidExtensionEnabled: Boolean, - override val manifests: Map, - override val namespaces: Map, - override val buildConfigEnabled: Boolean, - resValuesLazy: Lazy>> - ) : PlatformPlugin, - AndroidPlatformPlugin, - CanDisableAndroidBuildConfig { - override val resValues: Map> by resValuesLazy - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/PluginDefinition.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/PluginDefinition.kt deleted file mode 100644 index cbe11bbd46..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/PluginDefinition.kt +++ /dev/null @@ -1,92 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.utils.mapToSet - -/** - * [https://docs.gradle.org/current/userguide/plugins.html#sec:binary_plugins] - * - * @property name A descriptive name for this plugin, - * such as 'Kotlin kapt' or 'Android Gradle Plugin' - * @property qualifiedId The canonical ID for the plugin, like `org.jetbrains.kotlin.kapt` - * @property legacyIdOrNull An older, "legacy" ID for the plugin like `kotlin-kapt` - * @property precompiledAccessorOrNull A special accessor invoked - * like a property, with or without backticks, like `base`. - * @property kotlinFunctionArgumentOrNull The `kotlin(...)` function used - * for official libraries in Kotlin DSL files, like `kotlin("kapt")`. - * @since 0.12.0 - */ -data class PluginDefinition( - val name: String, - val qualifiedId: String, - val legacyIdOrNull: String?, - val precompiledAccessorOrNull: String?, - val kotlinFunctionArgumentOrNull: String? -) { - /** - * All possible variations on an accessor for this plugin's ID. - * - * @since 0.12.0 - */ - val accessors: Set by lazy { - - buildList { - add("id(\"$qualifiedId\")") - add("id \"$qualifiedId\"") - add("id '$qualifiedId'") - - if (legacyIdOrNull != null) { - add("id(\"$legacyIdOrNull\")") - add("id \"$legacyIdOrNull\"") - add("id '$legacyIdOrNull'") - } - - if (precompiledAccessorOrNull != null) { - if (precompiledAccessorOrNull.contains("-")) { - add("`$precompiledAccessorOrNull`") - } else { - add(precompiledAccessorOrNull) - } - } - if (kotlinFunctionArgumentOrNull != null) { - add("kotlin(\"$kotlinFunctionArgumentOrNull\")") - } - } - .mapToSet { PluginAccessor(it) } - } -} - -/** - * The text used to declare a plugin dependency via a Gradle DSL. - * - * Could be any of: - * - * - standard `id` invocations - * - `id 'org.jetbrains.kotlin.kapt'` (groovy) or `id("org.jetbrains.kotlin.kapt")` (kotlin) - * - `id 'kotlin-kapt'` (groovy) or `id("kotlin-kapt")` (kotlin) - * - precompiled accessor for Gradle plugins or `buildSrc` - * - `java`, `maven-publish`, `my-convention-plugin` - * - function invocations for Kotlin libraries in the Kotlin DSL only - * - `kotlin("kapt")` - * - alias invocations for Gradle's type-safe catalogs - * - `alias(libs.plugins.anvil)` - * - * @property text the raw text used to create the declaration, without surrounding whitespace. - * @since 0.12.0 - */ -@JvmInline -value class PluginAccessor(val text: String) diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectDependencies.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectDependencies.kt deleted file mode 100644 index 4e555b05c6..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectDependencies.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.utils.filterToSet -import modulecheck.utils.flatMapToSet - -class ProjectDependencies( - map: Map> -) : MutableMap> by map.toMutableMap() { - fun main(): Set = ConfigurationName.main() - .flatMapToSet { configurationName -> - get(configurationName).orEmpty() - } - - fun public(): Set = ConfigurationName.public() - .flatMapToSet { configurationName -> - get(configurationName).orEmpty() - } - - fun private(): Set = ConfigurationName.private() - .flatMapToSet { configurationName -> - get(configurationName).orEmpty() - } - - operator fun get(sourceSetName: SourceSetName): Set { - return sourceSetName.javaConfigurationNames().flatMapToSet { get(it).orEmpty() } - } - - fun add(cpd: ProjectDependency) { - val oldDependencies = get(cpd.configurationName).orEmpty() - put(cpd.configurationName, oldDependencies + cpd) - } - - fun remove(cpd: ProjectDependency) { - val oldDependencies = get(cpd.configurationName).orEmpty() - put(cpd.configurationName, oldDependencies.filterToSet { it != cpd }) - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectDependency.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectDependency.kt deleted file mode 100644 index fc249f3604..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectDependency.kt +++ /dev/null @@ -1,181 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.sourceset.SourceSetName - -/** - * Represents a specific dependency upon an internal project dependency. - * - * @since 0.12.0 - */ -sealed class ProjectDependency : ConfiguredDependency, HasProjectPath { - - /** - * name == path - * - * @since 0.12.0 - */ - override val identifier: ProjectPath get() = projectPath - - /** - * The typical implementation of [ProjectDependency], for normal JVM or Android dependencies. - * - * @property configurationName the configuration used - * @property projectPath the path of the dependency project - * @property isTestFixture Is the dependency being invoked via `testFixtures(project(...))`? - * @since 0.12.0 - */ - class RuntimeProjectDependency( - override val configurationName: ConfigurationName, - override val projectPath: ProjectPath, - override val isTestFixture: Boolean - ) : ProjectDependency() - - /** - * The implementation of [ProjectDependency] used for code-generator dependencies. - * - * @property configurationName the configuration used - * @property projectPath the path of the dependency project - * @property isTestFixture Is the dependency being invoked via `testFixtures(project(...))`? - * @property codeGeneratorBindingOrNull If it exists, this is the defined [CodeGenerator] - * @since 0.12.0 - */ - class CodeGeneratorProjectDependency( - override val configurationName: ConfigurationName, - override val projectPath: ProjectPath, - override val isTestFixture: Boolean, - override val codeGeneratorBindingOrNull: CodeGenerator? - ) : ProjectDependency(), MightHaveCodeGeneratorBinding - - /** - * @since 0.12.0 - * @suppress - */ - operator fun component1(): ConfigurationName = configurationName - - /** - * @since 0.12.0 - * @suppress - */ - operator fun component2(): ProjectPath = projectPath - - /** - * @since 0.12.0 - * @suppress - */ - operator fun component3(): Boolean = isTestFixture - - /** - * @return the most-downstream [SourceSetName] which contains declarations used by - * this dependency configuration. For a simple `implementation` configuration, - * this returns `main`. For a `debugImplementation`, it would return `debug`. - * @since 0.12.0 - */ - fun declaringSourceSetName(sourceSets: SourceSets): SourceSetName = when { - // (testFixtures(___)) - isTestFixture -> { - SourceSetName.TEST_FIXTURES - } - - // testFixturesApi(___) - configurationName.toSourceSetName() == SourceSetName.TEST_FIXTURES -> { - SourceSetName.MAIN - } - - else -> { - configurationName.toSourceSetName().nonTestSourceSetName(sourceSets) - } - } - - /** - * Let's pretend this is a data class. - * - * @since 0.12.0 - */ - fun copy( - configurationName: ConfigurationName = this.configurationName, - path: ProjectPath = this.projectPath, - isTestFixture: Boolean = this.isTestFixture - ): ProjectDependency { - return when (this) { - is RuntimeProjectDependency -> RuntimeProjectDependency( - configurationName = configurationName, - projectPath = path, - isTestFixture = isTestFixture - ) - - is CodeGeneratorProjectDependency -> CodeGeneratorProjectDependency( - configurationName = configurationName, - projectPath = path, - isTestFixture = isTestFixture, - codeGeneratorBindingOrNull = codeGeneratorBindingOrNull - ) - } - } - - final override fun toString(): String { - - val declaration = if (isTestFixture) { - "${configurationName.value}(testFixtures(project(path = \"${projectPath.value}\")))" - } else { - "${configurationName.value}(project(path = \"${projectPath.value}\"))" - } - - return "${this::class.simpleName}( $declaration )" - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ProjectDependency - - if (configurationName != other.configurationName) return false - if (projectPath != other.projectPath) return false - if (isTestFixture != other.isTestFixture) return false - - return true - } - - override fun hashCode(): Int { - var result = javaClass.hashCode() - result = 31 * result + configurationName.hashCode() - result = 31 * result + projectPath.hashCode() - result = 31 * result + isTestFixture.hashCode() - return result - } - - /** - * Creates a [ProjectDependency] for given arguments, using [TypeSafeProjectPathResolver] - * and a `List` to look up a [CodeGenerator] in the - * event that the project dependency in question is an annotation processor. - * - * @since 0.12.0 - */ - fun interface Factory { - - /** - * @return the [ProjectDependency] for this dependency declaration - * @since 0.12.0 - */ - fun create( - configurationName: ConfigurationName, - path: ProjectPath, - isTestFixture: Boolean - ): ProjectDependency - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectPath.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectPath.kt deleted file mode 100644 index 41461f14a4..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/ProjectPath.kt +++ /dev/null @@ -1,149 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.utils.capitalize -import modulecheck.utils.lazy.unsafeLazy -import java.util.Locale - -sealed class ProjectPath : Identifier, Comparable { - - /** - * the raw value of this path - * - * - **StringProjectPath**: ":some-module-group:api" - * - **TypeSafeProjectPath**: "someModuleGroup.api" - * - * @since 0.12.0 - */ - abstract val value: String - - /** - * @see value - * @since 0.12.0 - */ - override val name: String by unsafeLazy { value } - - val typeSafeValue: String by lazy { - when (this) { - is StringProjectPath -> value.typeSafeName() - is TypeSafeProjectPath -> value - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is ProjectPath) return false - - if (value == other.value) return true - - // All comparisons are done using the type-safe value, because it's deterministic. - return typeSafeValue == other.typeSafeValue - } - - override fun hashCode(): Int { - return typeSafeValue.hashCode() - } - - override fun compareTo(other: ProjectPath): Int { - return typeSafeValue.compareTo(other.typeSafeValue) - } - - override fun toString(): String = value - - abstract fun pathValue(typeSafeProjectPathResolver: TypeSafeProjectPathResolver): String - - class StringProjectPath(override val value: String) : ProjectPath() { - init { - require(value.startsWith(':')) { - "The StringRef `value` parameter should be the traditional Gradle path, " + - "starting with ':'. Do not use the camel-cased type-safe project accessor. " + - "This argument was '$value'." - } - } - - override fun toTypeSafe(): TypeSafeProjectPath { - return TypeSafeProjectPath(value.typeSafeName()) - } - - override fun pathValue(typeSafeProjectPathResolver: TypeSafeProjectPathResolver): String = value - } - - class TypeSafeProjectPath(override val value: String) : ProjectPath() { - - override fun toTypeSafe(): TypeSafeProjectPath = this - - override fun pathValue(typeSafeProjectPathResolver: TypeSafeProjectPathResolver): String { - return typeSafeProjectPathResolver - .resolveStringProjectPath(this) - .pathValue(typeSafeProjectPathResolver) - } - } - - companion object { - fun from(rawString: String): ProjectPath = if (rawString.trim().startsWith(':')) { - StringProjectPath(rawString) - } else { - TypeSafeProjectPath(rawString) - } - } - - abstract fun toTypeSafe(): TypeSafeProjectPath -} - -internal val projectSplitRegex = "[.\\-_]".toRegex() - -/** - * Takes a conventional Gradle project path (":core:jvm") and returns the type-safe accessor name. - * - * - `:core` becomes `core` - * - `:core:jvm` becomes `core.jvm` - * - `:core-testing` becomes `coreTesting` - * - `:base:ui:navigation` becomes `base.ui.navigation` - * - * @since 0.12.0 - */ -internal fun String.typeSafeName(): String = split(projectSplitRegex) - .filterNot { it.isBlank() } - .mapIndexed { index, s -> - if (index == 0) { - s.propertyAccessName() - } else { - s.capitalize(Locale.getDefault()) - } - } - .joinToString("") - .replace(":", ".") - .removePrefix(".") - -private fun String.propertyAccessName(): String { - if (isBlank()) return this - - val chars = toCharArray() - - if (!chars.first().isUpperCase()) return this - - val caps = chars - .takeWhile { it.isUpperCase() } - .dropLast(1) - - val lower = caps - .joinToString("") { - it.toString().lowercase() - } - - return this.replaceFirst(this.substring(0, caps.size), lower) -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/SourceSetDependency.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/SourceSetDependency.kt deleted file mode 100644 index 04c3bcca81..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/SourceSetDependency.kt +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.dependency.SourceSetDependency.SourceSetExternalDependency -import modulecheck.model.dependency.SourceSetDependency.SourceSetProjectDependency -import modulecheck.model.sourceset.SourceSetName -import modulecheck.utils.lazy.unsafeLazy - -sealed interface SourceSetDependency : HasIdentifier { - - val sourceSetName: SourceSetName - val isTestFixture: Boolean - - data class SourceSetExternalDependency( - override val sourceSetName: SourceSetName, - val group: String?, - val moduleName: String, - val version: String?, - override val isTestFixture: Boolean - ) : SourceSetDependency, HasMavenCoordinates { - override val mavenCoordinates: MavenCoordinates by unsafeLazy { - MavenCoordinates( - group = group, - moduleName = moduleName, - version = version - ) - } - } - - data class SourceSetProjectDependency( - override val sourceSetName: SourceSetName, - override val projectPath: ProjectPath, - override val isTestFixture: Boolean - ) : SourceSetDependency, HasProjectPath -} - -fun ConfiguredDependency.toSourceSetDependency( - sourceSetName: SourceSetName = configurationName.toSourceSetName() -): SourceSetDependency = when (val dep = this@toSourceSetDependency as ConfiguredDependency) { - is ExternalDependency -> SourceSetExternalDependency( - sourceSetName = sourceSetName, - group = dep.group, - moduleName = dep.moduleName, - version = dep.version, - isTestFixture = isTestFixture - ) - - is ProjectDependency -> SourceSetProjectDependency( - sourceSetName = sourceSetName, - projectPath = dep.projectPath, - isTestFixture = isTestFixture - ) -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/TransitiveProjectDependency.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/TransitiveProjectDependency.kt deleted file mode 100644 index e2eaa2d3cd..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/TransitiveProjectDependency.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -data class TransitiveProjectDependency( - val source: ProjectDependency, - val contributed: ProjectDependency -) { - - fun withContributedConfiguration( - configurationName: ConfigurationName = source.configurationName - ): TransitiveProjectDependency { - val newContributed = contributed.copy(configurationName = configurationName) - return copy(contributed = newContributed) - } - - override fun toString(): String { - return """TransitiveProjectDependency( - | source=$source - | contributed=$contributed - |) - """.trimMargin() - } -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/TypeSafeProjectPathResolver.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/TypeSafeProjectPathResolver.kt deleted file mode 100644 index 05a9ae88c4..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/TypeSafeProjectPathResolver.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath -import javax.inject.Inject - -/** - * A type-safe name can't always be resolved to a String path, because dashes and - * pascalCase in a String path are treated the same. For instance, these two paths: - * - * - `:foo-bar` - * - `:fooBar` - * - * will both have the same accessor name: `projects.fooBar`. - * - * Gradle guards against this by checking for name collisions during configuration, - * so we're guaranteed that only one of the String versions will exist. - * - * So, in order to convert a type-safe name into its original - * String path, we need the list of actual paths to compare against. - * - * @since 0.12.0 - */ -class TypeSafeProjectPathResolver @Inject constructor( - private val allProjectPathsProvider: AllProjectPathsProvider -) { - - private val allPaths: Map by lazy { - allProjectPathsProvider.getAllPaths() - .associateBy { it.toTypeSafe() } - } - - fun resolveStringProjectPath(typeSafe: TypeSafeProjectPath): StringProjectPath { - return allPaths.getValue(typeSafe) - } -} - -fun interface AllProjectPathsProvider { - fun getAllPaths(): List -} diff --git a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/sourceSetName.kt b/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/sourceSetName.kt deleted file mode 100644 index dcaaa69f53..0000000000 --- a/modulecheck-model/dependency/api/src/main/kotlin/modulecheck/model/dependency/sourceSetName.kt +++ /dev/null @@ -1,93 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.utils.capitalize -import modulecheck.utils.requireNotNull - -/** - * @return true if this source set is `androidTest` or `test`, or any - * other source set downstream of them, like `androidTestDebug`. - */ -fun SourceSetName.isTestingOnly(sourceSets: SourceSets): Boolean { - - return sourceSets.getOrElse(this) { sourceSets.getValue(SourceSetName.MAIN) } - .withUpstream() - .any { upstream -> - upstream == SourceSetName.TEST || upstream == SourceSetName.ANDROID_TEST - } -} - -/** - * @return the name of the non-test/published SourceSet associated with a given SourceSet - * name. For SourceSets which are published, this just returns the same name. For testing - * SourceSets, this returns the most-downstream source set which it's testing against. - */ -fun SourceSetName.nonTestSourceSetName(sourceSets: SourceSets): SourceSetName { - - return sourceSets.getOrElse(this) { sourceSets.getValue(SourceSetName.MAIN) } - .withUpstream() - .sortedByDescending { sourceSets.getValue(it).upstream.size } - .firstOrNull { upstream -> !upstream.isTestingOnly(sourceSets) } - .requireNotNull { - val possible = sourceSets.getValue(this) - .withUpstream() - .sortedByDescending { sourceSets.getValue(it).upstream.size } - - "Could not find a non-test source set out of $possible" - } -} - -fun SourceSetName.javaConfigurationNames(): List { - - return if (this == SourceSetName.MAIN) { - ConfigurationName.main() - } else { - ConfigurationName.mainConfigurations - .filterNot { it.asConfigurationName().isKapt() } - .map { "${this.value}${it.capitalize()}".asConfigurationName() } - .plus(kaptVariant()) - } -} - -fun SourceSetName.apiConfig(): ConfigurationName { - return if (this == SourceSetName.MAIN) { - ConfigurationName.api - } else { - "${value}Api".asConfigurationName() - } -} - -fun SourceSetName.implementationConfig(): ConfigurationName { - return if (this == SourceSetName.MAIN) { - ConfigurationName.implementation - } else { - "${value}Implementation".asConfigurationName() - } -} - -/** - * @return the 'kapt' name for this source set, such as `kapt`, `kaptTest`, or `kaptAndroidTest` - * @since 0.12.0 - */ -fun SourceSetName.kaptVariant(): ConfigurationName { - return if (this == SourceSetName.MAIN) { - ConfigurationName.kapt - } else { - "${ConfigurationName.kapt.value}${value.capitalize()}".asConfigurationName() - } -} diff --git a/modulecheck-model/dependency/impl/api/impl.api b/modulecheck-model/dependency/impl/api/impl.api deleted file mode 100644 index e97d511bae..0000000000 --- a/modulecheck-model/dependency/impl/api/impl.api +++ /dev/null @@ -1,56 +0,0 @@ -public final class anvil/hint/Modulecheck_model_dependency_impl_RealConfiguredProjectDependencyFactory_Factory_TaskScope_BindingModule_0bd0aac9_096dc8a8Kt { - public static final fun getModulecheck_model_dependency_impl_RealConfiguredProjectDependencyFactory_Factory_TaskScope_BindingModule_0bd0aac9_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_model_dependency_impl_RealConfiguredProjectDependencyFactory_Factory_TaskScope_BindingModule_0bd0aac9_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_model_dependency_impl_RealExternalDependencyFactory_Factory_TaskScope_BindingModule_fe27a160_b7fc6128Kt { - public static final fun getModulecheck_model_dependency_impl_RealExternalDependencyFactory_Factory_TaskScope_BindingModule_fe27a160_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_model_dependency_impl_RealExternalDependencyFactory_Factory_TaskScope_BindingModule_fe27a160_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory : modulecheck/model/dependency/ProjectDependency$Factory { - public fun (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;Ljava/util/List;)V - public fun create-9A_UJks (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;Z)Lmodulecheck/model/dependency/ProjectDependency; -} - -public final class modulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory; - public static final fun newInstance (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;Ljava/util/List;)Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory; -} - -public final class modulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory_Factory; - public final fun newInstance (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;Ljava/util/List;)Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory; -} - -public abstract interface class modulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory_Factory_TaskScope_BindingModule_0bd0aac9 { - public abstract fun bindFactory (Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory;)Lmodulecheck/model/dependency/ProjectDependency$Factory; -} - -public final class modulecheck/model/dependency/impl/RealExternalDependencyFactory : modulecheck/model/dependency/ExternalDependency$Factory { - public fun (Ljava/util/List;)V - public fun create-FdhTdL0 (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)Lmodulecheck/model/dependency/ExternalDependency; -} - -public final class modulecheck/model/dependency/impl/RealExternalDependencyFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/model/dependency/impl/RealExternalDependencyFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/model/dependency/impl/RealExternalDependencyFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/model/dependency/impl/RealExternalDependencyFactory; - public static final fun newInstance (Ljava/util/List;)Lmodulecheck/model/dependency/impl/RealExternalDependencyFactory; -} - -public final class modulecheck/model/dependency/impl/RealExternalDependencyFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/model/dependency/impl/RealExternalDependencyFactory_Factory; - public final fun newInstance (Ljava/util/List;)Lmodulecheck/model/dependency/impl/RealExternalDependencyFactory; -} - -public abstract interface class modulecheck/model/dependency/impl/RealExternalDependencyFactory_Factory_TaskScope_BindingModule_fe27a160 { - public abstract fun bindFactory (Lmodulecheck/model/dependency/impl/RealExternalDependencyFactory;)Lmodulecheck/model/dependency/ExternalDependency$Factory; -} - diff --git a/modulecheck-model/dependency/impl/build.gradle.kts b/modulecheck-model/dependency/impl/build.gradle.kts deleted file mode 100644 index d6f9bc97f9..0000000000 --- a/modulecheck-model/dependency/impl/build.gradle.kts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-model-dependency-impl" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-model:dependency:api")) - - implementation(project(":modulecheck-utils:lazy")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-model/dependency/impl/src/main/kotlin/modulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory.kt b/modulecheck-model/dependency/impl/src/main/kotlin/modulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory.kt deleted file mode 100644 index 738d44249f..0000000000 --- a/modulecheck-model/dependency/impl/src/main/kotlin/modulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency.impl - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.CodeGeneratorBinding.AnnotationProcessor -import modulecheck.dagger.DaggerList -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectDependency.CodeGeneratorProjectDependency -import modulecheck.model.dependency.ProjectDependency.RuntimeProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath -import modulecheck.model.dependency.TypeSafeProjectPathResolver -import javax.inject.Inject - -/** - * Creates a [ProjectDependency] for given arguments, using [pathResolver] - * and [generatorBindings] to look up a [CodeGeneratorBinding] in the event - * that the project dependency in question is an annotation processor. - * - * @param pathResolver used to look up the [StringProjectPath] of any internal project - * code generators. This is necessary in order to look up the [CodeGeneratorBinding]. - * @param generatorBindings the list of possible bindings to search - * @since 0.12.0 - */ -@ContributesBinding(TaskScope::class) -class RealConfiguredProjectDependencyFactory @Inject constructor( - private val pathResolver: TypeSafeProjectPathResolver, - private val generatorBindings: DaggerList -) : ProjectDependency.Factory { - override fun create( - configurationName: ConfigurationName, - path: ProjectPath, - isTestFixture: Boolean - ): ProjectDependency { - - val stringPath = when (path) { - is StringProjectPath -> path - is TypeSafeProjectPath -> pathResolver.resolveStringProjectPath(path) - } - - return when { - configurationName.isKapt() -> CodeGeneratorProjectDependency( - configurationName = configurationName, - projectPath = path, - isTestFixture = isTestFixture, - codeGeneratorBindingOrNull = generatorBindings.filterIsInstance() - .firstOrNull { it.generatorMavenCoordinates == stringPath.value } - ) - - else -> RuntimeProjectDependency( - configurationName = configurationName, - projectPath = path, - isTestFixture = isTestFixture - ) - } - } -} diff --git a/modulecheck-model/dependency/impl/src/main/kotlin/modulecheck/model/dependency/impl/RealExternalDependencyFactory.kt b/modulecheck-model/dependency/impl/src/main/kotlin/modulecheck/model/dependency/impl/RealExternalDependencyFactory.kt deleted file mode 100644 index b6d692cb66..0000000000 --- a/modulecheck-model/dependency/impl/src/main/kotlin/modulecheck/model/dependency/impl/RealExternalDependencyFactory.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.dependency.impl - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.config.CodeGeneratorBinding -import modulecheck.dagger.DaggerList -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ExternalDependency -import modulecheck.utils.lazy.unsafeLazy -import javax.inject.Inject - -/** - * Creates an [ExternalDependency] for given arguments, a - * `List` to look up a [CodeGeneratorBinding] in the - * event that the project dependency in question is an annotation processor. - * - * @param generatorBindings the list of possible bindings to search - * @since 0.12.0 - */ -@ContributesBinding(TaskScope::class) -class RealExternalDependencyFactory @Inject constructor( - private val generatorBindings: DaggerList -) : ExternalDependency.Factory { - override fun create( - configurationName: ConfigurationName, - group: String?, - moduleName: String, - version: String?, - isTestFixture: Boolean - ): ExternalDependency { - val name by unsafeLazy { "${group .orEmpty()}:$moduleName" } - - return when { - configurationName.isKapt() -> ExternalDependency.ExternalCodeGeneratorDependency( - configurationName = configurationName, - group = group, - moduleName = moduleName, - version = version, - isTestFixture = isTestFixture, - codeGeneratorBindingOrNull = generatorBindings.filterIsInstance() - .firstOrNull { it.generatorMavenCoordinates == name } - ) - - else -> ExternalDependency.ExternalRuntimeDependency( - configurationName = configurationName, - group = group, - moduleName = moduleName, - version = version, - isTestFixture = isTestFixture - ) - } - } -} diff --git a/modulecheck-model/sourceset/api/api/api.api b/modulecheck-model/sourceset/api/api/api.api deleted file mode 100644 index 7194587c08..0000000000 --- a/modulecheck-model/sourceset/api/api/api.api +++ /dev/null @@ -1,41 +0,0 @@ -public final class modulecheck/model/sourceset/SourceSetName { - public static final field Companion Lmodulecheck/model/sourceset/SourceSetName$Companion; - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/model/sourceset/SourceSetName; - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public final fun getValue ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public static final fun isTestFixtures-impl (Ljava/lang/String;)Z - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/model/sourceset/SourceSetName$Companion { - public final fun getANDROID_TEST-qrJCKeA ()Ljava/lang/String; - public final fun getANVIL-qrJCKeA ()Ljava/lang/String; - public final fun getDEBUG-qrJCKeA ()Ljava/lang/String; - public final fun getKAPT-qrJCKeA ()Ljava/lang/String; - public final fun getMAIN-qrJCKeA ()Ljava/lang/String; - public final fun getRELEASE-qrJCKeA ()Ljava/lang/String; - public final fun getTEST-qrJCKeA ()Ljava/lang/String; - public final fun getTEST_FIXTURES-qrJCKeA ()Ljava/lang/String; -} - -public final class modulecheck/model/sourceset/SourceSetNameKt { - public static final fun addPrefix--mDCbI4 (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun addPrefix-YJqa9SQ (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun addSuffix--mDCbI4 (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun addSuffix-YJqa9SQ (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun asSourceSetName (Ljava/lang/String;)Ljava/lang/String; - public static final fun hasPrefix--mDCbI4 (Ljava/lang/String;Ljava/lang/String;)Z - public static final fun hasPrefix-YJqa9SQ (Ljava/lang/String;Ljava/lang/String;)Z - public static final fun removePrefix--mDCbI4 (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun removePrefix-YJqa9SQ (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun removeSuffix--mDCbI4 (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun removeSuffix-YJqa9SQ (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -} - diff --git a/modulecheck-model/sourceset/api/build.gradle.kts b/modulecheck-model/sourceset/api/build.gradle.kts deleted file mode 100644 index 9c97719932..0000000000 --- a/modulecheck-model/sourceset/api/build.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-model-sourceset-api" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - compileOnly(gradleApi()) - - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-model/sourceset/api/src/main/kotlin/modulecheck/model/sourceset/SourceSetName.kt b/modulecheck-model/sourceset/api/src/main/kotlin/modulecheck/model/sourceset/SourceSetName.kt deleted file mode 100644 index 783f85056f..0000000000 --- a/modulecheck-model/sourceset/api/src/main/kotlin/modulecheck/model/sourceset/SourceSetName.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.model.sourceset - -import modulecheck.utils.capitalize -import modulecheck.utils.decapitalize - -@JvmInline -value class SourceSetName(val value: String) { - - fun isTestFixtures(): Boolean = value.startsWith(TEST_FIXTURES.value, ignoreCase = true) - - override fun toString(): String = "(SourceSetName) `$value`" - - companion object { - val ANDROID_TEST: SourceSetName = SourceSetName("androidTest") - val ANVIL: SourceSetName = SourceSetName("anvil") - val DEBUG: SourceSetName = SourceSetName("debug") - val KAPT: SourceSetName = SourceSetName("kapt") - val MAIN: SourceSetName = SourceSetName("main") - val RELEASE: SourceSetName = SourceSetName("release") - val TEST: SourceSetName = SourceSetName("test") - val TEST_FIXTURES: SourceSetName = SourceSetName("testFixtures") - } -} - -fun String.asSourceSetName(): SourceSetName = SourceSetName(this) - -fun SourceSetName.removePrefix(prefix: String): SourceSetName = value.removePrefix(prefix) - .decapitalize() - .asSourceSetName() - -fun SourceSetName.removePrefix(prefix: SourceSetName): SourceSetName = removePrefix(prefix.value) - -fun SourceSetName.hasPrefix(prefix: String): Boolean = value.startsWith(prefix) -fun SourceSetName.hasPrefix(prefix: SourceSetName): Boolean = hasPrefix(prefix.value) - -fun SourceSetName.addPrefix(prefix: String): SourceSetName = prefix.plus(value.capitalize()) - .asSourceSetName() - -fun SourceSetName.addPrefix(prefix: SourceSetName): SourceSetName = addPrefix(prefix.value) - -fun SourceSetName.removeSuffix(suffix: String): SourceSetName = - value.removeSuffix(suffix.capitalize()) - .asSourceSetName() - -fun SourceSetName.removeSuffix(suffix: SourceSetName): SourceSetName = - removeSuffix(suffix.value.capitalize()) - -fun SourceSetName.addSuffix(suffix: String): SourceSetName = value.plus(suffix.capitalize()) - .asSourceSetName() - -fun SourceSetName.addSuffix(suffix: SourceSetName): SourceSetName = addSuffix(suffix.value) diff --git a/modulecheck-parsing/android/api/android.api b/modulecheck-parsing/android/api/android.api deleted file mode 100644 index 2391951783..0000000000 --- a/modulecheck-parsing/android/api/android.api +++ /dev/null @@ -1,82 +0,0 @@ -public final class modulecheck/parsing/android/AndroidLayoutParser { - public fun ()V - public final fun parseResources (Ljava/io/File;)Ljava/util/Set; - public final fun parseViews (Ljava/io/File;)Ljava/util/Set; -} - -public final class modulecheck/parsing/android/AndroidManifestParser { - public fun ()V - public final fun parse (Ljava/io/File;)Ljava/util/Map; - public final fun parseResources (Ljava/io/File;)Ljava/util/Set; -} - -public final class modulecheck/parsing/android/AndroidResourceParser { - public fun ()V - public final fun parseFile (Ljava/io/File;)Ljava/util/Set; -} - -public final class modulecheck/parsing/android/AndroidStylesFile : modulecheck/parsing/android/XmlFile { - public fun (Ljava/io/File;)V - public final fun component1 ()Ljava/io/File; - public final fun copy (Ljava/io/File;)Lmodulecheck/parsing/android/AndroidStylesFile; - public static synthetic fun copy$default (Lmodulecheck/parsing/android/AndroidStylesFile;Ljava/io/File;ILjava/lang/Object;)Lmodulecheck/parsing/android/AndroidStylesFile; - public fun equals (Ljava/lang/Object;)Z - public fun getFile ()Ljava/io/File; - public final fun getName ()Ljava/lang/String; - public fun getReferences ()Lmodulecheck/utils/lazy/LazySet; - public fun getResourceReferencesAsRReferences ()Ljava/util/Set; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/android/AndroidStylesParser { - public fun ()V - public final fun parseFile (Ljava/io/File;)Ljava/util/Set; -} - -public final class modulecheck/parsing/android/SafeXmlParser { - public fun ()V - public final fun parse (Ljava/io/File;)Lgroovy/util/Node; - public final fun parse (Ljava/lang/String;)Lgroovy/util/Node; -} - -public abstract interface class modulecheck/parsing/android/XmlFile : modulecheck/parsing/source/HasReferences { - public static final field Companion Lmodulecheck/parsing/android/XmlFile$Companion; - public abstract fun getFile ()Ljava/io/File; - public abstract fun getResourceReferencesAsRReferences ()Ljava/util/Set; -} - -public final class modulecheck/parsing/android/XmlFile$Companion { - public final fun getREFERENCE_PREFIXES ()Ljava/util/List; -} - -public final class modulecheck/parsing/android/XmlFile$LayoutFile : modulecheck/parsing/android/XmlFile { - public fun (Ljava/io/File;)V - public final fun component1 ()Ljava/io/File; - public final fun copy (Ljava/io/File;)Lmodulecheck/parsing/android/XmlFile$LayoutFile; - public static synthetic fun copy$default (Lmodulecheck/parsing/android/XmlFile$LayoutFile;Ljava/io/File;ILjava/lang/Object;)Lmodulecheck/parsing/android/XmlFile$LayoutFile; - public fun equals (Ljava/lang/Object;)Z - public final fun getCustomViews ()Lkotlin/Lazy; - public fun getFile ()Ljava/io/File; - public final fun getIdDeclarations ()Ljava/util/Set; - public final fun getName ()Ljava/lang/String; - public fun getReferences ()Lmodulecheck/utils/lazy/LazySet; - public fun getResourceReferencesAsRReferences ()Ljava/util/Set; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/android/XmlFile$ManifestFile : modulecheck/parsing/android/XmlFile { - public fun (Ljava/io/File;)V - public final fun component1 ()Ljava/io/File; - public final fun copy (Ljava/io/File;)Lmodulecheck/parsing/android/XmlFile$ManifestFile; - public static synthetic fun copy$default (Lmodulecheck/parsing/android/XmlFile$ManifestFile;Ljava/io/File;ILjava/lang/Object;)Lmodulecheck/parsing/android/XmlFile$ManifestFile; - public fun equals (Ljava/lang/Object;)Z - public final fun getBasePackage ()Lmodulecheck/parsing/source/PackageName; - public fun getFile ()Ljava/io/File; - public fun getReferences ()Lmodulecheck/utils/lazy/LazySet; - public fun getResourceReferencesAsRReferences ()Ljava/util/Set; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - diff --git a/modulecheck-parsing/android/build.gradle.kts b/modulecheck-parsing/android/build.gradle.kts deleted file mode 100644 index 1f553dd5e4..0000000000 --- a/modulecheck-parsing/android/build.gradle.kts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-core" - ) - anvil() -} - -dependencies { - - api(libs.groovy) - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-parsing:source:api")) - - implementation(libs.groovyXml) - - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - - testImplementation(project(path = ":modulecheck-internal-testing")) -} diff --git a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidLayoutParser.kt b/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidLayoutParser.kt deleted file mode 100644 index e6b6b31b23..0000000000 --- a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidLayoutParser.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import groovy.util.Node -import java.io.File - -class AndroidLayoutParser { - - fun parseViews(file: File): Set { - val node = SafeXmlParser().parse(file) ?: return emptySet() - - return node.breadthFirst() - .filterIsInstance() - .mapNotNull { it.name() as? String } - .toSet() - } - - fun parseResources(file: File): Set { - val node = SafeXmlParser().parse(file) ?: return emptySet() - - return node.breadthFirst() - .filterIsInstance() - .mapNotNull { it.attributes() } - .flatMap { it.values.mapNotNull { value -> value } } - .filterIsInstance() - .toSet() - } -} diff --git a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidManifestParser.kt b/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidManifestParser.kt deleted file mode 100644 index b7d5a4d329..0000000000 --- a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidManifestParser.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import groovy.util.Node -import java.io.File -import kotlin.collections.MutableMap.MutableEntry - -class AndroidManifestParser { - - fun parse(file: File): Map { - val node = SafeXmlParser().parse(file) ?: return emptyMap() - - return node.breadthFirst() - .filterIsInstance() - .mapNotNull { it.attributes() } - .flatMap { it.entries } - .filterNotNull() - .filterIsInstance>() - .associate { it.key to it.value } - } - - fun parseResources(file: File): Set { - val node = SafeXmlParser().parse(file) ?: return emptySet() - - return node.breadthFirst() - .filterIsInstance() - .mapNotNull { it.attributes() } - .flatMap { it.values.mapNotNull { value -> value } } - .filterIsInstance() - .toSet() - } -} diff --git a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidResourceParser.kt b/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidResourceParser.kt deleted file mode 100644 index 787cfc113e..0000000000 --- a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidResourceParser.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import groovy.util.Node -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.utils.flatMapToSet -import java.io.File - -class AndroidResourceParser { - - /** - * @return returns all **unqualified** resources declared - * within this directory, such as `R.string.app_name` - * @since 0.12.0 - */ - fun parseFile(resDir: File): Set { - val xmlParser = SafeXmlParser() - - return resDir - .walkTopDown() - .filter { it.isFile } - .filter { it.extension == "xml" } - .flatMapToSet { file -> - - val fromFile = listOfNotNull(UnqualifiedAndroidResource.fromFile(file)) - - val fromContents = xmlParser.parse(file) - ?.takeIf { it.name() == "resources" } - ?.children() - ?.filterIsInstance() - ?.mapNotNull { node -> - - val name = node.attributes()["name"]?.toString() ?: return@mapNotNull null - - UnqualifiedAndroidResource.fromValuePair( - type = node.name().toString(), - name = name - ) - } - .orEmpty() - - fromFile + fromContents - } - } -} diff --git a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidStylesFile.kt b/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidStylesFile.kt deleted file mode 100644 index f28b11f144..0000000000 --- a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidStylesFile.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import modulecheck.parsing.source.ReferenceName -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.lazySet -import modulecheck.utils.mapToSet -import java.io.File - -data class AndroidStylesFile( - override val file: File -) : XmlFile { - - val name: String = file.nameWithoutExtension - - private val rawReferences by lazy { - AndroidStylesParser().parseFile(file) - } - - override val references: LazySet = lazySet { - rawReferences - } - - override val resourceReferencesAsRReferences: Set by lazy { - rawReferences.mapToSet { it.name } - } -} diff --git a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidStylesParser.kt b/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidStylesParser.kt deleted file mode 100644 index 77fcda0512..0000000000 --- a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/AndroidStylesParser.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import groovy.util.Node -import groovy.util.NodeList -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.parsing.source.UnqualifiedAndroidResourceReferenceName -import modulecheck.utils.flatMapToSet -import java.io.File - -class AndroidStylesParser { - - fun parseFile(file: File): Set { - - val xmlParser = SafeXmlParser() - - return xmlParser.parse(file) - ?.takeIf { it.name() == "resources" } - ?.children() - ?.filterIsInstance() - ?.filter { it.name() == "style" } - ?.map { parseNode(it) } - .orEmpty() - .flatMapToSet { it } - } - - private fun parseNode(styleNode: Node): Set { - - // We don't actually need this attribute, but if it isn't there, this isn't a valid style. - styleNode.attribute("name")?.toString() ?: return emptySet() - - val parentOrNull = styleNode.attribute("parent") - ?.toString() - ?.let { parentName -> - - val declaration = when { - // ex: `parent="@style/Theme.AppCompat.Light.DarkActionBar"` - // ex: `parent="@android:style/Theme.AppCompat.Light.DarkActionBar"` - parentName.startsWith("@") -> { - UnqualifiedAndroidResource.fromXmlString(parentName) - } - - // ex: `parent="Theme.AppCompat.Light.DarkActionBar"` - // ex: `parent="android:Theme.AppCompat.Light.DarkActionBar"` - else -> { - UnqualifiedAndroidResource.fromValuePair( - "style", - parentName.removePrefix("android:") - ) - } - } - - declaration?.let { UnqualifiedAndroidResourceReferenceName(it.name, XML) } - } - - return styleNode.children() - .asSequence() - .filterIsInstance() - .map { it.value() } - .filterIsInstance() - .mapNotNull { valueNodeList -> - UnqualifiedAndroidResource.fromXmlString(valueNodeList.text()) - ?.let { UnqualifiedAndroidResourceReferenceName(it.name, XML) } - } - .plus(listOfNotNull(parentOrNull)) - .toSet() - } -} diff --git a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/SafeXmlParser.kt b/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/SafeXmlParser.kt deleted file mode 100644 index 26ebcb3ac6..0000000000 --- a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/SafeXmlParser.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("ForbiddenImport") - -package modulecheck.parsing.android - -import groovy.util.Node -import java.io.File -import groovy.xml.XmlParser as GroovyXmlParser - -class SafeXmlParser { - - private val delegate = GroovyXmlParser() - - fun parse(file: File): Node? { - - return kotlin.runCatching { - file - .takeIf { it.extension == "xml" } - ?.readText() - ?.let { parse(it) } - } - .getOrNull() - } - - fun parse(text: String): Node? { - return delegate.parseText(text.sanitizeXml()) - } -} - -// https://www.w3.org/TR/xml/#charsets -// https://github.com/RBusarow/ModuleCheck/issues/375 -private fun String.sanitizeXml(): String { - val xml10Pattern = "[^\u0009\r\n\u0020-\uD7FF\uE000-\uFFFD\ud800\udc00-\udbff\udfff\uFEFF]" - return replaceFirst("^\uFEFF", "") - .replace(xml10Pattern.toRegex(), " ") -} diff --git a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/XmlFile.kt b/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/XmlFile.kt deleted file mode 100644 index 15e0d7280a..0000000000 --- a/modulecheck-parsing/android/src/main/kotlin/modulecheck/parsing/android/XmlFile.kt +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import modulecheck.parsing.source.HasReferences -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.parsing.source.UnqualifiedAndroidResourceReferenceName -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.asDataSource -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.toLazySet -import modulecheck.utils.mapToSet -import java.io.File - -interface XmlFile : HasReferences { - - val file: File - - val resourceReferencesAsRReferences: Set - - data class LayoutFile( - override val file: File - ) : XmlFile { - - val name: String = file.nameWithoutExtension - - /** - * All custom view types *used* within this file. - * Note that this is not the declaration of a view. - * - * @since 0.12.0 - */ - val customViews: Lazy> = lazy { - AndroidLayoutParser().parseViews(file).mapToSet { ReferenceName(it, XML) } - } - - private val attributes by lazy { - AndroidLayoutParser().parseResources(file) - } - - /** - * Declared ids, using `@+id/________`, which are expressed as `R.id._____` - * - * @since 0.12.0 - */ - val idDeclarations: Set by lazy { - attributes.filter { attribute -> - attribute.startsWith("@+id/") - } - .mapNotNull { UnqualifiedAndroidResource.fromXmlString(it) } - .toSet() - } - - private val rawResources: Set by lazy { - attributes - .filter { attribute -> - REFERENCE_PREFIXES - .any { attribute.startsWith(it) } - } - .toSet() - } - - override val resourceReferencesAsRReferences: Set by lazy { - rawResources - .mapNotNull { UnqualifiedAndroidResource.fromXmlString(it) } - .map { it.name } - .toSet() - } - - override val references: LazySet = listOf( - customViews.asDataSource(), - dataSource { - resourceReferencesAsRReferences.mapToSet { - UnqualifiedAndroidResourceReferenceName(it, XML) - } - } - ).toLazySet() - } - - data class ManifestFile( - override val file: File - ) : XmlFile { - - val basePackage: PackageName? by lazy { - AndroidManifestParser().parse(file)["package"]?.let { PackageName(it) } - } - - private val rawResources: Set by lazy { - AndroidManifestParser().parseResources(file) - .filter { attribute -> REFERENCE_PREFIXES.any { attribute.startsWith(it) } } - .toSet() - } - - private val declarations by lazy { - rawResources - .mapNotNull { UnqualifiedAndroidResource.fromXmlString(it) } - } - - override val resourceReferencesAsRReferences: Set by lazy { - declarations.mapToSet { it.name } - } - - override val references: LazySet = listOf( - dataSource { - resourceReferencesAsRReferences.mapToSet { - UnqualifiedAndroidResourceReferenceName(it, XML) - } - } - ).toLazySet() - } - - companion object { - val REFERENCE_PREFIXES: List = listOf( - "@anim/", - "@animator/", - "@arrays/", - "@color/", - "@dimen/", - "@drawable/", - "@font/", - "@layout/", - "@menu/", - "@mipmap/", - "@raw/", - "@string/", - "@style/" - ) - } -} diff --git a/modulecheck-parsing/android/src/test/kotlin/modulecheck/parsing/android/AndroidResourceParserTest.kt b/modulecheck-parsing/android/src/test/kotlin/modulecheck/parsing/android/AndroidResourceParserTest.kt deleted file mode 100644 index dad9ac6054..0000000000 --- a/modulecheck-parsing/android/src/test/kotlin/modulecheck/parsing/android/AndroidResourceParserTest.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.parsing.source.UnqualifiedAndroidResource.Companion.string -import modulecheck.parsing.source.UnqualifiedAndroidResource.Companion.style -import modulecheck.testing.BaseTest -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test - -internal class AndroidResourceParserTest : BaseTest { - - @Test - fun `a node without attributes should not be parsed`() = test { - val text = """ - - - - - """.trimIndent() - - val xml = workingDir - .resolve("styles.xml") - .createSafely(text) - - val declarations = AndroidResourceParser().parseFile(xml) - - declarations shouldBe emptySet() - } - - @Test - fun `a node without a name attribute should not be parsed`() = test { - val text = """ - - - - - """.trimIndent() - - val xml = workingDir - .resolve("styles.xml") - .createSafely(text) - - val declarations = AndroidResourceParser().parseFile(xml) - - declarations shouldBe emptySet() - } - - @Test - fun `a node with a name as the second attribute should be parsed`() = test { - val text = """ - - - - - """.trimIndent() - - val xml = workingDir - .resolve("styles.xml") - .createSafely(text) - - val declarations = AndroidResourceParser().parseFile(xml) - - declarations shouldBe setOf( - string("app_name".asSimpleName()) - ) - } - - @Test - fun `a node with dots in its name should be parsed using underscores`() = test { - val text = """ - - - - - - """.trimIndent() - - val xml = workingDir - .resolve("styles.xml") - .createSafely(text) - - val file = AndroidStylesFile(xml) - - file.references.toList() shouldBe setOf( - UnqualifiedAndroidResource.color("transparent".asSimpleName()), - UnqualifiedAndroidResource.style("SomeOtherStyle".asSimpleName()), - UnqualifiedAndroidResource.style("Theme_AppCompat_Light_DarkActionBar".asSimpleName()) - ) - } - - @Test - fun `external style parent with android prefix and value references should count as references`() = - test { - @Language("xml") - val text = """ - - - - - - - """.trimIndent() - - val xml = workingDir - .resolve("styles.xml") - .createSafely(text) - - val file = AndroidStylesFile(xml) - - file.references.toList() shouldBe setOf( - UnqualifiedAndroidResource.color("transparent".asSimpleName()), - UnqualifiedAndroidResource.style("SomeOtherStyle".asSimpleName()), - UnqualifiedAndroidResource.style("Theme_AppCompat_Light_DarkActionBar".asSimpleName()) - ) - } - - @Test - fun `at style parent with android prefix and value references should count as references`() = - test { - - @Language("xml") - val text = """ - - - - - - - """.trimIndent() - - val xml = workingDir - .resolve("styles.xml") - .createSafely(text) - - val file = AndroidStylesFile(xml) - - file.references.toList() shouldBe setOf( - UnqualifiedAndroidResource.color("transparent".asSimpleName()), - UnqualifiedAndroidResource.style("SomeOtherStyle".asSimpleName()), - UnqualifiedAndroidResource.style("Theme_AppCompat_Light_DarkActionBar".asSimpleName()) - ) - } - - @Test - fun `at style parent and value references should count as references`() = test { - - @Language("xml") - val text = """ - - - - - - - """.trimIndent() - - val xml = workingDir - .resolve("styles.xml") - .createSafely(text) - - val file = AndroidStylesFile(xml) - - file.references.toList() shouldBe setOf( - UnqualifiedAndroidResource.color("transparent".asSimpleName()), - UnqualifiedAndroidResource.style("SomeOtherStyle".asSimpleName()), - UnqualifiedAndroidResource.style("Theme_AppCompat_Light_DarkActionBar".asSimpleName()) - ) - } -} diff --git a/modulecheck-parsing/android/src/test/kotlin/modulecheck/parsing/android/XmlFileTest.kt b/modulecheck-parsing/android/src/test/kotlin/modulecheck/parsing/android/XmlFileTest.kt deleted file mode 100644 index b19317fc06..0000000000 --- a/modulecheck-parsing/android/src/test/kotlin/modulecheck/parsing/android/XmlFileTest.kt +++ /dev/null @@ -1,80 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.android - -import kotlinx.coroutines.flow.toList -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.parsing.source.UnqualifiedAndroidResource.Companion.id -import modulecheck.parsing.source.UnqualifiedAndroidResourceReferenceName -import modulecheck.testing.BaseTest -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.intellij.lang.annotations.Language -import org.junit.jupiter.api.Test - -internal class XmlFileTest : BaseTest { - - @Test - fun `an id which is declared in a layout should count as a declaration`() = test { - @Language("xml") - val text = """ - - - - - - - """.trimIndent() - - val xml = workingDir - .resolve("stubs.xml") - .createSafely(text) - - val file = XmlFile.LayoutFile(xml) - - file.idDeclarations shouldBe setOf( - id("fragment_container".asSimpleName()), - id("fragment_container_nested".asSimpleName()) - ) - - file.resourceReferencesAsRReferences shouldBe setOf( - "R.style.Theme_AppCompat_Light_DarkActionBar" - ) - - file.references.toList() shouldBe listOf( - ReferenceName("LinearLayout", XML), - UnqualifiedAndroidResourceReferenceName("R.style.Theme_AppCompat_Light_DarkActionBar", XML) - ) - - file.customViews.value shouldBe setOf(ReferenceName("LinearLayout", XML)) - } -} diff --git a/modulecheck-parsing/gradle/dsl/api/api/api.api b/modulecheck-parsing/gradle/dsl/api/api/api.api deleted file mode 100644 index 9c28743dc9..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/api/api.api +++ /dev/null @@ -1,298 +0,0 @@ -public abstract interface class modulecheck/parsing/gradle/dsl/AndroidGradleParser { - public abstract fun parse (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/gradle/dsl/AndroidGradleSettings { - public fun (Ljava/util/List;Ljava/util/List;Ljava/util/List;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Ljava/util/List; - public final fun copy (Ljava/util/List;Ljava/util/List;Ljava/util/List;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings; - public static synthetic fun copy$default (Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings; - public fun equals (Ljava/lang/Object;)Z - public final fun getAndroidBlocks ()Ljava/util/List; - public final fun getAssignments ()Ljava/util/List; - public final fun getBuildFeaturesBlocks ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock : modulecheck/parsing/gradle/dsl/Block { -} - -public final class modulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$AndroidBlock : modulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$AndroidBlock; - public static synthetic fun copy$default (Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$AndroidBlock;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$AndroidBlock; - public fun equals (Ljava/lang/Object;)Z - public fun getBlockSuppressed ()Ljava/util/List; - public fun getFullText ()Ljava/lang/String; - public fun getLambdaContent ()Ljava/lang/String; - public fun getSettings ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$BuildFeaturesBlock : modulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$BuildFeaturesBlock; - public static synthetic fun copy$default (Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$BuildFeaturesBlock;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettings$AgpBlock$BuildFeaturesBlock; - public fun equals (Ljava/lang/Object;)Z - public fun getBlockSuppressed ()Ljava/util/List; - public fun getFullText ()Ljava/lang/String; - public fun getLambdaContent ()Ljava/lang/String; - public fun getSettings ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider { - public abstract fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider$Factory { - public abstract fun create (Ljava/io/File;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider; -} - -public final class modulecheck/parsing/gradle/dsl/Assignment : modulecheck/parsing/gradle/dsl/BuildFileStatement { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/parsing/gradle/dsl/Assignment; - public static synthetic fun copy$default (Lmodulecheck/parsing/gradle/dsl/Assignment;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/Assignment; - public fun equals (Ljava/lang/Object;)Z - public fun getDeclarationText ()Ljava/lang/String; - public final fun getFullText ()Ljava/lang/String; - public final fun getPropertyFullName ()Ljava/lang/String; - public fun getStatementWithSurroundingText ()Ljava/lang/String; - public fun getSuppressed ()Ljava/util/List; - public final fun getValue ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/Block { - public abstract fun getBlockSuppressed ()Ljava/util/List; - public abstract fun getFullText ()Ljava/lang/String; - public abstract fun getLambdaContent ()Ljava/lang/String; - public abstract fun getSettings ()Ljava/util/List; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/BuildFileParser { - public abstract fun androidSettings (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun dependenciesBlocks (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun pluginsBlock (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/BuildFileParser$Factory { - public abstract fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/BuildFileParser; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/BuildFileStatement { - public abstract fun getDeclarationText ()Ljava/lang/String; - public abstract fun getStatementWithSurroundingText ()Ljava/lang/String; - public abstract fun getSuppressed ()Ljava/util/List; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/DependenciesBlock : modulecheck/parsing/gradle/dsl/Block, modulecheck/parsing/gradle/dsl/HasSuppressedChildren { - public abstract fun getOrEmpty-25SeVdM (Lmodulecheck/model/dependency/MavenCoordinates;Ljava/lang/String;)Ljava/util/List; - public abstract fun getOrEmpty-vAhOJHc (Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List; - public abstract fun getOrEmpty-vAhOJHc (Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;Z)Ljava/util/List; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/DependenciesBlocksProvider { - public abstract fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/DependenciesBlocksProvider$Factory { - public abstract fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/DependenciesBlocksProvider; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/DependencyDeclaration : modulecheck/parsing/gradle/dsl/BuildFileStatement { - public abstract fun getConfigName-9LqIWVA ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform { - public abstract fun invoke-KxNpj4Q (Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/gradle/dsl/ExternalDependencyDeclaration : modulecheck/parsing/gradle/dsl/DependencyDeclaration { - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-9LqIWVA ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/util/List; - public final fun component5 ()Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform; - public final fun component6 ()Ljava/lang/String; - public final fun component7 ()Ljava/lang/String; - public final fun component8 ()Ljava/lang/String; - public final fun component9 ()Lmodulecheck/model/dependency/MavenCoordinates; - public final fun copy-DjjXWn0 (Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun copy-DjjXWn0$default (Lmodulecheck/parsing/gradle/dsl/ExternalDependencyDeclaration;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun copy-opSvFPU (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;)Lmodulecheck/parsing/gradle/dsl/ExternalDependencyDeclaration; - public static synthetic fun copy-opSvFPU$default (Lmodulecheck/parsing/gradle/dsl/ExternalDependencyDeclaration;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/ExternalDependencyDeclaration; - public fun equals (Ljava/lang/Object;)Z - public fun getConfigName-9LqIWVA ()Ljava/lang/String; - public final fun getConfigurationNameTransform ()Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform; - public final fun getCoordinates ()Lmodulecheck/model/dependency/MavenCoordinates; - public fun getDeclarationText ()Ljava/lang/String; - public final fun getGroup ()Ljava/lang/String; - public final fun getModuleName ()Ljava/lang/String; - public fun getStatementWithSurroundingText ()Ljava/lang/String; - public fun getSuppressed ()Ljava/util/List; - public final fun getVersion ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/HasBuildFile { - public abstract fun getBuildFile ()Ljava/io/File; - public abstract fun getBuildFileParser ()Lmodulecheck/parsing/gradle/dsl/BuildFileParser; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/HasDependencyDeclarations : modulecheck/model/dependency/HasConfigurations, modulecheck/model/dependency/HasDependencies, modulecheck/parsing/gradle/dsl/HasBuildFile, modulecheck/parsing/gradle/model/PluginAware { -} - -public abstract interface class modulecheck/parsing/gradle/dsl/HasSuppressedChildren { - public abstract fun getAllSuppressions ()Ljava/util/Map; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/HasSuppressions { - public abstract fun getSuppressions ()Ljava/util/List; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/InvokesConfigurationNames : modulecheck/model/dependency/HasConfigurations, modulecheck/parsing/gradle/dsl/HasBuildFile, modulecheck/parsing/gradle/dsl/HasDependencyDeclarations, modulecheck/parsing/gradle/model/PluginAware { -} - -public final class modulecheck/parsing/gradle/dsl/InvokesConfigurationNamesKt { - public static final fun getConfigurationInvocations (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/gradle/dsl/ModuleDependencyDeclaration : modulecheck/parsing/gradle/dsl/DependencyDeclaration { - public synthetic fun (Lmodulecheck/model/dependency/ProjectPath;Lmodulecheck/parsing/gradle/dsl/ProjectAccessor;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Lmodulecheck/model/dependency/ProjectPath;Lmodulecheck/parsing/gradle/dsl/ProjectAccessor;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/model/dependency/ProjectPath; - public final fun component2 ()Lmodulecheck/parsing/gradle/dsl/ProjectAccessor; - public final fun component3-9LqIWVA ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Ljava/util/List; - public final fun component7 ()Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform; - public final fun copy-DjjXWn0 (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun copy-DjjXWn0$default (Lmodulecheck/parsing/gradle/dsl/ModuleDependencyDeclaration;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZLkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public final fun copy-TZ-NI2E (Lmodulecheck/model/dependency/ProjectPath;Lmodulecheck/parsing/gradle/dsl/ProjectAccessor;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;)Lmodulecheck/parsing/gradle/dsl/ModuleDependencyDeclaration; - public static synthetic fun copy-TZ-NI2E$default (Lmodulecheck/parsing/gradle/dsl/ModuleDependencyDeclaration;Lmodulecheck/model/dependency/ProjectPath;Lmodulecheck/parsing/gradle/dsl/ProjectAccessor;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/ModuleDependencyDeclaration; - public fun equals (Ljava/lang/Object;)Z - public fun getConfigName-9LqIWVA ()Ljava/lang/String; - public final fun getConfigurationNameTransform ()Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform; - public fun getDeclarationText ()Ljava/lang/String; - public final fun getProjectAccessor ()Lmodulecheck/parsing/gradle/dsl/ProjectAccessor; - public final fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public fun getStatementWithSurroundingText ()Ljava/lang/String; - public fun getSuppressed ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/gradle/dsl/PluginDeclaration : modulecheck/parsing/gradle/dsl/BuildFileStatement { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/parsing/gradle/dsl/PluginDeclaration; - public static synthetic fun copy$default (Lmodulecheck/parsing/gradle/dsl/PluginDeclaration;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/PluginDeclaration; - public fun equals (Ljava/lang/Object;)Z - public final fun getAccessor-HL50354 ()Ljava/lang/String; - public fun getDeclarationText ()Ljava/lang/String; - public fun getStatementWithSurroundingText ()Ljava/lang/String; - public fun getSuppressed ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/PluginsBlock : modulecheck/parsing/gradle/dsl/Block, modulecheck/parsing/gradle/dsl/HasSuppressedChildren { - public abstract fun getById (Ljava/lang/String;)Lmodulecheck/parsing/gradle/dsl/PluginDeclaration; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/PluginsBlockProvider { - public abstract fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/PluginsBlockProvider$Factory { - public abstract fun create (Ljava/io/File;)Lmodulecheck/parsing/gradle/dsl/PluginsBlockProvider; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/ProjectAccessor { - public static final field Companion Lmodulecheck/parsing/gradle/dsl/ProjectAccessor$Companion; - public abstract fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public abstract fun getStatementText ()Ljava/lang/String; -} - -public final class modulecheck/parsing/gradle/dsl/ProjectAccessor$Companion { - public final fun from (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;)Lmodulecheck/parsing/gradle/dsl/ProjectAccessor; -} - -public final class modulecheck/parsing/gradle/dsl/ProjectAccessor$StringProjectAccessor : modulecheck/parsing/gradle/dsl/ProjectAccessor { - public fun (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun copy (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;)Lmodulecheck/parsing/gradle/dsl/ProjectAccessor$StringProjectAccessor; - public static synthetic fun copy$default (Lmodulecheck/parsing/gradle/dsl/ProjectAccessor$StringProjectAccessor;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/ProjectAccessor$StringProjectAccessor; - public fun equals (Ljava/lang/Object;)Z - public fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public synthetic fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public fun getStatementText ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/gradle/dsl/ProjectAccessor$TypeSafeProjectAccessor : modulecheck/parsing/gradle/dsl/ProjectAccessor { - public fun (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath; - public final fun copy (Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath;)Lmodulecheck/parsing/gradle/dsl/ProjectAccessor$TypeSafeProjectAccessor; - public static synthetic fun copy$default (Lmodulecheck/parsing/gradle/dsl/ProjectAccessor$TypeSafeProjectAccessor;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/ProjectAccessor$TypeSafeProjectAccessor; - public fun equals (Ljava/lang/Object;)Z - public fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath$TypeSafeProjectPath; - public synthetic fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public fun getStatementText ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/gradle/dsl/UnknownDependencyDeclaration : modulecheck/parsing/gradle/dsl/DependencyDeclaration { - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2-9LqIWVA ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/util/List; - public final fun component6 ()Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform; - public final fun copy-FaMAsxM (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;)Lmodulecheck/parsing/gradle/dsl/UnknownDependencyDeclaration; - public static synthetic fun copy-FaMAsxM$default (Lmodulecheck/parsing/gradle/dsl/UnknownDependencyDeclaration;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/UnknownDependencyDeclaration; - public fun equals (Ljava/lang/Object;)Z - public final fun getArgument ()Ljava/lang/String; - public fun getConfigName-9LqIWVA ()Ljava/lang/String; - public final fun getConfigurationNameTransform ()Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform; - public fun getDeclarationText ()Ljava/lang/String; - public fun getStatementWithSurroundingText ()Ljava/lang/String; - public fun getSuppressed ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - diff --git a/modulecheck-parsing/gradle/dsl/api/build.gradle.kts b/modulecheck-parsing/gradle/dsl/api/build.gradle.kts deleted file mode 100644 index 1c3287def6..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-gradle-dsl-api" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/AndroidGradleSettings.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/AndroidGradleSettings.kt deleted file mode 100644 index 3424f80340..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/AndroidGradleSettings.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import java.io.File - -data class AndroidGradleSettings( - val assignments: List, - val androidBlocks: List, - val buildFeaturesBlocks: List -) { - sealed interface AgpBlock : Block { - - data class AndroidBlock( - override val fullText: String, - override val lambdaContent: String, - override val settings: List, - override val blockSuppressed: List - ) : AgpBlock - - data class BuildFeaturesBlock( - override val fullText: String, - override val lambdaContent: String, - override val settings: List, - override val blockSuppressed: List - ) : AgpBlock - } -} - -interface AndroidGradleSettingsProvider { - - suspend fun get(): AndroidGradleSettings - - fun interface Factory { - fun create(buildFile: File): AndroidGradleSettingsProvider - } -} - -interface AndroidGradleParser { - - suspend fun parse(buildFile: File): AndroidGradleSettings -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/Assignment.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/Assignment.kt deleted file mode 100644 index 9f32be3815..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/Assignment.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -data class Assignment( - val fullText: String, - val propertyFullName: String, - val value: String, - override val declarationText: String, - override val statementWithSurroundingText: String = declarationText, - override val suppressed: List -) : BuildFileStatement diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/Block.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/Block.kt deleted file mode 100644 index a4332f6803..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/Block.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -sealed interface Block { - val fullText: String - val lambdaContent: String - val settings: List - - /** - * [FindingNames][modulecheck.finding.FindingName] which are suppressed at the block level - * - * @since 0.12.0 - */ - val blockSuppressed: List -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/BuildFileParser.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/BuildFileParser.kt deleted file mode 100644 index e6d477fec3..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/BuildFileParser.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -interface BuildFileParser { - - suspend fun pluginsBlock(): PluginsBlock? - suspend fun dependenciesBlocks(): List - suspend fun androidSettings(): AndroidGradleSettings - - fun interface Factory { - fun create(invokesConfigurationNames: InvokesConfigurationNames): BuildFileParser - } -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/BuildFileStatement.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/BuildFileStatement.kt deleted file mode 100644 index 6b7063b60d..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/BuildFileStatement.kt +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -interface BuildFileStatement { - - val statementWithSurroundingText: String - val declarationText: String - val suppressed: List -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/DependenciesBlock.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/DependenciesBlock.kt deleted file mode 100644 index 0d6b2878c0..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/DependenciesBlock.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.finding.FindingName -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath - -interface DependenciesBlock : - Block, - HasSuppressedChildren { - - fun getOrEmpty( - moduleRef: String, - configName: ConfigurationName, - testFixtures: Boolean - ): List - - fun getOrEmpty( - moduleRef: ProjectPath, - configName: ConfigurationName, - testFixtures: Boolean - ): List - - fun getOrEmpty( - mavenCoordinates: MavenCoordinates, - configName: ConfigurationName - ): List -} - -interface DependenciesBlocksProvider { - - suspend fun get(): List - - fun interface Factory { - fun create(invokesConfigurationNames: InvokesConfigurationNames): DependenciesBlocksProvider - } -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/DependencyDeclaration.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/DependencyDeclaration.kt deleted file mode 100644 index abe75e5eec..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/DependencyDeclaration.kt +++ /dev/null @@ -1,336 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath -import modulecheck.parsing.gradle.dsl.DependencyDeclaration.ConfigurationNameTransform -import modulecheck.utils.letIf -import modulecheck.utils.prefixIfNot -import modulecheck.utils.remove -import modulecheck.utils.replaceDestructured - -sealed interface DependencyDeclaration : BuildFileStatement { - val configName: ConfigurationName - - fun interface ConfigurationNameTransform { - suspend operator fun invoke(configurationName: ConfigurationName): String - } -} - -data class UnknownDependencyDeclaration( - val argument: String, - override val configName: ConfigurationName, - override val declarationText: String, - override val statementWithSurroundingText: String, - override val suppressed: List = emptyList(), - val configurationNameTransform: ConfigurationNameTransform -) : DependencyDeclaration { - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as UnknownDependencyDeclaration - - if (argument != other.argument) return false - if (configName != other.configName) return false - if (declarationText != other.declarationText) return false - if (statementWithSurroundingText != other.statementWithSurroundingText) return false - if (suppressed != other.suppressed) return false - - return true - } - - override fun hashCode(): Int { - var result = argument.hashCode() - result = 31 * result + configName.hashCode() - result = 31 * result + declarationText.hashCode() - result = 31 * result + statementWithSurroundingText.hashCode() - result = 31 * result + suppressed.hashCode() - return result - } -} - -data class ModuleDependencyDeclaration( - val projectPath: ProjectPath, - val projectAccessor: ProjectAccessor, - override val configName: ConfigurationName, - override val declarationText: String, - override val statementWithSurroundingText: String, - override val suppressed: List = emptyList(), - val configurationNameTransform: ConfigurationNameTransform -) : DependencyDeclaration { - - suspend fun copy( - newConfigName: ConfigurationName = configName, - newModulePath: ProjectPath = projectPath, - testFixtures: Boolean - ): ModuleDependencyDeclaration { - - val newConfigText = configurationNameTransform(newConfigName) - - // Figure out if the old configuration is used as a string extension, like: - // `"implementation"(...)` instead of `implementation(...)` - val quotedOldConfig = "\"${configName.value}\"" - val configIsInQuotes = declarationText.startsWith(quotedOldConfig) - - /* - If the old config is a string extension, then we need to perform a String.replace(...) on - the full string including the quotes, instead of just the configuration name. Otherwise, we - can wind up with a precompiled config name (api, implementation, etc.) inside quotes. - - This isn't a very likely scenario if the SourceSet/Configuration hierarchies are working - properly, but it's possible. One scenario would be if the build file simply has an `"api"(...)` - somewhere -- perhaps automatically added by the IDE's intention. This might be the only string - extension in the whole project, but without this check, autocorrect would use string extensions - whenever that `"api"(...)` dependency is the source. - */ - val configToReplace = if (configIsInQuotes) { - quotedOldConfig - } else { - configName.value - } - - val newModule = newModulePath != projectPath - val precedingWhitespace = "^\\s*".toRegex() - .find(statementWithSurroundingText)?.value.orEmpty() - - val newProjectPathRef = when (projectPath) { - is StringProjectPath -> newModulePath.value - is TypeSafeProjectPath -> newModulePath.typeSafeValue - } - - val newDeclaration = declarationText - .letIf(newModule) { - // strip out any config block - it.remove(""" *\{[\s\S]*}""".toRegex()) - } - .addOrRemoveTestFixtures(testFixtures) - .replaceFirst(configToReplace, newConfigText) - .replaceFirst(projectPath.value, newProjectPathRef) - .maybeFixExtraQuotes() - - val newStatement = when { - newModule -> newDeclaration.prefixIfNot(precedingWhitespace) - else -> statementWithSurroundingText.replaceFirst(declarationText, newDeclaration) - } - - return copy( - projectPath = newModulePath, - configName = newConfigName, - declarationText = newDeclaration, - statementWithSurroundingText = newStatement - ) - } - - /** - * replace any doubled up quotes with singles, like `""internalApi""` -> `"internalApi"` - * - * @since 0.12.0 - */ - private fun String.maybeFixExtraQuotes(): String { - return replaceDestructured("\"\"([^\"]*)\"\"".toRegex()) { group1 -> - "\"$group1\"" - } - } - - private fun String.addOrRemoveTestFixtures(testFixtures: Boolean): String { - - val escapedProjectAccessor = Regex.escape(projectAccessor.statementText) - val regex = "testFixtures\\s*\\(\\s*$escapedProjectAccessor\\s*\\)".toRegex() - - return when { - testFixtures && regex.containsMatchIn(this) -> this - testFixtures -> "testFixtures($this)" - else -> replace(regex, projectAccessor.statementText) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ModuleDependencyDeclaration - - if (projectPath != other.projectPath) return false - if (projectAccessor != other.projectAccessor) return false - if (configName != other.configName) return false - if (declarationText != other.declarationText) return false - if (statementWithSurroundingText != other.statementWithSurroundingText) return false - if (suppressed != other.suppressed) return false - - return true - } - - override fun hashCode(): Int { - var result = projectPath.hashCode() - result = 31 * result + projectAccessor.hashCode() - result = 31 * result + configName.hashCode() - result = 31 * result + declarationText.hashCode() - result = 31 * result + statementWithSurroundingText.hashCode() - result = 31 * result + suppressed.hashCode() - return result - } - - override fun toString(): String { - return """ModuleDependencyDeclaration( - | projectPath=$projectPath, - | projectAccessor=$projectAccessor, - | configName=$configName, - | declarationText='$declarationText', - | statementWithSurroundingText='$statementWithSurroundingText', - | suppressed=$suppressed - |) - """.trimMargin() - } -} - -data class ExternalDependencyDeclaration( - override val configName: ConfigurationName, - override val declarationText: String, - override val statementWithSurroundingText: String, - override val suppressed: List = emptyList(), - val configurationNameTransform: ConfigurationNameTransform, - val group: String?, - val moduleName: String?, - val version: String?, - val coordinates: MavenCoordinates -) : DependencyDeclaration { - - suspend fun copy( - newConfigName: ConfigurationName = configName, - newCoordinates: MavenCoordinates = coordinates, - testFixtures: Boolean - ): ExternalDependencyDeclaration { - - val newConfigText = configurationNameTransform(newConfigName) - - // Figure out if the old configuration is used as a string extension, like: - // `"implementation"(...)` instead of `implementation(...)` - val quotedOldConfig = "\"${configName.value}\"" - val configIsInQuotes = declarationText.startsWith(quotedOldConfig) - - /* - If the old config is a string extension, then we need to perform a String.replace(...) on - the full string including the quotes, instead of just the configuration name. Otherwise, we - can wind up with a precompiled config name (api, implementation, etc.) inside quotes. - - This isn't a very likely scenario if the SourceSet/Configuration hierarchies are working - properly, but it's possible. One scenario would be if the build file simply has an `"api"(...)` - somewhere -- perhaps automatically added by the IDE's intention. This might be the only string - extension in the whole project, but without this check, autocorrect would use string extensions - whenever that `"api"(...)` dependency is the source. - */ - val configToReplace = if (configIsInQuotes) { - quotedOldConfig - } else { - configName.value - } - - val newLibraryCoordinates = newCoordinates != coordinates - val precedingWhitespace = "^\\s*".toRegex() - .find(statementWithSurroundingText)?.value.orEmpty() - - val newDeclaration = declarationText - .letIf(newLibraryCoordinates) { - // strip out any config block - it.remove(""" *\{[\s\S]*}""".toRegex()) - } - .addOrRemoveTestFixtures(testFixtures) - .replaceFirst(configToReplace, newConfigText) - .replaceFirst(coordinates.name, newCoordinates.name) - .maybeFixExtraQuotes() - - val newStatement = when { - newLibraryCoordinates -> newDeclaration.prefixIfNot(precedingWhitespace) - else -> statementWithSurroundingText.replaceFirst(declarationText, newDeclaration) - } - - return copy( - coordinates = newCoordinates, - configName = newConfigName, - declarationText = newDeclaration, - statementWithSurroundingText = newStatement - ) - } - - /** - * replace any doubled up quotes with singles, like `""internalApi""` -> `"internalApi"` - * - * @since 0.12.0 - */ - private fun String.maybeFixExtraQuotes(): String { - return replaceDestructured("\"\"([^\"]*)\"\"".toRegex()) { group1 -> - "\"$group1\"" - } - } - - private fun String.addOrRemoveTestFixtures(testFixtures: Boolean): String { - - val escapedCoords = Regex.escape(coordinates.name) - val regex = "testFixtures\\s*\\(\\s*$escapedCoords\\s*\\)".toRegex() - - return when { - testFixtures && regex.containsMatchIn(this) -> this - testFixtures -> "testFixtures($this)" - else -> replace(regex, coordinates.name) - } - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as ExternalDependencyDeclaration - - if (configName != other.configName) return false - if (declarationText != other.declarationText) return false - if (statementWithSurroundingText != other.statementWithSurroundingText) return false - if (suppressed != other.suppressed) return false - if (group != other.group) return false - if (moduleName != other.moduleName) return false - if (version != other.version) return false - - return true - } - - override fun hashCode(): Int { - var result = configName.hashCode() - result = 31 * result + declarationText.hashCode() - result = 31 * result + statementWithSurroundingText.hashCode() - result = 31 * result + suppressed.hashCode() - result = 31 * result + (group?.hashCode() ?: 0) - result = 31 * result + (moduleName?.hashCode() ?: 0) - result = 31 * result + (version?.hashCode() ?: 0) - return result - } - - override fun toString(): String { - return """ExternalDependencyDeclaration( - | configName=$configName, - | declarationText='$declarationText', - | statementWithSurroundingText='$statementWithSurroundingText', - | suppressed=$suppressed, - | group=$group, - | moduleName=$moduleName, - | version=$version - |) - """.trimMargin() - } -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/HasSuppressions.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/HasSuppressions.kt deleted file mode 100644 index e1df611592..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/HasSuppressions.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -/** - * Models some compilation unit, like a DSL block or a function, where the - * declarations or statements ([C]) inside it may have suppressions ([S]). - * - * @since 0.12.0 - */ -interface HasSuppressedChildren { - val allSuppressions: Map> -} - -interface HasSuppressions { - val suppressions: List -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/InvokesConfigurationNames.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/InvokesConfigurationNames.kt deleted file mode 100644 index 2eb4943b4d..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/InvokesConfigurationNames.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.model.dependency.HasConfigurations -import modulecheck.model.dependency.HasDependencies -import modulecheck.parsing.gradle.model.PluginAware -import java.io.File - -interface InvokesConfigurationNames : - PluginAware, - HasBuildFile, - HasConfigurations, - HasDependencyDeclarations - -interface HasBuildFile { - val buildFile: File - - val buildFileParser: BuildFileParser -} - -interface HasDependencyDeclarations : - HasBuildFile, - HasDependencies, - HasConfigurations, - PluginAware - -suspend fun HasDependencyDeclarations.getConfigurationInvocations(): Set { - return buildFileParser.dependenciesBlocks() - .flatMap { it.settings } - .mapNotNull { declaration -> - - val declarationText = declaration.declarationText.trim() - - declaration.configName.value - .takeIf { declarationText.startsWith(it) } - ?: "\"${declaration.configName.value}\"" - .takeIf { declarationText.startsWith(it) } - } - .toSet() -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/PluginDeclaration.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/PluginDeclaration.kt deleted file mode 100644 index 356cd3a75d..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/PluginDeclaration.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.model.dependency.PluginAccessor -import modulecheck.utils.lazy.unsafeLazy - -data class PluginDeclaration( - override val statementWithSurroundingText: String, - override val declarationText: String, - override val suppressed: List -) : BuildFileStatement { - /** - * All possible variations on an accessor for this plugin's ID. - * - * @since 0.12.0 - */ - val accessor: PluginAccessor by unsafeLazy { PluginAccessor(declarationText) } -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/PluginsBlock.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/PluginsBlock.kt deleted file mode 100644 index f4ffe28805..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/PluginsBlock.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.finding.FindingName -import java.io.File - -interface PluginsBlock : - Block, - HasSuppressedChildren { - fun getById(pluginId: String): PluginDeclaration? -} - -interface PluginsBlockProvider { - - suspend fun get(): PluginsBlock? - - fun interface Factory { - fun create(buildFile: File): PluginsBlockProvider - } -} diff --git a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/ProjectAccessor.kt b/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/ProjectAccessor.kt deleted file mode 100644 index ce86d7f54f..0000000000 --- a/modulecheck-parsing/gradle/dsl/api/src/main/kotlin/modulecheck/parsing/gradle/dsl/ProjectAccessor.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath - -sealed interface ProjectAccessor { - val statementText: String - val projectPath: ProjectPath - - data class StringProjectAccessor( - override val statementText: String, - override val projectPath: StringProjectPath - ) : ProjectAccessor { - init { - require(statementText.matches("""^\s?project\s?\([\s\S]*""".toRegex())) { - "expected a normal project function but instead got `$statementText`." - } - } - } - - data class TypeSafeProjectAccessor( - override val statementText: String, - override val projectPath: TypeSafeProjectPath - ) : ProjectAccessor { - init { - require(statementText.matches("""^\s?projects\s?\.[\s\S]*""".toRegex())) { - "expected a type-safe project accessor but instead got `$statementText`." - } - } - } - - companion object { - fun from(rawString: String, projectPath: ProjectPath): ProjectAccessor { - - return when (projectPath) { - is StringProjectPath -> StringProjectAccessor(rawString, projectPath) - is TypeSafeProjectPath -> TypeSafeProjectAccessor(rawString, projectPath) - } - } - } -} diff --git a/modulecheck-parsing/gradle/dsl/internal/api/internal.api b/modulecheck-parsing/gradle/dsl/internal/api/internal.api deleted file mode 100644 index cf1e0d47fa..0000000000 --- a/modulecheck-parsing/gradle/dsl/internal/api/internal.api +++ /dev/null @@ -1,93 +0,0 @@ -public final class anvil/hint/Modulecheck_parsing_gradle_dsl_internal_Factory_Factory_TaskScope_BindingModule_23b64e89_2fec4e93Kt { - public static final fun getModulecheck_parsing_gradle_dsl_internal_Factory_Factory_TaskScope_BindingModule_23b64e89_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_gradle_dsl_internal_Factory_Factory_TaskScope_BindingModule_23b64e89_scope0 ()Lkotlin/reflect/KClass; -} - -public abstract class modulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock : modulecheck/parsing/gradle/dsl/DependenciesBlock { - public static final field Companion Lmodulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock$Companion; - public fun (Lmodulecheck/reporting/logging/McLogger;Ljava/util/List;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration$ConfigurationNameTransform;Lmodulecheck/model/dependency/ProjectDependency$Factory;)V - public final fun addModuleStatement-FdhTdL0 (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;Lmodulecheck/parsing/gradle/dsl/ProjectAccessor;Ljava/util/List;)V - public final fun addNonModuleStatement-DjjXWn0 (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;Ljava/util/List;)V - public final fun addUnknownStatement-DjjXWn0 (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public fun getAllSuppressions ()Ljava/util/Map; - public final fun getBlockSuppressed ()Ljava/util/List; - public fun getOrEmpty-25SeVdM (Lmodulecheck/model/dependency/MavenCoordinates;Ljava/lang/String;)Ljava/util/List; - public fun getOrEmpty-vAhOJHc (Ljava/lang/String;Ljava/lang/String;Z)Ljava/util/List; - public fun getOrEmpty-vAhOJHc (Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;Z)Ljava/util/List; - public fun getSettings ()Ljava/util/List; - protected abstract fun originalLineMatchesParsed (Ljava/lang/String;Ljava/lang/String;)Z -} - -public final class modulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock$Companion { - public final fun getTestFixturesRegex ()Lkotlin/text/Regex; -} - -public abstract class modulecheck/parsing/gradle/dsl/internal/AbstractPluginsBlock : modulecheck/parsing/gradle/dsl/PluginsBlock { - public fun (Lmodulecheck/reporting/logging/McLogger;Ljava/util/List;)V - public final fun addStatement (Ljava/lang/String;Ljava/util/List;)V - protected abstract fun findOriginalStringIndex (Ljava/lang/String;)I - public fun getAllSuppressions ()Ljava/util/Map; - public fun getBlockSuppressed ()Ljava/util/List; - public fun getById (Ljava/lang/String;)Lmodulecheck/parsing/gradle/dsl/PluginDeclaration; - protected final fun getOriginalLines ()Ljava/util/List; - public fun getSettings ()Ljava/util/List; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/internal/DependenciesBlocksProvider { - public abstract fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/internal/DependenciesBlocksProvider$Factory { - public abstract fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/internal/DependenciesBlocksProvider; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/internal/Factory_Factory_TaskScope_BindingModule_23b64e89 { - public abstract fun bindFactory (Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser$Factory;)Lmodulecheck/parsing/gradle/dsl/BuildFileParser$Factory; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/internal/PluginsBlockProvider { - public abstract fun get ()Lmodulecheck/parsing/gradle/dsl/PluginsBlock; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/internal/PluginsBlockProvider$Factory { - public abstract fun create (Ljava/io/File;)Lmodulecheck/parsing/gradle/dsl/internal/PluginsBlockProvider; -} - -public final class modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser : modulecheck/parsing/gradle/dsl/BuildFileParser { - public fun (Lmodulecheck/parsing/gradle/dsl/DependenciesBlocksProvider$Factory;Lmodulecheck/parsing/gradle/dsl/PluginsBlockProvider$Factory;Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider$Factory;Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)V - public fun androidSettings (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun dependenciesBlocks (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun pluginsBlock (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser$Factory : modulecheck/parsing/gradle/dsl/BuildFileParser$Factory { - public abstract fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser; -} - -public final class modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory { - public static final field Companion Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory; - public final fun get (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser; - public static final fun newInstance (Lmodulecheck/parsing/gradle/dsl/DependenciesBlocksProvider$Factory;Lmodulecheck/parsing/gradle/dsl/PluginsBlockProvider$Factory;Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider$Factory;Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser; -} - -public final class modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory; - public final fun newInstance (Lmodulecheck/parsing/gradle/dsl/DependenciesBlocksProvider$Factory;Lmodulecheck/parsing/gradle/dsl/PluginsBlockProvider$Factory;Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider$Factory;Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser; -} - -public final class modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory_Impl : modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser$Factory { - public static final field Companion Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory_Impl$Companion; - public fun (Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory;)V - public synthetic fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/BuildFileParser; - public fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser; - public static final fun create (Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory;)Ljavax/inject/Provider; - public static final fun createFactoryProvider (Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory;)Ldagger/internal/Provider; -} - -public final class modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory_Impl$Companion { - public final fun create (Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory;)Ljavax/inject/Provider; - public final fun createFactoryProvider (Lmodulecheck/parsing/gradle/dsl/internal/RealBuildFileParser_Factory;)Ldagger/internal/Provider; -} - diff --git a/modulecheck-parsing/gradle/dsl/internal/build.gradle.kts b/modulecheck-parsing/gradle/dsl/internal/build.gradle.kts deleted file mode 100644 index f48b675a2c..0000000000 --- a/modulecheck-parsing/gradle/dsl/internal/build.gradle.kts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-gradle-dsl-internal" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-reporting:logging:api")) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-finding:name")) - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock.kt b/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock.kt deleted file mode 100644 index 50d453c559..0000000000 --- a/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock.kt +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl.internal - -import modulecheck.finding.FindingName -import modulecheck.finding.FindingName.Companion.migrateLegacyIdOrNull -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.parsing.gradle.dsl.DependenciesBlock -import modulecheck.parsing.gradle.dsl.DependencyDeclaration -import modulecheck.parsing.gradle.dsl.DependencyDeclaration.ConfigurationNameTransform -import modulecheck.parsing.gradle.dsl.ExternalDependencyDeclaration -import modulecheck.parsing.gradle.dsl.InvokesConfigurationNames -import modulecheck.parsing.gradle.dsl.ModuleDependencyDeclaration -import modulecheck.parsing.gradle.dsl.ProjectAccessor -import modulecheck.parsing.gradle.dsl.UnknownDependencyDeclaration -import modulecheck.reporting.logging.McLogger -import modulecheck.utils.lazy.ResetManager -import modulecheck.utils.lazy.lazyResets -import modulecheck.utils.remove - -abstract class AbstractDependenciesBlock( - private val logger: McLogger, - blockSuppressed: List, - private val configurationNameTransform: ConfigurationNameTransform, - private val projectDependency: ProjectDependency.Factory -) : DependenciesBlock { - - private val resetManager = ResetManager() - - final override val blockSuppressed: List = blockSuppressed.updateOldSuppresses() - - override val allSuppressions: Map> by resetManager.lazyResets { - buildMap> { - - allModuleDeclarations.forEach { (configuredModule, declarations) -> - - val cached = getOrPut(configuredModule) { - blockSuppressed - .mapNotNull { FindingName.safe(it) } - .mapTo(mutableSetOf()) { it } - } - - declarations.forEach { moduleDependencyDeclaration -> - - cached += moduleDependencyDeclaration.suppressed.updateOldSuppresses() - .plus(blockSuppressed) - .asFindingNames() - } - } - } - } - - private val originalLines by lazy { lambdaContent.lines().toMutableList() } - - private val _allDeclarations = mutableListOf() - - override val settings: List - get() = _allDeclarations - - private val allExternalDeclarations = - mutableMapOf>() - - private val allModuleDeclarations = - mutableMapOf>() - - fun addNonModuleStatement( - configName: ConfigurationName, - parsedString: String, - coordinates: MavenCoordinates, - suppressed: List - ) { - val originalString = getOriginalString(parsedString) - - val declaration = ExternalDependencyDeclaration( - configName = configName, - declarationText = parsedString, - statementWithSurroundingText = originalString, - group = coordinates.group, - moduleName = coordinates.moduleName, - version = coordinates.version, - coordinates = coordinates, - suppressed = suppressed.updateOldSuppresses() + blockSuppressed, - configurationNameTransform = configurationNameTransform - ) - _allDeclarations.add(declaration) - allExternalDeclarations.getOrPut(coordinates) { mutableListOf() } - .add(declaration) - } - - fun addUnknownStatement( - configName: ConfigurationName, - parsedString: String, - argument: String, - suppressed: List - ) { - val originalString = getOriginalString(parsedString) - - val declaration = UnknownDependencyDeclaration( - argument = argument, - configName = configName, - declarationText = parsedString, - statementWithSurroundingText = originalString, - suppressed = suppressed.updateOldSuppresses() + blockSuppressed, - configurationNameTransform = configurationNameTransform - ) - _allDeclarations.add(declaration) - } - - /** - * @param projectPath `:my:project:lib1` or `my.project.lib1` - * @param projectAccessor `project(:my:project:lib1)` or `projects.my.project.lib1` - * @since 0.12.0 - */ - fun addModuleStatement( - configName: ConfigurationName, - parsedString: String, - projectPath: ProjectPath, - projectAccessor: ProjectAccessor, - suppressed: List - ) { - - val isTestFixtures = parsedString.contains(testFixturesRegex) - - val cpd = projectDependency.create( - configurationName = configName, - path = projectPath, - isTestFixture = isTestFixtures - ) - - val originalString = getOriginalString(parsedString) - - val declaration = ModuleDependencyDeclaration( - projectPath = projectPath, - projectAccessor = projectAccessor, - configName = configName, - declarationText = parsedString, - statementWithSurroundingText = originalString, - suppressed = suppressed.updateOldSuppresses() + blockSuppressed, - configurationNameTransform = configurationNameTransform - ) - - allModuleDeclarations.getOrPut(cpd) { mutableListOf() } - .add(declaration) - - _allDeclarations.add(declaration) - - resetManager.reset() - } - - private fun List.updateOldSuppresses(): List { - @Suppress("DEPRECATION") - return map { originalName -> - migrateLegacyIdOrNull(originalName, logger) ?: originalName - } - } - - private fun Collection.asFindingNames(): Set { - return mapNotNull { FindingName.safe(it) }.toSet() - } - - override fun getOrEmpty( - moduleRef: String, - configName: ConfigurationName, - testFixtures: Boolean - ): List { - return getOrEmpty(StringProjectPath(moduleRef), configName, testFixtures) - } - - override fun getOrEmpty( - moduleRef: ProjectPath, - configName: ConfigurationName, - testFixtures: Boolean - ): List { - - return allModuleDeclarations[ - projectDependency.create( - configurationName = configName, - path = moduleRef, - isTestFixture = testFixtures - ) - ].orEmpty() - } - - override fun getOrEmpty( - mavenCoordinates: MavenCoordinates, - configName: ConfigurationName - ): List { - return allExternalDeclarations[mavenCoordinates] - ?.filter { it.configName == configName } - .orEmpty() - } - - /** - * Compares the target parsed string to the un-parsed lines of the original dependencies - * block, and returns the index of **the last row** which matches the parsed string. - * - * So, given the target: - * - * ``` - * api(projects.foo.bar) { - * exclude(group = "androidx.appcompat") - * } - * ``` - * - * And given the dependencies lines: - * - * ``` - * - * // Remove leaking AppCompat dependency - * api(projects.foo.bar) { - * exclude(group = "androidx.appcompat") - * } // this is index 4 - * api(libs.junit) - * ``` - * - * This function would return index `4`, because rows 2-4 match the target parsed string. - * - * From this value, [getOriginalString] will return a multi-line - * string which includes the blank line and the comment. - * - * @since 0.12.0 - */ - private fun findLastMatchingRowIndex(parsedString: String): Int { - val targetLines = parsedString.lines() - .map { it.trimStart() } - - // index is incremented at least once (if the first line is a match), so start at -1 - var index = -1 - - var matched: Boolean - - do { - val candidates = originalLines - .drop(index + 1) - .take(targetLines.size) - .map { it.trimStart() } - - matched = candidates.zip(targetLines) - .all { (candidate, target) -> - originalLineMatchesParsed(candidate, target) - } - - if (matched) { - index += targetLines.size - } else { - - index++ - } - } while (!matched) - - return index - } - - protected abstract fun originalLineMatchesParsed( - originalLine: String, - parsedString: String - ): Boolean - - private fun getOriginalString(parsedString: String): String { - val originalStringIndex = findLastMatchingRowIndex(parsedString) - - val originalStringLines = List(originalStringIndex + 1) { - originalLines.removeFirst() - } - - return originalStringLines.joinToString("\n") - .remove("""[\s\S]*\/\/ ModuleCheck finding.*(?:\r\n|\r|\n)""".toRegex()) - } - - companion object { - val testFixturesRegex: Regex = "testFixtures\\([\\s\\S]*\\)".toRegex() - } -} - -interface DependenciesBlocksProvider { - - suspend fun get(): List - - fun interface Factory { - fun create(invokesConfigurationNames: InvokesConfigurationNames): DependenciesBlocksProvider - } -} diff --git a/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/AbstractPluginsBlock.kt b/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/AbstractPluginsBlock.kt deleted file mode 100644 index 8cc7da5019..0000000000 --- a/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/AbstractPluginsBlock.kt +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl.internal - -import modulecheck.finding.FindingName -import modulecheck.parsing.gradle.dsl.PluginDeclaration -import modulecheck.parsing.gradle.dsl.PluginsBlock -import modulecheck.reporting.logging.McLogger -import modulecheck.utils.lazy.ResetManager -import modulecheck.utils.lazy.lazyResets -import java.io.File - -abstract class AbstractPluginsBlock( - private val logger: McLogger, - blockSuppressed: List -) : PluginsBlock { - - private val resetManager = ResetManager() - - protected val originalLines: MutableList by lazy { lambdaContent.lines().toMutableList() } - - private val _allDeclarations = mutableListOf() - - override val settings: List - get() = _allDeclarations - - override val blockSuppressed: List = blockSuppressed.updateOldSuppresses() - - override val allSuppressions: Map> by resetManager.lazyResets { - buildMap> { - - _allDeclarations.forEach { pluginDeclaration -> - - val cached = getOrPut(pluginDeclaration) { - blockSuppressed.mapNotNullTo(mutableSetOf()) { FindingName.safe(it) } - } - - cached += pluginDeclaration.suppressed.updateOldSuppresses() - .plus(blockSuppressed) - .asFindingNames() - } - } - } - - fun addStatement(parsedString: String, suppressed: List) { - val originalString = getOriginalString(parsedString) - - val declaration = PluginDeclaration( - statementWithSurroundingText = originalString, - declarationText = parsedString, - suppressed = suppressed.updateOldSuppresses() + blockSuppressed - ) - _allDeclarations.add(declaration) - resetManager.reset() - } - - protected abstract fun findOriginalStringIndex(parsedString: String): Int - - override fun getById(pluginId: String): PluginDeclaration? { - val regex = pluginId.let { Regex.escape(it) } - .replace("\\.", "\\s*\\.\\s*") - .toRegex() - - return settings.firstOrNull { it.declarationText.contains(regex) } - } - - private fun getOriginalString(parsedString: String): String { - val originalStringIndex = findOriginalStringIndex(parsedString) - - val originalStringLines = List(originalStringIndex + 1) { - originalLines.removeFirst() - } - - return originalStringLines.joinToString("\n") - } - - private fun List.updateOldSuppresses(): List { - @Suppress("DEPRECATION") - return map { originalName -> - FindingName.migrateLegacyIdOrNull(originalName, logger) ?: originalName - } - } - - private fun Collection.asFindingNames(): Set { - return mapNotNullTo(mutableSetOf()) { FindingName.safe(it) } - } -} - -interface PluginsBlockProvider { - - fun get(): PluginsBlock? - - fun interface Factory { - fun create(buildFile: File): PluginsBlockProvider - } -} diff --git a/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser.kt b/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser.kt deleted file mode 100644 index db4985b33f..0000000000 --- a/modulecheck-parsing/gradle/dsl/internal/src/main/kotlin/modulecheck/parsing/gradle/dsl/internal/RealBuildFileParser.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl.internal - -import com.squareup.anvil.annotations.ContributesBinding -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import modulecheck.dagger.TaskScope -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings -import modulecheck.parsing.gradle.dsl.AndroidGradleSettingsProvider -import modulecheck.parsing.gradle.dsl.BuildFileParser -import modulecheck.parsing.gradle.dsl.DependenciesBlock -import modulecheck.parsing.gradle.dsl.DependenciesBlocksProvider -import modulecheck.parsing.gradle.dsl.InvokesConfigurationNames -import modulecheck.parsing.gradle.dsl.PluginsBlock -import modulecheck.parsing.gradle.dsl.PluginsBlockProvider - -class RealBuildFileParser @AssistedInject constructor( - dependenciesBlocksProviderFactory: DependenciesBlocksProvider.Factory, - pluginsBlockProviderFactory: PluginsBlockProvider.Factory, - androidGradleSettingsProviderFactory: AndroidGradleSettingsProvider.Factory, - @Assisted - private val invokesConfigurationNames: InvokesConfigurationNames -) : BuildFileParser { - - private val dependenciesBlocksProvider by lazy { - dependenciesBlocksProviderFactory.create(invokesConfigurationNames) - } - private val pluginsBlockProvider by lazy { - pluginsBlockProviderFactory.create(invokesConfigurationNames.buildFile) - } - private val androidGradleSettingsProvider by lazy { - androidGradleSettingsProviderFactory.create(invokesConfigurationNames.buildFile) - } - - private val lock = Mutex(locked = false) - - override suspend fun pluginsBlock(): PluginsBlock? = lock.withLock { pluginsBlockProvider.get() } - override suspend fun dependenciesBlocks(): List = - lock.withLock { dependenciesBlocksProvider.get() } - - override suspend fun androidSettings(): AndroidGradleSettings = - lock.withLock { androidGradleSettingsProvider.get() } - - @ContributesBinding(TaskScope::class) - @AssistedFactory - interface Factory : BuildFileParser.Factory { - override fun create(invokesConfigurationNames: InvokesConfigurationNames): RealBuildFileParser - } -} diff --git a/modulecheck-parsing/gradle/dsl/precompiled/api/precompiled.api b/modulecheck-parsing/gradle/dsl/precompiled/api/precompiled.api deleted file mode 100644 index 5a735c4f06..0000000000 --- a/modulecheck-parsing/gradle/dsl/precompiled/api/precompiled.api +++ /dev/null @@ -1,18 +0,0 @@ -public final class modulecheck/parsing/gradle/dsl/ModifyKt { - public static final fun addDependency (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration;)V - public static synthetic fun addDependency$default (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration;Lmodulecheck/parsing/gradle/dsl/DependencyDeclaration;ILjava/lang/Object;)V - public static final fun removeDependencyWithComment (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lmodulecheck/parsing/gradle/dsl/BuildFileStatement;Ljava/lang/String;Lmodulecheck/model/dependency/ConfiguredDependency;)V - public static synthetic fun removeDependencyWithComment$default (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lmodulecheck/parsing/gradle/dsl/BuildFileStatement;Ljava/lang/String;Lmodulecheck/model/dependency/ConfiguredDependency;ILjava/lang/Object;)V - public static final fun removeDependencyWithDelete (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lmodulecheck/parsing/gradle/dsl/BuildFileStatement;Lmodulecheck/model/dependency/ConfiguredDependency;)V - public static synthetic fun removeDependencyWithDelete$default (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lmodulecheck/parsing/gradle/dsl/BuildFileStatement;Lmodulecheck/model/dependency/ConfiguredDependency;ILjava/lang/Object;)V -} - -public final class modulecheck/parsing/gradle/dsl/PrecompiledKt { - public static final fun asDeclaration (Lmodulecheck/model/dependency/ConfiguredDependency;Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun buildFileInvocationText-9A_UJks (Ljava/lang/String;Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun closestDeclarationOrNull (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lmodulecheck/model/dependency/ConfiguredDependency;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun createDependencyDeclaration-Wz0Wq68 (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun createDependencyDeclaration-Wz0Wq68 (Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Ljava/lang/String;Lmodulecheck/model/dependency/ProjectPath;ZLkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun isDefinitelyPrecompiledForProject-9A_UJks (Ljava/lang/String;Lmodulecheck/parsing/gradle/dsl/HasDependencyDeclarations;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - diff --git a/modulecheck-parsing/gradle/dsl/precompiled/build.gradle.kts b/modulecheck-parsing/gradle/dsl/precompiled/build.gradle.kts deleted file mode 100644 index c02738964c..0000000000 --- a/modulecheck-parsing/gradle/dsl/precompiled/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-gradle-dsl-precompiled" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - - implementation(project(path = ":modulecheck-model:sourceset:api")) - implementation(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/gradle/dsl/precompiled/src/main/kotlin/modulecheck/parsing/gradle/dsl/modify.kt b/modulecheck-parsing/gradle/dsl/precompiled/src/main/kotlin/modulecheck/parsing/gradle/dsl/modify.kt deleted file mode 100644 index d7375846fc..0000000000 --- a/modulecheck-parsing/gradle/dsl/precompiled/src/main/kotlin/modulecheck/parsing/gradle/dsl/modify.kt +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import kotlinx.coroutines.runBlocking -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ExternalDependency -import modulecheck.model.dependency.ProjectDependency -import modulecheck.utils.prefixIfNot -import modulecheck.utils.replaceDestructured -import modulecheck.utils.suffixIfNot - -/** - * @param configuredDependency the dependency model being added - * @param newDeclaration the text to be added to the project's build file - * @param existingMarkerDeclaration if not null, the new declaration will be added above - * or beyond this declaration. Of all declarations in the `dependencies { ... }` block, - * this declaration should be closest to the desired location of the new declaration. - * @receiver the project to which we're adding a dependency - * @since 0.12.0 - */ -fun HasDependencyDeclarations.addDependency( - configuredDependency: ConfiguredDependency, - newDeclaration: DependencyDeclaration, - existingMarkerDeclaration: DependencyDeclaration? = null -) { - - if (existingMarkerDeclaration != null) { - prependStatement( - newDeclaration = newDeclaration, - existingDeclaration = existingMarkerDeclaration - ) - } else { - addStatement(newDeclaration = newDeclaration) - } - - when (configuredDependency) { - is ProjectDependency -> projectDependencies.add(configuredDependency) - is ExternalDependency -> externalDependencies.add(configuredDependency) - } -} - -private fun HasDependencyDeclarations.prependStatement( - newDeclaration: DependencyDeclaration, - existingDeclaration: DependencyDeclaration -) = synchronized(buildFile) { - - val oldStatement = existingDeclaration.statementWithSurroundingText - val newStatement = newDeclaration.statementWithSurroundingText - - // the `prefixIfNot("\n")` here is important. - // It needs to match what we're doing if we delete a dependency. Otherwise, we wind up adding - // or removing newlines instead of just modifying the dependencies. - // See https://github.com/RBusarow/ModuleCheck/issues/443 - val combinedStatement = newStatement.plus(oldStatement.prefixIfNot("\n")) - - val buildFileText = buildFile.readText() - - buildFile.writeText(buildFileText.replace(oldStatement, combinedStatement)) -} - -private fun HasDependencyDeclarations.addStatement(newDeclaration: DependencyDeclaration) = - synchronized(buildFile) { - - val newStatement = newDeclaration.statementWithSurroundingText - - val buildFileText = buildFile.readText() - - runBlocking { - val oldBlockOrNull = buildFileParser.dependenciesBlocks().lastOrNull() - - if (oldBlockOrNull != null) { - - val newBlock = oldBlockOrNull.fullText - .replaceDestructured("""([\s\S]*)}(\s*)""".toRegex()) { group1, group2 -> - - val prefix = group1.trim(' ') - .suffixIfNot("\n") - - "$prefix$newStatement}$group2" - } - - buildFile.writeText(buildFileText.replace(oldBlockOrNull.fullText, newBlock)) - } else { - - val newBlock = "dependencies {\n${newStatement.suffixIfNot("\n")}}" - .prefixIfNot("\n\n") - val newText = buildFileText + newBlock - - buildFile.writeText(newText) - } - } - } - -fun HasDependencyDeclarations.removeDependencyWithComment( - statement: BuildFileStatement, - fixLabel: String, - configuredDependency: ConfiguredDependency? = null -) { - synchronized(buildFile) { - - val text = buildFile.readText() - - val declarationText = statement.declarationText - - val lines = declarationText.lines() - val lastIndex = lines.lastIndex - val newDeclarationText = lines - .mapIndexed { index: Int, str: String -> - - // don't comment out a blank line - if (str.isBlank()) return@mapIndexed str - - val commented = str.replace("""(\s*)(\S.*)""".toRegex()) { mr -> - val (whitespace, code) = mr.destructured - "$whitespace// $code" - } - - if (index == lastIndex) { - commented + fixLabel - } else { - commented - } - } - .joinToString("\n") - - val newText = text.replace(declarationText, newDeclarationText) - - buildFile.writeText(newText) - - if (configuredDependency is ProjectDependency) { - - projectDependencies.remove(configuredDependency) - } - } -} - -fun HasDependencyDeclarations.removeDependencyWithDelete( - statement: BuildFileStatement, - configuredDependency: ConfiguredDependency? = null -) { - synchronized(buildFile) { - val text = buildFile.readText() - - buildFile.writeText( - // the `prefixIfNot("\n")` here is important. - // It needs to match what we're doing if we add a new dependency. Otherwise, we wind up adding - // or removing newlines instead of just modifying the dependencies. - // See https://github.com/RBusarow/ModuleCheck/issues/443 - text.replaceFirst(statement.statementWithSurroundingText.prefixIfNot("\n"), "") - ) - - if (configuredDependency is ProjectDependency) { - projectDependencies.remove(configuredDependency) - } - } -} diff --git a/modulecheck-parsing/gradle/dsl/precompiled/src/main/kotlin/modulecheck/parsing/gradle/dsl/precompiled.kt b/modulecheck-parsing/gradle/dsl/precompiled/src/main/kotlin/modulecheck/parsing/gradle/dsl/precompiled.kt deleted file mode 100644 index 15d676a08a..0000000000 --- a/modulecheck-parsing/gradle/dsl/precompiled/src/main/kotlin/modulecheck/parsing/gradle/dsl/precompiled.kt +++ /dev/null @@ -1,492 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.model.dependency.ExternalDependency -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.hasPrefix -import modulecheck.model.sourceset.removePrefix -import modulecheck.parsing.gradle.dsl.ProjectAccessor.TypeSafeProjectAccessor -import modulecheck.parsing.kotlin.compiler.internal.isKotlinScriptFile -import modulecheck.utils.findMinimumIndent -import modulecheck.utils.isGreaterThan -import modulecheck.utils.letIf -import modulecheck.utils.mapToSet -import modulecheck.utils.prefixIfNot -import modulecheck.utils.sortedWith - -/** - * Precompiled configuration names are names which are added by a pre-compiled - * plugin. These names can be used as functions in Kotlin scripts. examples: - * - * ``` - * api("some-dependency") - * testImplementation(project(":my-lib")) - * kapt(libs.dagger) - * ``` - * - * If a configuration is added in a local build script, then it won't have a function associated - * with it. In this case, the Kotlin script supports using a String extension function: - * - * ``` - * "internalReleaseApi"(libs.timber) - * ``` - * - * @param project the project in which the configuration name is being used - * @receiver the configuration name which may have an accessor - * @return `true` if we can know for sure that it's pre-compiled. `false` if we aren't certain. - * @since 0.12.0 - */ -suspend fun ConfigurationName.isDefinitelyPrecompiledForProject( - project: HasDependencyDeclarations -): Boolean { - - return toSourceSetName().isDefinitelyPrecompiledForProject(project) || - project.getConfigurationInvocations().contains(value) -} - -/** - * Creates a new [DependencyDeclaration] which can be added to a build - * file, potentially using a similar existing declaration as a template. - * - * @param project - * @return a Pair where the first declaration is the newly created one, and the - * second is the pre-existing template, or null if a template was not used. - */ -suspend fun ConfiguredDependency.asDeclaration( - project: HasDependencyDeclarations -): Pair { - - val tokenOrNull = project.closestDeclarationOrNull( - newDependency = this, - matchPathFirst = true - ) - - val newDeclaration = when (val newDependency = this) { - is ProjectDependency -> newDependency.asModuleDependencyDeclaration(project, tokenOrNull) - is ExternalDependency -> newDependency.asExternalDependencyDeclaration(tokenOrNull, project) - } - - return newDeclaration to tokenOrNull -} - -/** - * Finds the existing dependency declaration (if there are any) - * which is the closest match to the desired new dependency. - * - * @param newDependency The dependency being added - * @param matchPathFirst If true, matching project paths will be - * prioritized over matching configurations. If false, configuration - * matches will take priority over a matching project path. - * @receiver the project containing this declaration's match - * @return the closest matching declaration, or null if there are no declarations at all. - * @since 0.12.0 - */ -suspend fun HasDependencyDeclarations.closestDeclarationOrNull( - newDependency: ConfiguredDependency, - matchPathFirst: Boolean -): DependencyDeclaration? { - - return buildFileParser.dependenciesBlocks() - .firstNotNullOfOrNull { dependenciesBlock -> - - val sorted = dependenciesBlock.settings - .filterNot { it is UnknownDependencyDeclaration } - .sorted(matchPathFirst, newDependency) - - val closestDeclaration = sorted.firstOrNull { - when (newDependency) { - is ExternalDependency -> it.mavenCoordinatesOrNull() == newDependency.mavenCoordinates - is ProjectDependency -> it.projectPathOrNull() == newDependency.projectPath - } - } - ?: sorted.firstOrNull { - - when (newDependency) { - is ExternalDependency -> it.mavenCoordinatesOrNull() - ?.isGreaterThan(newDependency.mavenCoordinates) - - is ProjectDependency -> it.projectPathOrNull() - ?.isGreaterThan(newDependency.projectPath) - } ?: false - } - ?: sorted.lastOrNull() - ?: return@firstNotNullOfOrNull null - - val sameDependency = when (newDependency) { - is ExternalDependency -> { - closestDeclaration.mavenCoordinatesOrNull() == newDependency.mavenCoordinates - } - - is ProjectDependency -> { - closestDeclaration.projectPathOrNull() == newDependency.projectPath - } - } - - if (sameDependency) { - closestDeclaration - } else { - - val precedingWhitespace = "^\\s*".toRegex() - .find(closestDeclaration.statementWithSurroundingText)?.value.orEmpty() - - when (closestDeclaration) { - is ExternalDependencyDeclaration -> closestDeclaration.copy( - statementWithSurroundingText = closestDeclaration.statementWithSurroundingText - .prefixIfNot(precedingWhitespace), - suppressed = emptyList() - ) - - is ModuleDependencyDeclaration -> closestDeclaration.copy( - statementWithSurroundingText = closestDeclaration.statementWithSurroundingText - .prefixIfNot(precedingWhitespace), - suppressed = emptyList() - ) - - is UnknownDependencyDeclaration -> { - // this shouldn't actually be possible - null - } - } - } - } -} - -private fun List.sorted( - matchPathFirst: Boolean, - newDependency: ConfiguredDependency -) = sortedWith( - { - if (matchPathFirst) { - it.configName == newDependency.configurationName - } else { - it.configName != newDependency.configurationName - } - }, - { it !is ModuleDependencyDeclaration }, - { - // sort by module paths, but normalize between String paths and type-safe accessors. - // String paths will start with ":", so remove that prefix. - // Type-safe accessors will have "." separators, so replace those with ":". - // After that, everything should read like `foo:bar:baz`. - (it as? ModuleDependencyDeclaration) - ?.projectPath - ?.value - ?.removePrefix(":") - ?.replace(".", ":") - ?: (it as? ExternalDependencyDeclaration) - ?.coordinates - ?.name - .orEmpty() - } -) - -private fun DependencyDeclaration.projectPathOrNull(): ProjectPath? { - return (this as? ModuleDependencyDeclaration)?.projectPath -} - -private fun DependencyDeclaration.mavenCoordinatesOrNull(): MavenCoordinates? { - return (this as? ExternalDependencyDeclaration)?.coordinates -} - -private suspend fun ProjectDependency.asModuleDependencyDeclaration( - project: HasDependencyDeclarations, - tokenOrNull: DependencyDeclaration? -): ModuleDependencyDeclaration { - return if (tokenOrNull is ModuleDependencyDeclaration) { - tokenOrNull.copy( - newConfigName = configurationName, - newModulePath = projectPath, - testFixtures = isTestFixture - ) - } else { - project.createDependencyDeclaration( - configurationName = configurationName, - projectPath = projectPath, - isTestFixtures = isTestFixture - ) - } -} - -private suspend fun ExternalDependency.asExternalDependencyDeclaration( - tokenOrNull: DependencyDeclaration?, - project: HasDependencyDeclarations -): ExternalDependencyDeclaration { - return if (tokenOrNull is ExternalDependencyDeclaration) { - tokenOrNull.copy( - newConfigName = configurationName, - newCoordinates = mavenCoordinates, - testFixtures = isTestFixture - ) - } else { - project.createDependencyDeclaration( - configurationName = configurationName, - mavenCoordinates = mavenCoordinates, - isTestFixtures = isTestFixture - ) - } -} - -/** - * Creates a new [ModuleDependencyDeclaration] from the void, - * without copying the style of any other dependency declarations. - * - * This does not automatically write the dependency to the build file or add it to any collections. - * - * @param configurationName the new config name - * @param projectPath the new project dependency - * @param isTestFixtures if true, the dependency is wrapped in - * `testFixtures(...)`, like `api(testFixtures(project(":lib1")))` - * @receiver the project receiving this new dependency - * @return a new declaration model - */ -suspend fun HasDependencyDeclarations.createDependencyDeclaration( - configurationName: ConfigurationName, - projectPath: ProjectPath, - isTestFixtures: Boolean -): ModuleDependencyDeclaration { - - val isKotlin = buildFile.isKotlinScriptFile() - - val configInvocation = getConfigInvocation(isKotlin, configurationName) - - val accessorText = projectAccessors() - .any { it is TypeSafeProjectAccessor } - .let { useTypeSafe -> - - if (useTypeSafe) { - "projects.${projectPath.typeSafeValue}" - } else if (isKotlin) { - "project(\"${projectPath.value}\")" - } else { - "project('${projectPath.value}')" - } - } - val projectAccessor = ProjectAccessor.from(accessorText, projectPath = projectPath) - val (declarationText, statementWithSurroundingText) = getStatementWithSurroundingText( - accessorText = accessorText, - isTestFixtures = isTestFixtures, - isKotlin = isKotlin, - configInvocation = configInvocation - ) - return ModuleDependencyDeclaration( - projectPath = projectPath, - projectAccessor = projectAccessor, - configName = configurationName, - declarationText = declarationText, - statementWithSurroundingText = statementWithSurroundingText, - suppressed = emptyList() - ) { it.value } -} - -private suspend fun HasDependencyDeclarations.getConfigInvocation( - isKotlin: Boolean, - configurationName: ConfigurationName -): String { - return if (isKotlin && !configurationName.isDefinitelyPrecompiledForProject(project = this)) { - configurationName.wrapInQuotes() - } else { - configurationName.value - } -} - -/** - * Creates a new [ExternalDependencyDeclaration] from the void, - * without copying the style of any other dependency declarations. - * - * This does not automatically write the dependency to the build file or add it to any collections. - * - * @param configurationName the new config name - * @param mavenCoordinates the new dependency - * @param isTestFixtures if true, the dependency is wrapped in - * `testFixtures(...)`, like `api(testFixtures("com.example:foo:1:))` - * @receiver the project receiving this new dependency - * @return a new declaration model - */ -suspend fun HasDependencyDeclarations.createDependencyDeclaration( - configurationName: ConfigurationName, - mavenCoordinates: MavenCoordinates, - isTestFixtures: Boolean -): ExternalDependencyDeclaration { - - val isKotlin = buildFile.isKotlinScriptFile() - - val configInvocation = getConfigInvocation(isKotlin, configurationName) - - val accessorText = if (isKotlin) { - "\"${mavenCoordinates.name}\"" - } else { - "'${mavenCoordinates.name}'" - } - val (declarationText, statementWithSurroundingText) = getStatementWithSurroundingText( - accessorText = accessorText, - isTestFixtures = isTestFixtures, - isKotlin = isKotlin, - configInvocation = configInvocation - ) - return ExternalDependencyDeclaration( - configName = configurationName, - declarationText = declarationText, - statementWithSurroundingText = statementWithSurroundingText, - suppressed = emptyList(), - configurationNameTransform = { it.value }, - group = mavenCoordinates.group, - moduleName = mavenCoordinates.moduleName, version = mavenCoordinates.version, - coordinates = mavenCoordinates - ) -} - -private suspend fun HasDependencyDeclarations.getStatementWithSurroundingText( - accessorText: String, - isTestFixtures: Boolean, - isKotlin: Boolean, - configInvocation: String -): Pair { - - val projectWithTestFixtures = accessorText - .letIf(isTestFixtures) { "testFixtures($it)" } - - val declarationText = if (isKotlin) { - "$configInvocation($projectWithTestFixtures)" - } else { - "$configInvocation $projectWithTestFixtures" - } - - return declarationText to buildFileParser.dependenciesBlocks() - .map { it.lambdaContent.findMinimumIndent() } - .minByOrNull { it.length } - .let { min -> - val indent = min ?: " " - "$indent$declarationText\n" - } -} - -private tailrec fun SourceSetName.isDefinitelyPrecompiledForProject( - project: HasDependencyDeclarations -): Boolean { - - // simple cases - when (this) { - SourceSetName.ANVIL -> return project.hasAnvil - SourceSetName.MAIN -> return true - SourceSetName.TEST -> return true - SourceSetName.TEST_FIXTURES -> return project.hasTestFixturesPlugin - SourceSetName.KAPT -> return project.hasKapt - SourceSetName.DEBUG -> return project.hasAGP - SourceSetName.RELEASE -> return project.hasAGP - SourceSetName.ANDROID_TEST -> return project.hasAGP - } - - if (project.hasAnvil && hasPrefix(SourceSetName.ANVIL)) { - // `anvilDebug` -> `debug`, then we'd recurse and check for `debug`. - return removePrefix(SourceSetName.ANVIL).isDefinitelyPrecompiledForProject(project) - } - if (project.hasKapt && hasPrefix(SourceSetName.KAPT)) { - // `kaptAndroidTest` -> `androidTest`, then we'd recurse and check for `androidTest`. - return removePrefix(SourceSetName.KAPT).isDefinitelyPrecompiledForProject(project) - } - // Note that the `testFixtures` check has to be above anything dealing with a "test-" prefix. - if (project.hasTestFixturesPlugin && hasPrefix(SourceSetName.TEST_FIXTURES)) { - // `testFixturesDebug` -> `debug`, then we'd recurse and check for `debug`. - return removePrefix(SourceSetName.TEST_FIXTURES).isDefinitelyPrecompiledForProject(project) - } - // `test` must come before Android stuff, because the source set is `testDebug` -- not `debugTest` - if (hasPrefix(SourceSetName.TEST)) { - return removePrefix(SourceSetName.TEST).isDefinitelyPrecompiledForProject(project) - } - if (project.hasAGP) { - when { - // `androidTest` MUST come before `debug` and `release`, - // because the source set is `androidTest____` - hasPrefix(SourceSetName.ANDROID_TEST) -> { - return removePrefix(SourceSetName.ANDROID_TEST).isDefinitelyPrecompiledForProject(project) - } - - hasPrefix(SourceSetName.DEBUG) -> { - return removePrefix(SourceSetName.DEBUG).isDefinitelyPrecompiledForProject(project) - } - - hasPrefix(SourceSetName.RELEASE) -> { - return removePrefix(SourceSetName.RELEASE).isDefinitelyPrecompiledForProject(project) - } - } - } - return false -} - -/** - * Attempts to determine the most idiomatic way of invoking the receiver - * [configuration name][ConfigurationName]. Typically, this will just be a function with a matching - * name. However, if a configuration is non-standard (e.g. `internalReleaseImplementation`) and - * the build file is using the Kotlin Gradle DSL, then the configuration must be invoked as a - * String extension function instead (e.g. `"internalReleaseImplementation"(libs.myDependency)`). - * - * @return The text used to add a dependency using this [ConfigurationName], in this project. - * @see isDefinitelyPrecompiledForProject - * @since 0.12.0 - */ -suspend fun ConfigurationName.buildFileInvocationText( - invokesConfigurationNames: InvokesConfigurationNames -): String { - - return if (shouldUseQuotes(invokesConfigurationNames)) { - wrapInQuotes() - } else { - value - } -} - -private fun ConfigurationName.wrapInQuotes(): String = - value.let { if (it.endsWith('"')) it else "$it\"" } - .let { if (it.startsWith('"')) it else "\"$it" } - -/** - * Returns true if the build file is Kotlin, and one of: - * - * - this exact configuration name is already used as a string extension - * - this configuration name is atypical (such as `internalDebugApi`) and not already used as - * a non-string invocation, so there's no way to be sure that the function is precompiled. - * - * @since 0.12.0 - */ -private suspend fun ConfigurationName.shouldUseQuotes( - invokesConfigurationNames: InvokesConfigurationNames -): Boolean { - - // This only applies to Kotlin DSL build files - if (invokesConfigurationNames.buildFile.extension != "kts") return false - - // true if the build file *already* uses this exact same configuration as a String extension - if (invokesConfigurationNames.getConfigurationInvocations().contains("\"$value\"")) { - return true - } - - // true if we can't find a plugin which creates this config, and we can't already find it being - // used as a normal function invocation - return !isDefinitelyPrecompiledForProject(invokesConfigurationNames) -} - -private suspend fun HasBuildFile.projectAccessors(): Set { - return buildFileParser.dependenciesBlocks() - .flatMap { it.settings } - .filterIsInstance() - .mapToSet { declaration -> declaration.projectAccessor } -} diff --git a/modulecheck-parsing/gradle/dsl/testing/api/testing.api b/modulecheck-parsing/gradle/dsl/testing/api/testing.api deleted file mode 100644 index cca6f12e66..0000000000 --- a/modulecheck-parsing/gradle/dsl/testing/api/testing.api +++ /dev/null @@ -1,9 +0,0 @@ -public final class modulecheck/parsing/gradle/dsl/DeclarationFactoriesKt { - public static final fun ExternalDependencyDeclaration-icYKhJQ (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;)Lmodulecheck/parsing/gradle/dsl/ExternalDependencyDeclaration; - public static synthetic fun ExternalDependencyDeclaration-icYKhJQ$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/model/dependency/MavenCoordinates;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/ExternalDependencyDeclaration; - public static final fun ModuleDependencyDeclaration-vOfoSHg (Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/parsing/gradle/dsl/ModuleDependencyDeclaration; - public static synthetic fun ModuleDependencyDeclaration-vOfoSHg$default (Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/ModuleDependencyDeclaration; - public static final fun UnknownDependencyDeclaration-Wz0Wq68 (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/parsing/gradle/dsl/UnknownDependencyDeclaration; - public static synthetic fun UnknownDependencyDeclaration-Wz0Wq68$default (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/UnknownDependencyDeclaration; -} - diff --git a/modulecheck-parsing/gradle/dsl/testing/build.gradle.kts b/modulecheck-parsing/gradle/dsl/testing/build.gradle.kts deleted file mode 100644 index 7296895783..0000000000 --- a/modulecheck-parsing/gradle/dsl/testing/build.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-gradle-dsl-testing" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-model:dependency:api")) - - implementation(project(path = ":modulecheck-parsing:gradle:dsl:api")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/gradle/dsl/testing/src/main/kotlin/modulecheck/parsing/gradle/dsl/declarationFactories.kt b/modulecheck-parsing/gradle/dsl/testing/src/main/kotlin/modulecheck/parsing/gradle/dsl/declarationFactories.kt deleted file mode 100644 index 360a7c1104..0000000000 --- a/modulecheck-parsing/gradle/dsl/testing/src/main/kotlin/modulecheck/parsing/gradle/dsl/declarationFactories.kt +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.dsl - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectPath - -/** - * Creates an instance of [UnknownDependencyDeclaration] with the given arguments. - * - * @param argument The argument that is unknown. - * @param configName The name of the configuration this dependency belongs to. - * @param declarationText The text representation of this declaration. - * @param statementWithSurroundingText The declaration statement along with its surrounding context. - * @param suppressed A list of suppressed warnings, empty by default. - * @return An instance of [UnknownDependencyDeclaration]. - */ -fun UnknownDependencyDeclaration( - argument: String, - configName: ConfigurationName, - declarationText: String, - statementWithSurroundingText: String, - suppressed: List = emptyList() -): UnknownDependencyDeclaration = UnknownDependencyDeclaration( - argument = argument, - configName = configName, - declarationText = declarationText, - statementWithSurroundingText = statementWithSurroundingText, - suppressed = suppressed, - configurationNameTransform = { it.value } -) - -/** - * Creates an instance of [ModuleDependencyDeclaration] with the given arguments. - * - * @param projectPath The path to the project this dependency refers to. - * @param projectAccessor The string used to access the project in the dependency declaration. - * @param configName The name of the configuration this dependency belongs to. - * @param declarationText The text representation of this declaration. - * @param statementWithSurroundingText The declaration statement along with its surrounding context. - * @param suppressed A list of suppressed warnings, empty by default. - * @return An instance of [ModuleDependencyDeclaration]. - */ -fun ModuleDependencyDeclaration( - projectPath: ProjectPath, - projectAccessor: String, - configName: ConfigurationName, - declarationText: String, - statementWithSurroundingText: String, - suppressed: List = emptyList() -): ModuleDependencyDeclaration = ModuleDependencyDeclaration( - projectPath = projectPath, - projectAccessor = ProjectAccessor.from(projectAccessor, projectPath), - configName = configName, - declarationText = declarationText, - statementWithSurroundingText = statementWithSurroundingText, - suppressed = suppressed -) { it.value } - -/** - * Creates an instance of [ExternalDependencyDeclaration] with the given arguments. - * - * @param configName The name of the configuration this dependency belongs to. - * @param declarationText The text representation of this declaration. - * @param statementWithSurroundingText The declaration statement along with its surrounding context. - * @param suppressed A list of suppressed warnings, empty by default. - * @param group The group of the external dependency. - * @param moduleName The name of the module in the external dependency. - * @param version The version of the external dependency. - * @param coordinates The [MavenCoordinates] for the external - * dependency, computed from the group, module name and version. - * @return An instance of [ExternalDependencyDeclaration]. - */ -fun ExternalDependencyDeclaration( - configName: ConfigurationName, - declarationText: String, - statementWithSurroundingText: String, - suppressed: List = emptyList(), - group: String?, - moduleName: String, - version: String?, - coordinates: MavenCoordinates = MavenCoordinates(group, moduleName, version) -): ExternalDependencyDeclaration = ExternalDependencyDeclaration( - configName = configName, - declarationText = declarationText, - statementWithSurroundingText = statementWithSurroundingText, - suppressed = suppressed, - configurationNameTransform = { it.value }, - group = group, - moduleName = moduleName, - version = version, - coordinates = coordinates -) diff --git a/modulecheck-parsing/gradle/model/api/api/api.api b/modulecheck-parsing/gradle/model/api/api/api.api deleted file mode 100644 index 3decfcbc5f..0000000000 --- a/modulecheck-parsing/gradle/model/api/api/api.api +++ /dev/null @@ -1,11 +0,0 @@ -public abstract interface class modulecheck/parsing/gradle/model/HasPlatformPlugin : modulecheck/parsing/gradle/model/PluginAware { - public abstract fun getPlatformPlugin ()Lmodulecheck/model/dependency/PlatformPlugin; -} - -public abstract interface class modulecheck/parsing/gradle/model/PluginAware { - public abstract fun getHasAGP ()Z - public abstract fun getHasAnvil ()Z - public abstract fun getHasKapt ()Z - public abstract fun getHasTestFixturesPlugin ()Z -} - diff --git a/modulecheck-parsing/gradle/model/api/build.gradle.kts b/modulecheck-parsing/gradle/model/api/build.gradle.kts deleted file mode 100644 index cf6a826a5c..0000000000 --- a/modulecheck-parsing/gradle/model/api/build.gradle.kts +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-gradle-model-api" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-model:dependency:api")) - - compileOnly(gradleApi()) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/gradle/model/api/src/main/kotlin/modulecheck/parsing/gradle/model/PluginAware.kt b/modulecheck-parsing/gradle/model/api/src/main/kotlin/modulecheck/parsing/gradle/model/PluginAware.kt deleted file mode 100644 index ce47da0723..0000000000 --- a/modulecheck-parsing/gradle/model/api/src/main/kotlin/modulecheck/parsing/gradle/model/PluginAware.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.model - -import modulecheck.model.dependency.PlatformPlugin - -interface HasPlatformPlugin : PluginAware { - val platformPlugin: PlatformPlugin -} - -interface PluginAware { - - val hasKapt: Boolean - val hasTestFixturesPlugin: Boolean - val hasAnvil: Boolean - val hasAGP: Boolean -} diff --git a/modulecheck-parsing/gradle/model/api/src/main/kotlin/modulecheck/parsing/gradle/model/typealias.kt b/modulecheck-parsing/gradle/model/api/src/main/kotlin/modulecheck/parsing/gradle/model/typealias.kt deleted file mode 100644 index 0293b9bb23..0000000000 --- a/modulecheck-parsing/gradle/model/api/src/main/kotlin/modulecheck/parsing/gradle/model/typealias.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.model - -/** - * [org.gradle.api.tasks.SourceSet] - * - * @since 0.12.0 - */ -typealias GradleSourceSet = org.gradle.api.tasks.SourceSet - -/** - * [org.gradle.api.artifacts.Configuration] - * - * @since 0.12.0 - */ -typealias GradleConfiguration = org.gradle.api.artifacts.Configuration - -/** - * [org.gradle.api.Project] - * - * @since 0.12.0 - */ -typealias GradleProject = org.gradle.api.Project - -/** - * [org.gradle.api.artifacts.ProjectDependency] - * - * @since 0.12.0 - */ -typealias GradleProjectDependency = org.gradle.api.artifacts.ProjectDependency - -/** [org.gradle.api.logging.Logger] */ -typealias GradleLogger = org.gradle.api.logging.Logger - -/** [org.gradle.api.logging.Logging] */ -typealias GradleLogging = org.gradle.api.logging.Logging - -/** [org.gradle.api.provider.Property] */ -typealias GradleProperty = org.gradle.api.provider.Property - -/** [org.gradle.api.provider.Provider] */ -typealias GradleProvider = org.gradle.api.provider.Provider diff --git a/modulecheck-parsing/gradle/model/impl-typesafe/api/impl-typesafe.api b/modulecheck-parsing/gradle/model/impl-typesafe/api/impl-typesafe.api deleted file mode 100644 index 7ec3f13503..0000000000 --- a/modulecheck-parsing/gradle/model/impl-typesafe/api/impl-typesafe.api +++ /dev/null @@ -1,28 +0,0 @@ -public final class anvil/hint/Modulecheck_parsing_gradle_model_impl_RealAllProjectPathsProvider_AllProjectPathsProvider_TaskScope_BindingModule_f5d2ea7a_07db9a7bKt { - public static final fun getModulecheck_parsing_gradle_model_impl_RealAllProjectPathsProvider_AllProjectPathsProvider_TaskScope_BindingModule_f5d2ea7a_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_gradle_model_impl_RealAllProjectPathsProvider_AllProjectPathsProvider_TaskScope_BindingModule_f5d2ea7a_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider : modulecheck/model/dependency/AllProjectPathsProvider { - public fun (Lorg/gradle/api/Project;)V - public fun getAllPaths ()Ljava/util/List; -} - -public abstract interface class modulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider_AllProjectPathsProvider_TaskScope_BindingModule_f5d2ea7a { - public abstract fun bindAllProjectPathsProvider (Lmodulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider;)Lmodulecheck/model/dependency/AllProjectPathsProvider; -} - -public final class modulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider; - public static final fun newInstance (Lorg/gradle/api/Project;)Lmodulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider; -} - -public final class modulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider_Factory; - public final fun newInstance (Lorg/gradle/api/Project;)Lmodulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider; -} - diff --git a/modulecheck-parsing/gradle/model/impl-typesafe/build.gradle.kts b/modulecheck-parsing/gradle/model/impl-typesafe/build.gradle.kts deleted file mode 100644 index ae380fdd4d..0000000000 --- a/modulecheck-parsing/gradle/model/impl-typesafe/build.gradle.kts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-gradle-model-impl-typesafe" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - - compileOnly(gradleApi()) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/gradle/model/impl-typesafe/src/main/kotlin/modulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider.kt b/modulecheck-parsing/gradle/model/impl-typesafe/src/main/kotlin/modulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider.kt deleted file mode 100644 index 6aae50b6e6..0000000000 --- a/modulecheck-parsing/gradle/model/impl-typesafe/src/main/kotlin/modulecheck/parsing/gradle/model/impl/RealAllProjectPathsProvider.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.gradle.model.impl - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.RootGradleProject -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.AllProjectPathsProvider -import modulecheck.model.dependency.ProjectPath -import modulecheck.parsing.gradle.model.GradleProject -import javax.inject.Inject - -@ContributesBinding(TaskScope::class) -class RealAllProjectPathsProvider @Inject constructor( - @RootGradleProject - private val rootGradleProject: GradleProject -) : AllProjectPathsProvider { - - private val _allPaths by lazy { - rootGradleProject.allprojects - .map { ProjectPath.StringProjectPath(it.path) } - } - - override fun getAllPaths(): List { - return _allPaths - } -} diff --git a/modulecheck-parsing/groovy-antlr/api/groovy-antlr.api b/modulecheck-parsing/groovy-antlr/api/groovy-antlr.api deleted file mode 100644 index caf788b225..0000000000 --- a/modulecheck-parsing/groovy-antlr/api/groovy-antlr.api +++ /dev/null @@ -1,40 +0,0 @@ -public final class modulecheck/parsing/groovy/antlr/ExtensionsKt { - public static final fun children (Lgroovyjarjarantlr4/v4/runtime/tree/Tree;)Lkotlin/sequences/Sequence; - public static final fun childrenBreadthFirst (Lgroovyjarjarantlr4/v4/runtime/tree/Tree;)Lkotlin/sequences/Sequence; - public static final fun childrenBreadthFirst (Lgroovyjarjarantlr4/v4/runtime/tree/Tree;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; - public static final fun childrenDepthFirst (Lgroovyjarjarantlr4/v4/runtime/tree/Tree;)Lkotlin/sequences/Sequence; - public static final fun childrenDepthFirst (Lgroovyjarjarantlr4/v4/runtime/tree/Tree;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser : modulecheck/parsing/gradle/dsl/AndroidGradleParser { - public fun ()V - public fun parse (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyDependenciesBlock : modulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock { - public fun getFullText ()Ljava/lang/String; - public fun getLambdaContent ()Ljava/lang/String; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser { - public static final field Companion Lmodulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser$Companion; - public fun (Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/model/dependency/ProjectDependency$Factory;)V - public final fun parse (Ljava/io/File;)Ljava/util/List; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser$Companion { - public final fun getBLOCK_BODY_REGEX ()Lkotlin/text/Regex; - public final fun getNO_INSPECTION_REGEX ()Lkotlin/text/Regex; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyPluginsBlock : modulecheck/parsing/gradle/dsl/internal/AbstractPluginsBlock { - public fun (Lmodulecheck/reporting/logging/McLogger;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public fun getFullText ()Ljava/lang/String; - public fun getLambdaContent ()Ljava/lang/String; -} - -public final class modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser { - public fun (Lmodulecheck/reporting/logging/McLogger;)V - public final fun parse (Ljava/io/File;)Lmodulecheck/parsing/groovy/antlr/GroovyPluginsBlock; -} - diff --git a/modulecheck-parsing/groovy-antlr/build.gradle.kts b/modulecheck-parsing/groovy-antlr/build.gradle.kts deleted file mode 100644 index f026abd4f3..0000000000 --- a/modulecheck-parsing/groovy-antlr/build.gradle.kts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") - groovy -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-groovy-antlr" - ) -} - -dependencies { - - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:internal")) - api(project(path = ":modulecheck-reporting:logging:api")) - - compileOnly(gradleApi()) - - implementation(libs.antlr.core) - implementation(libs.antlr.runtime) - implementation(libs.groovy) - implementation(libs.kotlin.compiler) - implementation(libs.kotlin.reflect) - - implementation(project(path = ":modulecheck-utils:stdlib")) - implementation(project(path = ":modulecheck-utils:traversal")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - - testImplementation(project(path = ":modulecheck-internal-testing")) - testImplementation(project(path = ":modulecheck-parsing:gradle:dsl:testing")) - testImplementation(project(path = ":modulecheck-reporting:logging:api")) -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/AntlrTreePrinter.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/AntlrTreePrinter.kt deleted file mode 100644 index 6922c195f6..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/AntlrTreePrinter.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import groovyjarjarantlr4.v4.runtime.tree.ParseTree -import groovyjarjarantlr4.v4.runtime.tree.Tree -import modulecheck.utils.traversal.AbstractTreePrinter - -internal class AntlrTreePrinter( - whitespaceChar: Char = ' ' -) : AbstractTreePrinter(whitespaceChar) { - - override fun Tree.children(): Sequence = sequence { - for (it in 0 until childCount) { - yield(getChild(it)) - } - } - - override fun Tree.text(): String = (this as ParseTree).text - override fun Tree.typeName(): String = this::class.java.simpleName - override fun Tree.parent(): Tree? = parent - override fun Tree.simpleClassName(): String = this::class.java.simpleName - - companion object { - - internal fun T.printEverything(whitespaceChar: Char = ' '): T = - apply { AntlrTreePrinter(whitespaceChar).printTreeString(this) } - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser.kt deleted file mode 100644 index 553030ea7b..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser.kt +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import groovyjarjarantlr4.v4.runtime.ParserRuleContext -import modulecheck.parsing.gradle.dsl.AndroidGradleParser -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.AndroidBlock -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.BuildFeaturesBlock -import modulecheck.parsing.gradle.dsl.Assignment -import modulecheck.utils.prefixIfNot -import modulecheck.utils.requireNotNull -import org.apache.groovy.parser.antlr4.GroovyParser.AssignmentExprAltContext -import org.apache.groovy.parser.antlr4.GroovyParser.ClosureOrLambdaExpressionContext -import org.apache.groovy.parser.antlr4.GroovyParser.NamePartContext -import org.apache.groovy.parser.antlr4.GroovyParser.PathElementContext -import org.apache.groovy.parser.antlr4.GroovyParser.PathExpressionContext -import org.apache.groovy.parser.antlr4.GroovyParser.PostfixExpressionContext -import org.apache.groovy.parser.antlr4.GroovyParserBaseVisitor -import java.io.File -import javax.inject.Inject - -class GroovyAndroidGradleParser @Inject constructor() : AndroidGradleParser { - - override suspend fun parse(buildFile: File): AndroidGradleSettings = parse(buildFile) { - - val androidBlocks = mutableListOf() - val buildFeaturesBlocks = mutableListOf() - - val allAssignments = mutableListOf() - val buildFeaturesAssignments = mutableListOf() - - class AssignmentVisitor( - private val fullText: String, - private val blockSuppressed: List - ) : GroovyParserBaseVisitor() { - - val assignments = mutableListOf() - - override fun visitAssignmentExprAlt(assignmentExpression: AssignmentExprAltContext) { - super.visitAssignmentExprAlt(assignmentExpression) - - val assignmentText = assignmentExpression.originalText() - - val propertyName = assignmentExpression.left.childOfType() - ?.childOfType() - ?.childrenOfType() - ?.lastOrNull() - ?.childOfType() - ?.originalText() - ?: assignmentExpression.left.originalText() - - val valueText = assignmentExpression.children - .filterIsInstance() - .last() - .originalText() - - val allSuppressed = blockSuppressed.plus( - assignmentExpression.precedingCommentNodeOrNull() - ?.originalText() - ?.suppressions() - .orEmpty() - ) - .distinct() - - assignments.add( - Assignment( - fullText = fullText, - propertyFullName = propertyName, - value = valueText, - declarationText = assignmentText, - suppressed = allSuppressed - ) - ) - } - } - - val visitor = commandExpressionVisitor(true) { ctx -> - - val android = ctx.takeIf { it.isNamed("android") } - ?: return@commandExpressionVisitor - - val precedingCommentOrEmpty = android.precedingCommentNodeOrNull()?.originalText().orEmpty() - - val androidSuppressed = precedingCommentOrEmpty.suppressions() - - val androidLambda = android.lambdaBlock() - - val androidIsBlock = androidLambda != null - - val androidBlockVisitor = AssignmentVisitor( - ctx.originalText().prefixIfNot(precedingCommentOrEmpty).trim(), - androidSuppressed - ) - - android.accept(androidBlockVisitor) - - allAssignments += androidBlockVisitor.assignments - - if (androidIsBlock) { - - val lambdaContent = androidLambda?.closureContent() - ?.originalText() - .requireNotNull() - - androidBlocks.add( - AndroidBlock( - fullText = android.originalText(), - lambdaContent = lambdaContent, - settings = androidBlockVisitor.assignments, - blockSuppressed = androidSuppressed - ) - ) - - android.accept( - commandExpressionVisitor { buildFeatures -> - if (buildFeatures.isNamed("buildFeatures")) { - - val blockSuppressed = androidSuppressed.plus( - buildFeatures.precedingCommentNodeOrNull() - ?.originalText() - ?.suppressions() - .orEmpty() - ) - .distinct() - - val blockStatementVisitor = AssignmentVisitor(ctx.originalText(), blockSuppressed) - - buildFeatures.accept(blockStatementVisitor) - - buildFeaturesAssignments += blockStatementVisitor.assignments - - buildFeatures.lambdaBlock() - ?.closureContent() - ?.originalText() - ?.let { buildFeaturesLambda -> - - buildFeaturesBlocks.add( - BuildFeaturesBlock( - fullText = android.originalText(), - lambdaContent = buildFeaturesLambda, - settings = blockStatementVisitor.assignments, - blockSuppressed = blockSuppressed - ) - ) - } - } - } - ) - } else { - android.accept( - pathExpressionVisitor { buildFeatures -> - - if (buildFeatures.isNamed("buildFeatures")) { - - val blockSuppressed = androidSuppressed.plus( - buildFeatures.precedingCommentNodeOrNull() - ?.originalText() - ?.suppressions() - .orEmpty() - ) - .distinct() - - val blockStatementVisitor = AssignmentVisitor(ctx.originalText(), blockSuppressed) - - buildFeatures.accept(blockStatementVisitor) - - buildFeaturesAssignments += blockStatementVisitor.assignments - - val buildFeaturesLambdaContent = buildFeatures.pathElement() - ?.lastOrNull() - ?.childOfType() - ?.closureContent() - ?.originalText() - - if (buildFeaturesLambdaContent != null) { - - buildFeaturesBlocks.add( - BuildFeaturesBlock( - fullText = android.originalText(), - lambdaContent = buildFeaturesLambdaContent, - settings = blockStatementVisitor.assignments, - blockSuppressed = blockSuppressed - ) - ) - } - } - } - ) - } - } - - parser.accept(visitor) - - return AndroidGradleSettings( - assignments = allAssignments, - androidBlocks = androidBlocks, - buildFeaturesBlocks = buildFeaturesBlocks - ) - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlock.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlock.kt deleted file mode 100644 index 850ee78cd3..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlock.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import modulecheck.model.dependency.ProjectDependency -import modulecheck.parsing.gradle.dsl.internal.AbstractDependenciesBlock -import modulecheck.reporting.logging.McLogger - -class GroovyDependenciesBlock internal constructor( - logger: McLogger, - override val fullText: String, - override val lambdaContent: String, - blockSuppressed: List, - projectDependency: ProjectDependency.Factory -) : AbstractDependenciesBlock( - logger = logger, - blockSuppressed = blockSuppressed, - configurationNameTransform = { it.value }, - projectDependency = projectDependency -) { - - override fun originalLineMatchesParsed(originalLine: String, parsedString: String): Boolean { - return originalLine.contains(parsedString) - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser.kt deleted file mode 100644 index 85651d75d1..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser.kt +++ /dev/null @@ -1,257 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("RegExpRedundantEscape") - -package modulecheck.parsing.groovy.antlr - -import groovyjarjarantlr4.v4.runtime.tree.RuleNode -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.asConfigurationName -import modulecheck.parsing.gradle.dsl.ProjectAccessor -import modulecheck.reporting.logging.McLogger -import org.apache.groovy.parser.antlr4.GroovyParser.BlockStatementContext -import org.apache.groovy.parser.antlr4.GroovyParser.ClosureContext -import org.apache.groovy.parser.antlr4.GroovyParser.ExpressionListElementContext -import org.apache.groovy.parser.antlr4.GroovyParser.NlsContext -import org.apache.groovy.parser.antlr4.GroovyParser.ScriptStatementContext -import org.apache.groovy.parser.antlr4.GroovyParser.SepContext -import org.apache.groovy.parser.antlr4.GroovyParser.StringLiteralContext -import org.apache.groovy.parser.antlr4.GroovyParserBaseVisitor -import java.io.File -import javax.inject.Inject - -class GroovyDependenciesBlockParser @Inject constructor( - private val logger: McLogger, - private val projectDependency: ProjectDependency.Factory -) { - - fun parse(file: File): List = parse(file) { - val dependenciesBlocks = mutableListOf() - - val rawModuleNameVisitor = object : GroovyParserBaseVisitor() { - - override fun shouldVisitNextChild(node: RuleNode?, currentResult: String?): Boolean = - currentResult == null - - override fun visitStringLiteral(ctx: StringLiteralContext?): String? { - return ctx?.originalText()?.replace("""["']""".toRegex(), "") - } - } - - // visits the config block which might follow a dependency declaration, - // such as for `exclude` or a `reason` - val closureVisitor = object : GroovyParserBaseVisitor() { - - override fun shouldVisitNextChild(node: RuleNode?, currentResult: String?): Boolean = - currentResult == null - - override fun visitClosure(ctx: ClosureContext?): String? { - return ctx?.originalText() - } - } - - val projectDepVisitor = object : GroovyParserBaseVisitor?>() { - - override fun shouldVisitNextChild( - node: RuleNode?, - currentResult: Pair? - ): Boolean = currentResult == null - - fun ExpressionListElementContext.configClosure() = - children.firstNotNullOfOrNull { it.accept(closureVisitor) } - - override fun visitExpressionListElement( - ctx: ExpressionListElementContext? - ): Pair? { - - // if the statement includes a config block (it isn't null), then delete it - fun String.maybeRemove(token: String?): String { - token ?: return this - return replace(token, "").trimEnd() - } - - return visitChildren(ctx) ?: when (ctx?.start?.text) { - "projects" -> { - val original = ctx.originalText() - - original.removePrefix("projects.").let { typeSafe -> - // Groovy parsing includes any config closure in this context, - // so it would be `projects.foo.bar { exclude ... }` - // remove that config closure from the full module access since it's actually part - // of the parent configuration statement - original.maybeRemove(ctx.configClosure()) to typeSafe - } - } - - "project" -> { - val original = ctx.originalText() - - // Groovy parsing includes any config closure in this context, - // so it would be `project(':foo:bar') { exclude ... }` - // remove that config closure from the full module access since it's actually part - // of the parent configuration statement - ctx.accept(rawModuleNameVisitor)?.let { name -> - original.maybeRemove(ctx.configClosure()) to name - } - } - - else -> { - null - } - } - } - } - - val unknownArgumentVisitor = object : GroovyParserBaseVisitor() { - - override fun shouldVisitNextChild(node: RuleNode?, currentResult: String?): Boolean = - currentResult == null - - override fun visitExpressionListElement(ctx: ExpressionListElementContext): String { - return ctx.originalText() - } - } - - val visitor = object : GroovyParserBaseVisitor() { - - val pendingBlockNoInspectionComments = mutableListOf() - - override fun visitNls(ctx: NlsContext) { - super.visitNls(ctx) - - pendingBlockNoInspectionComments.addAll( - NO_INSPECTION_REGEX - .findAll(ctx.text) - .map { it.destructured.component1() } - ) - } - - override fun visitScriptStatement(ctx: ScriptStatementContext?) { - - val statement = ctx?.statement() - - if (statement?.start?.text == "dependencies") { - - val originalBlockBody = statement.parentOfType() - ?.originalText() - ?: return - - val blockBody = BLOCK_BODY_REGEX.find(originalBlockBody) - ?.groupValues - ?.get(1) - ?.removePrefix("\n") - ?: return - - val blockSuppressed = pendingBlockNoInspectionComments.joinToString(",") - .split(",") - .map { it.trim() } - .filter { it.isNotEmpty() } - pendingBlockNoInspectionComments.clear() - - val dependenciesBlock = GroovyDependenciesBlock( - logger = logger, - fullText = statement.originalText(), - lambdaContent = blockBody, - blockSuppressed = blockSuppressed, - projectDependency = projectDependency - ) - - super.visitScriptStatement(ctx) - - val blockStatementVisitor = object : GroovyParserBaseVisitor() { - - val pendingNoInspectionComments = mutableListOf() - - override fun visitSep(ctx: SepContext) { - super.visitSep(ctx) - - pendingNoInspectionComments.addAll( - NO_INSPECTION_REGEX - .findAll(ctx.text) - .map { it.destructured.component1() } - ) - } - - override fun visitBlockStatement(ctx: BlockStatementContext) { - - val config = ctx.start.text - - val suppressed = pendingNoInspectionComments.joinToString(",") - .split(",") - .map { it.trim() } - .filter { it.isNotEmpty() } - pendingNoInspectionComments.clear() - - val moduleNamePair = projectDepVisitor.visit(ctx) - - if (moduleNamePair != null) { - val (projectAccessor, moduleRef) = moduleNamePair - - val projectPath = ProjectPath.from(moduleRef) - val accessor = ProjectAccessor.from(projectAccessor, projectPath) - dependenciesBlock.addModuleStatement( - configName = config.asConfigurationName(), - parsedString = ctx.originalText(), - projectPath = projectPath, - projectAccessor = accessor, - suppressed = suppressed - ) - return - } - - val mavenCoordinates = rawModuleNameVisitor.visit(ctx) - ?.let { MavenCoordinates.parseOrNull(it) } - - if (mavenCoordinates != null) { - dependenciesBlock.addNonModuleStatement( - configName = config.asConfigurationName(), - parsedString = ctx.originalText(), - coordinates = mavenCoordinates, - suppressed = suppressed - ) - return - } - - val argument = unknownArgumentVisitor.visit(ctx) ?: return - - dependenciesBlock.addUnknownStatement( - configName = config.asConfigurationName(), - parsedString = ctx.originalText(), - argument = argument, - suppressed = suppressed - ) - } - } - - blockStatementVisitor.visit(ctx) - - dependenciesBlocks.add(dependenciesBlock) - } - } - } - - parser.accept(visitor) - - return dependenciesBlocks - } - - companion object { - val BLOCK_BODY_REGEX: Regex = """dependencies\s*\{([\s\S]*)\}""".toRegex() - val NO_INSPECTION_REGEX: Regex = """//noinspection\s+(.*)\n""".toRegex() - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyParsingScope.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyParsingScope.kt deleted file mode 100644 index 00466442ab..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyParsingScope.kt +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import groovyjarjarantlr4.v4.runtime.CharStreams -import groovyjarjarantlr4.v4.runtime.CodePointCharStream -import groovyjarjarantlr4.v4.runtime.CommonTokenStream -import groovyjarjarantlr4.v4.runtime.ParserRuleContext -import org.apache.groovy.parser.antlr4.GroovyLangLexer -import org.apache.groovy.parser.antlr4.GroovyLangParser -import org.apache.groovy.parser.antlr4.GroovyParser.CompilationUnitContext -import java.io.File - -@Suppress("MemberVisibilityCanBePrivate") -internal data class GroovyParsingScope(val fullText: String) { - val stream: CodePointCharStream = CharStreams.fromString(fullText) - val lexer = GroovyLangLexer(stream) - val tokens = CommonTokenStream(lexer) - - val parser: CompilationUnitContext = GroovyLangParser(tokens).compilationUnit() - - fun ParserRuleContext.originalText(): String { - return originalText(stream) - } -} - -private val groovyLangParserLock = Unit - -internal inline fun parse(file: File, parsingAction: GroovyParsingScope.() -> T): T { - - // GroovyLangParser has frequent NPE's when parsing concurrently. - // https://github.com/RBusarow/ModuleCheck/issues/462 - return synchronized(groovyLangParserLock) { GroovyParsingScope(file.readText()).parsingAction() } -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlock.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlock.kt deleted file mode 100644 index 38424baa94..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlock.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import modulecheck.parsing.gradle.dsl.internal.AbstractPluginsBlock -import modulecheck.reporting.logging.McLogger - -class GroovyPluginsBlock( - logger: McLogger, - override val fullText: String, - override val lambdaContent: String, - blockSuppressed: List -) : AbstractPluginsBlock( - logger = logger, - blockSuppressed = blockSuppressed -) { - - override fun findOriginalStringIndex(parsedString: String): Int = originalLines - .indexOfFirst { originalLine -> - - originalLine.trimStart().contains(parsedString) - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser.kt deleted file mode 100644 index 8acb88712f..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import modulecheck.reporting.logging.McLogger -import org.apache.groovy.parser.antlr4.GroovyParser.BlockStatementContext -import org.apache.groovy.parser.antlr4.GroovyParser.NlsContext -import org.apache.groovy.parser.antlr4.GroovyParser.ScriptStatementContext -import org.apache.groovy.parser.antlr4.GroovyParser.SepContext -import org.apache.groovy.parser.antlr4.GroovyParserBaseVisitor -import java.io.File -import javax.inject.Inject - -class GroovyPluginsBlockParser @Inject constructor( - private val logger: McLogger -) { - - fun parse(file: File): GroovyPluginsBlock? = parse(file) { - - var block: GroovyPluginsBlock? = null - - val visitor = object : GroovyParserBaseVisitor() { - - val pendingBlockNoInspectionComments = mutableListOf() - - override fun visitNls(ctx: NlsContext) { - super.visitNls(ctx) - - pendingBlockNoInspectionComments.addAll( - GroovyDependenciesBlockParser.NO_INSPECTION_REGEX - .findAll(ctx.text) - .map { it.destructured.component1() } - ) - } - - override fun visitScriptStatement(ctx: ScriptStatementContext?) { - super.visitScriptStatement(ctx) - - val statement = ctx?.statement() - - if (statement?.start?.text == "plugins") { - val blockBodyReg = """plugins\s*\{([\s\S]*)\}""".toRegex() - - val blockBody = blockBodyReg.find(file.readText()) - ?.groupValues - ?.get(1) - ?.removePrefix("\n") - ?: return - - val blockSuppressed = pendingBlockNoInspectionComments.joinToString(",") - .split(",") - .map { it.trim() } - .filter { it.isNotEmpty() } - pendingBlockNoInspectionComments.clear() - - val pluginsBlock = GroovyPluginsBlock( - logger = logger, - fullText = statement.originalText(), - lambdaContent = blockBody, - blockSuppressed = blockSuppressed - ) - - val blockStatementVisitor = object : GroovyParserBaseVisitor() { - - val pendingNoInspectionComments = mutableListOf() - - override fun visitSep(ctx: SepContext) { - super.visitSep(ctx) - - pendingNoInspectionComments.addAll( - GroovyDependenciesBlockParser.NO_INSPECTION_REGEX - .findAll(ctx.text) - .map { it.destructured.component1() } - ) - } - - override fun visitBlockStatement(ctx: BlockStatementContext) { - super.visitBlockStatement(ctx) - - val suppressed = pendingNoInspectionComments.joinToString(",") - .split(",") - .map { it.trim() } - .filter { it.isNotEmpty() } - pendingNoInspectionComments.clear() - - pluginsBlock.addStatement( - parsedString = ctx.originalText(), - suppressed = suppressed - ) - } - } - - blockStatementVisitor.visit(ctx) - - block = pluginsBlock - } - } - } - - parser.accept(visitor) - - return block - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/extensions.kt b/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/extensions.kt deleted file mode 100644 index 354e1ff81d..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/main/kotlin/modulecheck/parsing/groovy/antlr/extensions.kt +++ /dev/null @@ -1,268 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import groovyjarjarantlr4.v4.runtime.CharStream -import groovyjarjarantlr4.v4.runtime.ParserRuleContext -import groovyjarjarantlr4.v4.runtime.RuleContext -import groovyjarjarantlr4.v4.runtime.misc.Interval -import groovyjarjarantlr4.v4.runtime.tree.RuleNode -import groovyjarjarantlr4.v4.runtime.tree.Tree -import modulecheck.utils.traversal.Traversals -import org.apache.groovy.parser.antlr4.GroovyParser.AssignmentExprAltContext -import org.apache.groovy.parser.antlr4.GroovyParser.BlockStatementContext -import org.apache.groovy.parser.antlr4.GroovyParser.BlockStatementsContext -import org.apache.groovy.parser.antlr4.GroovyParser.BlockStatementsOptContext -import org.apache.groovy.parser.antlr4.GroovyParser.ClosureContext -import org.apache.groovy.parser.antlr4.GroovyParser.ClosureOrLambdaExpressionContext -import org.apache.groovy.parser.antlr4.GroovyParser.CommandExpressionContext -import org.apache.groovy.parser.antlr4.GroovyParser.GroovyParserRuleContext -import org.apache.groovy.parser.antlr4.GroovyParser.IdentifierPrmrAltContext -import org.apache.groovy.parser.antlr4.GroovyParser.NamePartContext -import org.apache.groovy.parser.antlr4.GroovyParser.NlsContext -import org.apache.groovy.parser.antlr4.GroovyParser.PathElementContext -import org.apache.groovy.parser.antlr4.GroovyParser.PathExpressionContext -import org.apache.groovy.parser.antlr4.GroovyParser.PostfixExprAltContext -import org.apache.groovy.parser.antlr4.GroovyParser.PostfixExpressionContext -import org.apache.groovy.parser.antlr4.GroovyParser.ScriptStatementContext -import org.apache.groovy.parser.antlr4.GroovyParser.ScriptStatementsContext -import org.apache.groovy.parser.antlr4.GroovyParser.SepContext -import org.apache.groovy.parser.antlr4.GroovyParserBaseVisitor - -internal inline fun RuleContext.parentOfType(): T? { - return generateSequence(this as? RuleContext?) { it.parent } - .filterIsInstance() - .firstOrNull() -} - -/** - * @return a sequence of child nodes of this [Tree] in depth-first - * order. The sequence starts with the first child node of this [Tree], - * followed by the first child node of the first child node, and so on. - */ -fun Tree.childrenDepthFirst(): Sequence { - return Traversals.depthFirstTraversal(this) { children().toList() } -} - -/** - * @return a sequence of child nodes of type [T] of this [Tree] in depth-first - * order. The sequence starts with the first child node of this [Tree], - * followed by the first child node of the first child node, and so on. - */ -inline fun Tree.childrenOfTypeDepthFirst(): Sequence { - return Traversals.depthFirstTraversal(this) { children().toList() } - .filterIsInstance() -} - -/** - * @param predicate stops visiting child nodes of the given node once this predicate returns false - * @return a sequence of child nodes of this [Tree] in depth-first order that satisfy - * the given [predicate]. The sequence starts with the first child node of this - * [Tree], followed by the first child node of the first child node, and so on. - */ -fun Tree.childrenDepthFirst(predicate: (Tree) -> Boolean): Sequence = - Traversals.depthFirstTraversal(this) { children().filter(predicate).toList() } - -/** - * @return a sequence of child nodes of type [T] of this [Tree] in breadth-first - * order. The sequence starts with the first child node of this [Tree], - * followed by the first child node of the second child node, and so on. - */ -inline fun Tree.childrenOfTypeBreadthFirst(): Sequence { - return Traversals.breadthFirstTraversal(this) { children().toList() } - .filterIsInstance() -} - -/** - * @return a sequence of child nodes of this [Tree] in breadth-first - * order. The sequence starts with all the child nodes of this [Tree], - * followed by all the child nodes of the first child node, and so on. - */ -fun Tree.childrenBreadthFirst(): Sequence { - return Traversals.breadthFirstTraversal(this) { children().toList() } -} - -/** - * @param [predicate] stops visiting child nodes of the parent - * of the given node once this predicate returns false - * @return a sequence of child nodes of this [Tree] in breadth-first order that - * satisfy the given [predicate]. The sequence starts with all the child nodes of - * this [Tree], followed by all the child nodes of the first child node, and so on. - */ -fun Tree.childrenBreadthFirst(predicate: (Tree) -> Boolean): Sequence = - Traversals.breadthFirstTraversal(this) { children().filter(predicate).toList() } - -/** @return a sequence of the children [Tree] nodes. */ -fun Tree.children(): Sequence = sequence { - for (it in 0 until childCount) { - yield(getChild(it)) - } -} - -internal inline fun ParserRuleContext.childrenOfType(): List { - return children.filterIsInstance() -} - -internal inline fun RuleNode.previousSibling(): T? { - - val siblings = (parent as? ParserRuleContext)?.children - ?.takeIf { it.count() > 1 } - ?: return null - - val indexInSiblings = siblings.indexOf(this).takeIf { it >= 1 } ?: return null - - return siblings[indexInSiblings - 1] as? T -} - -internal fun RuleNode.precedingCommentNodeOrNull(): GroovyParserRuleContext? { - - // First, try going all the way up to the parent scope -- top-level or the entire lambda content - // This works if this receiver is the first statement within that scope - val asBlockOrScriptStatement = this as? BlockStatementContext - ?: this as? ScriptStatementsContext - ?: (this as? RuleContext)?.parentOfType() - ?: (this as? RuleContext)?.parentOfType() - ?: return null - - val scopeAttempt = asBlockOrScriptStatement.previousSibling() - ?: asBlockOrScriptStatement.previousSibling() - - if (scopeAttempt != null) return scopeAttempt - - // If the first "scoped" attempt didn't work, then try whatever the hell this is. Multiple - // statements inside a lambda get weirdly stacked and grouped. Sometimes there are several - // statements in one node with a parent of `BlockStatementsOptContext`, and then a preceding - // comment is a sibling with that same parent. Even if there's another comment inside that - // grouped node. - val asBlockStatementsOpt = asBlockOrScriptStatement.parentOfType() - ?: return null - - return asBlockStatementsOpt.previousSibling() - ?: asBlockStatementsOpt.previousSibling() -} - -internal inline fun ParserRuleContext.childOfType(): T? { - return childrenOfType().let { ts -> - - require(ts.size in 0..1) { - """node `$text` has more than one child of type ${T::class.java}. - | - |matching children: - |${ts.joinToString("\n\n") { "-\n" + it.text }} - | - |If you don't care about ignoring multiple results, use `.childrenOfType().firstOrNull()` instead. - """.trimMargin() - } - - ts.singleOrNull() - } -} - -internal fun ParserRuleContext.originalText(stream: CharStream): String { - return if (start == null || stop == null) { - // Weird edge cases around the very top and bottom of the parse tree - "" - } else { - stream.getText(Interval(start.startIndex, stop.stopIndex)) - } -} - -internal fun CommandExpressionContext.pathExpression(): PathExpressionContext? { - - val root: PostfixExprAltContext? = childOfType() - ?: childOfType() - ?.childOfType() - - return root?.childOfType() - ?.childOfType() -} - -internal fun CommandExpressionContext.isNamed(name: String): Boolean { - - return pathExpression() - ?.childOfType() - ?.identifier() - ?.text - ?.trim() == name -} - -internal fun CommandExpressionContext.lambdaBlock(): ClosureOrLambdaExpressionContext? { - - return pathExpression() - ?.childrenOfType() - ?.singleOrNull() - ?.childOfType() -} - -internal fun PathExpressionContext.isNamed(name: String): Boolean { - - return pathElement() - ?.firstOrNull() - ?.childrenOfType() - ?.singleOrNull() - ?.identifier() - ?.text - ?.trim() == name -} - -internal fun ClosureOrLambdaExpressionContext.closureContent(): BlockStatementsContext? { - return childOfType() - ?.childOfType() - ?.childOfType() -} - -internal inline fun commandExpressionVisitor( - recursive: Boolean = true, - crossinline action: (CommandExpressionContext) -> Unit -): GroovyParserBaseVisitor { - return object : GroovyParserBaseVisitor() { - - override fun visitCommandExpression(ctx: CommandExpressionContext) { - action(ctx) - - if (recursive) { - super.visitCommandExpression(ctx) - } - } - } -} - -internal inline fun pathExpressionVisitor( - recursive: Boolean = true, - crossinline action: (PathExpressionContext) -> Unit -): GroovyParserBaseVisitor { - return object : GroovyParserBaseVisitor() { - - override fun visitPathExpression(ctx: PathExpressionContext) { - action(ctx) - - if (recursive) { - super.visitPathExpression(ctx) - } - } - } -} - -internal fun String.suppressions(): List { - return GroovyDependenciesBlockParser.NO_INSPECTION_REGEX - .findAll(this) - .map { it.destructured.component1() } - .toList() - .joinToString(",") - .split(",") - .map { it.trim() } - .filter { it.isNotEmpty() } -} diff --git a/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParserTest.kt b/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParserTest.kt deleted file mode 100644 index 38d3a09568..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyAndroidGradleParserTest.kt +++ /dev/null @@ -1,441 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import com.rickbusarow.kase.DefaultTestEnvironment -import com.rickbusarow.kase.Kase1 -import com.rickbusarow.kase.KaseTestFactory -import com.rickbusarow.kase.TestEnvironment -import com.rickbusarow.kase.kases -import io.kotest.matchers.shouldBe -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.AndroidBlock -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.BuildFeaturesBlock -import modulecheck.parsing.gradle.dsl.Assignment -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.junit.jupiter.api.TestFactory -import java.io.File - -internal class GroovyAndroidGradleParserTest : - KaseTestFactory, TestEnvironment, DefaultTestEnvironment.Factory> { - - override val testEnvironmentFactory = DefaultTestEnvironment.Factory() - - override val params = kases(listOf(true, false), displayNameFactory = { "enabled: $a1" }) - - val TestEnvironment.testFile: File - get() = workingDir.resolve("build.gradle").createSafely() - - @TestFactory - fun `lots of blocks`() = testFactory { (enabled) -> - - val block = """ - android { - buildFeatures { - viewBinding = $enabled - } - buildFeatures { - buildConfig = $enabled - } - } - android { - buildFeatures { - androidResources = $enabled - } - } - """.trimIndent() - - testFile.writeText(block) - - val viewBindingAssignment = Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " }\n" + - " buildFeatures {\n" + - " buildConfig = $enabled\n" + - " }\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "viewBinding = $enabled", - suppressed = emptyList() - ) - val buildConfigAssignment = Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " }\n" + - " buildFeatures {\n" + - " buildConfig = $enabled\n" + - " }\n" + - "}", - propertyFullName = "buildConfig", - value = "$enabled", - declarationText = "buildConfig = $enabled", - suppressed = emptyList() - ) - val androidResourcesAssignment = Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " androidResources = $enabled\n" + - " }\n" + - "}", - propertyFullName = "androidResources", - value = "$enabled", - declarationText = "androidResources = $enabled", - suppressed = emptyList() - ) - - GroovyAndroidGradleParser().parse(testFile) shouldBe AndroidGradleSettings( - assignments = listOf( - viewBindingAssignment, - buildConfigAssignment, - androidResourcesAssignment - ), - androidBlocks = listOf( - AndroidBlock( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " }\n" + - " buildFeatures {\n" + - " buildConfig = $enabled\n" + - " }\n" + - "}", - lambdaContent = "buildFeatures {\n" + - " viewBinding = $enabled\n" + - " }\n" + - " buildFeatures {\n" + - " buildConfig = $enabled\n" + - " }\n", - settings = listOf( - viewBindingAssignment, - buildConfigAssignment - ), - blockSuppressed = emptyList() - ), - AndroidBlock( - fullText = "android {\n" + - " buildFeatures {\n" + - " androidResources = $enabled\n" + - " }\n" + - "}", - lambdaContent = "buildFeatures {\n" + - " androidResources = $enabled\n" + - " }\n", - settings = listOf( - androidResourcesAssignment - ), - blockSuppressed = emptyList() - ) - ), - buildFeaturesBlocks = listOf( - BuildFeaturesBlock( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " }\n" + - " buildFeatures {\n" + - " buildConfig = $enabled\n" + - " }\n" + - "}", - lambdaContent = "viewBinding = $enabled\n", - settings = listOf(viewBindingAssignment), - blockSuppressed = emptyList() - ), - BuildFeaturesBlock( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " }\n" + - " buildFeatures {\n" + - " buildConfig = $enabled\n" + - " }\n" + - "}", - lambdaContent = "buildConfig = $enabled\n", - settings = listOf(buildConfigAssignment), - blockSuppressed = emptyList() - ), - BuildFeaturesBlock( - fullText = "android {\n" + - " buildFeatures {\n" + - " androidResources = $enabled\n" + - " }\n" + - "}", - lambdaContent = "androidResources = $enabled\n", - settings = listOf(androidResourcesAssignment), - blockSuppressed = emptyList() - ) - ) - ) - } - - @TestFactory - fun `fully scoped boolean property`() = testFactory { (enabled) -> - - val block = """ - android { - buildFeatures { - viewBinding = $enabled - androidResources = ${!enabled} - } - } - """.trimIndent() - - testFile.writeText(block) - - GroovyAndroidGradleParser().parse(testFile) shouldBe AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "viewBinding = $enabled", - suppressed = emptyList() - ), - Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - propertyFullName = "androidResources", - value = "${!enabled}", - declarationText = "androidResources = ${!enabled}", - suppressed = emptyList() - ) - ), - androidBlocks = listOf( - AndroidBlock( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - lambdaContent = "buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n", - settings = listOf( - Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "viewBinding = $enabled", - suppressed = emptyList() - ), - Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - propertyFullName = "androidResources", - value = "${!enabled}", - declarationText = "androidResources = ${!enabled}", - suppressed = emptyList() - ) - ), - blockSuppressed = emptyList() - ) - ), - buildFeaturesBlocks = listOf( - BuildFeaturesBlock( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - lambdaContent = "viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n", - settings = listOf( - Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "viewBinding = $enabled", - suppressed = emptyList() - ), - Assignment( - fullText = "android {\n" + - " buildFeatures {\n" + - " viewBinding = $enabled\n" + - " androidResources = ${!enabled}\n" + - " }\n" + - "}", - propertyFullName = "androidResources", - value = "${!enabled}", - declarationText = "androidResources = ${!enabled}", - suppressed = emptyList() - ) - ), - blockSuppressed = emptyList() - ) - ) - ) - } - - @TestFactory - fun `fully dot qualified boolean property`() = testFactory { (enabled) -> - - val block = """ - plugins { - id 'my-plugin' - } - //noinspection android-level - android.buildFeatures.androidResources = $enabled - """.trimIndent() - - testFile.writeText(block) - - GroovyAndroidGradleParser().parse(testFile) shouldBe AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "//noinspection android-level\nandroid.buildFeatures.androidResources = $enabled", - propertyFullName = "androidResources", - value = "$enabled", - declarationText = "android.buildFeatures.androidResources = $enabled", - suppressed = listOf("android-level") - ) - ), - androidBlocks = emptyList(), - buildFeaturesBlocks = emptyList() - ) - } - - @TestFactory - fun `dot qualified and then scoped boolean property`() = testFactory { (enabled) -> - - val block = """ - android.buildFeatures { - //noinspection assignment-level - viewBinding = $enabled - } - """.trimIndent() - - testFile.writeText(block) - - GroovyAndroidGradleParser().parse(testFile) shouldBe AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "android.buildFeatures {\n" + - " //noinspection assignment-level\n" + - " viewBinding = $enabled\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "viewBinding = $enabled", - suppressed = listOf("assignment-level") - ) - ), - androidBlocks = emptyList(), - buildFeaturesBlocks = listOf( - BuildFeaturesBlock( - fullText = "android.buildFeatures {\n" + - " //noinspection assignment-level\n" + - " viewBinding = $enabled\n" + - "}", - lambdaContent = "viewBinding = $enabled\n", - settings = listOf( - Assignment( - fullText = "android.buildFeatures {\n" + - " //noinspection assignment-level\n" + - " viewBinding = $enabled\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "viewBinding = $enabled", - suppressed = listOf("assignment-level") - ) - ), - blockSuppressed = emptyList() - ) - ) - ) - } - - @TestFactory - fun `scoped and then dot qualified boolean property`() = testFactory { (enabled) -> - - val block = """ - android { - //noinspection buildFeatures-level - buildFeatures.viewBinding = $enabled - } - """.trimIndent() - - testFile.writeText(block) - - GroovyAndroidGradleParser().parse(testFile) shouldBe AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "android {\n" + - " //noinspection buildFeatures-level\n" + - " buildFeatures.viewBinding = $enabled\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "buildFeatures.viewBinding = $enabled", - suppressed = listOf("buildFeatures-level") - ) - ), - androidBlocks = listOf( - AndroidBlock( - fullText = "android {\n" + - " //noinspection buildFeatures-level\n" + - " buildFeatures.viewBinding = $enabled\n" + - "}", - lambdaContent = "buildFeatures.viewBinding = $enabled\n", - settings = listOf( - Assignment( - fullText = "android {\n" + - " //noinspection buildFeatures-level\n" + - " buildFeatures.viewBinding = $enabled\n" + - "}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "buildFeatures.viewBinding = $enabled", - suppressed = listOf("buildFeatures-level") - ) - ), - blockSuppressed = emptyList() - ) - ), - buildFeaturesBlocks = emptyList() - ) - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParserTest.kt b/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParserTest.kt deleted file mode 100644 index e65a5b7bca..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParserTest.kt +++ /dev/null @@ -1,684 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency.RuntimeProjectDependency -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath -import modulecheck.parsing.gradle.dsl.ExternalDependencyDeclaration -import modulecheck.parsing.gradle.dsl.ModuleDependencyDeclaration -import modulecheck.parsing.gradle.dsl.UnknownDependencyDeclaration -import modulecheck.reporting.logging.PrintLogger -import modulecheck.testing.BaseTest -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.intellij.lang.annotations.Language -import org.junit.jupiter.api.Test - -internal class GroovyDependenciesBlockParserTest : BaseTest { - - @Test - fun `external declaration`() = parse( - """ - dependencies { - api 'com.foo:bar:1.2.3.4' - } - """ - ) { - - settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = "api 'com.foo:bar:1.2.3.4'", - statementWithSurroundingText = " api 'com.foo:bar:1.2.3.4'", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ) - ) - } - - @Test - fun `declaration's original string should include trailing comment`() = parse( - """ - dependencies { - api project(':core:jvm') // trailing comment - api project(':core:jvm') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = """ api project(':core:jvm') // trailing comment""" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = """ api project(':core:jvm')""" - ) - ) - } - - @Test - fun `declaration with noinspection with old IDs should include suppressed with argument`() = - parse( - """ - dependencies { - api project(':core:android') - //noinspection Unused - //noinspection MustBeApi - api project(':core:jvm') - testImplementation project(':core:test') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = "project(':core:android')", - configName = ConfigurationName.api, - declarationText = """api project(':core:android')""", - statementWithSurroundingText = " api project(':core:android')", - suppressed = emptyList() - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = " //noinspection Unused\n" + - " //noinspection MustBeApi\n" + - " api project(':core:jvm')", - suppressed = listOf("unused-dependency", "must-be-api") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = "project(':core:test')", - configName = ConfigurationName.testImplementation, - declarationText = """testImplementation project(':core:test')""", - statementWithSurroundingText = " testImplementation project(':core:test')", - suppressed = emptyList() - ) - ) - } - - @Test - fun `declaration with noinspection should include suppressed with argument`() = parse( - """ - dependencies { - api project(':core:android') - //noinspection unused-dependency - //noinspection must-be-api - api project(':core:jvm') - testImplementation project(':core:test') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = "project(':core:android')", - configName = ConfigurationName.api, - declarationText = """api project(':core:android')""", - statementWithSurroundingText = " api project(':core:android')", - suppressed = emptyList() - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = " //noinspection unused-dependency\n" + - " //noinspection must-be-api\n" + - " api project(':core:jvm')", - suppressed = listOf("unused-dependency", "must-be-api") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = "project(':core:test')", - configName = ConfigurationName.testImplementation, - declarationText = """testImplementation project(':core:test')""", - statementWithSurroundingText = " testImplementation project(':core:test')", - suppressed = emptyList() - ) - ) - } - - @Test - fun `suppression which doesn't match finding name regex should be ignored`() = parse( - """ - //noinspection DSL_SCOPE_VIOLATION - dependencies { - api project(':core:android') - api project(':core:jvm') - } - """ - ) { - - allSuppressions.values.flatten() shouldBe emptyList() - } - - @Test - fun `dependency block with noinspection comment with old IDs should suppress those warnings in all declarations`() = - parse( - """ - //noinspection MustBeApi - //noinspection Unused - dependencies { - api project(':core:android') - //noinspection InheritedDependency - api project(':core:jvm') - } - """ - ) { - - blockSuppressed shouldBe listOf("must-be-api", "unused-dependency") - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = "project(':core:android')", - configName = ConfigurationName.api, - declarationText = """api project(':core:android')""", - statementWithSurroundingText = " api project(':core:android')", - suppressed = listOf("must-be-api", "unused-dependency") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = " //noinspection InheritedDependency\n api project(':core:jvm')", - suppressed = listOf("inherited-dependency", "must-be-api", "unused-dependency") - ) - ) - } - - @Test - fun `dependency block with noinspection comment should suppress those warnings in all declarations`() = - parse( - """ - //noinspection must-be-api - //noinspection unused-dependency - dependencies { - api project(':core:android') - //noinspection inherited-dependency - api project(':core:jvm') - } - """ - ) { - - blockSuppressed shouldBe listOf("must-be-api", "unused-dependency") - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = "project(':core:android')", - configName = ConfigurationName.api, - declarationText = """api project(':core:android')""", - statementWithSurroundingText = " api project(':core:android')", - suppressed = listOf("must-be-api", "unused-dependency") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = " //noinspection inherited-dependency\n api project(':core:jvm')", - suppressed = listOf("inherited-dependency", "must-be-api", "unused-dependency") - ) - ) - } - - @Test - fun `string module dependency declaration with testFixtures should be parsed`() = parse( - """ - dependencies { - api testFixtures(project(':core:jvm')) - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api testFixtures(project(':core:jvm'))""", - statementWithSurroundingText = """ api testFixtures(project(':core:jvm'))""" - ) - ) - } - - @Test - fun `type-safe module dependency declaration with testFixtures should be parsed`() = parse( - """ - dependencies { - api testFixtures(projects.core.jvm) - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = TypeSafeProjectPath("core.jvm"), - projectAccessor = "projects.core.jvm", - configName = ConfigurationName.api, - declarationText = """api testFixtures(projects.core.jvm)""", - statementWithSurroundingText = """ api testFixtures(projects.core.jvm)""" - ) - ) - } - - @Test - fun `module dependency with config block should split declarations properly`() = parse( - """ - dependencies { - api project(':core:test') { - exclude group: 'androidx.appcompat' - } - - api project(':core:jvm') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = "project(':core:test')", - configName = ConfigurationName.api, - declarationText = """api project(':core:test') { - | exclude group: 'androidx.appcompat' - | } - """.trimMargin(), - statementWithSurroundingText = """ api project(':core:test') { - | exclude group: 'androidx.appcompat' - | } - """.trimMargin() - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = "api project(':core:jvm')", - statementWithSurroundingText = "\n api project(':core:jvm')" - ) - ) - } - - @Test - fun `module dependency with commented out dependency above it`() = parse( - """ - dependencies { - // api project(':core:test') - api project(':core:jvm') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = "api project(':core:jvm')", - statementWithSurroundingText = " // api project(':core:test')\n api project(':core:jvm')" - ) - ) - } - - @Test - fun `module dependency with commented out dependency from previous finding above it`() = parse( - """ - dependencies { - // api project(':core:test') // ModuleCheck finding [unused-dependency] - api project(':core:jvm') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = "api project(':core:jvm')", - statementWithSurroundingText = " api project(':core:jvm')" - ) - ) - } - - @Test - fun `module dependency with config block and preceding declaration should split declarations properly`() = - parse( - """ - dependencies { - api project(':core:jvm') - - api project(':core:test') { - exclude group: 'androidx.appcompat' - } - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = "api project(':core:jvm')", - statementWithSurroundingText = " api project(':core:jvm')" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = "project(':core:test')", - configName = ConfigurationName.api, - declarationText = """api project(':core:test') { - | exclude group: 'androidx.appcompat' - | } - """.trimMargin(), - statementWithSurroundingText = """ - - | api project(':core:test') { - | exclude group: 'androidx.appcompat' - | } - """.trimMargin() - ) - ) - } - - @Test - fun `module dependency with preceding blank line should preserve the blank line`() = parse( - """ - dependencies { - api project(':core:test') - - api project(':core:jvm') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = "project(':core:test')", - configName = ConfigurationName.api, - declarationText = "api project(':core:test')", - statementWithSurroundingText = " api project(':core:test')" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = "api project(':core:jvm')", - statementWithSurroundingText = "\n api project(':core:jvm')" - ) - ) - } - - @Test - fun `module dependency with two different configs should be recorded twice`() = parse( - """ - dependencies { - implementation project(':core:jvm') - api project(':core:jvm') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.implementation, - declarationText = """implementation project(':core:jvm')""", - statementWithSurroundingText = """ implementation project(':core:jvm')""" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = """ api project(':core:jvm')""" - ) - ) - } - - @Test - fun `declaration's original string should include preceding single-line comment`() = parse( - """ - dependencies { - api("com.foo:bar:1.2.3.4") // inline comment - - // single-line comment - implementation project(':core:android') - } - """ - ) { - - settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = "api(\"com.foo:bar:1.2.3.4\")", - statementWithSurroundingText = " api(\"com.foo:bar:1.2.3.4\") // inline comment", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = "project(':core:android')", - configName = ConfigurationName.implementation, - declarationText = """implementation project(':core:android')""", - statementWithSurroundingText = """ - - | // single-line comment - | implementation project(':core:android') - """.trimMargin() - ) - ) - } - - @Test - fun `declaration's original string should include preceding block comment`() = parse( - """ - dependencies { - api 'com.foo:bar:1.2.3.4' // inline comment - - /* - block comment - */ - implementation project(':core:android') - } - """ - ) { - - settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = "api 'com.foo:bar:1.2.3.4'", - statementWithSurroundingText = " api 'com.foo:bar:1.2.3.4' // inline comment", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = "project(':core:android')", - configName = ConfigurationName.implementation, - declarationText = """implementation project(':core:android')""", - statementWithSurroundingText = """ - - | /* - | block comment - | */ - | implementation project(':core:android') - """.trimMargin() - ) - ) - } - - @Test - fun `declaration's original string should include preceding in-line block comment`() = parse( - """ - dependencies { - api 'com.foo:bar:1.2.3.4' // inline comment - /* single-line block comment */ implementation project(':core:android') - } - """ - ) { - - settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = "api 'com.foo:bar:1.2.3.4'", - statementWithSurroundingText = " api 'com.foo:bar:1.2.3.4' // inline comment", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = "project(':core:android')", - configName = ConfigurationName.implementation, - declarationText = """implementation project(':core:android')""", - statementWithSurroundingText = """ /* single-line block comment */ implementation project(':core:android')""" - ) - ) - } - - @Test - fun `duplicate module dependency with same config should be recorded twice`() = parse( - """ - dependencies { - api project(':core:jvm') - api project(':core:jvm') - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = """ api project(':core:jvm')""" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = "project(':core:jvm')", - configName = ConfigurationName.api, - declarationText = """api project(':core:jvm')""", - statementWithSurroundingText = """ api project(':core:jvm')""" - ) - ) - } - - @Test - fun `modules declared using type-safe accessors can be looked up using their path`() = parse( - """ - dependencies { - api projects.core.test - implementation projects.httpLogging - } - """ - ) { - - settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = TypeSafeProjectPath("core.test"), - projectAccessor = "projects.core.test", - configName = ConfigurationName.api, - declarationText = """api projects.core.test""", - statementWithSurroundingText = """ api projects.core.test""" - ), - ModuleDependencyDeclaration( - projectPath = TypeSafeProjectPath("httpLogging"), - projectAccessor = "projects.httpLogging", - configName = ConfigurationName.implementation, - declarationText = """implementation projects.httpLogging""", - statementWithSurroundingText = """ implementation projects.httpLogging""" - ) - ) - } - - @Test - fun `buildscript dependencies should not be parsed`() = parse( - """ - buildscript { - repositories { - mavenCentral() - google() - jcenter() - maven("https://plugins.gradle.org/m2/") - maven("https://oss.sonatype.org/content/repositories/snapshots") - } - dependencies { - classpath 'com.android.tools.build:gradle:7.0.2' - classpath 'com.squareup.anvil:gradle-plugin:2.3.4' - classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30' - } - } - dependencies { - api libs.ktlint - } - - """ - ) { - - lambdaContent shouldBe " api libs.ktlint\n" - - settings shouldBe listOf( - UnknownDependencyDeclaration( - argument = "libs.ktlint", - configName = ConfigurationName.api, - declarationText = "api libs.ktlint", - statementWithSurroundingText = " api libs.ktlint" - ) - ) - } - - inline fun parse( - @Language("groovy") - fileText: String, - crossinline assertions: GroovyDependenciesBlock.() -> Unit - ) = test { - workingDir.resolve("build.gradle") - .createSafely(fileText.trimIndent()) - .let { file -> - GroovyDependenciesBlockParser( - PrintLogger() - ) { configurationName, projectPath, isTestFixture -> - RuntimeProjectDependency(configurationName, projectPath, isTestFixture) - }.parse(file) - } - .single() - .assertions() - } -} diff --git a/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParserTest.kt b/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParserTest.kt deleted file mode 100644 index 248d4795a2..0000000000 --- a/modulecheck-parsing/groovy-antlr/src/test/kotlin/modulecheck/parsing/groovy/antlr/GroovyPluginsBlockParserTest.kt +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.groovy.antlr - -import modulecheck.parsing.gradle.dsl.PluginDeclaration -import modulecheck.reporting.logging.PrintLogger -import modulecheck.testing.BaseTest -import modulecheck.testing.assertions.requireNotNullOrFail -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.intellij.lang.annotations.Language -import org.junit.jupiter.api.Test - -internal class GroovyPluginsBlockParserTest : BaseTest { - - @Test - fun `external declaration`() = parse( - """ - plugins { - id 'org.jetbrains.kotlin.jvm' // trailing comment - // comment - id 'com.squareup.anvil' version '2.34.0' - } - """.trimIndent() - ) { - - settings shouldBe listOf( - PluginDeclaration( - statementWithSurroundingText = """ id 'org.jetbrains.kotlin.jvm' // trailing comment""", - declarationText = """id 'org.jetbrains.kotlin.jvm'""", - suppressed = emptyList() - ), - PluginDeclaration( - statementWithSurroundingText = """ // comment - | id 'com.squareup.anvil' version '2.34.0' - """.trimMargin(), - declarationText = """id 'com.squareup.anvil' version '2.34.0'""", - suppressed = emptyList() - ) - ) - } - - @Test - fun `single declarations should only be counted once`() = parse( - """ - plugins { - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - javaLibrary - id 'org.jetbrains.kotlin.jvm' - } - """.trimIndent() - ) { - - settings shouldBe listOf( - PluginDeclaration( - statementWithSurroundingText = """ id 'io.gitlab.arturbosch.detekt' version '1.15.0'""", - declarationText = """id 'io.gitlab.arturbosch.detekt' version '1.15.0'""", - suppressed = emptyList() - ), - PluginDeclaration( - statementWithSurroundingText = """ javaLibrary""", - declarationText = """javaLibrary""", - suppressed = emptyList() - ), - PluginDeclaration( - statementWithSurroundingText = """ id 'org.jetbrains.kotlin.jvm'""", - declarationText = """id 'org.jetbrains.kotlin.jvm'""", - suppressed = emptyList() - ) - ) - } - - @Test - fun `single suppress at declaration`() = parse( - """ - plugins { - //noinspection finding-1 - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - //noinspection finding-2 - javaLibrary - //noinspection finding-3 - id 'org.jetbrains.kotlin.jvm' - } - """.trimIndent() - ) { - - settings shouldBe listOf( - PluginDeclaration( - statementWithSurroundingText = " //noinspection finding-1\n" + - " id 'io.gitlab.arturbosch.detekt' version '1.15.0'", - declarationText = """id 'io.gitlab.arturbosch.detekt' version '1.15.0'""", - suppressed = listOf("finding-1") - ), - PluginDeclaration( - statementWithSurroundingText = " //noinspection finding-2\n javaLibrary", - declarationText = """javaLibrary""", - suppressed = listOf("finding-2") - ), - PluginDeclaration( - statementWithSurroundingText = " //noinspection finding-3\n id 'org.jetbrains.kotlin.jvm'", - declarationText = """id 'org.jetbrains.kotlin.jvm'""", - suppressed = listOf("finding-3") - ) - ) - } - - @Test - fun `suppression which doesn't match finding name regex should be ignored`() = parse( - """ - //noinspection DSL_SCOPE_VIOLATION - plugins { - id 'com.squareup.anvil' - } - """ - ) { - - allSuppressions.values.flatten() shouldBe emptyList() - } - - @Test - fun `suppress with old ID should be updated`() = parse( - """ - plugins { - //noinspection UnusedKaptProcessor - id 'io.gitlab.arturbosch.detekt' version '1.15.0' - } - """.trimIndent() - ) { - - settings shouldBe listOf( - PluginDeclaration( - statementWithSurroundingText = " //noinspection UnusedKaptProcessor\n" + - " id 'io.gitlab.arturbosch.detekt' version '1.15.0'", - declarationText = """id 'io.gitlab.arturbosch.detekt' version '1.15.0'""", - suppressed = listOf("unused-kapt-processor") - ) - ) - } - - inline fun parse( - @Language("groovy") - fileText: String, - crossinline assertions: GroovyPluginsBlock.() -> Unit - ) { - test { - workingDir.resolve("build.gradle") - .createSafely(fileText.trimIndent()) - .let { file -> GroovyPluginsBlockParser(PrintLogger()).parse(file) } - .requireNotNullOrFail() - .assertions() - } - } -} diff --git a/modulecheck-parsing/java/api/java.api b/modulecheck-parsing/java/api/java.api deleted file mode 100644 index 19f1ea6844..0000000000 --- a/modulecheck-parsing/java/api/java.api +++ /dev/null @@ -1,34 +0,0 @@ -public final class modulecheck/parsing/java/JavaParserNodeResolver { - public synthetic fun (Lmodulecheck/project/McProject;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun fqNameOrNull (Lcom/github/javaparser/ast/type/ClassOrInterfaceType;Ljava/lang/String;Ljava/util/Collection;Ljava/util/Collection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/java/RealJavaFile : modulecheck/parsing/source/JavaFile { - public fun (Ljava/io/File;Lorg/jetbrains/kotlin/com/intellij/psi/PsiJavaFile;Lorg/jetbrains/kotlin/config/JvmTarget;Lmodulecheck/parsing/source/internal/NameParser;)V - public fun getApiReferences ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getDeclarations ()Ljava/util/Set; - public fun getFile ()Ljava/io/File; - public fun getImportsLazy ()Lkotlin/Lazy; - public fun getName ()Ljava/lang/String; - public fun getPackageName ()Lmodulecheck/parsing/source/PackageName; - public synthetic fun getPsi ()Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile; - public fun getPsi ()Lorg/jetbrains/kotlin/com/intellij/psi/PsiJavaFile; - public fun getReferences ()Lmodulecheck/utils/lazy/LazySet; -} - -public final class modulecheck/parsing/java/RealJavaFileKt { - public static final fun apiReferences (Lcom/github/javaparser/ast/body/FieldDeclaration;)Ljava/util/List; - public static final fun apiReferences (Lcom/github/javaparser/ast/body/MethodDeclaration;)Ljava/util/List; - public static final fun canBeImported (Lcom/github/javaparser/ast/nodeTypes/modifiers/NodeWithStaticModifier;)Z - public static final fun canBeResolved (Lcom/github/javaparser/ast/nodeTypes/modifiers/NodeWithStaticModifier;)Z - public static final fun typeReferencesRecursive (Lcom/github/javaparser/ast/type/ClassOrInterfaceType;)Lkotlin/sequences/Sequence; -} - -public final class modulecheck/parsing/java/VisitorKt { - public static final fun childrenBreadthFirst (Lcom/github/javaparser/ast/Node;)Lkotlin/sequences/Sequence; - public static final fun childrenBreadthFirst (Lcom/github/javaparser/ast/Node;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; - public static final fun childrenDepthFirst (Lcom/github/javaparser/ast/Node;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; - public static final fun fqNameOrNull (Lcom/github/javaparser/ast/Node;Ljava/util/List;)Ljava/lang/String; - public static final fun simpleName (Lcom/github/javaparser/ast/Node;)Ljava/lang/String; -} - diff --git a/modulecheck-parsing/java/build.gradle.kts b/modulecheck-parsing/java/build.gradle.kts deleted file mode 100644 index 99d19b741f..0000000000 --- a/modulecheck-parsing/java/build.gradle.kts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-java" - ) -} - -dependencies { - - api(libs.kotlin.compiler) - - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-project:api")) - - compileOnly(gradleApi()) - - implementation(libs.javaParser.core) - implementation(libs.javaParser.symbols) - implementation(libs.kotlin.reflect) - - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - implementation(project(path = ":modulecheck-utils:traversal")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - - testImplementation(project(path = ":modulecheck-api")) - testImplementation(project(path = ":modulecheck-model:dependency:api")) - testImplementation(project(path = ":modulecheck-parsing:java")) - testImplementation(project(path = ":modulecheck-parsing:source:testing")) - testImplementation(project(path = ":modulecheck-project:testing")) -} diff --git a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/JavaParserNodeResolver.kt b/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/JavaParserNodeResolver.kt deleted file mode 100644 index af009d9c7c..0000000000 --- a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/JavaParserNodeResolver.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.java - -import com.github.javaparser.ast.type.ClassOrInterfaceType -import com.github.javaparser.resolution.UnsolvedSymbolException -import kotlinx.coroutines.flow.asFlow -import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.flow.map -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.asDeclaredName -import modulecheck.project.McProject -import modulecheck.utils.remove -import org.jetbrains.kotlin.name.FqName - -class JavaParserNodeResolver( - private val project: McProject, - private val sourceSetName: SourceSetName -) { - suspend fun fqNameOrNull( - node: ClassOrInterfaceType, - packageName: String, - directImports: Collection, - wildcardImports: Collection - ): FqName? { - - val nameWithScope = node.nameWithScope - - directImports.singleOrNull { it.endsWith(nameWithScope) } - ?.let { return FqName(it) } - - nameWithScope.javaLangFqNameOrNull()?.let { return FqName(it.name) } - - wildcardImports.fold( - sequenceOf(nameWithScope, "$packageName.$nameWithScope") - ) { acc, wildcard -> - acc + wildcard.remove(".*").plus(".$nameWithScope") - } - .asFlow() - .map { - project.resolvedNameOrNull( - resolvableMcName = FqName(it).asDeclaredName(PackageName(packageName)), - sourceSetName = sourceSetName - ) - } - .firstOrNull() - ?.let { return FqName(it.name) } - - return node.fqNameOrNull() - } -} - -@Suppress("SwallowedException") -internal fun ClassOrInterfaceType.fqNameOrNull(): FqName? { - - return try { - resolve()?.qualifiedName - ?.let { name -> FqName(name) } - } catch (e: UnsolvedSymbolException) { - return null - } catch (e: UnsupportedOperationException) { - return null - } -} diff --git a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/JavaTreePrinter.kt b/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/JavaTreePrinter.kt deleted file mode 100644 index fb747875a3..0000000000 --- a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/JavaTreePrinter.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.java - -import com.github.javaparser.ast.Node -import modulecheck.utils.getOrNull -import modulecheck.utils.traversal.AbstractTreePrinter - -internal class JavaTreePrinter( - whitespaceChar: Char = ' ' -) : AbstractTreePrinter(whitespaceChar) { - - override fun Node.children(): Sequence = childNodes.asSequence() - override fun Node.text(): String = toString() - override fun Node.typeName(): String = this::class.simpleName ?: "----" - override fun Node.parent(): Node? = parentNode.getOrNull() - override fun Node.simpleClassName(): String = this::class.java.simpleName - - companion object { - - internal fun T.printEverything(whitespaceChar: Char = ' '): T = - apply { JavaTreePrinter(whitespaceChar).printTreeString(this) } - } -} diff --git a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/ParsedFile.kt b/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/ParsedFile.kt deleted file mode 100644 index b2c01cdc31..0000000000 --- a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/ParsedFile.kt +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.java - -import com.github.javaparser.ast.CompilationUnit -import com.github.javaparser.ast.ImportDeclaration -import com.github.javaparser.ast.body.EnumConstantDeclaration -import com.github.javaparser.ast.body.FieldDeclaration -import com.github.javaparser.ast.body.MethodDeclaration -import com.github.javaparser.ast.body.TypeDeclaration -import com.github.javaparser.ast.body.VariableDeclarator -import com.github.javaparser.ast.type.ClassOrInterfaceType -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.SimpleName.Companion.stripPackageNameFromFqName -import modulecheck.utils.getOrNull -import modulecheck.utils.mapToSet -import org.jetbrains.kotlin.name.FqName - -internal data class ParsedFile( - val packageName: PackageName, - val imports: List, - val classOrInterfaceTypes: Set, - val typeDeclarations: List>, - val fieldDeclarations: Set, - val enumDeclarations: Set -) { - companion object { - - fun fromCompilationUnitLazy(compilationUnit: CompilationUnit): Lazy { - return lazy { - val packageName = PackageName( - compilationUnit.packageDeclaration.getOrNull()?.nameAsString - ) - val imports = compilationUnit.imports.orEmpty() - - val classOrInterfaceTypes = mutableSetOf() - val typeDeclarations = mutableListOf>() - val memberDeclarations = mutableSetOf() - val enumDeclarations = mutableSetOf() - - compilationUnit.childrenBreadthFirst() - .forEach { node -> - - when (node) { - is ClassOrInterfaceType -> classOrInterfaceTypes.add(node) - is TypeDeclaration<*> -> typeDeclarations.add(node) - is MethodDeclaration -> { - - if (node.canBeResolved()) { - node.fqNameOrNull(typeDeclarations)?.let { fqName -> - memberDeclarations.add( - DeclaredName.agnostic( - packageName, - fqName.stripPackageNameFromFqName(packageName) - ) - ) - } - } - } - - is VariableDeclarator -> { - node.fqNameOrNull(typeDeclarations)?.let { fqName -> - memberDeclarations.add( - DeclaredName.agnostic( - packageName, - fqName.stripPackageNameFromFqName(packageName) - ) - ) - } - } - - is FieldDeclaration -> { - if (node.canBeResolved()) { - node.fqNameOrNull(typeDeclarations)?.let { fqName -> - memberDeclarations.add( - DeclaredName.agnostic( - packageName, - fqName.stripPackageNameFromFqName(packageName) - ) - ) - } - } - } - - is EnumConstantDeclaration -> { - node.fqNameOrNull(typeDeclarations)?.let { fqName -> - enumDeclarations.add( - DeclaredName.agnostic( - packageName, - fqName.stripPackageNameFromFqName(packageName) - ) - ) - } - } - } - } - - ParsedFile( - packageName = packageName, - imports = imports, - classOrInterfaceTypes = classOrInterfaceTypes.mapToSet { FqName(it.nameWithScope) }, - typeDeclarations = typeDeclarations.distinct(), - fieldDeclarations = memberDeclarations, - enumDeclarations = enumDeclarations - ) - } - } - } -} diff --git a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/RealJavaFile.kt b/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/RealJavaFile.kt deleted file mode 100644 index e100b88562..0000000000 --- a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/RealJavaFile.kt +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.java - -import com.github.javaparser.JavaParser -import com.github.javaparser.ParserConfiguration -import com.github.javaparser.ParserConfiguration.LanguageLevel -import com.github.javaparser.ast.CompilationUnit -import com.github.javaparser.ast.Node -import com.github.javaparser.ast.body.ClassOrInterfaceDeclaration -import com.github.javaparser.ast.body.FieldDeclaration -import com.github.javaparser.ast.body.MethodDeclaration -import com.github.javaparser.ast.expr.FieldAccessExpr -import com.github.javaparser.ast.expr.MethodCallExpr -import com.github.javaparser.ast.expr.NameExpr -import com.github.javaparser.ast.nodeTypes.NodeWithTypeParameters -import com.github.javaparser.ast.nodeTypes.modifiers.NodeWithPrivateModifier -import com.github.javaparser.ast.nodeTypes.modifiers.NodeWithStaticModifier -import com.github.javaparser.ast.type.ClassOrInterfaceType -import com.github.javaparser.ast.type.Type -import com.github.javaparser.resolution.Resolvable -import com.github.javaparser.symbolsolver.JavaSymbolSolver -import com.github.javaparser.symbolsolver.resolution.typesolvers.CombinedTypeSolver -import com.github.javaparser.symbolsolver.resolution.typesolvers.ReflectionTypeSolver -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.JavaFile -import modulecheck.parsing.source.McName -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.SimpleName.Companion.stripPackageNameFromFqName -import modulecheck.parsing.source.internal.NameParser -import modulecheck.parsing.source.internal.NameParser.NameParserPacket -import modulecheck.utils.getOrNull -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.lazy.toLazySet -import modulecheck.utils.lazy.unsafeLazy -import modulecheck.utils.mapToSet -import org.jetbrains.kotlin.com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.JvmTarget.JVM_10 -import org.jetbrains.kotlin.config.JvmTarget.JVM_11 -import org.jetbrains.kotlin.config.JvmTarget.JVM_12 -import org.jetbrains.kotlin.config.JvmTarget.JVM_13 -import org.jetbrains.kotlin.config.JvmTarget.JVM_14 -import org.jetbrains.kotlin.config.JvmTarget.JVM_15 -import org.jetbrains.kotlin.config.JvmTarget.JVM_16 -import org.jetbrains.kotlin.config.JvmTarget.JVM_17 -import org.jetbrains.kotlin.config.JvmTarget.JVM_1_6 -import org.jetbrains.kotlin.config.JvmTarget.JVM_1_8 -import org.jetbrains.kotlin.config.JvmTarget.JVM_9 -import java.io.File -import kotlin.LazyThreadSafetyMode.NONE -import kotlin.contracts.contract - -class RealJavaFile( - override val file: File, - override val psi: PsiJavaFile, - private val jvmTarget: JvmTarget, - private val nameParser: NameParser -) : JavaFile { - - override val name: String = file.name - - private val parserConfiguration by lazy(NONE) { - // Set up a minimal type solver that only looks at the classes used to run this sample. - val combinedTypeSolver = CombinedTypeSolver() - .apply { - add(ReflectionTypeSolver()) - // TODO - // consider adding this with source dirs for all dependencies? - // add(JavaParserTypeSolver()) - } - - val symbolSolver = JavaSymbolSolver(combinedTypeSolver) - - ParserConfiguration() - .apply { - setSymbolResolver(symbolSolver) - languageLevel = jvmTarget.toLanguageLevel() - } - } - - private val compilationUnit: CompilationUnit by lazy { - - JavaParser(parserConfiguration) - .parse(file) - .result - .get() - } - - private val parsed by ParsedFile.fromCompilationUnitLazy(compilationUnit) - - override val packageName: PackageName by unsafeLazy { parsed.packageName } - - override val importsLazy: Lazy> = unsafeLazy { - compilationUnit.imports - .filterNot { it.isAsterisk } - .map { ReferenceName(it.nameAsString, JAVA) } - .toSet() - } - - override val declarations: Set by unsafeLazy { - parsed.typeDeclarations - .asSequence() - .filterNot { it.isPrivate } - .mapNotNull { declaration -> - declaration.fullyQualifiedName - .getOrNull() - ?.let { - DeclaredName.agnostic( - packageName = packageName, - simpleNames = it.stripPackageNameFromFqName(packageName) - ) - } - } - .toSet() - .plus(parsed.fieldDeclarations) - .plus(parsed.enumDeclarations) - } - - private val wildcardImports: Set by unsafeLazy { - compilationUnit.imports - .filter { it.isAsterisk } - .map { "${it.nameAsString}.*" } - .toSet() - } - - private val typeReferenceNames: Set by unsafeLazy { - - compilationUnit - .childrenOfTypeBreadthFirst() - // A qualified type like `com.Foo` will have a nested ClassOrInterfaceType of `com`. - // Filter out those nested types, since they seem like they're always just noise. - .filterNot { it.parentNode.getOrNull() is ClassOrInterfaceType } - .flatMap { it.typeReferencesRecursive() } - .mapNotNull { type -> - - val typeNames = type.getTypeParameterNamesInScope().toSet() - - type.nameWithScope - .takeIf { it !in typeNames } - } - .toSet() - } - - private fun FieldAccessExpr.qualifiedNameOrSimple(): String { - return getChildOfType() - ?.let { qualifier -> "$qualifier.$nameAsString" } - ?: getChildOfType() - ?.let { qualifier -> "$qualifier.$nameAsString" } - ?: nameAsString - } - - private fun MethodCallExpr.qualifiedNameOrSimple(): String { - return getChildOfType() - ?.let { qualifier -> "$qualifier.$nameAsString" } - ?: getChildOfType() - ?.let { qualifier -> "$qualifier.$nameAsString" } - ?: nameAsString - } - - override val apiReferences: LazyDeferred> = lazyDeferred { - - refs.await().apiReferenceNames - } - - private val apiStrings by lazy { - - compilationUnit.childrenBreadthFirst() - // Only look at references which are inside public classes. This includes nested classes - // which may be (incorrectly) inside private or package-private classes. - .filter { node -> - node.getParentsOfTypeRecursive() - .all { parentClass -> parentClass.isPublic || parentClass.isProtected } - } - .flatMap { - when (it) { - is MethodDeclaration -> it.apiReferences() - is FieldDeclaration -> it.apiReferences() - else -> emptyList() - } - } - .toList() - } - - private val refs = lazyDeferred { - val methodNames = compilationUnit - .childrenOfTypeBreadthFirst() - .map { method -> - method.qualifiedNameOrSimple() - } - .toSet() - - // fully qualified property references - val propertyNames = compilationUnit - .childrenOfTypeBreadthFirst() - // filter out the segments of larger qualified names, like `com.foo` from `com.foo.Bar` - .filterNot { it.parentNode.getOrNull() is FieldAccessExpr } - .filterNot { it.parentNode.getOrNull() is MethodCallExpr } - .map { field -> - field.qualifiedNameOrSimple() - } - .toSet() - - val packet = NameParserPacket( - packageName = packageName, - imports = importsLazy.value.mapToSet { it.name }, - wildcardImports = wildcardImports, - aliasedImports = emptyMap(), - resolved = emptySet(), - unresolved = typeReferenceNames + methodNames + propertyNames, - mustBeApi = apiStrings.toSet(), - apiReferenceNames = emptySet(), - referenceLanguage = McName.CompatibleLanguage.JAVA, - stdLibNameOrNull = String::javaLangFqNameOrNull - ) - - nameParser.parse(packet) - } - - override val references: LazySet = listOf( - dataSource { refs.await().resolved } - ).toLazySet() -} - -/** - * Includes all types referenced by the receiver - * [ClassOrInterfaceType], optionally including itself. - * - * For instance, given the function: - * - * ``` - * public javax.inject.Provider> getStringListProvider() { /* ... */ } - * ``` - * - * This function with will return a sequence of ['javax.inject.Provider', 'List', 'String']. - * - * @return A Sequence of all [Type]s referenced by the receiver class type. - * @since 0.12.0 - */ -fun ClassOrInterfaceType.typeReferencesRecursive(): Sequence { - return generateSequence(sequenceOf(this)) { types -> - types.map { type -> - type.typeArguments - ?.getOrNull() - ?.asSequence() - ?.filterIsInstance() - .orEmpty() - } - .flatten() - .takeIf { it.iterator().hasNext() } - } - .flatten() -} - -fun FieldDeclaration.apiReferences(): List { - return (elementType as? ClassOrInterfaceType)?.typeReferencesRecursive() - .orEmpty() - .map { it.nameWithScope } - .toList() -} - -fun MethodDeclaration.apiReferences(): List { - if (!isProtected && !isPublic) return emptyList() - - val typeParameterBounds = typeParameters.flatMap { it.typeBound } - .flatMap { it.typeReferencesRecursive() } - .map { it.nameWithScope } - .distinct() - - val typeParameterNames = typeParameters.mapToSet { it.nameAsString } - - val returnTypes: Sequence = sequenceOf(type as? ClassOrInterfaceType) - .filterNotNull() - .plus(type.childrenOfTypeBreadthFirst()) - .filterNot { it.parentNode.getOrNull() is ClassOrInterfaceType } - .flatMap { classType -> - classType.typeReferencesRecursive() - .map { it.nameWithScope } - } - .filterNot { it in typeParameterNames } - - val arguments = parameters - .map { it.type } - .filterIsInstance() - .flatMap { classType -> - classType.typeReferencesRecursive() - .map { it.nameWithScope } - } - .filterNot { it in typeParameterNames } - - return typeParameterBounds + returnTypes + arguments -} - -internal fun Node.getTypeParameterNamesInScope(): Sequence { - val parent = parentNode.getOrNull() ?: return emptySequence() - return generateSequence(parent) { p -> - p.parentNode.getOrNull() - } - .filterIsInstance>() - .flatMap { node -> node.typeParameters.map { it.nameAsString } } -} - -fun T.canBeResolved(): Boolean - where T : NodeWithStaticModifier, T : NodeWithPrivateModifier { - contract { - returns(true) implies (this@canBeResolved is Resolvable<*>) - } - - return !isPrivate() && this is Resolvable<*> -} - -fun T.canBeImported(): Boolean - where T : NodeWithStaticModifier, T : NodeWithPrivateModifier { - contract { - returns(true) implies (this@canBeImported is Resolvable<*>) - } - - return isStatic() && !isPrivate() && this is Resolvable<*> -} - -@Suppress("ComplexMethod") -internal fun JvmTarget.toLanguageLevel(): LanguageLevel { - @Suppress("ElseCaseInsteadOfExhaustiveWhen") - return when (this) { - JVM_1_6 -> LanguageLevel.JAVA_6 - JVM_1_8 -> LanguageLevel.JAVA_8 - JVM_9 -> LanguageLevel.JAVA_9 - JVM_10 -> LanguageLevel.JAVA_10 - JVM_11 -> LanguageLevel.JAVA_11 - JVM_12 -> LanguageLevel.JAVA_12 - JVM_13 -> LanguageLevel.JAVA_13 - JVM_14 -> LanguageLevel.JAVA_14 - // TODO - // Gradle itself leaks JavaParser 3.17.0 to its classpath, so these later versions of Java - // won't resolve - JVM_15 -> LanguageLevel.CURRENT - JVM_16 -> LanguageLevel.CURRENT - JVM_17 -> LanguageLevel.CURRENT - else -> LanguageLevel.CURRENT - // JVM_18 -> LanguageLevel.CURRENT - } -} diff --git a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/javaStdLibNames.kt b/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/javaStdLibNames.kt deleted file mode 100644 index fe7fbd5815..0000000000 --- a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/javaStdLibNames.kt +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.java - -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.PackageName.Companion.asPackageName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.SimpleName.Companion.stripPackageNameFromFqName - -internal fun String.javaLangFqNameOrNull(): QualifiedDeclaredName? { - - val maybeJavaLang = "java.lang.$this" - - return if (maybeJavaLang in javaStdLibNames) { - - val javaLangPackage = "java.lang".asPackageName() - val simple = maybeJavaLang.stripPackageNameFromFqName(javaLangPackage) - - DeclaredName.java(javaLangPackage, simple) - } else { - null - } -} - -internal val javaStdLibNames = setOf( - - "java.lang.Appendable", - "java.lang.AutoCloseable", - "java.lang.CharSequence", - "java.lang.Cloneable", - "java.lang.Comparable", - "java.lang.Iterable", - "java.lang.Readable", - "java.lang.Runnable", - "java.lang.Thread.UncaughtExceptionHandler", - "java.lang.Boolean", - "java.lang.Byte", - "java.lang.Character", - "java.lang.Character.Subset", - "java.lang.Character.UnicodeBlock", - "java.lang.Class", - "java.lang.ClassLoader", - "java.lang.ClassValue", - "java.lang.Compiler", - "java.lang.Double", - "java.lang.Enum", - "java.lang.Float", - "java.lang.InheritableThreadLocal", - "java.lang.Integer", - "java.lang.Long", - "java.lang.Math", - "java.lang.Number", - "java.lang.Object", - "java.lang.Package", - "java.lang.Process", - "java.lang.ProcessBuilder", - "java.lang.ProcessBuilder.Redirect", - "java.lang.Runtime", - "java.lang.RuntimePermission", - "java.lang.SecurityManager", - "java.lang.Short", - "java.lang.StackTraceElement", - "java.lang.StrictMath", - "java.lang.String", - "java.lang.StringBuffer", - "java.lang.StringBuilder", - "java.lang.System", - "java.lang.Thread", - "java.lang.ThreadGroup", - "java.lang.ThreadLocal", - "java.lang.Throwable", - "java.lang.Void", - "java.lang.ArithmeticException", - "java.lang.ArrayIndexOutOfBoundsException", - "java.lang.ArrayStoreException", - "java.lang.ClassCastException", - "java.lang.ClassNotFoundException", - "java.lang.CloneNotSupportedException", - "java.lang.EnumConstantNotPresentException", - "java.lang.Exception", - "java.lang.IllegalAccessException", - "java.lang.IllegalArgumentException", - "java.lang.IllegalMonitorStateException", - "java.lang.IllegalStateException", - "java.lang.IllegalThreadStateException", - "java.lang.IndexOutOfBoundsException", - "java.lang.InstantiationException", - "java.lang.InterruptedException", - "java.lang.NegativeArraySizeException", - "java.lang.NoSuchFieldException", - "java.lang.NoSuchMethodException", - "java.lang.NullPointerException", - "java.lang.NumberFormatException", - "java.lang.ReflectiveOperationException", - "java.lang.RuntimeException", - "java.lang.SecurityException", - "java.lang.StringIndexOutOfBoundsException", - "java.lang.TypeNotPresentException", - "java.lang.UnsupportedOperationException", - "java.lang.AbstractMethodError", - "java.lang.AssertionError", - "java.lang.BootstrapMethodError", - "java.lang.ClassCircularityError", - "java.lang.ClassFormatError", - "java.lang.Error", - "java.lang.ExceptionInInitializerError", - "java.lang.IllegalAccessError", - "java.lang.IncompatibleClassChangeError", - "java.lang.InstantiationError", - "java.lang.InternalError", - "java.lang.LinkageError", - "java.lang.NoClassDefFoundError", - "java.lang.NoSuchFieldError", - "java.lang.NoSuchMethodError", - "java.lang.OutOfMemoryError", - "java.lang.StackOverflowError", - "java.lang.ThreadDeath", - "java.lang.UnknownError", - "java.lang.UnsatisfiedLinkError", - "java.lang.UnsupportedClassVersionError", - "java.lang.VerifyError", - "java.lang.VirtualMachineError", - "java.lang.Deprecated", - "java.lang.Override", - "java.lang.SafeVarargs", - "java.lang.SuppressWarnings" -) diff --git a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/visitor.kt b/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/visitor.kt deleted file mode 100644 index 774de480f7..0000000000 --- a/modulecheck-parsing/java/src/main/kotlin/modulecheck/parsing/java/visitor.kt +++ /dev/null @@ -1,158 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.java - -import com.github.javaparser.ast.Node -import com.github.javaparser.ast.body.EnumConstantDeclaration -import com.github.javaparser.ast.body.MethodDeclaration -import com.github.javaparser.ast.body.TypeDeclaration -import com.github.javaparser.ast.body.VariableDeclarator -import com.github.javaparser.ast.expr.SimpleName -import com.github.javaparser.resolution.Resolvable -import com.github.javaparser.resolution.declarations.ResolvedDeclaration -import modulecheck.utils.getOrNull -import modulecheck.utils.traversal.Traversals - -internal inline fun Node.visit(crossinline predicate: (node: Node) -> Boolean): Sequence { - return childrenBreadthFirst() - .takeWhile { predicate(it) } -} - -inline fun Node.getChildOfType(): T? { - return getChildrenOfType().singleOrNull() -} - -inline fun Node.requireChildOfType(): T { - return getChildrenOfType().single() -} - -inline fun Node.getChildrenOfType(): List { - return childNodes.filterIsInstance() -} - -internal inline fun Node.getParentOfType(): T? { - val parent = parentNode.getOrNull() ?: return null - return generateSequence(parent) { p -> - p.parentNode.getOrNull() - } - .filterIsInstance() - .firstOrNull() -} - -internal inline fun Node.getParentsOfTypeRecursive(): Sequence { - val parent = parentNode.getOrNull() ?: return emptySequence() - return generateSequence(parent) { p -> - p.parentNode.getOrNull() - } - .filterIsInstance() -} - -internal fun Node.getParentsRecursive(): Sequence { - val parent = parentNode.getOrNull() ?: return emptySequence() - return generateSequence(parent) { p -> - p.parentNode.getOrNull() - } -} - -/** - * @return a sequence of child nodes of this [Node] in depth-first - * order. The sequence starts with the first child node of this [Node], - * followed by the first child node of the first child node, and so on. - */ -internal fun Node.childrenDepthFirst(): Sequence { - return Traversals.depthFirstTraversal(this) { childNodes.toList() } -} - -/** - * @return a sequence of child nodes of type [T] of this [Node] in depth-first - * order. The sequence starts with the first child node of this [Node], - * followed by the first child node of the first child node, and so on. - */ -inline fun Node.childrenOfTypeDepthFirst(): Sequence { - return Traversals.depthFirstTraversal(this) { childNodes.toList() } - .filterIsInstance() -} - -/** - * @param predicate stops visiting child nodes of the given node once this predicate returns false - * @return a sequence of child nodes of this [Node] in depth-first order that satisfy - * the given [predicate]. The sequence starts with the first child node of this - * [Node], followed by the first child node of the first child node, and so on. - */ -inline fun Node.childrenDepthFirst(crossinline predicate: (Node) -> Boolean): Sequence = - Traversals.depthFirstTraversal(this) { childNodes.filter(predicate) } - -/** - * @return a sequence of child nodes of type [T] of this [Node] in breadth-first - * order. The sequence starts with the first child node of this [Node], - * followed by the first child node of the second child node, and so on. - */ -inline fun Node.childrenOfTypeBreadthFirst(): Sequence { - return Traversals.breadthFirstTraversal(this) { childNodes.toList() } - .filterIsInstance() -} - -/** - * @return a sequence of child nodes of this [Node] in breadth-first - * order. The sequence starts with all the child nodes of this [Node], - * followed by all the child nodes of the first child node, and so on. - */ -fun Node.childrenBreadthFirst(): Sequence { - return Traversals.breadthFirstTraversal(this) { childNodes.toList() } -} - -/** - * @param [predicate] stops visiting child nodes of the parent - * of the given node once this predicate returns false - * @return a sequence of child nodes of this [Node] in breadth-first order that - * satisfy the given [predicate]. The sequence starts with all the child nodes of - * this [Node], followed by all the child nodes of the first child node, and so on. - */ -inline fun Node.childrenBreadthFirst(crossinline predicate: (Node) -> Boolean): Sequence = - Traversals.breadthFirstTraversal(this) { childNodes.filter(predicate) } - -fun T.fqNameOrNull( - typeDeclarations: List> -): String? - where T : Node, T : Resolvable { - val simpleName = when (this) { - is MethodDeclaration -> name.asString() - is VariableDeclarator -> nameAsString - is EnumConstantDeclaration -> nameAsString - else -> { - - kotlin.runCatching { resolve().name } - .getOrNull() - ?: simpleName() - } - } - - val parentTypeFqName = typeDeclarations - .last { isDescendantOf(it) } - .fullyQualifiedName.getOrNull() ?: return null - return "$parentTypeFqName.$simpleName" -} - -fun T.simpleName(): String { - - return if (this is SimpleName) { - asString() - } else { - childrenOfTypeBreadthFirst() - .first() - .asString() - } -} diff --git a/modulecheck-parsing/java/src/test/kotlin/modulecheck/parsing/java/JavaFileTest.kt b/modulecheck-parsing/java/src/test/kotlin/modulecheck/parsing/java/JavaFileTest.kt deleted file mode 100644 index 8f9a8042b6..0000000000 --- a/modulecheck-parsing/java/src/test/kotlin/modulecheck/parsing/java/JavaFileTest.kt +++ /dev/null @@ -1,1128 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.java - -import kotlinx.coroutines.flow.single -import modulecheck.api.context.jvmFiles -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.PackageName.Companion.asPackageName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.test.McNameTest -import modulecheck.project.test.ProjectTest -import org.jetbrains.kotlin.config.JvmTarget -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test - -internal class JavaFileTest : ProjectTest(), McNameTest { - - override val defaultLanguage: CompatibleLanguage - get() = JAVA - - @Nested - inner class `resolvable declarations` { - - @Test - fun `enum constants should count as declarations`() = test { - - val file = createJavaFile( - """ - package com.subject; - - public enum Color { RED, BLUE } - """ - ) - file shouldBeJvmFile { - - apiReferences {} - references {} - declarations { - agnostic("com.subject.Color") - agnostic("com.subject.Color.RED") - agnostic("com.subject.Color.BLUE") - } - } - } - - @Test - fun `nested enum constants should count as declarations`() = test { - - val file = createJavaFile( - """ - package com.subject; - - public class Constants { - public enum Color { RED, BLUE } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references {} - declarations { - agnostic("com.subject.Constants") - agnostic("com.subject.Constants.Color") - agnostic("com.subject.Constants.Color.RED") - agnostic("com.subject.Constants.Color.BLUE") - } - } - } - - @Test - fun `declared constants should count as declarations`() = test { - - val file = createJavaFile( - """ - package com.subject; - - public class Constants { - - public static final int MY_VALUE = 250; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references {} - declarations { - agnostic("com.subject.Constants") - agnostic("com.subject.Constants.MY_VALUE") - } - } - } - - @Test - fun `declared nested constants should count as declarations`() = test { - - val file = createJavaFile( - """ - package com.subject; - - public class Constants { - - public static class Values { - - public static final int MY_VALUE = 250; - } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references {} - declarations { - agnostic("com.subject.Constants") - agnostic("com.subject.Constants.Values") - agnostic("com.subject.Constants.Values.MY_VALUE") - } - } - } - - @Test - fun `public static methods should count as declarations`() = test { - - val file = createJavaFile( - """ - package com.subject; - - public class ParsedClass { - - public static void foo() {} - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references {} - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `a record should count as a declaration`() = test { - - val file = createJavaFile( - //language=text - """ - package com.subject; - - import com.lib1.Lib1Class; - - public static record MyRecord(Lib1Class lib1Class) {} - """, - jvmTarget = JvmTarget.JVM_16 - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.MyRecord") - } - } - } - - // reproducer for https://github.com/RBusarow/ModuleCheck/issues/399 - @Test - fun `file without package should put declarations at the root`() = test { - - val file = createJavaFile( - //language=text - """ - - import com.lib1.Lib1Class; - - public static record MyRecord(Lib1Class lib1Class) {} - """, - jvmTarget = JvmTarget.JVM_16 - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("MyRecord", PackageName.DEFAULT) - } - } - } - - @Test - fun `file without imports should still parse`() = test { - - val file = createJavaFile( - """ - package com.subject; - - public class MyClass {} - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references {} - declarations { - agnostic("com.subject.MyClass") - } - } - } - } - - @Nested - inner class `api references` { - - @Test - fun `public method return type should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.Lib1Class; - - public class ParsedClass { - - public Lib1Class foo() { return Lib1Class(); } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.lib1.Lib1Class") - } - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `private method return type should not count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.Lib1Class; - - public class ParsedClass { - - private Lib1Class foo() { return Lib1Class(); } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - } - } - } - - @Test - fun `package-private method return type should not count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.Lib1Class; - - public class ParsedClass { - - Lib1Class foo() { return Lib1Class(); } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `public method with wildcard-imported return type should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.*; - - public class ParsedClass { - - public Lib1Class foo() { return Lib1Class(); } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.lib1.Lib1Class") - } - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `public method with fully qualified return type should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - public class ParsedClass { - - public com.lib1.Lib1Class foo() { return com.lib1.Lib1Class(); } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.lib1.Lib1Class") - java("com.subject.com.lib1.Lib1Class") - } - references { - java("com.lib1.Lib1Class") - java("com.subject.com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `public method parameterized return type should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.Lib1Class; - import java.util.List; - - public class ParsedClass { - - public List foo() { return null; } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.lib1.Lib1Class") - java("java.util.List") - } - references { - java("com.lib1.Lib1Class") - java("java.util.List") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `public method generic return type parameter should not count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import java.util.List; - - public class ParsedClass { - - public List foo() { return null; } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("java.util.List") - } - references { - java("java.util.List") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `import should not be an api reference if it isn't actually part of an api reference`() = - test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.Lib1Class; - import java.util.List; - - public class ParsedClass { - - public List foo() { return null; } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("java.util.List") - } - references { - java("com.lib1.Lib1Class") - java("java.util.List") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `public method generic return type parameter bound should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import java.util.List; - - public class ParsedClass { - - public List foo() { return null; } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("java.util.List") - java("java.lang.CharSequence") - } - references { - java("java.util.List") - java("java.lang.CharSequence") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `public method argument should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import java.util.List; - - public class ParsedClass { - - public List foo(String name) { return null; } - } - """ - ) - file shouldBeJvmFile { - - apiReferences { - java("java.util.List") - java("java.lang.String") - } - references { - java("java.util.List") - java("java.lang.String") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.foo") - } - } - } - - @Test - fun `public member property type with wildcard import should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.*; - - public class ParsedClass { - - public Lib1Class lib1Class; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.lib1.Lib1Class") - } - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.lib1Class") - } - } - } - - @Test - fun `public member property type with import should count as api reference`() = test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.Lib1Class; - - public class ParsedClass { - - public Lib1Class lib1Class; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.lib1.Lib1Class") - } - references { - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.lib1Class") - } - } - } - - @Test - fun `a public member property with generic type with wildcard import should count as api reference`() = - test { - - val file = createJavaFile( - """ - package com.subject; - - import com.lib1.*; - import java.util.List; - - public class ParsedClass { - - public List lib1Classes; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("java.util.List") - java("com.lib1.Lib1Class") - } - references { - java("java.util.List") - java("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.lib1Classes") - } - } - } - } - - @Nested - inner class `Android resource references` { - - @Test - fun `unqualified android resource reference in base package`() = test { - - val project = androidLibrary(":lib1", "com.subject") - - val file = project.createJavaFile( - """ - package com.subject; - - public class ParsedClass { - - int someString = R.string.app_name; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - unqualifiedAndroidResource("R.string.app_name") - androidR("com.subject".asPackageName()) - qualifiedAndroidResource("com.subject.R.string.app_name") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.someString") - } - } - } - - @Test - fun `unqualified android resource reference with R import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - - addJavaSource( - """ - package com.subject; - - import com.modulecheck.other.R; - - public class ParsedClass { - - int someString = R.string.app_name; - } - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - - apiReferences {} - references { - androidR("com.modulecheck.other".asPackageName()) - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.someString") - } - } - } - - @Test - fun `android resource reference with R string import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - - addJavaSource( - """ - package com.subject; - - import com.modulecheck.other.R.string; - - public class ParsedClass { - - int someString = string.app_name; - } - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - - apiReferences {} - references { - androidR("com.modulecheck.other".asPackageName()) - java("com.modulecheck.other.R.string") - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.someString") - } - } - } - - @Test - fun `android resource reference with wildcard R import in base package`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - - addJavaSource( - """ - package com.subject; - - import com.modulecheck.other.*; - - public class ParsedClass { - - int someString = R.string.app_name; - } - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - - apiReferences {} - references { - androidR("com.modulecheck.other".asPackageName()) - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.someString") - } - } - } - - @Test - fun `android resource reference with wildcard R import not in base package`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - - addJavaSource( - """ - package com.subject.internal; - - import com.modulecheck.other.*; - - public class ParsedClass { - - int someString = R.string.app_name; - } - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - - apiReferences {} - references { - androidR("com.modulecheck.other".asPackageName()) - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - declarations { - agnostic("com.subject.internal.ParsedClass") - agnostic("com.subject.internal.ParsedClass.someString") - } - } - } - - @Test - fun `android resource reference with wildcard R member import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createJavaFile( - """ - package com.subject.internal; - - import com.modulecheck.other.R.*; - - public class ParsedClass { - - int someString = string.app_name; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - androidR("com.modulecheck.other".asPackageName()) - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - declarations { - agnostic("com.subject.internal.ParsedClass") - agnostic("com.subject.internal.ParsedClass.someString") - } - } - } - - @Test - fun `android resource reference with explicit R string import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createJavaFile( - """ - package com.subject; - - import com.modulecheck.other.R.string; - - public class ParsedClass { - - int someString = string.app_name; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - androidR("com.modulecheck.other".asPackageName()) - java("com.modulecheck.other.R.string") - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.someString") - } - } - } - - @Test - fun `android data-binding reference from dependency with explicit import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") { - addLayoutFile( - "fragment_other.xml", - """ - - """ - ) - } - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createJavaFile( - """ - package com.subject; - - import com.modulecheck.other.databinding.FragmentOtherBinding; - - public class ParsedClass { - - FragmentOtherBinding binding = FragmentOtherBinding.inflate(); - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.modulecheck.other.databinding.FragmentOtherBinding") - } - references { - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding") - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding.inflate") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.binding") - } - } - } - - @Test - fun `android data-binding reference from dependency with fully qualified reference`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") { - addLayoutFile( - "fragment_other.xml", - """ - - """ - ) - } - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createJavaFile( - """ - package com.subject; - - public class ParsedClass { - - com.modulecheck.other.databinding.FragmentOtherBinding binding = com.modulecheck.other.databinding.FragmentOtherBinding.inflate(); - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding") - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding.inflate") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.binding") - } - } - } - - @Test - fun `android data-binding reference from dependency with wildcard import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") { - addLayoutFile( - "fragment_other.xml", - """ - - """ - ) - } - - val project = androidLibrary(":lib1", "com.lib1") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createJavaFile( - """ - package com.subject; - - import com.modulecheck.other.databinding.*; - - public class ParsedClass { - - FragmentOtherBinding binding = FragmentOtherBinding.inflate(); - } - """ - ) - - file shouldBeJvmFile { - - apiReferences { - java("com.modulecheck.other.databinding.FragmentOtherBinding") - } - references { - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding") - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding.inflate") - } - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.binding") - } - } - } - } - - @Test - fun `local classes should not count as declarations`() = test { - - val project = androidLibrary(":lib1", "com.lib1") - - val file = project.createJavaFile( - """ - package com.subject; - - import com.subject.AnInterface; - import org.junit.Test; - - public class ATest { - - @Test - public void anonymous_things_can_be_parsed() { - class AnAnonymousClass implements AnInterface { - - @Override - public void aMethod() { - } - } - } - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references { - java("com.subject.AnInterface") - java("org.junit.Test") - } - declarations { - agnostic("com.subject.ATest") - agnostic("com.subject.ATest.anonymous_things_can_be_parsed") - } - } - } - - @Test - fun `multiple variables in a single line should all be declared`() = test { - - val project = androidLibrary(":lib1", "com.lib1") - - val file = project.createJavaFile( - """ - package com.subject; - - public class ParsedClass { - - public int i, j, k; - } - """ - ) - - file shouldBeJvmFile { - - apiReferences {} - references {} - declarations { - agnostic("com.subject.ParsedClass") - agnostic("com.subject.ParsedClass.i") - agnostic("com.subject.ParsedClass.j") - agnostic("com.subject.ParsedClass.k") - } - } - } - - fun java(name: String) = ReferenceName(name, JAVA) -} diff --git a/modulecheck-parsing/kotlin-compiler/api/api/api.api b/modulecheck-parsing/kotlin-compiler/api/api/api.api deleted file mode 100644 index d44889b0d7..0000000000 --- a/modulecheck-parsing/kotlin-compiler/api/api/api.api +++ /dev/null @@ -1,46 +0,0 @@ -public abstract interface class modulecheck/parsing/kotlin/compiler/HasAnalysisResult { - public abstract fun getAnalysisResultDeferred ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun getBindingContextDeferred ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun getModuleDescriptorDeferred ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public abstract interface class modulecheck/parsing/kotlin/compiler/KotlinEnvironment : modulecheck/parsing/kotlin/compiler/HasAnalysisResult { - public abstract fun bestAvailablePsiFactory (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getCompilerConfiguration ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun getCoreEnvironment ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun getHeavyPsiFactory ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun getLightPsiFactory ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun javaPsiFile (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun ktFile (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/kotlin/compiler/McPsiFileFactory { - public abstract fun createJava (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun createKotlin (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/kotlin/compiler/McPsiFileFactory$Factory { - public abstract fun create (Lmodulecheck/parsing/kotlin/compiler/KotlinEnvironment;)Lmodulecheck/parsing/kotlin/compiler/McPsiFileFactory; -} - -public final class modulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory : modulecheck/parsing/kotlin/compiler/internal/AbstractMcPsiFileFactory, modulecheck/parsing/kotlin/compiler/McPsiFileFactory { - public fun ()V - public final fun createJava (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public final fun createKotlin (Ljava/lang/String;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getCoreEnvironment ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public abstract class modulecheck/parsing/kotlin/compiler/internal/AbstractMcPsiFileFactory : modulecheck/parsing/kotlin/compiler/McPsiFileFactory { - public fun ()V - protected abstract fun create (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun createJava (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun createKotlin (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getCoreEnvironment ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public final class modulecheck/parsing/kotlin/compiler/internal/FilesKt { - public static final fun isKotlinFile (Ljava/io/File;)Z - public static final fun isKotlinScriptFile (Ljava/io/File;)Z - public static final fun isKtFile (Ljava/io/File;)Z -} - diff --git a/modulecheck-parsing/kotlin-compiler/api/build.gradle.kts b/modulecheck-parsing/kotlin-compiler/api/build.gradle.kts deleted file mode 100644 index a63ea9a7cf..0000000000 --- a/modulecheck-parsing/kotlin-compiler/api/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-kotlin-compiler-api" - ) -} - -dependencies { - api(libs.kotlin.compiler) - api(libs.kotlin.reflect) - - compileOnly(gradleApi()) - - compileOnly(libs.agp) - - implementation(project(path = ":modulecheck-utils:lazy")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotest.runner.junit5.jvm) -} diff --git a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/KotlinEnvironment.kt b/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/KotlinEnvironment.kt deleted file mode 100644 index 50d4f1f1ac..0000000000 --- a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/KotlinEnvironment.kt +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler - -import modulecheck.utils.lazy.LazyDeferred -import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingContext -import java.io.File - -/** - * Models everything needed in order to creat authentic - * Psi files for [BindingContext]-backed type resolution. - */ -interface KotlinEnvironment : HasAnalysisResult { - /** - * Used to create Psi files without necessarily performing compiler analysis first. - * This is only useful for Kotlin files, as Java Psi files require analysis first. - */ - val lightPsiFactory: LazyDeferred - - /** - * Used to create Psi files with a guarantee that compiler analysis is done - * first. This is required in order to use [java Psi files][PsiJavaFile], - */ - val heavyPsiFactory: LazyDeferred - - /** - * Returns the best [McPsiFileFactory] available without having to run compiler analysis. - * - * If analysis is completed, this will return [heavyPsiFactory]. - * Otherwise, it will return [lightPsiFactory]. - */ - suspend fun bestAvailablePsiFactory(): McPsiFileFactory - - /** - * wrapper around "core" settings like Kotlin version, - * source files, and classpath files (external dependencies) - */ - val coreEnvironment: LazyDeferred - - /** - * "core" settings like Kotlin version, source files, and classpath files (external dependencies) - */ - val compilerConfiguration: LazyDeferred - - /** - * Returns a cached [KtFile] if one has already been created, otherwise creates a new - * one. Note that these files are usable before compiler analysis has been executed. - */ - suspend fun ktFile(file: File): KtFile - - /** - * Returns a cached [PsiJavaFile] if one has already been created, otherwise creates - * a new one. Note that Java Psi files require compiler analysis to execute first. - */ - suspend fun javaPsiFile(file: File): PsiJavaFile -} - -/** - * Holds the [AnalysisResult], [BindingContext], and [ModuleDescriptorImpl] - * for a [KotlinEnvironment]. These are retrieved from an - * [AnalysisResult][org.jetbrains.kotlin.analyzer.AnalysisResult]. - */ -interface HasAnalysisResult { - /** - * The result of file analysis. This object is very expensive to create, but it's created lazily. - * - * Holds the [bindingContextDeferred] and [moduleDescriptorDeferred] - * used for last-resort type and reference resolution. - */ - val analysisResultDeferred: LazyDeferred - - /** - * Used as the entry point for type resolution in Psi files. - * Under the hood, it frequently delegates to this environment's - * ModuleDescriptor or the descriptors from its dependency environments. - */ - val bindingContextDeferred: LazyDeferred - - /** - * The real force behind type resolution. Prefer using [bindingContextDeferred] - * as the entry point, as it will give references to Psi elements when they're - * known. But when we have to resolve things from dependencies (including other - * source sets in the same module), this is always done using the descriptor. - * - * N.B. This is not thread-safe. This holds lazily cached data. That cache is - * partially filled after the initial analysis, but the cache is still added - * to when this descriptor is used in the analysis of downstream compilations. - * - * N.B. This has to be an -Impl instead of just the `ModuleDescriptor` interface - * because `TopDownAnalyzerFacadeForJVM.createContainer(...)` requires the -Impl type. - */ - val moduleDescriptorDeferred: LazyDeferred -} diff --git a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/McPsiFileFactory.kt b/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/McPsiFileFactory.kt deleted file mode 100644 index 1f5b62d7be..0000000000 --- a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/McPsiFileFactory.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler - -import org.jetbrains.kotlin.com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.psi.KtFile -import java.io.File -import java.io.FileNotFoundException - -/** Creates Kotlin and Java Psi files using a shared [KotlinEnvironment] */ -interface McPsiFileFactory { - - /** - * @return a Psi `KtFile` for Kotlin files. The file extension must be `.kt` or `.kts`. - * @throws IllegalArgumentException if the [file] is an unsupported extension - * @throws FileNotFoundException if the [file] does not exist in the Java file system - */ - suspend fun createKotlin(file: File): KtFile - - /** - * @return a Psi `PsiJavaFile` for Java files. The file extension must be `.java`. - * @throws IllegalArgumentException if the [file] is an unsupported extension - * @throws FileNotFoundException if the [file] does not exist in the Java file system - */ - suspend fun createJava(file: File): PsiJavaFile - - /** Creates an instance of [McPsiFileFactory] */ - fun interface Factory { - - /** @return an instance of [McPsiFileFactory] for the given [kotlinEnvironment] */ - fun create(kotlinEnvironment: KotlinEnvironment): McPsiFileFactory - } -} diff --git a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory.kt b/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory.kt deleted file mode 100644 index 74544db313..0000000000 --- a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory.kt +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler - -import modulecheck.parsing.kotlin.compiler.internal.AbstractMcPsiFileFactory -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import org.intellij.lang.annotations.Language -import org.jetbrains.kotlin.cli.common.messages.MessageRenderer -import org.jetbrains.kotlin.cli.common.messages.PrintingMessageCollector -import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.com.intellij.lang.java.JavaLanguage -import org.jetbrains.kotlin.com.intellij.openapi.util.Disposer -import org.jetbrains.kotlin.com.intellij.openapi.util.text.StringUtilRt -import org.jetbrains.kotlin.com.intellij.psi.PsiFile -import org.jetbrains.kotlin.com.intellij.psi.PsiFileFactory -import org.jetbrains.kotlin.com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtPsiFactory -import java.io.File -import java.io.FileNotFoundException -import javax.inject.Inject - -/** - * A simple [McPsiFileFactory] which performs no source code analysis - * and has just a generic [coreEnvironment] and [configuration]. The - * resulting [BindingContext][org.jetbrains.kotlin.resolve.BindingContext] - * will always be "empty" and will be useless for type resolution. - */ -class NoContextPsiFileFactory @Inject constructor() : - AbstractMcPsiFileFactory(), - McPsiFileFactory { - - private val configuration = CompilerConfiguration().apply { - put( - CommonConfigurationKeys.MESSAGE_COLLECTOR_KEY, - PrintingMessageCollector( - System.err, - MessageRenderer.PLAIN_FULL_PATHS, - false - ) - ) - } - - override val coreEnvironment: LazyDeferred = lazyDeferred { - KotlinCoreEnvironment.createForProduction( - projectDisposable = Disposer.newDisposable(), - configuration = configuration, - configFiles = EnvironmentConfigFiles.JVM_CONFIG_FILES - ) - } - - private val psiProject = lazyDeferred { coreEnvironment.await().project } - - private val ktFileFactory = lazyDeferred { - KtPsiFactory(psiProject.await(), markGenerated = false) - } - private val javaFileFactory = lazyDeferred { PsiFileFactory.getInstance(psiProject.await()) } - - override suspend fun create(file: File): PsiFile { - if (!file.exists()) throw FileNotFoundException("could not find file $file") - - return when (file.extension) { - "java" -> javaFileFactory.await().createFileFromText( - file.name, - JavaLanguage.INSTANCE, - file.readText() - ) as PsiJavaFile - - "kt", "kts" -> ktFileFactory.await().createPhysicalFile( - file.name, - StringUtilRt.convertLineSeparators(file.readText().trimIndent()) - ) - - else -> throw IllegalArgumentException( - "file extension must be one of [java, kt, kts], but it was `${file.extension}`." - ) - } - } - - /** - * @return a "virtual" Psi `KtFile` with the given [name] and - * [content]. This file does not exist in a Java file system. - * @see createKotlin - */ - suspend fun createKotlin( - name: String, - @Language("kotlin") - content: String - ): KtFile { - return ktFileFactory.await() - .createFile(name, content) - } - - /** - * @return a "virtual" Psi `PsiJavaFile` with the given [name] and - * [content]. This file does not exist in a Java file system. - * @see createJava - */ - suspend fun createJava( - name: String, - @Language("java") - content: String - ): PsiJavaFile { - - return javaFileFactory.await() - .createFileFromText( - name, - JavaLanguage.INSTANCE, - content.trimIndent() - ) as PsiJavaFile - } -} diff --git a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/internal/AbstractMcPsiFileFactory.kt b/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/internal/AbstractMcPsiFileFactory.kt deleted file mode 100644 index 2042579581..0000000000 --- a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/internal/AbstractMcPsiFileFactory.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.internal - -import modulecheck.parsing.kotlin.compiler.McPsiFileFactory -import modulecheck.utils.lazy.LazyDeferred -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.com.intellij.psi.PsiFile -import org.jetbrains.kotlin.com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.incremental.isJavaFile -import org.jetbrains.kotlin.psi.KtFile -import java.io.File - -/** Base class for an [McPsiFileFactory] implementation */ -abstract class AbstractMcPsiFileFactory : McPsiFileFactory { - - /** - * wrapper around "core" settings like Kotlin version, - * source files, and classpath files (external dependencies) - */ - abstract val coreEnvironment: LazyDeferred - - protected abstract suspend fun create(file: File): PsiFile - - override suspend fun createKotlin(file: File): KtFile { - require(file.exists()) { "could not find file $file" } - require(file.isKotlinFile()) { - "the file's extension must be either `.kt` or `.kts`, but it was `${file.extension}`." - } - - return create(file) as KtFile - } - - override suspend fun createJava(file: File): PsiJavaFile { - - require(file.isJavaFile()) { - "the file's extension must be `.java`, but it was `${file.extension}`." - } - - return create(file) as PsiJavaFile - } -} diff --git a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/internal/files.kt b/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/internal/files.kt deleted file mode 100644 index 7c211dc300..0000000000 --- a/modulecheck-parsing/kotlin-compiler/api/src/main/kotlin/modulecheck/parsing/kotlin/compiler/internal/files.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("TooManyFunctions") - -package modulecheck.parsing.kotlin.compiler.internal - -import java.io.File - -/** - * @return true if the file exists in the Java file system - * and has an extension of `.kt` or `.kts`, otherwise false - */ -fun File.isKotlinFile(): Boolean = exists() && extension.let { it == "kt" || it == "kts" } - -/** - * @return true if the file exists in the Java file system - * and has an extension of `.kts`, otherwise false - */ -fun File.isKotlinScriptFile(): Boolean = exists() && extension == "kts" - -/** - * @return true if the file exists in the Java file - * system and has an extension of `.kt`, otherwise false - */ -fun File.isKtFile(): Boolean = exists() && extension == "kt" diff --git a/modulecheck-parsing/kotlin-compiler/impl/api/impl.api b/modulecheck-parsing/kotlin-compiler/impl/api/impl.api deleted file mode 100644 index 12fda16b23..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/api/impl.api +++ /dev/null @@ -1,135 +0,0 @@ -public final class anvil/hint/Modulecheck_parsing_kotlin_compiler_impl_Factory_Factory_TaskScope_BindingModule_92bd406a_2204ffa8Kt { - public static final fun getModulecheck_parsing_kotlin_compiler_impl_Factory_Factory_TaskScope_BindingModule_92bd406a_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_kotlin_compiler_impl_Factory_Factory_TaskScope_BindingModule_92bd406a_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_parsing_kotlin_compiler_impl_Factory_KotlinEnvironmentFactory_TaskScope_BindingModule_cebbbacd_959bf11bKt { - public static final fun getModulecheck_parsing_kotlin_compiler_impl_Factory_KotlinEnvironmentFactory_TaskScope_BindingModule_cebbbacd_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_kotlin_compiler_impl_Factory_KotlinEnvironmentFactory_TaskScope_BindingModule_cebbbacd_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_parsing_kotlin_compiler_impl_SafeAnalysisResultAccessImpl_SafeAnalysisResultAccess_TaskScope_BindingModule_7e93cce8_fc1e9a66Kt { - public static final fun getModulecheck_parsing_kotlin_compiler_impl_SafeAnalysisResultAccessImpl_SafeAnalysisResultAccess_TaskScope_BindingModule_7e93cce8_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_kotlin_compiler_impl_SafeAnalysisResultAccessImpl_SafeAnalysisResultAccess_TaskScope_BindingModule_7e93cce8_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess { - public fun (Lmodulecheck/project/ProjectCache;)V - public final fun dependencyModuleDescriptors-5sj7XBw (Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess; - public static final fun newInstance (Lmodulecheck/project/ProjectCache;)Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess_Factory; - public final fun newInstance (Lmodulecheck/project/ProjectCache;)Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess; -} - -public abstract interface class modulecheck/parsing/kotlin/compiler/impl/Factory_Factory_TaskScope_BindingModule_92bd406a { - public abstract fun bindFactory (Lmodulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory$Factory;)Lmodulecheck/parsing/kotlin/compiler/McPsiFileFactory$Factory; -} - -public abstract interface class modulecheck/parsing/kotlin/compiler/impl/Factory_KotlinEnvironmentFactory_TaskScope_BindingModule_cebbbacd { - public abstract fun bindKotlinEnvironmentFactory (Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment$Factory;)Lmodulecheck/gradle/platforms/KotlinEnvironmentFactory; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment : modulecheck/parsing/kotlin/compiler/KotlinEnvironment { - public synthetic fun (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/lang/String;Lmodulecheck/utils/lazy/LazyDeferred;Ljava/util/Collection;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/utils/lazy/ResetManager;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun bestAvailablePsiFactory (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getAnalysisResultDeferred ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getBindingContextDeferred ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getClasspathFiles ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getCompilerConfiguration ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getCoreEnvironment ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getDependencyModuleDescriptorAccess ()Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess; - public fun getHeavyPsiFactory ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getJvmTarget ()Lorg/jetbrains/kotlin/config/JvmTarget; - public final fun getKotlinLanguageVersion ()Lorg/jetbrains/kotlin/config/LanguageVersion; - public fun getLightPsiFactory ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getLogger ()Lmodulecheck/reporting/logging/McLogger; - public fun getModuleDescriptorDeferred ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun getSourceSetName-qrJCKeA ()Ljava/lang/String; - public fun javaPsiFile (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun ktFile (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment$Factory : modulecheck/gradle/platforms/KotlinEnvironmentFactory { - public fun (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/reporting/logging/McLogger;)V - public synthetic fun create-Flv3FUE (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/lang/String;Lmodulecheck/utils/lazy/LazyDeferred;Ljava/util/Collection;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;)Lmodulecheck/parsing/kotlin/compiler/KotlinEnvironment; - public fun create-Flv3FUE (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/lang/String;Lmodulecheck/utils/lazy/LazyDeferred;Ljava/util/Collection;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;)Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment_Factory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment_Factory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment_Factory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment$Factory; - public static final fun newInstance (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/reporting/logging/McLogger;)Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment$Factory; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment_Factory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment_Factory_Factory; - public final fun newInstance (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/reporting/logging/McLogger;)Lmodulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment$Factory; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory : modulecheck/parsing/kotlin/compiler/internal/AbstractMcPsiFileFactory, modulecheck/parsing/kotlin/compiler/McPsiFileFactory { - public fun (Lmodulecheck/parsing/kotlin/compiler/KotlinEnvironment;)V - public fun getCoreEnvironment ()Lmodulecheck/utils/lazy/LazyDeferred; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory$Factory : modulecheck/parsing/kotlin/compiler/McPsiFileFactory$Factory { - public fun ()V - public synthetic fun create (Lmodulecheck/parsing/kotlin/compiler/KotlinEnvironment;)Lmodulecheck/parsing/kotlin/compiler/McPsiFileFactory; - public fun create (Lmodulecheck/parsing/kotlin/compiler/KotlinEnvironment;)Lmodulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory_Factory_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory_Factory_Factory; - public static final fun create ()Lmodulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory_Factory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory$Factory; - public static final fun newInstance ()Lmodulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory$Factory; -} - -public abstract interface class modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccess { - public abstract fun withLeases-BhXIJPA (Lmodulecheck/parsing/kotlin/compiler/HasAnalysisResult;Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl : modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccess { - public fun (Lmodulecheck/project/ProjectCache;)V - public fun withLeases-BhXIJPA (Lmodulecheck/parsing/kotlin/compiler/HasAnalysisResult;Lmodulecheck/model/dependency/ProjectPath;Ljava/lang/String;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl; - public static final fun newInstance (Lmodulecheck/project/ProjectCache;)Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl_Factory; - public final fun newInstance (Lmodulecheck/project/ProjectCache;)Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl; -} - -public abstract interface class modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl_SafeAnalysisResultAccess_TaskScope_BindingModule_7e93cce8 { - public abstract fun bindSafeAnalysisResultAccess (Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccessImpl;)Lmodulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccess; -} - -public final class modulecheck/parsing/kotlin/compiler/impl/VersionNeutralTopDownAnalyzerFacadeForJVM { - public static final field INSTANCE Lmodulecheck/parsing/kotlin/compiler/impl/VersionNeutralTopDownAnalyzerFacadeForJVM; - public final fun analyzeFilesWithJavaIntegration (Lorg/jetbrains/kotlin/com/intellij/openapi/project/Project;Ljava/util/Collection;Lorg/jetbrains/kotlin/resolve/BindingTrace;Lorg/jetbrains/kotlin/config/CompilerConfiguration;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lorg/jetbrains/kotlin/com/intellij/psi/search/GlobalSearchScope;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/resolve/TargetEnvironment;)Lorg/jetbrains/kotlin/analyzer/AnalysisResult; - public static synthetic fun analyzeFilesWithJavaIntegration$default (Lmodulecheck/parsing/kotlin/compiler/impl/VersionNeutralTopDownAnalyzerFacadeForJVM;Lorg/jetbrains/kotlin/com/intellij/openapi/project/Project;Ljava/util/Collection;Lorg/jetbrains/kotlin/resolve/BindingTrace;Lorg/jetbrains/kotlin/config/CompilerConfiguration;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lorg/jetbrains/kotlin/com/intellij/psi/search/GlobalSearchScope;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/resolve/TargetEnvironment;ILjava/lang/Object;)Lorg/jetbrains/kotlin/analyzer/AnalysisResult; -} - diff --git a/modulecheck-parsing/kotlin-compiler/impl/build.gradle.kts b/modulecheck-parsing/kotlin-compiler/impl/build.gradle.kts deleted file mode 100644 index e53006a8ea..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/build.gradle.kts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-kotlin-compiler-impl" - ) - anvil() -} - -dependencies { - - api(libs.google.dagger.api) - api(libs.kotlin.compiler) - api(libs.kotlin.reflect) - - api(project(path = ":modulecheck-gradle:platforms:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-reporting:logging:api")) - api(project(path = ":modulecheck-utils:lazy")) - - compileOnly(libs.agp) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotest.runner.junit5.jvm) - - testImplementation(project(path = ":modulecheck-internal-testing")) - testImplementation(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - testImplementation(project(path = ":modulecheck-parsing:kotlin-compiler:impl")) - testImplementation(project(path = ":modulecheck-parsing:psi")) - testImplementation(project(path = ":modulecheck-project:testing")) - testImplementation(project(path = ":modulecheck-utils:stdlib")) -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess.kt b/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess.kt deleted file mode 100644 index 8d6e866356..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess.kt +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import kotlinx.coroutines.flow.toList -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.upstream -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.KotlinEnvironment -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.utils.coroutines.distinct -import modulecheck.utils.coroutines.flatMapListMerge -import modulecheck.utils.coroutines.mapAsync -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import javax.inject.Inject - -/** - * Provides all descriptors for the dependencies of a given project's source set. - * - * These descriptors are globally cached and shared. - */ -@SingleIn(TaskScope::class) -class DependencyModuleDescriptorAccess @Inject constructor( - private val projectCache: ProjectCache -) { - - /** - * @return all descriptors for the dependencies of a given project's - * source set. These descriptors are globally cached and shared. - */ - suspend fun dependencyModuleDescriptors( - projectPath: ProjectPath, - sourceSetName: SourceSetName - ): List { - - return projectCache.getValue(projectPath) - .projectDependencies[sourceSetName] - .flatMapListMerge { dep -> - - val dependencyProject = projectCache.getValue(dep.projectPath) - val dependencySourceSetName = dep.declaringSourceSetName(dependencyProject.sourceSets) - - dependencySourceSetName.upstreamEnvironments(dependencyProject, includeSelf = true) - } - .plus( - sourceSetName.upstreamEnvironments( - project = projectCache.getValue(projectPath), - includeSelf = false - ) - ) - .mapAsync { dependencyKotlinEnvironment -> - dependencyKotlinEnvironment.moduleDescriptorDeferred.await() - } - .distinct() - .toList() - } - - private suspend fun SourceSetName.upstreamEnvironments( - project: McProject, - includeSelf: Boolean - ): List { - val seed = if (includeSelf) { - withUpstream(project) - } else { - upstream(project) - } - - return seed.mapNotNull { project.sourceSets[it]?.kotlinEnvironmentDeferred?.await() } - } -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/McMessageCollector.kt b/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/McMessageCollector.kt deleted file mode 100644 index 7476b84dcf..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/McMessageCollector.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import modulecheck.parsing.kotlin.compiler.impl.McMessageCollector.LogLevel.ERRORS -import modulecheck.parsing.kotlin.compiler.impl.McMessageCollector.LogLevel.VERBOSE -import modulecheck.parsing.kotlin.compiler.impl.McMessageCollector.LogLevel.WARNINGS_AS_ERRORS -import modulecheck.reporting.logging.McLogger -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity -import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSourceLocation -import org.jetbrains.kotlin.cli.common.messages.MessageCollector -import org.jetbrains.kotlin.cli.common.messages.MessageRenderer - -internal class McMessageCollector( - private val messageRenderer: MessageRenderer, - private val logger: McLogger, - private val logLevel: LogLevel -) : MessageCollector { - - private var totalMessages = 0 - private var ignoredMessages = 0 - - override fun report( - severity: CompilerMessageSeverity, - message: String, - location: CompilerMessageSourceLocation? - ) { - - totalMessages++ - - when (logLevel) { - ERRORS -> if (severity.isError) { - logger.failure(messageRenderer.render(severity, message, location)) - } else { - ignoredMessages++ - } - - WARNINGS_AS_ERRORS -> if (severity.isWarning || severity.isError) { - logger.failure(messageRenderer.render(severity, message, location)) - } else { - ignoredMessages++ - } - - VERBOSE -> if (severity.isWarning || severity.isError) { - logger.failure(messageRenderer.render(severity, message, location)) - } else { - logger.info(messageRenderer.render(severity, message, location)) - } - } - } - - override fun clear() { - ignoredMessages = 0 - totalMessages = 0 - } - - override fun hasErrors(): Boolean = totalMessages > 0 - - fun printIssuesCountIfAny() { - if (ignoredMessages > 0) { - logger.warning("Analysis completed with $ignoredMessages ignored issues.") - } - } - - enum class LogLevel { - ERRORS, - WARNINGS_AS_ERRORS, - VERBOSE - } -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment.kt b/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment.kt deleted file mode 100644 index b406bdce2d..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironment.kt +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import com.squareup.anvil.annotations.ContributesBinding -import dispatch.core.withIO -import modulecheck.dagger.TaskScope -import modulecheck.gradle.platforms.KotlinEnvironmentFactory -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.KotlinEnvironment -import modulecheck.parsing.kotlin.compiler.internal.isKotlinFile -import modulecheck.reporting.logging.McLogger -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.ResetManager -import modulecheck.utils.lazy.lazyDeferred -import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.cli.common.config.addKotlinSourceRoots -import org.jetbrains.kotlin.cli.common.environment.setIdeaIoUseFallback -import org.jetbrains.kotlin.cli.common.messages.AnalyzerWithCompilerReport -import org.jetbrains.kotlin.cli.common.messages.MessageRenderer -import org.jetbrains.kotlin.cli.jvm.compiler.EnvironmentConfigFiles.JVM_CONFIG_FILES -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.cli.jvm.compiler.NoScopeRecordCliBindingTrace -import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM -import org.jetbrains.kotlin.cli.jvm.config.addJavaSourceRoots -import org.jetbrains.kotlin.cli.jvm.config.addJvmClasspathRoots -import org.jetbrains.kotlin.com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.config.ApiVersion -import org.jetbrains.kotlin.config.CommonConfigurationKeys -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.config.JVMConfigurationKeys -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.LanguageVersion -import org.jetbrains.kotlin.config.LanguageVersionSettingsImpl -import org.jetbrains.kotlin.config.languageVersionSettings -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.incremental.isJavaFile -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory -import java.io.File -import javax.inject.Inject - -/** - * @property projectPath path of the associated Gradle project - * @property sourceSetName name of the associated - * [SourceSet][modulecheck.model.dependency.McSourceSet] - * @property classpathFiles `.jar` files from external dependencies - * @param sourceDirs all jvm source code directories for - * this source set, like `[...]/myProject/src/main/java`. - * @property kotlinLanguageVersion the version of Kotlin being used - * @property jvmTarget the version of Java being compiled to - * @property dependencyModuleDescriptorAccess provides the module descriptors of - * all dependency source sets from the current module and dependency modules - * @property logger logs Kotlin compiler messages during analysis - * @param resetManager used to reset caching - */ -class RealKotlinEnvironment( - val projectPath: StringProjectPath, - val sourceSetName: SourceSetName, - val classpathFiles: LazyDeferred>, - private val sourceDirs: Collection, - val kotlinLanguageVersion: LanguageVersion?, - val jvmTarget: JvmTarget, - val dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - val logger: McLogger, - private val resetManager: ResetManager -) : KotlinEnvironment { - - private val sourceFiles by lazy { - sourceDirs.asSequence() - .flatMap { dir -> dir.walkTopDown() } - .filter { it.isFile } - .toSet() - } - - override val compilerConfiguration: LazyDeferred = lazyDeferred { - createCompilerConfiguration( - // TODO re-enable classpath files once external dependency resolution is working - // classpathFiles = classpathFiles.await(), - classpathFiles = emptyList(), - sourceFiles = sourceFiles.toList(), - kotlinLanguageVersion = kotlinLanguageVersion, - jvmTarget = jvmTarget - ) - } - - override val coreEnvironment: LazyDeferred = lazyDeferred { - createKotlinCoreEnvironment(compilerConfiguration.await()) - } - - override val lightPsiFactory: LazyDeferred = lazyDeferred { - RealMcPsiFileFactory(this) - } - - override val heavyPsiFactory: LazyDeferred = lazyDeferred { - analysisResultDeferred.await() - RealMcPsiFileFactory(this) - } - - override suspend fun bestAvailablePsiFactory(): RealMcPsiFileFactory { - return when { - heavyPsiFactory.isCompleted -> heavyPsiFactory.getCompleted() - analysisResultDeferred.isCompleted -> heavyPsiFactory.await() - else -> lightPsiFactory.await() - } - } - - private val kotlinSourceFiles by lazy { sourceFiles.filter { it.isKotlinFile() } } - - override suspend fun javaPsiFile(file: File): PsiJavaFile { - // Type resolution for Java Psi files assumes that analysis has already been run. - // Otherwise, we get: - // `UninitializedPropertyAccessException: lateinit property module has not been initialized` - analysisResultDeferred.await() - return heavyPsiFactory.await().createJava(file) - } - - override suspend fun ktFile(file: File): KtFile { - return bestAvailablePsiFactory().createKotlin(file) - } - - override val analysisResultDeferred: LazyDeferred = lazyDeferred { - - val psiFactory = lightPsiFactory.await() - - val ktFiles = kotlinSourceFiles - .map { file -> psiFactory.createKotlin(file) } - - val descriptors = dependencyModuleDescriptorAccess.dependencyModuleDescriptors( - projectPath = projectPath, - sourceSetName = sourceSetName - ) - - createAnalysisResult( - coreEnvironment = coreEnvironment.await(), - ktFiles = ktFiles, - dependencyModuleDescriptors = descriptors - ) - } - - override val bindingContextDeferred: LazyDeferred = lazyDeferred { - analysisResultDeferred.await().bindingContext - } - - override val moduleDescriptorDeferred: LazyDeferred = lazyDeferred { - analysisResultDeferred.await().moduleDescriptor as ModuleDescriptorImpl - } - - private val messageCollector by lazy { - McMessageCollector( - messageRenderer = MessageRenderer.GRADLE_STYLE, - logger = logger, - logLevel = McMessageCollector.LogLevel.WARNINGS_AS_ERRORS - ) - } - - private suspend fun createAnalysisResult( - coreEnvironment: KotlinCoreEnvironment, - ktFiles: List, - dependencyModuleDescriptors: List - ): AnalysisResult = withIO { - - val analyzer = AnalyzerWithCompilerReport( - messageCollector = messageCollector, - languageVersionSettings = coreEnvironment.configuration.languageVersionSettings, - renderDiagnosticName = false - ) - - analyzer.analyzeAndReport(ktFiles) { - TopDownAnalyzerFacadeForJVM.analyzeFilesWithJavaIntegration( - project = coreEnvironment.project, - files = ktFiles, - trace = NoScopeRecordCliBindingTrace(coreEnvironment.project), - configuration = coreEnvironment.configuration, - packagePartProvider = coreEnvironment::createPackagePartProvider, - declarationProviderFactory = ::FileBasedDeclarationProviderFactory, - explicitModuleDependencyList = dependencyModuleDescriptors - ) - } - - messageCollector.printIssuesCountIfAny() - - analyzer.analysisResult - } - - private fun createCompilerConfiguration( - classpathFiles: List, - sourceFiles: List, - kotlinLanguageVersion: LanguageVersion?, - jvmTarget: JvmTarget - ): CompilerConfiguration { - val javaFiles = mutableListOf() - val kotlinFiles = mutableListOf() - - sourceFiles.forEach { file -> - when { - file.isKotlinFile() -> kotlinFiles.add(file.absolutePath) - file.isJavaFile() -> javaFiles.add(file) - } - } - - return CompilerConfiguration().apply { - put(CommonConfigurationKeys.MESSAGE_COLLECTOR_KEY, messageCollector) - put(JVMConfigurationKeys.JVM_TARGET, jvmTarget) - put(CommonConfigurationKeys.MODULE_NAME, "${projectPath.value}:${sourceSetName.value}") - - if (kotlinLanguageVersion != null) { - val languageVersionSettings = LanguageVersionSettingsImpl( - languageVersion = kotlinLanguageVersion, - apiVersion = ApiVersion.createByLanguageVersion(kotlinLanguageVersion) - ) - put(CommonConfigurationKeys.LANGUAGE_VERSION_SETTINGS, languageVersionSettings) - } - - put(JVMConfigurationKeys.JVM_TARGET, jvmTarget) - - addJavaSourceRoots(javaFiles) - addKotlinSourceRoots(kotlinFiles) - addJvmClasspathRoots(classpathFiles) - } - } - - private fun createKotlinCoreEnvironment( - configuration: CompilerConfiguration - ): KotlinCoreEnvironment { - // https://github.com/JetBrains/kotlin/commit/2568804eaa2c8f6b10b735777218c81af62919c1 - setIdeaIoUseFallback() - - return KotlinCoreEnvironment.createForProduction( - projectDisposable = resetManager, - configuration = configuration, - configFiles = JVM_CONFIG_FILES - ) - } - - /** Dagger implementation for [KotlinEnvironmentFactory] */ - @ContributesBinding(TaskScope::class) - class Factory @Inject constructor( - private val dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - private val logger: McLogger - ) : KotlinEnvironmentFactory { - override fun create( - projectPath: StringProjectPath, - sourceSetName: SourceSetName, - classpathFiles: LazyDeferred>, - sourceDirs: Collection, - kotlinLanguageVersion: LanguageVersion?, - jvmTarget: JvmTarget - ): RealKotlinEnvironment = RealKotlinEnvironment( - projectPath = projectPath, - sourceSetName = sourceSetName, - classpathFiles = classpathFiles, - sourceDirs = sourceDirs, - kotlinLanguageVersion = kotlinLanguageVersion, - jvmTarget = jvmTarget, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - logger = logger, - resetManager = ResetManager() - ) - } -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory.kt b/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory.kt deleted file mode 100644 index 7459af4d70..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealMcPsiFileFactory.kt +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.parsing.kotlin.compiler.KotlinEnvironment -import modulecheck.parsing.kotlin.compiler.McPsiFileFactory -import modulecheck.parsing.kotlin.compiler.internal.AbstractMcPsiFileFactory -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import org.jetbrains.kotlin.cli.jvm.compiler.KotlinCoreEnvironment -import org.jetbrains.kotlin.com.intellij.openapi.vfs.StandardFileSystems -import org.jetbrains.kotlin.com.intellij.openapi.vfs.VirtualFileManager -import org.jetbrains.kotlin.com.intellij.psi.PsiFile -import org.jetbrains.kotlin.com.intellij.psi.PsiManager -import java.io.File -import java.io.FileNotFoundException -import java.util.concurrent.ConcurrentHashMap -import javax.inject.Inject - -/** - * A real implementation of [McPsiFileFactory] using a curated [KotlinEnvironment]. - * - * The files created from this factory are backed by a meaningful - * [BindingContext][org.jetbrains.kotlin.resolve.BindingContext] which - * is aware of the full classpath and may be used for type resolution. - */ -class RealMcPsiFileFactory( - kotlinEnvironment: KotlinEnvironment -) : AbstractMcPsiFileFactory(), - McPsiFileFactory { - - override val coreEnvironment: LazyDeferred = kotlinEnvironment.coreEnvironment - - private val fileCache = ConcurrentHashMap() - - private val psiProjectDeferred = lazyDeferred { coreEnvironment.await().project } - private val psiManager = lazyDeferred { - PsiManager.getInstance(psiProjectDeferred.await()) - } - private val virtualFileSystem = lazyDeferred { - // make sure that the PsiManager has initialized, or we'll get NPE's when trying to initialize - // the VirtualFileManager instance - psiManager.await() - - VirtualFileManager.getInstance() - .getFileSystem(StandardFileSystems.FILE_PROTOCOL) - } - - override suspend fun create(file: File): PsiFile { - return fileCache.getOrPut(file) { - if (!file.exists()) throw FileNotFoundException("could not find file $file") - - val vFile = virtualFileSystem.await().findFileByPath(file.absolutePath) - ?: throw FileNotFoundException("could not find file $file") - - val psi = psiManager.await().findFile(vFile) - - when (file.extension) { - "java" -> psi as PsiFile - "kt", "kts" -> psi as PsiFile - else -> throw IllegalArgumentException( - "file extension must be one of [java, kt, kts], but it was `${file.extension}`." - ) - } - } - } - - /** Creates an instance of [McPsiFileFactory] */ - @ContributesBinding(TaskScope::class) - class Factory @Inject constructor() : McPsiFileFactory.Factory { - override fun create(kotlinEnvironment: KotlinEnvironment): RealMcPsiFileFactory = - RealMcPsiFileFactory(kotlinEnvironment) - } -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccess.kt b/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccess.kt deleted file mode 100644 index c67d72e6eb..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/SafeAnalysisResultAccess.kt +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import com.squareup.anvil.annotations.ContributesBinding -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.takeWhile -import kotlinx.coroutines.flow.toSet -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.HasAnalysisResult -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.utils.coroutines.flatMapListMerge -import modulecheck.utils.coroutines.onEachAsync -import modulecheck.utils.letIf -import javax.inject.Inject -import kotlin.random.Random - -/** - * Thread-safe, "leased" access to - * [AnalysisResult][org.jetbrains.kotlin.analyzer.AnalysisResult] creation and subsequent - * [ModuleDescriptorImpl][org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl] access. - */ -interface SafeAnalysisResultAccess { - - /** - * Suspends until all dependency module descriptors are available for use, then acquires locks - * for all of them and performs [action]. No other project/source set will be able to read from - * those analysis results, binding contexts, or module descriptors until [action] has completed. - */ - suspend fun withLeases( - requester: HasAnalysisResult, - projectPath: ProjectPath, - sourceSetName: SourceSetName, - action: suspend (Collection) -> T - ): T -} - -/** The only implementation of [SafeAnalysisResultAccess] */ -@SingleIn(TaskScope::class) -@ContributesBinding(TaskScope::class) -class SafeAnalysisResultAccessImpl @Inject constructor( - private val projectCache: ProjectCache -) : SafeAnalysisResultAccess { - - private val locksCacheLock = Mutex(locked = false) - private val locks = mutableMapOf() - - private val queue = MutableStateFlow(DifferentList(emptyList())) - - override suspend fun withLeases( - requester: HasAnalysisResult, - projectPath: ProjectPath, - sourceSetName: SourceSetName, - action: suspend (Collection) -> T - ): T { - - val thisProject = projectCache.getValue(projectPath) - - val requested = projectCache.getValue(projectPath) - .projectDependencies[sourceSetName] - .flatMapListMerge { dep -> - - val dependencyProject = projectCache.getValue(dep.projectPath) - val dependencySourceSetName = dep.declaringSourceSetName(dependencyProject.sourceSets) - - dependencySourceSetName.upstreamEnvironments(dependencyProject) - } - .plus(sourceSetName.upstreamEnvironments(thisProject).filterNot { it == requester }) - // Before performing this analysis, each dependency needs to do its own analysis. - // If those are already done, then there's nothing to do. Otherwise, wait for them to - // complete before entering this requester into the general queue. - // We need to wait before queueing **this** requester because if this is queued first, it will - // acquire the locks for all its dependencies, and then any dependency which hasn't actually - // done analysis yet won't be able to acquire its lock, and we'll have a deadlock. - .onEachAsync { dependencyEnvironment -> - dependencyEnvironment.analysisResultDeferred - .let { analysisResult -> - if (!analysisResult.isCompleted) { - analysisResult.await() - } - } - } - .toSet() - - val pendingRequest = PendingRequest( - requester = requester, - dependencies = requested - ) - - addToQueue( - pendingRequest = pendingRequest, - sort = true - ) - - return withLeases(pendingRequest) { action(requested) } - } - - private suspend fun withLeases(pendingRequest: PendingRequest, action: suspend () -> T): T { - var completed = false - var result: T? = null - - queue - // only do work when this requester is first in line. - .filter { it.firstOrNull() == pendingRequest } - .onEach { - - val acquired = locksCacheLock.withLock { - // If this requester is first, remove it from the queue and try to lock all of its - // environments. If we can't lock everything, this pending request be placed in the back - // of the queue. - queue.value = queue.value.filterNot { it == pendingRequest }.asDifferentList() - - maybeLockAll(pendingRequest) - } - - if (acquired) { - // do the work we need the locks for - result = action() - // release the locks and update the queue with a new sort - locksCacheLock.withLock { - - pendingRequest.dependencies - .plus(pendingRequest.requester) - .forEach { locks[it] = false } - - queue.value = queue.value.distinct().sorted().asDifferentList() - } - - // stop collecting so that we return out of the function - completed = true - } else { - // If this requester is blocked by some other consumer, go to the end of the line. Once - // there's a change to the state of the locks, this requester will be able to check again. - addToQueue( - pendingRequest = pendingRequest, - sort = false - ) - } - } - .takeWhile { !completed } - .collect() - - @Suppress("UNCHECKED_CAST") - return result as T - } - - private suspend fun addToQueue(pendingRequest: PendingRequest, sort: Boolean) { - locksCacheLock.withLock { - queue.value = queue.value - .plus(pendingRequest) - .distinct() - .letIf(sort) { list -> - list.sorted() - } - .asDifferentList() - } - } - - private fun maybeLockAll(pendingRequest: PendingRequest): Boolean { - - val allEnvironments = pendingRequest.dependencies - .plus(pendingRequest.requester) - - return allEnvironments - .none { locks.getOrPut(it) { false } } - .also { allUnlocked -> - if (allUnlocked) { - allEnvironments.forEach { key -> - locks[key] = true - } - } - } - } - - internal data class PendingRequest( - val requester: HasAnalysisResult, - val dependencies: Set - ) : Comparable { - - override fun compareTo(other: PendingRequest): Int { - - return dependencies.contains(other.requester).compareTo(true) - .compareTo(other.dependencies.contains(requester).compareTo(false)) - } - } - - /** - * This is a hack to get around the de-duping behavior of - * a [StateFlow][kotlinx.coroutines.flow.StateFlow]. Two - * lists with identical contents will never be equal, so - * - * As a bonus, this is also cheaper since we don't - * need to compare all the elements of the two lists. - */ - private class DifferentList(delegate: List) : List by delegate { - @Suppress("EqualsAlwaysReturnsTrueOrFalse") - override fun equals(other: Any?): Boolean = false - override fun hashCode(): Int = Random.nextInt() - } - - private fun List.asDifferentList() = DifferentList(this.distinct()) - - private suspend fun SourceSetName.upstreamEnvironments(project: McProject) = withUpstream(project) - .mapNotNull { project.sourceSets[it]?.kotlinEnvironmentDeferred?.await() } -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/VersionNeutralTopDownAnalyzerFacadeForJVM.kt b/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/VersionNeutralTopDownAnalyzerFacadeForJVM.kt deleted file mode 100644 index 0ec86e615a..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/main/kotlin/modulecheck/parsing/kotlin/compiler/impl/VersionNeutralTopDownAnalyzerFacadeForJVM.kt +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.cli.jvm.compiler.TopDownAnalyzerFacadeForJVM -import org.jetbrains.kotlin.com.intellij.openapi.project.Project -import org.jetbrains.kotlin.com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.config.CompilerConfiguration -import org.jetbrains.kotlin.container.get -import org.jetbrains.kotlin.context.ModuleContext -import org.jetbrains.kotlin.descriptors.ModuleDescriptor -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.library.KotlinLibrary -import org.jetbrains.kotlin.load.java.JavaClassesTracker -import org.jetbrains.kotlin.load.kotlin.PackagePartProvider -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.resolve.BindingTrace -import org.jetbrains.kotlin.resolve.CompilerEnvironment -import org.jetbrains.kotlin.resolve.LazyTopDownAnalyzer -import org.jetbrains.kotlin.resolve.TargetEnvironment -import org.jetbrains.kotlin.resolve.TopDownAnalysisMode -import org.jetbrains.kotlin.resolve.jvm.extensions.AnalysisHandlerExtension -import org.jetbrains.kotlin.resolve.lazy.declarations.DeclarationProviderFactory -import org.jetbrains.kotlin.resolve.lazy.declarations.FileBasedDeclarationProviderFactory -import org.jetbrains.kotlin.storage.StorageManager - -/** - * This is a compatibility shim for invoking Kotlin 1.6.2x compiler analysis using the - * 1.6.10 classes. The `explicitCompilerEnvironment: TargetEnvironment = CompilerEnvironment` - * argument with default was added in 1.6.20, and causes a `NotSuchMethodError` - * exception if parsing a 1.6.2x project with 1.6.10 source. - */ -object VersionNeutralTopDownAnalyzerFacadeForJVM { - /** - * Performs the full analysis of this source set/configuration, - * returning the [AnalysisResult] so that we can use the - * [BindingContext][org.jetbrains.kotlin.resolve.BindingContext] for type resolution. - * - * Note that this process is eager, and can be very time-consuming - * for large projects. This function is called when the lazy - * [bindingContext][modulecheck.parsing.kotlin.compiler.KotlinEnvironment.bindingContextDeferred] - * is accessed. - */ - fun analyzeFilesWithJavaIntegration( - project: Project, - files: Collection, - trace: BindingTrace, - configuration: CompilerConfiguration, - packagePartProvider: (GlobalSearchScope) -> PackagePartProvider, - declarationProviderFactory: (StorageManager, Collection) -> DeclarationProviderFactory = - ::FileBasedDeclarationProviderFactory, - sourceModuleSearchScope: GlobalSearchScope = TopDownAnalyzerFacadeForJVM.newModuleSearchScope( - project, - files - ), - klibList: List = emptyList(), - explicitModuleDependencyList: List = emptyList(), - explicitModuleFriendsList: List = emptyList(), - explicitCompilerEnvironment: TargetEnvironment = CompilerEnvironment - ): AnalysisResult { - val container = TopDownAnalyzerFacadeForJVM.createContainer( - project, - files, - trace, - configuration, - packagePartProvider, - declarationProviderFactory, - explicitCompilerEnvironment, - sourceModuleSearchScope, - klibList, - explicitModuleDependencyList = explicitModuleDependencyList, - explicitModuleFriendsList = explicitModuleFriendsList - ) - - val module = container.get() - val moduleContext = container.get() - - val analysisHandlerExtensions = AnalysisHandlerExtension.getInstances(project) - - fun invokeExtensionsOnAnalysisComplete(): AnalysisResult? { - container.get().onCompletedAnalysis(module) - for (extension in analysisHandlerExtensions) { - val result = extension.analysisCompleted(project, module, trace, files) - if (result != null) return result - } - - return null - } - - for (extension in analysisHandlerExtensions) { - val result = extension.doAnalysis(project, module, moduleContext, files, trace, container) - if (result != null) { - invokeExtensionsOnAnalysisComplete()?.let { return it } - return result - } - } - - container.get() - .analyzeDeclarations(TopDownAnalysisMode.TopLevelDeclarations, files) - - invokeExtensionsOnAnalysisComplete()?.let { return it } - - return AnalysisResult.success(trace.bindingContext, module) - } -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/test/kotlin/modulecheck/parsing/kotlin/compiler/impl/PendingRequestSortingTest.kt b/modulecheck-parsing/kotlin-compiler/impl/src/test/kotlin/modulecheck/parsing/kotlin/compiler/impl/PendingRequestSortingTest.kt deleted file mode 100644 index 93f2a1c69f..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/test/kotlin/modulecheck/parsing/kotlin/compiler/impl/PendingRequestSortingTest.kt +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import io.kotest.assertions.asClue -import io.kotest.assertions.throwables.shouldNotThrow -import modulecheck.parsing.kotlin.compiler.HasAnalysisResult -import modulecheck.parsing.kotlin.compiler.impl.SafeAnalysisResultAccessImpl.PendingRequest -import modulecheck.testing.BaseTest -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.mapToSet -import org.jetbrains.kotlin.analyzer.AnalysisResult -import org.jetbrains.kotlin.descriptors.impl.ModuleDescriptorImpl -import org.jetbrains.kotlin.resolve.BindingContext -import org.junit.jupiter.api.Test -import kotlin.random.Random - -internal class PendingRequestSortingTest : BaseTest { - - @Test - fun `sorting does not violate general contract`() { - - repeat(1000) { - val subject = createPendingRequests(100) - - subject.pretty().asClue { - shouldNotThrow { - subject.sorted() - } - } - } - } - - fun createPendingRequests(size: Int): List { - - val seed = List(size) { - val name = it.toString(16) - .padStart(4, '0') - .lowercase() - PendingPending(name, mutableSetOf()) - } - - return seed.onEach { target -> - seed.asSequence() - .filterNot { other -> other == target } - .filterNot { other -> - other.deps.contains(target) || other.deps.any { it.deps.contains(target) } - } - .forEach { dep -> - if (Random.nextBoolean()) { - target.deps.addAll(dep.deps + dep) - } - } - } - .onEach { target -> - target.deps.forEach { dep -> - require(!dep.deps.contains(target)) { - """ - |target -- ${target.name} -- ${target.deps.map { it.name }} - |dep -- ${dep.name} -- ${dep.deps.map { it.name }} - """.trimMargin() - } - } - } - .map { it.toPendingRequest() } - } - - fun List.pretty() = joinToString("\n") { it.pretty() } - fun PendingRequest.pretty(): String { - return "${requester.name} - ${dependencies.map { it.name }})" - } - - data class PendingPending( - val name: String, - val deps: MutableSet = mutableSetOf() - ) { - - fun toPendingRequest() = PendingRequest( - requester = TestHasAnalysisResult(name), - dependencies = deps.mapToSet { TestHasAnalysisResult(it.name) } - ) - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is PendingPending) return false - - if (name != other.name) return false - - return true - } - - override fun hashCode(): Int { - return name.hashCode() - } - } - - private data class TestHasAnalysisResult( - val name: String - ) : HasAnalysisResult { - override val analysisResultDeferred: LazyDeferred = lazyDeferred { TODO() } - override val bindingContextDeferred: LazyDeferred = - lazyDeferred { BindingContext.EMPTY } - override val moduleDescriptorDeferred: LazyDeferred = - lazyDeferred { TODO() } - } - - private val HasAnalysisResult.name: String - get() = (this as TestHasAnalysisResult).name -} diff --git a/modulecheck-parsing/kotlin-compiler/impl/src/test/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironmentTest.kt b/modulecheck-parsing/kotlin-compiler/impl/src/test/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironmentTest.kt deleted file mode 100644 index e0345e8c81..0000000000 --- a/modulecheck-parsing/kotlin-compiler/impl/src/test/kotlin/modulecheck/parsing/kotlin/compiler/impl/RealKotlinEnvironmentTest.kt +++ /dev/null @@ -1,289 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.kotlin.compiler.impl - -import io.kotest.assertions.assertSoftly -import io.kotest.matchers.types.shouldBeTypeOf -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.internal.isKtFile -import modulecheck.parsing.psi.internal.childrenOfTypeBreadthFirst -import modulecheck.project.test.ProjectTest -import org.jetbrains.kotlin.incremental.isJavaFile -import org.jetbrains.kotlin.js.descriptorUtils.getKotlinTypeFqName -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.types.error.ErrorType -import org.jetbrains.kotlin.types.isNullable -import org.junit.jupiter.api.Test - -@Suppress("UnusedPrivateMember") -class RealKotlinEnvironmentTest : ProjectTest() { - - @Test - fun `resolution should work for sources from a dependency module`() = test { - - val lib1 = kotlinProject(":lib1") { - - addKotlinSource( - """ - package com.modulecheck.lib1 - - class Lib1Class(val name: String) - """, - fileName = "Lib1Class.kt" - ) - } - val subject = kotlinProject(":subject") { - addDependency(ConfigurationName.api, lib1) - - addKotlinSource( - """ - package com.modulecheck.subject - - import com.modulecheck.lib1.Lib1Class - - class SubjectClass { - val lib1 = Lib1Class("foo") - } - """ - ) - } - - val sourceSet = subject.sourceSets[SourceSetName.MAIN]!! - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() as RealKotlinEnvironment - val bindingContext = kotlinEnvironment.bindingContextDeferred.await() - - val ktFile = kotlinEnvironment.ktFile(sourceSet.jvmFiles.single()) - - val property = ktFile.childrenOfTypeBreadthFirst().single() - val propertyDescriptor = bindingContext[BindingContext.VARIABLE, property]!! - - val propertyType = propertyDescriptor.returnType!! - - assertSoftly { - propertyType.getKotlinTypeFqName(true) shouldBe "com.modulecheck.lib1.Lib1Class" - propertyType.isNullable() shouldBe false - } - } - - @Test - fun `resolution should work for sources from an upstream source set in the same module`() = test { - - val subject = kotlinProject(":subject") { - - addKotlinSource( - """ - package com.modulecheck.subject - - class DepClass - """ - ) - - addKotlinSource( - """ - package com.modulecheck.subject - - class SubjectClass { - val dep = DepClass() - } - """, - sourceSetName = SourceSetName.TEST - ) - } - - val sourceSet = subject.sourceSets[SourceSetName.TEST]!! - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() - val bindingContext = kotlinEnvironment.bindingContextDeferred.await() - - val ktFile = kotlinEnvironment.ktFile(sourceSet.jvmFiles.single()) - - val property = ktFile.childrenOfTypeBreadthFirst().first() - - val propertyDescriptor = bindingContext[BindingContext.VARIABLE, property]!! - - val propertyType = propertyDescriptor.returnType!! - - assertSoftly { - propertyType.getKotlinTypeFqName(true) shouldBe "com.modulecheck.subject.DepClass" - propertyType.isNullable() shouldBe false - } - } - - @Test - fun `resolution should work for java source from an upstream source set in the same module`() = - test { - - val subject = kotlinProject(":subject") { - - addJavaSource( - """ - package com.modulecheck.subject; - - class DepClass {} - """ - ) - - addKotlinSource( - """ - package com.modulecheck.subject - - class SubjectClass { - val dep = DepClass() - } - """, - sourceSetName = SourceSetName.TEST - ) - } - - val sourceSet = subject.sourceSets[SourceSetName.TEST]!! - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() - val bindingContext = kotlinEnvironment.bindingContextDeferred.await() - - val ktFile = kotlinEnvironment.ktFile(sourceSet.jvmFiles.single()) - - val property = ktFile.childrenOfTypeBreadthFirst().single() - val propertyDescriptor = bindingContext[BindingContext.VARIABLE, property]!! - - val propertyType = propertyDescriptor.returnType!! - - assertSoftly { - propertyType.getKotlinTypeFqName(true) shouldBe "com.modulecheck.subject.DepClass" - propertyType.isNullable() shouldBe false - } - } - - @Test - fun `resolution should work for java dependency source in the same source set`() = test { - - val subject = kotlinProject(":subject") { - - addJavaSource( - """ - package com.modulecheck.subject; - - class DepClass {} - """ - ) - - addKotlinSource( - """ - package com.modulecheck.subject - - class SubjectClass { - val dep = DepClass() - } - """ - ) - } - - val sourceSet = subject.sourceSets[SourceSetName.MAIN]!! - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() - val bindingContext = kotlinEnvironment.bindingContextDeferred.await() - - val ktFile = kotlinEnvironment.ktFile(sourceSet.jvmFiles.single { it.isKtFile() }) - - val property = ktFile.childrenOfTypeBreadthFirst().single() - val propertyDescriptor = bindingContext[BindingContext.VARIABLE, property]!! - - val propertyType = propertyDescriptor.returnType!! - - assertSoftly { - propertyType.getKotlinTypeFqName(true) shouldBe "com.modulecheck.subject.DepClass" - propertyType.isNullable() shouldBe false - } - } - - @Test - fun `resolution should work for java source in the same source set`() = test { - - val subject = kotlinProject(":subject") { - - addKotlinSource( - """ - package com.modulecheck.subject - - @Deprecated("no") - class DepClass - """ - ) - - addJavaSource( - """ - package com.modulecheck.subject; - - class SubjectClass { - DepClass dep = new DepClass(); - } - """ - ) - } - - val sourceSet = subject.sourceSets[SourceSetName.MAIN]!! - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() - - val javaFile = kotlinEnvironment.javaPsiFile(sourceSet.jvmFiles.single { it.isJavaFile() }) - - val property = javaFile.classes.single().fields.single() - - val propertyType = property.type - - // type resolution for Java Psi files assumes that analysis has already been run - kotlinEnvironment.analysisResultDeferred.await() - - propertyType.canonicalText shouldBe "com.modulecheck.subject.DepClass" - } - - @Test - fun `resolution does not work for references which arent real`() = test { - - val subject = kotlinProject(":subject") { - - addKotlinSource( - """ - package com.modulecheck.subject - - class SubjectClass { - - val property : com.fake.Fake? = null - } - """ - ) - } - - val sourceSet = subject.sourceSets[SourceSetName.MAIN]!! - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() - val bindingContext = kotlinEnvironment.bindingContextDeferred.await() - - val ktFile = kotlinEnvironment.ktFile(sourceSet.jvmFiles.single()) - - val property = ktFile.childrenOfTypeBreadthFirst().single() - val propertyDescriptor = bindingContext[BindingContext.VARIABLE, property]!! - - val propertyType = propertyDescriptor.returnType!! - - assertSoftly { - propertyType.shouldBeTypeOf() - propertyType.getKotlinTypeFqName(false) shouldBe "" - propertyType.debugMessage shouldBe "Unresolved type for com.fake.Fake" - propertyType.isNullable() shouldBe true - - propertyType.arguments.single() - .type - .getKotlinTypeFqName(false) shouldBe String::class.qualifiedName - } - } -} diff --git a/modulecheck-parsing/psi/api/psi.api b/modulecheck-parsing/psi/api/psi.api deleted file mode 100644 index 154580980d..0000000000 --- a/modulecheck-parsing/psi/api/psi.api +++ /dev/null @@ -1,151 +0,0 @@ -public final class modulecheck/parsing/psi/AndroidPsiKt { - public static final fun androidBlocks (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Ljava/util/List; - public static final fun buildFeaturesBlocks (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Ljava/util/List; - public static final fun inBuildscript (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Z -} - -public final class modulecheck/parsing/psi/ConcatenatingParsingInterceptor : modulecheck/parsing/source/internal/ParsingInterceptor { - public synthetic fun (Lmodulecheck/parsing/psi/internal/DeclarationsProvider;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun intercept (Lmodulecheck/parsing/source/internal/ParsingInterceptor$Chain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/psi/ExternalDependencyDeclarationVisitor { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun find (Lorg/jetbrains/kotlin/psi/KtCallExpression;)Z -} - -public final class modulecheck/parsing/psi/FqNames { - public static final field INSTANCE Lmodulecheck/parsing/psi/FqNames; - public final fun getInject ()Lorg/jetbrains/kotlin/name/FqName; - public final fun getJvmField ()Lorg/jetbrains/kotlin/name/FqName; - public final fun getJvmStatic ()Lorg/jetbrains/kotlin/name/FqName; -} - -public final class modulecheck/parsing/psi/KotlinAndroidGradleParser : modulecheck/parsing/gradle/dsl/AndroidGradleParser { - public fun (Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;)V - public fun parse (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/psi/KotlinDependenciesBlock : modulecheck/parsing/gradle/dsl/internal/AbstractDependenciesBlock { - public fun getFullText ()Ljava/lang/String; - public fun getLambdaContent ()Ljava/lang/String; -} - -public final class modulecheck/parsing/psi/KotlinDependenciesBlockParser { - public fun (Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;Lmodulecheck/model/dependency/ProjectDependency$Factory;)V - public final fun parse (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/psi/KotlinDependenciesBlockParserKt { - public static final fun blockExpressionRecursiveVisitor (Lkotlin/jvm/functions/Function2;)Lorg/jetbrains/kotlin/psi/KtTreeVisitorVoid; - public static final fun literalStringTemplateRecursiveVisitor (Lkotlin/jvm/functions/Function2;)Lorg/jetbrains/kotlin/psi/KtTreeVisitorVoid; -} - -public final class modulecheck/parsing/psi/KotlinPluginsBlock : modulecheck/parsing/gradle/dsl/internal/AbstractPluginsBlock { - public fun (Lmodulecheck/reporting/logging/McLogger;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;)V - public fun getFullText ()Ljava/lang/String; - public fun getLambdaContent ()Ljava/lang/String; -} - -public final class modulecheck/parsing/psi/KotlinPluginsBlockParser { - public fun (Lmodulecheck/reporting/logging/McLogger;)V - public final fun parse (Lorg/jetbrains/kotlin/psi/KtFile;)Lmodulecheck/parsing/psi/KotlinPluginsBlock; -} - -public final class modulecheck/parsing/psi/KotlinStdLibNamesKt { - public static final fun kotlinStdLibNameOrNull (Ljava/lang/String;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static final fun kotlinStdLibNameOrNull (Lmodulecheck/parsing/source/ReferenceName;)Lmodulecheck/parsing/source/QualifiedDeclaredName; -} - -public final class modulecheck/parsing/psi/PsiElementWithSurroundingText { - public fun (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)V - public final fun component1 ()Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement; - public final fun copy (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Lmodulecheck/parsing/psi/PsiElementWithSurroundingText; - public static synthetic fun copy$default (Lmodulecheck/parsing/psi/PsiElementWithSurroundingText;Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;ILjava/lang/Object;)Lmodulecheck/parsing/psi/PsiElementWithSurroundingText; - public fun equals (Ljava/lang/Object;)Z - public final fun getPsiElement ()Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement; - public final fun getStatementText ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/psi/RealKotlinFile : modulecheck/parsing/source/KotlinFile { - public fun (Ljava/io/File;Lorg/jetbrains/kotlin/psi/KtFile;Lmodulecheck/parsing/psi/internal/PsiElementResolver;Lmodulecheck/parsing/source/internal/NameParser;)V - public fun getAnvilScopeArguments (Ljava/util/List;Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getApiReferences ()Lmodulecheck/utils/lazy/LazyDeferred; - public final fun getConstructorInjectedParams ()Lmodulecheck/utils/lazy/LazyDeferred; - public fun getDeclarations ()Ljava/util/Set; - public fun getFile ()Ljava/io/File; - public fun getImportsLazy ()Lkotlin/Lazy; - public fun getName ()Ljava/lang/String; - public fun getPackageName ()Lmodulecheck/parsing/source/PackageName; - public synthetic fun getPsi ()Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile; - public fun getPsi ()Lorg/jetbrains/kotlin/psi/KtFile; - public fun getReferences ()Lmodulecheck/utils/lazy/LazySet; -} - -public final class modulecheck/parsing/psi/ReferenceVisitor : org/jetbrains/kotlin/psi/KtTreeVisitorVoid { - public fun ()V - public fun visitCallExpression (Lorg/jetbrains/kotlin/psi/KtCallExpression;)V - public fun visitCallableReferenceExpression (Lorg/jetbrains/kotlin/psi/KtCallableReferenceExpression;)V - public fun visitClassLiteralExpression (Lorg/jetbrains/kotlin/psi/KtClassLiteralExpression;)V - public fun visitClassOrObject (Lorg/jetbrains/kotlin/psi/KtClassOrObject;)V - public fun visitNamedFunction (Lorg/jetbrains/kotlin/psi/KtNamedFunction;)V - public fun visitPrimaryConstructor (Lorg/jetbrains/kotlin/psi/KtPrimaryConstructor;)V - public fun visitProperty (Lorg/jetbrains/kotlin/psi/KtProperty;)V - public fun visitQualifiedExpression (Lorg/jetbrains/kotlin/psi/KtQualifiedExpression;)V - public fun visitReferenceExpression (Lorg/jetbrains/kotlin/psi/KtReferenceExpression;)V - public fun visitSecondaryConstructor (Lorg/jetbrains/kotlin/psi/KtSecondaryConstructor;)V - public fun visitTypeReference (Lorg/jetbrains/kotlin/psi/KtTypeReference;)V -} - -public abstract interface class modulecheck/parsing/psi/internal/DeclarationsProvider { - public abstract fun get-WsCknJc (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getWithUpstream-WsCknJc (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun getWithUpstream-WsCknJc$default (Lmodulecheck/parsing/psi/internal/DeclarationsProvider;Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/psi/internal/KtCallableDeclarationKt { - public static final fun isJvmField (Lorg/jetbrains/kotlin/psi/KtProperty;)Z - public static final fun isJvmStatic (Lorg/jetbrains/kotlin/psi/KtCallableDeclaration;)Z - public static final fun jvmNameOrNull (Lorg/jetbrains/kotlin/psi/KtFunction;)Ljava/lang/String; - public static final fun jvmNameOrNull (Lorg/jetbrains/kotlin/psi/KtPropertyAccessor;)Ljava/lang/String; -} - -public final class modulecheck/parsing/psi/internal/PsiElementKt { - public static final fun asReferenceName (Lorg/jetbrains/kotlin/types/KotlinType;)Lmodulecheck/parsing/source/ReferenceName; - public static final fun callSiteName (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Ljava/lang/String; - public static final fun canResolveDeclaredName-Hc0XbgE (Lmodulecheck/project/McProject;Lmodulecheck/parsing/source/QualifiedDeclaredName;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun canResolveReferenceName-Hc0XbgE (Lmodulecheck/project/McProject;Lmodulecheck/parsing/source/ReferenceName;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun childrenBreadthFirst (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Lkotlin/sequences/Sequence; - public static final fun childrenBreadthFirst (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; - public static final fun childrenDepthFirst (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Lkotlin/sequences/Sequence; - public static final fun childrenDepthFirst (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; - public static final fun declaredNameOrNull-Hc0XbgE (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;Lmodulecheck/project/McProject;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun file (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Ljava/io/File; - public static final fun fqNameSafe (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;)Lorg/jetbrains/kotlin/name/FqName; - public static final fun hasAnnotation (Lorg/jetbrains/kotlin/psi/KtAnnotated;Lorg/jetbrains/kotlin/name/FqName;)Z - public static final fun identifierName (Lorg/jetbrains/kotlin/psi/KtNamedDeclaration;)Ljava/lang/String; - public static final fun isCompanionObject (Lorg/jetbrains/kotlin/psi/KtDeclaration;)Z - public static final fun isInCompanionObject (Lorg/jetbrains/kotlin/psi/KtDeclaration;)Z - public static final fun isInObject (Lorg/jetbrains/kotlin/psi/KtDeclaration;)Z - public static final fun isInObjectOrCompanionObject (Lorg/jetbrains/kotlin/psi/KtDeclaration;)Z - public static final fun isQualifiedPropertyOrCallExpression (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;)Z - public static final fun nameSafe (Lorg/jetbrains/kotlin/psi/KtBlockExpression;)Ljava/lang/String; - public static final fun nameSafe (Lorg/jetbrains/kotlin/psi/KtCallExpression;)Ljava/lang/String; - public static final fun requireReferenceName (Lorg/jetbrains/kotlin/types/KotlinType;)Lmodulecheck/parsing/source/ReferenceName; - public static final fun resolveType (Lorg/jetbrains/kotlin/psi/KtProperty;Lorg/jetbrains/kotlin/resolve/BindingContext;)Lorg/jetbrains/kotlin/descriptors/VariableDescriptor; - public static final fun returnType (Lorg/jetbrains/kotlin/psi/KtPropertyDelegate;Lorg/jetbrains/kotlin/resolve/BindingContext;)Lorg/jetbrains/kotlin/types/KotlinType; -} - -public final class modulecheck/parsing/psi/internal/PsiElementResolver { - public synthetic fun (Lmodulecheck/project/McProject;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun declaredNameOrNull (Lorg/jetbrains/kotlin/com/intellij/psi/PsiElement;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/psi/internal/UtilKt { - public static final fun getByNameOrIndex (Lorg/jetbrains/kotlin/psi/KtValueArgumentList;ILjava/lang/String;)Lorg/jetbrains/kotlin/psi/KtValueArgument; - public static final fun requireSimpleName (Lorg/jetbrains/kotlin/psi/KtElement;)Ljava/lang/String; -} - diff --git a/modulecheck-parsing/psi/build.gradle.kts b/modulecheck-parsing/psi/build.gradle.kts deleted file mode 100644 index 09596912a0..0000000000 --- a/modulecheck-parsing/psi/build.gradle.kts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-psi" - ) -} - -dependencies { - - api(libs.javax.inject) - api(libs.kotlin.compiler) - - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:internal")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-reporting:logging:api")) - api(project(path = ":modulecheck-utils:lazy")) - api(project(path = ":modulecheck-utils:traversal")) - - compileOnly(libs.kotlin.reflect) - - implementation(project(path = ":modulecheck-model:dependency:api")) - implementation(project(path = ":modulecheck-parsing:gradle:dsl:precompiled")) - implementation(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - implementation(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotest.runner.junit5.jvm) - - testImplementation(project(path = ":modulecheck-api")) - testImplementation(project(path = ":modulecheck-internal-testing")) - testImplementation(project(path = ":modulecheck-parsing:gradle:dsl:testing")) - testImplementation(project(path = ":modulecheck-parsing:psi")) - testImplementation(project(path = ":modulecheck-parsing:source:testing")) - testImplementation(project(path = ":modulecheck-project:testing")) -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ConcatenatingParsingInterceptor.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ConcatenatingParsingInterceptor.kt deleted file mode 100644 index 2aae6090f4..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ConcatenatingParsingInterceptor.kt +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import kotlinx.coroutines.flow.firstOrNull -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.psi.internal.DeclarationsProvider -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.internal.NameParser -import modulecheck.parsing.source.internal.ParsingInterceptor -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.mapToSet - -class ConcatenatingParsingInterceptor( - private val declarationsProvider: DeclarationsProvider, - private val sourceSetName: SourceSetName -) : ParsingInterceptor { - - override suspend fun intercept(chain: ParsingInterceptor.Chain): NameParser.NameParserPacket { - - val packet = chain.packet - - val resolved = packet.resolved - .plus(packet.imports.mapToSet { ReferenceName(it, packet.referenceLanguage) }) - .toMutableSet() - val resolvedApiReferenceNames = mutableSetOf() - - val declarationsInPackage = lazyDeferred { - declarationsProvider.getWithUpstream( - sourceSetName = sourceSetName, - packageNameOrNull = packet.packageName - ) - } - - val stillUnresolved = packet.unresolved - .filter { toResolve -> - - val referenceStart = toResolve.referenceFirstName() - - val concatOrNull = packet.imports - .firstNotNullOfOrNull { import -> - - val matched = import.referenceLastName() == referenceStart - when { - matched && referenceStart == toResolve -> import - matched -> { - val withoutStart = toResolve.removePrefix(referenceStart) - "$import$withoutStart" - } - - else -> null - } - } - ?: toResolve.inlineAliasOrNull(packet.aliasedImports) - ?: packet.stdLibNameOrNull(toResolve)?.name - ?: declarationsInPackage.await() - .firstOrNull { it.endsWithSimpleName(toResolve) } - ?.name - - if (concatOrNull != null) { - - val asReference = ReferenceName(concatOrNull, packet.referenceLanguage) - - if (packet.mustBeApi.contains(toResolve)) { - resolvedApiReferenceNames.add(asReference) - } - - resolved.add(asReference) - } - - concatOrNull == null - } - - val newPacket = packet.copy( - resolved = resolved, - unresolved = stillUnresolved.toSet(), - apiReferenceNames = resolvedApiReferenceNames - ) - - return chain.proceed(newPacket) - } - - private fun String.inlineAliasOrNull(aliasedImports: Map): String? { - - val toResolve = this - // in `Lib1R.string.app_name`, firstName is `Lib1R` - val firstName = toResolve.referenceFirstName() - - return aliasedImports[firstName]?.let { alias -> - val newPrefix = alias.name - val newSuffix = toResolve.removePrefix(firstName) - "$newPrefix$newSuffix" - } - } - - private fun String.referenceFirstName(): String = split('.').first() - private fun String.referenceLastName(): String = split('.').last() -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ExternalDependencyDeclarationVisitor.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ExternalDependencyDeclarationVisitor.kt deleted file mode 100644 index 295d6c7e52..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ExternalDependencyDeclarationVisitor.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry -import org.jetbrains.kotlin.psi.KtStringTemplateExpression -import org.jetbrains.kotlin.psi.callExpressionVisitor -import org.jetbrains.kotlin.psi.psiUtil.getChildOfType -import org.jetbrains.kotlin.psi.psiUtil.referenceExpression - -class ExternalDependencyDeclarationVisitor( - private val configuration: String, - /** - * In "com.google.dagger:dagger:2.32", this would be "com.google.dagger" - * - * @since 0.12.0 - */ - group: String? = null, - /** - * In "com.google.dagger:dagger:2.32", this would be "dagger" - * - * @since 0.12.0 - */ - name: String? = null, - /** - * In "com.google.dagger:dagger:2.32", this would be "2.32" - * - * @since 0.12.0 - */ - version: String? = null -) { - - private val projectMatcher = - """${group.orWildcard()}:${name.orWildcard()}:${version.orWildcard()}""" - .replace(".", "\\.") - .toRegex() - - private fun String?.orWildcard() = this ?: "*" - - /** @return true if the declaration is contained within this call expression */ - @Suppress("MaxLineLength") - fun find(expression: KtCallExpression): Boolean { - var found = false - - val configCallExpressionVisitor = callExpressionVisitor { innerExpression -> - - val innerReference = innerExpression - .referenceExpression() - .takeIf { it?.text == configuration } - - if (innerReference != null) { - innerExpression // implementation(dependencyNotation = "com.google.dagger:dagger:2.32") - .valueArguments // [dependencyNotation = "com.google.dagger:dagger:2.32"] - .firstOrNull() // dependencyNotation = "com.google.dagger:dagger:2.32" - ?.getChildOfType() // "com.google.dagger:dagger:2.32" - ?.getChildOfType() // com.google.dagger:dagger:2.32 - ?.text // com.google.dagger:dagger:2.32 - ?.let { groupName -> - - if (groupName.matches(projectMatcher)) { - found = true - } - } - } - } - - configCallExpressionVisitor.visitCallExpression(expression) - - return found - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/FqNames.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/FqNames.kt deleted file mode 100644 index 18ec3fd2dd..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/FqNames.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import org.jetbrains.kotlin.name.FqName - -object FqNames { - val inject: FqName = FqName("javax.inject.Inject") - val jvmField: FqName = FqName("kotlin.jvm.JvmField") - val jvmStatic: FqName = FqName("kotlin.jvm.JvmStatic") -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinAndroidGradleParser.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinAndroidGradleParser.kt deleted file mode 100644 index 82280a3a52..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinAndroidGradleParser.kt +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.parsing.gradle.dsl.AndroidGradleParser -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.AndroidBlock -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.BuildFeaturesBlock -import modulecheck.parsing.gradle.dsl.Assignment -import modulecheck.parsing.kotlin.compiler.NoContextPsiFileFactory -import modulecheck.parsing.psi.internal.childrenOfTypeDepthFirst -import org.jetbrains.kotlin.com.intellij.psi.PsiElement -import org.jetbrains.kotlin.psi.KtAnnotatedExpression -import org.jetbrains.kotlin.psi.KtBinaryExpression -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.psi.KtConstantExpression -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtNameReferenceExpression -import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType -import org.jetbrains.kotlin.psi.psiUtil.getChildOfType -import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType -import org.jetbrains.kotlin.psi.psiUtil.parents -import java.io.File -import javax.inject.Inject - -class KotlinAndroidGradleParser @Inject constructor( - private val psiFileFactory: NoContextPsiFileFactory -) : AndroidGradleParser { - - override suspend fun parse(buildFile: File): AndroidGradleSettings { - - val file = psiFileFactory.createKotlin(buildFile) - - val androidQualifiedSettings = file.childrenOfTypeDepthFirst() - .filter { it.findDescendantOfType()?.text == "android" } - .mapNotNull { it.toAssignmentOrNull(it.text, it.suppressedNames()) } - - val androidQualified = file.childrenOfTypeDepthFirst() - .filter { it.getChildOfType()?.text == "android" } - - val androidBlocksPsi = file.androidBlocks() - - val androidBlocks = androidBlocksPsi - .mapNotNull { androidBlock -> - - val blockSuppressed = androidBlock.suppressedNames() - - val fullText = androidBlock.text - - val block = androidBlock.childrenOfTypeDepthFirst() - .firstOrNull() - - val content = block?.text ?: return@mapNotNull null - - val settings = androidBlock.mapAssignments(fullText, blockSuppressed) - - AndroidBlock(fullText, content, settings, blockSuppressed) - } - - val buildFeaturesBlocks = (androidBlocksPsi + androidQualified) - .flatMap { android: KtExpression -> - - android.buildFeaturesBlocks() - .mapNotNull { buildFeaturesBlock -> - - val blockSuppressed = buildFeaturesBlock.suppressedNames() - - val fullText = android.text - - val contentBlock = buildFeaturesBlock.childrenOfTypeDepthFirst() - .firstOrNull() - ?: return@mapNotNull null - - val content = contentBlock.text - - val allSuppressed = buildFeaturesBlock.parents.filterIsInstance() - .flatMap { it.suppressedNames() } - .toList() - - val settings = contentBlock.mapAssignments(fullText, allSuppressed) - - BuildFeaturesBlock(fullText, content, settings, blockSuppressed) - } - } - - val allAssignments = (androidBlocks + buildFeaturesBlocks) - .flatMap { it.settings } - .plus(androidQualifiedSettings) - .distinct() - - return AndroidGradleSettings( - assignments = allAssignments, - androidBlocks = androidBlocks, - buildFeaturesBlocks = buildFeaturesBlocks - ) - } - - private fun PsiElement.mapAssignments( - fullText: String, - blockSuppressed: List - ): List { - return childrenOfTypeDepthFirst() - .mapNotNull { it.toAssignmentOrNull(fullText, blockSuppressed) } - .toList() - } - - private fun KtBinaryExpression.toAssignmentOrNull( - fullText: String, - blockSuppressed: List - ): Assignment? { - - val suppressed = blockSuppressed.plus(suppressedNames()).distinct() - - val propertyFullName = getChildOfType()?.text - ?: getChildOfType() - ?.getChildrenOfType() - ?.lastOrNull() - ?.text - ?: return null - val value = getChildOfType()?.text ?: return null - - return Assignment( - fullText = fullText, - propertyFullName = propertyFullName, - value = value, - declarationText = text, - suppressed = suppressed - ) - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlock.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlock.kt deleted file mode 100644 index 715856051a..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlock.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.model.dependency.ProjectDependency -import modulecheck.parsing.gradle.dsl.DependencyDeclaration.ConfigurationNameTransform -import modulecheck.parsing.gradle.dsl.internal.AbstractDependenciesBlock -import modulecheck.reporting.logging.McLogger - -class KotlinDependenciesBlock internal constructor( - logger: McLogger, - override val fullText: String, - override val lambdaContent: String, - blockSuppressed: List, - configurationNameTransform: ConfigurationNameTransform, - projectDependency: ProjectDependency.Factory -) : AbstractDependenciesBlock( - logger = logger, - blockSuppressed = blockSuppressed, - configurationNameTransform = configurationNameTransform, - projectDependency = projectDependency -) { - - override fun originalLineMatchesParsed(originalLine: String, parsedString: String): Boolean { - return originalLine.contains(parsedString) - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlockParser.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlockParser.kt deleted file mode 100644 index 44f35e99cd..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlockParser.kt +++ /dev/null @@ -1,294 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.asConfigurationName -import modulecheck.parsing.gradle.dsl.InvokesConfigurationNames -import modulecheck.parsing.gradle.dsl.ProjectAccessor -import modulecheck.parsing.gradle.dsl.buildFileInvocationText -import modulecheck.parsing.kotlin.compiler.NoContextPsiFileFactory -import modulecheck.parsing.psi.internal.childrenOfTypeBreadthFirst -import modulecheck.parsing.psi.internal.nameSafe -import modulecheck.reporting.logging.McLogger -import modulecheck.utils.requireNotNull -import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace -import org.jetbrains.kotlin.psi.KtAnnotatedExpression -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.psi.KtExpression -import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry -import org.jetbrains.kotlin.psi.KtStringTemplateExpression -import org.jetbrains.kotlin.psi.KtTreeVisitorVoid -import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType -import org.jetbrains.kotlin.psi.psiUtil.getChildOfType -import javax.inject.Inject - -class KotlinDependenciesBlockParser @Inject constructor( - private val logger: McLogger, - private val psiFileFactory: NoContextPsiFileFactory, - private val projectDependency: ProjectDependency.Factory -) { - - /** @return all `dependencies` blocks for the project modeled by [invokesConfigurationNames] */ - suspend fun parse( - invokesConfigurationNames: InvokesConfigurationNames - ): List { - - val file = psiFileFactory.createKotlin(invokesConfigurationNames.buildFile) - - return file.childrenOfTypeBreadthFirst() - .filter { it.nameSafe() == "dependencies" } - .filterNot { it.inBuildscript() } - .mapNotNull { fullBlock -> - - val blockSuppressed = (fullBlock.parent as? KtAnnotatedExpression) - ?.suppressedNames() - .orEmpty() - - val fullText = fullBlock.text - - val contentBlock = fullBlock.findDescendantOfType() - ?: return@mapNotNull null - - val contentString = contentBlock.text - - val blockWhiteSpace = (contentBlock.prevSibling as? PsiWhiteSpace)?.text - ?.trimStart('\n', '\r') - .orEmpty() - - val block = KotlinDependenciesBlock( - logger = logger, - fullText = fullText, - lambdaContent = blockWhiteSpace + contentString, - blockSuppressed = blockSuppressed, - configurationNameTransform = { it.buildFileInvocationText(invokesConfigurationNames) }, - projectDependency = projectDependency - ) - - contentBlock.children - .forEach { element -> - - when (element) { - is KtAnnotatedExpression -> { - val suppressed = element.suppressedNames() - - element.getChildOfType()?.parseStatements(block, suppressed) - } - - is KtCallExpression -> { - element.parseStatements(block, emptyList()) - } - } - } - - block - }.toList() - } -} - -private fun KtCallExpression.parseStatements( - block: KotlinDependenciesBlock, - suppressed: List -) { - val configName = calleeExpression.requireNotNull() - .text - .replace("\"", "") - - val moduleNamePair = getStringModuleNameOrNull() - ?: getTypeSafeModuleNameOrNull() - - if (moduleNamePair != null) { - - val (projectAccessor, moduleRef) = moduleNamePair - val projectPath = ProjectPath.from(moduleRef) - val accessor = ProjectAccessor.from(projectAccessor, projectPath) - block.addModuleStatement( - configName = configName.asConfigurationName(), - parsedString = text, - projectPath = projectPath, - projectAccessor = accessor, - suppressed = suppressed - ) - return - } - - val mavenCoordinates = getMavenCoordinatesOrNull() - - if (mavenCoordinates != null) { - block.addNonModuleStatement( - configName = configName.asConfigurationName(), - parsedString = text, - coordinates = mavenCoordinates, - suppressed = suppressed - ) - return - } - - val testFixturesModuleNamePair = getStringTestFixturesModuleNameOrNull() - ?: getTypeSafeTestFixturesModuleNameOrNull() - - if (testFixturesModuleNamePair != null) { - - val (projectAccessor, moduleRef) = testFixturesModuleNamePair - - val projectPath = ProjectPath.from(moduleRef) - val accessor = ProjectAccessor.from(projectAccessor, projectPath) - - block.addModuleStatement( - configName = configName.asConfigurationName(), - parsedString = text, - projectPath = projectPath, - projectAccessor = accessor, - suppressed = suppressed - ) - return - } - - block.addUnknownStatement( - configName = configName.asConfigurationName(), - parsedString = text, - argument = getUnknownArgumentOrNull().orEmpty(), - suppressed = suppressed - ) -} - -internal fun KtCallExpression.getStringModuleNameOrNull(): Pair? { - return this // implementation(project(path = ":foo:bar")) - .valueArguments // [project(path = ":foo:bar")] - .firstOrNull() // project(path = ":foo:bar") - ?.getChildOfType() // project(path = ":foo:bar") - ?.let { projectAccessorCallExpression -> - - val projectAccessor = projectAccessorCallExpression.text - - projectAccessorCallExpression - .valueArguments // [path = ":foo:bar"] - .firstOrNull() // path = ":foo:bar" - ?.getChildOfType() // ":foo:bar" - ?.getChildOfType() // :foo:bar - ?.text - ?.let { moduleRef -> projectAccessor to moduleRef } - } -} - -internal fun KtCallExpression.getTypeSafeModuleNameOrNull(): Pair? { - return this // implementation(projects.foo.bar) - .valueArguments // [projects.foo.bar] - .firstOrNull() // projects.foo.bar - ?.getChildOfType() // projects.foo.bar - ?.let { projectAccessorCallExpression -> - - val projectAccessor = projectAccessorCallExpression.text - - projectAccessorCallExpression.text - ?.takeIf { it.startsWith("projects.") } - ?.removePrefix("projects.") - ?.let { moduleRef -> projectAccessor to moduleRef } - } -} - -internal fun KtCallExpression.getStringTestFixturesModuleNameOrNull(): Pair? { - return this // implementation(testFixtures(project(path = ":foo:bar"))) - .valueArguments // [testFixtures(project(path = ":foo:bar"))] - .firstOrNull() // testFixtures(project(path = ":foo:bar")) - ?.getChildOfType() // testFixtures(project(path = ":foo:bar")) - ?.valueArguments // [project(path = ":foo:bar")] - ?.firstOrNull() // project(path = ":foo:bar") - ?.getChildOfType() // project(path = ":foo:bar") - ?.let { projectAccessorCallExpression -> - - val projectAccessor = projectAccessorCallExpression.text - - projectAccessorCallExpression - .valueArguments // [path = ":foo:bar"] - .firstOrNull() // path = ":foo:bar" - ?.getChildOfType() // ":foo:bar" - ?.getChildOfType() // :foo:bar - ?.text - ?.let { moduleRef -> projectAccessor to moduleRef } - } -} - -internal fun KtCallExpression.getTypeSafeTestFixturesModuleNameOrNull(): Pair? { - return this // implementation(testFixtures(projects.foo.bar)) - .valueArguments // [testFixtures(projects.foo.bar)] - .firstOrNull() // testFixtures(projects.foo.bar) - ?.getChildOfType() // testFixtures(projects.foo.bar) - ?.valueArguments // [projects.foo.bar] - ?.firstOrNull() // projects.foo.bar - ?.getChildOfType() // projects.foo.bar - ?.let { projectAccessorCallExpression -> - - val projectAccessor = projectAccessorCallExpression.text - - projectAccessorCallExpression - .text - ?.takeIf { it.startsWith("projects.") } - ?.removePrefix("projects.") - ?.let { moduleRef -> projectAccessor to moduleRef } - } -} - -internal fun KtCallExpression.getMavenCoordinatesOrNull(): MavenCoordinates? { - return this // implementation(dependencyNotation = "com.google.dagger:dagger:2.32") - .valueArguments // [dependencyNotation = "com.google.dagger:dagger:2.32"] - .firstOrNull() // dependencyNotation = "com.google.dagger:dagger:2.32" - ?.getChildOfType() // "com.google.dagger:dagger:2.32" - ?.getChildOfType() // com.google.dagger:dagger:2.32 - ?.text // com.google.dagger:dagger:2.32 - ?.let { MavenCoordinates.parseOrNull(it) } -} - -internal fun KtCallExpression.getUnknownArgumentOrNull(): String? { - return this // implementation(libs.ktlint) - .valueArguments // [libs.ktlint] - .firstOrNull() // libs.ktlint - ?.text // libs.ktlint -} - -inline fun blockExpressionRecursiveVisitor( - crossinline block: KtTreeVisitorVoid.(expression: KtBlockExpression) -> Unit -): KtTreeVisitorVoid = object : KtTreeVisitorVoid() { - override fun visitBlockExpression(expression: KtBlockExpression) { - block(expression) - } -} - -inline fun literalStringTemplateRecursiveVisitor( - crossinline block: KtTreeVisitorVoid.(entry: KtLiteralStringTemplateEntry) -> Unit -): KtTreeVisitorVoid = object : KtTreeVisitorVoid() { - override fun visitLiteralStringTemplateEntry(entry: KtLiteralStringTemplateEntry) { - super.visitLiteralStringTemplateEntry(entry) - block(entry) - } -} - -internal fun KtExpression.suppressedNames(): List = (parent as? KtAnnotatedExpression) - ?.suppressedNames() - .orEmpty() - -internal fun KtAnnotatedExpression.suppressedNames(): List = annotationEntries - .filter { it.typeReference?.text == "Suppress" || it.typeReference?.text == "SuppressWarnings" } - .flatMap { it.valueArgumentList?.arguments.orEmpty() } - .mapNotNull { - it.getChildOfType() // "Unused" - ?.getChildOfType() // Unused - ?.text - } diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinPluginsBlock.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinPluginsBlock.kt deleted file mode 100644 index 1d91d27667..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinPluginsBlock.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.parsing.gradle.dsl.internal.AbstractPluginsBlock -import modulecheck.reporting.logging.McLogger - -class KotlinPluginsBlock( - logger: McLogger, - override val fullText: String, - override val lambdaContent: String, - blockSuppressed: List -) : AbstractPluginsBlock( - logger = logger, - blockSuppressed = blockSuppressed -) { - - override fun findOriginalStringIndex(parsedString: String): Int = originalLines - .indexOfFirst { originalLine -> - - originalLine.trimStart().contains(parsedString) - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinPluginsBlockParser.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinPluginsBlockParser.kt deleted file mode 100644 index b2a79679f2..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/KotlinPluginsBlockParser.kt +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.parsing.psi.internal.childrenOfTypeBreadthFirst -import modulecheck.parsing.psi.internal.nameSafe -import modulecheck.reporting.logging.McLogger -import org.jetbrains.kotlin.com.intellij.psi.PsiWhiteSpace -import org.jetbrains.kotlin.psi.KtAnnotatedExpression -import org.jetbrains.kotlin.psi.KtBinaryExpression -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtNameReferenceExpression -import org.jetbrains.kotlin.psi.psiUtil.findDescendantOfType -import org.jetbrains.kotlin.psi.psiUtil.getChildOfType -import javax.inject.Inject - -class KotlinPluginsBlockParser @Inject constructor( - private val logger: McLogger -) { - - /** @return all `plugins` blocks for the build file */ - fun parse(file: KtFile): KotlinPluginsBlock? { - - var block: KotlinPluginsBlock? = null - - file.childrenOfTypeBreadthFirst() - .firstOrNull { it.nameSafe() == "plugins" } - ?.let { fullBlock -> - - val blockSuppressed = (fullBlock.parent as? KtAnnotatedExpression) - ?.suppressedNames() - .orEmpty() - - val fullText = fullBlock.text - - val contentBlock = fullBlock.findDescendantOfType() - ?: return@let null - - val contentString = contentBlock.text - - val blockWhiteSpace = (contentBlock.prevSibling as? PsiWhiteSpace)?.text - ?.trimStart('\n', '\r') - .orEmpty() - - val pluginsBlock = KotlinPluginsBlock( - logger = logger, - fullText = fullText, - lambdaContent = blockWhiteSpace + contentString, - blockSuppressed = blockSuppressed - ) - - contentBlock.children - .forEach { element -> - - when (element) { - is KtAnnotatedExpression -> { - val suppressed = element.suppressedNames() - - val parsedString = element.getChildOfType() - ?.text - ?: element.getChildOfType()?.text - ?: element.text - - pluginsBlock.addStatement( - parsedString = parsedString, - suppressed = suppressed + blockSuppressed - ) - } - - is KtBinaryExpression, - is KtCallExpression, - is KtNameReferenceExpression -> { - - pluginsBlock.addStatement( - parsedString = element.text, - suppressed = blockSuppressed - ) - } - } - } - - block = pluginsBlock - } - - return block - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/PsiElementWithSurroundingText.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/PsiElementWithSurroundingText.kt deleted file mode 100644 index 9c63a72a36..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/PsiElementWithSurroundingText.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import org.jetbrains.kotlin.com.intellij.psi.PsiElement - -data class PsiElementWithSurroundingText( - val psiElement: PsiElement -) { - val statementText: String = psiElement.text - override fun toString(): String { - return statementText - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/PsiTreePrinter.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/PsiTreePrinter.kt deleted file mode 100644 index 2c0a3a3530..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/PsiTreePrinter.kt +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.utils.traversal.AbstractTreePrinter -import org.jetbrains.kotlin.com.intellij.psi.PsiElement - -internal class PsiTreePrinter( - whitespaceChar: Char = ' ' -) : AbstractTreePrinter(whitespaceChar) { - - override fun PsiElement.children(): Sequence = children.asSequence() - override fun PsiElement.text(): String = text - override fun PsiElement.typeName(): String = node.elementType.toString() - override fun PsiElement.parent(): PsiElement? = parent - override fun PsiElement.simpleClassName(): String = this::class.java.simpleName - - companion object { - - internal fun T.printEverything(whitespaceChar: Char = ' '): T = - apply { PsiTreePrinter(whitespaceChar).printTreeString(this) } - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/RealKotlinFile.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/RealKotlinFile.kt deleted file mode 100644 index 5d6d681776..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/RealKotlinFile.kt +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.runBlocking -import modulecheck.parsing.psi.internal.PsiElementResolver -import modulecheck.parsing.psi.internal.callSiteName -import modulecheck.parsing.psi.internal.childrenOfTypeBreadthFirst -import modulecheck.parsing.psi.internal.fqNameSafe -import modulecheck.parsing.psi.internal.getByNameOrIndex -import modulecheck.parsing.psi.internal.identifier -import modulecheck.parsing.psi.internal.isCompanionObject -import modulecheck.parsing.psi.internal.isInCompanionObject -import modulecheck.parsing.psi.internal.isJvmStatic -import modulecheck.parsing.psi.internal.isPartOf -import modulecheck.parsing.psi.internal.isPrivateOrInternal -import modulecheck.parsing.psi.internal.isQualifiedPropertyOrCallExpression -import modulecheck.parsing.psi.internal.jvmNameOrNull -import modulecheck.parsing.psi.internal.jvmSimpleNames -import modulecheck.parsing.source.AnvilScopeNameEntry -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.KotlinFile -import modulecheck.parsing.source.KotlinFile.ScopeArgumentParseResult -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.RawAnvilAnnotatedType -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.SimpleName.Companion.stripPackageNameFromFqName -import modulecheck.parsing.source.asDeclaredName -import modulecheck.parsing.source.internal.NameParser -import modulecheck.parsing.source.internal.NameParser.NameParserPacket -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.lazy.toLazySet -import modulecheck.utils.mapToSet -import modulecheck.utils.remove -import modulecheck.utils.requireNotNull -import org.jetbrains.kotlin.fileClasses.javaFileFacadeFqName -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.psi.KtAnnotated -import org.jetbrains.kotlin.psi.KtAnnotationEntry -import org.jetbrains.kotlin.psi.KtCallableDeclaration -import org.jetbrains.kotlin.psi.KtClassOrObject -import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi.KtFunction -import org.jetbrains.kotlin.psi.KtImportDirective -import org.jetbrains.kotlin.psi.KtModifierListOwner -import org.jetbrains.kotlin.psi.KtNamedDeclaration -import org.jetbrains.kotlin.psi.KtObjectDeclaration -import org.jetbrains.kotlin.psi.KtPackageDirective -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.psi.classOrObjectRecursiveVisitor -import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject -import org.jetbrains.kotlin.psi.psiUtil.isTopLevelKtOrJavaMember -import org.jetbrains.kotlin.psi.psiUtil.parents -import java.io.File - -class RealKotlinFile( - override val file: File, - override val psi: KtFile, - private val psiResolver: PsiElementResolver, - private val nameParser: NameParser -) : KotlinFile { - - override val name: String = psi.name - - override val packageName: PackageName by lazy { PackageName(psi.packageFqName.asString()) } - - // For `import com.foo as Bar`, the entry is `"Bar" to "com.foo".asExplicitKotlinReference()` - private val _aliasMap = mutableMapOf() - - private val importsStrings: Lazy> = lazy { - - psi.importDirectives.asSequence() - .filter { it.isValidImport } - .filter { it.identifier() != null } - .filter { it.identifier()?.contains("*")?.not() == true } - .filter { !operatorSet.contains(it.identifier()) } - .filter { - @Suppress("UnsafeCallOnNullableType") - !componentNRegex.matches(it.identifier()!!) - } - .mapNotNull { importDirective -> - importDirective.importPath?.pathStr - ?.also { nameString -> - - // Map aliases to their actual names, so that they can be looked up while resolving - importDirective.alias - // The KtImportAlias is `as Foo`. It has three children: - // [LeafPsiElement, PsiWhiteSpace, LeafPsiElement], which are [`as`, ` `, `Foo`] - // respectively. - ?.lastChild - ?.text?.let { alias -> - _aliasMap[alias] = ReferenceName(nameString, KOTLIN) - } - } - } - .toSet() - } - override val importsLazy: Lazy> = lazy { - importsStrings.value - .mapToSet { ReferenceName(it, KOTLIN) } - } - - val constructorInjectedParams: LazyDeferred> = lazyDeferred { - referenceVisitor.constructorInjected.mapNotNull { psiResolver.declaredNameOrNull(it) }.toSet() - } - - private val fileJavaFacadeName by lazy { psi.javaFileFacadeFqName.asString() } - - @Suppress("ComplexMethod") - private fun KtNamedDeclaration.declaredNames(): List { - val fq = fqNameSafe() ?: return emptyList() - - val nameAsString = fq.asString() - - return buildList { - - fun kotlin(name: String) { - val declared = DeclaredName.kotlin( - packageName, - name.stripPackageNameFromFqName(packageName) - ) - if (!contains(declared)) { - add(declared) - } - } - - fun both(name: String) { - - val kotlinOnly = nameAsString.contains("`.*`".toRegex()) - - if (kotlinOnly) { - kotlin(name) - } else { - - val declared = name.stripPackageNameFromFqName(packageName) - .asDeclaredName(packageName) - add(declared) - } - } - - fun java(name: String) { - val declared = DeclaredName.java( - packageName, - name.stripPackageNameFromFqName(packageName) - ) - if (!contains(declared)) { - add(declared) - } - } - - val psi = this@declaredNames - - fun parseCompanionObjectDeclarations(companionName: String) { - both(nameAsString) - - if (isStatic()) { - both(nameAsString.remove(".$companionName")) - } else if (psi is KtCallableDeclaration) { - kotlin(nameAsString.remove(".$companionName")) - } - } - - when { - psi.isCompanionObject() -> { - parseCompanionObjectDeclarations(psi.name ?: "Companion") - } - - psi.isInCompanionObject() -> { - val companion = containingClassOrObject as KtObjectDeclaration - parseCompanionObjectDeclarations(companion.name ?: "Companion") - } - - isTopLevelKtOrJavaMember() && psi !is KtClassOrObject && !isStatic() -> { - kotlin(nameAsString) - - jvmSimpleNames().forEach { - java("$fileJavaFacadeName.$it") - } - } - - // object non-static properties or functions - isPartOf() && !isStatic() -> { - val parentObjectOrNull = containingClassOrObject - - if (parentObjectOrNull == null) { - both(nameAsString) - java("$nameAsString.INSTANCE") - } else { - kotlin(nameAsString) - - val parentFqName = parentObjectOrNull.fqName.requireNotNull().asString() - jvmSimpleNames().forEach { - java("$parentFqName.INSTANCE.$it") - } - } - } - - // object static properties - isPartOf() && isStatic() -> { - val parentFqName = containingClassOrObject?.fqNameSafe() - .requireNotNull() - .asString() - - val jvmNames = jvmSimpleNames() - - if (psi is KtFunction && psi.jvmNameOrNull() == null) { - both(nameAsString) - } else { - kotlin(nameAsString) - } - - jvmNames.forEach { name -> - java("$parentFqName.$name") - // The IDE gives warnings about "static member [...] accessed via instance reference" - // and hides this name from code completion, but it's technically still functional. - java("$parentFqName.INSTANCE.$name") - } - } - - psi is KtParameter || (psi is KtProperty && !psi.isTopLevelKtOrJavaMember()) -> { - - kotlin(nameAsString) - - val parentFqName = containingClassOrObject.requireNotNull { text } - .fqNameSafe() - .requireNotNull() - .asString() - - jvmSimpleNames().forEach { - java("$parentFqName.$it") - } - } - - else -> { - both(nameAsString) - } - } - } - } - - override val declarations: Set by lazy { - - psi.childrenOfTypeBreadthFirst() - .filterNot { it.isPrivateOrInternal() } - .filterNot { - it.parents.filterIsInstance() - .any { upstream -> upstream.isPrivateOrInternal() } - } - .flatMap { it.declaredNames() } - .toSet() - } - - private val wildcardImports by lazy { - - psi.importDirectives.filter { it.identifier()?.contains("*") != false } - .mapNotNull { it.importPath?.pathStr } - .toSet() - } - - override val apiReferences: LazyDeferred> = lazyDeferred { - - refs.await().apiReferenceNames - } - - private val referenceVisitor by lazy { - ReferenceVisitor().also { psi.accept(it) } - } - - private val typeReferences = lazyDeferred { - referenceVisitor.typeReferences - .asSequence() - .plus(referenceVisitor.callableReferences) - .plus(referenceVisitor.qualifiedExpressions) - .filterNot { it.isPartOf() } - .filterNot { it.isPartOf() } - .filterNot { it.isQualifiedPropertyOrCallExpression() } - .toSet() - } - - private val refs = lazyDeferred { - - val mustBeApi = referenceVisitor.apiReferences.mapToSet { it.callSiteName() } - - val unresolved = typeReferences.await().mapToSet { it.callSiteName() } - - nameParser.parse( - NameParserPacket( - packageName = packageName, - imports = importsStrings.value, - wildcardImports = wildcardImports, - aliasedImports = _aliasMap, - resolved = emptySet(), - unresolved = unresolved, - mustBeApi = mustBeApi, - apiReferenceNames = emptySet(), - referenceLanguage = KOTLIN, - stdLibNameOrNull = String::kotlinStdLibNameOrNull - ) - ) - } - - override val references: LazySet = listOf( - dataSource { refs.await().resolved } - ).toLazySet() - - override suspend fun getAnvilScopeArguments( - allAnnotations: List, - mergeAnnotations: List - ): ScopeArgumentParseResult { - val mergeArguments = mutableSetOf() - val contributeArguments = mutableSetOf() - - val visitor = classOrObjectRecursiveVisitor vis@{ classOrObject -> - - val typeFqName = classOrObject.fqNameSafe() ?: return@vis - val annotated = classOrObject as? KtAnnotated ?: return@vis - - annotated.annotationEntries.filter { annotationEntry -> - val typeRef = annotationEntry.typeReference?.text ?: return@filter false - - allAnnotations.any { it.endsWith(typeRef) } - }.forEach { annotationEntry -> - val typeRef = annotationEntry.typeReference.requireNotNull().text - - runBlocking { - val raw = annotationEntry.toRawAnvilAnnotatedType(typeFqName) - ?: return@runBlocking - - if (mergeAnnotations.any { it.endsWith(typeRef) }) { - mergeArguments.add(raw) - } else { - contributeArguments.add(raw) - } - } - } - } - - psi.accept(visitor) - - return ScopeArgumentParseResult( - mergeArguments = mergeArguments, - contributeArguments = contributeArguments - ) - } - - private fun KtNamedDeclaration.isStatic(): Boolean { - return (this as? KtCallableDeclaration)?.isJvmStatic() == true - } - - private suspend fun KtAnnotationEntry.toRawAnvilAnnotatedType( - typeFqName: FqName - ): RawAnvilAnnotatedType? { - val valueArgument = valueArgumentList?.getByNameOrIndex(0, "scope") ?: return null - - val entryText = ReferenceName( - valueArgument.text - // remove the names for arguments - .remove(".+=+".toRegex()) - .remove("::class") - .trim(), - KOTLIN - ) - - val resolvedScope = this@RealKotlinFile.references - .firstOrNull { ref -> ref.endsWith(entryText) } - ?: entryText - - return RawAnvilAnnotatedType( - declaredName = typeFqName.asDeclaredName(packageName), - anvilScopeNameEntry = AnvilScopeNameEntry(resolvedScope) - ) - } - - internal companion object { - val operatorSet = setOf( - "compareTo", - "contains", - "dec", - "div", - "divAssign", - "equals", - "get", - "getValue", - "inc", - "invoke", - "iterator", - "minus", - "minusAssign", - "mod", - "modAssign", - "not", - "plus", - "plusAssign", - "provideDelegate", - "rangeTo", - "set", - "setValue", - "times", - "timesAssign", - "unaryMinus", - "unaryPlus" - ) - val componentNRegex = Regex("component\\d+") - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ReferenceVisitor.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ReferenceVisitor.kt deleted file mode 100644 index 571d666f77..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/ReferenceVisitor.kt +++ /dev/null @@ -1,197 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import kotlinx.coroutines.runBlocking -import modulecheck.parsing.psi.internal.childrenOfTypeBreadthFirst -import modulecheck.parsing.psi.internal.hasAnnotation -import modulecheck.parsing.psi.internal.isPartOf -import modulecheck.parsing.psi.internal.isPrivateOrInternal -import org.jetbrains.kotlin.com.intellij.psi.PsiElement -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtCallableReferenceExpression -import org.jetbrains.kotlin.psi.KtClassLiteralExpression -import org.jetbrains.kotlin.psi.KtClassOrObject -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.psi.KtImportDirective -import org.jetbrains.kotlin.psi.KtNameReferenceExpression -import org.jetbrains.kotlin.psi.KtNamedFunction -import org.jetbrains.kotlin.psi.KtPackageDirective -import org.jetbrains.kotlin.psi.KtPrimaryConstructor -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.psi.KtQualifiedExpression -import org.jetbrains.kotlin.psi.KtReferenceExpression -import org.jetbrains.kotlin.psi.KtSecondaryConstructor -import org.jetbrains.kotlin.psi.KtTreeVisitorVoid -import org.jetbrains.kotlin.psi.KtTypeReference -import org.jetbrains.kotlin.psi.psiUtil.containingClass -import org.jetbrains.kotlin.psi.psiUtil.getChildOfType -import org.jetbrains.kotlin.psi.psiUtil.isFunctionalExpression - -@Suppress("TooManyFunctions") -class ReferenceVisitor : KtTreeVisitorVoid() { - - internal val qualifiedExpressions: MutableSet = mutableSetOf() - internal val callableReferences: MutableSet = mutableSetOf() - internal val typeReferences: MutableSet = mutableSetOf() - - internal val apiReferences: MutableSet = mutableSetOf() - internal val constructorInjected: MutableList = mutableListOf() - - override fun visitReferenceExpression(expression: KtReferenceExpression) { - super.visitReferenceExpression(expression) - - typeReferences += expression.parseTypeReferences() - } - - override fun visitClassOrObject(classOrObject: KtClassOrObject) { - super.visitClassOrObject(classOrObject) - - if (!classOrObject.isPrivateOrInternal()) { - - apiReferences += classOrObject.superTypeListEntries.parseTypeReferences() - } - } - - override fun visitProperty(property: KtProperty) { - super.visitProperty(property) - if (!property.isPrivateOrInternal() && property.containingClass() - ?.isPrivateOrInternal() != true - ) { - - val propertyType = property.getChildOfType() - ?: property.initializer?.getChildOfType() - - if (propertyType != null) { - apiReferences += propertyType - } - } - } - - override fun visitPrimaryConstructor(constructor: KtPrimaryConstructor) { - runBlocking { - super.visitPrimaryConstructor(constructor) - - if (!constructor.isPrivateOrInternal()) { - val valueTypeRefs = constructor.valueParameters.parseTypeReferences() - - apiReferences += valueTypeRefs - - if (constructor.hasAnnotation(FqNames.inject)) { - constructorInjected += valueTypeRefs - } - - apiReferences += constructor.typeParameters.parseTypeReferences() - } - } - } - - override fun visitSecondaryConstructor(constructor: KtSecondaryConstructor) { - runBlocking { - super.visitSecondaryConstructor(constructor) - if (!constructor.isPrivateOrInternal()) { - - val valueTypeRefs = constructor.valueParameters.parseTypeReferences() - - apiReferences += valueTypeRefs - - if (constructor.hasAnnotation(FqNames.inject)) { - constructorInjected += valueTypeRefs - } - - apiReferences += constructor.typeParameters.parseTypeReferences() - } - } - } - - override fun visitNamedFunction(function: KtNamedFunction) { - runBlocking { - super.visitNamedFunction(function) - if (!function.isPrivateOrInternal()) { - apiReferences += function.valueParameters.parseTypeReferences() - apiReferences += function.typeParameters.parseTypeReferences() - - // function.typeReference is the return type - apiReferences += function.typeReference?.parseTypeReferences().orEmpty() - apiReferences += function.receiverTypeReference?.parseTypeReferences().orEmpty() - } - } - } - - private fun List.parseTypeReferences(): Set = flatMap { psiElement -> - psiElement.parseTypeReferences() - } - .toSet() - - private fun PsiElement.parseTypeReferences(): Set = listOfNotNull( - when (this) { - is KtTypeReference -> this - is KtNameReferenceExpression -> this - is KtDotQualifiedExpression -> this - else -> null - } - ) - .plus( - childrenOfTypeBreadthFirst() - .filterNot { it.isFunctionalExpression() } - ) - .plus( - childrenOfTypeBreadthFirst() - .filterNot { it.isFunctionalExpression() } - ) - .plus( - childrenOfTypeBreadthFirst() - .filterNot { it.isFunctionalExpression() } - ) - .toSet() - - override fun visitQualifiedExpression(expression: KtQualifiedExpression) { - super.visitQualifiedExpression(expression) - - expression - .takeIf { !it.isPartOf() && !it.isPartOf() } - ?.run { - qualifiedExpressions += this.parseTypeReferences() - } - } - - override fun visitClassLiteralExpression(expression: KtClassLiteralExpression) { - super.visitClassLiteralExpression(expression) - - typeReferences += expression - } - - override fun visitTypeReference(typeReference: KtTypeReference) { - super.visitTypeReference(typeReference) - - // typeReferences.add(typeReference.text) - typeReferences += typeReference - } - - override fun visitCallExpression(expression: KtCallExpression) { - super.visitCallExpression(expression) - - // callableReferences.add(expression.text) - callableReferences += expression.parseTypeReferences() - } - - override fun visitCallableReferenceExpression(expression: KtCallableReferenceExpression) { - super.visitCallableReferenceExpression(expression) - - // callableReferences.add(expression.text) - callableReferences += expression.parseTypeReferences() - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/androidPsi.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/androidPsi.kt deleted file mode 100644 index 77b05dce43..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/androidPsi.kt +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.parsing.psi.internal.childrenOfTypeBreadthFirst -import modulecheck.parsing.psi.internal.nameSafe -import org.jetbrains.kotlin.com.intellij.psi.PsiElement -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.psiUtil.parents - -fun PsiElement.inBuildscript(): Boolean { - return parents.filterIsInstance() - .any { it.nameSafe() == "buildscript" } -} - -fun PsiElement.androidBlocks(): List { - return childrenOfTypeBreadthFirst() - .filter { it.nameSafe() == "android" } - .toList() -} - -fun PsiElement.buildFeaturesBlocks(): List { - - val nested = childrenOfTypeBreadthFirst() - .filter { it.nameSafe() == "buildFeatures" } - .toList() - - val qualified = childrenOfTypeBreadthFirst() - .filter { it.nameSafe()?.matches("""android\s*\.\s*buildFeatures""".toRegex()) == true } - .toList() - - return nested + qualified -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/DeclarationsProvider.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/DeclarationsProvider.kt deleted file mode 100644 index e61aa52cad..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/DeclarationsProvider.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi.internal - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.PackageName -import modulecheck.utils.lazy.LazySet - -interface DeclarationsProvider { - suspend fun get(sourceSetName: SourceSetName, packageName: PackageName): LazySet - - suspend fun getWithUpstream( - sourceSetName: SourceSetName, - packageNameOrNull: PackageName? = null - ): LazySet -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/PsiElementResolver.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/PsiElementResolver.kt deleted file mode 100644 index b6357bd408..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/PsiElementResolver.kt +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi.internal - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.project.McProject -import org.jetbrains.kotlin.com.intellij.psi.PsiElement - -class PsiElementResolver( - private val project: McProject, - private val sourceSetName: SourceSetName -) { - suspend fun declaredNameOrNull(token: PsiElement): QualifiedDeclaredName? { - return token.declaredNameOrNull(project, sourceSetName) - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktCallableDeclaration.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktCallableDeclaration.kt deleted file mode 100644 index 2e373c3397..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktCallableDeclaration.kt +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi.internal - -import modulecheck.parsing.psi.FqNames -import modulecheck.utils.capitalize -import modulecheck.utils.lazy.unsafeLazy -import org.jetbrains.kotlin.psi.KtAnnotated -import org.jetbrains.kotlin.psi.KtCallableDeclaration -import org.jetbrains.kotlin.psi.KtFunction -import org.jetbrains.kotlin.psi.KtLiteralStringTemplateEntry -import org.jetbrains.kotlin.psi.KtNamedDeclaration -import org.jetbrains.kotlin.psi.KtParameter -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.psi.KtPropertyAccessor -import org.jetbrains.kotlin.psi.KtValueArgumentList - -fun KtCallableDeclaration.isJvmStatic(): Boolean { - return hasAnnotation(FqNames.jvmStatic) -} - -fun KtProperty.isJvmField(): Boolean { - return hasAnnotation(FqNames.jvmField) -} - -fun KtFunction.jvmNameOrNull(): String? = annotatedJvmNameOrNull() - -fun KtPropertyAccessor.jvmNameOrNull(): String? = annotatedJvmNameOrNull() - -private fun KtAnnotated.annotatedJvmNameOrNull(): String? { - return annotationEntries - .firstOrNull { it.shortName?.asString() == "JvmName" } - ?.childrenOfTypeBreadthFirst() - ?.single() - ?.childrenOfTypeBreadthFirst() - ?.single() - ?.text -} - -/** - * Returns any custom names defined by `@JvmName(...)`, the default setter/getter - * names if it's a property, or the same names as used by Kotlin for anything else. - * - * @since 0.12.0 - */ -@Suppress("ComplexMethod") -internal fun KtNamedDeclaration.jvmSimpleNames(): Set { - - val identifier = nameAsSafeName.identifier - - val isPrefixMatchOrNull by unsafeLazy { - // matches a name which starts with `is`, followed by something other than a lowercase letter. - """^is([^a-z].*)""".toRegex().find(identifier) - } - - return when (this) { - is KtFunction -> { - setOf(jvmNameOrNull() ?: isPrefixMatchOrNull?.value ?: nameAsSafeName.asString()) - } - - is KtProperty, - is KtParameter -> { - - // const properties can't have JvmName annotations - if (isConst()) return emptySet() - - // a Kotlin property `isAProperty` has a java setter of `setAProperty(...)` - fun isPrefixSetterOrNull() = isPrefixMatchOrNull?.let { - "set${it.destructured.component1()}" - } - - val suffix by unsafeLazy { nameAsSafeName.identifier.capitalize() } - - buildSet { - - val get = (this@jvmSimpleNames as? KtProperty)?.getter?.jvmNameOrNull() - ?: isPrefixMatchOrNull?.value - ?: "get$suffix" - - add(get) - - val mutable = (this@jvmSimpleNames as? KtProperty)?.isVar - ?: (this@jvmSimpleNames as KtParameter).isMutable - - if (mutable) { - val set = (this@jvmSimpleNames as? KtProperty)?.setter?.jvmNameOrNull() - ?: isPrefixSetterOrNull() - ?: "set$suffix" - - add(set) - } - } - } - else -> { - setOf(nameAsSafeName.asString()) - } - } -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktImportDirective.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktImportDirective.kt deleted file mode 100644 index 07be025e96..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktImportDirective.kt +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi.internal - -import org.jetbrains.kotlin.psi.KtImportDirective - -internal fun KtImportDirective.identifier() = this.importPath?.importedName?.identifier diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktModifierListOwner.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktModifierListOwner.kt deleted file mode 100644 index e0910bfaf6..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/ktModifierListOwner.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -@file:Suppress("TooManyFunctions") - -package modulecheck.parsing.psi.internal - -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.KtModifierListOwner -import org.jetbrains.kotlin.psi.psiUtil.isPrivate -import org.jetbrains.kotlin.psi.psiUtil.isPublic - -internal fun KtModifierListOwner.isPublicNotOverridden() = isPublic && !isOverride() -internal fun KtModifierListOwner.isPrivateOrInternal() = isPrivate() || isInternal() -internal fun KtModifierListOwner.isAbstract() = hasModifier(KtTokens.ABSTRACT_KEYWORD) -internal fun KtModifierListOwner.isOverride() = hasModifier(KtTokens.OVERRIDE_KEYWORD) -internal fun KtModifierListOwner.isOpen() = hasModifier(KtTokens.OPEN_KEYWORD) -internal fun KtModifierListOwner.isExternal() = hasModifier(KtTokens.EXTERNAL_KEYWORD) -internal fun KtModifierListOwner.isOperator() = hasModifier(KtTokens.OPERATOR_KEYWORD) -internal fun KtModifierListOwner.isConstant() = hasModifier(KtTokens.CONST_KEYWORD) -internal fun KtModifierListOwner.isInternal() = hasModifier(KtTokens.INTERNAL_KEYWORD) -internal fun KtModifierListOwner.isLateinit() = hasModifier(KtTokens.LATEINIT_KEYWORD) -internal fun KtModifierListOwner.isInline() = hasModifier(KtTokens.INLINE_KEYWORD) -internal fun KtModifierListOwner.isExpect() = hasModifier(KtTokens.EXPECT_KEYWORD) diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/psiElement.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/psiElement.kt deleted file mode 100644 index 28e65f0a41..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/psiElement.kt +++ /dev/null @@ -1,505 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi.internal - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.psi.kotlinStdLibNameOrNull -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.ReferenceName.Companion.asReferenceName -import modulecheck.parsing.source.asDeclaredName -import modulecheck.project.McProject -import modulecheck.utils.cast -import modulecheck.utils.lazy.unsafeLazy -import modulecheck.utils.requireNotNull -import modulecheck.utils.traversal.Traversals -import org.jetbrains.kotlin.com.intellij.psi.PsiElement -import org.jetbrains.kotlin.descriptors.PropertyDescriptor -import org.jetbrains.kotlin.descriptors.VariableDescriptor -import org.jetbrains.kotlin.js.descriptorUtils.getKotlinTypeFqName -import org.jetbrains.kotlin.name.FqName -import org.jetbrains.kotlin.name.Name -import org.jetbrains.kotlin.psi.KtAnnotated -import org.jetbrains.kotlin.psi.KtAnnotationEntry -import org.jetbrains.kotlin.psi.KtBlockExpression -import org.jetbrains.kotlin.psi.KtCallExpression -import org.jetbrains.kotlin.psi.KtClassLiteralExpression -import org.jetbrains.kotlin.psi.KtDeclaration -import org.jetbrains.kotlin.psi.KtDotQualifiedExpression -import org.jetbrains.kotlin.psi.KtNameReferenceExpression -import org.jetbrains.kotlin.psi.KtNamedDeclaration -import org.jetbrains.kotlin.psi.KtNullableType -import org.jetbrains.kotlin.psi.KtObjectDeclaration -import org.jetbrains.kotlin.psi.KtProperty -import org.jetbrains.kotlin.psi.KtPropertyDelegate -import org.jetbrains.kotlin.psi.KtPureElement -import org.jetbrains.kotlin.psi.KtQualifiedExpression -import org.jetbrains.kotlin.psi.KtScriptInitializer -import org.jetbrains.kotlin.psi.KtSuperTypeListEntry -import org.jetbrains.kotlin.psi.KtTypeArgumentList -import org.jetbrains.kotlin.psi.KtTypeReference -import org.jetbrains.kotlin.psi.KtUserType -import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject -import org.jetbrains.kotlin.psi.psiUtil.getChildOfType -import org.jetbrains.kotlin.psi.psiUtil.getNonStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral -import org.jetbrains.kotlin.psi.psiUtil.parents -import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf -import org.jetbrains.kotlin.resolve.BindingContext -import org.jetbrains.kotlin.types.KotlinType -import java.io.File -import kotlin.contracts.contract - -inline fun PsiElement.isPartOf(): Boolean = - getNonStrictParentOfType() != null - -/** - * @return a sequence of child nodes of this [PsiElement] in depth-first - * order. The sequence starts with the first child node of this [PsiElement], - * followed by the first child node of the first child node, and so on. - */ -fun PsiElement.childrenDepthFirst(): Sequence { - return Traversals.depthFirstTraversal(this) { children.toList() } -} - -/** - * @return a sequence of child nodes of type [T] of this [PsiElement] in depth-first - * order. The sequence starts with the first child node of this [PsiElement], - * followed by the first child node of the first child node, and so on. - */ -inline fun PsiElement.childrenOfTypeDepthFirst(): Sequence { - return Traversals.depthFirstTraversal(this) { children.toList() } - .filterIsInstance() -} - -/** - * @param predicate stops visiting child nodes of the given node once this predicate returns false - * @return a sequence of child nodes of this [PsiElement] in depth-first order that - * satisfy the given [predicate]. The sequence starts with the first child node of this - * [PsiElement], followed by the first child node of the first child node, and so on. - */ -inline fun PsiElement.childrenDepthFirst( - crossinline predicate: (PsiElement) -> Boolean -): Sequence = Traversals.depthFirstTraversal(this) { children.filter(predicate) } - -/** - * @return a sequence of child nodes of type [T] of this [PsiElement] in breadth-first - * order. The sequence starts with the first child node of this [PsiElement], - * followed by the first child node of the second child node, and so on. - */ -inline fun PsiElement.childrenOfTypeBreadthFirst(): Sequence { - return Traversals.breadthFirstTraversal(this) { children.toList() } - .filterIsInstance() -} - -/** - * @return a sequence of child nodes of this [PsiElement] in breadth-first - * order. The sequence starts with all the child nodes of this [PsiElement], - * followed by all the child nodes of the first child node, and so on. - */ -fun PsiElement.childrenBreadthFirst(): Sequence { - return Traversals.breadthFirstTraversal(this) { children.toList() } -} - -/** - * @param [predicate] stops visiting child nodes of the parent - * of the given node once this predicate returns false - * @return a sequence of child nodes of this [PsiElement] in breadth-first order that - * satisfy the given [predicate]. The sequence starts with all the child nodes of this - * [PsiElement], followed by all the child nodes of the first child node, and so on. - */ -inline fun PsiElement.childrenBreadthFirst( - crossinline predicate: (PsiElement) -> Boolean -): Sequence = Traversals.breadthFirstTraversal(this) { children.filter(predicate) } - -fun KotlinType?.requireReferenceName(): ReferenceName = requireNotNull() - .getKotlinTypeFqName(false) - .asReferenceName(KOTLIN) - -fun KotlinType.asReferenceName(): ReferenceName = getKotlinTypeFqName(false) - .asReferenceName(KOTLIN) - -fun KtProperty.resolveType(bindingContext: BindingContext): VariableDescriptor? { - return bindingContext[BindingContext.VARIABLE, this] -} - -fun KtPropertyDelegate.returnType(bindingContext: BindingContext): KotlinType? { - val property = this.parent as? KtProperty ?: return null - val propertyDescriptor = - bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, property] as? PropertyDescriptor - return propertyDescriptor?.getter?.let { - bindingContext[BindingContext.DELEGATED_PROPERTY_RESOLVED_CALL, it] - ?.resultingDescriptor - ?.returnType - } -} - -fun KtAnnotated.hasAnnotation(annotationFqName: FqName): Boolean { - - if ( - annotationEntries.any { it.typeReference?.typeElement?.text == annotationFqName.asString() } - ) { - return true - } - - val file = containingKtFile - - val samePackage = annotationFqName.parent() == file.packageFqName - - // The annotation doesn't need to be imported if it's defined in the same package, - // or if it's from the Kotlin stdlib. - val needsImport = !samePackage && !setOf("kotlin", "kotlin.jvm") - .contains(annotationFqName.parent().asString()) - - val isImported by unsafeLazy { - file.importDirectives.map { it.importPath?.pathStr } - .contains(annotationFqName.asString()) - } - - if (needsImport && !isImported) { - return false - } - - return annotationEntries - .mapNotNull { it.typeReference?.typeElement?.text } - .any { it == annotationFqName.shortName().asString() } -} - -suspend fun McProject.canResolveReferenceName( - declaredName: ReferenceName, - sourceSetName: SourceSetName -): Boolean { - return resolvedNameOrNull(declaredName, sourceSetName) != null -} - -suspend fun McProject.canResolveDeclaredName( - declaredName: QualifiedDeclaredName, - sourceSetName: SourceSetName -): Boolean { - return resolvedNameOrNull(declaredName, sourceSetName) != null -} - -fun PsiElement.file(): File { - val path = containingFile.virtualFile.path - return File(path) -} - -/** */ -@Suppress("NestedBlockDepth", "ComplexMethod") -suspend fun PsiElement.declaredNameOrNull( - project: McProject, - sourceSetName: SourceSetName -): QualifiedDeclaredName? { - - val containingKtFile = parentsWithSelf - .filterIsInstance() - .first() - .containingKtFile - - val packageName = PackageName(containingKtFile.packageFqName.asString()) - - val classReference = when (this) { - // If a fully qualified name is used, then we're done and don't need to do anything further. - // An inner class reference like Abc.Inner is also considered a KtDotQualifiedExpression in - // some cases. - is KtDotQualifiedExpression -> { - project.resolvedNameOrNull( - FqName(text).asDeclaredName(packageName), - sourceSetName - ) - ?.let { return it } - ?: text - } - - is KtNameReferenceExpression -> getReferencedName() - is KtUserType -> { - val isGenericType = children.any { it is KtTypeArgumentList } - if (isGenericType) { - // For an expression like Lazy the qualifier will be null. If the qualifier exists, - // then it may refer to the package and the referencedName refers to the class name, e.g. - // a KtUserType "abc.def.GenericType" has three children: a qualifier "abc.def", - // the referencedName "GenericType" and the KtTypeArgumentList. - val qualifierText = qualifier?.text - val className = referencedName - - if (qualifierText != null) { - - // The generic might be fully qualified. Try to resolve it and return early. - project.resolvedNameOrNull( - FqName("$qualifierText.$className").asDeclaredName(packageName), - sourceSetName - ) - ?.let { return it } - - // If the name isn't fully qualified, then it's something like "Outer.Inner". - // We can't use `text` here because that includes the type parameter(s). - "$qualifierText.$className" - } else { - className ?: return null - } - } else { - val text = text - - // Sometimes a KtUserType is a fully qualified name. Give it a try and return early. - if (text.contains(".") && text[0].isLowerCase()) { - project.resolvedNameOrNull(FqName(text).asDeclaredName(packageName), sourceSetName) - ?.let { return it } - } - - // We can't use referencedName here. For inner classes like "Outer.Inner" it would only - // return "Inner", whereas text returns "Outer.Inner", what we expect. - text - } - } - - is KtTypeReference -> { - val children = children - if (children.size == 1) { - // Could be a KtNullableType or KtUserType. - children[0].declaredNameOrNull(project, sourceSetName) - ?.let { return it } ?: text - } else { - text - } - } - - is KtNullableType -> return innerType?.declaredNameOrNull(project, sourceSetName) - is KtAnnotationEntry -> return typeReference?.declaredNameOrNull(project, sourceSetName) - is KtClassLiteralExpression -> { - // Returns "Abc" for "Abc::class". - return children.singleOrNull() - ?.declaredNameOrNull(project, sourceSetName) - } - - is KtSuperTypeListEntry -> return typeReference?.declaredNameOrNull(project, sourceSetName) - else -> return null - } - - // E.g. OuterClass.InnerClass - val classReferenceOuter = classReference.substringBefore(".") - - val importPaths = containingKtFile.importDirectives.mapNotNull { it.importPath } - - // First look in the imports for the reference name. If the class is imported, then we know the - // fully qualified name. - importPaths - .filter { it.alias == null && it.fqName.shortName().asString() == classReference } - .also { matchingImportPaths -> - when { - matchingImportPaths.size == 1 -> - return matchingImportPaths[0].fqName.asDeclaredName(packageName) - - matchingImportPaths.size > 1 -> - return matchingImportPaths.firstOrNull { importPath -> - project.canResolveDeclaredName( - importPath.fqName.asDeclaredName(packageName), - sourceSetName - ) - }?.fqName - ?.asDeclaredName(packageName) - } - } - - importPaths - .filter { it.alias == null && it.fqName.shortName().asString() == classReferenceOuter } - .also { matchingImportPaths -> - when { - matchingImportPaths.size == 1 -> - return FqName("${matchingImportPaths[0].fqName.parent()}.$classReference") - .asDeclaredName(packageName) - - matchingImportPaths.size > 1 -> - return matchingImportPaths.firstOrNull { importPath -> - project.canResolveDeclaredName( - importPath.fqName.child(Name.identifier(classReference)) - .asDeclaredName(packageName), - sourceSetName - ) - }?.fqName - ?.asDeclaredName(packageName) - } - } - - containingKtFile.importDirectives - .asSequence() - .filter { it.isAllUnder } - .mapNotNull { - // This fqName is everything in front of the star, e.g. for "import java.io.*" it - // returns "java.io". - it.importPath?.fqName - } - .forEach { importFqName -> - project.resolvedNameOrNull( - importFqName.child(Name.identifier(classReference)).asDeclaredName(packageName), - sourceSetName - ) - ?.let { return it } - } - - // If there is no import, then try to resolve the class with the same package as this file. - project.resolvedNameOrNull( - containingKtFile.packageFqName.child(Name.identifier(classReference)) - .asDeclaredName(packageName), - sourceSetName - ) - ?.let { return it } - - // Check if it's a named import. - containingKtFile.importDirectives - .firstOrNull { classReference == it.importPath?.importedName?.asString() } - ?.importedFqName - ?.let { return it.asDeclaredName(packageName) } - - // If this doesn't work, then maybe a class from the Kotlin package is used. - classReference.kotlinStdLibNameOrNull() - ?.let { return it } - - return null -} - -fun KtDeclaration.isInObject(): Boolean = containingClassOrObject?.isObjectLiteral() ?: false - -/** - * @return true if the receiver declaration is inside a companion object - * @since 0.12.0 - */ -fun KtDeclaration.isInCompanionObject(): Boolean { - return containingClassOrObject?.isCompanionObject() ?: false -} - -fun KtDeclaration.isInObjectOrCompanionObject(): Boolean = isInObject() || isInCompanionObject() - -/** - * @return true if the receiver declaration is a companion object - * @since 0.12.0 - */ -fun KtDeclaration.isCompanionObject(): Boolean { - contract { - returns(true) implies (this@isCompanionObject is KtObjectDeclaration) - } - return this is KtObjectDeclaration && isCompanion() -} - -fun PsiElement.isQualifiedPropertyOrCallExpression(): Boolean { - // properties which are qualified have a direct parent of `KtQualifiedExpression` - if (parent is KtQualifiedExpression) return true - - // A qualified function is actually a NamedReferencedExpression (`foo`) - // with a KtCallExpression (`foo()`) for a parent, - // and a qualified grandparent (`com.foo()`). - return parent is KtCallExpression && parent.parent is KtQualifiedExpression -} - -fun KtCallExpression.nameSafe(): String? { - return getChildOfType()?.text -} - -/** - * This poorly-named function will return the most-qualified name available for a given - * [PsiElement] from the snippet of code where it's being called, without looking at imports. - * - * @since 0.12.0 - */ -fun PsiElement.callSiteName(): String { - // If a qualified expression is a function call, then the selector expression is the full - // function call (`KtCallExpression`). - // For example, `com.example.foo(...)` has a selector of `foo(...)`. - // In order to get just the qualified name, we have to get the `calleeExpression` of the - // function, then append that to the parent qualified expression's receiver expression. - return (this as? KtDotQualifiedExpression) - ?.selectorExpression - ?.let { it as? KtCallExpression } - ?.calleeExpression - ?.let { - val receiver = this.cast() - .receiverExpression - .text - val selectorCallText = it.text - - "$receiver.$selectorCallText" - } - ?: text -} - -fun KtBlockExpression.nameSafe(): String? { - - val call: KtCallExpression? = getChildOfType() - ?.getChildOfType() - ?: getChildOfType() - - call?.getChildOfType() - ?.text - ?.let { simpleName -> return simpleName } - - val dotQualified: KtDotQualifiedExpression? = getChildOfType() - ?.getChildOfType() - ?: getChildOfType() - - dotQualified?.let { dot -> - - val sel = dot.selectorExpression - ?.getChildOfType() - ?.text - - return "${dot.receiverExpression.text}.$sel" - } - - return getChildOfType() - ?.getChildOfType() - ?.text -} - -internal fun KtNamedDeclaration.isConst() = (this as? KtProperty)?.isConstant() ?: false - -/** - * Basically the same as `name`, but if the name has backticks, this will include it. - * - * @since 0.12.0 - */ -fun KtNamedDeclaration.identifierName(): String? = nameIdentifier?.text - -/** - * For a declaration with a name wrapped in backticks, this returns a - * name with those backticks. The regular `fqName` property does not. - * - * @since 0.12.0 - */ -fun KtNamedDeclaration.fqNameSafe(): FqName? { - val base = fqName ?: return null - - if (!base.asString().contains("\\s+".toRegex())) { - return base - } - - val packageOffset = containingKtFile.packageFqName.pathSegments().size - - val parentsList = listOf(this@fqNameSafe) - .plus(parents.filterIsInstance()) - .distinct() - .reversed() - - return FqName.fromSegments( - base.pathSegments() - .mapIndexed { index, name -> - - name.asString() - .takeIf { !it.contains("\\s+".toRegex()) } - ?: parentsList[index - packageOffset].identifierName() - } - ) -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/util.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/util.kt deleted file mode 100644 index 7d9d960977..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/internal/util.kt +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi.internal - -import modulecheck.parsing.source.SimpleName -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.utils.requireNotNull -import org.jetbrains.kotlin.psi.KtElement -import org.jetbrains.kotlin.psi.KtValueArgument -import org.jetbrains.kotlin.psi.KtValueArgumentList - -fun KtValueArgumentList.getByNameOrIndex(index: Int, name: String): KtValueArgument? { - return arguments - .firstOrNull { it.getArgumentName()?.text == name } - ?: arguments - .getOrNull(index) -} - -fun KtElement.requireSimpleName(): SimpleName { - return name.requireNotNull().asSimpleName() -} diff --git a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/kotlinStdLibNames.kt b/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/kotlinStdLibNames.kt deleted file mode 100644 index 85192e9f8d..0000000000 --- a/modulecheck-parsing/psi/src/main/kotlin/modulecheck/parsing/psi/kotlinStdLibNames.kt +++ /dev/null @@ -1,836 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.PackageName.Companion.asPackageName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName - -fun ReferenceName.kotlinStdLibNameOrNull(): QualifiedDeclaredName? { - return name.kotlinStdLibNameOrNull() -} - -fun String.kotlinStdLibNameOrNull(): QualifiedDeclaredName? { - - return kotlinStdLibNames[this]?.let { name -> - - val segments = name.split('.') - - DeclaredName.kotlin( - packageName = segments.dropLast(1).joinToString(".").asPackageName(), - simpleNames = listOf(segments.last().asSimpleName()) - ) - } -} - -@Suppress("MaxLineLength") -/** - * The entries of this map was generate with this script: - * - * ``` bash - * #!/usr/bin/env bash - * - * print_classes() { - * packages=(kotlin kotlin.annotation kotlin.collections kotlin.comparisons kotlin.io kotlin.ranges kotlin.sequences kotlin.text kotlin.jvm) - * - * for package in "${packages[@]}"; do - * curl -s "https://kotlinlang.org/api/latest/jvm/stdlib/$package/" | gsed -n -E "s|

([a-zA-Z].*)

|\"\1\" to \"$package.\1\",|p" - * done - * } - * - * print_classes | sort -u | gsed '/^"[A-Z_]*"/d' - * ``` - * - * And the list of packages that should be considered was extracted from the - * kotlin documentation: https://kotlinlang.org/docs/packages.html#default-imports - * - * @since 0.12.0 - */ -internal val kotlinStdLibNames = mapOf( - - // kotlin - "Annotation" to "kotlin.Annotation", - "Any" to "kotlin.Any", - "ArithmeticException" to "kotlin.ArithmeticException", - "Array" to "kotlin.Array", - "ArrayIndexOutOfBoundsException" to "kotlin.ArrayIndexOutOfBoundsException", - "AssertionError" to "kotlin.AssertionError", - "Boolean" to "kotlin.Boolean", - "BooleanArray" to "kotlin.BooleanArray", - "BuilderInference" to "kotlin.BuilderInference", - "Byte" to "kotlin.Byte", - "ByteArray" to "kotlin.ByteArray", - "Char" to "kotlin.Char", - "CharArray" to "kotlin.CharArray", - "CharSequence" to "kotlin.CharSequence", - "ClassCastException" to "kotlin.ClassCastException", - "Comparable" to "kotlin.Comparable", - "Comparator" to "kotlin.Comparator", - "ConcurrentModificationException" to "kotlin.ConcurrentModificationException", - "DeepRecursiveFunction" to "kotlin.DeepRecursiveFunction", - "DeepRecursiveScope" to "kotlin.DeepRecursiveScope", - "Deprecated" to "kotlin.Deprecated", - "DeprecatedSinceKotlin" to "kotlin.DeprecatedSinceKotlin", - "DeprecationLevel" to "kotlin.DeprecationLevel", - "Double" to "kotlin.Double", - "DoubleArray" to "kotlin.DoubleArray", - "DslMarker" to "kotlin.DslMarker", - "Enum" to "kotlin.Enum", - "Error" to "kotlin.Error", - "Exception" to "kotlin.Exception", - "Experimental" to "kotlin.Experimental", - "ExperimentalMultiplatform" to "kotlin.ExperimentalMultiplatform", - "ExperimentalStdlibApi" to "kotlin.ExperimentalStdlibApi", - "ExperimentalUnsignedTypes" to "kotlin.ExperimentalUnsignedTypes", - "ExtensionFunctionType" to "kotlin.ExtensionFunctionType", - "Float" to "kotlin.Float", - "FloatArray" to "kotlin.FloatArray", - "Function" to "kotlin.Function", - "IllegalArgumentException" to "kotlin.IllegalArgumentException", - "IllegalStateException" to "kotlin.IllegalStateException", - "IndexOutOfBoundsException" to "kotlin.IndexOutOfBoundsException", - "Int" to "kotlin.Int", - "IntArray" to "kotlin.IntArray", - "KotlinNullPointerException" to "kotlin.KotlinNullPointerException", - "KotlinVersion" to "kotlin.KotlinVersion", - "Lazy" to "kotlin.Lazy", - "LazyThreadSafetyMode" to "kotlin.LazyThreadSafetyMode", - "Long" to "kotlin.Long", - "LongArray" to "kotlin.LongArray", - "Metadata" to "kotlin.Metadata", - "NoSuchElementException" to "kotlin.NoSuchElementException", - "NoWhenBranchMatchedException" to "kotlin.NoWhenBranchMatchedException", - "NotImplementedError" to "kotlin.NotImplementedError", - "Nothing" to "kotlin.Nothing", - "NullPointerException" to "kotlin.NullPointerException", - "Number" to "kotlin.Number", - "NumberFormatException" to "kotlin.NumberFormatException", - "OptIn" to "kotlin.OptIn", - "OptionalExpectation" to "kotlin.OptionalExpectation", - "OutOfMemoryError" to "kotlin.OutOfMemoryError", - "OverloadResolutionByLambdaReturnType" to "kotlin.OverloadResolutionByLambdaReturnType", - "Pair" to "kotlin.Pair", - "ParameterName" to "kotlin.ParameterName", - "PublishedApi" to "kotlin.PublishedApi", - "ReplaceWith" to "kotlin.ReplaceWith", - "RequiresOptIn" to "kotlin.RequiresOptIn", - "Result" to "kotlin.Result", - "RuntimeException" to "kotlin.RuntimeException", - "Short" to "kotlin.Short", - "ShortArray" to "kotlin.ShortArray", - "SinceKotlin" to "kotlin.SinceKotlin", - "String" to "kotlin.String", - "Suppress" to "kotlin.Suppress", - "Throwable" to "kotlin.Throwable", - "Throws" to "kotlin.Throws", - "Triple" to "kotlin.Triple", - "TypeCastException" to "kotlin.TypeCastException", - "UByte" to "kotlin.UByte", - "UByteArray" to "kotlin.UByteArray", - "UInt" to "kotlin.UInt", - "UIntArray" to "kotlin.UIntArray", - "ULong" to "kotlin.ULong", - "ULongArray" to "kotlin.ULongArray", - "UShort" to "kotlin.UShort", - "UShortArray" to "kotlin.UShortArray", - "UninitializedPropertyAccessException" to "kotlin.UninitializedPropertyAccessException", - "Unit" to "kotlin.Unit", - "UnsafeVariance" to "kotlin.UnsafeVariance", - "UnsupportedOperationException" to "kotlin.UnsupportedOperationException", - "UseExperimental" to "kotlin.UseExperimental", - "addSuppressed" to "kotlin.addSuppressed", - "also" to "kotlin.also", - "apply" to "kotlin.apply", - "arrayOf" to "kotlin.arrayOf", - "arrayOfNulls" to "kotlin.arrayOfNulls", - "assert" to "kotlin.assert", - "booleanArrayOf" to "kotlin.booleanArrayOf", - "byteArrayOf" to "kotlin.byteArrayOf", - "charArrayOf" to "kotlin.charArrayOf", - "check" to "kotlin.check", - "checkNotNull" to "kotlin.checkNotNull", - "code" to "kotlin.code", - "compareTo" to "kotlin.compareTo", - "countLeadingZeroBits" to "kotlin.countLeadingZeroBits", - "countOneBits" to "kotlin.countOneBits", - "countTrailingZeroBits" to "kotlin.countTrailingZeroBits", - "doubleArrayOf" to "kotlin.doubleArrayOf", - "emptyArray" to "kotlin.emptyArray", - "enumValueOf" to "kotlin.enumValueOf", - "enumValues" to "kotlin.enumValues", - "error" to "kotlin.error", - "floatArrayOf" to "kotlin.floatArrayOf", - "floorDiv" to "kotlin.floorDiv", - "fold" to "kotlin.fold", - "fromBits" to "kotlin.fromBits", - "getOrDefault" to "kotlin.getOrDefault", - "getOrElse" to "kotlin.getOrElse", - "getOrThrow" to "kotlin.getOrThrow", - "getValue" to "kotlin.getValue", - "hashCode" to "kotlin.hashCode", - "intArrayOf" to "kotlin.intArrayOf", - "invoke" to "kotlin.invoke", - "isFinite" to "kotlin.isFinite", - "isInfinite" to "kotlin.isInfinite", - "isInitialized" to "kotlin.isInitialized", - "isNaN" to "kotlin.isNaN", - "lazy" to "kotlin.lazy", - "lazyOf" to "kotlin.lazyOf", - "let" to "kotlin.let", - "longArrayOf" to "kotlin.longArrayOf", - "map" to "kotlin.map", - "mapCatching" to "kotlin.mapCatching", - "mod" to "kotlin.mod", - "onFailure" to "kotlin.onFailure", - "onSuccess" to "kotlin.onSuccess", - "plus" to "kotlin.plus", - "printStackTrace" to "kotlin.printStackTrace", - "recover" to "kotlin.recover", - "recoverCatching" to "kotlin.recoverCatching", - "repeat" to "kotlin.repeat", - "require" to "kotlin.require", - "requireNotNull" to "kotlin.requireNotNull", - "rotateLeft" to "kotlin.rotateLeft", - "rotateRight" to "kotlin.rotateRight", - "run" to "kotlin.run", - "runCatching" to "kotlin.runCatching", - "setValue" to "kotlin.setValue", - "shortArrayOf" to "kotlin.shortArrayOf", - "stackTrace" to "kotlin.stackTrace", - "stackTraceToString" to "kotlin.stackTraceToString", - "suppressedExceptions" to "kotlin.suppressedExceptions", - "suspend" to "kotlin.suspend", - "synchronized" to "kotlin.synchronized", - "takeHighestOneBit" to "kotlin.takeHighestOneBit", - "takeIf" to "kotlin.takeIf", - "takeLowestOneBit" to "kotlin.takeLowestOneBit", - "takeUnless" to "kotlin.takeUnless", - "to" to "kotlin.to", - "toBigDecimal" to "kotlin.toBigDecimal", - "toBigInteger" to "kotlin.toBigInteger", - "toBits" to "kotlin.toBits", - "toList" to "kotlin.toList", - "toRawBits" to "kotlin.toRawBits", - "toString" to "kotlin.toString", - "toUByte" to "kotlin.toUByte", - "toUInt" to "kotlin.toUInt", - "toULong" to "kotlin.toULong", - "toUShort" to "kotlin.toUShort", - "ubyteArrayOf" to "kotlin.ubyteArrayOf", - "uintArrayOf" to "kotlin.uintArrayOf", - "ulongArrayOf" to "kotlin.ulongArrayOf", - "use" to "kotlin.use", - "ushortArrayOf" to "kotlin.ushortArrayOf", - "with" to "kotlin.with", - - // kotlin.annotation - "AnnotationRetention" to "kotlin.annotation.AnnotationRetention", - "AnnotationTarget" to "kotlin.annotation.AnnotationTarget", - "MustBeDocumented" to "kotlin.annotation.MustBeDocumented", - "Repeatable" to "kotlin.annotation.Repeatable", - "Retention" to "kotlin.annotation.Retention", - "Target" to "kotlin.annotation.Target", - - // kotlin.collections - "AbstractCollection" to "kotlin.collections.AbstractCollection", - "AbstractIterator" to "kotlin.collections.AbstractIterator", - "AbstractList" to "kotlin.collections.AbstractList", - "AbstractMap" to "kotlin.collections.AbstractMap", - "AbstractMutableCollection" to "kotlin.collections.AbstractMutableCollection", - "AbstractMutableList" to "kotlin.collections.AbstractMutableList", - "AbstractMutableMap" to "kotlin.collections.AbstractMutableMap", - "AbstractMutableSet" to "kotlin.collections.AbstractMutableSet", - "AbstractSet" to "kotlin.collections.AbstractSet", - "ArrayDeque" to "kotlin.collections.ArrayDeque", - "ArrayList" to "kotlin.collections.ArrayList", - "BooleanIterator" to "kotlin.collections.BooleanIterator", - "ByteIterator" to "kotlin.collections.ByteIterator", - "CharIterator" to "kotlin.collections.CharIterator", - "Collection" to "kotlin.collections.Collection", - "DoubleIterator" to "kotlin.collections.DoubleIterator", - "FloatIterator" to "kotlin.collections.FloatIterator", - "Grouping" to "kotlin.collections.Grouping", - "HashMap" to "kotlin.collections.HashMap", - "HashSet" to "kotlin.collections.HashSet", - "IndexedValue" to "kotlin.collections.IndexedValue", - "IntIterator" to "kotlin.collections.IntIterator", - "Iterable" to "kotlin.collections.Iterable", - "Iterator" to "kotlin.collections.Iterator", - "LinkedHashMap" to "kotlin.collections.LinkedHashMap", - "LinkedHashSet" to "kotlin.collections.LinkedHashSet", - "List" to "kotlin.collections.List", - "ListIterator" to "kotlin.collections.ListIterator", - "LongIterator" to "kotlin.collections.LongIterator", - "Map" to "kotlin.collections.Map", - "MutableCollection" to "kotlin.collections.MutableCollection", - "MutableIterable" to "kotlin.collections.MutableIterable", - "MutableIterator" to "kotlin.collections.MutableIterator", - "MutableList" to "kotlin.collections.MutableList", - "MutableListIterator" to "kotlin.collections.MutableListIterator", - "MutableMap" to "kotlin.collections.MutableMap", - "MutableSet" to "kotlin.collections.MutableSet", - "RandomAccess" to "kotlin.collections.RandomAccess", - "Set" to "kotlin.collections.Set", - "ShortIterator" to "kotlin.collections.ShortIterator", - "UByteIterator" to "kotlin.collections.UByteIterator", - "UIntIterator" to "kotlin.collections.UIntIterator", - "ULongIterator" to "kotlin.collections.ULongIterator", - "UShortIterator" to "kotlin.collections.UShortIterator", - "addAll" to "kotlin.collections.addAll", - "aggregate" to "kotlin.collections.aggregate", - "aggregateTo" to "kotlin.collections.aggregateTo", - "arrayListOf" to "kotlin.collections.arrayListOf", - "asByteArray" to "kotlin.collections.asByteArray", - "asIntArray" to "kotlin.collections.asIntArray", - "asList" to "kotlin.collections.asList", - "asLongArray" to "kotlin.collections.asLongArray", - "asReversed" to "kotlin.collections.asReversed", - "asShortArray" to "kotlin.collections.asShortArray", - "asUByteArray" to "kotlin.collections.asUByteArray", - "asUIntArray" to "kotlin.collections.asUIntArray", - "asULongArray" to "kotlin.collections.asULongArray", - "asUShortArray" to "kotlin.collections.asUShortArray", - "binarySearch" to "kotlin.collections.binarySearch", - "binarySearchBy" to "kotlin.collections.binarySearchBy", - "buildList" to "kotlin.collections.buildList", - "buildMap" to "kotlin.collections.buildMap", - "buildSet" to "kotlin.collections.buildSet", - "component1" to "kotlin.collections.component1", - "component2" to "kotlin.collections.component2", - "component3" to "kotlin.collections.component3", - "component4" to "kotlin.collections.component4", - "component5" to "kotlin.collections.component5", - "containsAll" to "kotlin.collections.containsAll", - "containsKey" to "kotlin.collections.containsKey", - "containsValue" to "kotlin.collections.containsValue", - "contentDeepEquals" to "kotlin.collections.contentDeepEquals", - "contentDeepHashCode" to "kotlin.collections.contentDeepHashCode", - "contentDeepToString" to "kotlin.collections.contentDeepToString", - "contentHashCode" to "kotlin.collections.contentHashCode", - "contentToString" to "kotlin.collections.contentToString", - "copyInto" to "kotlin.collections.copyInto", - "copyOf" to "kotlin.collections.copyOf", - "copyOfRange" to "kotlin.collections.copyOfRange", - "eachCount" to "kotlin.collections.eachCount", - "eachCountTo" to "kotlin.collections.eachCountTo", - "emptyList" to "kotlin.collections.emptyList", - "emptyMap" to "kotlin.collections.emptyMap", - "emptySet" to "kotlin.collections.emptySet", - "fill" to "kotlin.collections.fill", - "filterKeys" to "kotlin.collections.filterKeys", - "filterValues" to "kotlin.collections.filterValues", - "foldTo" to "kotlin.collections.foldTo", - "getOrPut" to "kotlin.collections.getOrPut", - "hashMapOf" to "kotlin.collections.hashMapOf", - "hashSetOf" to "kotlin.collections.hashSetOf", - "intersect" to "kotlin.collections.intersect", - "linkedMapOf" to "kotlin.collections.linkedMapOf", - "linkedSetOf" to "kotlin.collections.linkedSetOf", - "linkedStringMapOf" to "kotlin.collections.linkedStringMapOf", - "linkedStringSetOf" to "kotlin.collections.linkedStringSetOf", - "listOf" to "kotlin.collections.listOf", - "listOfNotNull" to "kotlin.collections.listOfNotNull", - "mapKeys" to "kotlin.collections.mapKeys", - "mapKeysTo" to "kotlin.collections.mapKeysTo", - "mapOf" to "kotlin.collections.mapOf", - "mapValues" to "kotlin.collections.mapValues", - "mapValuesTo" to "kotlin.collections.mapValuesTo", - "minusAssign" to "kotlin.collections.minusAssign", - "mutableListOf" to "kotlin.collections.mutableListOf", - "mutableMapOf" to "kotlin.collections.mutableMapOf", - "mutableSetOf" to "kotlin.collections.mutableSetOf", - "plusAssign" to "kotlin.collections.plusAssign", - "putAll" to "kotlin.collections.putAll", - "reduceTo" to "kotlin.collections.reduceTo", - "remove" to "kotlin.collections.remove", - "removeAll" to "kotlin.collections.removeAll", - "removeFirst" to "kotlin.collections.removeFirst", - "removeFirstOrNull" to "kotlin.collections.removeFirstOrNull", - "removeLast" to "kotlin.collections.removeLast", - "removeLastOrNull" to "kotlin.collections.removeLastOrNull", - "replaceAll" to "kotlin.collections.replaceAll", - "retainAll" to "kotlin.collections.retainAll", - "reverse" to "kotlin.collections.reverse", - "reversedArray" to "kotlin.collections.reversedArray", - "setOf" to "kotlin.collections.setOf", - "setOfNotNull" to "kotlin.collections.setOfNotNull", - "shuffle" to "kotlin.collections.shuffle", - "sliceArray" to "kotlin.collections.sliceArray", - "sort" to "kotlin.collections.sort", - "sortBy" to "kotlin.collections.sortBy", - "sortByDescending" to "kotlin.collections.sortByDescending", - "sortDescending" to "kotlin.collections.sortDescending", - "sortWith" to "kotlin.collections.sortWith", - "sortedArray" to "kotlin.collections.sortedArray", - "sortedArrayDescending" to "kotlin.collections.sortedArrayDescending", - "sortedArrayWith" to "kotlin.collections.sortedArrayWith", - "sortedMapOf" to "kotlin.collections.sortedMapOf", - "sortedSetOf" to "kotlin.collections.sortedSetOf", - "stringMapOf" to "kotlin.collections.stringMapOf", - "stringSetOf" to "kotlin.collections.stringSetOf", - "subarrayContentToString" to "kotlin.collections.subarrayContentToString", - "subtract" to "kotlin.collections.subtract", - "toBooleanArray" to "kotlin.collections.toBooleanArray", - "toDoubleArray" to "kotlin.collections.toDoubleArray", - "toFloatArray" to "kotlin.collections.toFloatArray", - "toIntArray" to "kotlin.collections.toIntArray", - "toLongArray" to "kotlin.collections.toLongArray", - "toMap" to "kotlin.collections.toMap", - "toMutableMap" to "kotlin.collections.toMutableMap", - "toPair" to "kotlin.collections.toPair", - "toProperties" to "kotlin.collections.toProperties", - "toShortArray" to "kotlin.collections.toShortArray", - "toSortedMap" to "kotlin.collections.toSortedMap", - "toTypedArray" to "kotlin.collections.toTypedArray", - "toUByteArray" to "kotlin.collections.toUByteArray", - "toUIntArray" to "kotlin.collections.toUIntArray", - "toULongArray" to "kotlin.collections.toULongArray", - "toUShortArray" to "kotlin.collections.toUShortArray", - "union" to "kotlin.collections.union", - "withDefault" to "kotlin.collections.withDefault", - - // kotlin.collections.java.util.concurrent - "java.util.concurrent.ConcurrentMap" to "kotlin.collections.java.util.concurrent.ConcurrentMap", - - // kotlin.comparisons - "compareBy" to "kotlin.comparisons.compareBy", - "compareByDescending" to "kotlin.comparisons.compareByDescending", - "compareValues" to "kotlin.comparisons.compareValues", - "compareValuesBy" to "kotlin.comparisons.compareValuesBy", - "naturalOrder" to "kotlin.comparisons.naturalOrder", - "nullsFirst" to "kotlin.comparisons.nullsFirst", - "nullsLast" to "kotlin.comparisons.nullsLast", - "reverseOrder" to "kotlin.comparisons.reverseOrder", - "then" to "kotlin.comparisons.then", - "thenBy" to "kotlin.comparisons.thenBy", - "thenByDescending" to "kotlin.comparisons.thenByDescending", - "thenComparator" to "kotlin.comparisons.thenComparator", - "thenDescending" to "kotlin.comparisons.thenDescending", - - // kotlin.io - "AccessDeniedException" to "kotlin.io.AccessDeniedException", - "FileAlreadyExistsException" to "kotlin.io.FileAlreadyExistsException", - "FileSystemException" to "kotlin.io.FileSystemException", - "FileTreeWalk" to "kotlin.io.FileTreeWalk", - "FileWalkDirection" to "kotlin.io.FileWalkDirection", - "NoSuchFileException" to "kotlin.io.NoSuchFileException", - "OnErrorAction" to "kotlin.io.OnErrorAction", - "byteInputStream" to "kotlin.io.byteInputStream", - "createTempDir" to "kotlin.io.createTempDir", - "createTempFile" to "kotlin.io.createTempFile", - "inputStream" to "kotlin.io.inputStream", - "print" to "kotlin.io.print", - "println" to "kotlin.io.println", - "readLine" to "kotlin.io.readLine", - "reader" to "kotlin.io.reader", - "readln" to "kotlin.io.readln", - "readlnOrNull" to "kotlin.io.readlnOrNull", - - // kotlin.io.java.io - "java.io.BufferedInputStream" to "kotlin.io.java.io.BufferedInputStream", - "java.io.BufferedReader" to "kotlin.io.java.io.BufferedReader", - "java.io.File" to "kotlin.io.java.io.File", - "java.io.InputStream" to "kotlin.io.java.io.InputStream", - "java.io.OutputStream" to "kotlin.io.java.io.OutputStream", - "java.io.Reader" to "kotlin.io.java.io.Reader", - "java.io.Writer" to "kotlin.io.java.io.Writer", - - // kotlin.io.java.net - "java.net.URL" to "kotlin.io.java.net.URL", - - // kotlin.java.math - "java.math.BigDecimal" to "kotlin.java.math.BigDecimal", - "java.math.BigInteger" to "kotlin.java.math.BigInteger", - - // kotlin.jvm - "JvmDefault" to "kotlin.jvm.JvmDefault", - "JvmDefaultWithoutCompatibility" to "kotlin.jvm.JvmDefaultWithoutCompatibility", - "JvmField" to "kotlin.jvm.JvmField", - "JvmInline" to "kotlin.jvm.JvmInline", - "JvmMultifileClass" to "kotlin.jvm.JvmMultifileClass", - "JvmName" to "kotlin.jvm.JvmName", - "JvmOverloads" to "kotlin.jvm.JvmOverloads", - "JvmRecord" to "kotlin.jvm.JvmRecord", - "JvmRepeatable" to "kotlin.jvm.JvmRepeatable", - "JvmStatic" to "kotlin.jvm.JvmStatic", - "JvmSuppressWildcards" to "kotlin.jvm.JvmSuppressWildcards", - "JvmSynthetic" to "kotlin.jvm.JvmSynthetic", - "JvmWildcard" to "kotlin.jvm.JvmWildcard", - "KotlinReflectionNotSupportedError" to "kotlin.jvm.KotlinReflectionNotSupportedError", - "PurelyImplements" to "kotlin.jvm.PurelyImplements", - "Strictfp" to "kotlin.jvm.Strictfp", - "Synchronized" to "kotlin.jvm.Synchronized", - "Throws" to "kotlin.jvm.Throws", - "Transient" to "kotlin.jvm.Transient", - "Volatile" to "kotlin.jvm.Volatile", - "annotationClass" to "kotlin.jvm.annotationClass", - "isArrayOf" to "kotlin.jvm.isArrayOf", - "java" to "kotlin.jvm.java", - "javaClass" to "kotlin.jvm.javaClass", - "javaObjectType" to "kotlin.jvm.javaObjectType", - "javaPrimitiveType" to "kotlin.jvm.javaPrimitiveType", - - // kotlin.jvm.java.lang - "java.lang.Class" to "kotlin.jvm.java.lang.Class", - - // kotlin.ranges - "CharProgression" to "kotlin.ranges.CharProgression", - "CharRange" to "kotlin.ranges.CharRange", - "ClosedFloatingPointRange" to "kotlin.ranges.ClosedFloatingPointRange", - "ClosedRange" to "kotlin.ranges.ClosedRange", - "IntProgression" to "kotlin.ranges.IntProgression", - "IntRange" to "kotlin.ranges.IntRange", - "LongProgression" to "kotlin.ranges.LongProgression", - "LongRange" to "kotlin.ranges.LongRange", - "UIntProgression" to "kotlin.ranges.UIntProgression", - "UIntRange" to "kotlin.ranges.UIntRange", - "ULongProgression" to "kotlin.ranges.ULongProgression", - "ULongRange" to "kotlin.ranges.ULongRange", - "coerceAtLeast" to "kotlin.ranges.coerceAtLeast", - "coerceAtMost" to "kotlin.ranges.coerceAtMost", - "coerceIn" to "kotlin.ranges.coerceIn", - "downTo" to "kotlin.ranges.downTo", - "rangeTo" to "kotlin.ranges.rangeTo", - "step" to "kotlin.ranges.step", - "until" to "kotlin.ranges.until", - - // kotlin.sequences - "Sequence" to "kotlin.sequences.Sequence", - "SequenceBuilder" to "kotlin.sequences.SequenceBuilder", - "SequenceScope" to "kotlin.sequences.SequenceScope", - "average" to "kotlin.sequences.average", - "buildIterator" to "kotlin.sequences.buildIterator", - "buildSequence" to "kotlin.sequences.buildSequence", - "constrainOnce" to "kotlin.sequences.constrainOnce", - "distinct" to "kotlin.sequences.distinct", - "distinctBy" to "kotlin.sequences.distinctBy", - "emptySequence" to "kotlin.sequences.emptySequence", - "filterIsInstance" to "kotlin.sequences.filterIsInstance", - "filterIsInstanceTo" to "kotlin.sequences.filterIsInstanceTo", - "filterNotNull" to "kotlin.sequences.filterNotNull", - "filterNotNullTo" to "kotlin.sequences.filterNotNullTo", - "flatten" to "kotlin.sequences.flatten", - "generateSequence" to "kotlin.sequences.generateSequence", - "joinTo" to "kotlin.sequences.joinTo", - "joinToString" to "kotlin.sequences.joinToString", - "minus" to "kotlin.sequences.minus", - "minusElement" to "kotlin.sequences.minusElement", - "plusElement" to "kotlin.sequences.plusElement", - "requireNoNulls" to "kotlin.sequences.requireNoNulls", - "sequence" to "kotlin.sequences.sequence", - "sequenceOf" to "kotlin.sequences.sequenceOf", - "shuffled" to "kotlin.sequences.shuffled", - "sorted" to "kotlin.sequences.sorted", - "sortedBy" to "kotlin.sequences.sortedBy", - "sortedByDescending" to "kotlin.sequences.sortedByDescending", - "sortedDescending" to "kotlin.sequences.sortedDescending", - "sortedWith" to "kotlin.sequences.sortedWith", - "sum" to "kotlin.sequences.sum", - "toMutableSet" to "kotlin.sequences.toMutableSet", - "unzip" to "kotlin.sequences.unzip", - - // kotlin.sequences.java.util - "java.util.Enumeration" to "kotlin.sequences.java.util.Enumeration", - - // kotlin.text - "Appendable" to "kotlin.text.Appendable", - "CharCategory" to "kotlin.text.CharCategory", - "CharDirectionality" to "kotlin.text.CharDirectionality", - "CharacterCodingException" to "kotlin.text.CharacterCodingException", - "Charsets" to "kotlin.text.Charsets", - "MatchGroup" to "kotlin.text.MatchGroup", - "MatchGroupCollection" to "kotlin.text.MatchGroupCollection", - "MatchNamedGroupCollection" to "kotlin.text.MatchNamedGroupCollection", - "MatchResult" to "kotlin.text.MatchResult", - "Regex" to "kotlin.text.Regex", - "RegexOption" to "kotlin.text.RegexOption", - "StringBuilder" to "kotlin.text.StringBuilder", - "Typography" to "kotlin.text.Typography", - "all" to "kotlin.text.all", - "any" to "kotlin.text.any", - "append" to "kotlin.text.append", - "appendLine" to "kotlin.text.appendLine", - "appendRange" to "kotlin.text.appendRange", - "appendln" to "kotlin.text.appendln", - "asIterable" to "kotlin.text.asIterable", - "asSequence" to "kotlin.text.asSequence", - "associate" to "kotlin.text.associate", - "associateBy" to "kotlin.text.associateBy", - "associateByTo" to "kotlin.text.associateByTo", - "associateTo" to "kotlin.text.associateTo", - "associateWith" to "kotlin.text.associateWith", - "associateWithTo" to "kotlin.text.associateWithTo", - "buildString" to "kotlin.text.buildString", - "capitalize" to "kotlin.text.capitalize", - "category" to "kotlin.text.category", - "charset" to "kotlin.text.charset", - "chunked" to "kotlin.text.chunked", - "chunkedSequence" to "kotlin.text.chunkedSequence", - "clear" to "kotlin.text.clear", - "codePointAt" to "kotlin.text.codePointAt", - "codePointBefore" to "kotlin.text.codePointBefore", - "codePointCount" to "kotlin.text.codePointCount", - "commonPrefixWith" to "kotlin.text.commonPrefixWith", - "commonSuffixWith" to "kotlin.text.commonSuffixWith", - "compareTo" to "kotlin.text.compareTo", - "concat" to "kotlin.text.concat", - "concatToString" to "kotlin.text.concatToString", - "contains" to "kotlin.text.contains", - "contentEquals" to "kotlin.text.contentEquals", - "count" to "kotlin.text.count", - "decapitalize" to "kotlin.text.decapitalize", - "decodeToString" to "kotlin.text.decodeToString", - "deleteAt" to "kotlin.text.deleteAt", - "deleteCharAt" to "kotlin.text.deleteCharAt", - "deleteRange" to "kotlin.text.deleteRange", - "digitToChar" to "kotlin.text.digitToChar", - "digitToInt" to "kotlin.text.digitToInt", - "digitToIntOrNull" to "kotlin.text.digitToIntOrNull", - "directionality" to "kotlin.text.directionality", - "drop" to "kotlin.text.drop", - "dropLast" to "kotlin.text.dropLast", - "dropLastWhile" to "kotlin.text.dropLastWhile", - "dropWhile" to "kotlin.text.dropWhile", - "elementAt" to "kotlin.text.elementAt", - "elementAtOrElse" to "kotlin.text.elementAtOrElse", - "elementAtOrNull" to "kotlin.text.elementAtOrNull", - "encodeToByteArray" to "kotlin.text.encodeToByteArray", - "endsWith" to "kotlin.text.endsWith", - "ensureCapacity" to "kotlin.text.ensureCapacity", - "equals" to "kotlin.text.equals", - "filter" to "kotlin.text.filter", - "filterIndexed" to "kotlin.text.filterIndexed", - "filterIndexedTo" to "kotlin.text.filterIndexedTo", - "filterNot" to "kotlin.text.filterNot", - "filterNotTo" to "kotlin.text.filterNotTo", - "filterTo" to "kotlin.text.filterTo", - "find" to "kotlin.text.find", - "findAnyOf" to "kotlin.text.findAnyOf", - "findLast" to "kotlin.text.findLast", - "findLastAnyOf" to "kotlin.text.findLastAnyOf", - "first" to "kotlin.text.first", - "firstNotNullOf" to "kotlin.text.firstNotNullOf", - "firstNotNullOfOrNull" to "kotlin.text.firstNotNullOfOrNull", - "firstOrNull" to "kotlin.text.firstOrNull", - "flatMap" to "kotlin.text.flatMap", - "flatMapIndexed" to "kotlin.text.flatMapIndexed", - "flatMapIndexedTo" to "kotlin.text.flatMapIndexedTo", - "flatMapTo" to "kotlin.text.flatMapTo", - "fold" to "kotlin.text.fold", - "foldIndexed" to "kotlin.text.foldIndexed", - "foldRight" to "kotlin.text.foldRight", - "foldRightIndexed" to "kotlin.text.foldRightIndexed", - "forEach" to "kotlin.text.forEach", - "forEachIndexed" to "kotlin.text.forEachIndexed", - "format" to "kotlin.text.format", - "get" to "kotlin.text.get", - "getOrElse" to "kotlin.text.getOrElse", - "getOrNull" to "kotlin.text.getOrNull", - "groupBy" to "kotlin.text.groupBy", - "groupByTo" to "kotlin.text.groupByTo", - "groupingBy" to "kotlin.text.groupingBy", - "hasSurrogatePairAt" to "kotlin.text.hasSurrogatePairAt", - "ifBlank" to "kotlin.text.ifBlank", - "ifEmpty" to "kotlin.text.ifEmpty", - "indexOf" to "kotlin.text.indexOf", - "indexOfAny" to "kotlin.text.indexOfAny", - "indexOfFirst" to "kotlin.text.indexOfFirst", - "indexOfLast" to "kotlin.text.indexOfLast", - "indices" to "kotlin.text.indices", - "insert" to "kotlin.text.insert", - "insertRange" to "kotlin.text.insertRange", - "intern" to "kotlin.text.intern", - "isBlank" to "kotlin.text.isBlank", - "isDefined" to "kotlin.text.isDefined", - "isDigit" to "kotlin.text.isDigit", - "isEmpty" to "kotlin.text.isEmpty", - "isHighSurrogate" to "kotlin.text.isHighSurrogate", - "isISOControl" to "kotlin.text.isISOControl", - "isIdentifierIgnorable" to "kotlin.text.isIdentifierIgnorable", - "isJavaIdentifierPart" to "kotlin.text.isJavaIdentifierPart", - "isJavaIdentifierStart" to "kotlin.text.isJavaIdentifierStart", - "isLetter" to "kotlin.text.isLetter", - "isLetterOrDigit" to "kotlin.text.isLetterOrDigit", - "isLowSurrogate" to "kotlin.text.isLowSurrogate", - "isLowerCase" to "kotlin.text.isLowerCase", - "isNotBlank" to "kotlin.text.isNotBlank", - "isNotEmpty" to "kotlin.text.isNotEmpty", - "isNullOrBlank" to "kotlin.text.isNullOrBlank", - "isNullOrEmpty" to "kotlin.text.isNullOrEmpty", - "isSupplementaryCodePoint" to "kotlin.text.isSupplementaryCodePoint", - "isSurrogate" to "kotlin.text.isSurrogate", - "isSurrogatePair" to "kotlin.text.isSurrogatePair", - "isTitleCase" to "kotlin.text.isTitleCase", - "isUpperCase" to "kotlin.text.isUpperCase", - "isWhitespace" to "kotlin.text.isWhitespace", - "iterator" to "kotlin.text.iterator", - "last" to "kotlin.text.last", - "lastIndex" to "kotlin.text.lastIndex", - "lastIndexOf" to "kotlin.text.lastIndexOf", - "lastIndexOfAny" to "kotlin.text.lastIndexOfAny", - "lastOrNull" to "kotlin.text.lastOrNull", - "lineSequence" to "kotlin.text.lineSequence", - "lines" to "kotlin.text.lines", - "lowercase" to "kotlin.text.lowercase", - "lowercaseChar" to "kotlin.text.lowercaseChar", - "map" to "kotlin.text.map", - "mapIndexed" to "kotlin.text.mapIndexed", - "mapIndexedNotNull" to "kotlin.text.mapIndexedNotNull", - "mapIndexedNotNullTo" to "kotlin.text.mapIndexedNotNullTo", - "mapIndexedTo" to "kotlin.text.mapIndexedTo", - "mapNotNull" to "kotlin.text.mapNotNull", - "mapNotNullTo" to "kotlin.text.mapNotNullTo", - "mapTo" to "kotlin.text.mapTo", - "match" to "kotlin.text.match", - "matches" to "kotlin.text.matches", - "max" to "kotlin.text.max", - "maxBy" to "kotlin.text.maxBy", - "maxByOrNull" to "kotlin.text.maxByOrNull", - "maxOf" to "kotlin.text.maxOf", - "maxOfOrNull" to "kotlin.text.maxOfOrNull", - "maxOfWith" to "kotlin.text.maxOfWith", - "maxOfWithOrNull" to "kotlin.text.maxOfWithOrNull", - "maxOrNull" to "kotlin.text.maxOrNull", - "maxWith" to "kotlin.text.maxWith", - "maxWithOrNull" to "kotlin.text.maxWithOrNull", - "min" to "kotlin.text.min", - "minBy" to "kotlin.text.minBy", - "minByOrNull" to "kotlin.text.minByOrNull", - "minOf" to "kotlin.text.minOf", - "minOfOrNull" to "kotlin.text.minOfOrNull", - "minOfWith" to "kotlin.text.minOfWith", - "minOfWithOrNull" to "kotlin.text.minOfWithOrNull", - "minOrNull" to "kotlin.text.minOrNull", - "minWith" to "kotlin.text.minWith", - "minWithOrNull" to "kotlin.text.minWithOrNull", - "none" to "kotlin.text.none", - "offsetByCodePoints" to "kotlin.text.offsetByCodePoints", - "onEach" to "kotlin.text.onEach", - "onEachIndexed" to "kotlin.text.onEachIndexed", - "orEmpty" to "kotlin.text.orEmpty", - "padEnd" to "kotlin.text.padEnd", - "padStart" to "kotlin.text.padStart", - "partition" to "kotlin.text.partition", - "plus" to "kotlin.text.plus", - "prependIndent" to "kotlin.text.prependIndent", - "random" to "kotlin.text.random", - "randomOrNull" to "kotlin.text.randomOrNull", - "reduce" to "kotlin.text.reduce", - "reduceIndexed" to "kotlin.text.reduceIndexed", - "reduceIndexedOrNull" to "kotlin.text.reduceIndexedOrNull", - "reduceOrNull" to "kotlin.text.reduceOrNull", - "reduceRight" to "kotlin.text.reduceRight", - "reduceRightIndexed" to "kotlin.text.reduceRightIndexed", - "reduceRightIndexedOrNull" to "kotlin.text.reduceRightIndexedOrNull", - "reduceRightOrNull" to "kotlin.text.reduceRightOrNull", - "regionMatches" to "kotlin.text.regionMatches", - "removePrefix" to "kotlin.text.removePrefix", - "removeRange" to "kotlin.text.removeRange", - "removeSuffix" to "kotlin.text.removeSuffix", - "removeSurrounding" to "kotlin.text.removeSurrounding", - "repeat" to "kotlin.text.repeat", - "replace" to "kotlin.text.replace", - "replaceAfter" to "kotlin.text.replaceAfter", - "replaceAfterLast" to "kotlin.text.replaceAfterLast", - "replaceBefore" to "kotlin.text.replaceBefore", - "replaceBeforeLast" to "kotlin.text.replaceBeforeLast", - "replaceFirst" to "kotlin.text.replaceFirst", - "replaceFirstChar" to "kotlin.text.replaceFirstChar", - "replaceIndent" to "kotlin.text.replaceIndent", - "replaceIndentByMargin" to "kotlin.text.replaceIndentByMargin", - "replaceRange" to "kotlin.text.replaceRange", - "reversed" to "kotlin.text.reversed", - "runningFold" to "kotlin.text.runningFold", - "runningFoldIndexed" to "kotlin.text.runningFoldIndexed", - "runningReduce" to "kotlin.text.runningReduce", - "runningReduceIndexed" to "kotlin.text.runningReduceIndexed", - "scan" to "kotlin.text.scan", - "scanIndexed" to "kotlin.text.scanIndexed", - "set" to "kotlin.text.set", - "setCharAt" to "kotlin.text.setCharAt", - "setLength" to "kotlin.text.setLength", - "setRange" to "kotlin.text.setRange", - "single" to "kotlin.text.single", - "singleOrNull" to "kotlin.text.singleOrNull", - "slice" to "kotlin.text.slice", - "split" to "kotlin.text.split", - "splitToSequence" to "kotlin.text.splitToSequence", - "startsWith" to "kotlin.text.startsWith", - "subSequence" to "kotlin.text.subSequence", - "substring" to "kotlin.text.substring", - "substringAfter" to "kotlin.text.substringAfter", - "substringAfterLast" to "kotlin.text.substringAfterLast", - "substringBefore" to "kotlin.text.substringBefore", - "substringBeforeLast" to "kotlin.text.substringBeforeLast", - "sumBy" to "kotlin.text.sumBy", - "sumByDouble" to "kotlin.text.sumByDouble", - "sumOf" to "kotlin.text.sumOf", - "take" to "kotlin.text.take", - "takeLast" to "kotlin.text.takeLast", - "takeLastWhile" to "kotlin.text.takeLastWhile", - "takeWhile" to "kotlin.text.takeWhile", - "titlecase" to "kotlin.text.titlecase", - "titlecaseChar" to "kotlin.text.titlecaseChar", - "toBigDecimalOrNull" to "kotlin.text.toBigDecimalOrNull", - "toBigIntegerOrNull" to "kotlin.text.toBigIntegerOrNull", - "toBoolean" to "kotlin.text.toBoolean", - "toBooleanStrict" to "kotlin.text.toBooleanStrict", - "toBooleanStrictOrNull" to "kotlin.text.toBooleanStrictOrNull", - "toByte" to "kotlin.text.toByte", - "toByteArray" to "kotlin.text.toByteArray", - "toByteOrNull" to "kotlin.text.toByteOrNull", - "toCharArray" to "kotlin.text.toCharArray", - "toChars" to "kotlin.text.toChars", - "toCodePoint" to "kotlin.text.toCodePoint", - "toCollection" to "kotlin.text.toCollection", - "toDouble" to "kotlin.text.toDouble", - "toDoubleOrNull" to "kotlin.text.toDoubleOrNull", - "toFloat" to "kotlin.text.toFloat", - "toFloatOrNull" to "kotlin.text.toFloatOrNull", - "toHashSet" to "kotlin.text.toHashSet", - "toInt" to "kotlin.text.toInt", - "toIntOrNull" to "kotlin.text.toIntOrNull", - "toLong" to "kotlin.text.toLong", - "toLongOrNull" to "kotlin.text.toLongOrNull", - "toLowerCase" to "kotlin.text.toLowerCase", - "toMutableList" to "kotlin.text.toMutableList", - "toPattern" to "kotlin.text.toPattern", - "toRegex" to "kotlin.text.toRegex", - "toSet" to "kotlin.text.toSet", - "toShort" to "kotlin.text.toShort", - "toShortOrNull" to "kotlin.text.toShortOrNull", - "toSortedSet" to "kotlin.text.toSortedSet", - "toTitleCase" to "kotlin.text.toTitleCase", - "toUByteOrNull" to "kotlin.text.toUByteOrNull", - "toUIntOrNull" to "kotlin.text.toUIntOrNull", - "toULongOrNull" to "kotlin.text.toULongOrNull", - "toUShortOrNull" to "kotlin.text.toUShortOrNull", - "toUpperCase" to "kotlin.text.toUpperCase", - "trim" to "kotlin.text.trim", - "trimEnd" to "kotlin.text.trimEnd", - "trimIndent" to "kotlin.text.trimIndent", - "trimMargin" to "kotlin.text.trimMargin", - "trimStart" to "kotlin.text.trimStart", - "uppercase" to "kotlin.text.uppercase", - "uppercaseChar" to "kotlin.text.uppercaseChar", - "windowed" to "kotlin.text.windowed", - "windowedSequence" to "kotlin.text.windowedSequence", - "withIndex" to "kotlin.text.withIndex", - "zip" to "kotlin.text.zip", - "zipWithNext" to "kotlin.text.zipWithNext" -) diff --git a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinAndroidGradleParserTest.kt b/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinAndroidGradleParserTest.kt deleted file mode 100644 index ca9e956928..0000000000 --- a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinAndroidGradleParserTest.kt +++ /dev/null @@ -1,422 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import com.rickbusarow.kase.DefaultTestEnvironment -import com.rickbusarow.kase.DefaultTestEnvironment.Factory -import com.rickbusarow.kase.Kase1 -import com.rickbusarow.kase.KaseTestFactory -import com.rickbusarow.kase.files.HasWorkingDir -import com.rickbusarow.kase.kases -import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.runBlocking -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.AndroidBlock -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings.AgpBlock.BuildFeaturesBlock -import modulecheck.parsing.gradle.dsl.Assignment -import modulecheck.parsing.kotlin.compiler.NoContextPsiFileFactory -import modulecheck.utils.createSafely -import modulecheck.utils.resolve -import org.jetbrains.kotlin.cli.common.repl.replEscapeLineBreaks -import org.junit.jupiter.api.TestFactory -import java.io.File - -internal class KotlinAndroidGradleParserTest : - KaseTestFactory, com.rickbusarow.kase.TestEnvironment, Factory> { - - override val testEnvironmentFactory = DefaultTestEnvironment.Factory() - - override val params = kases(listOf(true, false), displayNameFactory = { "enabled: $a1" }) - - val HasWorkingDir.testFile: File - get() = workingDir.resolve("build.gradle.kts").createSafely() - - @TestFactory - fun `lots of blocks`() = testFactory { (enabled) -> - - val block = """ - @Suppress("disable-android-buildConfig") - android { - buildFeatures { - viewBinding = $enabled - } - buildFeatures { - buildConfig = $enabled - } - } - android { - buildFeatures { - androidResources = $enabled - } - } - """.trimIndent() - - testFile.writeText(block) - - val viewBindingAssignment = Assignment( - fullText = """ - android { - buildFeatures { - viewBinding = $enabled - } - buildFeatures { - buildConfig = $enabled - } - } - """.trimIndent(), - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "viewBinding = $enabled", - statementWithSurroundingText = "viewBinding = $enabled", - suppressed = listOf("disable-android-buildConfig") - ) - val buildConfigAssignment = Assignment( - fullText = """ - android { - buildFeatures { - viewBinding = $enabled - } - buildFeatures { - buildConfig = $enabled - } - } - """.trimIndent(), - propertyFullName = "buildConfig", - value = "$enabled", - declarationText = "buildConfig = $enabled", - statementWithSurroundingText = "buildConfig = $enabled", - suppressed = listOf("disable-android-buildConfig") - ) - val declarationText1 = "androidResources = $enabled" - val androidResourcesAssignment = Assignment( - fullText = """ - android { - buildFeatures { - androidResources = $enabled - } - } - """.trimIndent(), - propertyFullName = "androidResources", - value = "$enabled", - declarationText = declarationText1, - statementWithSurroundingText = declarationText1, - suppressed = emptyList() - ) - val result = parse(testFile) - - result.assignments shouldContainExactlyInAnyOrder listOf( - viewBindingAssignment, - buildConfigAssignment, - androidResourcesAssignment - ) - - result.androidBlocks shouldContainExactlyInAnyOrder listOf( - AndroidBlock( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n }\n buildFeatures {\n buildConfig = $enabled\n }\n}", - lambdaContent = "buildFeatures {\n viewBinding = $enabled\n }\n buildFeatures {\n buildConfig = $enabled\n }", - settings = listOf( - viewBindingAssignment, - buildConfigAssignment - ), - blockSuppressed = listOf("disable-android-buildConfig") - ), - AndroidBlock( - fullText = "android {\n buildFeatures {\n androidResources = $enabled\n }\n}", - lambdaContent = "buildFeatures {\n androidResources = $enabled\n }", - settings = listOf( - androidResourcesAssignment - ), - blockSuppressed = emptyList() - ) - ) - - result.buildFeaturesBlocks shouldContainExactlyInAnyOrder listOf( - BuildFeaturesBlock( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n }\n buildFeatures {\n buildConfig = $enabled\n }\n}", - lambdaContent = "viewBinding = $enabled", - settings = listOf(viewBindingAssignment), - blockSuppressed = emptyList() - ), - BuildFeaturesBlock( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n }\n buildFeatures {\n buildConfig = $enabled\n }\n}", - lambdaContent = "buildConfig = $enabled", - settings = listOf(buildConfigAssignment), - blockSuppressed = emptyList() - ), - BuildFeaturesBlock( - fullText = "android {\n buildFeatures {\n androidResources = $enabled\n }\n}", - lambdaContent = "androidResources = $enabled", - settings = listOf(androidResourcesAssignment), - blockSuppressed = emptyList() - ) - ) - } - - @TestFactory - fun `fully scoped boolean property`() = testFactory { (enabled) -> - - val block = """ - android { - buildFeatures { - viewBinding = $enabled - androidResources = ${!enabled} - } - } - """.trimIndent() - - testFile.writeText(block) - - parse(testFile) shouldBe run { - val declarationText1 = "viewBinding = $enabled" - val declarationText2 = "androidResources = ${!enabled}" - val declarationText3 = "viewBinding = $enabled" - val declarationText4 = "androidResources = ${!enabled}" - val declarationText5 = "viewBinding = $enabled" - val declarationText6 = "androidResources = ${!enabled}" - AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = declarationText1, - statementWithSurroundingText = declarationText1, - suppressed = emptyList() - ), - Assignment( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - propertyFullName = "androidResources", - value = "${!enabled}", - declarationText = declarationText2, - statementWithSurroundingText = declarationText2, - suppressed = emptyList() - ) - ), - androidBlocks = listOf( - AndroidBlock( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - lambdaContent = "buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }", - settings = listOf( - Assignment( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = declarationText3, - statementWithSurroundingText = declarationText3, - suppressed = emptyList() - ), - Assignment( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - propertyFullName = "androidResources", - value = "${!enabled}", - declarationText = declarationText4, - statementWithSurroundingText = declarationText4, - suppressed = emptyList() - ) - ), - blockSuppressed = emptyList() - ) - ), - buildFeaturesBlocks = listOf( - BuildFeaturesBlock( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - lambdaContent = "viewBinding = $enabled\n androidResources = ${!enabled}", - settings = listOf( - Assignment( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = declarationText5, - statementWithSurroundingText = declarationText5, - suppressed = emptyList() - ), - Assignment( - fullText = "android {\n buildFeatures {\n viewBinding = $enabled\n androidResources = ${!enabled}\n }\n}", - propertyFullName = "androidResources", - value = "${!enabled}", - declarationText = declarationText6, - statementWithSurroundingText = declarationText6, - suppressed = emptyList() - ) - ), - blockSuppressed = emptyList() - ) - ) - ) - } - } - - @TestFactory - fun `fully dot qualified boolean property`() = testFactory { (enabled) -> - - val block = """ - @Suppress("disable-android-resources") - android.buildFeatures.androidResources = $enabled - """.trimIndent() - - testFile.writeText(block) - - parse(testFile) shouldBe AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "android.buildFeatures.androidResources = $enabled", - propertyFullName = "androidResources", - value = "$enabled", - declarationText = "android.buildFeatures.androidResources = $enabled", - statementWithSurroundingText = "android.buildFeatures.androidResources = $enabled", - suppressed = listOf("disable-android-resources") - ) - ), - androidBlocks = emptyList(), - buildFeaturesBlocks = emptyList() - ) - } - - @TestFactory - fun `dot qualified and then scoped boolean property`() = testFactory { (enabled) -> - - val block = """ - android.buildFeatures { - viewBinding = $enabled - } - """.trimIndent() - - testFile.writeText(block) - - parse(testFile) shouldBe run { - val declarationText1 = "viewBinding = $enabled" - val declarationText2 = "viewBinding = $enabled" - AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "android.buildFeatures {\n viewBinding = $enabled\n}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = declarationText1, - statementWithSurroundingText = declarationText1, - suppressed = emptyList() - ) - ), - androidBlocks = emptyList(), - buildFeaturesBlocks = listOf( - BuildFeaturesBlock( - fullText = "android.buildFeatures {\n viewBinding = $enabled\n}", - lambdaContent = "viewBinding = $enabled", - settings = listOf( - Assignment( - fullText = "android.buildFeatures {\n viewBinding = $enabled\n}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = declarationText2, - statementWithSurroundingText = declarationText2, - suppressed = emptyList() - ) - ), - blockSuppressed = emptyList() - ) - ) - ) - } - } - - @TestFactory - fun `scoped and then dot qualified boolean property`() = testFactory { (enabled) -> - - val block = """ - android { - @Suppress("disable-view-binding") - buildFeatures.viewBinding = $enabled - } - """.trimIndent() - - testFile.writeText(block) - - parse(testFile) shouldBe AndroidGradleSettings( - assignments = listOf( - Assignment( - fullText = "android {\n @Suppress(\"disable-view-binding\")\n buildFeatures.viewBinding = $enabled\n}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "buildFeatures.viewBinding = $enabled", - statementWithSurroundingText = "buildFeatures.viewBinding = $enabled", - suppressed = listOf("disable-view-binding") - ) - ), - androidBlocks = listOf( - AndroidBlock( - fullText = "android {\n @Suppress(\"disable-view-binding\")\n buildFeatures.viewBinding = $enabled\n}", - lambdaContent = "@Suppress(\"disable-view-binding\")\n buildFeatures.viewBinding = $enabled", - settings = listOf( - Assignment( - fullText = "android {\n @Suppress(\"disable-view-binding\")\n buildFeatures.viewBinding = $enabled\n}", - propertyFullName = "viewBinding", - value = "$enabled", - declarationText = "buildFeatures.viewBinding = $enabled", - statementWithSurroundingText = "buildFeatures.viewBinding = $enabled", - suppressed = listOf("disable-view-binding") - ) - ), - blockSuppressed = emptyList() - ) - ), - buildFeaturesBlocks = emptyList() - ) - } - - fun parse(file: File) = runBlocking { - KotlinAndroidGradleParser(NoContextPsiFileFactory()).parse(file) - } -} - -fun AndroidGradleSettings.buildSettings() = """ - AndroidGradleSettings( - assignments = ${assignments.buildAssignments()}, - androidBlocks = ${androidBlocks.buildAndroidBlock()}, - buildFeaturesBlocks =${buildFeaturesBlocks.buildBuildFeaturesBlock()} - ) -""".trimIndent() - -fun List.buildBuildFeaturesBlock() = - joinToString(prefix = "listOf(\n", postfix = "\n)") { block -> - """BuildFeaturesBlock( - fullText = "${block.fullText.replEscapeLineBreaks()}", - lambdaContent = "${block.lambdaContent.replEscapeLineBreaks()}", - settings = ${block.settings.buildAssignments()} - ) - """.trimIndent() - } - -fun List.buildAndroidBlock() = - joinToString(prefix = "listOf(\n", postfix = "\n)") { block -> - """AndroidBlock( - fullText = "${block.fullText.replEscapeLineBreaks()}", - lambdaContent = "${block.lambdaContent.replEscapeLineBreaks()}", - settings = ${block.settings.buildAssignments()} - ) - """.trimIndent() - } - -fun List.buildAssignments() = - joinToString(prefix = "listOf(\n", postfix = "\n)") { assignment -> - """Assignment( - fullText = "${assignment.fullText.replEscapeLineBreaks()}", - propertyFullName = "${assignment.propertyFullName.replEscapeLineBreaks()}", - value = "${assignment.value.replEscapeLineBreaks()}", - assignmentText = "${assignment.declarationText.replEscapeLineBreaks()}" - ) - """.trimIndent() - } diff --git a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlockParserTest.kt b/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlockParserTest.kt deleted file mode 100644 index 7e7a8d7e4e..0000000000 --- a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinDependenciesBlockParserTest.kt +++ /dev/null @@ -1,738 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import kotlinx.coroutines.runBlocking -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency.RuntimeProjectDependency -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath -import modulecheck.parsing.gradle.dsl.ExternalDependencyDeclaration -import modulecheck.parsing.gradle.dsl.ModuleDependencyDeclaration -import modulecheck.parsing.gradle.dsl.UnknownDependencyDeclaration -import modulecheck.parsing.kotlin.compiler.NoContextPsiFileFactory -import modulecheck.project.McProject -import modulecheck.project.test.ProjectTest -import modulecheck.project.test.ProjectTestEnvironment -import modulecheck.reporting.logging.PrintLogger -import org.junit.jupiter.api.Test - -internal class KotlinDependenciesBlockParserTest : ProjectTest() { - - val parser: KotlinDependenciesBlockParser - get() = KotlinDependenciesBlockParser( - logger = PrintLogger(), - psiFileFactory = NoContextPsiFileFactory() - ) { configurationName, projectPath, isTestFixture -> - RuntimeProjectDependency(configurationName, projectPath, isTestFixture) - } - - @Test - fun `external declaration`() = test { - val block = parse( - """ - dependencies { - api("com.foo:bar:1.2.3.4") - } - """ - ).single() - - block.settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = """api("com.foo:bar:1.2.3.4")""", - statementWithSurroundingText = """ api("com.foo:bar:1.2.3.4")""", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ) - ) - } - - @Test - fun `string extension configuration functions declaration`() = test { - val block = parse( - """ - dependencies { - "api"(project(path = ":core:jvm")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(path = ":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """"api"(project(path = ":core:jvm"))""", - statementWithSurroundingText = """ "api"(project(path = ":core:jvm"))""" - ) - ) - } - - @Test - fun `declaration's original string should include trailing comment`() = test { - val block = parse( - """ - dependencies { - api(project(":core:jvm")) // trailing comment - api(project(":core:jvm")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:jvm"))""", - statementWithSurroundingText = """ api(project(":core:jvm")) // trailing comment""" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:jvm"))""", - statementWithSurroundingText = """ api(project(":core:jvm"))""" - ) - ) - } - - @Test - fun `suppression which doesn't match finding name regex should be ignored`() = test { - val block = parse( - """ - @Suppress("DSL_SCOPE_VIOLATION") - dependencies { - api(project(":core:android")) - api(project(":core:jvm")) - @Suppress("DSL_SCOPE_VIOLATION") - testImplementation(project(":core:test")) - } - """ - ).single() - - block.allSuppressions.values.flatten() shouldBe emptyList() - } - - @Test - fun `declaration with annotation should include annotation with argument`() = test { - val block = parse( - """ - dependencies { - api(project(":core:android")) - @Suppress("unused-dependency") - api(project(":core:jvm")) - testImplementation(project(":core:test")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = """project(":core:android")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:android"))""", - statementWithSurroundingText = """ api(project(":core:android"))""", - suppressed = emptyList() - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:jvm"))""", - statementWithSurroundingText = """ - | @Suppress("unused-dependency") - | api(project(":core:jvm")) - """.trimMargin(), - suppressed = listOf("unused-dependency") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = """project(":core:test")""", - configName = ConfigurationName.testImplementation, - declarationText = """testImplementation(project(":core:test"))""", - statementWithSurroundingText = """ testImplementation(project(":core:test"))""", - suppressed = emptyList() - ) - ) - } - - @Test - fun `dependency block with Suppress annotation with old IDs should include annotation with argument`() = - test { - val block = parse( - """ - @Suppress("Unused") - dependencies { - api(project(":core:android")) - @Suppress("InheritedDependency") - api(project(":core:jvm")) - testImplementation(project(":core:test")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = """project(":core:android")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:android"))""", - statementWithSurroundingText = """ api(project(":core:android"))""", - suppressed = listOf("unused-dependency") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:jvm"))""", - statementWithSurroundingText = """ - | @Suppress("InheritedDependency") - | api(project(":core:jvm")) - """.trimMargin(), - suppressed = listOf("inherited-dependency", "unused-dependency") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = """project(":core:test")""", - configName = ConfigurationName.testImplementation, - declarationText = """testImplementation(project(":core:test"))""", - statementWithSurroundingText = """ testImplementation(project(":core:test"))""", - suppressed = listOf("unused-dependency") - ) - ) - } - - @Test - fun `dependency block with Suppress annotation should include annotation with argument`() = test { - val block = parse( - """ - @Suppress("unused-dependency") - dependencies { - api(project(":core:android")) - @Suppress("inherited-dependency") - api(project(":core:jvm")) - testImplementation(project(":core:test")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = """project(":core:android")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:android"))""", - statementWithSurroundingText = """ api(project(":core:android"))""", - suppressed = listOf("unused-dependency") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:jvm"))""", - statementWithSurroundingText = """ - | @Suppress("inherited-dependency") - | api(project(":core:jvm")) - """.trimMargin(), - suppressed = listOf("inherited-dependency", "unused-dependency") - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = """project(":core:test")""", - configName = ConfigurationName.testImplementation, - declarationText = """testImplementation(project(":core:test"))""", - statementWithSurroundingText = " testImplementation(project(\":core:test\"))", - suppressed = listOf("unused-dependency") - ) - ) - } - - @Test - fun `blank line between dependencies`() = test { - val block = parse( - """ - dependencies { - api(testFixtures(project(":lib1"))) - - api(testFixtures(project(":lib2"))) - implementation(testFixtures(project(":lib3"))) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":lib1"), - projectAccessor = """project(":lib1")""", - configName = ConfigurationName.api, - declarationText = """api(testFixtures(project(":lib1")))""", - statementWithSurroundingText = """ api(testFixtures(project(":lib1")))""" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":lib2"), - projectAccessor = """project(":lib2")""", - configName = ConfigurationName.api, - declarationText = """api(testFixtures(project(":lib2")))""", - statementWithSurroundingText = """| - | api(testFixtures(project(":lib2"))) - """.trimMargin() - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":lib3"), - projectAccessor = """project(":lib3")""", - configName = ConfigurationName.implementation, - declarationText = """implementation(testFixtures(project(":lib3")))""", - statementWithSurroundingText = """ implementation(testFixtures(project(":lib3")))""" - ) - ) - } - - @Test - fun `string module dependency declaration with testFixtures should be parsed`() = test { - val block = parse( - """ - dependencies { - api(testFixtures(project(":core:jvm"))) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(testFixtures(project(":core:jvm")))""", - statementWithSurroundingText = """ api(testFixtures(project(":core:jvm")))""" - ) - ) - } - - @Test - fun `module dependency with commented out dependency above it`() = test { - val block = parse( - """ - dependencies { - // api(project(":core:dagger")) - api(testFixtures(project(":core:jvm"))) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(testFixtures(project(":core:jvm")))""", - statementWithSurroundingText = " // api(project(\":core:dagger\"))\n" + - " api(testFixtures(project(\":core:jvm\")))" - ) - ) - } - - @Test - fun `module dependency with commented out dependency from previous finding above it`() = test { - val block = parse( - """ - dependencies { - // api(project(":core:dagger")) // ModuleCheck finding [unused-dependency] - api(testFixtures(project(":core:jvm"))) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(testFixtures(project(":core:jvm")))""", - statementWithSurroundingText = """ api(testFixtures(project(":core:jvm")))""" - ) - ) - } - - @Test - fun `type-safe module dependency declaration with testFixtures should be parsed`() = test { - val block = parse( - """ - dependencies { - api(testFixtures(projects.core.jvm)) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = TypeSafeProjectPath("core.jvm"), - projectAccessor = "projects.core.jvm", - configName = ConfigurationName.api, - declarationText = """api(testFixtures(projects.core.jvm))""", - statementWithSurroundingText = """ api(testFixtures(projects.core.jvm))""" - ) - ) - } - - @Test - fun `module dependency with config block should split declarations properly`() = test { - val block = parse( - """ - dependencies { - api(project(":core:test")) { - exclude(group = "androidx.appcompat") - } - - api(project(":core:jvm")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = """project(":core:test")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:test")) { - | exclude(group = "androidx.appcompat") - | } - """.trimMargin(), - statementWithSurroundingText = """ - | api(project(":core:test")) { - | exclude(group = "androidx.appcompat") - | } - """.trimMargin() - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = "api(project(\":core:jvm\"))", - statementWithSurroundingText = "\n api(project(\":core:jvm\"))" - ) - ) - } - - @Test - fun `module dependency with config block and preceding declaration should split declarations properly`() = - test { - val block = parse( - """ - dependencies { - api(project(":core:jvm")) - - api(project(":core:test")) { - exclude(group = "androidx.appcompat") - } - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = "api(project(\":core:jvm\"))", - statementWithSurroundingText = " api(project(\":core:jvm\"))" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = """project(":core:test")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:test")) { - | exclude(group = "androidx.appcompat") - | } - """.trimMargin(), - statementWithSurroundingText = """ - - | api(project(":core:test")) { - | exclude(group = "androidx.appcompat") - | } - """.trimMargin() - ) - ) - } - - @Test - fun `module dependency with preceding blank line should preserve the blank line`() = test { - val block = parse( - """ - dependencies { - api(project(":core:test")) - - api(project(":core:jvm")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:test"), - projectAccessor = """project(":core:test")""", - configName = ConfigurationName.api, - declarationText = "api(project(\":core:test\"))", - statementWithSurroundingText = " api(project(\":core:test\"))" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = "api(project(\":core:jvm\"))", - statementWithSurroundingText = "\n api(project(\":core:jvm\"))" - ) - ) - } - - @Test - fun `module dependency with two different configs should be recorded twice`() = test { - val block = parse( - """ - dependencies { - implementation(project(":core:jvm")) - api(project(":core:jvm")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.implementation, - declarationText = """implementation(project(":core:jvm"))""", - statementWithSurroundingText = """ implementation(project(":core:jvm"))""" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:jvm"))""", - statementWithSurroundingText = """ api(project(":core:jvm"))""" - ) - ) - } - - @Test - fun `declaration's original string should include preceding single-line comment`() = test { - val block = parse( - """ - dependencies { - api("com.foo:bar:1.2.3.4") // inline comment - - // single-line comment - implementation(project(":core:android")) - } - """ - ).single() - - block.settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = """api("com.foo:bar:1.2.3.4")""", - statementWithSurroundingText = """ api("com.foo:bar:1.2.3.4") // inline comment""", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = """project(":core:android")""", - configName = ConfigurationName.implementation, - declarationText = """implementation(project(":core:android"))""", - statementWithSurroundingText = """ - - | // single-line comment - | implementation(project(":core:android")) - """.trimMargin() - ) - ) - } - - @Test - fun `declaration's original string should include preceding block comment`() = test { - val block = parse( - """ - dependencies { - api("com.foo:bar:1.2.3.4") // inline comment - - /* - block comment - */ - implementation(project(":core:android")) - } - """ - ).single() - - block.settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = """api("com.foo:bar:1.2.3.4")""", - statementWithSurroundingText = """ api("com.foo:bar:1.2.3.4") // inline comment""", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = """project(":core:android")""", - configName = ConfigurationName.implementation, - declarationText = """implementation(project(":core:android"))""", - statementWithSurroundingText = """ - - | /* - | block comment - | */ - | implementation(project(":core:android")) - """.trimMargin() - ) - ) - } - - @Test - fun `declaration's original string should include preceding in-line block comment`() = test { - val block = parse( - """ - dependencies { - api("com.foo:bar:1.2.3.4") // inline comment - /* single-line block comment */ implementation(project(":core:android")) - } - """ - ).single() - - block.settings shouldBe listOf( - ExternalDependencyDeclaration( - configName = ConfigurationName.api, - declarationText = """api("com.foo:bar:1.2.3.4")""", - statementWithSurroundingText = """ api("com.foo:bar:1.2.3.4") // inline comment""", - group = "com.foo", - moduleName = "bar", - version = "1.2.3.4" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:android"), - projectAccessor = """project(":core:android")""", - configName = ConfigurationName.implementation, - declarationText = """implementation(project(":core:android"))""", - statementWithSurroundingText = """ /* single-line block comment */ implementation(project(":core:android"))""" - ) - ) - } - - @Test - fun `duplicate module dependency with same config should be recorded twice`() = test { - val block = parse( - """ - dependencies { - api(project(":core:jvm")) - api ( project(":core:jvm")) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api(project(":core:jvm"))""", - statementWithSurroundingText = """ api(project(":core:jvm"))""" - ), - ModuleDependencyDeclaration( - projectPath = StringProjectPath(":core:jvm"), - projectAccessor = """project(":core:jvm")""", - configName = ConfigurationName.api, - declarationText = """api ( project(":core:jvm"))""", - statementWithSurroundingText = """ api ( project(":core:jvm"))""" - ) - ) - } - - @Test - fun `modules declared using type-safe accessors can be looked up using their path`() = test { - val block = parse( - """ - dependencies { - api(projects.core.test) - implementation(projects.httpLogging) - } - """ - ).single() - - block.settings shouldBe listOf( - ModuleDependencyDeclaration( - projectPath = TypeSafeProjectPath("core.test"), - projectAccessor = "projects.core.test", - configName = ConfigurationName.api, - declarationText = """api(projects.core.test)""", - statementWithSurroundingText = """ api(projects.core.test)""" - ), - ModuleDependencyDeclaration( - projectPath = TypeSafeProjectPath("httpLogging"), - projectAccessor = "projects.httpLogging", - configName = ConfigurationName.implementation, - declarationText = """implementation(projects.httpLogging)""", - statementWithSurroundingText = """ implementation(projects.httpLogging)""" - ) - ) - } - - @Test - fun `buildscript dependencies should not be parsed`() = test { - val block = parse( - """ - buildscript { - repositories { - mavenCentral() - google() - jcenter() - maven("https://plugins.gradle.org/m2/") - maven("https://oss.sonatype.org/content/repositories/snapshots") - } - dependencies { - classpath("com.android.tools.build:gradle:7.0.2") - classpath("com.squareup.anvil:gradle-plugin:2.3.4") - classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.30") - } - } - dependencies { - api(libs.ktlint) - } - - """ - ).single() - - block.settings shouldBe listOf( - UnknownDependencyDeclaration( - argument = "libs.ktlint", - configName = ConfigurationName.api, - declarationText = "api(libs.ktlint)", - statementWithSurroundingText = " api(libs.ktlint)" - ) - ) - } - - fun ProjectTestEnvironment.parse( - string: String, - project: McProject = simpleProject(buildFileText = string.trimIndent()) - ): List { - return runBlocking { parser.parse(project) } - } -} diff --git a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinFileTest.kt b/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinFileTest.kt deleted file mode 100644 index d149fee001..0000000000 --- a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinFileTest.kt +++ /dev/null @@ -1,1950 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import kotlinx.coroutines.flow.single -import modulecheck.api.context.jvmFiles -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.PackageName.Companion.asPackageName -import modulecheck.parsing.test.McNameTest -import modulecheck.project.McProject -import modulecheck.project.test.ProjectTest -import modulecheck.project.test.ProjectTestEnvironment -import org.junit.jupiter.api.Disabled -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test - -internal class KotlinFileTest : ProjectTest(), McNameTest { - - override val defaultLanguage: CompatibleLanguage - get() = KOTLIN - - val ProjectTestEnvironment.lib1: McProject - get() = kotlinProject(":lib1") { - addKotlinSource( - """ - package com.lib1 - - class Lib1Class - """ - ) - } - - val ProjectTestEnvironment.project: McProject - get() = kotlinProject(":subject") { - addDependency(ConfigurationName.api, lib1) - } - - val McNameTest.JvmFileBuilder.ReferenceBuilder.lib1Class - get() = kotlin("com.lib1.Lib1Class") - - @Test - fun `fully qualified annotated primary constructor arguments should be injected`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib1.Lib1Class - - class SubjectClass @javax.inject.Inject constructor( - val lib1Class: Lib1Class - ) - """ - ) - - file shouldBeJvmFile { - references { - - lib1Class - - kotlin("Inject") - kotlin("com.subject.Inject") - kotlin("com.subject.inject") - kotlin("com.subject.javax") - kotlin("com.subject.javax.inject.Inject") - kotlin("inject") - kotlin("javax") - kotlin("javax.inject.Inject") - } - apiReferences { - - lib1Class - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.lib1Class") - java("com.subject.SubjectClass.getLib1Class") - } - } - } - - @Test - fun `fully qualified annotated secondary constructor arguments should be injected`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib1.Lib1Class - - class SubjectClass { - val lib1Class: Lib1Class - - @javax.inject.Inject - constructor(lib1Class: Lib1Class) { - this.lib1Class = lib1Class - } - } - """ - ) - - file shouldBeJvmFile { - references { - - lib1Class - kotlin("com.subject.SubjectClass.lib1Class") - - kotlin("Inject") - kotlin("com.subject.Inject") - kotlin("com.subject.inject") - kotlin("com.subject.javax") - kotlin("com.subject.javax.inject.Inject") - kotlin("com.subject.this") - kotlin("com.subject.this.lib1Class") - kotlin("inject") - kotlin("javax") - kotlin("javax.inject.Inject") - kotlin("this") - kotlin("this.lib1Class") - } - apiReferences { - - lib1Class - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.lib1Class") - java("com.subject.SubjectClass.getLib1Class") - } - } - } - - @Test - fun `imported annotated primary constructor arguments should be injected`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib1.Lib1Class - import javax.inject.Inject - - class SubjectClass @Inject constructor( - val lib1Class: Lib1Class - ) - """ - ) - - file shouldBeJvmFile { - references { - - lib1Class - kotlin("javax.inject.Inject") - } - apiReferences { - - lib1Class - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.lib1Class") - java("com.subject.SubjectClass.getLib1Class") - } - } - } - - @Test - fun `wildcard-imported annotated primary constructor arguments should be injected`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib1.* - import javax.inject.Inject - - class SubjectClass @Inject constructor( - val lib1Class: Lib1Class - ) - """ - ) - - file shouldBeJvmFile { - references { - - kotlin("com.lib1.Lib1Class") - kotlin("javax.inject.Inject") - } - apiReferences { - - kotlin("com.lib1.Lib1Class") - } - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.lib1Class") - java("com.subject.SubjectClass.getLib1Class") - } - } - } - - @Test - fun `fully qualified arguments in annotated primary constructor should be injected`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import javax.inject.Inject - - class SubjectClass @Inject constructor( - val lib1Class: com.lib1.Lib1Class - ) - """ - ) - - file shouldBeJvmFile { - references { - - kotlin("com") - kotlin("com.lib1.Lib1Class") - kotlin("com.subject.com") - kotlin("com.subject.lib1") - kotlin("javax.inject.Inject") - kotlin("lib1") - } - apiReferences { - - kotlin("com") - kotlin("com.lib1.Lib1Class") - kotlin("com.subject.com") - kotlin("com.subject.lib1") - kotlin("lib1") - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.lib1Class") - java("com.subject.SubjectClass.getLib1Class") - } - } - } - - @Test - fun `imported annotated secondary constructor arguments should be injected`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib1.Lib1Class - import javax.inject.Inject - - class SubjectClass { - val lib1Class: Lib1Class - - @Inject - constructor(lib1Class: Lib1Class) { - this.lib1Class = lib1Class - } - } - """ - ) - - file shouldBeJvmFile { - references { - - lib1Class - kotlin("javax.inject.Inject") - kotlin("com.subject.SubjectClass.lib1Class") - - kotlin("com.subject.this") - kotlin("com.subject.this.lib1Class") - kotlin("this") - kotlin("this.lib1Class") - } - apiReferences { - - lib1Class - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.lib1Class") - java("com.subject.SubjectClass.getLib1Class") - } - } - } - - @Test - fun `arguments from overloaded constructor without annotation should not be injected`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib1.Lib1Class - import org.jetbrains.kotlin.name.FqName - import javax.inject.Inject - - class SubjectClass @Inject constructor( - val lib1Class: Lib1Class - ) { - - constructor(lib1Class: Lib1Class, other: FqName) : this(lib1Class) - } - """ - ) - - file shouldBeJvmFile { - references { - - lib1Class - kotlin("org.jetbrains.kotlin.name.FqName") - kotlin("javax.inject.Inject") - kotlin("com.subject.SubjectClass.lib1Class") - } - apiReferences { - - lib1Class - kotlin("org.jetbrains.kotlin.name.FqName") - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.lib1Class") - java("com.subject.SubjectClass.getLib1Class") - } - } - } - - @Test - fun `api references should not include concatenated matches if the reference is already imported`() = - test { - val project = androidLibrary(":subject", "com.subject") - - val file = project.createKotlinFile( - """ - package com.subject - - import androidx.lifecycle.ViewModel - import com.modulecheck.ResourceProvider - - class MyViewModel( - private val resourceProvider: ResourceProvider - ) : ViewModel() { - - fun someFunction() { - viewEffect(resourceProvider.getString(R.string.google_places_api_key)) - } - } - """ - ) - - file shouldBeJvmFile { - references { - androidR("com.subject".asPackageName()) - - kotlin("androidx.lifecycle.ViewModel") - kotlin("com.modulecheck.ResourceProvider") - - kotlin("com.subject.resourceProvider.getString") - kotlin("com.subject.viewEffect") - kotlin("resourceProvider.getString") - kotlin("viewEffect") - - qualifiedAndroidResource("com.subject.R.string.google_places_api_key") - unqualifiedAndroidResource("R.string.google_places_api_key") - } - apiReferences { - - kotlin("androidx.lifecycle.ViewModel") - kotlin("com.modulecheck.ResourceProvider") - } - - declarations { - agnostic("com.subject.MyViewModel") - agnostic("com.subject.MyViewModel.someFunction") - } - } - } - - @Test - fun `explicit type of public property in public class should be api reference`() = test { - - val project = androidLibrary(":subject", "com.subject") - - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib.Config - - class SubjectClass { - - val config : Config = ConfigImpl( - googleApiKey = getString(R.string.google_places_api_key), - ) - } - """ - ) - - file shouldBeJvmFile { - references { - androidR("com.subject".asPackageName()) - - kotlin("com.lib.Config") - - kotlin("ConfigImpl") - kotlin("com.subject.ConfigImpl") - kotlin("com.subject.getString") - kotlin("com.subject.googleApiKey") - kotlin("getString") - kotlin("googleApiKey") - - qualifiedAndroidResource("com.subject.R.string.google_places_api_key") - unqualifiedAndroidResource("R.string.google_places_api_key") - } - apiReferences { - - kotlin("com.lib.Config") - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.config") - java("com.subject.SubjectClass.getConfig") - } - } - } - - @Test - fun `named companion object and function should also have declarations using original class name`() = - test { - - val project = kotlinProject(":subject") - - val file = project.createKotlinFile( - """ - package com.subject - - class SubjectClass { - - companion object Factory { - fun create() = SubjectClass() - } - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("com.subject.SubjectClass") - } - declarations { - agnostic("com.subject.SubjectClass") - agnostic("com.subject.SubjectClass.Factory") - agnostic("com.subject.SubjectClass.Factory.create") - kotlin("com.subject.SubjectClass.create") - } - } - } - - @Test - fun `explicit fully qualified type of public property in public class should be api reference`() = - test { - - val project = androidLibrary(":subject", "com.subject") - - val file = project.createKotlinFile( - """ - package com.subject - - class SubjectClass { - - val config : com.lib.Config = ConfigImpl( - googleApiKey = getString(R.string.google_places_api_key), - ) - } - """ - ) - - file shouldBeJvmFile { - references { - androidR("com.subject".asPackageName()) - - kotlin("Config") - kotlin("ConfigImpl") - kotlin("com") - kotlin("com.lib.Config") - kotlin("com.subject.Config") - kotlin("com.subject.ConfigImpl") - kotlin("com.subject.com") - kotlin("com.subject.com.lib.Config") - kotlin("com.subject.getString") - kotlin("com.subject.googleApiKey") - kotlin("com.subject.lib") - kotlin("getString") - kotlin("googleApiKey") - kotlin("lib") - - qualifiedAndroidResource("com.subject.R.string.google_places_api_key") - unqualifiedAndroidResource("R.string.google_places_api_key") - } - apiReferences { - - kotlin("com.lib.Config") - kotlin("com.subject.com.lib.Config") - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.config") - java("com.subject.SubjectClass.getConfig") - } - } - } - - @Test - fun `explicit type of public property in internal class should not be api reference`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib.Config - - internal class SubjectClass { - - val config : Config = ConfigImpl( - googleApiKey = getString(R.string.google_places_api_key), - ) - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("com.lib.Config") - - kotlin("ConfigImpl") - kotlin("com.subject.ConfigImpl") - kotlin("com.subject.getString") - kotlin("com.subject.googleApiKey") - kotlin("getString") - kotlin("googleApiKey") - - unqualifiedAndroidResource("R.string.google_places_api_key") - } - apiReferences { - } - - declarations { - // TODO These should be declared, but with `internal` visibility somehow - // https://github.com/RBusarow/ModuleCheck/issues/531 - // agnostic("com.subject.SubjectClass") - // agnostic("com.subject.SubjectClass.config") - } - } - } - - @Test - fun `implicit type of public property in public class should be api reference`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib.Config - - class SubjectClass { - - val config = Config( - googleApiKey = getString(R.string.google_places_api_key), - ) - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("com.lib.Config") - - kotlin("com.subject.getString") - kotlin("com.subject.googleApiKey") - kotlin("getString") - kotlin("googleApiKey") - - unqualifiedAndroidResource("R.string.google_places_api_key") - } - apiReferences { - kotlin("com.lib.Config") - } - - declarations { - agnostic("com.subject.SubjectClass") - kotlin("com.subject.SubjectClass.config") - java("com.subject.SubjectClass.getConfig") - } - } - } - - @Test - fun `file with JvmName annotation should count as declaration`() = test { - val file = project.createKotlinFile( - """ - @file:JvmName("SubjectFile") - package com.subject - - fun someFunction() = Unit - - val someProperty = "" - val someProperty2 - @JvmName("alternateGetter") get() = "" - val someProperty3 - get() = "" - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmName") - } - - declarations { - kotlin("com.subject.someFunction") - java("com.subject.SubjectFile.someFunction") - kotlin("com.subject.someProperty") - java("com.subject.SubjectFile.getSomeProperty") - kotlin("com.subject.someProperty2") - java("com.subject.SubjectFile.alternateGetter") - kotlin("com.subject.someProperty3") - java("com.subject.SubjectFile.getSomeProperty3") - } - } - } - - @Test - fun `file with JvmName annotation should not have alternate names for type declarations`() = - test { - val file = project.createKotlinFile( - """ - @file:JvmName("SubjectFile") - package com.subject - - class SubjectClass - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.jvm.JvmName") - } - declarations { - agnostic(name = "com.subject.SubjectClass") - } - } - } - - @Test - fun `file without JvmName should have alternate names for top-level functions`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - fun someFunction() = Unit - - val someProperty = "" - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - } - declarations { - kotlin("com.subject.someFunction") - java("com.subject.SourceKt.someFunction") - kotlin("com.subject.someProperty") - java("com.subject.SourceKt.getSomeProperty") - } - } - } - - @Test - fun `val property with is- prefix should not have get-prefix for java method`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - val isAProperty = true - """ - ) - - file shouldBeJvmFile { - declarations { - kotlin("com.subject.isAProperty") - java("com.subject.SourceKt.isAProperty") - } - } - } - - @Test - fun `var property with is- prefix should have set- prefix and no is- for java method`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - var isAProperty = true - """ - ) - - file shouldBeJvmFile { - declarations { - kotlin("com.subject.isAProperty") - java("com.subject.SourceKt.isAProperty") - java("com.subject.SourceKt.setAProperty") - } - } - } - - @Test - fun `var property with explicit accessors and is- prefix should have set- prefix and no is- for java method`() = - test { - val file = project.createKotlinFile( - """ - package com.subject - - var isAProperty = true - public get - public set - """ - ) - - file shouldBeJvmFile { - declarations { - kotlin("com.subject.isAProperty") - java("com.subject.SourceKt.isAProperty") - java("com.subject.SourceKt.setAProperty") - } - } - } - - @Test - fun `is- prefix should not be removed if the following character is a lowercase letter`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - var isaProperty = true - """ - ) - - file shouldBeJvmFile { - declarations { - kotlin("com.subject.isaProperty") - java("com.subject.SourceKt.getIsaProperty") - java("com.subject.SourceKt.setIsaProperty") - } - } - } - - @Test - fun `is- should not be removed if it's not at the start of the name`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - var _isAProperty = true - """ - ) - - file shouldBeJvmFile { - declarations { - kotlin("com.subject._isAProperty") - java("com.subject.SourceKt.get_isAProperty") - java("com.subject.SourceKt.set_isAProperty") - } - } - } - - @Test - fun `file without JvmName should not have alternate names for type declarations`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - class SubjectClass - """ - ) - - file shouldBeJvmFile { - declarations { - agnostic("com.subject.SubjectClass") - } - } - } - - @Test - fun `object should have alternate name with INSTANCE`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils - """ - ) - - file shouldBeJvmFile { - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - } - } - } - - @Test - fun `companion object should have alternate name for both with Companion`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - class SomeClass { - companion object - } - """ - ) - - file shouldBeJvmFile { - declarations { - agnostic("com.subject.SomeClass") - agnostic("com.subject.SomeClass.Companion") - } - } - } - - @Nested - inner class `extensions` { - - @Test - fun `top-level extension property declaration`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - val String.vowels get() = replace("[^aeiou]".toRegex(),"") - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.String") - kotlin("kotlin.text.replace") - - // TODO this is all definitely wrong - kotlin("\"[^aeiou]\".toRegex") - kotlin("com.subject.\"[^aeiou]\".toRegex") - } - - apiReferences { - kotlin("kotlin.String") - } - - declarations { - kotlin("com.subject.vowels") - java("com.subject.SourceKt.getVowels") - } - } - } - - @Disabled - @Test - fun `top-level extension property reference from String literal`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - val String.vowels get() = replace("[^aeiou]".toRegex(),"") - - val someVowels = "some string".vowels - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.String") - kotlin("kotlin.text.replace") - - // TODO this is all definitely wrong - kotlin("\"[^aeiou]\".toRegex") - kotlin("com.subject.\"[^aeiou]\".toRegex") - } - - apiReferences { - kotlin("kotlin.String") - } - - declarations { - kotlin("com.subject.foo") - kotlin("com.subject.vowels") - java("com.subject.SourceKt.foo") - java("com.subject.SourceKt.getVowels") - } - } - } - - @Disabled - @Test - fun `top-level extension function`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - fun String.vowels() = replace("[^aeiou]".toRegex(),"") - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.String") - kotlin("kotlin.text.replace") - - // TODO this is all definitely wrong - kotlin("\"[^aeiou]\".toRegex") - kotlin("com.subject.\"[^aeiou]\".toRegex") - } - - apiReferences { - kotlin("kotlin.String") - } - - declarations { - java("com.subject.SourceKt.getVowels") - - kotlin("com.subject.vowels") - } - } - } - - @Disabled - @Test - fun `extension property reference from variable`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - val String.vowels get() = replace("[^aeiou]".toRegex(),"") - - fun foo(someString: String) { - val someVowels = someString.vowels - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.String") - kotlin("kotlin.text.replace") - - // TODO this is all definitely wrong - // interpretedKotlin("\"[^aeiou]\".toRegex") - // interpretedKotlin("com.subject.\"[^aeiou]\".toRegex") - // interpretedKotlin("com.subject.someString.vowels") - // interpretedKotlin("someString.vowels") - } - - apiReferences { - kotlin("kotlin.String") - } - - declarations { - kotlin("com.subject.vowels") - java("com.subject.SourceKt.vowels") - } - } - } - } - - @Test - fun `class with name wrapped in backticks is allowed`() = test { - - val file = project.createKotlinFile( - """ - package com.subject - - class `outer in backticks` { - inner class `inner in backticks` { - fun `function in backticks`() { } - } - } - """ - ) - - file shouldBeJvmFile { - declarations { - kotlin( - "`outer in backticks`.`inner in backticks`.`function in backticks`", - packageName = "com.subject".asPackageName() - ) - kotlin("`outer in backticks`", packageName = "com.subject".asPackageName()) - kotlin( - "`outer in backticks`.`inner in backticks`", - packageName = "com.subject".asPackageName() - ) - } - } - } - - @Test - fun `function with name wrapped in backticks is allowed`() = test { - - val file = project.createKotlinFile( - """ - import com.lib1.Lib1Class - - class Subject { - fun `name in backticks`() = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("com.lib1.Lib1Class") - kotlin("kotlin.Unit") - } - - declarations { - agnostic("Subject", packageName = PackageName(null)) - kotlin("Subject.`name in backticks`", packageName = PackageName(null)) - } - } - } - - @Test - fun `file without package should put declarations at the root`() = test { - - val file = project.createKotlinFile( - """ - import com.lib1.Lib1Class - - class Subject { - private val lib1Class = Lib1Class() - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("com.lib1.Lib1Class") - } - - declarations { - agnostic("Subject", packageName = PackageName(null)) - } - } - } - - @Test - fun `top-level function with JvmName annotation should have alternate name`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - @JvmName("alternate") - fun someFunction() = Unit - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmName") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.someFunction") - java("com.subject.SourceKt.alternate") - } - } - } - - @Disabled - @Test - fun `top-level expression inferred function return type should be api reference`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.lib1.Lib1Class - - fun someFunction() = Lib1Class() - """ - ) - - file shouldBeJvmFile { - references { - lib1Class - } - - apiReferences { - lib1Class - } - - declarations { - kotlin("com.subject.someFunction") - java("com.subject.SourceKt.someFunction") - } - } - } - - @Test - fun `import alias reference which is continued should be inlined to the normal fully qualified reference`() = - test { - val file = project.createKotlinFile( - """ - package com.subject - - import com.modulecheck.lib1.R as Lib1R - - val appName = Lib1R.string.app_name - """ - ) - - file shouldBeJvmFile { - references { - kotlin("com.modulecheck.lib1.R") - kotlin("com.modulecheck.lib1.R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.appName") - java("com.subject.SourceKt.getAppName") - } - } - } - - @Test - fun `import alias reference without further selectors should be inlined to the normal fully qualified reference`() = - test { - - val file = project.createKotlinFile( - """ - package com.subject - - import com.modulecheck.lib1.foo as lib1Foo - - val property = lib1Foo() - """ - ) - - file shouldBeJvmFile { - references { - kotlin("com.modulecheck.lib1.foo") - } - - apiReferences { - // TODO this is wrong - kotlin("com.modulecheck.lib1.foo") - } - - declarations { - kotlin("com.subject.property") - java("com.subject.SourceKt.getProperty") - } - } - } - - @Nested - inner class `inside companion object -- function` { - - @Test - fun `companion object function`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - class SomeClass { - companion object { - fun someFunction() = Unit - } - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.SomeClass") - agnostic("com.subject.SomeClass.Companion") - agnostic("com.subject.SomeClass.Companion.someFunction") - kotlin("com.subject.SomeClass.someFunction") - } - } - } - - @Test - fun `companion object with JvmStatic should have alternate name`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - class SomeClass { - companion object { - @JvmStatic - fun someFunction() = Unit - } - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmStatic") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.SomeClass") - agnostic("com.subject.SomeClass.Companion") - agnostic("com.subject.SomeClass.Companion.someFunction") - agnostic("com.subject.SomeClass.someFunction") - } - } - } - } - - @Nested - inner class `inside object -- property` { - - @Test - fun `object property with default setter and getter`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - - var property = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - kotlin("com.subject.Utils.property") - java("com.subject.Utils.INSTANCE.getProperty") - java("com.subject.Utils.INSTANCE.setProperty") - } - } - } - - @Test - fun `object property with JvmStatic and default setter and getter`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - - @JvmStatic var property = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmStatic") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - kotlin("com.subject.Utils.property") - java("com.subject.Utils.getProperty") - java("com.subject.Utils.setProperty") - java("com.subject.Utils.INSTANCE.getProperty") - java("com.subject.Utils.INSTANCE.setProperty") - } - } - } - - @Test - fun `object property with JvmName setter and getter`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - - var property = Unit - @JvmName("alternateGetter") get - @JvmName("alternateSetter") set - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmName") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - kotlin("com.subject.Utils.property") - java("com.subject.Utils.INSTANCE.alternateGetter") - java("com.subject.Utils.INSTANCE.alternateSetter") - } - } - } - - @Test - fun `object JvmStatic property with default setter and getter`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - - @JvmStatic - var property = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmStatic") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - kotlin("com.subject.Utils.property") - java("com.subject.Utils.getProperty") - java("com.subject.Utils.INSTANCE.getProperty") - java("com.subject.Utils.setProperty") - java("com.subject.Utils.INSTANCE.setProperty") - } - } - } - - @Test - fun `object JvmStatic property with JvmName setter and getter`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - - @JvmStatic - var property = Unit - @JvmName("alternateGetter") get - @JvmName("alternateSetter") set - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmName") - kotlin("kotlin.jvm.JvmStatic") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - kotlin("com.subject.Utils.property") - java("com.subject.Utils.alternateGetter") - java("com.subject.Utils.INSTANCE.alternateGetter") - java("com.subject.Utils.alternateSetter") - java("com.subject.Utils.INSTANCE.alternateSetter") - } - } - } - } - - @Nested - inner class `inside object -- function` { - - @Test - fun `object function`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - - fun someFunction() = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - kotlin("com.subject.Utils.someFunction") - java("com.subject.Utils.INSTANCE.someFunction") - } - } - } - - @Test - fun `object JvmStatic function`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - @JvmStatic - fun someFunction() = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmStatic") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - agnostic("com.subject.Utils.someFunction") - java("com.subject.Utils.INSTANCE") - java("com.subject.Utils.INSTANCE.someFunction") - java("com.subject.Utils.someFunction") - } - } - } - - @Test - fun `object JvmStatic function with JvmName`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - @JvmStatic - @JvmName("alternate") - fun someFunction() = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmName") - kotlin("kotlin.jvm.JvmStatic") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - java("com.subject.Utils.alternate") - java("com.subject.Utils.INSTANCE.alternate") - kotlin("com.subject.Utils.someFunction") - } - } - } - - @Test - fun `object function with JvmName`() = test { - val file = project.createKotlinFile( - """ - package com.subject - - object Utils { - @JvmName("alternate") - fun someFunction() = Unit - } - """ - ) - - file shouldBeJvmFile { - references { - kotlin("kotlin.Unit") - kotlin("kotlin.jvm.JvmName") - } - - apiReferences { - } - - declarations { - agnostic("com.subject.Utils") - java("com.subject.Utils.INSTANCE") - kotlin("com.subject.Utils.someFunction") - java("com.subject.Utils.INSTANCE.alternate") - } - } - } - } - - @Nested - inner class `Android resource references` { - - @Test - fun `unqualified android resource reference in base package`() = test { - - val androidProject = androidLibrary(":subject", "com.subject") - - val file = androidProject.createKotlinFile( - """ - package com.subject - - val someString = R.string.app_name - """ - ) - - file shouldBeJvmFile { - references { - unqualifiedAndroidResource("R.string.app_name") - androidR("com.subject".asPackageName()) - qualifiedAndroidResource("com.subject.R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.someString") - java("com.subject.SourceKt.getSomeString") - } - } - } - - @Test - fun `unqualified android resource reference with R import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - - addKotlinSource( - """ - package com.subject - - import com.modulecheck.other.R - - val someString = R.string.app_name - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - references { - androidR("com.modulecheck.other".asPackageName()) - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.someString") - java("com.subject.SourceKt.getSomeString") - } - } - } - - @Test - fun `android resource reference with R string import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - - addKotlinSource( - """ - package com.subject - - import com.modulecheck.other.R.string - - val someString = string.app_name - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - references { - androidR("com.modulecheck.other".asPackageName()) - kotlin("com.modulecheck.other.R.string") - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.someString") - java("com.subject.SourceKt.getSomeString") - } - } - } - - @Test - fun `android resource reference with wildcard R import in base package`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - - addKotlinSource( - """ - package com.subject - - import com.modulecheck.other.* - - val someString = R.string.app_name - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - references { - - androidR("com.subject".asPackageName()) - qualifiedAndroidResource("com.subject.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.someString") - java("com.subject.SourceKt.getSomeString") - } - } - } - - @Test - fun `android resource reference with wildcard R import not in base package`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - - addKotlinSource( - """ - package com.subject.internal - - import com.modulecheck.other.* - - val someString = R.string.app_name - """ - ) - } - - val file = project.jvmFiles().get(SourceSetName.MAIN).single() - - file shouldBeJvmFile { - references { - - androidR("com.modulecheck.other".asPackageName()) - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.internal.someString") - java("com.subject.internal.SourceKt.getSomeString") - } - } - } - - @Test - fun `android resource reference with wildcard R member import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createKotlinFile( - """ - package com.subject.internal - - import com.modulecheck.other.R.* - - val someString = string.app_name - """ - ) - - file shouldBeJvmFile { - references { - - androidR("com.modulecheck.other".asPackageName()) - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.internal.someString") - java("com.subject.internal.SourceKt.getSomeString") - } - } - } - - @Test - fun `android resource reference with explicit R string import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createKotlinFile( - """ - package com.subject - - import com.modulecheck.other.R.string - - val someString = string.app_name - """ - ) - - file shouldBeJvmFile { - references { - androidR("com.modulecheck.other".asPackageName()) - kotlin("com.modulecheck.other.R.string") - qualifiedAndroidResource("com.modulecheck.other.R.string.app_name") - unqualifiedAndroidResource("R.string.app_name") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.someString") - java("com.subject.SourceKt.getSomeString") - } - } - } - - @Test - fun `android data-binding reference from dependency with explicit import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") { - addLayoutFile( - "fragment_other.xml", - """ - - """ - ) - } - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createKotlinFile( - """ - package com.subject - - import com.modulecheck.other.databinding.FragmentOtherBinding - - val binding = FragmentOtherBinding.inflate() - """ - ) - - file shouldBeJvmFile { - references { - - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding") - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding.inflate") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.binding") - java("com.subject.SourceKt.getBinding") - } - } - } - - @Test - fun `android data-binding reference from dependency with fully qualified reference`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") { - addLayoutFile( - "fragment_other.xml", - """ - - """ - ) - } - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createKotlinFile( - """ - package com.subject - - val binding = com.modulecheck.other.databinding.FragmentOtherBinding.inflate() - """ - ) - - file shouldBeJvmFile { - references { - - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding") - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding.inflate") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.binding") - java("com.subject.SourceKt.getBinding") - } - } - } - - @Test - fun `android data-binding reference from dependency with wildcard import`() = test { - - val otherLib = androidLibrary(":other", "com.modulecheck.other") { - addLayoutFile( - "fragment_other.xml", - """ - - """ - ) - } - - val project = androidLibrary(":subject", "com.subject") { - addDependency(ConfigurationName.implementation, otherLib) - } - - val file = project.createKotlinFile( - """ - package com.subject - - import com.modulecheck.other.databinding.* - - val binding = FragmentOtherBinding.inflate() - """ - ) - - file shouldBeJvmFile { - references { - - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding") - androidDataBinding("com.modulecheck.other.databinding.FragmentOtherBinding.inflate") - } - - apiReferences { - } - - declarations { - kotlin("com.subject.binding") - java("com.subject.SourceKt.getBinding") - } - } - } - } -} diff --git a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinPluginsBlockParserTest.kt b/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinPluginsBlockParserTest.kt deleted file mode 100644 index a417d7504a..0000000000 --- a/modulecheck-parsing/psi/src/test/kotlin/modulecheck/parsing/psi/KotlinPluginsBlockParserTest.kt +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.psi - -import modulecheck.parsing.gradle.dsl.PluginDeclaration -import modulecheck.parsing.kotlin.compiler.NoContextPsiFileFactory -import modulecheck.reporting.logging.PrintLogger -import modulecheck.testing.BaseTest -import org.junit.jupiter.api.Test - -internal class KotlinPluginsBlockParserTest : BaseTest { - - @Test - fun `external declaration`() = test { - val block = parse( - """ - plugins { - kotlin("jvm") // trailing comment - // comment - javaLibrary - id("io.gitlab.arturbosch.detekt") version "1.15.0" - } - """.trimIndent() - ) - - block.settings shouldBe listOf( - PluginDeclaration( - declarationText = """kotlin("jvm")""", - statementWithSurroundingText = """ kotlin("jvm") // trailing comment""", - suppressed = emptyList() - ), - PluginDeclaration( - declarationText = """javaLibrary""", - statementWithSurroundingText = """ // comment - | javaLibrary - """.trimMargin(), - suppressed = emptyList() - ), - PluginDeclaration( - declarationText = """id("io.gitlab.arturbosch.detekt") version "1.15.0"""", - statementWithSurroundingText = """ id("io.gitlab.arturbosch.detekt") version "1.15.0"""", - suppressed = emptyList() - ) - ) - } - - @Test - fun `suppressed kotlin function`() = test { - val block = parse( - """ - plugins { - @Suppress("unused-plugin") - kotlin("jvm") - } - """.trimIndent() - ) - - block.settings shouldBe listOf( - PluginDeclaration( - declarationText = """kotlin("jvm")""", - statementWithSurroundingText = """ - | @Suppress("unused-plugin") - | kotlin("jvm") - """.trimMargin(), - suppressed = listOf("unused-plugin") - ) - ) - } - - @Test - fun `suppressed back-ticked ID`() = test { - val block = parse( - """ - plugins { - @Suppress("unused-plugin") - `kotlin-jvm` - } - """.trimIndent() - ) - - block.settings shouldBe listOf( - PluginDeclaration( - declarationText = """`kotlin-jvm`""", - statementWithSurroundingText = """ - | @Suppress("unused-plugin") - | `kotlin-jvm` - """.trimMargin(), - suppressed = listOf("unused-plugin") - ) - ) - } - - @Test - fun `suppression which doesn't match finding name regex should be ignored`() = test { - val block = parse( - """ - @Suppress("DSL_SCOPE_VIOLATION") - plugins { - id("com.squareup.anvil") - } - """ - ) - - block.allSuppressions.values.flatten() shouldBe emptyList() - } - - @Test - fun `suppressed id function`() = test { - val block = parse( - """ - plugins { - @Suppress("unused-plugin") - id("com.squareup.anvil") - } - """.trimIndent() - ) - - block.settings shouldBe listOf( - PluginDeclaration( - declarationText = """id("com.squareup.anvil")""", - statementWithSurroundingText = """ - | @Suppress("unused-plugin") - | id("com.squareup.anvil") - """.trimMargin(), - suppressed = listOf("unused-plugin") - ) - ) - } - - @Test - fun `suppressed with old finding name`() = test { - val block = parse( - """ - plugins { - @Suppress("UnusedKaptProcessor") - id("com.squareup.anvil") - } - """.trimIndent() - ) - - block.settings shouldBe listOf( - PluginDeclaration( - declarationText = """id("com.squareup.anvil")""", - statementWithSurroundingText = """ - | @Suppress("UnusedKaptProcessor") - | id("com.squareup.anvil") - """.trimMargin(), - suppressed = listOf("unused-kapt-processor") - ) - ) - } - - suspend fun parse(string: String): KotlinPluginsBlock { - val file = NoContextPsiFileFactory() - .createKotlin("build.gradle.kts", string.trimIndent()) - - return KotlinPluginsBlockParser(PrintLogger()).parse(file)!! - } -} diff --git a/modulecheck-parsing/source/api/api/api.api b/modulecheck-parsing/source/api/api/api.api deleted file mode 100644 index 1a6eb17eec..0000000000 --- a/modulecheck-parsing/source/api/api/api.api +++ /dev/null @@ -1,421 +0,0 @@ -public final class modulecheck/parsing/source/AndroidDataBindingDeclaredName : modulecheck/parsing/source/QualifiedDeclaredName, modulecheck/parsing/source/AndroidResourceDeclaredName, modulecheck/parsing/source/Generated { - public fun (Lmodulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName;Lmodulecheck/parsing/source/PackageName;)V - public fun asReferenceName (Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/ReferenceName; - public fun getPackageName ()Lmodulecheck/parsing/source/PackageName; - public fun getSimpleNames ()Ljava/util/List; - public fun getSources ()Ljava/util/Set; -} - -public final class modulecheck/parsing/source/AndroidDataBindingReferenceName : modulecheck/parsing/source/AndroidResourceReferenceName { - public fun (Ljava/lang/String;Lmodulecheck/parsing/source/McName$CompatibleLanguage;)V - public fun getLanguage ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; -} - -public final class modulecheck/parsing/source/AndroidRDeclaredName : modulecheck/parsing/source/QualifiedDeclaredName, modulecheck/parsing/source/AndroidResourceDeclaredName { - public fun (Lmodulecheck/parsing/source/PackageName;)V - public fun asReferenceName (Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/ReferenceName; - public fun getPackageName ()Lmodulecheck/parsing/source/PackageName; - public fun getSimpleNames ()Ljava/util/List; -} - -public final class modulecheck/parsing/source/AndroidRReferenceName : modulecheck/parsing/source/AndroidResourceReferenceName { - public fun (Lmodulecheck/parsing/source/PackageName;Lmodulecheck/parsing/source/McName$CompatibleLanguage;)V - public fun getLanguage ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; - public final fun getPackageName ()Lmodulecheck/parsing/source/PackageName; -} - -public abstract interface class modulecheck/parsing/source/AndroidResourceDeclaredName : modulecheck/parsing/source/DeclaredName, modulecheck/parsing/source/HasSimpleNames { - public static final field Companion Lmodulecheck/parsing/source/AndroidResourceDeclaredName$Companion; -} - -public final class modulecheck/parsing/source/AndroidResourceDeclaredName$Companion { - public final fun dataBinding (Lmodulecheck/parsing/source/UnqualifiedAndroidResource;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/AndroidDataBindingDeclaredName; - public final fun dataBinding (Lmodulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/AndroidDataBindingDeclaredName; - public final fun qualifiedAndroidResource (Lmodulecheck/parsing/source/AndroidRReferenceName;Lmodulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName;)Lmodulecheck/parsing/source/QualifiedAndroidResourceDeclaredName; - public final fun r (Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/AndroidRDeclaredName; -} - -public abstract class modulecheck/parsing/source/AndroidResourceReferenceName : modulecheck/parsing/source/ReferenceName { - public synthetic fun (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V -} - -public final class modulecheck/parsing/source/AnvilAnnotatedType { - public fun (Lmodulecheck/parsing/source/QualifiedDeclaredName;Lmodulecheck/parsing/source/AnvilScopeName;)V - public final fun component1 ()Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun component2 ()Lmodulecheck/parsing/source/AnvilScopeName; - public final fun copy (Lmodulecheck/parsing/source/QualifiedDeclaredName;Lmodulecheck/parsing/source/AnvilScopeName;)Lmodulecheck/parsing/source/AnvilAnnotatedType; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/AnvilAnnotatedType;Lmodulecheck/parsing/source/QualifiedDeclaredName;Lmodulecheck/parsing/source/AnvilScopeName;ILjava/lang/Object;)Lmodulecheck/parsing/source/AnvilAnnotatedType; - public fun equals (Ljava/lang/Object;)Z - public final fun getContributedScope ()Lmodulecheck/parsing/source/AnvilScopeName; - public final fun getContributedTypeDeclaration ()Lmodulecheck/parsing/source/QualifiedDeclaredName; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/AnvilGradlePlugin { - public fun (Lnet/swiftzer/semver/SemVer;Z)V - public final fun component1 ()Lnet/swiftzer/semver/SemVer; - public final fun component2 ()Z - public final fun copy (Lnet/swiftzer/semver/SemVer;Z)Lmodulecheck/parsing/source/AnvilGradlePlugin; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/AnvilGradlePlugin;Lnet/swiftzer/semver/SemVer;ZILjava/lang/Object;)Lmodulecheck/parsing/source/AnvilGradlePlugin; - public fun equals (Ljava/lang/Object;)Z - public final fun getGenerateDaggerFactories ()Z - public final fun getVersion ()Lnet/swiftzer/semver/SemVer; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/AnvilScopeName { - public fun (Lorg/jetbrains/kotlin/name/FqName;)V - public final fun component1 ()Lorg/jetbrains/kotlin/name/FqName; - public final fun copy (Lorg/jetbrains/kotlin/name/FqName;)Lmodulecheck/parsing/source/AnvilScopeName; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/AnvilScopeName;Lorg/jetbrains/kotlin/name/FqName;ILjava/lang/Object;)Lmodulecheck/parsing/source/AnvilScopeName; - public fun equals (Ljava/lang/Object;)Z - public final fun getFqName ()Lorg/jetbrains/kotlin/name/FqName; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/AnvilScopeNameEntry { - public fun (Lmodulecheck/parsing/source/ReferenceName;)V - public final fun component1 ()Lmodulecheck/parsing/source/ReferenceName; - public final fun copy (Lmodulecheck/parsing/source/ReferenceName;)Lmodulecheck/parsing/source/AnvilScopeNameEntry; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/AnvilScopeNameEntry;Lmodulecheck/parsing/source/ReferenceName;ILjava/lang/Object;)Lmodulecheck/parsing/source/AnvilScopeNameEntry; - public fun equals (Ljava/lang/Object;)Z - public final fun getName ()Lmodulecheck/parsing/source/ReferenceName; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/source/DeclaredName : modulecheck/parsing/source/HasSimpleNames, modulecheck/parsing/source/McName { - public static final field Companion Lmodulecheck/parsing/source/DeclaredName$Companion; - public fun getLanguages ()Ljava/util/Set; -} - -public final class modulecheck/parsing/source/DeclaredName$Companion { - public final fun agnostic (Lmodulecheck/parsing/source/PackageName;Ljava/lang/Iterable;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun java (Lmodulecheck/parsing/source/PackageName;Ljava/lang/Iterable;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun kotlin (Lmodulecheck/parsing/source/PackageName;Ljava/lang/Iterable;)Lmodulecheck/parsing/source/QualifiedDeclaredName; -} - -public final class modulecheck/parsing/source/DeclaredNameKt { - public static final fun asDeclaredName (Ljava/lang/Iterable;Lmodulecheck/parsing/source/PackageName;[Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static final fun asDeclaredName (Lorg/jetbrains/kotlin/name/FqName;Lmodulecheck/parsing/source/PackageName;[Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static final fun asDeclaredName-eUF3_40 (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;[Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/QualifiedDeclaredName; -} - -public abstract interface class modulecheck/parsing/source/Generated : modulecheck/parsing/source/McName { - public abstract fun getSources ()Ljava/util/Set; -} - -public abstract interface class modulecheck/parsing/source/HasPackageName { - public abstract fun getPackageName ()Lmodulecheck/parsing/source/PackageName; -} - -public abstract interface class modulecheck/parsing/source/HasReferences { - public abstract fun getReferences ()Lmodulecheck/utils/lazy/LazySet; -} - -public abstract interface class modulecheck/parsing/source/HasSimpleNames { - public static final field Companion Lmodulecheck/parsing/source/HasSimpleNames$Companion; - public abstract fun getSimpleNames ()Ljava/util/List; - public fun getSimplestName-Jf_0vz4 ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/HasSimpleNames$Companion { -} - -public abstract interface class modulecheck/parsing/source/JavaFile : modulecheck/parsing/source/JvmFile { - public abstract fun getPsi ()Lorg/jetbrains/kotlin/com/intellij/psi/PsiJavaFile; -} - -public abstract interface class modulecheck/parsing/source/JvmFile : modulecheck/parsing/source/HasReferences { - public abstract fun getApiReferences ()Lmodulecheck/utils/lazy/LazyDeferred; - public abstract fun getDeclarations ()Ljava/util/Set; - public abstract fun getFile ()Ljava/io/File; - public abstract fun getImportsLazy ()Lkotlin/Lazy; - public abstract fun getName ()Ljava/lang/String; - public abstract fun getPackageName ()Lmodulecheck/parsing/source/PackageName; - public abstract fun getPsi ()Lorg/jetbrains/kotlin/com/intellij/psi/PsiFile; -} - -public abstract interface class modulecheck/parsing/source/KotlinFile : modulecheck/parsing/source/JvmFile { - public abstract fun getAnvilScopeArguments (Ljava/util/List;Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getPsi ()Lorg/jetbrains/kotlin/psi/KtFile; -} - -public final class modulecheck/parsing/source/KotlinFile$ScopeArgumentParseResult { - public fun (Ljava/util/Set;Ljava/util/Set;)V - public final fun component1 ()Ljava/util/Set; - public final fun component2 ()Ljava/util/Set; - public final fun copy (Ljava/util/Set;Ljava/util/Set;)Lmodulecheck/parsing/source/KotlinFile$ScopeArgumentParseResult; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/KotlinFile$ScopeArgumentParseResult;Ljava/util/Set;Ljava/util/Set;ILjava/lang/Object;)Lmodulecheck/parsing/source/KotlinFile$ScopeArgumentParseResult; - public fun equals (Ljava/lang/Object;)Z - public final fun getContributeArguments ()Ljava/util/Set; - public final fun getMergeArguments ()Ljava/util/Set; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/source/McName : java/lang/Comparable { - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/parsing/source/McName;)I - public fun endsWith (Ljava/lang/String;)Z - public fun endsWith (Lmodulecheck/parsing/source/McName;)Z - public fun endsWithSimpleName (Ljava/lang/String;)Z - public fun endsWithSimpleName-xkB49u4 (Ljava/lang/String;)Z - public abstract fun getName ()Ljava/lang/String; - public abstract fun getSegments ()Ljava/util/List; - public fun getSimpleName ()Ljava/lang/String; - public fun startsWith (Lmodulecheck/parsing/source/McName;)Z -} - -public abstract interface class modulecheck/parsing/source/McName$CompatibleLanguage { -} - -public final class modulecheck/parsing/source/McName$CompatibleLanguage$JAVA : modulecheck/parsing/source/McName$CompatibleLanguage { - public static final field INSTANCE Lmodulecheck/parsing/source/McName$CompatibleLanguage$JAVA; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/McName$CompatibleLanguage$KOTLIN : modulecheck/parsing/source/McName$CompatibleLanguage { - public static final field INSTANCE Lmodulecheck/parsing/source/McName$CompatibleLanguage$KOTLIN; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/McName$CompatibleLanguage$XML : modulecheck/parsing/source/McName$CompatibleLanguage { - public static final field INSTANCE Lmodulecheck/parsing/source/McName$CompatibleLanguage$XML; - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/parsing/source/PackageName : modulecheck/parsing/source/McName { - public static final field Companion Lmodulecheck/parsing/source/PackageName$Companion; - public abstract fun append (Ljava/lang/Iterable;)Ljava/lang/String; - public abstract fun getName ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/PackageName$Companion { - public final fun asPackageName (Ljava/lang/String;)Lmodulecheck/parsing/source/PackageName; - public final fun invoke (Ljava/lang/String;)Lmodulecheck/parsing/source/PackageName; -} - -public final class modulecheck/parsing/source/PackageName$DEFAULT : modulecheck/parsing/source/PackageName { - public static final field INSTANCE Lmodulecheck/parsing/source/PackageName$DEFAULT; - public fun append (Ljava/lang/Iterable;)Ljava/lang/String; - public fun getName ()Ljava/lang/String; - public fun getSegments ()Ljava/util/List; -} - -public final class modulecheck/parsing/source/PackageNameImpl : modulecheck/parsing/source/PackageName { - public fun append (Ljava/lang/Iterable;)Ljava/lang/String; - public final fun component1 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;)Lmodulecheck/parsing/source/PackageNameImpl; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/PackageNameImpl;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/parsing/source/PackageNameImpl; - public fun equals (Ljava/lang/Object;)Z - public fun getName ()Ljava/lang/String; - public fun getSegments ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/PackageNameKt { - public static final fun append (Lmodulecheck/parsing/source/PackageName;[Ljava/lang/String;)Ljava/lang/String; -} - -public final class modulecheck/parsing/source/QualifiedAndroidResourceDeclaredName : modulecheck/parsing/source/QualifiedDeclaredName, modulecheck/parsing/source/AndroidResourceDeclaredName, modulecheck/parsing/source/Generated { - public fun (Lmodulecheck/parsing/source/AndroidRReferenceName;Lmodulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName;)V - public fun asReferenceName (Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/ReferenceName; - public fun getName ()Ljava/lang/String; - public fun getPackageName ()Lmodulecheck/parsing/source/PackageName; - public fun getSimpleNames ()Ljava/util/List; - public final fun getSourceR ()Lmodulecheck/parsing/source/AndroidRReferenceName; - public final fun getSourceResource ()Lmodulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName; - public fun getSources ()Ljava/util/Set; -} - -public final class modulecheck/parsing/source/QualifiedAndroidResourceReferenceName : modulecheck/parsing/source/AndroidResourceReferenceName { - public fun (Ljava/lang/String;Lmodulecheck/parsing/source/McName$CompatibleLanguage;)V - public fun getLanguage ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; -} - -public abstract class modulecheck/parsing/source/QualifiedDeclaredName : modulecheck/parsing/source/DeclaredName, modulecheck/parsing/source/HasPackageName, modulecheck/parsing/source/HasSimpleNames, modulecheck/parsing/source/McName, modulecheck/parsing/source/ResolvableMcName { - public fun asReferenceName (Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/ReferenceName; - public final fun equals (Ljava/lang/Object;)Z - public fun getName ()Ljava/lang/String; - public fun getSegments ()Ljava/util/List; - public final fun hashCode ()I - public final fun isTopLevel ()Z - public final fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/RawAnvilAnnotatedType { - public fun (Lmodulecheck/parsing/source/QualifiedDeclaredName;Lmodulecheck/parsing/source/AnvilScopeNameEntry;)V - public final fun component1 ()Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun component2 ()Lmodulecheck/parsing/source/AnvilScopeNameEntry; - public final fun copy (Lmodulecheck/parsing/source/QualifiedDeclaredName;Lmodulecheck/parsing/source/AnvilScopeNameEntry;)Lmodulecheck/parsing/source/RawAnvilAnnotatedType; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/RawAnvilAnnotatedType;Lmodulecheck/parsing/source/QualifiedDeclaredName;Lmodulecheck/parsing/source/AnvilScopeNameEntry;ILjava/lang/Object;)Lmodulecheck/parsing/source/RawAnvilAnnotatedType; - public fun equals (Ljava/lang/Object;)Z - public final fun getAnvilScopeNameEntry ()Lmodulecheck/parsing/source/AnvilScopeNameEntry; - public final fun getDeclaredName ()Lmodulecheck/parsing/source/QualifiedDeclaredName; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract class modulecheck/parsing/source/ReferenceName : modulecheck/parsing/source/McName, modulecheck/parsing/source/ResolvableMcName { - public static final field Companion Lmodulecheck/parsing/source/ReferenceName$Companion; - public synthetic fun (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun equals (Ljava/lang/Object;)Z - public abstract fun getLanguage ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; - public final fun getName ()Ljava/lang/String; - public fun getSegments ()Ljava/util/List; - public final fun hashCode ()I - public final fun isJava ()Z - public final fun isKotlin ()Z - public final fun isXml ()Z - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/ReferenceName$Companion { - public final fun asReferenceName (Ljava/lang/String;Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/ReferenceName; - public final fun invoke (Ljava/lang/String;Lmodulecheck/parsing/source/McName$CompatibleLanguage;)Lmodulecheck/parsing/source/ReferenceName; -} - -public abstract interface class modulecheck/parsing/source/ResolvableMcName : modulecheck/parsing/source/McName { -} - -public final class modulecheck/parsing/source/SimpleName : java/lang/Comparable { - public static final field Companion Lmodulecheck/parsing/source/SimpleName$Companion; - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/parsing/source/SimpleName; - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo-xkB49u4 (Ljava/lang/String;)I - public static fun compareTo-xkB49u4 (Ljava/lang/String;Ljava/lang/String;)I - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public final fun getName ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/SimpleName$Companion { - public final fun asSimpleName-QX443rU (Ljava/lang/String;)Ljava/lang/String; - public final fun asString (Ljava/util/List;)Ljava/lang/String; - public final fun stripPackageNameFromFqName (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;)Ljava/util/List; -} - -public final class modulecheck/parsing/source/UnqualifiedAndroidResource : modulecheck/parsing/source/AndroidResourceDeclaredName, modulecheck/parsing/source/HasSimpleNames, modulecheck/parsing/source/McName { - public static final field Companion Lmodulecheck/parsing/source/UnqualifiedAndroidResource$Companion; - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun equals (Ljava/lang/Object;)Z - public final fun getIdentifier-Jf_0vz4 ()Ljava/lang/String; - public fun getName ()Ljava/lang/String; - public final fun getPrefix-Jf_0vz4 ()Ljava/lang/String; - public fun getSegments ()Ljava/util/List; - public fun getSimpleNames ()Ljava/util/List; - public fun hashCode ()I - public final fun toQualifiedDeclaredName (Lmodulecheck/parsing/source/AndroidRDeclaredName;)Lmodulecheck/parsing/source/QualifiedAndroidResourceDeclaredName; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/UnqualifiedAndroidResource$Companion { - public final fun anim-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun animator-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun array-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun bool-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun color-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun dimen-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun drawable-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun font-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun fromFile (Ljava/io/File;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun fromValuePair (Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun fromXmlString (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun id-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun integer-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun layout-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun menu-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun mipmap-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun raw-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun string-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; - public final fun style-xkB49u4 (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResource; -} - -public final class modulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName : modulecheck/parsing/source/AndroidResourceReferenceName, modulecheck/parsing/source/HasSimpleNames { - public fun (Ljava/lang/String;Lmodulecheck/parsing/source/McName$CompatibleLanguage;)V - public fun equals (Ljava/lang/Object;)Z - public final fun getIdentifier-Jf_0vz4 ()Ljava/lang/String; - public fun getLanguage ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; - public final fun getPrefix-Jf_0vz4 ()Ljava/lang/String; - public fun getSimpleNames ()Ljava/util/List; -} - -public abstract interface class modulecheck/parsing/source/internal/AndroidDataBindingNameProvider { - public abstract fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/source/internal/AndroidRNameProvider { - public abstract fun getAll (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getLocalOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/source/internal/InterpretingInterceptor : modulecheck/parsing/source/internal/ParsingInterceptor { - public fun ()V - public fun intercept (Lmodulecheck/parsing/source/internal/ParsingInterceptor$Chain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/source/internal/NameParser { - public abstract fun parse (Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/source/internal/NameParser$NameParserPacket { - public fun (Lmodulecheck/parsing/source/PackageName;Ljava/util/Set;Ljava/util/Set;Ljava/util/Map;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lmodulecheck/parsing/source/McName$CompatibleLanguage;Lkotlin/jvm/functions/Function1;)V - public final fun component1 ()Lmodulecheck/parsing/source/PackageName; - public final fun component10 ()Lkotlin/jvm/functions/Function1; - public final fun component2 ()Ljava/util/Set; - public final fun component3 ()Ljava/util/Set; - public final fun component4 ()Ljava/util/Map; - public final fun component5 ()Ljava/util/Set; - public final fun component6 ()Ljava/util/Set; - public final fun component7 ()Ljava/util/Set; - public final fun component8 ()Ljava/util/Set; - public final fun component9 ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; - public final fun copy (Lmodulecheck/parsing/source/PackageName;Ljava/util/Set;Ljava/util/Set;Ljava/util/Map;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lmodulecheck/parsing/source/McName$CompatibleLanguage;Lkotlin/jvm/functions/Function1;)Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket; - public static synthetic fun copy$default (Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket;Lmodulecheck/parsing/source/PackageName;Ljava/util/Set;Ljava/util/Set;Ljava/util/Map;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Lmodulecheck/parsing/source/McName$CompatibleLanguage;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket; - public fun equals (Ljava/lang/Object;)Z - public final fun getAliasedImports ()Ljava/util/Map; - public final fun getApiReferenceNames ()Ljava/util/Set; - public final fun getImports ()Ljava/util/Set; - public final fun getMustBeApi ()Ljava/util/Set; - public final fun getPackageName ()Lmodulecheck/parsing/source/PackageName; - public final fun getReferenceLanguage ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; - public final fun getResolved ()Ljava/util/Set; - public final fun getStdLibNameOrNull ()Lkotlin/jvm/functions/Function1; - public final fun getUnresolved ()Ljava/util/Set; - public final fun getWildcardImports ()Ljava/util/Set; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/parsing/source/internal/ParsingChain : modulecheck/parsing/source/internal/ParsingInterceptor$Chain { - public synthetic fun (Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getPacket ()Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket; - public fun proceed (Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/source/internal/ParsingChain$Factory : modulecheck/parsing/source/internal/NameParser { - public fun (Ljava/util/List;)V - public fun parse (Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/source/internal/ParsingInterceptor { - public abstract fun intercept (Lmodulecheck/parsing/source/internal/ParsingInterceptor$Chain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/source/internal/ParsingInterceptor$Chain { - public abstract fun getPacket ()Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket; - public abstract fun proceed (Lmodulecheck/parsing/source/internal/NameParser$NameParserPacket;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - diff --git a/modulecheck-parsing/source/api/build.gradle.kts b/modulecheck-parsing/source/api/build.gradle.kts deleted file mode 100644 index 584a80c5de..0000000000 --- a/modulecheck-parsing/source/api/build.gradle.kts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-source-api" - ) - anvil() -} - -dependencies { - api(libs.kotlin.compiler) - api(libs.semVer) - - api(project(path = ":modulecheck-utils:lazy")) - - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotlin.reflect) - - testImplementation(project(path = ":modulecheck-internal-testing")) -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AndroidResourceDeclaredName.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AndroidResourceDeclaredName.kt deleted file mode 100644 index 8205486859..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AndroidResourceDeclaredName.kt +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.parsing.source.HasSimpleNames.Companion.checkSimpleNames -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.utils.capitalize -import modulecheck.utils.lazy.unsafeLazy - -/** - * - fully qualified generated resources like `com.example.R.string.app_name` - * - generated data-/view-binding declarations like `com.example.databinding.FragmentListBinding` - * - unqualified resources which can be consumed in downstream projects, like `R.string.app_name` - * - R declarations, like `com.example.R` - * - * @since 0.12.0 - */ -sealed interface AndroidResourceDeclaredName : DeclaredName, HasSimpleNames { - - companion object { - /** - * @return example: `com.example.app.R` - * @since 0.12.0 - */ - fun r(packageName: PackageName): AndroidRDeclaredName = AndroidRDeclaredName(packageName) - - /** - * @return `com.example.R.string.app_name` - * @since 0.12.0 - */ - fun qualifiedAndroidResource( - sourceR: AndroidRReferenceName, - sourceResource: UnqualifiedAndroidResourceReferenceName - ): QualifiedAndroidResourceDeclaredName { - return QualifiedAndroidResourceDeclaredName(sourceR, sourceResource) - } - - /** - * @return `com.example.databinding.FragmentListBinding` - * @since 0.12.0 - */ - fun dataBinding( - sourceLayout: UnqualifiedAndroidResourceReferenceName, - packageName: PackageName - ): AndroidDataBindingDeclaredName { - return AndroidDataBindingDeclaredName(sourceLayout, packageName) - } - - /** - * @return `com.example.databinding.FragmentListBinding` - * @since 0.12.0 - */ - fun dataBinding( - sourceLayoutDeclaration: UnqualifiedAndroidResource, - packageName: PackageName - ): AndroidDataBindingDeclaredName { - return AndroidDataBindingDeclaredName( - UnqualifiedAndroidResourceReferenceName( - name = sourceLayoutDeclaration.name, - language = XML - ), - packageName - ) - } - } -} - -/** - * example: `com.example.app.R` - * - * @since 0.12.0 - */ -class AndroidRDeclaredName( - override val packageName: PackageName -) : QualifiedDeclaredName(), AndroidResourceDeclaredName { - - override val simpleNames: List by lazy { listOf("R".asSimpleName()) } - - override fun asReferenceName(language: CompatibleLanguage): ReferenceName { - return AndroidRReferenceName(packageName, language) - } -} - -/** - * example: `com.example.R.string.app_name` - * - * @property sourceR the R declaration used when AGP generates this fully qualified resource - * @property sourceResource the resource declaration, like - * `_.string.app_name`, used when AGP generates this fully qualified resource - * @since 0.12.0 - */ -class QualifiedAndroidResourceDeclaredName( - val sourceR: AndroidRReferenceName, - val sourceResource: UnqualifiedAndroidResourceReferenceName -) : QualifiedDeclaredName(), AndroidResourceDeclaredName, Generated { - - override val packageName: PackageName by unsafeLazy { sourceR.packageName } - - override val simpleNames: List by unsafeLazy { sourceResource.simpleNames } - - override val name: String by unsafeLazy { - "${sourceR.name}.${sourceResource.prefix.name}.${sourceResource.identifier.name}" - } - - override val sources: Set = setOf(sourceR, sourceResource) - - init { - checkSimpleNames() - } - - override fun asReferenceName(language: CompatibleLanguage): ReferenceName { - return QualifiedAndroidResourceReferenceName(name, language) - } -} - -/** - * example: `com.example.databinding.FragmentListBinding` - * - * @since 0.12.0 - */ -class AndroidDataBindingDeclaredName( - sourceLayout: UnqualifiedAndroidResourceReferenceName, - override val packageName: PackageName -) : QualifiedDeclaredName(), AndroidResourceDeclaredName, Generated { - - override val simpleNames: List by unsafeLazy { - - val simpleBindingName = sourceLayout.identifier.name - .split("_") - .joinToString("") { fragment -> fragment.capitalize() } - .plus("Binding") - .asSimpleName() - - listOf( - "databinding".asSimpleName(), - simpleBindingName - ) - } - override val sources: Set by unsafeLazy { setOf(sourceLayout) } - - init { - checkSimpleNames() - } - - override fun asReferenceName(language: CompatibleLanguage): ReferenceName { - return AndroidDataBindingReferenceName(name, language) - } -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AndroidResourceReferenceName.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AndroidResourceReferenceName.kt deleted file mode 100644 index 8cc99b02c3..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AndroidResourceReferenceName.kt +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.utils.lazy.unsafeLazy - -/** - * Any reference to an Android resource - * - * @since 0.12.0 - */ -sealed class AndroidResourceReferenceName(name: String) : ReferenceName(name) - -/** - * example: `com.example.R` - * - * @property packageName the package of this reference (which is just the full string, minus `.R`) - * @property language the language making this reference - * @since 0.12.0 - */ -class AndroidRReferenceName( - val packageName: PackageName, - override val language: CompatibleLanguage -) : AndroidResourceReferenceName(packageName.append("R")) - -/** - * example: `R.string.app_name` - * - * @param name `R.string.____` - * @property language the language making this reference - * @since 0.12.0 - */ -// hashcode behavior is intentionally handled by super -@Suppress("EqualsWithHashCodeExist", "EqualsOrHashCode") -class UnqualifiedAndroidResourceReferenceName( - name: String, - override val language: CompatibleLanguage -) : AndroidResourceReferenceName(name), - HasSimpleNames { - - private val split by unsafeLazy { - name.split('.').also { segments -> - @Suppress("MagicNumber") - require(segments.size == 3) { - "The name `$name` must follow the format `R..`, " + - "such as `R.string.app_name`." - } - } - } - - /** - * example: 'string' in `R.string.app_name` - * - * @since 0.12.0 - */ - val prefix: SimpleName by unsafeLazy { split[1].asSimpleName() } - - /** - * example: 'app_name' in `R.string.app_name` - * - * @since 0.12.0 - */ - val identifier: SimpleName by unsafeLazy { split[2].asSimpleName() } - - override val simpleNames: List by unsafeLazy { - listOf("R".asSimpleName(), prefix, identifier) - } - - override fun equals(other: Any?): Boolean { - if (other is UnqualifiedAndroidResource) { - return name == other.name - } - - return super.equals(other) - } -} - -/** - * example: `com.example.databinding.FragmentViewBinding` - * - * @param name `com.example.databinding.FragmentViewBinding` - * @property language the language making this reference - * @since 0.12.0 - */ -class AndroidDataBindingReferenceName( - name: String, - override val language: CompatibleLanguage -) : AndroidResourceReferenceName(name) - -/** - * example: `com.example.R.string.app_name` - * - * @param name `com.example.R.string.app_name` - * @property language the language making this reference - * @since 0.12.0 - */ -class QualifiedAndroidResourceReferenceName( - name: String, - override val language: CompatibleLanguage -) : AndroidResourceReferenceName(name) diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AnvilGradlePlugin.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AnvilGradlePlugin.kt deleted file mode 100644 index 086344dd80..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/AnvilGradlePlugin.kt +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import net.swiftzer.semver.SemVer -import org.jetbrains.kotlin.name.FqName - -data class AnvilGradlePlugin( - val version: SemVer, - val generateDaggerFactories: Boolean -) - -data class AnvilAnnotatedType( - val contributedTypeDeclaration: QualifiedDeclaredName, - val contributedScope: AnvilScopeName -) - -data class RawAnvilAnnotatedType( - val declaredName: QualifiedDeclaredName, - val anvilScopeNameEntry: AnvilScopeNameEntry -) - -data class AnvilScopeName(val fqName: FqName) { - override fun toString(): String = fqName.asString() -} - -data class AnvilScopeNameEntry(val name: ReferenceName) diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/DeclaredName.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/DeclaredName.kt deleted file mode 100644 index 20d432da76..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/DeclaredName.kt +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.parsing.source.HasSimpleNames.Companion.checkSimpleNames -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.parsing.source.ReferenceName.Companion.asReferenceName -import modulecheck.parsing.source.SimpleName.Companion.asString -import modulecheck.parsing.source.SimpleName.Companion.stripPackageNameFromFqName -import modulecheck.utils.lazy.unsafeLazy -import modulecheck.utils.singletonList -import org.jetbrains.kotlin.name.FqName - -/** - * Represents a "declaration" -- a named object which can be referenced elsewhere. - * - * @since 0.12.0 - */ -sealed interface DeclaredName : McName, HasSimpleNames { - - /** - * The languages with which this declaration is compatible. For instance, a member - * property will typically have a [KOTLIN] declaration using property access syntax, - * but will also have a [JAVA]/[XML] declaration for setter and getter functions. - * - * @since 0.12.0 - */ - val languages: Set get() = setOf(KOTLIN, JAVA, XML) - - companion object { - - /** - * Shorthand for creating a [QualifiedDeclaredName] which is only accessible from Kotlin files. - * - * @see McName.CompatibleLanguage.KOTLIN - * @since 0.12.0 - */ - fun kotlin(packageName: PackageName, simpleNames: Iterable): QualifiedDeclaredName = - QualifiedDeclaredNameImpl( - packageName = packageName, - simpleNames = simpleNames.toList(), - languages = setOf(KOTLIN) - ) - - /** - * Shorthand for creating a [QualifiedDeclaredName] - * which is only accessible from Java or XML files. - * - * @see McName.CompatibleLanguage.JAVA - * @see McName.CompatibleLanguage.XML - * @since 0.12.0 - */ - fun java(packageName: PackageName, simpleNames: Iterable): QualifiedDeclaredName = - QualifiedDeclaredNameImpl( - packageName = packageName, - simpleNames = simpleNames.toList(), - languages = setOf(JAVA, XML) - ) - - /** - * Shorthand for creating a [QualifiedDeclaredName] - * which is accessible from files in any language. - * - * @see McName.CompatibleLanguage.JAVA - * @see McName.CompatibleLanguage.KOTLIN - * @see McName.CompatibleLanguage.XML - * @since 0.12.0 - */ - fun agnostic( - packageName: PackageName, - simpleNames: Iterable - ): QualifiedDeclaredName = QualifiedDeclaredNameImpl( - packageName = packageName, - simpleNames = simpleNames.toList(), - languages = setOf(KOTLIN, JAVA, XML) - ) - } -} - -/** - * Represents a "declaration" -- a named object which can be referenced elsewhere. - * - * @since 0.12.0 - */ -sealed class QualifiedDeclaredName : - DeclaredName, - McName, - HasPackageName, - HasSimpleNames, - ResolvableMcName { - - override val name: String - get() = packageName.append(simpleNames.asString()) - - override val segments: List by unsafeLazy { name.split('.') } - - open fun asReferenceName(language: CompatibleLanguage): ReferenceName { - return name.asReferenceName(language) - } - - /** - * `true` if a declaration is top-level in a file, otherwise `false` - * such as if the declaration is a nested type or a member declaration - */ - val isTopLevel: Boolean by unsafeLazy { simpleNames.size == 1 } - - final override fun equals(other: Any?): Boolean { - if (this === other) return true - - when (other) { - is ReferenceName -> { - - if (name != other.name) return false - if (!languages.contains(other.language)) return false - } - - is QualifiedDeclaredName -> { - - if (name != other.name) return false - if (languages != other.languages) return false - } - - else -> return false - } - return true - } - - final override fun hashCode(): Int = name.hashCode() - - final override fun toString(): String = - "(${this::class.java.simpleName}) `$name` language=$languages" -} - -internal class QualifiedDeclaredNameImpl( - override val packageName: PackageName, - override val simpleNames: List, - override val languages: Set -) : QualifiedDeclaredName() { - init { - checkSimpleNames() - } -} - -/** - * @return a [QualifiedDeclaredName], where the String after [packageName] - * is split and treated as the collection of [SimpleNames][SimpleName]. - * @since 0.12.0 - */ -fun FqName.asDeclaredName( - packageName: PackageName, - vararg languages: CompatibleLanguage -): QualifiedDeclaredName { - return asString().stripPackageNameFromFqName(packageName).asDeclaredName(packageName, *languages) -} - -/** - * @return a [QualifiedDeclaredName] from the [packageName] - * argument, appending the receiver [SimpleNames][SimpleName] - * @since 0.12.0 - */ -fun Iterable.asDeclaredName( - packageName: PackageName, - vararg languages: CompatibleLanguage -): QualifiedDeclaredName { - return when { - languages.isEmpty() -> DeclaredName.agnostic(packageName, this) - !languages.contains(JAVA) -> DeclaredName.kotlin(packageName, this) - !languages.contains(KOTLIN) -> DeclaredName.java(packageName, this) - else -> DeclaredName.agnostic(packageName, this) - } -} - -/** - * @return a [QualifiedDeclaredName] from the [packageName] - * argument, appending the receiver [SimpleNames][SimpleName] - */ -fun SimpleName.asDeclaredName( - packageName: PackageName, - vararg languages: CompatibleLanguage -): QualifiedDeclaredName { - return singletonList().asDeclaredName(packageName, *languages) -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/Generated.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/Generated.kt deleted file mode 100644 index 603e7dee56..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/Generated.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -/** - * Indicates that a given [DeclaredName] is generated by some mechanism, like AGP or Dagger. - * - * @since 0.12.0 - */ -sealed interface Generated : McName { - - /** - * The references which the underlying code generator (AGP, - * Dagger, etc.) uses in order to trigger the new declaration. - * - * @since 0.12.0 - */ - val sources: Set -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/JvmFile.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/JvmFile.kt deleted file mode 100644 index 698d1227b8..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/JvmFile.kt +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.utils.lazy.LazyDeferred -import org.jetbrains.kotlin.com.intellij.psi.PsiFile -import org.jetbrains.kotlin.com.intellij.psi.PsiJavaFile -import org.jetbrains.kotlin.psi.KtFile -import java.io.File - -sealed interface JvmFile : HasReferences { - /** - * The [java.io.File] version of this file - * - * @since 0.12.0 - */ - val file: File - - /** - * The simple name of this file, with extension. Like `App.java` or `App.kt`. - * - * @since 0.12.0 - */ - val name: String - - /** - * the package name of this file, or [PackageName.DEFAULT] if a package is not declared - * - * @since 0.12.0 - */ - val packageName: PackageName - - /** - * All declared names within this file - * - * @since 0.12.0 - */ - val declarations: Set - - /** - * The Kotlin compiler version of this file. It will either be a [KtFile] or [PsiJavaFile] - * - * @since 0.12.0 - */ - val psi: PsiFile - - val importsLazy: Lazy> - val apiReferences: LazyDeferred> -} - -interface KotlinFile : JvmFile { - override val psi: KtFile - - /** - * A weird, dated function for getting Anvil scope arguments - * - * @since 0.12.0 - */ - suspend fun getAnvilScopeArguments( - allAnnotations: List, - mergeAnnotations: List - ): ScopeArgumentParseResult - - data class ScopeArgumentParseResult( - val mergeArguments: Set, - val contributeArguments: Set - ) -} - -interface JavaFile : JvmFile { - /** - * The [PsiJavaFile] version of this file - * - * @since 0.12.0 - */ - override val psi: PsiJavaFile -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/McName.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/McName.kt deleted file mode 100644 index 16e0abdc43..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/McName.kt +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.firstOrNull -import modulecheck.utils.lazy.LazySet - -/** - * Fundamentally, this is a version of `FqName` (such as - * Kotlin's [FqName][org.jetbrains.kotlin.name.FqName]) - * with syntactic sugar for complex matching requirements. - * - * @see QualifiedDeclaredName - * @see ReferenceName - * @since 0.12.0 - */ -sealed interface McName : Comparable { - /** - * The raw String value of this name, such as `com.example.lib1.Lib1Class`. - * - * @since 0.12.0 - */ - val name: String - - /** - * ex: 'com.example.Subject' has the segments ['com', 'example', 'Subject'] - * - * @since 0.12.0 - */ - val segments: List - - /** - * The simplest name. For an inner class like `com.example.Outer.Inner`, this will be 'Inner'. - * - * @since 0.12.0 - */ - val simpleName: String - get() = segments.last() - - /** - * @return true if this [name] value with the name string of [other], otherwise false - * @since 0.12.0 - */ - fun startsWith(other: McName): Boolean { - return name.startsWith(other.name) - } - - /** - * @return true if this [name] value ends with the [str] parameter, otherwise false - * @since 0.12.0 - */ - fun endsWith(str: String): Boolean { - return name.endsWith(str) - } - - /** - * @return true if the last segment of this name matches [str], otherwise false - * @since 0.12.0 - */ - fun endsWithSimpleName(str: String): Boolean { - return name.split('.').last() == str - } - - /** @return true if the last segment of this name matches [simpleName], otherwise false */ - fun endsWithSimpleName(simpleName: SimpleName): Boolean { - return name.split('.').last() == simpleName.name - } - - /** @return true if the last segment of this name matches [other], otherwise false - * @since 0.12.0 - */ - fun endsWith(other: McName): Boolean { - return name.endsWith(other.name) - } - - override fun compareTo(other: McName): Int { - // sort by name first, then by type. - return compareValuesBy( - this, - other, - { it.name }, - { it::class.java.simpleName } - ) - } - - /** - * The language which contains a given [ReferenceName], - * or the language which can access a given [DeclaredName] - * - * @since 0.12.0 - */ - sealed interface CompatibleLanguage { - /** - * Java - * - * @since 0.12.0 - */ - object JAVA : CompatibleLanguage { - override fun toString(): String = this::class.java.simpleName - } - - /** - * Kotlin - * - * @since 0.12.0 - */ - object KOTLIN : CompatibleLanguage { - override fun toString(): String = this::class.java.simpleName - } - - /** - * Xml, which is treated the same as [JAVA] - * - * @since 0.12.0 - */ - object XML : CompatibleLanguage { - override fun toString(): String = this::class.java.simpleName - } - } -} - -/** - * An [McName] which has the potential to be resolved -- - * meaning any [ReferenceName], or a [QualifiedDeclaredName] - */ -sealed interface ResolvableMcName : McName - -suspend inline fun LazySet.getNameOrNull(element: McName): T? { - return takeIf { it.contains(element) } - ?.filterIsInstance() - ?.firstOrNull { it == element } -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/PackageName.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/PackageName.kt deleted file mode 100644 index ef53f5ebec..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/PackageName.kt +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.parsing.source.PackageName.DEFAULT -import modulecheck.utils.lazy.unsafeLazy - -/** - * Represents a package name. - * - * Note that a java/kotlin file without a package declaration will have a `null` _declaration_, but - * it still has a "default" package. Files with a default package should use [PackageName.DEFAULT]. - * - * @see McName - * @see DEFAULT - */ -sealed interface PackageName : McName { - /** the full name of this package */ - override val name: String - - /** - * Represents a [PackageName] when there isn't actually a package name, meaning that - * top-level declarations in that file are at the root of source without qualifiers. - * - * @see McName - * @see DEFAULT - */ - object DEFAULT : PackageName { - override val name: String = "" - - override fun append(simpleNames: Iterable): String = simpleNames.joinToString(".") - override val segments: List - get() = emptyList() - } - - /** - * Safe function for appending a simple name to the "end" of a package name. - * - * If the package name is default/empty, this function will - * return just the simple name without a preceding period. - * - * If the package name is not blank, this function will append - * a period to the package name, then add the simple name. - */ - fun append(simpleNames: Iterable): String - - companion object { - /** Shorthand for calling [PackageName.invoke] in-line. */ - fun String?.asPackageName(): PackageName = PackageName(this) - - /** - * Shorthand for calling [PackageName.invoke] in-line. - * - * @return A `PackageName` wrapper around [nameOrNull]. If [nameOrNull] - * is null or blank, this will return [PackageName.DEFAULT]. - */ - operator fun invoke(nameOrNull: String?): PackageName { - return when { - nameOrNull.isNullOrBlank() -> DEFAULT - else -> PackageNameImpl(nameOrNull) - } - } - } -} - -/** - * Safe function for appending a simple name to the "end" of a package name. - * - * If the package name is default/empty, this function will - * return just the simple name without a preceding period. - * - * If the package name is not blank, this function will append - * a period to the package name, then add the simple name. - */ -fun PackageName.append(vararg simpleNames: String): String = append(simpleNames.toList()) - -/** - * @property name the full name of this package - * @see McName - * @throws IllegalArgumentException if the [name] parameter is empty or blank - */ -data class PackageNameImpl internal constructor(override val name: String) : PackageName { - init { - require(name.isNotBlank()) { - "A ${this.javaClass.canonicalName} must be a non-empty, non-blank String. " + - "Represent an empty/blank or missing package name as ${DEFAULT::class.qualifiedName}. " + - "This name argument, wrapped in single quotes: '$name'" - } - } - - override fun append(simpleNames: Iterable): String = - "$name.${simpleNames.joinToString(".")}" - - override val segments: List by unsafeLazy { name.split('.') } -} - -/** Convenience interface for providing a [PackageName]. */ -interface HasPackageName { - val packageName: PackageName -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/ReferenceName.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/ReferenceName.kt deleted file mode 100644 index cdfc598e02..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/ReferenceName.kt +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.unsafeLazy -import modulecheck.utils.trimSegments - -/** - * Marker which indicates that [references] exist. Typically implemented by "file" types - * - * @since 0.12.0 - */ -interface HasReferences { - - /** - * The references in this object, calculated lazily - * - * @since 0.12.0 - */ - val references: LazySet -} - -/** - * Represents a name -- fully qualified or not -- which references a declaration somewhere else - * - * @since 0.12.0 - */ -sealed class ReferenceName(name: String) : McName, ResolvableMcName { - - final override val name: String = name.trimSegments() - - /** - * The [language][CompatibleLanguage] of the file making this reference - * - * @since 0.12.0 - */ - abstract val language: CompatibleLanguage - - override val segments: List by unsafeLazy { this.name.split('.') } - - /** - * This reference is from a Java source file - * - * @since 0.12.0 - */ - fun isJava(): Boolean = language == JAVA - - /** - * This reference is from a Kotlin source file - * - * @since 0.12.0 - */ - fun isKotlin(): Boolean = language == KOTLIN - - /** - * This reference is from an xml source file - * - * @since 0.12.0 - */ - @Suppress("GrazieInspection") - fun isXml(): Boolean = language == XML - - override fun equals(other: Any?): Boolean { - if (this === other) return true - - when (other) { - is ReferenceName -> { - - if (name != other.name) return false - if (language != other.language) return false - } - - is QualifiedDeclaredName -> { - - if (name != other.name) return false - if (!other.languages.contains(language)) return false - } - - else -> return false - } - return true - } - - final override fun hashCode(): Int = name.hashCode() - - override fun toString(): String { - @Suppress("UnsafeCallOnNullableType") - return "${this::class.simpleName!!}(name='$name' language=$language)" - } - - companion object { - /** - * @return a basic [ReferenceName] for this name and language. - * @since 0.12.0 - */ - operator fun invoke(name: String, language: CompatibleLanguage): ReferenceName = - ReferenceNameImpl( - name = name, - language = language - ) - - /** @return a basic [ReferenceName] for this name and language. */ - fun String.asReferenceName(language: CompatibleLanguage): ReferenceName = - ReferenceName(this, language) - } -} - -private class ReferenceNameImpl( - name: String, - override val language: CompatibleLanguage -) : ReferenceName(name), McName { - - override val simpleName by unsafeLazy { - name.split('.').last() - } -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/SimpleName.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/SimpleName.kt deleted file mode 100644 index 046072a484..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/SimpleName.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -@JvmInline -/** - * A name which is not fully qualified, like `Foo` in `com.example.Foo` - * - * @property name the string value of this name - * @since 0.12.0 - */ -value class SimpleName(val name: String) : Comparable { - - init { - require(name.matches("""^([a-zA-Z_$][a-zA-Z\d_$]*)|(`.*`)$""".toRegex())) { - "SimpleName names must be valid Java identifier " + - "without a dot qualifier or whitespace. This name was: `$name`" - } - } - - override fun compareTo(other: SimpleName): Int = name.compareTo(other.name) - - companion object { - /** - * shorthand for `joinToString(".") { it.name.trim() }` - * - * @since 0.12.0 - */ - fun List.asString(): String = joinToString(".") { it.name.trim() } - - /** - * wraps this String in a [SimpleName] - * - * @since 0.12.0 - */ - fun String.asSimpleName(): SimpleName = SimpleName(this) - - /** - * Removes the prefix of [packageName]'s value and a subsequent period, - * then splits the remainder by dots and returns that list as [SimpleName] - * - * example: `com.example.Outer.Inner` becomes `[Outer, Inner]` - * - * @since 0.12.0 - */ - fun String.stripPackageNameFromFqName(packageName: PackageName): List { - return removePrefix("${packageName.name}.").split('.') - .map { it.asSimpleName() } - } - } -} - -/** Convenience interface for providing a [SimpleName]. */ -interface HasSimpleNames { - /** - * The contained [SimpleNames][SimpleName] - * - * @since 0.12.0 - */ - val simpleNames: List - - /** - * If the collection in [simpleNames] has more than one name, this value will be the last. - * - * example: Given a full name of `com.example.Outer.Inner`, with - * the [simpleNames] `[Outer, Inner]`, this value will be `Inner`. - * - * @since 0.12.0 - */ - val simplestName: SimpleName - get() = simpleNames.last() - - companion object { - - internal fun HasSimpleNames.checkSimpleNames() { - require(simpleNames.isNotEmpty()) { - "`simpleNames` must have at least one name, but this list is empty." - } - } - } -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/UnqualifiedAndroidResource.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/UnqualifiedAndroidResource.kt deleted file mode 100644 index e0bc10cb17..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/UnqualifiedAndroidResource.kt +++ /dev/null @@ -1,275 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import modulecheck.parsing.source.SimpleName.Companion.asString -import modulecheck.utils.lazy.unsafeLazy -import java.io.File -import kotlin.io.path.name - -/** - * example: `R.string.app_name` - * - * @property prefix 'string' in `R.string.app_name` - * @property identifier 'app_name' in `R.string.app_name` - * @since 0.12.0 - */ -class UnqualifiedAndroidResource private constructor( - val prefix: SimpleName, - val identifier: SimpleName -) : AndroidResourceDeclaredName, McName, HasSimpleNames { - - override val simpleNames: List by unsafeLazy { - listOf("R".asSimpleName(), prefix, identifier) - } - override val segments: List by unsafeLazy { simpleNames.map { it.name } } - override val name: String by unsafeLazy { simpleNames.asString() } - - /** - * @return the fully qualified name of a generated Android - * resource, like `com.example.R.string.app_name` from the - * combination of `com.example.R` and `R.string.app_name` - * @since 0.12.0 - */ - fun toQualifiedDeclaredName( - androidRDeclaration: AndroidRDeclaredName - ): QualifiedAndroidResourceDeclaredName { - return AndroidResourceDeclaredName.qualifiedAndroidResource( - sourceR = AndroidRReferenceName(androidRDeclaration.packageName, XML), - sourceResource = UnqualifiedAndroidResourceReferenceName(this.name, XML) - ) - } - - override fun equals(other: Any?): Boolean { - if (this === other) return true - - when (other) { - is ReferenceName -> { - - if (name != other.name) return false - } - - is UnqualifiedAndroidResource -> { - - if (prefix != other.prefix) return false - if (identifier != other.identifier) return false - } - - else -> return false - } - return true - } - - override fun hashCode(): Int = name.hashCode() - - override fun toString(): String = "(${this::class.java.simpleName}) `$name`" - - companion object { - - /** - * `R.anim.foo` - * - * @since 0.12.0 - */ - fun anim(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("anim".asSimpleName(), identifier = identifier) - - /** - * `R.animator.foo` - * - * @since 0.12.0 - */ - fun animator(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("animator".asSimpleName(), identifier = identifier) - - /** - * `R.array.foo` - * - * @since 0.12.0 - */ - fun array(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("array".asSimpleName(), identifier = identifier) - - /** - * `R.bool.foo` - * - * @since 0.12.0 - */ - fun bool(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("bool".asSimpleName(), identifier = identifier) - - /** - * `R.color.foo` - * - * @since 0.12.0 - */ - fun color(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("color".asSimpleName(), identifier = identifier) - - /** - * `R.dimen.foo` - * - * @since 0.12.0 - */ - fun dimen(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("dimen".asSimpleName(), identifier = identifier) - - /** - * `R.drawable.foo` - * - * @since 0.12.0 - */ - fun drawable(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("drawable".asSimpleName(), identifier = identifier) - - /** - * `R.font.foo` - * - * @since 0.12.0 - */ - fun font(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("font".asSimpleName(), identifier = identifier) - - /** - * `R.id.foo` - * - * @since 0.12.0 - */ - fun id(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("id".asSimpleName(), identifier = identifier) - - /** - * `R.integer.foo` - * - * @since 0.12.0 - */ - fun integer(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("integer".asSimpleName(), identifier = identifier) - - /** - * `R.layout.foo` - * - * @since 0.12.0 - */ - fun layout(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("layout".asSimpleName(), identifier = identifier) - - /** - * `R.menu.foo` - * - * @since 0.12.0 - */ - fun menu(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("menu".asSimpleName(), identifier = identifier) - - /** - * `R.mipmap.foo` - * - * @since 0.12.0 - */ - fun mipmap(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("mipmap".asSimpleName(), identifier = identifier) - - /** - * `R.raw.foo` - * - * @since 0.12.0 - */ - fun raw(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("raw".asSimpleName(), identifier = identifier) - - /** - * `R.string.foo` - * - * @since 0.12.0 - */ - fun string(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("string".asSimpleName(), identifier = identifier) - - /** - * `R.style.foo` - * - * @since 0.12.0 - */ - fun style(identifier: SimpleName): UnqualifiedAndroidResource = - UnqualifiedAndroidResource("style".asSimpleName(), identifier = identifier) - - /** - * @return all resources declared within the given [file] - * @since 0.12.0 - */ - fun fromFile(file: File): UnqualifiedAndroidResource? { - val dir = file.toPath().parent?.name ?: return null - val name = file.nameWithoutExtension - - return when { - dir.startsWith("anim") -> anim(name.asSimpleName()) - dir.startsWith("animator") -> animator(name.asSimpleName()) - dir.startsWith("color") -> color(name.asSimpleName()) - dir.startsWith("dimen") -> dimen(name.asSimpleName()) - dir.startsWith("drawable") -> drawable(name.asSimpleName()) - dir.startsWith("font") -> font(name.asSimpleName()) - dir.startsWith("layout") -> layout(name.asSimpleName()) - dir.startsWith("menu") -> menu(name.asSimpleName()) - dir.startsWith("mipmap") -> mipmap(name.asSimpleName()) - dir.startsWith("raw") -> raw(name.asSimpleName()) - else -> null - } - } - - /** - * @return `R.id.foo` for [type] `id` and [name] `foo` - * @since 0.12.0 - */ - fun fromValuePair(type: String, name: String): UnqualifiedAndroidResource? { - val fixedName = name.replace('.', '_') - return when (type.removePrefix("android:")) { - "anim" -> anim(fixedName.asSimpleName()) - "animator" -> animator(fixedName.asSimpleName()) - "array" -> array(fixedName.asSimpleName()) - "bool" -> bool(fixedName.asSimpleName()) - "color" -> color(fixedName.asSimpleName()) - "dimen" -> dimen(fixedName.asSimpleName()) - "drawable" -> drawable(fixedName.asSimpleName()) - "font" -> font(fixedName.asSimpleName()) - "id" -> id(fixedName.asSimpleName()) - "integer" -> integer(fixedName.asSimpleName()) - "integer-array" -> array(fixedName.asSimpleName()) - "layout" -> layout(fixedName.asSimpleName()) - "menu" -> menu(fixedName.asSimpleName()) - "mipmap" -> mipmap(fixedName.asSimpleName()) - "raw" -> raw(fixedName.asSimpleName()) - "string" -> string(fixedName.asSimpleName()) - "style" -> style(fixedName.asSimpleName()) - else -> null - } - } - - private val REGEX = """"?@\+?(.*)\/(.*)"?""".toRegex() - - /** - * @return a resource declaration from a string in XML, like `@+id/______` - * @since 0.12.0 - */ - fun fromXmlString(str: String): UnqualifiedAndroidResource? { - val (prefix, name) = REGEX.find(str)?.destructured ?: return null - - return fromValuePair(prefix, name) - } - } -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/AndroidDataBindingNameProvider.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/AndroidDataBindingNameProvider.kt deleted file mode 100644 index b6947a2539..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/AndroidDataBindingNameProvider.kt +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source.internal - -import modulecheck.parsing.source.AndroidDataBindingDeclaredName -import modulecheck.utils.lazy.LazySet - -fun interface AndroidDataBindingNameProvider { - - suspend fun get(): LazySet -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/AndroidRNameProvider.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/AndroidRNameProvider.kt deleted file mode 100644 index a7650e85f4..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/AndroidRNameProvider.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source.internal - -import modulecheck.parsing.source.AndroidRDeclaredName -import modulecheck.utils.lazy.LazySet - -interface AndroidRNameProvider { - - /** - * @return an R name if one exists for this package such that it can be - * used without an import, or null if no R is declared in this package. - * @since 0.12.0 - */ - suspend fun getLocalOrNull(): AndroidRDeclaredName? - - /** - * @return all R names (such as `com.example.lib1.R`) available to this source set - * @since 0.12.0 - */ - suspend fun getAll(): LazySet -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/InterpretingInterceptor.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/InterpretingInterceptor.kt deleted file mode 100644 index bf692cfcbe..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/InterpretingInterceptor.kt +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source.internal - -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.append -import modulecheck.utils.mapToSet - -class InterpretingInterceptor : ParsingInterceptor { - override suspend fun intercept(chain: ParsingInterceptor.Chain): NameParser.NameParserPacket { - - val packet = chain.packet - - val trimmedWildcards = packet.wildcardImports.map { it.removeSuffix(".*") } - val newResolved = mutableSetOf() - val newApi = mutableSetOf() - - chain.packet.unresolved - .forEach { toResolve -> - - val interpreted = buildSet { - // no import - add(ReferenceName.invoke(toResolve, packet.referenceLanguage)) - - // concat with package - add( - ReferenceName( - packet.packageName.append(toResolve), - packet.referenceLanguage - ) - ) - - // concat with any wildcard imports - addAll( - trimmedWildcards.mapToSet { - ReferenceName( - name = "$it.$toResolve", - language = packet.referenceLanguage - ) - } - ) - } - - newResolved.addAll(interpreted) - if (packet.mustBeApi.contains(toResolve)) { - newApi.addAll(interpreted) - } - } - - return packet.copy( - resolved = packet.resolved + newResolved, - apiReferenceNames = packet.apiReferenceNames + newApi, - unresolved = emptySet() - ) - } -} diff --git a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/NameParser.kt b/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/NameParser.kt deleted file mode 100644 index 32fd7abcb1..0000000000 --- a/modulecheck-parsing/source/api/src/main/kotlin/modulecheck/parsing/source/internal/NameParser.kt +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source.internal - -import modulecheck.parsing.source.McName -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.internal.NameParser.NameParserPacket - -fun interface NameParser { - suspend fun parse(packet: NameParserPacket): NameParserPacket - - /** - * @property packageName the package name declared for this associated file - * @property imports all fully qualified names from import statements - * @property wildcardImports all wildcard "ullUnder" imports for this file - * @property aliasedImports a map of alias name to the normal fully qualified name being aliased - * @property resolved all fully qualified names which have already been resolved - * @property unresolved all names which have not yet been resolved - * @property mustBeApi every declaration which is part of the public api - * @property apiReferenceNames every reference which is part of the public api - * @property referenceLanguage is this file Java or Kotlin? - * @property stdLibNameOrNull returns a [ReferenceName] if the receiver - * name is part of the stdlib of this [referenceLanguage], otherwise null - * @since 0.12.0 - */ - data class NameParserPacket( - val packageName: PackageName, - val imports: Set, - val wildcardImports: Set, - val aliasedImports: Map, - val resolved: Set, - val unresolved: Set, - // should be a subset of [unresolved] - val mustBeApi: Set, - val apiReferenceNames: Set, - val referenceLanguage: McName.CompatibleLanguage, - val stdLibNameOrNull: String.() -> QualifiedDeclaredName? - ) { - override fun toString(): String { - return """NameParserPacket( - |packageName='${packageName.name}', - | - |imports=$imports, - | - |wildcardImports=$wildcardImports, - | - |aliasedImports=$aliasedImports, - | - |resolved=$resolved, - | - |unresolved=$unresolved, - | - |mustBeApi=$mustBeApi, - | - |apiReferences=$apiReferenceNames - | - |) - """.trimMargin() - } - } -} - -class ParsingChain private constructor( - override val packet: NameParserPacket, - private val interceptors: List -) : ParsingInterceptor.Chain { - - override suspend fun proceed(packet: NameParserPacket): NameParserPacket { - val next = ParsingChain(packet, interceptors.drop(1)) - - val interceptor = interceptors.first() - - return interceptor.intercept(next) - } - - class Factory( - private val interceptors: List - ) : NameParser { - - override suspend fun parse(packet: NameParserPacket): NameParserPacket { - - return ParsingChain(packet, interceptors).proceed(packet) - } - } -} - -fun interface ParsingInterceptor { - - suspend fun intercept(chain: Chain): NameParserPacket - - interface Chain { - val packet: NameParserPacket - - /** - * Passes the [packet] argument on to the next interceptor in this chain. - * - * @since 0.12.0 - */ - suspend fun proceed(packet: NameParserPacket): NameParserPacket - } -} diff --git a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/AsDeclaredNameTest.kt b/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/AsDeclaredNameTest.kt deleted file mode 100644 index 28f3579c57..0000000000 --- a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/AsDeclaredNameTest.kt +++ /dev/null @@ -1,154 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import io.kotest.matchers.shouldBe -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.PackageName.Companion.asPackageName -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import org.jetbrains.kotlin.name.FqName -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test - -internal class AsDeclaredNameTest { - - @Nested - inner class `FqName` { - - @Test - fun `FqName asDeclaredName with nested type treats outer type as simple name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Outer".asSimpleName(), "Inner".asSimpleName()) - - val asString = packageName.append(simpleNames.map { it.name }) - - FqName(asString).asDeclaredName(packageName) shouldBe DeclaredName.agnostic( - packageName = packageName, - simpleNames = simpleNames - ) - } - - @Test - fun `asDeclaredName with no language creates agnostic declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - val asString = packageName.append(simpleNames.map { it.name }) - - FqName(asString).asDeclaredName(packageName) shouldBe DeclaredName.agnostic( - packageName = packageName, - simpleNames = simpleNames - ) - } - - @Test - fun `asDeclaredName with Kotlin language creates Kotlin declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - val asString = packageName.append(simpleNames.map { it.name }) - - FqName(asString).asDeclaredName(packageName, KOTLIN) shouldBe DeclaredName.kotlin( - packageName = packageName, - simpleNames = simpleNames - ) - } - - @Test - fun `asDeclaredName with Java language creates Java declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - val asString = packageName.append(simpleNames.map { it.name }) - - FqName(asString).asDeclaredName(packageName, JAVA) shouldBe DeclaredName.java( - packageName = packageName, - simpleNames = simpleNames - ) - } - - @Test - fun `asDeclaredName with Java and Kotlin languages creates agnostic declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - val asString = packageName.append(simpleNames.map { it.name }) - - FqName(asString).asDeclaredName(packageName, JAVA, KOTLIN) shouldBe DeclaredName.agnostic( - packageName = packageName, - simpleNames = simpleNames - ) - } - } - - @Nested - inner class `iterable receiver` { - - @Test - fun `asDeclaredName with no language creates agnostic declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - simpleNames.asDeclaredName(packageName) shouldBe DeclaredName.agnostic( - packageName = packageName, - simpleNames = simpleNames - ) - } - - @Test - fun `asDeclaredName with Kotlin language creates Kotlin declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - simpleNames.asDeclaredName(packageName, KOTLIN) shouldBe DeclaredName.kotlin( - packageName = packageName, - simpleNames = simpleNames - ) - } - - @Test - fun `asDeclaredName with Java language creates Java declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - simpleNames.asDeclaredName(packageName, JAVA) shouldBe DeclaredName.java( - packageName = packageName, - simpleNames = simpleNames - ) - } - - @Test - fun `asDeclaredName with Java and Kotlin languages creates agnostic declared name`() { - - val packageName = "com.test".asPackageName() - val simpleNames = listOf("Subject".asSimpleName()) - - simpleNames.asDeclaredName(packageName, JAVA, KOTLIN) shouldBe DeclaredName.agnostic( - packageName = packageName, - simpleNames = simpleNames - ) - } - } -} diff --git a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/BaseMcNameTest.kt b/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/BaseMcNameTest.kt deleted file mode 100644 index 0f914a1860..0000000000 --- a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/BaseMcNameTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import com.rickbusarow.kase.DefaultTestEnvironment.Factory -import com.rickbusarow.kase.HasTestEnvironmentFactory -import com.rickbusarow.kase.Kase1 -import com.rickbusarow.kase.kases -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.testing.assertions.TrimmedAsserts -import modulecheck.utils.letIf - -@Suppress("UnnecessaryAbstractClass") -abstract class BaseMcNameTest : - HasTestEnvironmentFactory, - TrimmedAsserts { - - override val testEnvironmentFactory = Factory() - - fun allReferenceNames( - name: String = "com.test.Subject", - skipUnqualified: Boolean = false, - languages: List = listOf(JAVA, KOTLIN, XML) - ): List> { - - return languages.flatMap { lang -> - listOf( - ReferenceName(name, lang), - AndroidDataBindingReferenceName(name, lang), - QualifiedAndroidResourceReferenceName(name, lang) - ).letIf(!skipUnqualified) { - it + UnqualifiedAndroidResourceReferenceName(name, lang) - } - } - .let { kases(it) } - } -} diff --git a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/DeclaredNameTest.kt b/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/DeclaredNameTest.kt deleted file mode 100644 index 51aae01e73..0000000000 --- a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/DeclaredNameTest.kt +++ /dev/null @@ -1,114 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import modulecheck.parsing.source.SimpleName.Companion.asSimpleName -import org.junit.jupiter.api.Test - -class DeclaredNameTest : BaseMcNameTest() { - - @Test - fun `duplicate names of incompatible types are allowed in a set`() { - val list = listOf( - DeclaredName.java( - PackageName("com.modulecheck"), - listOf("name".asSimpleName()) - ), - DeclaredName.kotlin( - PackageName("com.modulecheck"), - listOf("name".asSimpleName()) - ) - ) - - val set = list.toSet() - - set.toList() shouldBe list - } - - @Test - fun `duplicate names of compatible types are allowed in a set`() { - val list = listOf( - DeclaredName.agnostic( - PackageName("com.modulecheck"), - listOf("name".asSimpleName()) - ), - DeclaredName.kotlin( - PackageName("com.modulecheck"), - listOf("name".asSimpleName()) - ) - ) - - val set = list.toSet() - - set.toList() shouldBe list - } - - @Test - fun `sorting should be by name first, then the name of the DeclaredName class`() { - val packageNames = listOf("a", "b", "c", "d") - val simpleNames = listOf("X", "Y", "Z") - - val instances = packageNames - .reversed() - .flatMap { packageName -> - simpleNames - .reversed() - .flatMap { simpleName -> - - listOf( - DeclaredName.kotlin( - PackageName(packageName), - listOf(simpleName.asSimpleName()) - ), - DeclaredName.agnostic( - PackageName(packageName), - listOf(simpleName.asSimpleName()) - ), - DeclaredName.java( - PackageName(packageName), - listOf(simpleName.asSimpleName()) - ), - AndroidResourceDeclaredName.r(PackageName(packageName)) - ) - } - } - .shuffled() - // Android R names will be duplicated, so clean those up - .distinctBy { it.name to it::class } - - val prettySorted = instances.sorted() - .joinToString("\n") { "${it::class.java.simpleName.padStart(28)} ${it.name}" } - - prettySorted shouldBe """ - AndroidRDeclaredName a.R - QualifiedDeclaredNameImpl a.X - QualifiedDeclaredNameImpl a.Y - QualifiedDeclaredNameImpl a.Z - AndroidRDeclaredName b.R - QualifiedDeclaredNameImpl b.X - QualifiedDeclaredNameImpl b.Y - QualifiedDeclaredNameImpl b.Z - AndroidRDeclaredName c.R - QualifiedDeclaredNameImpl c.X - QualifiedDeclaredNameImpl c.Y - QualifiedDeclaredNameImpl c.Z - AndroidRDeclaredName d.R - QualifiedDeclaredNameImpl d.X - QualifiedDeclaredNameImpl d.Y - QualifiedDeclaredNameImpl d.Z - """.trimIndent() - } -} diff --git a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/PackageNameTest.kt b/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/PackageNameTest.kt deleted file mode 100644 index 911a1d8d87..0000000000 --- a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/PackageNameTest.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import io.kotest.assertions.throwables.shouldNotThrow -import io.kotest.assertions.throwables.shouldThrowWithMessage -import io.kotest.matchers.shouldBe -import io.kotest.property.Arb -import io.kotest.property.arbitrary.stringPattern -import modulecheck.parsing.source.PackageName.DEFAULT -import modulecheck.testing.forAllBlocking -import org.junit.jupiter.api.Test - -internal class PackageNameTest { - - @Test - fun `any non-empty name string just becomes wrapped by the class`() { - - Arb.stringPattern("""(.|\s)*\S(.|\s)*""") - .forAllBlocking { name -> - - shouldNotThrow { - PackageName(name) - } - } - } - - @Test - fun `an empty package name parameter to PackageNameImpl throws exception with message`() { - - shouldThrowWithMessage( - "A ${PackageNameImpl::class.qualifiedName} must be a non-empty, " + - "non-blank String. Represent an empty/blank " + - "or missing package name as ${DEFAULT::class.qualifiedName}. " + - "This name argument, wrapped in single quotes: ''" - ) { - PackageNameImpl("") - } - } - - @Test - fun `a blank package name parameter to PackageNameImpl throws exception with message`() { - - Arb.stringPattern("\\s*") - .forAllBlocking { name -> - - shouldThrowWithMessage( - "A ${PackageNameImpl::class.qualifiedName} must be a non-empty, " + - "non-blank String. Represent an empty/blank " + - "or missing package name as ${DEFAULT::class.qualifiedName}. " + - "This name argument, wrapped in single quotes: '$name'" - ) { - PackageNameImpl(name) - } - } - } - - @Test - fun `an empty package name becomes DEFAULT`() { - - PackageName("") shouldBe DEFAULT - } - - @Test - fun `a blank package name becomes DEFAULT`() { - - Arb.stringPattern("\\s*") - .forAllBlocking { name -> - - PackageName(name) shouldBe DEFAULT - } - } -} diff --git a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/ReferenceNameTest.kt b/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/ReferenceNameTest.kt deleted file mode 100644 index 1138670387..0000000000 --- a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/ReferenceNameTest.kt +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import com.rickbusarow.kase.asTests -import io.kotest.matchers.shouldNotBe -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.TestFactory - -class ReferenceNameTest : BaseMcNameTest() { - - @Nested - inner class `java reference` { - - val subject = ReferenceName("com.test.Subject", JAVA) - - @TestFactory - fun `equals matches other reference types with the same name and language`() = - allReferenceNames("com.test.Subject", languages = listOf(JAVA)) - .asTests { (other) -> - - other shouldBe subject - subject shouldBe other - } - - @TestFactory - fun `equals does not match any reference types with a different language`() = - allReferenceNames("com.test.Subject", languages = listOf(XML, KOTLIN)) - .asTests { (other) -> - - other shouldNotBe subject - subject shouldNotBe other - } - - @TestFactory - fun `equals does not match any reference types with a different name`() = - allReferenceNames("com.test.Other", languages = listOf(JAVA)) - .asTests { (other) -> - - other shouldNotBe subject - subject shouldNotBe other - } - } - - @Test - fun `duplicate names of different languages are allowed in a set`() { - val list = listOf( - ReferenceName("name", KOTLIN), - ReferenceName("name", JAVA), - ReferenceName("name", XML) - ) - - val set = list.toSet() - - set.toList() shouldBe list - } - - @Test - fun `Android R reference equals Android R declaration`() { - - val r = AndroidRReferenceName(PackageName("com.test"), KOTLIN) - val d = AndroidResourceDeclaredName.r(PackageName("com.test")) - - r shouldBe d - - setOf(d).contains(r) shouldBe true - setOf(r).contains(d) shouldBe true - - d shouldBe r - } -} diff --git a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/SimpleNameTest.kt b/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/SimpleNameTest.kt deleted file mode 100644 index 1b275b77dc..0000000000 --- a/modulecheck-parsing/source/api/src/test/kotlin/modulecheck/parsing/source/SimpleNameTest.kt +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.source - -import io.kotest.assertions.throwables.shouldNotThrow -import io.kotest.assertions.throwables.shouldThrowWithMessage -import io.kotest.matchers.shouldBe -import io.kotest.property.Arb -import io.kotest.property.arbitrary.stringPattern -import modulecheck.testing.forAllBlocking -import org.junit.jupiter.api.Test - -internal class SimpleNameTest { - - @Test - fun `any valid name string just becomes wrapped by the class`() { - - Arb.stringPattern("""^([a-zA-Z_$][a-zA-Z\d_$]*)|(`.*`)$""") - .forAllBlocking { name -> - - shouldNotThrow { - SimpleName(name) - } - } - } - - @Test - fun `a name with whitespaces is allowed if wrapped in backticks`() { - - val name = "`a name with whitespaces is allowed if wrapped in backticks`" - - shouldNotThrow { - SimpleName(name).name shouldBe name - } - } - - @Test - fun `a name with a white space throws exception with message`() { - - Arb.stringPattern("""\s+""") - .forAllBlocking { name -> - - shouldThrowWithMessage( - "SimpleName names must be valid Java identifier " + - "without a dot qualifier or whitespace. This name was: `$name`" - ) { - SimpleName(name) - } - } - } - - @Test - fun `a name with a dot throws exception with message`() { - - Arb.stringPattern("""\.+""") - .forAllBlocking { name -> - - shouldThrowWithMessage( - "SimpleName names must be valid Java identifier " + - "without a dot qualifier or whitespace. This name was: `$name`" - ) { - SimpleName(name) - } - } - } - - @Test - fun `an empty name throws exception with message`() { - - shouldThrowWithMessage( - "SimpleName names must be valid Java identifier " + - "without a dot qualifier or whitespace. This name was: ``" - ) { - SimpleName("") - } - } - - @Test - fun `a blank name throws exception with message`() { - - Arb.stringPattern("\\s*") - .forAllBlocking { name -> - - shouldThrowWithMessage( - "SimpleName names must be valid Java identifier " + - "without a dot qualifier or whitespace. This name was: `$name`" - ) { - SimpleName(name) - } - } - } - - @Test - fun `an empty package name becomes DEFAULT`() { - - PackageName("") shouldBe PackageName.DEFAULT - } - - @Test - fun `a blank package name becomes DEFAULT`() { - - Arb.stringPattern("\\s*") - .forAllBlocking { name -> - - PackageName(name) shouldBe PackageName.DEFAULT - } - } -} diff --git a/modulecheck-parsing/source/testing/api/testing.api b/modulecheck-parsing/source/testing/api/testing.api deleted file mode 100644 index 161dc6cbfb..0000000000 --- a/modulecheck-parsing/source/testing/api/testing.api +++ /dev/null @@ -1,64 +0,0 @@ -public abstract interface class modulecheck/parsing/test/McNameTest : modulecheck/testing/assertions/TrimmedAsserts { - public fun agnostic (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static synthetic fun agnostic$default (Lmodulecheck/parsing/test/McNameTest;Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public fun androidDataBinding (Ljava/lang/String;)Lmodulecheck/parsing/source/AndroidDataBindingReferenceName; - public fun androidR (Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/AndroidRReferenceName; - public static synthetic fun androidR$default (Lmodulecheck/parsing/test/McNameTest;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/AndroidRReferenceName; - public fun asReferenceName (Ljava/lang/String;)Lmodulecheck/parsing/source/ReferenceName; - public abstract fun getDefaultLanguage ()Lmodulecheck/parsing/source/McName$CompatibleLanguage; - public fun java (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static synthetic fun java$default (Lmodulecheck/parsing/test/McNameTest;Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public fun kotlin (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static synthetic fun kotlin$default (Lmodulecheck/parsing/test/McNameTest;Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public fun qualifiedAndroidResource (Ljava/lang/String;)Lmodulecheck/parsing/source/QualifiedAndroidResourceReferenceName; - public fun shouldBe (Ljava/util/Collection;Ljava/util/Collection;)V - public fun shouldBe (Ljava/util/List;Ljava/util/Collection;)V - public fun shouldBe (Lmodulecheck/utils/lazy/LazyDeferred;Ljava/util/Collection;)V - public fun shouldBe (Lmodulecheck/utils/lazy/LazySet;Ljava/util/Collection;)V - public fun shouldBeJvmFile (Lmodulecheck/parsing/source/JvmFile;Lkotlin/jvm/functions/Function1;)V - public fun unqualifiedAndroidResource (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName; -} - -public final class modulecheck/parsing/test/McNameTest$JvmFileBuilder { - public fun ()V - public final fun apiReferences (Lkotlin/jvm/functions/Function1;)V - public final fun declarations (Lkotlin/jvm/functions/Function1;)V - public final fun getApiReferenceNames ()Ljava/util/List; - public final fun getDeclarations ()Ljava/util/List; - public final fun getReferenceNames ()Ljava/util/List; - public final fun references (Lkotlin/jvm/functions/Function1;)V -} - -public final class modulecheck/parsing/test/McNameTest$JvmFileBuilder$ApiReferenceBuilder : modulecheck/parsing/test/McNameTest$JvmFileBuilder$ReferenceBuilder { - public fun (Lmodulecheck/parsing/test/McNameTest$JvmFileBuilder;)V -} - -public final class modulecheck/parsing/test/McNameTest$JvmFileBuilder$DeclarationsBuilder { - public fun (Lmodulecheck/parsing/test/McNameTest$JvmFileBuilder;)V - public final fun agnostic (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static synthetic fun agnostic$default (Lmodulecheck/parsing/test/McNameTest$JvmFileBuilder$DeclarationsBuilder;Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun java (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static synthetic fun java$default (Lmodulecheck/parsing/test/McNameTest$JvmFileBuilder$DeclarationsBuilder;Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public final fun kotlin (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/QualifiedDeclaredName; - public static synthetic fun kotlin$default (Lmodulecheck/parsing/test/McNameTest$JvmFileBuilder$DeclarationsBuilder;Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/QualifiedDeclaredName; -} - -public final class modulecheck/parsing/test/McNameTest$JvmFileBuilder$NormalReferenceBuilder : modulecheck/parsing/test/McNameTest$JvmFileBuilder$ReferenceBuilder { - public fun (Lmodulecheck/parsing/test/McNameTest$JvmFileBuilder;)V -} - -public class modulecheck/parsing/test/McNameTest$JvmFileBuilder$ReferenceBuilder { - public fun (Ljava/util/List;)V - public final fun androidDataBinding (Ljava/lang/String;)Lmodulecheck/parsing/source/AndroidDataBindingReferenceName; - public final fun androidR (Lmodulecheck/parsing/source/PackageName;)Lmodulecheck/parsing/source/AndroidRReferenceName; - public static synthetic fun androidR$default (Lmodulecheck/parsing/test/McNameTest$JvmFileBuilder$ReferenceBuilder;Lmodulecheck/parsing/source/PackageName;ILjava/lang/Object;)Lmodulecheck/parsing/source/AndroidRReferenceName; - public final fun java (Ljava/lang/String;)Lmodulecheck/parsing/source/ReferenceName; - public final fun kotlin (Ljava/lang/String;)Lmodulecheck/parsing/source/ReferenceName; - public final fun qualifiedAndroidResource (Ljava/lang/String;)Lmodulecheck/parsing/source/QualifiedAndroidResourceReferenceName; - public final fun unqualifiedAndroidResource (Ljava/lang/String;)Lmodulecheck/parsing/source/UnqualifiedAndroidResourceReferenceName; -} - -public final class modulecheck/parsing/test/McNameTestKt { - public static final fun prettyPrint (Ljava/util/Collection;)Ljava/lang/String; -} - diff --git a/modulecheck-parsing/source/testing/build.gradle.kts b/modulecheck-parsing/source/testing/build.gradle.kts deleted file mode 100644 index 71289dfd61..0000000000 --- a/modulecheck-parsing/source/testing/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-source-testing" - ) - anvil() -} - -dependencies { - - api(project(path = ":modulecheck-internal-testing")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-utils:lazy")) - - implementation(project(path = ":modulecheck-utils:trace")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/source/testing/src/main/kotlin/modulecheck/parsing/test/McNameTest.kt b/modulecheck-parsing/source/testing/src/main/kotlin/modulecheck/parsing/test/McNameTest.kt deleted file mode 100644 index 2117e74000..0000000000 --- a/modulecheck-parsing/source/testing/src/main/kotlin/modulecheck/parsing/test/McNameTest.kt +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.test - -import io.kotest.assertions.asClue -import io.kotest.assertions.assertSoftly -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.runBlocking -import modulecheck.parsing.source.AndroidDataBindingDeclaredName -import modulecheck.parsing.source.AndroidDataBindingReferenceName -import modulecheck.parsing.source.AndroidRDeclaredName -import modulecheck.parsing.source.AndroidRReferenceName -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.JvmFile -import modulecheck.parsing.source.McName -import modulecheck.parsing.source.McName.CompatibleLanguage -import modulecheck.parsing.source.McName.CompatibleLanguage.JAVA -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.McName.CompatibleLanguage.XML -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.QualifiedAndroidResourceDeclaredName -import modulecheck.parsing.source.QualifiedAndroidResourceReferenceName -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.ReferenceName.Companion.asReferenceName -import modulecheck.parsing.source.SimpleName.Companion.stripPackageNameFromFqName -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.parsing.source.UnqualifiedAndroidResourceReferenceName -import modulecheck.parsing.source.asDeclaredName -import modulecheck.testing.assertions.TrimmedAsserts -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.trace.Trace - -interface McNameTest : TrimmedAsserts { - - val defaultLanguage: CompatibleLanguage - - class JvmFileBuilder { - - val referenceNames: MutableList = mutableListOf() - val apiReferenceNames: MutableList = mutableListOf() - val declarations: MutableList = mutableListOf() - - fun references(builder: NormalReferenceBuilder.() -> Unit) { - NormalReferenceBuilder().builder() - } - - fun apiReferences(builder: ApiReferenceBuilder.() -> Unit) { - ApiReferenceBuilder().builder() - } - - fun declarations(builder: DeclarationsBuilder.() -> Unit) { - DeclarationsBuilder().builder() - } - - open class ReferenceBuilder( - private val target: MutableList - ) { - - fun androidR(packageName: PackageName = PackageName("com.test")): AndroidRReferenceName = - AndroidRReferenceName(packageName, XML) - .also { target.add(it) } - - fun androidDataBinding(name: String): AndroidDataBindingReferenceName = - AndroidDataBindingReferenceName(name, XML) - .also { target.add(it) } - - fun qualifiedAndroidResource(name: String): QualifiedAndroidResourceReferenceName = - QualifiedAndroidResourceReferenceName(name, XML) - .also { target.add(it) } - - fun unqualifiedAndroidResource(name: String): UnqualifiedAndroidResourceReferenceName = - UnqualifiedAndroidResourceReferenceName(name, XML) - .also { target.add(it) } - - fun kotlin(name: String): ReferenceName = ReferenceName(name, KOTLIN) - .also { target.add(it) } - - fun java(name: String): ReferenceName = ReferenceName(name, JAVA) - .also { target.add(it) } - } - - inner class NormalReferenceBuilder : ReferenceBuilder(referenceNames) - - inner class ApiReferenceBuilder : ReferenceBuilder(apiReferenceNames) - - inner class DeclarationsBuilder { - fun kotlin( - name: String, - packageName: PackageName = PackageName("com.subject") - ): QualifiedDeclaredName = DeclaredName.kotlin( - packageName, - name.stripPackageNameFromFqName(packageName) - ) - .also { declarations.add(it) } - - fun java( - name: String, - packageName: PackageName = PackageName("com.subject") - ): QualifiedDeclaredName = DeclaredName.java( - packageName, - name.stripPackageNameFromFqName(packageName) - ) - .also { declarations.add(it) } - - fun agnostic( - name: String, - packageName: PackageName = PackageName("com.subject") - ): QualifiedDeclaredName = name.stripPackageNameFromFqName(packageName) - .asDeclaredName(packageName) - .also { declarations.add(it) } - } - } - - infix fun JvmFile.shouldBeJvmFile(config: JvmFileBuilder.() -> Unit) { - - val other = JvmFileBuilder().also { it.config() } - - assertSoftly { - "references".asClue { - references shouldBe other.referenceNames - } - "api references".asClue { - apiReferences shouldBe other.apiReferenceNames - } - "declarations".asClue { - declarations shouldBe other.declarations - } - } - } - - infix fun Collection.shouldBe(other: Collection) { - prettyPrint().trimmedShouldBe(other.prettyPrint(), McNameTest::class) - } - - infix fun LazySet.shouldBe(other: Collection) { - runBlocking(Trace.start(McNameTest::class)) { - toList() - .distinct() - .prettyPrint().trimmedShouldBe(other.prettyPrint(), McNameTest::class) - } - } - - infix fun LazyDeferred>.shouldBe(other: Collection) { - runBlocking(Trace.start(McNameTest::class)) { - await() - .distinct() - .prettyPrint().trimmedShouldBe(other.prettyPrint(), McNameTest::class) - } - } - - infix fun List>.shouldBe(other: Collection) { - runBlocking(Trace.start(McNameTest::class)) { - flatMap { it.get() } - .distinct() - .prettyPrint() - .trimmedShouldBe(other.prettyPrint(), McNameTest::class) - } - } - - fun kotlin( - name: String, - packageName: PackageName = PackageName("com.subject") - ): QualifiedDeclaredName = - DeclaredName.kotlin(packageName, name.stripPackageNameFromFqName(packageName)) - - fun java( - name: String, - packageName: PackageName = PackageName("com.subject") - ): QualifiedDeclaredName = - DeclaredName.java(packageName, name.stripPackageNameFromFqName(packageName)) - - fun agnostic( - name: String, - packageName: PackageName = PackageName("com.subject") - ): QualifiedDeclaredName = - name.stripPackageNameFromFqName(packageName).asDeclaredName(packageName) - - fun String.asReferenceName() = this@asReferenceName.asReferenceName(defaultLanguage) - - fun androidR(packageName: PackageName = PackageName("com.test")): AndroidRReferenceName = - AndroidRReferenceName(packageName, defaultLanguage) - - fun androidDataBinding(name: String): AndroidDataBindingReferenceName = - AndroidDataBindingReferenceName(name, defaultLanguage) - - fun qualifiedAndroidResource(name: String): QualifiedAndroidResourceReferenceName = - QualifiedAndroidResourceReferenceName(name, defaultLanguage) - - fun unqualifiedAndroidResource(name: String): UnqualifiedAndroidResourceReferenceName = - UnqualifiedAndroidResourceReferenceName(name, defaultLanguage) -} - -fun Collection.prettyPrint(): String = asSequence() - .map { mcName -> - val typeName = when (mcName) { - // references - is UnqualifiedAndroidResourceReferenceName -> "unqualifiedAndroidResource" - is AndroidRReferenceName -> "androidR" - is QualifiedAndroidResourceReferenceName -> "qualifiedAndroidResource" - is AndroidDataBindingReferenceName -> "androidDataBinding" - is ReferenceName -> when { - mcName.isJava() -> "java" - mcName.isKotlin() -> "kotlin" - mcName.isXml() -> "xml" - else -> throw IllegalArgumentException("???") - } - - is AndroidRDeclaredName -> "androidR" - is UnqualifiedAndroidResource -> mcName.prefix.name - is QualifiedAndroidResourceDeclaredName -> "qualifiedAndroidResource" - is AndroidDataBindingDeclaredName -> "androidDataBinding" - - // declarations - is QualifiedDeclaredName -> { - when { - mcName.languages.containsAll(setOf(KOTLIN, JAVA)) -> "agnostic" - mcName.languages.contains(KOTLIN) -> "kotlin" - mcName.languages.contains(JAVA) -> "java" - mcName.languages.contains(XML) -> "xml" - else -> throw IllegalArgumentException("???") - } - } - // package - is PackageName -> "packageName" - } - typeName to mcName - } - .groupBy { it.first } - .toList() - .sortedBy { it.first } - .joinToString("\n") { (typeName, pairs) -> - - pairs.map { it.second } - .sortedBy { it.name } - .joinToString("\n", "$typeName {\n", "\n}") { "\t${it.name}" } - } diff --git a/modulecheck-parsing/wiring/api/wiring.api b/modulecheck-parsing/wiring/api/wiring.api deleted file mode 100644 index 5e61e1b970..0000000000 --- a/modulecheck-parsing/wiring/api/wiring.api +++ /dev/null @@ -1,175 +0,0 @@ -public final class anvil/hint/Modulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_1921deb2_e05bb092Kt { - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_1921deb2_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_1921deb2_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_b4fd52ee_665a4d48Kt { - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_b4fd52ee_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_b4fd52ee_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_ddc1b456_8239e589Kt { - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_ddc1b456_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_ddc1b456_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_e67e1b72_fb328d24Kt { - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_e67e1b72_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_parsing_wiring_Factory_Factory_TaskScope_BindingModule_e67e1b72_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/parsing/wiring/AndroidDataBindingReferenceParsingInterceptor : modulecheck/parsing/source/internal/ParsingInterceptor { - public fun (Lmodulecheck/parsing/source/internal/AndroidDataBindingNameProvider;)V - public fun intercept (Lmodulecheck/parsing/source/internal/ParsingInterceptor$Chain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/AndroidResourceReferenceParsingInterceptor : modulecheck/parsing/source/internal/ParsingInterceptor { - public fun (Lmodulecheck/parsing/source/internal/AndroidRNameProvider;)V - public fun intercept (Lmodulecheck/parsing/source/internal/ParsingInterceptor$Chain;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/parsing/wiring/Factory_Factory_TaskScope_BindingModule_1921deb2 { - public abstract fun bindFactory (Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider$Factory;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider$Factory; -} - -public abstract interface class modulecheck/parsing/wiring/Factory_Factory_TaskScope_BindingModule_b4fd52ee { - public abstract fun bindFactory (Lmodulecheck/parsing/wiring/RealPluginsBlockProvider$Factory;)Lmodulecheck/parsing/gradle/dsl/PluginsBlockProvider$Factory; -} - -public abstract interface class modulecheck/parsing/wiring/Factory_Factory_TaskScope_BindingModule_ddc1b456 { - public abstract fun bindFactory (Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider$Factory;)Lmodulecheck/parsing/gradle/dsl/DependenciesBlocksProvider$Factory; -} - -public abstract interface class modulecheck/parsing/wiring/Factory_Factory_TaskScope_BindingModule_e67e1b72 { - public abstract fun bindFactory (Lmodulecheck/parsing/wiring/RealJvmFileProvider$Factory;)Lmodulecheck/project/JvmFileProvider$Factory; -} - -public final class modulecheck/parsing/wiring/JvmFileCache { - public fun ()V - public final fun getOrPut (Ljava/io/File;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/JvmFileCache_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/parsing/wiring/JvmFileCache_Factory; - public static final fun create ()Lmodulecheck/parsing/wiring/JvmFileCache_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/wiring/JvmFileCache; - public static final fun newInstance ()Lmodulecheck/parsing/wiring/JvmFileCache; -} - -public final class modulecheck/parsing/wiring/RealAndroidDataBindingNameProvider : modulecheck/parsing/source/internal/AndroidDataBindingNameProvider { - public synthetic fun (Lmodulecheck/project/McProject;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/RealAndroidGradleSettingsProvider : modulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider { - public fun (Lmodulecheck/parsing/groovy/antlr/GroovyAndroidGradleParser;Lmodulecheck/parsing/psi/KotlinAndroidGradleParser;Ljava/io/File;)V - public fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/RealAndroidGradleSettingsProvider$Factory : modulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider$Factory { - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public synthetic fun create (Ljava/io/File;)Lmodulecheck/parsing/gradle/dsl/AndroidGradleSettingsProvider; - public fun create (Ljava/io/File;)Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider; -} - -public final class modulecheck/parsing/wiring/RealAndroidGradleSettingsProvider_Factory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider_Factory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider_Factory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider$Factory; - public static final fun newInstance (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider$Factory; -} - -public final class modulecheck/parsing/wiring/RealAndroidGradleSettingsProvider_Factory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider_Factory_Factory; - public final fun newInstance (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealAndroidGradleSettingsProvider$Factory; -} - -public final class modulecheck/parsing/wiring/RealAndroidRNameProvider : modulecheck/parsing/source/internal/AndroidRNameProvider { - public synthetic fun (Lmodulecheck/project/McProject;Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getAll (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getLocalOrNull (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/RealDeclarationsProvider : modulecheck/parsing/psi/internal/DeclarationsProvider { - public fun (Lmodulecheck/project/McProject;)V - public fun get-WsCknJc (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getWithUpstream-WsCknJc (Ljava/lang/String;Lmodulecheck/parsing/source/PackageName;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/RealDependenciesBlocksProvider : modulecheck/parsing/gradle/dsl/DependenciesBlocksProvider { - public fun (Lmodulecheck/parsing/groovy/antlr/GroovyDependenciesBlockParser;Lmodulecheck/parsing/psi/KotlinDependenciesBlockParser;Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)V - public fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/RealDependenciesBlocksProvider$Factory : modulecheck/parsing/gradle/dsl/DependenciesBlocksProvider$Factory { - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public synthetic fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/gradle/dsl/DependenciesBlocksProvider; - public fun create (Lmodulecheck/parsing/gradle/dsl/InvokesConfigurationNames;)Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider; -} - -public final class modulecheck/parsing/wiring/RealDependenciesBlocksProvider_Factory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider_Factory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider_Factory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider$Factory; - public static final fun newInstance (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider$Factory; -} - -public final class modulecheck/parsing/wiring/RealDependenciesBlocksProvider_Factory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider_Factory_Factory; - public final fun newInstance (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealDependenciesBlocksProvider$Factory; -} - -public final class modulecheck/parsing/wiring/RealJvmFileProvider : modulecheck/project/JvmFileProvider { - public synthetic fun (Lmodulecheck/parsing/wiring/JvmFileCache;Lmodulecheck/project/McProject;Ljava/lang/String;Lmodulecheck/parsing/source/internal/AndroidRNameProvider;Lmodulecheck/parsing/source/internal/AndroidDataBindingNameProvider;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun getOrNull (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/RealJvmFileProvider$Factory : modulecheck/project/JvmFileProvider$Factory { - public fun (Ljavax/inject/Provider;)V - public fun create-wYXeOjA (Lmodulecheck/project/McProject;Ljava/lang/String;)Lmodulecheck/parsing/wiring/RealJvmFileProvider; - public synthetic fun create-wYXeOjA (Lmodulecheck/project/McProject;Ljava/lang/String;)Lmodulecheck/project/JvmFileProvider; -} - -public final class modulecheck/parsing/wiring/RealJvmFileProvider_Factory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/wiring/RealJvmFileProvider_Factory_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealJvmFileProvider_Factory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/wiring/RealJvmFileProvider$Factory; - public static final fun newInstance (Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealJvmFileProvider$Factory; -} - -public final class modulecheck/parsing/wiring/RealJvmFileProvider_Factory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealJvmFileProvider_Factory_Factory; - public final fun newInstance (Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealJvmFileProvider$Factory; -} - -public final class modulecheck/parsing/wiring/RealPluginsBlockProvider : modulecheck/parsing/gradle/dsl/PluginsBlockProvider { - public fun (Lmodulecheck/parsing/groovy/antlr/GroovyPluginsBlockParser;Lmodulecheck/parsing/psi/KotlinPluginsBlockParser;Ljava/io/File;Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;)V - public fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/parsing/wiring/RealPluginsBlockProvider$Factory : modulecheck/parsing/gradle/dsl/PluginsBlockProvider$Factory { - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;)V - public fun create (Ljava/io/File;)Lmodulecheck/parsing/gradle/dsl/PluginsBlockProvider; -} - -public final class modulecheck/parsing/wiring/RealPluginsBlockProvider_Factory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/parsing/wiring/RealPluginsBlockProvider_Factory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealPluginsBlockProvider_Factory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/parsing/wiring/RealPluginsBlockProvider$Factory; - public static final fun newInstance (Ljavax/inject/Provider;Ljavax/inject/Provider;Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;)Lmodulecheck/parsing/wiring/RealPluginsBlockProvider$Factory; -} - -public final class modulecheck/parsing/wiring/RealPluginsBlockProvider_Factory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/parsing/wiring/RealPluginsBlockProvider_Factory_Factory; - public final fun newInstance (Ljavax/inject/Provider;Ljavax/inject/Provider;Lmodulecheck/parsing/kotlin/compiler/NoContextPsiFileFactory;)Lmodulecheck/parsing/wiring/RealPluginsBlockProvider$Factory; -} - diff --git a/modulecheck-parsing/wiring/build.gradle.kts b/modulecheck-parsing/wiring/build.gradle.kts deleted file mode 100644 index 0aa5de92bd..0000000000 --- a/modulecheck-parsing/wiring/build.gradle.kts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-parsing-wiring" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-parsing:groovy-antlr")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - api(project(path = ":modulecheck-parsing:psi")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-utils:lazy")) - - implementation(project(path = ":modulecheck-api")) - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-parsing:java")) - implementation(project(path = ":modulecheck-utils:cache")) - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/AndroidDataBindingReferenceParsingInterceptor.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/AndroidDataBindingReferenceParsingInterceptor.kt deleted file mode 100644 index d94918ec33..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/AndroidDataBindingReferenceParsingInterceptor.kt +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import kotlinx.coroutines.flow.firstOrNull -import modulecheck.parsing.source.AndroidDataBindingReferenceName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.internal.AndroidDataBindingNameProvider -import modulecheck.parsing.source.internal.NameParser -import modulecheck.parsing.source.internal.ParsingInterceptor -import modulecheck.utils.coroutines.any -import modulecheck.utils.mapToSet - -class AndroidDataBindingReferenceParsingInterceptor( - private val androidDataBindingNameProvider: AndroidDataBindingNameProvider -) : ParsingInterceptor { - - override suspend fun intercept(chain: ParsingInterceptor.Chain): NameParser.NameParserPacket { - val packet = chain.packet - - val dataBindingReferenceNames = mutableSetOf() - - val stillUnresolved = packet.unresolved.toMutableSet() - - val dataBindingDeclarations = androidDataBindingNameProvider.get() - - if (dataBindingDeclarations.isNotEmpty()) { - - val concatenatedWildcards = packet.wildcardImports - .flatMap { wildcardImport -> - packet.unresolved - .map { toResolve -> - toResolve to AndroidDataBindingReferenceName( - name = wildcardImport.replace("*", toResolve), - language = packet.referenceLanguage - ) - } - } - - val fullyQualified = packet.unresolved - .map { - it to AndroidDataBindingReferenceName( - name = it, - language = packet.referenceLanguage - ) - } - - val fromUnresolved = concatenatedWildcards - .plus(fullyQualified) - .mapNotNull { (toResolve, ref) -> - dataBindingDeclarations.firstOrNull { ref.startsWith(it) } - ?.let { declaration -> - stillUnresolved.remove(toResolve) - setOf( - AndroidDataBindingReferenceName( - name = declaration.name, - language = packet.referenceLanguage - ), - ref - ) - } - } - .flatten() - - dataBindingReferenceNames.addAll(fromUnresolved) - - val fromResolved = packet.resolved - .map { it.name } - .mapNotNull { resolved -> - AndroidDataBindingReferenceName( - name = resolved, - language = packet.referenceLanguage - ) - .takeIf { ref -> dataBindingDeclarations.any { ref.startsWith(it) } } - }.toSet() - .plus(fromUnresolved) - - dataBindingReferenceNames.addAll(fromResolved) - } - - val newResolved = dataBindingReferenceNames + packet.resolved - - val newResolvedNames = newResolved.mapToSet { it.name } - - val new = packet.copy( - resolved = newResolved, - unresolved = stillUnresolved.filterNot { it in newResolvedNames }.toSet() - ) - - return chain.proceed(new) - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/AndroidResourceReferenceParsingInterceptor.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/AndroidResourceReferenceParsingInterceptor.kt deleted file mode 100644 index 18bf5b4d56..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/AndroidResourceReferenceParsingInterceptor.kt +++ /dev/null @@ -1,280 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import kotlinx.coroutines.flow.filter -import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.flow.mapNotNull -import kotlinx.coroutines.flow.toSet -import modulecheck.parsing.source.AndroidRDeclaredName -import modulecheck.parsing.source.AndroidRReferenceName -import modulecheck.parsing.source.QualifiedAndroidResourceReferenceName -import modulecheck.parsing.source.ReferenceName -import modulecheck.parsing.source.UnqualifiedAndroidResource -import modulecheck.parsing.source.UnqualifiedAndroidResourceReferenceName -import modulecheck.parsing.source.append -import modulecheck.parsing.source.internal.AndroidRNameProvider -import modulecheck.parsing.source.internal.NameParser -import modulecheck.parsing.source.internal.NameParser.NameParserPacket -import modulecheck.parsing.source.internal.ParsingInterceptor -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.mapToSet - -class AndroidResourceReferenceParsingInterceptor( - private val androidRNameProvider: AndroidRNameProvider -) : ParsingInterceptor { - - override suspend fun intercept(chain: ParsingInterceptor.Chain): NameParser.NameParserPacket { - val packet = chain.packet - val language = packet.referenceLanguage - - val allAvailableRNames = androidRNameProvider.getAll() - - val localROrNull = packet.findLocalROrNull(allAvailableRNames) - - val newFullyQualified = mutableSetOf() - - val usedRDeclarations = allAvailableRNames - .filter { rName -> - rName.isUsed( - packet = packet, - localROrNull = localROrNull - ) - } - .toSet() - - val resolvedRs: MutableSet = allAvailableRNames.mapResolved( - packet = packet, - localROrNull = localROrNull - ).toMutableSet() - - val validRPrefixes = usedRDeclarations + listOfNotNull(localROrNull) - - val unqualifiedFromResolved = packet.resolved - .mapNotNullTo(mutableSetOf()) { ref -> - val unqualifiedRRef = validRPrefixes - .firstOrNull { ref.startsWith(it) } - ?.let { rPrefix -> - - if (rPrefix == localROrNull) { - resolvedRs.add(AndroidRReferenceName(localROrNull.packageName, language)) - } - - ref.name.removePrefix("${rPrefix.name}.") - .twoPartUnqualifiedDeclarationOrNull() - ?.let { unqualifiedDeclaredName -> - - val fqName = unqualifiedDeclaredName.toQualifiedDeclaredName(rPrefix).name - - newFullyQualified.add( - QualifiedAndroidResourceReferenceName( - name = fqName, - language = language - ) - ) - - UnqualifiedAndroidResourceReferenceName( - unqualifiedDeclaredName.name, - language - ) - } - } - - unqualifiedRRef - } - - val stillUnresolved = mutableSetOf() - - val unqualifiedFromUnresolved = packet.unresolved - .mapNotNullTo(mutableSetOf()) { ref -> - - @Suppress("MagicNumber") - val unqualifiedRRef = ref - .threePartUnqualifiedDeclarationOrNull() - ?.let { unqualifiedDeclaredName -> - - if (localROrNull != null) { - val fqName = unqualifiedDeclaredName.toQualifiedDeclaredName(localROrNull).name - - newFullyQualified.add( - QualifiedAndroidResourceReferenceName( - name = fqName, - language = packet.referenceLanguage - ) - ) - } - - UnqualifiedAndroidResourceReferenceName( - unqualifiedDeclaredName.name, - language = packet.referenceLanguage - ) - } - ?: ref.twoPartUnqualifiedDeclarationOrNull() - ?.let { unqualifiedDeclaredName -> - - val rRef = packet.imports - .firstNotNullOfOrNull { import -> - allAvailableRNames.firstOrNull { rName -> - import.endsWith("${rName.name}.${unqualifiedDeclaredName.prefix}") - } - } - ?: packet.wildcardImports - .firstNotNullOfOrNull { wildcardImport -> - allAvailableRNames.firstOrNull { rName -> - wildcardImport == "${rName.name}.*" - } - } - - if (rRef != null) { - val fqName = unqualifiedDeclaredName.toQualifiedDeclaredName(rRef).name - - newFullyQualified.add( - QualifiedAndroidResourceReferenceName( - fqName, - language = packet.referenceLanguage - ) - ) - } - - UnqualifiedAndroidResourceReferenceName( - unqualifiedDeclaredName.name, - language = packet.referenceLanguage - ) - } - - if (unqualifiedRRef == null) { - stillUnresolved.add(ref) - } - - if (localROrNull != null && unqualifiedRRef != null) { - - val packageR = AndroidRReferenceName( - packet.packageName, - language = packet.referenceLanguage - ) - if (allAvailableRNames.contains(packageR)) { - resolvedRs.add(packageR) - } - } - - unqualifiedRRef - } - - val newResolved = resolvedRs - .plus(newFullyQualified) - .plus(unqualifiedFromResolved) - .plus(unqualifiedFromUnresolved) - .plus(packet.resolved) - - val newResolvedNames = newResolved.mapToSet { it.name } - - val new = packet.copy( - resolved = newResolved, - unresolved = stillUnresolved.filterNot { it in newResolvedNames }.toSet() - ) - - return chain.proceed(new) - } - - private suspend fun LazySet.mapResolved( - packet: NameParserPacket, - localROrNull: AndroidRDeclaredName? - ): Set { - val resolvedStrings = packet.resolved.mapToSet { it.name } - - val language = packet.referenceLanguage - - return mapNotNull { declaredName -> - val name = declaredName.name - - when { - name in packet.imports -> AndroidRReferenceName(declaredName.packageName, language) - name in resolvedStrings -> AndroidRReferenceName(declaredName.packageName, language) - name in packet.unresolved -> AndroidRReferenceName(declaredName.packageName, language) - - resolvedStrings - .any { it.startsWith(name) } -> AndroidRReferenceName(declaredName.packageName, language) - - packet.unresolved - .any { it.startsWith(name) } -> AndroidRReferenceName(declaredName.packageName, language) - - (localROrNull == null || localROrNull == declaredName) && packet.wildcardImports - .any { wildcard -> - wildcard.replace('*', 'R') - .startsWith(name) - } -> AndroidRReferenceName(declaredName.packageName, language) - - else -> null - } - }.toSet() - } - - private fun AndroidRDeclaredName.isUsed( - packet: NameParserPacket, - localROrNull: AndroidRDeclaredName? - ): Boolean { - val resolvedStrings = packet.resolved.mapToSet { it.name } - - return when { - name in packet.imports -> true - name in resolvedStrings -> true - name in packet.unresolved -> true - - packet.imports.any { it.startsWith(name) } -> true - resolvedStrings.any { it.startsWith(name) } -> true - packet.unresolved.any { it.startsWith(name) } -> true - - localROrNull == null && packet.wildcardImports - .any { wildcard -> - wildcard.replace('*', 'R') - .startsWith(name) - } -> true - - else -> false - } - } - - private suspend fun NameParserPacket.findLocalROrNull( - rNames: LazySet - ): AndroidRDeclaredName? { - val aliasValueStrings = aliasedImports.values.mapToSet { it.name } - return androidRNameProvider.getLocalOrNull() - .takeIf { it?.name == packageName.append("R") } - ?: rNames.firstOrNull { imports.contains(it.name) && !aliasValueStrings.contains(it.name) } - ?: wildcardImports - .firstNotNullOfOrNull { wildcard -> - val synthetic = wildcard.replace('*', 'R') - rNames.firstOrNull { it.name == synthetic } - } - } - - private fun String.twoPartUnqualifiedDeclarationOrNull(): UnqualifiedAndroidResource? { - return split('.') - .takeIf { it.size == 2 } - ?.let { (type, name) -> - UnqualifiedAndroidResource.fromValuePair(type, name) - } - } - - private fun String.threePartUnqualifiedDeclarationOrNull(): UnqualifiedAndroidResource? { - @Suppress("MagicNumber") - return split('.') - .takeIf { it.size == 3 } - ?.let { (_, type, name) -> - UnqualifiedAndroidResource.fromValuePair(type, name) - } - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidDataBindingNameProvider.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidDataBindingNameProvider.kt deleted file mode 100644 index 9eea8a012c..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidDataBindingNameProvider.kt +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import modulecheck.api.context.androidDataBindingDeclarationsForSourceSetName -import modulecheck.api.context.classpathDependencies -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AndroidDataBindingDeclaredName -import modulecheck.parsing.source.internal.AndroidDataBindingNameProvider -import modulecheck.project.McProject -import modulecheck.project.isAndroid -import modulecheck.project.project -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.emptyLazySet -import modulecheck.utils.lazy.toLazySet - -class RealAndroidDataBindingNameProvider( - private val project: McProject, - private val sourceSetName: SourceSetName -) : AndroidDataBindingNameProvider { - - override suspend fun get(): LazySet { - if (!project.isAndroid()) return emptyLazySet() - - val local = project.androidDataBindingDeclarationsForSourceSetName(sourceSetName) - - val transitive = project.classpathDependencies() - .get(sourceSetName) - .map { tpd -> - - val sourceProject = tpd.source.project(project) - - tpd.contributed.project(project) - .androidDataBindingDeclarationsForSourceSetName( - tpd.source.declaringSourceSetName(sourceProject.sourceSets) - ) - } - - return listOf(local) - .plus(transitive) - .toLazySet() - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidGradleSettingsProvider.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidGradleSettingsProvider.kt deleted file mode 100644 index 2c45213fac..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidGradleSettingsProvider.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.parsing.gradle.dsl.AndroidGradleSettings -import modulecheck.parsing.gradle.dsl.AndroidGradleSettingsProvider -import modulecheck.parsing.groovy.antlr.GroovyAndroidGradleParser -import modulecheck.parsing.psi.KotlinAndroidGradleParser -import org.jetbrains.kotlin.incremental.isKotlinFile -import java.io.File -import javax.inject.Inject -import javax.inject.Provider - -class RealAndroidGradleSettingsProvider( - private val groovyParser: GroovyAndroidGradleParser, - private val kotlinParser: KotlinAndroidGradleParser, - private val buildFile: File -) : AndroidGradleSettingsProvider { - - override suspend fun get(): AndroidGradleSettings { - return when { - buildFile.isKotlinFile(listOf("kts")) -> kotlinParser.parse(buildFile) - buildFile.extension == "gradle" -> groovyParser.parse(buildFile) - else -> throw IllegalArgumentException( - "The file argument must be either a `*.gradle.kts` file or `*.gradle`. " + - "The supplied argument was `${buildFile.name}`" - ) - } - } - - @ContributesBinding(TaskScope::class) - class Factory @Inject constructor( - private val groovyParserProvider: Provider, - private val kotlinParserProvider: Provider - ) : AndroidGradleSettingsProvider.Factory { - override fun create(buildFile: File): RealAndroidGradleSettingsProvider { - return RealAndroidGradleSettingsProvider( - groovyParser = groovyParserProvider.get(), - kotlinParser = kotlinParserProvider.get(), - buildFile = buildFile - ) - } - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidRNameProvider.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidRNameProvider.kt deleted file mode 100644 index c4c3c82964..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealAndroidRNameProvider.kt +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import modulecheck.api.context.androidRDeclaredNameForSourceSetName -import modulecheck.api.context.classpathDependencies -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.AndroidRDeclaredName -import modulecheck.parsing.source.internal.AndroidRNameProvider -import modulecheck.project.McProject -import modulecheck.project.isAndroid -import modulecheck.project.project -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.dataSource -import modulecheck.utils.lazy.dataSourceOf -import modulecheck.utils.lazy.emptyLazySet -import modulecheck.utils.lazy.toLazySet -import modulecheck.utils.letIf -import modulecheck.utils.requireNotNull - -class RealAndroidRNameProvider( - private val project: McProject, - private val sourceSetName: SourceSetName -) : AndroidRNameProvider { - - override suspend fun getLocalOrNull(): AndroidRDeclaredName? { - return project.androidRDeclaredNameForSourceSetName(sourceSetName) - } - - override suspend fun getAll(): LazySet { - if (!project.isAndroid()) return emptyLazySet() - - val localR = getLocalOrNull() - - return project.classpathDependencies() - .get(sourceSetName) - .map { transitiveDependency -> - - val transitiveSourceSetName = transitiveDependency.source - .declaringSourceSetName( - transitiveDependency.source.project(project).sourceSets - ) - - dataSource { - setOfNotNull( - transitiveDependency.contributed - .project(project) - .androidRDeclaredNameForSourceSetName(transitiveSourceSetName) - ) - } - } - .letIf(localR != null) { - it.plus(dataSourceOf(localR.requireNotNull())) - } - .toLazySet() - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealDeclarationsProvider.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealDeclarationsProvider.kt deleted file mode 100644 index 7ccd60f011..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealDeclarationsProvider.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import kotlinx.coroutines.flow.asFlow -import kotlinx.coroutines.flow.flatMapConcat -import kotlinx.coroutines.flow.flowOf -import modulecheck.api.context.classpathDependencies -import modulecheck.api.context.declarations -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.psi.internal.DeclarationsProvider -import modulecheck.parsing.source.DeclaredName -import modulecheck.parsing.source.PackageName -import modulecheck.project.McProject -import modulecheck.project.project -import modulecheck.utils.coroutines.plus -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.toLazySet - -class RealDeclarationsProvider( - private val project: McProject -) : DeclarationsProvider { - override suspend fun get( - sourceSetName: SourceSetName, - packageName: PackageName - ): LazySet { - return project.declarations() - .get(sourceSetName, false, packageName) - } - - override suspend fun getWithUpstream( - sourceSetName: SourceSetName, - packageNameOrNull: PackageName? - ): LazySet { - - return flowOf(project) - .plus( - project.classpathDependencies() - .get(sourceSetName) - .map { it.contributed.project(project) } - .asFlow() - ) - .flatMapConcat { projectOrUpstream -> - projectOrUpstream.declarations() - .get(sourceSetName, true, packageNameOrNull) - } - .toLazySet() - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealDependenciesBlocksProvider.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealDependenciesBlocksProvider.kt deleted file mode 100644 index 09c7ff7d92..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealDependenciesBlocksProvider.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.parsing.gradle.dsl.DependenciesBlock -import modulecheck.parsing.gradle.dsl.DependenciesBlocksProvider -import modulecheck.parsing.gradle.dsl.InvokesConfigurationNames -import modulecheck.parsing.groovy.antlr.GroovyDependenciesBlockParser -import modulecheck.parsing.kotlin.compiler.internal.isKotlinScriptFile -import modulecheck.parsing.psi.KotlinDependenciesBlockParser -import javax.inject.Inject -import javax.inject.Provider - -class RealDependenciesBlocksProvider( - private val groovyParser: GroovyDependenciesBlockParser, - private val kotlinParser: KotlinDependenciesBlockParser, - private val invokesConfigurationNames: InvokesConfigurationNames -) : DependenciesBlocksProvider { - - override suspend fun get(): List { - val buildFile = invokesConfigurationNames.buildFile - - return when { - buildFile.isKotlinScriptFile() -> kotlinParser.parse(invokesConfigurationNames) - buildFile.extension == "gradle" -> groovyParser.parse(buildFile) - else -> throw IllegalArgumentException( - "The file argument must be either a `*.gradle.kts` file or `*.gradle`. " + - "The supplied argument was `${buildFile.name}`" - ) - } - } - - @ContributesBinding(TaskScope::class) - class Factory @Inject constructor( - private val groovyParserProvider: Provider, - private val kotlinParserProvider: Provider - ) : DependenciesBlocksProvider.Factory { - override fun create( - invokesConfigurationNames: InvokesConfigurationNames - ): RealDependenciesBlocksProvider { - return RealDependenciesBlocksProvider( - groovyParser = groovyParserProvider.get(), - kotlinParser = kotlinParserProvider.get(), - invokesConfigurationNames = invokesConfigurationNames - ) - } - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealJvmFileProvider.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealJvmFileProvider.kt deleted file mode 100644 index 0c2f218773..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealJvmFileProvider.kt +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.java.RealJavaFile -import modulecheck.parsing.kotlin.compiler.KotlinEnvironment -import modulecheck.parsing.kotlin.compiler.internal.isKotlinFile -import modulecheck.parsing.kotlin.compiler.internal.isKtFile -import modulecheck.parsing.psi.ConcatenatingParsingInterceptor -import modulecheck.parsing.psi.RealKotlinFile -import modulecheck.parsing.psi.internal.PsiElementResolver -import modulecheck.parsing.source.JvmFile -import modulecheck.parsing.source.internal.AndroidDataBindingNameProvider -import modulecheck.parsing.source.internal.AndroidRNameProvider -import modulecheck.parsing.source.internal.InterpretingInterceptor -import modulecheck.parsing.source.internal.ParsingChain -import modulecheck.project.JvmFileProvider -import modulecheck.project.McProject -import modulecheck.utils.cache.SafeCache -import org.jetbrains.kotlin.incremental.isJavaFile -import java.io.File -import javax.inject.Inject -import javax.inject.Provider - -/** - * Note that there is also a Psi file cache inside the [KotlinEnvironment]. - * This cache of [JvmFile] just provides the next layer, in order - * to have caching for parsed declarations, references, and whatnot. - * - * The Psi file cache re-uses Psi files because they have - * internal caching used internally by the compilation object. - * - * @since 0.12.0 - */ -@SingleIn(TaskScope::class) -class JvmFileCache @Inject constructor() { - private val delegate = SafeCache(listOf(JvmFileCache::class)) - - /** - * @return a cached [JvmFile], or creates and caches a new one using [default] - * @since 0.12.0 - */ - suspend fun getOrPut(file: File, default: suspend () -> JvmFile): JvmFile { - return delegate.getOrPut(key = file, default) - } -} - -class RealJvmFileProvider( - private val jvmFileCache: JvmFileCache, - private val project: McProject, - private val sourceSetName: SourceSetName, - private val androidRNameProvider: AndroidRNameProvider, - private val androidDataBindingNameProvider: AndroidDataBindingNameProvider -) : JvmFileProvider { - - override suspend fun getOrNull(file: File): JvmFile? { - - // ignore anything which isn't Kotlin or Java - if (!file.isKotlinFile() && !file.isJavaFile()) return null - - return jvmFileCache.getOrPut(file) { - - val sourceSet = project.sourceSets.getValue(sourceSetName) - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() - - val nameParser = ParsingChain.Factory( - listOf( - ConcatenatingParsingInterceptor( - RealDeclarationsProvider(project), - sourceSetName - ), - AndroidResourceReferenceParsingInterceptor( - androidRNameProvider = androidRNameProvider - ), - AndroidDataBindingReferenceParsingInterceptor( - androidDataBindingNameProvider = androidDataBindingNameProvider - ), - InterpretingInterceptor() - ) - ) - - when { - file.isKtFile() -> RealKotlinFile( - file = file, - psi = kotlinEnvironment.ktFile(file), - psiResolver = PsiElementResolver( - project = project, - sourceSetName = sourceSetName - ), - nameParser = nameParser - ) - - else -> RealJavaFile( - file = file, - psi = kotlinEnvironment.javaPsiFile(file), - jvmTarget = sourceSet.jvmTarget, - nameParser = nameParser - ) - } - } - } - - @ContributesBinding(TaskScope::class) - class Factory @Inject constructor( - private val jvmFileCacheProvider: Provider - ) : JvmFileProvider.Factory { - - override fun create(project: McProject, sourceSetName: SourceSetName): RealJvmFileProvider = - RealJvmFileProvider( - jvmFileCache = jvmFileCacheProvider.get(), - project = project, - sourceSetName = sourceSetName, - androidRNameProvider = RealAndroidRNameProvider(project, sourceSetName), - androidDataBindingNameProvider = RealAndroidDataBindingNameProvider(project, sourceSetName) - ) - } -} diff --git a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealPluginsBlockProvider.kt b/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealPluginsBlockProvider.kt deleted file mode 100644 index 6da4811970..0000000000 --- a/modulecheck-parsing/wiring/src/main/kotlin/modulecheck/parsing/wiring/RealPluginsBlockProvider.kt +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.parsing.wiring - -import com.squareup.anvil.annotations.ContributesBinding -import modulecheck.dagger.TaskScope -import modulecheck.parsing.gradle.dsl.PluginsBlock -import modulecheck.parsing.gradle.dsl.PluginsBlockProvider -import modulecheck.parsing.groovy.antlr.GroovyPluginsBlockParser -import modulecheck.parsing.kotlin.compiler.NoContextPsiFileFactory -import modulecheck.parsing.psi.KotlinPluginsBlockParser -import org.jetbrains.kotlin.incremental.isKotlinFile -import java.io.File -import javax.inject.Inject -import javax.inject.Provider - -class RealPluginsBlockProvider( - private val groovyParser: GroovyPluginsBlockParser, - private val kotlinParser: KotlinPluginsBlockParser, - private val buildFile: File, - private val psiFileFactory: NoContextPsiFileFactory -) : PluginsBlockProvider { - - override suspend fun get(): PluginsBlock? { - return when { - buildFile.isKotlinFile(listOf("kts")) -> - kotlinParser - .parse(psiFileFactory.createKotlin(buildFile)) - - buildFile.extension == "gradle" -> groovyParser.parse(buildFile) - else -> throw IllegalArgumentException( - "The file argument must be either a `*.gradle.kts` file or `*.gradle`. " + - "The supplied argument was `${buildFile.name}`" - ) - } - } - - @ContributesBinding(TaskScope::class) - class Factory @Inject constructor( - private val groovyParserProvider: Provider, - private val kotlinParserProvider: Provider, - private val psiFileFactory: NoContextPsiFileFactory - ) : PluginsBlockProvider.Factory { - override fun create(buildFile: File): PluginsBlockProvider { - return RealPluginsBlockProvider( - groovyParser = groovyParserProvider.get(), - kotlinParser = kotlinParserProvider.get(), - buildFile = buildFile, - psiFileFactory = psiFileFactory - ) - } - } -} diff --git a/modulecheck-project-generation/api/api/api.api b/modulecheck-project-generation/api/api/api.api deleted file mode 100644 index eedc07d3b7..0000000000 --- a/modulecheck-project-generation/api/api/api.api +++ /dev/null @@ -1,369 +0,0 @@ -public final class modulecheck/project/generation/AndroidApplicationPluginBuilder : modulecheck/project/generation/AndroidPlatformPluginBuilder { - public fun ()V - public fun (ZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V - public synthetic fun (ZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Z - public final fun component2 ()Z - public final fun component3 ()Z - public final fun component4 ()Ljava/util/Map; - public final fun component5 ()Ljava/util/Map; - public final fun component6 ()Ljava/util/Map; - public final fun component7 ()Ljava/util/Map; - public final fun component8 ()Ljava/util/Map; - public final fun copy (ZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)Lmodulecheck/project/generation/AndroidApplicationPluginBuilder; - public static synthetic fun copy$default (Lmodulecheck/project/generation/AndroidApplicationPluginBuilder;ZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lmodulecheck/project/generation/AndroidApplicationPluginBuilder; - public fun equals (Ljava/lang/Object;)Z - public fun getConfigurations ()Ljava/util/Map; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Ljava/util/Map; - public fun getViewBindingEnabled ()Z - public fun hashCode ()I - public fun setKotlinAndroidExtensionEnabled (Z)V - public fun setNonTransientRClass (Z)V - public fun setViewBindingEnabled (Z)V - public fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/AndroidPlatformPlugin$AndroidApplicationPlugin; - public synthetic fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/PlatformPlugin; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/project/generation/AndroidDynamicFeaturePluginBuilder : modulecheck/project/generation/AndroidPlatformPluginBuilder { - public fun ()V - public fun (ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V - public synthetic fun (ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Z - public final fun component2 ()Z - public final fun component3 ()Z - public final fun component4 ()Z - public final fun component5 ()Ljava/util/Map; - public final fun component6 ()Ljava/util/Map; - public final fun component7 ()Ljava/util/Map; - public final fun component8 ()Ljava/util/Map; - public final fun component9 ()Ljava/util/Map; - public final fun copy (ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)Lmodulecheck/project/generation/AndroidDynamicFeaturePluginBuilder; - public static synthetic fun copy$default (Lmodulecheck/project/generation/AndroidDynamicFeaturePluginBuilder;ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lmodulecheck/project/generation/AndroidDynamicFeaturePluginBuilder; - public fun equals (Ljava/lang/Object;)Z - public final fun getBuildConfigEnabled ()Z - public fun getConfigurations ()Ljava/util/Map; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Ljava/util/Map; - public fun getViewBindingEnabled ()Z - public fun hashCode ()I - public final fun setBuildConfigEnabled (Z)V - public fun setKotlinAndroidExtensionEnabled (Z)V - public fun setNonTransientRClass (Z)V - public fun setViewBindingEnabled (Z)V - public fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/AndroidPlatformPlugin$AndroidDynamicFeaturePlugin; - public synthetic fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/PlatformPlugin; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/project/generation/AndroidLibraryPluginBuilder : modulecheck/project/generation/AndroidPlatformPluginBuilder { - public fun ()V - public fun (ZZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V - public synthetic fun (ZZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Z - public final fun component10 ()Ljava/util/Map; - public final fun component2 ()Z - public final fun component3 ()Z - public final fun component4 ()Z - public final fun component5 ()Z - public final fun component6 ()Ljava/util/Map; - public final fun component7 ()Ljava/util/Map; - public final fun component8 ()Ljava/util/Map; - public final fun component9 ()Ljava/util/Map; - public final fun copy (ZZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)Lmodulecheck/project/generation/AndroidLibraryPluginBuilder; - public static synthetic fun copy$default (Lmodulecheck/project/generation/AndroidLibraryPluginBuilder;ZZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lmodulecheck/project/generation/AndroidLibraryPluginBuilder; - public fun equals (Ljava/lang/Object;)Z - public final fun getAndroidResourcesEnabled ()Z - public final fun getBuildConfigEnabled ()Z - public fun getConfigurations ()Ljava/util/Map; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Ljava/util/Map; - public fun getViewBindingEnabled ()Z - public fun hashCode ()I - public final fun setAndroidResourcesEnabled (Z)V - public final fun setBuildConfigEnabled (Z)V - public fun setKotlinAndroidExtensionEnabled (Z)V - public fun setNonTransientRClass (Z)V - public fun setViewBindingEnabled (Z)V - public fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/AndroidPlatformPlugin$AndroidLibraryPlugin; - public synthetic fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/PlatformPlugin; - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/project/generation/AndroidPlatformPluginBuilder : modulecheck/project/generation/PlatformPluginBuilder { - public abstract fun getKotlinAndroidExtensionEnabled ()Z - public abstract fun getManifests ()Ljava/util/Map; - public abstract fun getNamespaces ()Ljava/util/Map; - public abstract fun getNonTransientRClass ()Z - public abstract fun getResValues ()Ljava/util/Map; - public abstract fun getViewBindingEnabled ()Z - public abstract fun setKotlinAndroidExtensionEnabled (Z)V - public abstract fun setNonTransientRClass (Z)V - public abstract fun setViewBindingEnabled (Z)V -} - -public final class modulecheck/project/generation/AndroidTestPluginBuilder : modulecheck/project/generation/AndroidPlatformPluginBuilder { - public fun ()V - public fun (ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)V - public synthetic fun (ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Z - public final fun component2 ()Z - public final fun component3 ()Z - public final fun component4 ()Z - public final fun component5 ()Ljava/util/Map; - public final fun component6 ()Ljava/util/Map; - public final fun component7 ()Ljava/util/Map; - public final fun component8 ()Ljava/util/Map; - public final fun component9 ()Ljava/util/Map; - public final fun copy (ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;)Lmodulecheck/project/generation/AndroidTestPluginBuilder; - public static synthetic fun copy$default (Lmodulecheck/project/generation/AndroidTestPluginBuilder;ZZZZLjava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lmodulecheck/project/generation/AndroidTestPluginBuilder; - public fun equals (Ljava/lang/Object;)Z - public final fun getBuildConfigEnabled ()Z - public fun getConfigurations ()Ljava/util/Map; - public fun getKotlinAndroidExtensionEnabled ()Z - public fun getManifests ()Ljava/util/Map; - public fun getNamespaces ()Ljava/util/Map; - public fun getNonTransientRClass ()Z - public fun getResValues ()Ljava/util/Map; - public fun getSourceSets ()Ljava/util/Map; - public fun getViewBindingEnabled ()Z - public fun hashCode ()I - public final fun setBuildConfigEnabled (Z)V - public fun setKotlinAndroidExtensionEnabled (Z)V - public fun setNonTransientRClass (Z)V - public fun setViewBindingEnabled (Z)V - public fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/AndroidPlatformPlugin$AndroidTestPlugin; - public synthetic fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/PlatformPlugin; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/project/generation/ConfigBuilder { - public static final field Companion Lmodulecheck/project/generation/ConfigBuilder$Companion; - public synthetic fun (Ljava/lang/String;Ljava/util/List;Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-9LqIWVA ()Ljava/lang/String; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Ljava/util/List; - public final fun copy-9A_UJks (Ljava/lang/String;Ljava/util/List;Ljava/util/List;)Lmodulecheck/project/generation/ConfigBuilder; - public static synthetic fun copy-9A_UJks$default (Lmodulecheck/project/generation/ConfigBuilder;Ljava/lang/String;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/project/generation/ConfigBuilder; - public fun equals (Ljava/lang/Object;)Z - public final fun getDownstream ()Ljava/util/List; - public final fun getName-9LqIWVA ()Ljava/lang/String; - public final fun getUpstream ()Ljava/util/List; - public fun hashCode ()I - public final fun toConfig (Lmodulecheck/model/dependency/ConfigFactory;)Lmodulecheck/model/dependency/McConfiguration; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/project/generation/ConfigBuilder$Companion { - public final fun fromConfig (Lmodulecheck/model/dependency/McConfiguration;)Lmodulecheck/project/generation/ConfigBuilder; -} - -public final class modulecheck/project/generation/ConfigBuilderKt { - public static final fun populateConfigsFromSourceSets (Lmodulecheck/project/generation/PlatformPluginBuilder;)V -} - -public final class modulecheck/project/generation/FactoriesKt { - public static final fun buildFileParserFactory (Lmodulecheck/model/dependency/ProjectDependency$Factory;Lmodulecheck/reporting/logging/McLogger;)Lmodulecheck/parsing/gradle/dsl/BuildFileParser$Factory; - public static synthetic fun buildFileParserFactory$default (Lmodulecheck/model/dependency/ProjectDependency$Factory;Lmodulecheck/reporting/logging/McLogger;ILjava/lang/Object;)Lmodulecheck/parsing/gradle/dsl/BuildFileParser$Factory; - public static final fun toBuilderMap (Lmodulecheck/model/dependency/Configurations;)Ljava/util/Map; - public static final fun toBuilderMap (Lmodulecheck/model/dependency/SourceSets;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/project/generation/JavaLibraryPluginBuilder : modulecheck/project/generation/PlatformPluginBuilder { - public fun ()V - public fun (Ljava/util/Map;Ljava/util/Map;)V - public synthetic fun (Ljava/util/Map;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/Map; - public final fun component2 ()Ljava/util/Map; - public final fun copy (Ljava/util/Map;Ljava/util/Map;)Lmodulecheck/project/generation/JavaLibraryPluginBuilder; - public static synthetic fun copy$default (Lmodulecheck/project/generation/JavaLibraryPluginBuilder;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lmodulecheck/project/generation/JavaLibraryPluginBuilder; - public fun equals (Ljava/lang/Object;)Z - public fun getConfigurations ()Ljava/util/Map; - public fun getSourceSets ()Ljava/util/Map; - public fun hashCode ()I - public fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/JvmPlatformPlugin$JavaLibraryPlugin; - public synthetic fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/PlatformPlugin; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/project/generation/KotlinJvmPluginBuilder : modulecheck/project/generation/PlatformPluginBuilder { - public fun ()V - public fun (Ljava/util/Map;Ljava/util/Map;)V - public synthetic fun (Ljava/util/Map;Ljava/util/Map;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/Map; - public final fun component2 ()Ljava/util/Map; - public final fun copy (Ljava/util/Map;Ljava/util/Map;)Lmodulecheck/project/generation/KotlinJvmPluginBuilder; - public static synthetic fun copy$default (Lmodulecheck/project/generation/KotlinJvmPluginBuilder;Ljava/util/Map;Ljava/util/Map;ILjava/lang/Object;)Lmodulecheck/project/generation/KotlinJvmPluginBuilder; - public fun equals (Ljava/lang/Object;)Z - public fun getConfigurations ()Ljava/util/Map; - public fun getSourceSets ()Ljava/util/Map; - public fun hashCode ()I - public fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/JvmPlatformPlugin$KotlinJvmPlugin; - public synthetic fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/PlatformPlugin; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/project/generation/McProjectBuilder : modulecheck/model/dependency/HasDependencies, modulecheck/parsing/gradle/dsl/HasDependencyDeclarations, modulecheck/parsing/gradle/dsl/InvokesConfigurationNames { - public fun (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Ljava/io/File;Lmodulecheck/project/generation/PlatformPluginBuilder;Ljava/util/List;Lmodulecheck/project/ProjectProvider;Lmodulecheck/project/ProjectCache;Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;ZZLmodulecheck/parsing/source/AnvilGradlePlugin;Lorg/jetbrains/kotlin/config/JvmTarget;)V - public synthetic fun (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Ljava/io/File;Lmodulecheck/project/generation/PlatformPluginBuilder;Ljava/util/List;Lmodulecheck/project/ProjectProvider;Lmodulecheck/project/ProjectCache;Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;ZZLmodulecheck/parsing/source/AnvilGradlePlugin;Lorg/jetbrains/kotlin/config/JvmTarget;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun addDependency-DjjXWn0 (Ljava/lang/String;Lmodulecheck/project/McProject;ZZ)V - public static synthetic fun addDependency-DjjXWn0$default (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Lmodulecheck/project/McProject;ZZILjava/lang/Object;)V - public final fun addExternalDependency-9A_UJks (Ljava/lang/String;Ljava/lang/String;Z)V - public static synthetic fun addExternalDependency-9A_UJks$default (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;ZILjava/lang/Object;)V - public final fun addJavaSource-I8fgWXk (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/io/File; - public static synthetic fun addJavaSource-I8fgWXk$default (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/io/File; - public final fun addKotlinSource-I8fgWXk (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/io/File; - public static synthetic fun addKotlinSource-I8fgWXk$default (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/io/File; - public final fun addLayoutFile-xDYCS68 (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public static synthetic fun addLayoutFile-xDYCS68$default (Lmodulecheck/project/generation/McProjectBuilder;Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V - public final fun addManifest-ppclhmc (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;)V - public static synthetic fun addManifest-ppclhmc$default (Lmodulecheck/project/generation/McProjectBuilder;Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V - public final fun addResourceFile-xDYCS68 (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public static synthetic fun addResourceFile-xDYCS68$default (Lmodulecheck/project/generation/McProjectBuilder;Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V - public final fun addSource-ppclhmc (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public static synthetic fun addSource-ppclhmc$default (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)V - public final fun addSourceSet-pJLvWNo (Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;)Lmodulecheck/project/generation/SourceSetBuilder; - public static synthetic fun addSourceSet-pJLvWNo$default (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/project/generation/SourceSetBuilder; - public final fun executeDuringBuildActions ()V - public final fun getAnvilGradlePlugin ()Lmodulecheck/parsing/source/AnvilGradlePlugin; - public fun getBuildFile ()Ljava/io/File; - public fun getBuildFileParser ()Lmodulecheck/parsing/gradle/dsl/BuildFileParser; - public final fun getCodeGeneratorBindings ()Ljava/util/List; - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public final fun getConfiguredProjectDependencyFactory ()Lmodulecheck/model/dependency/impl/RealConfiguredProjectDependencyFactory; - public final fun getDependencyModuleDescriptorAccess ()Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess; - public fun getExternalDependencies ()Lmodulecheck/model/dependency/ExternalDependencies; - public fun getHasAGP ()Z - public fun getHasAnvil ()Z - public fun getHasKapt ()Z - public fun getHasTestFixturesPlugin ()Z - public final fun getJvmTarget ()Lorg/jetbrains/kotlin/config/JvmTarget; - public final fun getPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public final fun getPlatformPlugin ()Lmodulecheck/project/generation/PlatformPluginBuilder; - public final fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public fun getProjectDependencies ()Lmodulecheck/model/dependency/ProjectDependencies; - public final fun getProjectDir ()Ljava/io/File; - public final fun getProjectProvider ()Lmodulecheck/project/ProjectProvider; - public final fun invoke (Ljava/io/File;Lkotlin/jvm/functions/Function0;)V - public final fun requireSourceSetExists-WkhsVnw (Ljava/lang/String;)V - public final fun setAnvilGradlePlugin (Lmodulecheck/parsing/source/AnvilGradlePlugin;)V - public fun setBuildFile (Ljava/io/File;)V - public fun setHasKapt (Z)V - public fun setHasTestFixturesPlugin (Z)V - public final fun setJvmTarget (Lorg/jetbrains/kotlin/config/JvmTarget;)V - public final fun setPath (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;)V - public final fun setProjectDir (Ljava/io/File;)V -} - -public abstract interface class modulecheck/project/generation/PlatformPluginBuilder { - public abstract fun getConfigurations ()Ljava/util/Map; - public abstract fun getSourceSets ()Ljava/util/Map; - public abstract fun toPlugin (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Lmodulecheck/model/dependency/ProjectDependencies;Lmodulecheck/model/dependency/ExternalDependencies;)Lmodulecheck/model/dependency/PlatformPlugin; -} - -public abstract interface class modulecheck/project/generation/ProjectCollector { - public fun allProjects ()Ljava/util/List; - public fun androidApplication (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lmodulecheck/project/McProject; - public static synthetic fun androidApplication$default (Lmodulecheck/project/generation/ProjectCollector;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/project/McProject; - public fun androidDynamicFeature (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lmodulecheck/project/McProject; - public static synthetic fun androidDynamicFeature$default (Lmodulecheck/project/generation/ProjectCollector;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/project/McProject; - public fun androidLibrary (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lmodulecheck/project/McProject; - public static synthetic fun androidLibrary$default (Lmodulecheck/project/generation/ProjectCollector;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/project/McProject; - public fun androidTest (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lmodulecheck/project/McProject; - public static synthetic fun androidTest$default (Lmodulecheck/project/generation/ProjectCollector;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/project/McProject; - public fun editSimple (Lmodulecheck/project/McProject;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun editSimple$default (Lmodulecheck/project/generation/ProjectCollector;Lmodulecheck/project/McProject;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public abstract fun getCodeGeneratorBindings ()Ljava/util/List; - public abstract fun getDependencyModuleDescriptorAccess ()Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess; - public abstract fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public fun getProjectProvider ()Lmodulecheck/project/ProjectProvider; - public abstract fun getRoot ()Ljava/io/File; - public fun invoke (Ljava/io/File;Lkotlin/jvm/functions/Function0;)V - public fun javaProject (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lmodulecheck/project/McProject; - public static synthetic fun javaProject$default (Lmodulecheck/project/generation/ProjectCollector;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/project/McProject; - public fun kotlinProject (Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lmodulecheck/project/McProject; - public static synthetic fun kotlinProject$default (Lmodulecheck/project/generation/ProjectCollector;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/project/McProject; - public fun resolveReferences (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun simpleProject (Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/project/McProject; - public static synthetic fun simpleProject$default (Lmodulecheck/project/generation/ProjectCollector;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/project/McProject; - public fun toBuilder (Lmodulecheck/model/dependency/PlatformPlugin;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun toProjectBuilder (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/project/generation/SourceSetBuilder { - public static final field Companion Lmodulecheck/project/generation/SourceSetBuilder$Companion; - public synthetic fun (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public synthetic fun (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-qrJCKeA ()Ljava/lang/String; - public final fun component10 ()Ljava/util/List; - public final fun component11 ()Ljava/util/List; - public final fun component12 ()Ljava/util/List; - public final fun component13 ()Lorg/jetbrains/kotlin/config/LanguageVersion; - public final fun component14 ()Lorg/jetbrains/kotlin/config/JvmTarget; - public final fun component2 ()Lmodulecheck/model/dependency/McConfiguration; - public final fun component3 ()Lmodulecheck/model/dependency/McConfiguration; - public final fun component4 ()Lmodulecheck/model/dependency/McConfiguration; - public final fun component5 ()Lmodulecheck/model/dependency/McConfiguration; - public final fun component6 ()Lmodulecheck/model/dependency/McConfiguration; - public final fun component7 ()Ljava/util/Set; - public final fun component8 ()Ljava/util/Set; - public final fun component9 ()Ljava/util/Set; - public final fun copy-gjJXz4U (Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;)Lmodulecheck/project/generation/SourceSetBuilder; - public static synthetic fun copy-gjJXz4U$default (Lmodulecheck/project/generation/SourceSetBuilder;Ljava/lang/String;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Lmodulecheck/model/dependency/McConfiguration;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/config/LanguageVersion;Lorg/jetbrains/kotlin/config/JvmTarget;ILjava/lang/Object;)Lmodulecheck/project/generation/SourceSetBuilder; - public fun equals (Ljava/lang/Object;)Z - public final fun getAnnotationProcessorConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getApiConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getClasspath ()Ljava/util/List; - public final fun getCompileOnlyConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getDownstream ()Ljava/util/List; - public final fun getImplementationConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getJvmFiles ()Ljava/util/Set; - public final fun getJvmTarget ()Lorg/jetbrains/kotlin/config/JvmTarget; - public final fun getKotlinLanguageVersion ()Lorg/jetbrains/kotlin/config/LanguageVersion; - public final fun getLayoutFiles ()Ljava/util/Set; - public final fun getName-qrJCKeA ()Ljava/lang/String; - public final fun getResourceFiles ()Ljava/util/Set; - public final fun getRuntimeOnlyConfiguration ()Lmodulecheck/model/dependency/McConfiguration; - public final fun getUpstream ()Ljava/util/List; - public fun hashCode ()I - public final fun setAnnotationProcessorConfiguration (Lmodulecheck/model/dependency/McConfiguration;)V - public final fun setApiConfiguration (Lmodulecheck/model/dependency/McConfiguration;)V - public final fun setClasspath (Ljava/util/List;)V - public final fun setCompileOnlyConfiguration (Lmodulecheck/model/dependency/McConfiguration;)V - public final fun setImplementationConfiguration (Lmodulecheck/model/dependency/McConfiguration;)V - public final fun setJvmFiles (Ljava/util/Set;)V - public final fun setJvmTarget (Lorg/jetbrains/kotlin/config/JvmTarget;)V - public final fun setKotlinLanguageVersion (Lorg/jetbrains/kotlin/config/LanguageVersion;)V - public final fun setLayoutFiles (Ljava/util/Set;)V - public final fun setName-WkhsVnw (Ljava/lang/String;)V - public final fun setResourceFiles (Ljava/util/Set;)V - public final fun setRuntimeOnlyConfiguration (Lmodulecheck/model/dependency/McConfiguration;)V - public final fun toSourceSet (Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess;Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;)Lmodulecheck/model/dependency/McSourceSet; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/project/generation/SourceSetBuilder$Companion { - public final fun fromSourceSet (Lmodulecheck/model/dependency/McSourceSet;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/project/generation/SourceSetBuilderKt { - public static final fun maybeAddSourceSet-O-Uy7hw (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/config/JvmTarget;)Lmodulecheck/project/generation/SourceSetBuilder; - public static synthetic fun maybeAddSourceSet-O-Uy7hw$default (Lmodulecheck/project/generation/McProjectBuilder;Ljava/lang/String;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/Set;Ljava/util/List;Ljava/util/List;Lorg/jetbrains/kotlin/config/JvmTarget;ILjava/lang/Object;)Lmodulecheck/project/generation/SourceSetBuilder; - public static final fun populateDownstreams (Ljava/util/Map;)V - public static final fun populateSourceSets (Lmodulecheck/project/generation/McProjectBuilder;)V - public static final fun validateHierarchy (Ljava/util/Map;)V -} - diff --git a/modulecheck-project-generation/api/build.gradle.kts b/modulecheck-project-generation/api/build.gradle.kts deleted file mode 100644 index 1217a526c3..0000000000 --- a/modulecheck-project-generation/api/build.gradle.kts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-project-generation-api" - ) - anvil() -} - -dependencies { - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:dependency:impl")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:impl")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-reporting:logging:api")) - api(project(path = ":modulecheck-utils:lazy")) - - compileOnly(gradleApi()) - - implementation(libs.bundles.junit) - implementation(libs.bundles.kotest) - implementation(libs.bundles.kotest) - implementation(libs.kotlin.reflect) - - implementation(project(path = ":modulecheck-api")) - implementation(project(path = ":modulecheck-internal-testing")) - implementation(project(path = ":modulecheck-parsing:gradle:dsl:internal")) - implementation(project(path = ":modulecheck-parsing:gradle:dsl:precompiled")) - implementation(project(path = ":modulecheck-parsing:groovy-antlr")) - implementation(project(path = ":modulecheck-parsing:kotlin-compiler:api")) - implementation(project(path = ":modulecheck-parsing:psi")) - implementation(project(path = ":modulecheck-parsing:wiring")) - implementation(project(path = ":modulecheck-project:impl")) - implementation(project(path = ":modulecheck-utils:stdlib")) -} diff --git a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/ConfigBuilder.kt b/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/ConfigBuilder.kt deleted file mode 100644 index 2f5a41846c..0000000000 --- a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/ConfigBuilder.kt +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.generation - -import modulecheck.model.dependency.ConfigFactory -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ExternalDependencies -import modulecheck.model.dependency.McConfiguration -import modulecheck.model.dependency.ProjectDependencies -import modulecheck.model.dependency.asConfigurationName -import modulecheck.model.dependency.javaConfigurationNames -import modulecheck.model.sourceset.SourceSetName - -data class ConfigBuilder( - val name: ConfigurationName, - val upstream: MutableList, - val downstream: MutableList -) { - fun toConfig(configFactory: ConfigFactory): McConfiguration = configFactory.create( - name.value - ) - - companion object { - fun fromConfig(configuration: McConfiguration): ConfigBuilder { - return ConfigBuilder( - configuration.name, - configuration.upstream.mapTo(mutableListOf()) { it.name }, - configuration.downstream.mapTo(mutableListOf()) { it.name } - ) - } - } -} - -internal fun PlatformPluginBuilder<*>.configFactory( - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies -) = ConfigFactory( - { this }, - { projectDependencies[this.asConfigurationName()].orEmpty() }, - { externalDependencies[this.asConfigurationName()].orEmpty() }, - { configurations.values.asSequence().map { it.name.value } }, - { - configurations[asConfigurationName()] - ?.upstream - ?.map { it.value } - .orEmpty() - } -) - -@PublishedApi -internal fun PlatformPluginBuilder<*>.populateConfigsFromSourceSets() { - sourceSets - .keys - // add main source set configs first so that they can be safely looked up for inheriting configs - .sortedByDescending { it == SourceSetName.MAIN } - .flatMap { it.javaConfigurationNames() } - .forEach { configurationName -> - - val upstream = if (configurationName.toSourceSetName() == SourceSetName.MAIN) { - mutableListOf() - } else { - SourceSetName.MAIN.javaConfigurationNames() - .map { configurations.getValue(it).name } - .toMutableList() - } - - val downstream = when { - configurationName.toSourceSetName() != SourceSetName.MAIN -> emptyList() - configurationName.isImplementation() -> listOf(configurationName.apiVariant()) - !configurationName.isApi() -> emptyList() - else -> - sourceSets.keys - .filter { it != SourceSetName.MAIN } - .flatMap { it.javaConfigurationNames() } - } - - // val downstream = downstreamNames.map { configurations.getValue(it).name } - - configurations.putIfAbsent( - configurationName, - ConfigBuilder( - name = configurationName, - upstream.toMutableList(), - downstream.toMutableList() - ) - ) - } -} diff --git a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/McProjectBuilder.kt b/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/McProjectBuilder.kt deleted file mode 100644 index 2b1fe39a00..0000000000 --- a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/McProjectBuilder.kt +++ /dev/null @@ -1,376 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.generation - -import kotlinx.coroutines.runBlocking -import modulecheck.config.CodeGeneratorBinding -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.ExternalDependencies -import modulecheck.model.dependency.HasDependencies -import modulecheck.model.dependency.MavenCoordinates -import modulecheck.model.dependency.ProjectDependencies -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.TypeSafeProjectPathResolver -import modulecheck.model.dependency.impl.RealConfiguredProjectDependencyFactory -import modulecheck.model.dependency.impl.RealExternalDependencyFactory -import modulecheck.model.dependency.javaConfigurationNames -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.gradle.dsl.BuildFileParser -import modulecheck.parsing.gradle.dsl.HasDependencyDeclarations -import modulecheck.parsing.gradle.dsl.InvokesConfigurationNames -import modulecheck.parsing.gradle.dsl.addDependency -import modulecheck.parsing.gradle.dsl.asDeclaration -import modulecheck.parsing.kotlin.compiler.impl.DependencyModuleDescriptorAccess -import modulecheck.parsing.source.AnvilGradlePlugin -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.ProjectProvider -import modulecheck.utils.createSafely -import modulecheck.utils.requireNotNull -import modulecheck.utils.resolve -import org.intellij.lang.annotations.Language -import org.jetbrains.kotlin.config.JvmTarget -import java.io.File - -class McProjectBuilder

>( - var path: StringProjectPath, - var projectDir: File, - override var buildFile: File, - val platformPlugin: P, - val codeGeneratorBindings: List, - val projectProvider: ProjectProvider, - val projectCache: ProjectCache, - val dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - override val projectDependencies: ProjectDependencies = ProjectDependencies(emptyMap()), - override val externalDependencies: ExternalDependencies = ExternalDependencies(emptyMap()), - override var hasKapt: Boolean = false, - override var hasTestFixturesPlugin: Boolean = false, - var anvilGradlePlugin: AnvilGradlePlugin? = null, - var jvmTarget: JvmTarget = JvmTarget.JVM_11 -) : HasDependencyDeclarations, InvokesConfigurationNames, HasDependencies { - - private val _duringBuildActions = mutableListOf<() -> Unit>() - - override val buildFileParser: BuildFileParser - get() = buildFileParserFactory(configuredProjectDependencyFactory).create(this) - override val configurations: Configurations - get() = TODO("figure this out") - override val hasAnvil: Boolean - get() = anvilGradlePlugin != null - override val hasAGP: Boolean - get() = platformPlugin is AndroidPlatformPluginBuilder<*> - - val configuredProjectDependencyFactory: RealConfiguredProjectDependencyFactory by lazy { - RealConfiguredProjectDependencyFactory( - pathResolver = TypeSafeProjectPathResolver(projectProvider), - generatorBindings = codeGeneratorBindings - ) - } - - private val externalDependency by lazy { - RealExternalDependencyFactory(generatorBindings = codeGeneratorBindings) - } - - fun addDependency( - configurationName: ConfigurationName, - project: McProject, - asTestFixture: Boolean = false, - addToBuildFile: Boolean = true - ) { - - configurationName.maybeAddToSourceSetsAndConfigurations() - - val old = projectDependencies[configurationName].orEmpty() - - val newDependency = configuredProjectDependencyFactory - .create(configurationName, project.projectPath, asTestFixture) - - if (addToBuildFile) { - onBuild { - - val declarationExists = runBlocking { - buildFileParser.dependenciesBlocks().any { dependenciesBlock -> - dependenciesBlock.getOrEmpty(project.projectPath, configurationName, asTestFixture) - .isNotEmpty() - } - } - - if (!declarationExists) { - val (newDeclaration, tokenOrNull) = runBlocking { - newDependency.asDeclaration(this@McProjectBuilder) - } - addDependency( - configuredDependency = newDependency, - newDeclaration = newDeclaration, - existingMarkerDeclaration = tokenOrNull - ) - } - } - } - - projectDependencies[configurationName] = old + newDependency - } - - fun addExternalDependency( - configurationName: ConfigurationName, - coordinates: String, - isTestFixture: Boolean = false - ) { - - val maven = MavenCoordinates.parseOrNull(coordinates) - .requireNotNull { - "The external coordinate string `$coordinates` must match the Maven coordinate pattern." - } - - configurationName.maybeAddToSourceSetsAndConfigurations() - - val old = externalDependencies[configurationName].orEmpty() - - val external = externalDependency.create( - configurationName = configurationName, - group = maven.group, - moduleName = maven.moduleName, - version = maven.version, - isTestFixture = isTestFixture - ) - - externalDependencies[configurationName] = old + external - } - - private fun ConfigurationName.maybeAddToSourceSetsAndConfigurations() { - val sourceSetName = toSourceSetName() - maybeAddSourceSet(sourceSetName) - - // If the configuration is not from Java plugin, then it won't be automatically added from - // source sets. Plugins like Kapt don't make their configs inherit from each other, - // so just add an empty sequence for up/downstream. - if (this !in sourceSetName.javaConfigurationNames()) { - platformPlugin.configurations[this] = ConfigBuilder( - name = this, - upstream = mutableListOf(), - downstream = mutableListOf() - ) - } - } - - fun addSource( - name: String, - @Language("kotlin") - kotlin: String, - sourceSetName: SourceSetName = SourceSetName.MAIN - ) { - - val file = File(projectDir, "src/${sourceSetName.value}/$name") - .createSafely(kotlin.trimIndent()) - - val oldSourceSet = maybeAddSourceSet(sourceSetName) - - val newJvmFiles = oldSourceSet.jvmFiles + file - - val newSourceSet = oldSourceSet.copy(jvmFiles = newJvmFiles) - - platformPlugin.sourceSets[sourceSetName] = newSourceSet - } - - fun addJavaSource( - @Language("java") - java: String, - sourceSetName: SourceSetName = SourceSetName.MAIN, - directory: String? = null, - fileName: String? = null, - sourceDirName: String = "java" - ): File { - - val name = fileName ?: "Source.java" - - val packageName = "package (.*);".toRegex() - .find(java) - ?.destructured - ?.component1() - .orEmpty() - - val file = createJvmPhysicalFile( - content = java, - directory = directory, - packageName = packageName, - fileSimpleName = name, - sourceSetName = sourceSetName, - sourceDirName = sourceDirName - ) - - return addJvmSource( - file = file, - sourceSetName = sourceSetName - ) - } - - fun addKotlinSource( - @Language("kotlin") - kotlin: String, - sourceSetName: SourceSetName = SourceSetName.MAIN, - directory: String? = null, - fileName: String? = null, - sourceDirName: String = "java" - ): File { - - val name = fileName ?: "Source.kt" - - val packageName = "package (.*)".toRegex() - .find(kotlin) - ?.destructured - ?.component1() - .orEmpty() - - val file = createJvmPhysicalFile( - content = kotlin, - directory = directory, - packageName = packageName, - fileSimpleName = name, - sourceSetName = sourceSetName, - sourceDirName = sourceDirName - ) - - return addJvmSource( - file = file, - sourceSetName = sourceSetName - ) - } - - private fun createJvmPhysicalFile( - content: String, - directory: String?, - packageName: String, - fileSimpleName: String, - sourceSetName: SourceSetName, - sourceDirName: String = "java" - ): File { - - val dir = (directory ?: packageName.replace('.', '/')) - .fixFileSeparators() - - return projectDir - .resolve("src", sourceSetName.value, sourceDirName, dir, fileSimpleName) - .createSafely(content.trimIndent()) - } - - private fun addJvmSource(file: File, sourceSetName: SourceSetName): File { - - val oldSourceSet = maybeAddSourceSet(sourceSetName) - - val newJvmFiles = oldSourceSet.jvmFiles + file - - val newSourceSet = oldSourceSet.copy(jvmFiles = newJvmFiles) - - platformPlugin.sourceSets[sourceSetName] = newSourceSet - - return file - } - - /** - * Replace Windows file separators with Unix ones, just for string comparison in tests - * - * @since 0.12.0 - */ - private fun String.fixFileSeparators(): String = replace("/", File.separator) - - fun > McProjectBuilder.addResourceFile( - name: String, - @Language("xml") - content: String, - sourceSetName: SourceSetName = SourceSetName.MAIN - ) { - - require(!name.startsWith("layout/")) { "use `addLayoutFile` for layout files." } - - val file = File(projectDir, "src/${sourceSetName.value}/res/$name") - .createSafely(content.trimIndent()) - - val old = maybeAddSourceSet(sourceSetName) - - platformPlugin.sourceSets[sourceSetName] = - old.copy(resourceFiles = old.resourceFiles + file) - } - - fun > McProjectBuilder.addLayoutFile( - name: String, - @Language("xml") - content: String, - sourceSetName: SourceSetName = SourceSetName.MAIN - ) { - val file = File(projectDir, "src/${sourceSetName.value}/res/layout/$name") - .createSafely(content) - - val old = maybeAddSourceSet(sourceSetName) - - platformPlugin.sourceSets[sourceSetName] = old.copy(layoutFiles = old.layoutFiles + file) - } - - fun > McProjectBuilder.addManifest( - @Language("xml") - content: String, - sourceSetName: SourceSetName = SourceSetName.MAIN - ) { - val file = File(projectDir, "src/${sourceSetName.value}/AndroidManifest.xml") - .createSafely(content) - - platformPlugin.manifests[sourceSetName] = file - } - - /** */ - fun addSourceSet( - name: SourceSetName, - jvmFiles: Set = emptySet(), - resourceFiles: Set = emptySet(), - layoutFiles: Set = emptySet(), - upstreamNames: List = emptyList(), - downstreamNames: List = emptyList() - ): SourceSetBuilder { - - val old = platformPlugin.sourceSets[name] - - require(old == null) { - "A source set for the name '${name.value}' already exists. " + - "You can probably just delete this line?" - } - - return maybeAddSourceSet( - name = name, - jvmFiles = jvmFiles, - resourceFiles = resourceFiles, - layoutFiles = layoutFiles, - upstreamNames = upstreamNames, - downstreamNames = downstreamNames - ) - } - - operator fun File.invoke(text: () -> String) { - writeText(text().trimIndent()) - } - - fun requireSourceSetExists(name: SourceSetName) { - platformPlugin.sourceSets.requireSourceSetExists(name) - } - - private fun onBuild(action: () -> Unit) { - _duringBuildActions.add(action) - } - - @PublishedApi - internal fun executeDuringBuildActions() { - _duringBuildActions.forEach { it.invoke() } - } -} diff --git a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/PlatformPluginBuilder.kt b/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/PlatformPluginBuilder.kt deleted file mode 100644 index ab1a81126d..0000000000 --- a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/PlatformPluginBuilder.kt +++ /dev/null @@ -1,306 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.generation - -import modulecheck.model.dependency.AndroidPlatformPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidApplicationPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidDynamicFeaturePlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidLibraryPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidTestPlugin -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.ExternalDependencies -import modulecheck.model.dependency.JvmPlatformPlugin.JavaLibraryPlugin -import modulecheck.model.dependency.JvmPlatformPlugin.KotlinJvmPlugin -import modulecheck.model.dependency.PlatformPlugin -import modulecheck.model.dependency.ProjectDependencies -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.SourceSets -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.impl.DependencyModuleDescriptorAccess -import modulecheck.parsing.source.PackageName -import modulecheck.parsing.source.UnqualifiedAndroidResource -import java.io.File - -interface PlatformPluginBuilder { - val sourceSets: MutableMap - val configurations: MutableMap - - fun toPlugin( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath, - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies - ): T -} - -data class JavaLibraryPluginBuilder( - override val sourceSets: MutableMap = mutableMapOf(), - override val configurations: MutableMap = mutableMapOf() -) : PlatformPluginBuilder { - - override fun toPlugin( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath, - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies - ): JavaLibraryPlugin = JavaLibraryPlugin( - sourceSets = SourceSets( - sourceSets.mapValues { - it.value.toSourceSet( - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectPath = projectPath - ) - } - ), - configurations = Configurations( - configurations.mapValues { - it.value.toConfig( - configFactory( - projectDependencies, - externalDependencies - ) - ) - } - ) - ) -} - -data class KotlinJvmPluginBuilder( - override val sourceSets: MutableMap = mutableMapOf(), - override val configurations: MutableMap = mutableMapOf() -) : PlatformPluginBuilder { - override fun toPlugin( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath, - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies - ): KotlinJvmPlugin = KotlinJvmPlugin( - sourceSets = SourceSets( - sourceSets.mapValues { - it.value.toSourceSet( - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectPath = projectPath - ) - } - ), - configurations = Configurations( - configurations.mapValues { - it.value.toConfig( - configFactory( - projectDependencies, - externalDependencies - ) - ) - } - ) - ) -} - -interface AndroidPlatformPluginBuilder : PlatformPluginBuilder { - var viewBindingEnabled: Boolean - var nonTransientRClass: Boolean - var kotlinAndroidExtensionEnabled: Boolean - val manifests: MutableMap - - /** @see AndroidPlatformPlugin.namespaces */ - val namespaces: MutableMap - val resValues: MutableMap> -} - -data class AndroidApplicationPluginBuilder( - override var viewBindingEnabled: Boolean = true, - override var nonTransientRClass: Boolean = false, - override var kotlinAndroidExtensionEnabled: Boolean = true, - override val manifests: MutableMap = mutableMapOf(), - override val namespaces: MutableMap = mutableMapOf(), - override val sourceSets: MutableMap = mutableMapOf(), - override val configurations: MutableMap = mutableMapOf(), - override val resValues: MutableMap> = - mutableMapOf() -) : AndroidPlatformPluginBuilder { - override fun toPlugin( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath, - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies - ): AndroidApplicationPlugin = AndroidApplicationPlugin( - sourceSets = SourceSets( - sourceSets.mapValues { - it.value.toSourceSet( - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectPath = projectPath - ) - } - ), - configurations = Configurations( - configurations.mapValues { - it.value.toConfig( - configFactory( - projectDependencies, - externalDependencies - ) - ) - } - ), - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - manifests = manifests, - namespaces = namespaces, - resValuesLazy = lazy { resValues } - ) -} - -data class AndroidLibraryPluginBuilder( - override var viewBindingEnabled: Boolean = true, - override var nonTransientRClass: Boolean = false, - override var kotlinAndroidExtensionEnabled: Boolean = true, - var buildConfigEnabled: Boolean = true, - var androidResourcesEnabled: Boolean = true, - override val manifests: MutableMap = mutableMapOf(), - override val namespaces: MutableMap = mutableMapOf(), - override val sourceSets: MutableMap = mutableMapOf(), - override val configurations: MutableMap = mutableMapOf(), - override val resValues: MutableMap> = - mutableMapOf() -) : AndroidPlatformPluginBuilder { - override fun toPlugin( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath, - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies - ): AndroidLibraryPlugin = AndroidLibraryPlugin( - sourceSets = SourceSets( - sourceSets.mapValues { - it.value.toSourceSet( - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectPath = projectPath - ) - } - ), - configurations = Configurations( - configurations.mapValues { - it.value.toConfig( - configFactory( - projectDependencies, - externalDependencies - ) - ) - } - ), - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - manifests = manifests, - namespaces = namespaces, - androidResourcesEnabled = androidResourcesEnabled, - buildConfigEnabled = buildConfigEnabled, - resValuesLazy = lazy { resValues } - ) -} - -data class AndroidDynamicFeaturePluginBuilder( - override var viewBindingEnabled: Boolean = true, - override var nonTransientRClass: Boolean = false, - override var kotlinAndroidExtensionEnabled: Boolean = true, - var buildConfigEnabled: Boolean = true, - override val manifests: MutableMap = mutableMapOf(), - override val namespaces: MutableMap = mutableMapOf(), - override val sourceSets: MutableMap = mutableMapOf(), - override val configurations: MutableMap = mutableMapOf(), - override val resValues: MutableMap> = - mutableMapOf() -) : AndroidPlatformPluginBuilder { - override fun toPlugin( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath, - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies - ): AndroidDynamicFeaturePlugin = AndroidDynamicFeaturePlugin( - sourceSets = SourceSets( - sourceSets.mapValues { - it.value.toSourceSet( - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectPath = projectPath - ) - } - ), - configurations = Configurations( - configurations.mapValues { - it.value.toConfig( - configFactory( - projectDependencies, - externalDependencies - ) - ) - } - ), - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - manifests = manifests, - namespaces = namespaces, - buildConfigEnabled = buildConfigEnabled, - resValuesLazy = lazy { resValues } - ) -} - -data class AndroidTestPluginBuilder( - override var viewBindingEnabled: Boolean = true, - override var nonTransientRClass: Boolean = false, - override var kotlinAndroidExtensionEnabled: Boolean = true, - var buildConfigEnabled: Boolean = true, - override val manifests: MutableMap = mutableMapOf(), - override val namespaces: MutableMap = mutableMapOf(), - override val sourceSets: MutableMap = mutableMapOf(), - override val configurations: MutableMap = mutableMapOf(), - override val resValues: MutableMap> = - mutableMapOf() -) : AndroidPlatformPluginBuilder { - override fun toPlugin( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath, - projectDependencies: ProjectDependencies, - externalDependencies: ExternalDependencies - ): AndroidTestPlugin = AndroidTestPlugin( - sourceSets = SourceSets( - sourceSets.mapValues { - it.value.toSourceSet( - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectPath = projectPath - ) - } - ), - configurations = Configurations( - configurations.mapValues { - it.value.toConfig( - configFactory( - projectDependencies, - externalDependencies - ) - ) - } - ), - nonTransientRClass = nonTransientRClass, - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - manifests = manifests, - namespaces = namespaces, - buildConfigEnabled = buildConfigEnabled, - resValuesLazy = lazy { resValues } - ) -} diff --git a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/ProjectCollector.kt b/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/ProjectCollector.kt deleted file mode 100644 index a989e5f9db..0000000000 --- a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/ProjectCollector.kt +++ /dev/null @@ -1,432 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.generation - -import io.kotest.assertions.fail -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.flow.toSet -import modulecheck.api.context.classpathDependencies -import modulecheck.api.context.declarations -import modulecheck.api.context.references -import modulecheck.config.CodeGeneratorBinding -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidApplicationPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidDynamicFeaturePlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidLibraryPlugin -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidTestPlugin -import modulecheck.model.dependency.JvmPlatformPlugin.JavaLibraryPlugin -import modulecheck.model.dependency.JvmPlatformPlugin.KotlinJvmPlugin -import modulecheck.model.dependency.PlatformPlugin -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.impl.DependencyModuleDescriptorAccess -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.ProjectProvider -import modulecheck.utils.lazy.lazySet -import org.jetbrains.annotations.Contract -import org.jetbrains.kotlin.config.JvmTarget -import java.io.File - -/** - * Collects all projects within the scope of analysis. - * - * It provides the ability to create, edit and resolve references for - * different types of projects, including Java, Kotlin, Android Library, - * Android Application, Android Dynamic Feature, and Android Test. - */ -interface ProjectCollector { - - /** Root directory of the project hierarchy. */ - val root: File - - /** Cache of the projects. */ - val projectCache: ProjectCache - - /** Provides access to dependency module descriptors. */ - val dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess - - /** List of bindings for code generation. */ - val codeGeneratorBindings: List - - /** Provides projects from the cache. */ - val projectProvider: ProjectProvider - get() = object : ProjectProvider { - - override val projectCache: ProjectCache - get() = this@ProjectCollector.projectCache - - override fun get(path: ProjectPath): McProject { - return projectCache.getValue(path) - } - - override fun getAll(): List = allProjects() - - override fun clearCaches() { - allProjects().forEach { it.clearContext() } - } - } - - /** - * Fetches all projects from the project cache. - * - * @return List of all projects. - */ - fun allProjects(): List = projectCache.values.toList() - - /** - * Transforms a platform plugin to its builder form. - * - * @return Instance of the [PlatformPluginBuilder] corresponding to the plugin type. - */ - suspend fun PlatformPlugin.toBuilder(): PlatformPluginBuilder<*> { - return when (this) { - is AndroidApplicationPlugin -> AndroidApplicationPluginBuilder( - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - manifests = manifests.toMutableMap(), - namespaces = namespaces.toMutableMap(), - sourceSets = sourceSets.toBuilderMap(), - configurations = configurations.toBuilderMap() - ) - - is AndroidDynamicFeaturePlugin -> AndroidDynamicFeaturePluginBuilder( - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - buildConfigEnabled = buildConfigEnabled, - manifests = manifests.toMutableMap(), - namespaces = namespaces.toMutableMap(), - sourceSets = sourceSets.toBuilderMap(), - configurations = configurations.toBuilderMap() - ) - - is AndroidLibraryPlugin -> AndroidLibraryPluginBuilder( - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - buildConfigEnabled = buildConfigEnabled, - androidResourcesEnabled = androidResourcesEnabled, - manifests = manifests.toMutableMap(), - namespaces = namespaces.toMutableMap(), - sourceSets = sourceSets.toBuilderMap(), - configurations = configurations.toBuilderMap() - ) - - is AndroidTestPlugin -> AndroidTestPluginBuilder( - viewBindingEnabled = viewBindingEnabled, - kotlinAndroidExtensionEnabled = kotlinAndroidExtensionEnabled, - buildConfigEnabled = buildConfigEnabled, - manifests = manifests.toMutableMap(), - namespaces = namespaces.toMutableMap(), - sourceSets = sourceSets.toBuilderMap(), - configurations = configurations.toBuilderMap() - ) - - is JavaLibraryPlugin -> JavaLibraryPluginBuilder( - sourceSets = sourceSets.toBuilderMap(), - configurations = configurations.toBuilderMap() - ) - - is KotlinJvmPlugin -> KotlinJvmPluginBuilder( - sourceSets = sourceSets.toBuilderMap(), - configurations = configurations.toBuilderMap() - ) - } - } - - /** - * Transforms a [McProject] to a builder form that can be further configured. - * - * @return Instance of [McProjectBuilder] for the project. - */ - suspend fun

> McProject.toProjectBuilder(): McProjectBuilder

{ - @Suppress("UNCHECKED_CAST") - return McProjectBuilder( - path = projectPath, - projectDir = projectDir, - buildFile = buildFile, - platformPlugin = platformPlugin.toBuilder() as P, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - projectCache = projectCache, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectDependencies = projectDependencies, - externalDependencies = externalDependencies, - hasKapt = hasKapt, - hasTestFixturesPlugin = hasTestFixturesPlugin, - anvilGradlePlugin = anvilGradlePlugin, - jvmTarget = sourceSets.values.firstOrNull()?.jvmTarget ?: JvmTarget.JVM_11 - ) - } - - /** - * Edits a project with a provided configuration. - * - * @param config Configuration to be applied on the project builder. - * @return Updated instance of the project. - */ - @Contract(pure = true, value = "_->new") - suspend fun McProject.editSimple( - config: McProjectBuilder>.() -> Unit = {} - ): McProject { - return toProjectBuilder>() - .also { it.config() } - .toRealMcProject() - } - - /** - * Creates a new Java project. - * - * @param path Project path. - * @param config Configuration to be applied on the project builder. - * @return Instance of the newly created Java project. - */ - fun javaProject( - path: String, - config: McProjectBuilder.() -> Unit = {} - ): McProject { - val platformPlugin = JavaLibraryPluginBuilder() - - return createProject( - projectCache = projectCache, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectDir = root, - path = path, - pluginBuilder = platformPlugin, - androidPackageOrNull = null, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - config = config - ) - } - - /** - * Constructs a Kotlin-based project with the provided configuration. - * - * @param path the relative path of the project - * @param config an optional configuration block for the project builder - * @return an instance of [McProject] representing the newly created Kotlin project - */ - fun kotlinProject( - path: String, - config: McProjectBuilder.() -> Unit = {} - ): McProject { - val platformPlugin = KotlinJvmPluginBuilder() - - return createProject( - projectCache = projectCache, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectDir = root, - path = path, - pluginBuilder = platformPlugin, - androidPackageOrNull = null, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - config = config - ) - } - - /** - * Constructs an Android application project with the provided configuration. - * - * @param path the relative path of the project - * @param androidPackage the Android package name for the project - * @param config an optional configuration block for the project builder - * @return an instance of [McProject] representing the newly created Android application project - */ - fun androidApplication( - path: String, - androidPackage: String, - config: McProjectBuilder.() -> Unit = {} - ): McProject { - return createProject( - projectCache = projectCache, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectDir = root, - path = path, - pluginBuilder = AndroidApplicationPluginBuilder(), - androidPackageOrNull = androidPackage, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - config = config - ) - } - - /** - * Constructs an Android library project with the provided configuration. - * - * @param path the relative path of the project - * @param androidPackage the Android package name for the project - * @param config an optional configuration block for the project builder - * @return an instance of [McProject] representing the newly created Android library project - */ - fun androidLibrary( - path: String, - androidPackage: String, - config: McProjectBuilder.() -> Unit = {} - ): McProject { - return createProject( - projectCache = projectCache, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectDir = root, - path = path, - pluginBuilder = AndroidLibraryPluginBuilder(), - androidPackageOrNull = androidPackage, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - config = config - ) - } - - /** - * Constructs an Android dynamic feature module with the provided configuration. - * - * @param path the relative path of the project - * @param androidPackage the Android package name for the project - * @param config an optional configuration block for the project builder - * @return an instance of [McProject] representing - * the newly created Android dynamic feature module - */ - fun androidDynamicFeature( - path: String, - androidPackage: String, - config: McProjectBuilder.() -> Unit = {} - ): McProject { - return createProject( - projectCache = projectCache, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectDir = root, - path = path, - pluginBuilder = AndroidDynamicFeaturePluginBuilder(), - androidPackageOrNull = androidPackage, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - config = config - ) - } - - /** - * Constructs an Android test project with the provided configuration. - * - * @param path the relative path of the project - * @param androidPackage the Android package name for the project - * @param config an optional configuration block for the project builder - * @return an instance of [McProject] representing the newly created Android test project - */ - fun androidTest( - path: String, - androidPackage: String, - config: McProjectBuilder.() -> Unit = {} - ): McProject { - return createProject( - projectCache = projectCache, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectDir = root, - path = path, - pluginBuilder = AndroidTestPluginBuilder(), - androidPackageOrNull = androidPackage, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - config = config - ) - } - - /** - * Constructs a simple Kotlin project. If the build file text is provided, it writes - * the text to the build file. The created project will have a source file in the - * 'main' source set with the package 'com.lib1' and a class named 'Lib1Class'. - * - * @param buildFileText optional text to be written into the build file - * @param path the relative path of the project, defaults to ':lib' - * @return an instance of [McProject] representing the newly created simple Kotlin project - */ - fun simpleProject(buildFileText: String? = null, path: String = ":lib"): McProject = - this.kotlinProject(path) { - if (buildFileText != null) { - buildFile.writeText(buildFileText) - } - - addKotlinSource( - """ - package com.lib1 - - class Lib1Class - """, - SourceSetName.MAIN - ) - } - - /** - * Writes text to a file. - * - * @param text Text to be written to the file. - */ - operator fun File.invoke(text: () -> String) { - writeText(text().trimIndent()) - } - - /** - * Resolves all references in the project scope, validating dependencies and declarations. - * - * Throws a failure if any reference is unresolved. - */ - suspend fun resolveReferences() { - projectCache.values - .forEach { project -> - - val thisProjectDeclarations = project.declarations().all() - - val allDependencies = project.classpathDependencies().all() - .map { it.contributed } - .plus(project.projectDependencies.values.flatten()) - .map { dependency -> dependency.declarations(projectCache) } - .plus(thisProjectDeclarations) - .let { lazySet(it) } - .map { it.name } - .toSet() - - project.references().all() - .toList() - .forEach eachRef@{ reference -> - - // Only check for references which would be provided by internal projects. Using a - // block-list is a bit of a hack, but it's safer to have to add than remove. - if (reference.name.startsWith("androidx")) return@eachRef - - val unresolved = !allDependencies.contains(reference.name) - - if (unresolved) { - fail( - """ - |Project ${project.projectPath} has a reference which must be declared in a dependency kotlinProject. - | - |-- reference: - | ${reference.name} - | - |-- all declarations: - |${allDependencies.joinToString("\n") { " $it" }} - | - |-- all dependencies: - |${project.projectDependencies.values.flatten().joinToString("\n") { " $it" }} - | - |_________ - """.trimMargin() - - ) - } - } - } - } -} diff --git a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/SourceSetBuilder.kt b/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/SourceSetBuilder.kt deleted file mode 100644 index f2992a5f02..0000000000 --- a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/SourceSetBuilder.kt +++ /dev/null @@ -1,303 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.generation - -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.McConfiguration -import modulecheck.model.dependency.McSourceSet -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.model.sourceset.removePrefix -import modulecheck.model.sourceset.removeSuffix -import modulecheck.parsing.kotlin.compiler.impl.DependencyModuleDescriptorAccess -import modulecheck.parsing.kotlin.compiler.impl.RealKotlinEnvironment -import modulecheck.reporting.logging.PrintLogger -import modulecheck.testing.assertions.requireNotNullOrFail -import modulecheck.utils.capitalize -import modulecheck.utils.lazy.ResetManager -import modulecheck.utils.lazy.lazyDeferred -import org.jetbrains.kotlin.config.JvmTarget -import org.jetbrains.kotlin.config.JvmTarget.JVM_11 -import org.jetbrains.kotlin.config.LanguageVersion -import org.jetbrains.kotlin.config.LanguageVersion.KOTLIN_1_6 -import java.io.File - -/** - * @property name Name of the source set. - * @property compileOnlyConfiguration Dependencies that - * are required to compile the project's source set. - * @property apiConfiguration Dependencies that are part - * of the API of the source set exposed to consumers. - * @property implementationConfiguration Dependencies that are used internally in the source set. - * @property runtimeOnlyConfiguration Dependencies that are required - * to run the project's source set, but not required to compile it. - * @property annotationProcessorConfiguration Dependencies that are used for annotation processing. - * @property jvmFiles The JVM source files of this source set. - * @property resourceFiles The resource files of this source set. - * @property layoutFiles The layout files of this source set. - * @property classpath The classpath required to compile this source set. - * @property upstream The list of upstream source set names. - * @property downstream The list of downstream source set names. - * @property kotlinLanguageVersion The version of Kotlin used to compile this source set. - * @property jvmTarget The target version of the generated JVM bytecode. - */ -data class SourceSetBuilder( - var name: SourceSetName, - var compileOnlyConfiguration: McConfiguration, - var apiConfiguration: McConfiguration?, - var implementationConfiguration: McConfiguration, - var runtimeOnlyConfiguration: McConfiguration, - var annotationProcessorConfiguration: McConfiguration?, - var jvmFiles: Set, - var resourceFiles: Set, - var layoutFiles: Set, - var classpath: MutableList = mutableListOf( - File(CharRange::class.java.protectionDomain.codeSource.location.path) - ), - val upstream: MutableList, - val downstream: MutableList, - var kotlinLanguageVersion: LanguageVersion? = null, - var jvmTarget: JvmTarget = JVM_11 -) { - /** - * Converts a `SourceSetBuilder` to a `McSourceSet`. - * - * @param dependencyModuleDescriptorAccess The access point to obtain module descriptors. - * @param projectPath The path to the project. - * @return A `McSourceSet` built from this `SourceSetBuilder`. - */ - fun toSourceSet( - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectPath: StringProjectPath - ): McSourceSet { - val kotlinEnvironmentDeferred = lazyDeferred { - RealKotlinEnvironment( - projectPath = projectPath, - sourceSetName = name, - classpathFiles = lazyDeferred { classpath }, - sourceDirs = jvmFiles, - kotlinLanguageVersion = kotlinLanguageVersion, - jvmTarget = jvmTarget, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - logger = PrintLogger(), - resetManager = ResetManager() - ) - } - - return McSourceSet( - name = name, - compileOnlyConfiguration = compileOnlyConfiguration, - apiConfiguration = apiConfiguration, - implementationConfiguration = implementationConfiguration, - runtimeOnlyConfiguration = runtimeOnlyConfiguration, - annotationProcessorConfiguration = annotationProcessorConfiguration, - jvmFiles = jvmFiles, - resourceFiles = resourceFiles, - layoutFiles = layoutFiles, - jvmTarget = jvmTarget, - kotlinEnvironmentDeferred = kotlinEnvironmentDeferred, - upstreamLazy = lazy { upstream }, - downstreamLazy = lazy { downstream } - ) - } - - companion object { - /** - * Constructs a `SourceSetBuilder` from a given `McSourceSet`. - * - * @param sourceSet The `McSourceSet` to construct from. - * @return A `SourceSetBuilder` constructed from the provided `McSourceSet`. - */ - suspend fun fromSourceSet(sourceSet: McSourceSet): SourceSetBuilder { - val kotlinEnvironment = sourceSet.kotlinEnvironmentDeferred.await() as RealKotlinEnvironment - - return SourceSetBuilder( - name = sourceSet.name, - compileOnlyConfiguration = sourceSet.compileOnlyConfiguration, - apiConfiguration = sourceSet.apiConfiguration, - implementationConfiguration = sourceSet.implementationConfiguration, - runtimeOnlyConfiguration = sourceSet.runtimeOnlyConfiguration, - annotationProcessorConfiguration = sourceSet.annotationProcessorConfiguration, - jvmFiles = sourceSet.jvmFiles, - resourceFiles = sourceSet.resourceFiles, - layoutFiles = sourceSet.layoutFiles, - classpath = kotlinEnvironment.classpathFiles.await().toMutableList(), - upstream = sourceSet.upstream.toMutableList(), - downstream = sourceSet.downstream.toMutableList(), - kotlinLanguageVersion = kotlinEnvironment.kotlinLanguageVersion, - jvmTarget = sourceSet.jvmTarget - ) - } - } -} - -/** Populates the source sets for a project. */ -@PublishedApi -internal fun McProjectBuilder<*>.populateSourceSets() { - platformPlugin - .configurations - .keys - .map { it.toSourceSetName() } - .distinct() - .forEach { maybeAddSourceSet(it) } -} - -/** - * Attempts to add a source set to the project, if it does not already exist. - * - * @param name The name of the source set. - * @param jvmFiles The JVM source files for the source set. - * @param resourceFiles The resource files for the source set. - * @param layoutFiles The layout files for the source set. - * @param classpath The classpath required to compile the source set. - * @param upstreamNames The names of the upstream source sets. - * @param downstreamNames The names of the downstream source sets. - * @param jvmTarget The target version of the generated JVM bytecode. - * @return The `SourceSetBuilder` of the newly added or existing source set. - */ -fun McProjectBuilder<*>.maybeAddSourceSet( - name: SourceSetName, - jvmFiles: Set = emptySet(), - resourceFiles: Set = emptySet(), - layoutFiles: Set = emptySet(), - classpath: Set = setOf( - File(CharRange::class.java.protectionDomain.codeSource.location.path) - ), - upstreamNames: List = emptyList(), - downstreamNames: List = emptyList(), - jvmTarget: JvmTarget = JVM_11 -): SourceSetBuilder { - if (name.isTestFixtures()) { - hasTestFixturesPlugin = true - } - - val upstream = sequenceOf( - SourceSetName.MAIN, - name.removePrefix(SourceSetName.TEST), - name.removePrefix(SourceSetName.TEST_FIXTURES), - name.removePrefix(SourceSetName.ANDROID_TEST), - name.removeSuffix(SourceSetName.DEBUG), - name.removeSuffix(SourceSetName.RELEASE) - ) - .filterNot { it in upstreamNames } - .filterNot { it == name } - .filter { platformPlugin.sourceSets.containsKey(it) } - .plus(upstreamNames) - .distinct() - .toMutableList() - - val configFactory = platformPlugin.configFactory( - projectDependencies = projectDependencies, - externalDependencies = externalDependencies - ) - - val kotlinLanguageVersion = when (platformPlugin) { - is JavaLibraryPluginBuilder -> null - else -> KOTLIN_1_6 - } - - val sourceSet = platformPlugin.sourceSets.getOrPut(name) { - SourceSetBuilder( - name = name, - compileOnlyConfiguration = configFactory.create(name.configurationName("compileOnly")), - apiConfiguration = configFactory.create(name.configurationName("api")), - implementationConfiguration = configFactory.create(name.configurationName("implementation")), - runtimeOnlyConfiguration = configFactory.create(name.configurationName("runtimeOnly")), - annotationProcessorConfiguration = configFactory.create(name.configurationName("kapt")), - jvmFiles = jvmFiles, - resourceFiles = resourceFiles, - layoutFiles = layoutFiles, - classpath = classpath.toMutableList(), - upstream = upstream, - downstream = downstreamNames.toMutableList(), - kotlinLanguageVersion = kotlinLanguageVersion, - jvmTarget = jvmTarget - ) - } - platformPlugin.populateConfigsFromSourceSets() - return sourceSet -} - -/** Asserts that the hierarchy of source sets is valid. */ -@PublishedApi -internal fun MutableMap.validateHierarchy() { - values.forEach { sourceSet -> - sourceSet.downstream - .forEach { requireSourceSetExists(it) } - sourceSet.upstream - .forEach { requireSourceSetExists(it) } - } -} - -/** - * Asserts that a source set with a given name exists. - * - * @param name The name of the source set to verify. - */ -internal fun PlatformPluginBuilder<*>.requireSourceSetExists(name: SourceSetName) { - sourceSets.requireSourceSetExists(name) -} - -/** - * Asserts that a source set with a given name exists. - * - * @param name The name of the source set to check. - */ -internal fun MutableMap.requireSourceSetExists( - name: SourceSetName -) { - get(name) - .requireNotNullOrFail { - """ - The source set named `${name.value}` doesn't exist in the `sourceSets` map. - - missing source set name: ${name.value} - existing source sets: ${keys.map { it.value }} - """.trimIndent() - } -} - -/** Finds the downstream source sets for each source set. */ -@PublishedApi -internal fun MutableMap.populateDownstreams() { - values.forEach { sourceSetBuilder -> - sourceSetBuilder.downstream.clear() - sourceSetBuilder.downstream.addAll( - values.filter { it.upstream.contains(sourceSetBuilder.name) } - .map { it.name } - .distinct() - ) - } -} - -/** - * Derives this source set's name for the base [configName]. - * - * For instance, the "test" source set with a `configName` - * of "implementation" will return `testImplementation`. - * - * @param configName The base name of the configuration. - * @return The complete configuration name. - */ -internal fun SourceSetName.configurationName(configName: String): String { - return if (this == SourceSetName.MAIN) { - configName - } else if (configName == ConfigurationName.kapt.value) { - "${configName}${value.capitalize()}" - } else { - "${value}${configName.capitalize()}" - } -} diff --git a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/factories.kt b/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/factories.kt deleted file mode 100644 index ec166512f6..0000000000 --- a/modulecheck-project-generation/api/src/main/kotlin/modulecheck/project/generation/factories.kt +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.generation - -import modulecheck.config.CodeGeneratorBinding -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.PlatformPlugin -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.SourceSets -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.gradle.dsl.BuildFileParser -import modulecheck.parsing.gradle.dsl.internal.RealBuildFileParser -import modulecheck.parsing.groovy.antlr.GroovyAndroidGradleParser -import modulecheck.parsing.groovy.antlr.GroovyDependenciesBlockParser -import modulecheck.parsing.groovy.antlr.GroovyPluginsBlockParser -import modulecheck.parsing.kotlin.compiler.NoContextPsiFileFactory -import modulecheck.parsing.kotlin.compiler.impl.DependencyModuleDescriptorAccess -import modulecheck.parsing.psi.KotlinAndroidGradleParser -import modulecheck.parsing.psi.KotlinDependenciesBlockParser -import modulecheck.parsing.psi.KotlinPluginsBlockParser -import modulecheck.parsing.source.PackageName.Companion.asPackageName -import modulecheck.parsing.wiring.JvmFileCache -import modulecheck.parsing.wiring.RealAndroidGradleSettingsProvider -import modulecheck.parsing.wiring.RealDependenciesBlocksProvider -import modulecheck.parsing.wiring.RealJvmFileProvider -import modulecheck.parsing.wiring.RealPluginsBlockProvider -import modulecheck.project.JvmFileProvider -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.ProjectProvider -import modulecheck.project.impl.RealMcProject -import modulecheck.reporting.logging.McLogger -import modulecheck.reporting.logging.PrintLogger -import modulecheck.utils.createSafely -import java.io.File - -@PublishedApi -internal inline fun , R : PlatformPlugin> createProject( - projectCache: ProjectCache, - dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess, - projectDir: File, - path: String, - pluginBuilder: T, - androidPackageOrNull: String?, - codeGeneratorBindings: List, - projectProvider: ProjectProvider, - config: McProjectBuilder.() -> Unit -): McProject { - - val projectRoot = File(projectDir, path.replace(":", File.separator)) - .also { it.mkdirs() } - - val buildFile = File(projectRoot, "build.gradle.kts") - .createSafely() - - val builder = McProjectBuilder( - path = StringProjectPath(path), - projectDir = projectRoot, - buildFile = buildFile, - platformPlugin = pluginBuilder, - projectCache = projectCache, - codeGeneratorBindings = codeGeneratorBindings, - projectProvider = projectProvider, - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess - ) - .also { - it.maybeAddSourceSet(SourceSetName.MAIN) - - val testUpstream = mutableListOf(SourceSetName.MAIN) - - if (pluginBuilder is AndroidPlatformPluginBuilder<*>) { - it.maybeAddSourceSet(SourceSetName.DEBUG, upstreamNames = listOf(SourceSetName.MAIN)) - it.maybeAddSourceSet(SourceSetName.RELEASE, upstreamNames = listOf(SourceSetName.MAIN)) - it.maybeAddSourceSet( - SourceSetName.ANDROID_TEST, - upstreamNames = listOf(SourceSetName.MAIN, SourceSetName.DEBUG) - ) - - testUpstream.add(SourceSetName.DEBUG) - } - - it.maybeAddSourceSet(SourceSetName.TEST, upstreamNames = testUpstream) - - it.config() - - pluginBuilder.sourceSets.validateHierarchy() - - if (pluginBuilder is AndroidPlatformPluginBuilder<*>) { - - requireNotNull(androidPackageOrNull) - - pluginBuilder.namespaces[SourceSetName.MAIN] = androidPackageOrNull.asPackageName() - } - } - - return builder.buildProject { - toRealMcProject() - } -} - -@PublishedApi -internal suspend fun SourceSets.toBuilderMap(): MutableMap = - mapValuesTo(mutableMapOf()) { (_, sourceSet) -> - SourceSetBuilder.fromSourceSet(sourceSet) - } - -@PublishedApi -internal fun Configurations.toBuilderMap(): MutableMap = - mapValuesTo(mutableMapOf()) { (_, config) -> - ConfigBuilder.fromConfig(config) - } - -fun buildFileParserFactory( - projectDependencyFactory: ProjectDependency.Factory, - logger: McLogger = PrintLogger() -): BuildFileParser.Factory { - return BuildFileParser.Factory { invokesConfigurationNames -> - - RealBuildFileParser( - { - RealDependenciesBlocksProvider( - groovyParser = GroovyDependenciesBlockParser(logger, projectDependencyFactory), - kotlinParser = KotlinDependenciesBlockParser( - logger, - NoContextPsiFileFactory(), - projectDependencyFactory - ), - invokesConfigurationNames = invokesConfigurationNames - ) - }, - { - RealPluginsBlockProvider( - groovyParser = GroovyPluginsBlockParser(logger), - kotlinParser = KotlinPluginsBlockParser(logger), - buildFile = invokesConfigurationNames.buildFile, - NoContextPsiFileFactory() - ) - }, - { - RealAndroidGradleSettingsProvider( - groovyParser = GroovyAndroidGradleParser(), - kotlinParser = KotlinAndroidGradleParser(NoContextPsiFileFactory()), - buildFile = invokesConfigurationNames.buildFile - ) - }, - invokesConfigurationNames - ) - } -} - -@PublishedApi -internal inline fun T.buildProject( - projectFactory: T.(JvmFileProvider.Factory) -> McProject -): McProject - where T : McProjectBuilder

, - P : PlatformPluginBuilder, - G : PlatformPlugin { - - populateSourceSets() - platformPlugin.populateConfigsFromSourceSets() - platformPlugin.sourceSets.populateDownstreams() - - executeDuringBuildActions() - - val jvmFileProviderFactory = RealJvmFileProvider.Factory { JvmFileCache() } - - return projectFactory(jvmFileProviderFactory) - .also { finalProject -> - projectCache[finalProject.projectPath] = finalProject - } -} - -inline fun T.toRealMcProject(): McProject - where T : McProjectBuilder

, - P : PlatformPluginBuilder, - G : PlatformPlugin { - return buildProject { jvmFileProviderFactory -> - - RealMcProject( - projectPath = path, - projectDir = projectDir, - buildFile = buildFile, - hasKapt = hasKapt, - hasTestFixturesPlugin = hasTestFixturesPlugin, - projectCache = projectCache, - anvilGradlePlugin = anvilGradlePlugin, - logger = PrintLogger(), - jvmFileProviderFactory = jvmFileProviderFactory, - jvmTarget = jvmTarget, - buildFileParserFactory = buildFileParserFactory(configuredProjectDependencyFactory), - platformPlugin = platformPlugin.toPlugin( - dependencyModuleDescriptorAccess = dependencyModuleDescriptorAccess, - projectPath = path, - projectDependencies = projectDependencies, - externalDependencies = externalDependencies - ) - ) - } -} diff --git a/modulecheck-project/api/api/api.api b/modulecheck-project/api/api/api.api deleted file mode 100644 index 1d64f8e3f1..0000000000 --- a/modulecheck-project/api/api/api.api +++ /dev/null @@ -1,92 +0,0 @@ -public abstract interface class modulecheck/project/HasProjectCache { - public abstract fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public fun project (Lmodulecheck/model/dependency/HasProjectPath;)Lmodulecheck/project/McProject; -} - -public final class modulecheck/project/HasProjectCacheKt { - public static final fun project (Lmodulecheck/model/dependency/DownstreamDependency;Lmodulecheck/project/HasProjectCache;)Lmodulecheck/project/McProject; - public static final fun project (Lmodulecheck/model/dependency/DownstreamDependency;Lmodulecheck/project/ProjectCache;)Lmodulecheck/project/McProject; - public static final fun project (Lmodulecheck/model/dependency/HasProjectPath;Lmodulecheck/project/HasProjectCache;)Lmodulecheck/project/McProject; - public static final fun project (Lmodulecheck/model/dependency/HasProjectPath;Lmodulecheck/project/ProjectCache;)Lmodulecheck/project/McProject; -} - -public abstract interface class modulecheck/project/JvmFileProvider { - public abstract fun getOrNull (Ljava/io/File;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/project/JvmFileProvider$Factory { - public abstract fun create-wYXeOjA (Lmodulecheck/project/McProject;Ljava/lang/String;)Lmodulecheck/project/JvmFileProvider; -} - -public abstract interface class modulecheck/project/McProject : java/lang/Comparable, modulecheck/model/dependency/HasConfigurations, modulecheck/model/dependency/HasDependencies, modulecheck/model/dependency/HasProjectPath, modulecheck/model/dependency/HasSourceSets, modulecheck/parsing/gradle/dsl/HasBuildFile, modulecheck/parsing/gradle/dsl/HasDependencyDeclarations, modulecheck/parsing/gradle/dsl/InvokesConfigurationNames, modulecheck/parsing/gradle/model/HasPlatformPlugin, modulecheck/parsing/gradle/model/PluginAware, modulecheck/project/HasProjectCache, modulecheck/project/ProjectContext { - public abstract fun getAnvilGradlePlugin ()Lmodulecheck/parsing/source/AnvilGradlePlugin; - public fun getConfigurations ()Lmodulecheck/model/dependency/Configurations; - public abstract fun getExternalDependencies ()Lmodulecheck/model/dependency/ExternalDependencies; - public fun getHasAGP ()Z - public fun getHasAnvil ()Z - public abstract fun getJvmFileProviderFactory ()Lmodulecheck/project/JvmFileProvider$Factory; - public abstract fun getJvmTarget ()Lorg/jetbrains/kotlin/config/JvmTarget; - public abstract fun getLogger ()Lmodulecheck/reporting/logging/McLogger; - public abstract fun getProjectDependencies ()Lmodulecheck/model/dependency/ProjectDependencies; - public abstract fun getProjectDir ()Ljava/io/File; - public abstract fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public fun getSourceSets ()Lmodulecheck/model/dependency/SourceSets; - public abstract fun resolvedNameOrNull-5sj7XBw (Lmodulecheck/parsing/source/ResolvableMcName;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/project/McProjectKt { - public static final fun isAndroid (Lmodulecheck/project/McProject;)Z -} - -public final class modulecheck/project/ProjectCache : modulecheck/utils/trace/HasTraceTags { - public fun ()V - public final fun clearContexts ()V - public final fun getOrPut (Lmodulecheck/model/dependency/ProjectPath;Lkotlin/jvm/functions/Function0;)Lmodulecheck/project/McProject; - public synthetic fun getTags ()Ljava/lang/Iterable; - public fun getTags ()Ljava/util/List; - public final fun getValue (Lmodulecheck/model/dependency/ProjectPath;)Lmodulecheck/project/McProject; - public final fun getValues ()Ljava/util/Collection; - public final fun set (Lmodulecheck/model/dependency/ProjectPath;Lmodulecheck/project/McProject;)Lmodulecheck/project/McProject; -} - -public final class modulecheck/project/ProjectCache_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/project/ProjectCache_Factory; - public static final fun create ()Lmodulecheck/project/ProjectCache_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/project/ProjectCache; - public static final fun newInstance ()Lmodulecheck/project/ProjectCache; -} - -public abstract interface class modulecheck/project/ProjectContext { - public static final field Companion Lmodulecheck/project/ProjectContext$Companion; - public abstract fun clearContext ()V - public abstract fun get (Lmodulecheck/project/ProjectContext$Key;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/project/ProjectContext$Companion { - public final fun invoke (Lmodulecheck/project/McProject;)Lmodulecheck/project/ProjectContext; -} - -public abstract interface class modulecheck/project/ProjectContext$Element { - public abstract fun getKey ()Lmodulecheck/project/ProjectContext$Key; -} - -public abstract interface class modulecheck/project/ProjectContext$Key { - public abstract fun invoke (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/project/ProjectProvider : modulecheck/model/dependency/AllProjectPathsProvider, modulecheck/project/HasProjectCache { - public abstract fun clearCaches ()V - public abstract fun get (Lmodulecheck/model/dependency/ProjectPath;)Lmodulecheck/project/McProject; - public abstract fun getAll ()Ljava/util/List; - public fun getAllPaths ()Ljava/util/List; -} - -public final class modulecheck/project/ProjectProviderKt { - public static final fun toTypeSafeProjectPathResolver (Lmodulecheck/project/ProjectProvider;)Lmodulecheck/model/dependency/TypeSafeProjectPathResolver; -} - -public abstract interface class modulecheck/project/ProjectRoot { - public abstract fun get ()Ljava/io/File; -} - diff --git a/modulecheck-project/api/build.gradle.kts b/modulecheck-project/api/build.gradle.kts deleted file mode 100644 index 16f2094098..0000000000 --- a/modulecheck-project/api/build.gradle.kts +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-project-api" - ) - anvil() -} - -dependencies { - - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-parsing:gradle:model:api")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-reporting:logging:api")) - api(project(path = ":modulecheck-utils:trace")) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-utils:cache")) - implementation(project(path = ":modulecheck-utils:lazy")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-project/api/src/main/kotlin/modulecheck/project/HasProjectCache.kt b/modulecheck-project/api/src/main/kotlin/modulecheck/project/HasProjectCache.kt deleted file mode 100644 index 6aaf83b93f..0000000000 --- a/modulecheck-project/api/src/main/kotlin/modulecheck/project/HasProjectCache.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project - -import modulecheck.model.dependency.DownstreamDependency -import modulecheck.model.dependency.HasProjectPath - -interface HasProjectCache { - val projectCache: ProjectCache - - fun HasProjectPath.project(): McProject = projectCache.getValue(projectPath) -} - -/** - * @param projectCache the project cache which contains the desired project - * @receiver has a defined path to be resolved to a project - * @return the project associated with the path in the receiver - * @since 0.12.0 - */ -fun HasProjectPath.project(projectCache: ProjectCache): McProject = - projectCache.getValue(projectPath) - -/** - * @param hasProjectCache has the project cache which contains the desired project - * @receiver has a defined path to be resolved to a project - * @return the project associated with the path in the receiver - * @since 0.12.0 - */ -fun HasProjectPath.project(hasProjectCache: HasProjectCache): McProject = - hasProjectCache.projectCache.getValue(projectPath) - -/** - * @param projectCache the project cache which contains the desired project - * @receiver has a dependentPath to be resolved to a project - * @return the project associated with the path in the receiver - * @since 0.12.0 - */ -fun DownstreamDependency.project(projectCache: ProjectCache): McProject = - projectCache.getValue(dependentProjectPath) - -/** - * @param hasProjectCache has the project cache which contains the desired project - * @receiver has a dependentPath to be resolved to a project - * @return the project associated with the path in the receiver - * @since 0.12.0 - */ -fun DownstreamDependency.project(hasProjectCache: HasProjectCache): McProject = - hasProjectCache.projectCache.getValue(dependentProjectPath) diff --git a/modulecheck-project/api/src/main/kotlin/modulecheck/project/JvmFileProvider.kt b/modulecheck-project/api/src/main/kotlin/modulecheck/project/JvmFileProvider.kt deleted file mode 100644 index e993aa5e64..0000000000 --- a/modulecheck-project/api/src/main/kotlin/modulecheck/project/JvmFileProvider.kt +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project - -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.JvmFile -import java.io.File - -fun interface JvmFileProvider { - suspend fun getOrNull(file: File): JvmFile? - - fun interface Factory { - fun create(project: McProject, sourceSetName: SourceSetName): JvmFileProvider - } -} diff --git a/modulecheck-project/api/src/main/kotlin/modulecheck/project/McProject.kt b/modulecheck-project/api/src/main/kotlin/modulecheck/project/McProject.kt deleted file mode 100644 index 486234045f..0000000000 --- a/modulecheck-project/api/src/main/kotlin/modulecheck/project/McProject.kt +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project - -import modulecheck.model.dependency.Configurations -import modulecheck.model.dependency.ExternalDependencies -import modulecheck.model.dependency.HasConfigurations -import modulecheck.model.dependency.HasDependencies -import modulecheck.model.dependency.HasProjectPath -import modulecheck.model.dependency.HasSourceSets -import modulecheck.model.dependency.ProjectDependencies -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.SourceSets -import modulecheck.model.dependency.isAndroid -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.gradle.dsl.HasBuildFile -import modulecheck.parsing.gradle.dsl.HasDependencyDeclarations -import modulecheck.parsing.gradle.dsl.InvokesConfigurationNames -import modulecheck.parsing.gradle.model.HasPlatformPlugin -import modulecheck.parsing.gradle.model.PluginAware -import modulecheck.parsing.source.AnvilGradlePlugin -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ResolvableMcName -import modulecheck.reporting.logging.McLogger -import org.jetbrains.kotlin.config.JvmTarget -import java.io.File - -@Suppress("TooManyFunctions") -interface McProject : - ProjectContext, - Comparable, - HasProjectPath, - HasProjectCache, - HasBuildFile, - HasConfigurations, - HasDependencies, - HasSourceSets, - HasDependencyDeclarations, - InvokesConfigurationNames, - HasPlatformPlugin, - PluginAware { - - override val projectPath: StringProjectPath - - override val configurations: Configurations - get() = platformPlugin.configurations - - override val sourceSets: SourceSets - get() = platformPlugin.sourceSets - - val projectDir: File - - override val projectDependencies: ProjectDependencies - override val externalDependencies: ExternalDependencies - - val anvilGradlePlugin: AnvilGradlePlugin? - - override val hasAnvil: Boolean - get() = anvilGradlePlugin != null - override val hasAGP: Boolean - get() = platformPlugin.isAndroid() - - val logger: McLogger - val jvmFileProviderFactory: JvmFileProvider.Factory - - /** - * The Java version used to compile this project - * - * @since 0.12.0 - */ - val jvmTarget: JvmTarget - - /** - * @return a [QualifiedDeclaredName] if one can be found - * for the given [resolvableMcName] and [sourceSetName] - * @since 0.12.0 - */ - suspend fun resolvedNameOrNull( - resolvableMcName: ResolvableMcName, - sourceSetName: SourceSetName - ): QualifiedDeclaredName? -} - -fun McProject.isAndroid(): Boolean = platformPlugin.isAndroid() diff --git a/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectCache.kt b/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectCache.kt deleted file mode 100644 index 52823d334c..0000000000 --- a/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectCache.kt +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project - -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.ProjectPath.TypeSafeProjectPath -import modulecheck.utils.requireNotNull -import modulecheck.utils.trace.HasTraceTags -import java.util.concurrent.ConcurrentHashMap -import javax.inject.Inject -import kotlin.reflect.KClass - -@SingleIn(TaskScope::class) -class ProjectCache @Inject constructor() : HasTraceTags { - private val delegate = ConcurrentHashMap() - - override val tags: List> = listOf(this::class) - - val values: MutableCollection get() = delegate.values - - /** - * N.B. This [path] argument can be the base [ProjectPath] instead of one of the concrete - * types ([StringProjectPath], [TypeSafeProjectPath]), because all project paths are compared - * using the derived type-safe variant. So, there are no cache misses when a project is already - * stored using the String variant, but then we attempt to look it up via the type-safe one. - * - * @since 0.12.0 - */ - fun getOrPut(path: ProjectPath, defaultValue: () -> McProject): McProject { - return delegate.getOrPut(path, defaultValue) - } - - fun getValue(path: ProjectPath): McProject { - return delegate[path].requireNotNull { - "Expected to find a project with a path of '${path.value}`, but no such project exists.\n\n" + - "The existing paths are: ${delegate.keys.map { it.value }}" - } - } - - operator fun set(path: ProjectPath, project: McProject): McProject? { - return delegate.put(path, project) - } - - fun clearContexts() { - delegate.values.forEach { it.clearContext() } - } -} diff --git a/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectContext.kt b/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectContext.kt deleted file mode 100644 index 4ccb1a5d1f..0000000000 --- a/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectContext.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project - -import modulecheck.project.ProjectContext.Element -import modulecheck.project.ProjectContext.Key -import modulecheck.utils.cache.SafeCache -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred - -interface ProjectContext { - suspend fun get(key: Key): E - - fun clearContext() - - interface Key { - suspend operator fun invoke(project: McProject): E - } - - interface Element { - val key: Key<*> - } - - companion object { - operator fun invoke(project: McProject): ProjectContext = RealProjectContext(project) - } -} - -internal class RealProjectContext(val project: McProject) : ProjectContext { - - private var cache = newCache() - - private fun newCache() = SafeCache, LazyDeferred>( - listOf(project.projectPath, RealProjectContext::class) - ) - - override suspend fun get(key: Key): E { - - @Suppress("UNCHECKED_CAST") - return cache.getOrPut(key) { - lazyDeferred { key.invoke(project) } - }.await() as E - } - - override fun clearContext() { - cache = newCache() - } -} diff --git a/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectProvider.kt b/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectProvider.kt deleted file mode 100644 index 297ca87af2..0000000000 --- a/modulecheck-project/api/src/main/kotlin/modulecheck/project/ProjectProvider.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project - -import modulecheck.model.dependency.AllProjectPathsProvider -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.dependency.TypeSafeProjectPathResolver -import java.io.File - -interface ProjectProvider : HasProjectCache, AllProjectPathsProvider { - - fun get(path: ProjectPath): McProject - - fun getAll(): List - - override fun getAllPaths(): List = getAll().map { it.projectPath } - - fun clearCaches() -} - -fun ProjectProvider.toTypeSafeProjectPathResolver(): TypeSafeProjectPathResolver { - return TypeSafeProjectPathResolver { getAllPaths() } -} - -fun interface ProjectRoot { - fun get(): File -} diff --git a/modulecheck-project/impl/api/impl.api b/modulecheck-project/impl/api/impl.api deleted file mode 100644 index d3ce492eaa..0000000000 --- a/modulecheck-project/impl/api/impl.api +++ /dev/null @@ -1,27 +0,0 @@ -public final class modulecheck/project/impl/RealMcProject : modulecheck/project/McProject { - public fun (Lmodulecheck/model/dependency/ProjectPath$StringProjectPath;Ljava/io/File;Ljava/io/File;ZZLmodulecheck/project/ProjectCache;Lmodulecheck/parsing/source/AnvilGradlePlugin;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/project/JvmFileProvider$Factory;Lorg/jetbrains/kotlin/config/JvmTarget;Lmodulecheck/parsing/gradle/dsl/BuildFileParser$Factory;Lmodulecheck/model/dependency/PlatformPlugin;)V - public fun clearContext ()V - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/project/McProject;)I - public fun equals (Ljava/lang/Object;)Z - public fun get (Lmodulecheck/project/ProjectContext$Key;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getAnvilGradlePlugin ()Lmodulecheck/parsing/source/AnvilGradlePlugin; - public fun getBuildFile ()Ljava/io/File; - public fun getBuildFileParser ()Lmodulecheck/parsing/gradle/dsl/BuildFileParser; - public fun getExternalDependencies ()Lmodulecheck/model/dependency/ExternalDependencies; - public fun getHasKapt ()Z - public fun getHasTestFixturesPlugin ()Z - public fun getJvmFileProviderFactory ()Lmodulecheck/project/JvmFileProvider$Factory; - public fun getJvmTarget ()Lorg/jetbrains/kotlin/config/JvmTarget; - public fun getLogger ()Lmodulecheck/reporting/logging/McLogger; - public fun getPlatformPlugin ()Lmodulecheck/model/dependency/PlatformPlugin; - public fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public fun getProjectDependencies ()Lmodulecheck/model/dependency/ProjectDependencies; - public fun getProjectDir ()Ljava/io/File; - public fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath$StringProjectPath; - public synthetic fun getProjectPath ()Lmodulecheck/model/dependency/ProjectPath; - public fun hashCode ()I - public fun resolvedNameOrNull-5sj7XBw (Lmodulecheck/parsing/source/ResolvableMcName;Ljava/lang/String;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - diff --git a/modulecheck-project/impl/build.gradle.kts b/modulecheck-project/impl/build.gradle.kts deleted file mode 100644 index fd152647e5..0000000000 --- a/modulecheck-project/impl/build.gradle.kts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-project-impl" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:gradle:dsl:api")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-reporting:logging:api")) - - implementation(project(path = ":modulecheck-api")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-project/impl/src/main/kotlin/modulecheck/project/impl/RealMcProject.kt b/modulecheck-project/impl/src/main/kotlin/modulecheck/project/impl/RealMcProject.kt deleted file mode 100644 index bd3212d58f..0000000000 --- a/modulecheck-project/impl/src/main/kotlin/modulecheck/project/impl/RealMcProject.kt +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.impl - -import modulecheck.api.context.resolvedDeclaredNames -import modulecheck.model.dependency.ExternalDependencies -import modulecheck.model.dependency.PlatformPlugin -import modulecheck.model.dependency.ProjectDependencies -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.gradle.dsl.BuildFileParser -import modulecheck.parsing.source.AnvilGradlePlugin -import modulecheck.parsing.source.QualifiedDeclaredName -import modulecheck.parsing.source.ResolvableMcName -import modulecheck.project.JvmFileProvider.Factory -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.ProjectContext -import modulecheck.reporting.logging.McLogger -import org.jetbrains.kotlin.config.JvmTarget -import java.io.File - -class RealMcProject( - override val projectPath: StringProjectPath, - override val projectDir: File, - override val buildFile: File, - override val hasKapt: Boolean, - override val hasTestFixturesPlugin: Boolean, - override val projectCache: ProjectCache, - override val anvilGradlePlugin: AnvilGradlePlugin?, - override val logger: McLogger, - override val jvmFileProviderFactory: Factory, - override val jvmTarget: JvmTarget, - buildFileParserFactory: BuildFileParser.Factory, - override val platformPlugin: PlatformPlugin -) : McProject { - - override val projectDependencies: ProjectDependencies by lazy { - ProjectDependencies(platformPlugin.configurations.mapValues { it.value.projectDependencies }) - } - override val externalDependencies: ExternalDependencies by lazy { - ExternalDependencies(platformPlugin.configurations.mapValues { it.value.externalDependencies }) - } - - override val buildFileParser: BuildFileParser by lazy { buildFileParserFactory.create(this) } - - private val context = ProjectContext(this) - - override fun clearContext() { - context.clearContext() - } - - override suspend fun get(key: ProjectContext.Key): E { - return context.get(key) - } - - override fun compareTo(other: McProject): Int = projectPath.compareTo(other.projectPath) - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (other !is McProject) return false - - if (projectPath != other.projectPath) return false - - return true - } - - override fun hashCode(): Int { - return projectPath.hashCode() - } - - override fun toString(): String { - return "${this::class.java.simpleName}('$projectPath')" - } - - override suspend fun resolvedNameOrNull( - resolvableMcName: ResolvableMcName, - sourceSetName: SourceSetName - ): QualifiedDeclaredName? { - return resolvedDeclaredNames().getSource( - resolvableMcName, - sourceSetName - )?.run { declaration } - } -} diff --git a/modulecheck-project/testing/api/testing.api b/modulecheck-project/testing/api/testing.api deleted file mode 100644 index b30d5ecb85..0000000000 --- a/modulecheck-project/testing/api/testing.api +++ /dev/null @@ -1,50 +0,0 @@ -public abstract class modulecheck/project/test/ProjectTest : com/rickbusarow/kase/HasTestEnvironmentFactory { - public fun ()V - public synthetic fun getTestEnvironmentFactory ()Lcom/rickbusarow/kase/TestEnvironmentFactory; - public fun getTestEnvironmentFactory ()Lmodulecheck/project/test/ProjectTestEnvironmentFactory; - public fun test (Lcom/rickbusarow/kase/HasTestEnvironmentFactory;Ljava/lang/Object;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public fun test (Lcom/rickbusarow/kase/HasTestEnvironmentFactory;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public fun test (Lcom/rickbusarow/kase/NoParamTestEnvironmentFactory;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public final fun test (Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public fun test (Ljava/lang/Object;Lcom/rickbusarow/kase/TestEnvironmentFactory;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public static synthetic fun test$default (Lmodulecheck/project/test/ProjectTest;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V - public final fun writeText (Ljava/io/File;Ljava/lang/String;)V -} - -public class modulecheck/project/test/ProjectTestEnvironment : modulecheck/testing/TestEnvironment, modulecheck/project/generation/ProjectCollector { - public fun (Lmodulecheck/project/ProjectCache;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;)V - public synthetic fun (Lmodulecheck/project/ProjectCache;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun addDependency-fCcoXlo (Lmodulecheck/project/McProject;Ljava/lang/String;Lmodulecheck/project/McProject;Z)V - public static synthetic fun addDependency-fCcoXlo$default (Lmodulecheck/project/test/ProjectTestEnvironment;Lmodulecheck/project/McProject;Ljava/lang/String;Lmodulecheck/project/McProject;ZILjava/lang/Object;)V - public final fun createJavaFile-8Qc_ZYM (Lmodulecheck/project/test/ProjectTestEnvironment;Ljava/lang/String;Lmodulecheck/project/McProject;Ljava/lang/String;Lorg/jetbrains/kotlin/config/JvmTarget;)Lmodulecheck/parsing/source/JavaFile; - public static synthetic fun createJavaFile-8Qc_ZYM$default (Lmodulecheck/project/test/ProjectTestEnvironment;Lmodulecheck/project/test/ProjectTestEnvironment;Ljava/lang/String;Lmodulecheck/project/McProject;Ljava/lang/String;Lorg/jetbrains/kotlin/config/JvmTarget;ILjava/lang/Object;)Lmodulecheck/parsing/source/JavaFile; - public final fun createJavaFile-ppclhmc (Lmodulecheck/project/McProject;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/parsing/source/JavaFile; - public static synthetic fun createJavaFile-ppclhmc$default (Lmodulecheck/project/test/ProjectTestEnvironment;Lmodulecheck/project/McProject;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/parsing/source/JavaFile; - public final fun createKotlinFile-8Qc_ZYM (Lmodulecheck/project/test/ProjectTestEnvironment;Ljava/lang/String;Lmodulecheck/project/McProject;Ljava/lang/String;Lorg/jetbrains/kotlin/config/JvmTarget;)Lmodulecheck/parsing/source/KotlinFile; - public static synthetic fun createKotlinFile-8Qc_ZYM$default (Lmodulecheck/project/test/ProjectTestEnvironment;Lmodulecheck/project/test/ProjectTestEnvironment;Ljava/lang/String;Lmodulecheck/project/McProject;Ljava/lang/String;Lorg/jetbrains/kotlin/config/JvmTarget;ILjava/lang/Object;)Lmodulecheck/parsing/source/KotlinFile; - public final fun createKotlinFile-ppclhmc (Lmodulecheck/project/McProject;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/parsing/source/KotlinFile; - public static synthetic fun createKotlinFile-ppclhmc$default (Lmodulecheck/project/test/ProjectTestEnvironment;Lmodulecheck/project/McProject;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/parsing/source/KotlinFile; - public fun getCodeGeneratorBindings ()Ljava/util/List; - public fun getDependencyModuleDescriptorAccess ()Lmodulecheck/parsing/kotlin/compiler/impl/DependencyModuleDescriptorAccess; - public fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public final fun getProjectDependencyFactory ()Lmodulecheck/model/dependency/ProjectDependency$Factory; - public fun getRoot ()Ljava/io/File; -} - -public final class modulecheck/project/test/ProjectTestEnvironmentFactory : com/rickbusarow/kase/ParamTestEnvironmentFactory { - public fun ()V - public synthetic fun create (Ljava/lang/Object;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;)Lcom/rickbusarow/kase/TestEnvironment; - public fun create (Lmodulecheck/project/test/ProjectTestEnvironmentParams;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;)Lmodulecheck/project/test/ProjectTestEnvironment; -} - -public final class modulecheck/project/test/ProjectTestEnvironmentParams : modulecheck/testing/TestEnvironmentParams { - public fun (Lmodulecheck/project/ProjectCache;)V - public final fun component1 ()Lmodulecheck/project/ProjectCache; - public final fun copy (Lmodulecheck/project/ProjectCache;)Lmodulecheck/project/test/ProjectTestEnvironmentParams; - public static synthetic fun copy$default (Lmodulecheck/project/test/ProjectTestEnvironmentParams;Lmodulecheck/project/ProjectCache;ILjava/lang/Object;)Lmodulecheck/project/test/ProjectTestEnvironmentParams; - public fun equals (Ljava/lang/Object;)Z - public final fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - diff --git a/modulecheck-project/testing/build.gradle.kts b/modulecheck-project/testing/build.gradle.kts deleted file mode 100644 index 779fe058b5..0000000000 --- a/modulecheck-project/testing/build.gradle.kts +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-project-testing" - ) - anvil() -} - -dependencies { - - api(project(path = ":modulecheck-internal-testing")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-parsing:kotlin-compiler:impl")) - api(project(path = ":modulecheck-parsing:source:api")) - api(project(path = ":modulecheck-project-generation:api")) - api(project(path = ":modulecheck-project:api")) - - compileOnly(gradleApi()) - - implementation(libs.bundles.junit) - implementation(libs.bundles.kotest) - implementation(libs.kotlin.reflect) - - implementation(project(path = ":modulecheck-api")) - implementation(project(path = ":modulecheck-config:api")) - implementation(project(path = ":modulecheck-config:impl")) - implementation(project(path = ":modulecheck-model:dependency:impl")) - implementation(project(path = ":modulecheck-utils:trace")) -} diff --git a/modulecheck-project/testing/src/main/kotlin/modulecheck/project/test/ProjectTest.kt b/modulecheck-project/testing/src/main/kotlin/modulecheck/project/test/ProjectTest.kt deleted file mode 100644 index 9a4c2d2d44..0000000000 --- a/modulecheck-project/testing/src/main/kotlin/modulecheck/project/test/ProjectTest.kt +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.test - -import com.rickbusarow.kase.HasTestEnvironmentFactory -import com.rickbusarow.kase.asClueCatching -import com.rickbusarow.kase.files.TestLocation -import kotlinx.coroutines.runBlocking -import modulecheck.project.ProjectCache -import java.io.File -import java.nio.charset.Charset - -/** - * Base test class for tests related to projects. Provides - * useful utility functions for setting up project-related tests. - */ -@Suppress("UnnecessaryAbstractClass") -abstract class ProjectTest : HasTestEnvironmentFactory { - - override val testEnvironmentFactory = ProjectTestEnvironmentFactory() - - /** shorthand for executing a test in a hermetic TestEnvironment but without any kase parameters */ - fun test( - testLocation: TestLocation = TestLocation.get(), - testAction: suspend ProjectTestEnvironment.() -> Unit - ) { - val testEnvironment = testEnvironmentFactory.create( - params = ProjectTestEnvironmentParams(ProjectCache()), - names = emptyList(), - location = testLocation - ) - - runBlocking { - testEnvironment.asClueCatching { - testEnvironment.testAction() - println(testEnvironment) - } - } - } - - /** - * Writes the specified content to the receiver [File] with the default charset. - * - * @param content the content to be written to the file - */ - fun File.writeText(content: String) { - writeText(content.trimIndent(), Charset.defaultCharset()) - } -} diff --git a/modulecheck-project/testing/src/main/kotlin/modulecheck/project/test/ProjectTestEnvironment.kt b/modulecheck-project/testing/src/main/kotlin/modulecheck/project/test/ProjectTestEnvironment.kt deleted file mode 100644 index b7db3581ee..0000000000 --- a/modulecheck-project/testing/src/main/kotlin/modulecheck/project/test/ProjectTestEnvironment.kt +++ /dev/null @@ -1,190 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.project.test - -import com.rickbusarow.kase.ParamTestEnvironmentFactory -import com.rickbusarow.kase.files.TestLocation -import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.runBlocking -import modulecheck.api.context.jvmFiles -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.internal.defaultCodeGeneratorBindings -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.TypeSafeProjectPathResolver -import modulecheck.model.dependency.impl.RealConfiguredProjectDependencyFactory -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.kotlin.compiler.impl.DependencyModuleDescriptorAccess -import modulecheck.parsing.source.JavaFile -import modulecheck.parsing.source.KotlinFile -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.generation.ProjectCollector -import modulecheck.testing.TestEnvironment -import modulecheck.testing.TestEnvironmentParams -import modulecheck.utils.trace.Trace -import org.intellij.lang.annotations.Language -import org.jetbrains.kotlin.config.JvmTarget -import java.io.File - -data class ProjectTestEnvironmentParams( - val projectCache: ProjectCache -) : TestEnvironmentParams - -class ProjectTestEnvironmentFactory : ParamTestEnvironmentFactory { - override fun create( - params: ProjectTestEnvironmentParams, - names: List, - location: TestLocation - ): ProjectTestEnvironment = ProjectTestEnvironment(params.projectCache, names, location) -} - -/** - * A specialized [TestEnvironment] for project-related tests. - * Provides utility functions for creating files and dependencies. - */ -open class ProjectTestEnvironment( - override val projectCache: ProjectCache, - names: List, - testLocation: TestLocation = TestLocation.get() -) : TestEnvironment(names = names, testLocation = testLocation), - ProjectCollector { - - override val codeGeneratorBindings: List by lazy { - defaultCodeGeneratorBindings() - } - - override val dependencyModuleDescriptorAccess: DependencyModuleDescriptorAccess by lazy { - DependencyModuleDescriptorAccess(projectCache) - } - - override val root: File get() = workingDir - - val projectDependencyFactory: ProjectDependency.Factory by lazy { - RealConfiguredProjectDependencyFactory( - pathResolver = TypeSafeProjectPathResolver(projectProvider), - generatorBindings = codeGeneratorBindings - ) - } - - /** - * Adds a project dependency to the receiver [McProject]. - * - * @param configurationName the configuration name of the dependency - * @param project the project to be added as a dependency - * @param asTestFixture whether the dependency should be added as a test fixture or not - */ - fun McProject.addDependency( - configurationName: ConfigurationName, - project: McProject, - asTestFixture: Boolean = false - ) { - val old = projectDependencies[configurationName].orEmpty() - - val cpd = projectDependencyFactory.create( - configurationName = configurationName, - path = project.projectPath, - isTestFixture = asTestFixture - ) - - projectDependencies[configurationName] = old + cpd - } - - /** - * Creates a [JavaFile] and adds it to the receiver [McProject]. - * - * @param content the content of the Java file - * @param sourceSetName the source set name of the Java file - * @return the created Java file - */ - fun McProject.createJavaFile( - @Language("java") - content: String, - sourceSetName: SourceSetName = SourceSetName.MAIN - ): JavaFile = createJavaFile( - content = content, - project = this@createJavaFile, - sourceSetName = sourceSetName - ) - - /** - * Creates a [JavaFile] and adds it to the specified [McProject]. - * - * @param content the content of the Java file - * @param project the project to which the Java file will be added - * @param sourceSetName the source set name of the Java file - * @param jvmTarget the JVM target version for the Java file - * @return the created Java file - */ - fun ProjectTestEnvironment.createJavaFile( - @Language("java") - content: String, - project: McProject = simpleProject(), - sourceSetName: SourceSetName = SourceSetName.MAIN, - jvmTarget: JvmTarget = JvmTarget.JVM_11 - ): JavaFile = runBlocking(Trace.start(listOf(ProjectTest::class))) { - project.editSimple { - addJavaSource(content, sourceSetName) - this.jvmTarget = jvmTarget - }.jvmFiles() - .get(sourceSetName) - .filterIsInstance() - .first { it.file.readText() == content.trimIndent() } - } - - /** - * Creates a [KotlinFile] and adds it to the receiver [McProject]. - * - * @param content the content of the Kotlin file - * @param sourceSetName the source set name of the Kotlin file - * @return the created Kotlin file - */ - fun McProject.createKotlinFile( - @Language("kotlin") - content: String, - sourceSetName: SourceSetName = SourceSetName.MAIN - ): KotlinFile = createKotlinFile( - content = content, - project = this@createKotlinFile, - sourceSetName = sourceSetName - ) - - /** - * Creates a [KotlinFile] and adds it to the specified [McProject]. - * - * @param content the content of the Kotlin file - * @param project the project to which the Kotlin file will be added - * @param sourceSetName the source set name of the Kotlin file - * @param jvmTarget the JVM target version for the Kotlin file - * @return the created Kotlin file - */ - fun ProjectTestEnvironment.createKotlinFile( - @Language("kotlin") - content: String, - project: McProject = simpleProject(), - sourceSetName: SourceSetName = SourceSetName.MAIN, - jvmTarget: JvmTarget = JvmTarget.JVM_11 - ): KotlinFile = runBlocking(Trace.start(listOf(ProjectTest::class))) { - project.editSimple { - addKotlinSource(content, sourceSetName) - this.jvmTarget = jvmTarget - }.jvmFiles() - .get(sourceSetName) - .filterIsInstance() - .first { it.psi.text == content.trimIndent() } - } -} diff --git a/modulecheck-reporting/checkstyle/api/checkstyle.api b/modulecheck-reporting/checkstyle/api/checkstyle.api deleted file mode 100644 index 789c0d4d7f..0000000000 --- a/modulecheck-reporting/checkstyle/api/checkstyle.api +++ /dev/null @@ -1,13 +0,0 @@ -public final class modulecheck/reporting/checkstyle/CheckstyleReporter { - public fun ()V - public final fun createXml (Ljava/util/List;)Ljava/lang/String; -} - -public final class modulecheck/reporting/checkstyle/CheckstyleReporter_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/reporting/checkstyle/CheckstyleReporter_Factory; - public static final fun create ()Lmodulecheck/reporting/checkstyle/CheckstyleReporter_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/reporting/checkstyle/CheckstyleReporter; - public static final fun newInstance ()Lmodulecheck/reporting/checkstyle/CheckstyleReporter; -} - diff --git a/modulecheck-reporting/checkstyle/build.gradle.kts b/modulecheck-reporting/checkstyle/build.gradle.kts deleted file mode 100644 index cf017e78bf..0000000000 --- a/modulecheck-reporting/checkstyle/build.gradle.kts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-reporting-checkstyle" - ) - anvil() -} - -dependencies { - - api(project(path = ":modulecheck-finding:api")) - - implementation(libs.unbescape) - - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - - testImplementation(project(path = ":modulecheck-finding:name")) - testImplementation(project(path = ":modulecheck-internal-testing")) - testImplementation(project(path = ":modulecheck-model:dependency:api")) -} diff --git a/modulecheck-reporting/checkstyle/src/main/kotlin/modulecheck/reporting/checkstyle/CheckstyleReporter.kt b/modulecheck-reporting/checkstyle/src/main/kotlin/modulecheck/reporting/checkstyle/CheckstyleReporter.kt deleted file mode 100644 index 43bde9f851..0000000000 --- a/modulecheck-reporting/checkstyle/src/main/kotlin/modulecheck/reporting/checkstyle/CheckstyleReporter.kt +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.checkstyle - -import modulecheck.finding.Finding.FindingResult -import modulecheck.utils.indent -import org.unbescape.xml.XmlEscape -import java.io.File -import javax.inject.Inject - -class CheckstyleReporter @Inject constructor() { - - fun createXml(results: List): String = buildString { - - appendLine("""""") - appendLine("""""") - - results.groupBy { it.buildFile.toUnifiedString() } - .entries - .forEach { (filePathString, values) -> - - indent { - - appendLine("""""") - - values.forEach { findingResult -> - - val row = findingResult.positionOrNull?.row ?: -1 - val column = findingResult.positionOrNull?.column ?: -1 - - val severity = if (findingResult.fixed) "info" else "error" - val source = "modulecheck." + findingResult.findingName.id - - indent { - append("""""") - appendLine() - } - } - - appendLine("") - } - } - - appendLine("") - } - - private fun Any.xml() = XmlEscape.escapeXml11(toString().trim()) - - private fun File.toUnifiedString(): String = toString().replace(File.separatorChar, '/') -} diff --git a/modulecheck-reporting/checkstyle/src/test/kotlin/modulecheck/reporting/checkstyle/CheckstyleReporterTest.kt b/modulecheck-reporting/checkstyle/src/test/kotlin/modulecheck/reporting/checkstyle/CheckstyleReporterTest.kt deleted file mode 100644 index e1e7fdbfd5..0000000000 --- a/modulecheck-reporting/checkstyle/src/test/kotlin/modulecheck/reporting/checkstyle/CheckstyleReporterTest.kt +++ /dev/null @@ -1,160 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.checkstyle - -import modulecheck.finding.Finding.FindingResult -import modulecheck.finding.Finding.Position -import modulecheck.finding.FindingName -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.testing.BaseTest -import org.junit.jupiter.api.Test -import java.io.File - -internal class CheckstyleReporterTest : BaseTest { - - @Test - fun `empty result list should create checkstyle xml with no child attributes`() { - - val result = CheckstyleReporter().createXml(emptyList()) - - println("`$result`") - - result shouldBe """ - - - - """ - } - - @Test - fun `unfixed result should create checkstyle xml with error type`() { - - val result = CheckstyleReporter().createXml( - listOf( - FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("some-rule"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = false - ) - ) - ) - - println("`$result`") - - result shouldBe """ - - - - - - - """ - } - - @Test - fun `fixed result should create checkstyle xml with info type`() { - - val result = CheckstyleReporter().createXml( - listOf( - FindingResult( - dependentPath = StringProjectPath(":dependentPath"), - findingName = FindingName("some-rule"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = "dependencyIdentifier", - positionOrNull = Position(1, 2), - buildFile = File("buildFile"), - message = "message", - fixed = true - ) - ) - ) - - println("`$result`") - - result shouldBe """ - - - - - - - """ - } - - @Test - fun `results should be grouped by build file path`() { - - val result = CheckstyleReporter().createXml( - listOf( - FindingResult( - dependentPath = StringProjectPath(":lib1"), - findingName = FindingName("some-rule"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = ":path1", - positionOrNull = Position(1, 2), - buildFile = File("lib1/build.gradle.kts"), - message = "message", - fixed = true - ), - FindingResult( - dependentPath = StringProjectPath(":lib1"), - findingName = FindingName("some-rule"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = ":path2", - positionOrNull = Position(2, 2), - buildFile = File("lib1/build.gradle.kts"), - message = "message", - fixed = true - ), - FindingResult( - dependentPath = StringProjectPath(":lib2"), - findingName = FindingName("some-rule"), - sourceOrNull = "sourceOrNull", - configurationName = "configurationName", - dependencyIdentifier = ":path1", - positionOrNull = Position(1, 2), - buildFile = File("lib2/build.gradle.kts"), - message = "message", - fixed = true - ) - ) - ) - - println("`$result`") - - result shouldBe """ - - - - - - - - - - - """ - } -} diff --git a/modulecheck-reporting/console/api/console.api b/modulecheck-reporting/console/api/console.api deleted file mode 100644 index f87e112857..0000000000 --- a/modulecheck-reporting/console/api/console.api +++ /dev/null @@ -1,58 +0,0 @@ -public final class modulecheck/reporting/console/DepthLogFactory { - public static final field Companion Lmodulecheck/reporting/console/DepthLogFactory$Companion; - public fun (Lcom/github/ajalt/mordant/terminal/Terminal;)V - public final fun create (Ljava/util/List;)Ljava/lang/String; -} - -public final class modulecheck/reporting/console/DepthLogFactory$Companion { -} - -public final class modulecheck/reporting/console/DepthLogFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/reporting/console/DepthLogFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/reporting/console/DepthLogFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/reporting/console/DepthLogFactory; - public static final fun newInstance (Lcom/github/ajalt/mordant/terminal/Terminal;)Lmodulecheck/reporting/console/DepthLogFactory; -} - -public final class modulecheck/reporting/console/DepthLogFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/reporting/console/DepthLogFactory_Factory; - public final fun newInstance (Lcom/github/ajalt/mordant/terminal/Terminal;)Lmodulecheck/reporting/console/DepthLogFactory; -} - -public final class modulecheck/reporting/console/DepthReportFactory { - public static final field Companion Lmodulecheck/reporting/console/DepthReportFactory$Companion; - public fun ()V - public final fun create (Ljava/util/List;)Ljava/lang/String; -} - -public final class modulecheck/reporting/console/DepthReportFactory$Companion { -} - -public final class modulecheck/reporting/console/ReportFactory { - public static final field Companion Lmodulecheck/reporting/console/ReportFactory$Companion; - public static final field ERROR Ljava/lang/String; - public static final field FIXED Ljava/lang/String; - public static final field PADDING I - public fun (Lcom/github/ajalt/mordant/terminal/Terminal;)V - public final fun create (Ljava/util/List;)Ljava/lang/String; -} - -public final class modulecheck/reporting/console/ReportFactory$Companion { -} - -public final class modulecheck/reporting/console/ReportFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/reporting/console/ReportFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/reporting/console/ReportFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/reporting/console/ReportFactory; - public static final fun newInstance (Lcom/github/ajalt/mordant/terminal/Terminal;)Lmodulecheck/reporting/console/ReportFactory; -} - -public final class modulecheck/reporting/console/ReportFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/reporting/console/ReportFactory_Factory; - public final fun newInstance (Lcom/github/ajalt/mordant/terminal/Terminal;)Lmodulecheck/reporting/console/ReportFactory; -} - diff --git a/modulecheck-reporting/console/build.gradle.kts b/modulecheck-reporting/console/build.gradle.kts deleted file mode 100644 index 9c4fb5742d..0000000000 --- a/modulecheck-reporting/console/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-reporting-console" - ) - anvil() -} - -dependencies { - - api(libs.ajalt.mordant) - - api(project(path = ":modulecheck-api")) - api(project(path = ":modulecheck-finding:api")) - - implementation(project(path = ":modulecheck-model:sourceset:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/DepthLogFactory.kt b/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/DepthLogFactory.kt deleted file mode 100644 index 69e8234084..0000000000 --- a/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/DepthLogFactory.kt +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.console - -import com.github.ajalt.mordant.rendering.OverflowWrap -import com.github.ajalt.mordant.rendering.TextAlign -import com.github.ajalt.mordant.rendering.Whitespace -import com.github.ajalt.mordant.table.grid -import com.github.ajalt.mordant.terminal.Terminal -import modulecheck.api.DepthFinding -import modulecheck.model.sourceset.SourceSetName -import modulecheck.utils.mapLines -import javax.inject.Inject - -/** - * Creates the depth report content as it is printed to the console -- not a file. - * - * ex: - * ``` - * -- ModuleCheck main source set depth results -- - * depth modules - * 0 [:lib1] - * 1 [:debug1, :lib2] - * 2 [:app, :debug2] - * ``` - */ -class DepthLogFactory @Inject constructor(private val terminal: Terminal) { -/** */ - fun create(results: List): String = buildString { - - appendLine(terminal.theme.warning("-- ModuleCheck main source set depth results --")) - - val depthHeader = "depth" - val childrenHeader = "modules" - - grid { - - style = style?.plus(terminal.theme.warning) ?: terminal.theme.warning - whitespace = Whitespace.NORMAL - overflowWrap = OverflowWrap.NORMAL - align = TextAlign.NONE - padding { left = PADDING } - - row(depthHeader, childrenHeader) - - column(0) { - padding { left = LEADING_PADDING } - } - - results - .filter { it.sourceSetName == SourceSetName.MAIN } - .groupBy { it.depth } - .toSortedMap() - .entries - .forEach { (depth, values) -> - - val paths = values - .distinctBy { it.dependentPath } - .sortedBy { it.dependentPath } - .joinToString(separator = ", ", prefix = "[", postfix = "]") { it.dependentPath.value } - - row(depth.toString(), paths) - } - } - .also { grid -> appendLine(terminal.render(grid).mapLines(String::trimEnd)) } - } - - companion object { - - private const val LEADING_PADDING = 4 - private const val PADDING = 3 - } -} diff --git a/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/DepthReportFactory.kt b/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/DepthReportFactory.kt deleted file mode 100644 index 4512278b6c..0000000000 --- a/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/DepthReportFactory.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.console - -import modulecheck.api.DepthFinding - -/** - * Creates the depth report content as it is written to a text file -- not the console. - * - * ex: - * ``` - * -- ModuleCheck Depth results -- - * - * :app - * source set depth most expensive dependencies - * main 2 [:lib2] - * - * :lib2 - * source set depth most expensive dependencies - * main 1 [:lib1] - * ``` - */ -class DepthReportFactory { - /** */ - fun create(results: List): String = buildString { - - appendLine("-- ModuleCheck Depth results --") - - results.filter { it.shouldReport() } - .groupBy { it.dependentPath } - .toSortedMap() - .entries - .forEach { (path, values) -> - - appendLine("\n${path.value}") - - val nameHeader = "source set" - val depthHeader = "depth" - val childrenHeader = "most expensive dependencies" - - val maxSourceSetNameLength = values.map { it.sourceSetName.value } - .plus(nameHeader) - .maxOf { it.length } + SOURCE_SET_NAME_PADDING - - val depthHeaderLength = depthHeader.length + DEPTH_PADDING - - appendLine( - " " + - "${nameHeader.padEnd(maxSourceSetNameLength)} " + - "${depthHeader.padEnd(depthHeaderLength)} " + - childrenHeader - ) - - values.sortedBy { it.sourceSetName.value } - .forEach { depthFinding -> - appendLine( - " " + - "${depthFinding.sourceSetName.value.padEnd(maxSourceSetNameLength)} " + - "${depthFinding.depth.toString().padEnd(depthHeaderLength)} " + - depthFinding.children.joinToString( - separator = ", ", - prefix = "[", - postfix = "]" - ) { it.dependentPath.value } - ) - } - } - - // bottom padding - appendLine("") - } - - private fun DepthFinding.shouldReport(): Boolean { - // If the module declares dependencies, report it even if it has no source set files. - if (depth > 0) return true - - // This really shouldn't be possible, but just skip reporting if the source set doesn't exist - val sourceSet = dependentProject.sourceSets[sourceSetName] ?: return false - - // If the depth is 0 and there are no files, just omit the report. - // If the depth is 0 and it has files, like a core module, report it. - return sourceSet.hasExistingSourceFiles - } - - companion object { - - private const val SOURCE_SET_NAME_PADDING = 5 - private const val DEPTH_PADDING = 3 - } -} diff --git a/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/ReportFactory.kt b/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/ReportFactory.kt deleted file mode 100644 index 7d4b007432..0000000000 --- a/modulecheck-reporting/console/src/main/kotlin/modulecheck/reporting/console/ReportFactory.kt +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.console - -import com.github.ajalt.mordant.rendering.OverflowWrap -import com.github.ajalt.mordant.rendering.TextAlign -import com.github.ajalt.mordant.rendering.Whitespace -import com.github.ajalt.mordant.table.Borders -import com.github.ajalt.mordant.table.grid -import com.github.ajalt.mordant.terminal.Terminal -import modulecheck.finding.Finding -import java.util.Locale -import javax.inject.Inject - -/** - * Creates the main report as it is printed in the console. - * - * ex: - * ``` - * -- ModuleCheck results -- - * :lib2 - * configuration dependency name source build file - * ✔ implementation :lib1 must-be-api [...]/lib2/build.gradle.kts: (6, 3): - * ``` - */ -class ReportFactory @Inject constructor(private val terminal: Terminal) { - - /** */ - fun create(results: List): String = buildString { - - val theme = terminal.theme - - appendLine("-- ModuleCheck results --") - - val entries = results.groupBy { it.dependentPath.value.lowercase(Locale.getDefault()) } - .entries - .sortedBy { it.key } - - for (entry in entries) { - - val values = entry.value - val path = values.first().dependentPath - - val sortedValues = values.sortedWith( - compareBy( - { !it.fixed }, - { it.dependencyIdentifier }, - { it.positionOrNull }, - { it.findingName.id }, - { it.configurationName }, - { it.sourceOrNull }, - { it.toString() } - ) - ) - - appendLine(" ${path.value}") - val grid = grid { - - cellBorders = Borders.NONE - // borderType = BorderType.DOUBLE - - whitespace = Whitespace.PRE - overflowWrap = OverflowWrap.NORMAL - - padding { - left = PADDING - right = 1 - } - - row(" ", "configuration", "dependency", "name", "source", "build file") - - column(0) { - align = TextAlign.RIGHT - padding { - right = 0 - } - } - column(1) { - padding { - left = 2 - right = 1 - } - } - - align = TextAlign.LEFT - - for (result in sortedValues) { - val icon = if (result.fixed) theme.success(FIXED) else theme.danger(ERROR) - - val rowColor = if (result.fixed) theme.warning.color else theme.danger.color - - row( - icon, - result.configurationName, - result.dependencyIdentifier, - result.findingName.id, - result.sourceOrNull.orEmpty(), - result.filePathString - ) { - style(color = rowColor) - } - } - } - - appendLine(terminal.render(grid).prependIndent(" ")) - - if (entry != entries.last()) { - appendLine() - } - } - } - - companion object { - /** */ - const val FIXED: String = "✔" - - /** */ - const val ERROR: String = "X" - - /** */ - const val PADDING: Int = 3 - } -} diff --git a/modulecheck-reporting/graphviz/api/graphviz.api b/modulecheck-reporting/graphviz/api/graphviz.api deleted file mode 100644 index de9694e41a..0000000000 --- a/modulecheck-reporting/graphviz/api/graphviz.api +++ /dev/null @@ -1,38 +0,0 @@ -public final class modulecheck/reporting/graphviz/GraphvizFactory { - public fun (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;)V - public final fun create (Lmodulecheck/api/context/ProjectDepth;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/reporting/graphviz/GraphvizFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/reporting/graphviz/GraphvizFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/reporting/graphviz/GraphvizFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/reporting/graphviz/GraphvizFactory; - public static final fun newInstance (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;)Lmodulecheck/reporting/graphviz/GraphvizFactory; -} - -public final class modulecheck/reporting/graphviz/GraphvizFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/reporting/graphviz/GraphvizFactory_Factory; - public final fun newInstance (Lmodulecheck/model/dependency/TypeSafeProjectPathResolver;)Lmodulecheck/reporting/graphviz/GraphvizFactory; -} - -public final class modulecheck/reporting/graphviz/GraphvizFileWriter { - public fun (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/reporting/graphviz/GraphvizFactory;)V - public final fun write (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/reporting/graphviz/GraphvizFileWriter_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/reporting/graphviz/GraphvizFileWriter_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/reporting/graphviz/GraphvizFileWriter_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/reporting/graphviz/GraphvizFileWriter; - public static final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/reporting/graphviz/GraphvizFactory;)Lmodulecheck/reporting/graphviz/GraphvizFileWriter; -} - -public final class modulecheck/reporting/graphviz/GraphvizFileWriter_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/reporting/graphviz/GraphvizFileWriter_Factory; - public final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/reporting/graphviz/GraphvizFactory;)Lmodulecheck/reporting/graphviz/GraphvizFileWriter; -} - diff --git a/modulecheck-reporting/graphviz/build.gradle.kts b/modulecheck-reporting/graphviz/build.gradle.kts deleted file mode 100644 index 63ee34c8a9..0000000000 --- a/modulecheck-reporting/graphviz/build.gradle.kts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-reporting-graphviz" - ) - anvil() -} - -dependencies { - - api(project(path = ":modulecheck-api")) - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:dependency:api")) - - implementation(libs.graphviz.java.min) - implementation(libs.rickBusarow.dispatch.core) - - implementation(project(path = ":modulecheck-model:dependency:api")) - implementation(project(path = ":modulecheck-model:dependency:api")) - implementation(project(path = ":modulecheck-project:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotlin.compiler) - testImplementation(libs.kotlin.reflect) - testImplementation(libs.rickBusarow.dispatch.test.core) - - testImplementation(project(path = ":modulecheck-model:sourceset:api")) - testImplementation(project(path = ":modulecheck-project-generation:api")) - testImplementation(project(path = ":modulecheck-project:api")) - testImplementation(project(path = ":modulecheck-rule:api")) - testImplementation(project(path = ":modulecheck-rule:impl")) - testImplementation(project(path = ":modulecheck-runtime:testing")) -} diff --git a/modulecheck-reporting/graphviz/src/main/kotlin/modulecheck/reporting/graphviz/GraphvizFactory.kt b/modulecheck-reporting/graphviz/src/main/kotlin/modulecheck/reporting/graphviz/GraphvizFactory.kt deleted file mode 100644 index ce2ac4f71d..0000000000 --- a/modulecheck-reporting/graphviz/src/main/kotlin/modulecheck/reporting/graphviz/GraphvizFactory.kt +++ /dev/null @@ -1,166 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.graphviz - -import guru.nidi.graphviz.attribute.Arrow -import guru.nidi.graphviz.attribute.Color -import guru.nidi.graphviz.attribute.Label -import guru.nidi.graphviz.attribute.Label.Location.TOP -import guru.nidi.graphviz.attribute.Rank -import guru.nidi.graphviz.attribute.Rank.RankDir -import guru.nidi.graphviz.attribute.Rank.RankType.SAME -import guru.nidi.graphviz.attribute.Shape -import guru.nidi.graphviz.attribute.Style -import guru.nidi.graphviz.engine.Graphviz -import guru.nidi.graphviz.model.Factory -import guru.nidi.graphviz.model.Factory.mutGraph -import guru.nidi.graphviz.model.Factory.mutNode -import guru.nidi.graphviz.model.Factory.node -import modulecheck.api.context.ProjectDepth -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.ProjectPath -import modulecheck.model.dependency.TypeSafeProjectPathResolver -import modulecheck.project.isAndroid -import modulecheck.reporting.graphviz.GraphvizFactory.Colors.API_LINE -import modulecheck.reporting.graphviz.GraphvizFactory.Colors.BLACK -import modulecheck.reporting.graphviz.GraphvizFactory.Colors.IMPLEMENTATION_LINE -import modulecheck.reporting.graphviz.GraphvizFactory.Colors.JAVA_BLUE -import modulecheck.utils.applyEach -import javax.inject.Inject - -/** - * Creates a [Graphviz] model of a dependency graph from a given [ProjectDepth] root. - * - * @param typeSafeProjectPathResolver used to resolve project paths from type-safe project accessors - * @since 0.12.0 - */ -class GraphvizFactory @Inject constructor( - private val typeSafeProjectPathResolver: TypeSafeProjectPathResolver -) { - - /** - * Creates a [Graphviz] model of a dependency graph from a given [ProjectDepth] root. - * - * @param root the root of the dependency graph, starting at a - * single [SourceSet][modulecheck.model.dependency.McSourceSet] - * @return the graph model for this dependency graph - * @since 0.12.0 - */ - suspend fun create(root: ProjectDepth): Graphviz { - - val allDepths = root.fullTree() - val sourceSetName = root.sourceSetName - - val graphName = "${root.dependentPath.value} -- ${sourceSetName.value}" - - val rootGraph = mutGraph() - .setStrict(true) - .setDirected(true) - .setCluster(true) - .graphAttrs().apply { - // ratio is the aspect ratio. 0.5625 is 16:9 - @Suppress("MagicNumber") - add("ratio", 0.5625) - } - .add( - Rank.dir(RankDir.TOP_TO_BOTTOM), - Label.markdown("**$graphName**").locate(TOP) - ) - .nodeAttrs().add( - Style.combine(Style.ROUNDED, Style.FILLED), - Shape.BOX - ) - - /* ranks */ - allDepths - .groupBy { it.depth } - .toSortedMap() - .forEach { (_, sameRank) -> - - mutGraph() - .graphAttrs() - .add(Rank.inSubgraph(SAME)) - .applyEach( - sameRank - .distinctBy { it.dependentPath } - .sortedBy { it.dependentPath } - ) { projectDepth -> - add( - mutNode(projectDepth.pathString(), false) - .add(projectDepth.nodeColor()) - ) - } - .addTo(rootGraph) - } - - /* edges */ - allDepths.sortedBy { it.dependentPath } - .forEach { depthFinding -> - depthFinding.dependentProject - .projectDependencies[depthFinding.sourceSetName] - .sortedBy { it.projectPath } - .forEach { cpd -> - - val lineColor = cpd.lineColor() - - rootGraph.add( - node(depthFinding.pathString()) - .link( - Factory.to(node(cpd.projectPath.pathString())) - .with(Arrow.NORMAL, Style.BOLD, lineColor) - ) - ) - } - } - - return Graphviz.fromGraph(rootGraph) - } - - private fun ProjectDepth.pathString(): String { - return dependentPath.pathValue(typeSafeProjectPathResolver) - } - - private fun ProjectDepth.nodeColor(): Color { - return when { - dependentProject.isAndroid() -> Colors.ANDROID_GREEN.fill() - else -> Colors.JAVA_ORANGE.fill() - } - } - - private fun ProjectPath.pathString(): String { - return pathValue(typeSafeProjectPathResolver) - } - - private fun ProjectDependency.lineColor(): Color { - return when { - configurationName.isApi() -> API_LINE - configurationName.isKapt() -> JAVA_BLUE - configurationName.isImplementation() -> IMPLEMENTATION_LINE - else -> BLACK - } - } - - private object Colors { - val ANDROID_GREEN: Color = Color.rgb("A4C639") - val API_RED: Color = Color.rgb("AA0000") - val BLACK: Color = Color.rgb("000000") - val IMPLEMENTATION_GREEN: Color = Color.rgb("007744") - val JAVA_BLUE: Color = Color.rgb("5382A1") - val JAVA_ORANGE: Color = Color.rgb("F89820") - val API_LINE: Color = Color.rgb("FF6347") - val IMPLEMENTATION_LINE: Color = Color.rgb("FF6347") - } -} diff --git a/modulecheck-reporting/graphviz/src/main/kotlin/modulecheck/reporting/graphviz/GraphvizFileWriter.kt b/modulecheck-reporting/graphviz/src/main/kotlin/modulecheck/reporting/graphviz/GraphvizFileWriter.kt deleted file mode 100644 index f481462377..0000000000 --- a/modulecheck-reporting/graphviz/src/main/kotlin/modulecheck/reporting/graphviz/GraphvizFileWriter.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.graphviz - -import guru.nidi.graphviz.engine.Format -import modulecheck.api.context.ProjectDepth -import modulecheck.config.ModuleCheckSettings -import modulecheck.utils.createSafely -import modulecheck.utils.indentByBrackets -import modulecheck.utils.resolve -import java.io.File -import javax.inject.Inject - -class GraphvizFileWriter @Inject constructor( - private val settings: ModuleCheckSettings, - private val graphvizFactory: GraphvizFactory -) { - - suspend fun write(depths: List) { - - val rootOrNull = settings.reports.graphs.outputDir?.let { File(it) } - - depths - // Generate the low-depth graphs first, because their data is memoized and used to create the - // graphs for high-depth projects. - .sorted() - .forEach { depth -> - - val graphDir = rootOrNull?.resolve( - depth.dependentPath.value - .replace(":", File.separator) - .removePrefix(File.separator) - ) - ?: depth.dependentProject.projectDir.resolve( - "build", - "reports", - "modulecheck", - "graphs" - ) - - graphDir.mkdirs() - - val fileName = depth.sourceSetName.value - - val dotFile = graphDir.resolve("$fileName.dot") - - val graphviz = graphvizFactory.create(depth) - - val dotString = graphviz - .render(Format.DOT) - .toString() - .indentByBrackets() - - dotFile.createSafely(dotString) - - // TODO - maybe add SVG and PNG generation. Large graphs can take a long time to generate - // (~20 seconds for SVG with 500 modules), and PNGs for large graphs have huge file sizes. - // It might be a good idea to explicitly name the modules in the extension config, and/or - // to reserve the image generation only for the `-Graphs` gradle task. - /* - GraphvizCmdLineEngine() - .timeout(1, MINUTES) - .execute( - dotString, Options.create().format(Format.SVG), Rasterizer.DEFAULT - ) - .let { - graphDir.child("$fileName.svg").createSafely(it.asString()) - } - */ - } - } -} diff --git a/modulecheck-reporting/graphviz/src/test/kotlin/modulecheck/reporting/graphviz/GraphVizReportTest.kt b/modulecheck-reporting/graphviz/src/test/kotlin/modulecheck/reporting/graphviz/GraphVizReportTest.kt deleted file mode 100644 index 6a566a16ec..0000000000 --- a/modulecheck-reporting/graphviz/src/test/kotlin/modulecheck/reporting/graphviz/GraphVizReportTest.kt +++ /dev/null @@ -1,455 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.graphviz - -import io.kotest.inspectors.forAll -import modulecheck.config.ModuleCheckSettings -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.generation.maybeAddSourceSet -import modulecheck.rule.ModuleCheckRule -import modulecheck.rule.RuleFilter -import modulecheck.rule.impl.DepthRule -import modulecheck.runtime.test.RunnerTest -import modulecheck.utils.resolve -import org.junit.jupiter.api.Test -import java.io.File - -internal class GraphVizReportTest : RunnerTest() { - - override val rules: (ModuleCheckSettings, RuleFilter) -> List> = { _, _ -> - listOf(DepthRule()) - } - - fun McProject.graphFile(sourceSet: String = "main"): File { - return projectDir.resolve( - "build", - "reports", - "modulecheck", - "graphs", - "$sourceSet.dot" - ) - } - - @Test - fun `graph report should not be created if disabled in settings`() = test { - - settings.reports.graphs.enabled = false - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib2.graphFile().exists() shouldBe false - } - - @Test - fun `graph should be created if enabled in settings`() = test { - - settings.reports.graphs.enabled = true - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - val app = kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - app.graphFile() shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":app" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - } - - // https://github.com/RBusarow/ModuleCheck/issues/575 - @Test - fun `custom report dir should put all graphs in relative directories`() = test { - - val graphsDir = workingDir.resolve("graphs") - fun graph(project: McProject, sourceSetName: SourceSetName): File { - return graphsDir.resolve( - project.projectPath.value.removePrefix(":"), - "${sourceSetName.value}.dot" - ) - } - - settings.reports.graphs.enabled = true - settings.reports.graphs.outputDir = graphsDir.path - - val lib1 = kotlinProject(":lib1") - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - val app = kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - // These are the simple, no-dependency graphs - listOf( - lib1 to SourceSetName.MAIN, - lib1 to SourceSetName.TEST, - lib2 to SourceSetName.TEST, - app to SourceSetName.TEST - ).forAll { (project, sourceSet) -> - - graph(project, sourceSet) shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<${project.projectPath.value} -- ${sourceSet.value}>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - "${project.projectPath.value}" ["fillcolor"="#F89820"] - } - } - """ - } - - graph(lib2, SourceSetName.MAIN) shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:lib2 -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - - graph(app, SourceSetName.MAIN) shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":app" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - } - - @Test - fun `graph should be created for zero-depth source sets if the source set is not empty`() = test { - - settings.reports.graphs.enabled = true - - val lib1 = kotlinProject(":lib1") { - addKotlinSource("", directory = "com/test", fileName = "MyFile.kt") - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.graphFile() shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:lib1 -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - } - """ - } - - @Test - fun `graph should be created for an existing source set with no files`() = test { - - settings.reports.graphs.enabled = true - - val lib1 = kotlinProject(":lib1") { - addKotlinSource("", directory = "com/test", fileName = "MyFile.kt") - } - - run(autoCorrect = false).isSuccess shouldBe true - - lib1.graphFile() shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:lib1 -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - } - """ - } - - @Test - fun `test source set graph should be test-specific`() = test { - - settings.reports.graphs.enabled = true - - val lib1 = kotlinProject(":lib1") { - maybeAddSourceSet(SourceSetName.TEST) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - - val test1 = kotlinProject(":test1") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - } - - val app = kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - addDependency(ConfigurationName.testImplementation, test1) - } - - lib1.addDependency(ConfigurationName("testImplementation"), lib2) - - run(autoCorrect = false).isSuccess shouldBe true - - app.graphFile() shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":app" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - - app.graphFile("test") shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- test>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":test1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":test1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":test1" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":test1" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - - lib1.graphFile("test") shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:lib1 -- test>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - ":lib1" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - } - - @Test - fun `debug source set graph should be debug-specific`() = test { - - settings.reports.graphs.enabled = true - - val lib1 = kotlinProject(":lib1") - val debug1 = kotlinProject(":debug1") { - addDependency(ConfigurationName.implementation, lib1) - } - - val lib2 = kotlinProject(":lib2") { - addDependency(ConfigurationName.implementation, lib1) - } - val debug2 = kotlinProject(":debug2") { - addDependency(ConfigurationName.implementation, debug1) - addDependency(ConfigurationName.implementation, lib2) - } - - val app = kotlinProject(":app") { - addDependency(ConfigurationName.implementation, lib1) - addDependency(ConfigurationName.implementation, lib2) - addDependency(ConfigurationName("debugImplementation"), debug1) - addDependency(ConfigurationName("debugImplementation"), debug2) - } - - run(autoCorrect = false).isSuccess shouldBe true - - app.graphFile() shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- main>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":app" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - - app.graphFile("debug") shouldHaveText """ - strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<:app -- debug>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - ":lib1" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":debug1" ["fillcolor"="#F89820"] - ":lib2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":debug2" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - ":app" ["fillcolor"="#F89820"] - } - ":app" -> ":debug2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":app" -> ":debug1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":debug1" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":debug2" -> ":lib2" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":debug2" -> ":debug1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - ":lib2" -> ":lib1" ["arrowhead"="normal","style"="bold","color"="#FF6347"] - } - """ - } -} diff --git a/modulecheck-reporting/graphviz/src/test/resources/huge-graph.dot b/modulecheck-reporting/graphviz/src/test/resources/huge-graph.dot deleted file mode 100644 index 66c1db8db7..0000000000 --- a/modulecheck-reporting/graphviz/src/test/resources/huge-graph.dot +++ /dev/null @@ -1,2566 +0,0 @@ -strict digraph { - edge ["dir"="forward"] - graph ["ratio"="0.5625","rankdir"="TB","label"=<some huge graph>,"labelloc"="t"] - node ["style"="rounded,filled","shape"="box"] - { - edge ["dir"="none"] - graph ["rank"="same"] - "00-0000" ["fillcolor"="#A4C639"] - "00-0001" ["fillcolor"="#A4C639"] - "00-0002" ["fillcolor"="#A4C639"] - "00-0003" ["fillcolor"="#A4C639"] - "00-0004" ["fillcolor"="#A4C639"] - "00-0005" ["fillcolor"="#F89820"] - "00-0006" ["fillcolor"="#F89820"] - "00-0007" ["fillcolor"="#A4C639"] - "00-0008" ["fillcolor"="#F89820"] - "00-0009" ["fillcolor"="#F89820"] - "00-0010" ["fillcolor"="#A4C639"] - "00-0011" ["fillcolor"="#A4C639"] - "00-0012" ["fillcolor"="#A4C639"] - "00-0013" ["fillcolor"="#F89820"] - "00-0014" ["fillcolor"="#A4C639"] - "00-0015" ["fillcolor"="#F89820"] - "00-0016" ["fillcolor"="#A4C639"] - "00-0017" ["fillcolor"="#A4C639"] - "00-0018" ["fillcolor"="#A4C639"] - "00-0019" ["fillcolor"="#F89820"] - "00-0020" ["fillcolor"="#F89820"] - "00-0021" ["fillcolor"="#A4C639"] - "00-0022" ["fillcolor"="#A4C639"] - "00-0023" ["fillcolor"="#A4C639"] - "00-0024" ["fillcolor"="#A4C639"] - "00-0025" ["fillcolor"="#A4C639"] - "00-0026" ["fillcolor"="#A4C639"] - "00-0027" ["fillcolor"="#A4C639"] - "00-0028" ["fillcolor"="#F89820"] - "00-0029" ["fillcolor"="#A4C639"] - "00-0030" ["fillcolor"="#A4C639"] - "00-0031" ["fillcolor"="#A4C639"] - "00-0032" ["fillcolor"="#A4C639"] - "00-0033" ["fillcolor"="#A4C639"] - "00-0034" ["fillcolor"="#A4C639"] - "00-0035" ["fillcolor"="#A4C639"] - "00-0036" ["fillcolor"="#F89820"] - "00-0037" ["fillcolor"="#F89820"] - "00-0038" ["fillcolor"="#A4C639"] - "00-0039" ["fillcolor"="#F89820"] - "00-0040" ["fillcolor"="#A4C639"] - "00-0041" ["fillcolor"="#F89820"] - "00-0042" ["fillcolor"="#A4C639"] - "00-0043" ["fillcolor"="#A4C639"] - "00-0044" ["fillcolor"="#A4C639"] - "00-0045" ["fillcolor"="#A4C639"] - "00-0046" ["fillcolor"="#A4C639"] - "00-0047" ["fillcolor"="#A4C639"] - "00-0048" ["fillcolor"="#A4C639"] - "00-0049" ["fillcolor"="#A4C639"] - "00-0050" ["fillcolor"="#A4C639"] - "00-0051" ["fillcolor"="#A4C639"] - "00-0052" ["fillcolor"="#A4C639"] - "00-0053" ["fillcolor"="#F89820"] - "00-0054" ["fillcolor"="#A4C639"] - "00-0055" ["fillcolor"="#A4C639"] - "00-0056" ["fillcolor"="#F89820"] - "00-0057" ["fillcolor"="#F89820"] - "00-0058" ["fillcolor"="#A4C639"] - "00-0059" ["fillcolor"="#A4C639"] - "00-0060" ["fillcolor"="#A4C639"] - "00-0061" ["fillcolor"="#A4C639"] - "00-0062" ["fillcolor"="#A4C639"] - "00-0063" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "01-0000" ["fillcolor"="#A4C639"] - "01-0001" ["fillcolor"="#A4C639"] - "01-0002" ["fillcolor"="#A4C639"] - "01-0003" ["fillcolor"="#A4C639"] - "01-0004" ["fillcolor"="#A4C639"] - "01-0005" ["fillcolor"="#A4C639"] - "01-0006" ["fillcolor"="#A4C639"] - "01-0007" ["fillcolor"="#A4C639"] - "01-0008" ["fillcolor"="#F89820"] - "01-0009" ["fillcolor"="#A4C639"] - "01-0010" ["fillcolor"="#A4C639"] - "01-0011" ["fillcolor"="#A4C639"] - "01-0012" ["fillcolor"="#A4C639"] - "01-0013" ["fillcolor"="#F89820"] - "01-0014" ["fillcolor"="#F89820"] - "01-0015" ["fillcolor"="#A4C639"] - "01-0016" ["fillcolor"="#A4C639"] - "01-0017" ["fillcolor"="#A4C639"] - "01-0018" ["fillcolor"="#F89820"] - "01-0019" ["fillcolor"="#F89820"] - "01-0020" ["fillcolor"="#F89820"] - "01-0021" ["fillcolor"="#F89820"] - "01-0022" ["fillcolor"="#F89820"] - "01-0023" ["fillcolor"="#F89820"] - "01-0024" ["fillcolor"="#F89820"] - "01-0025" ["fillcolor"="#F89820"] - "01-0026" ["fillcolor"="#F89820"] - "01-0027" ["fillcolor"="#F89820"] - "01-0028" ["fillcolor"="#F89820"] - "01-0029" ["fillcolor"="#F89820"] - "01-0030" ["fillcolor"="#F89820"] - "01-0031" ["fillcolor"="#F89820"] - "01-0032" ["fillcolor"="#F89820"] - "01-0033" ["fillcolor"="#F89820"] - "01-0034" ["fillcolor"="#F89820"] - "01-0035" ["fillcolor"="#F89820"] - "01-0036" ["fillcolor"="#F89820"] - "01-0037" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "02-0000" ["fillcolor"="#A4C639"] - "02-0001" ["fillcolor"="#A4C639"] - "02-0002" ["fillcolor"="#A4C639"] - "02-0003" ["fillcolor"="#A4C639"] - "02-0004" ["fillcolor"="#A4C639"] - "02-0005" ["fillcolor"="#A4C639"] - "02-0006" ["fillcolor"="#A4C639"] - "02-0007" ["fillcolor"="#A4C639"] - "02-0008" ["fillcolor"="#A4C639"] - "02-0009" ["fillcolor"="#A4C639"] - "02-0010" ["fillcolor"="#A4C639"] - "02-0011" ["fillcolor"="#A4C639"] - "02-0012" ["fillcolor"="#A4C639"] - "02-0013" ["fillcolor"="#A4C639"] - "02-0014" ["fillcolor"="#F89820"] - "02-0015" ["fillcolor"="#F89820"] - "02-0016" ["fillcolor"="#F89820"] - "02-0017" ["fillcolor"="#F89820"] - "02-0018" ["fillcolor"="#F89820"] - "02-0019" ["fillcolor"="#F89820"] - "02-0020" ["fillcolor"="#F89820"] - "02-0021" ["fillcolor"="#F89820"] - "02-0022" ["fillcolor"="#F89820"] - "02-0023" ["fillcolor"="#F89820"] - "02-0024" ["fillcolor"="#F89820"] - "02-0025" ["fillcolor"="#F89820"] - "02-0026" ["fillcolor"="#F89820"] - "02-0027" ["fillcolor"="#F89820"] - "02-0028" ["fillcolor"="#F89820"] - "02-0029" ["fillcolor"="#F89820"] - "02-0030" ["fillcolor"="#F89820"] - "02-0031" ["fillcolor"="#F89820"] - "02-0032" ["fillcolor"="#F89820"] - "02-0033" ["fillcolor"="#F89820"] - "02-0034" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "03-0000" ["fillcolor"="#A4C639"] - "03-0001" ["fillcolor"="#A4C639"] - "03-0002" ["fillcolor"="#A4C639"] - "03-0003" ["fillcolor"="#A4C639"] - "03-0004" ["fillcolor"="#A4C639"] - "03-0005" ["fillcolor"="#A4C639"] - "03-0006" ["fillcolor"="#A4C639"] - "03-0007" ["fillcolor"="#A4C639"] - "03-0008" ["fillcolor"="#A4C639"] - "03-0009" ["fillcolor"="#A4C639"] - "03-0010" ["fillcolor"="#A4C639"] - "03-0011" ["fillcolor"="#F89820"] - "03-0012" ["fillcolor"="#F89820"] - "03-0013" ["fillcolor"="#F89820"] - "03-0014" ["fillcolor"="#F89820"] - "03-0015" ["fillcolor"="#F89820"] - "03-0016" ["fillcolor"="#F89820"] - "03-0017" ["fillcolor"="#F89820"] - "03-0018" ["fillcolor"="#F89820"] - "03-0019" ["fillcolor"="#F89820"] - "03-0020" ["fillcolor"="#F89820"] - "03-0021" ["fillcolor"="#F89820"] - "03-0022" ["fillcolor"="#F89820"] - "03-0023" ["fillcolor"="#F89820"] - "03-0024" ["fillcolor"="#F89820"] - "03-0025" ["fillcolor"="#F89820"] - "03-0026" ["fillcolor"="#F89820"] - "03-0027" ["fillcolor"="#F89820"] - "03-0028" ["fillcolor"="#F89820"] - "03-0029" ["fillcolor"="#F89820"] - "03-0030" ["fillcolor"="#F89820"] - "03-0031" ["fillcolor"="#F89820"] - "03-0032" ["fillcolor"="#F89820"] - "03-0033" ["fillcolor"="#F89820"] - "03-0034" ["fillcolor"="#F89820"] - "03-0035" ["fillcolor"="#F89820"] - "03-0036" ["fillcolor"="#F89820"] - "03-0037" ["fillcolor"="#F89820"] - "03-0038" ["fillcolor"="#F89820"] - "03-0039" ["fillcolor"="#F89820"] - "03-0040" ["fillcolor"="#F89820"] - "03-0041" ["fillcolor"="#F89820"] - "03-0042" ["fillcolor"="#F89820"] - "03-0043" ["fillcolor"="#F89820"] - "03-0044" ["fillcolor"="#F89820"] - "03-0045" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "04-0000" ["fillcolor"="#A4C639"] - "04-0001" ["fillcolor"="#A4C639"] - "04-0002" ["fillcolor"="#A4C639"] - "04-0003" ["fillcolor"="#A4C639"] - "04-0004" ["fillcolor"="#A4C639"] - "04-0005" ["fillcolor"="#A4C639"] - "04-0006" ["fillcolor"="#A4C639"] - "04-0007" ["fillcolor"="#A4C639"] - "04-0008" ["fillcolor"="#A4C639"] - "04-0009" ["fillcolor"="#A4C639"] - "04-0010" ["fillcolor"="#A4C639"] - "04-0011" ["fillcolor"="#A4C639"] - "04-0012" ["fillcolor"="#A4C639"] - "04-0013" ["fillcolor"="#A4C639"] - "04-0014" ["fillcolor"="#F89820"] - "04-0015" ["fillcolor"="#F89820"] - "04-0016" ["fillcolor"="#F89820"] - "04-0017" ["fillcolor"="#F89820"] - "04-0018" ["fillcolor"="#F89820"] - "04-0019" ["fillcolor"="#F89820"] - "04-0020" ["fillcolor"="#F89820"] - "04-0021" ["fillcolor"="#F89820"] - "04-0022" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "05-0000" ["fillcolor"="#A4C639"] - "05-0001" ["fillcolor"="#A4C639"] - "05-0002" ["fillcolor"="#A4C639"] - "05-0003" ["fillcolor"="#A4C639"] - "05-0004" ["fillcolor"="#A4C639"] - "05-0005" ["fillcolor"="#A4C639"] - "05-0006" ["fillcolor"="#A4C639"] - "05-0007" ["fillcolor"="#A4C639"] - "05-0008" ["fillcolor"="#A4C639"] - "05-0009" ["fillcolor"="#A4C639"] - "05-0010" ["fillcolor"="#A4C639"] - "05-0011" ["fillcolor"="#A4C639"] - "05-0012" ["fillcolor"="#A4C639"] - "05-0013" ["fillcolor"="#A4C639"] - "05-0014" ["fillcolor"="#A4C639"] - "05-0015" ["fillcolor"="#A4C639"] - "05-0016" ["fillcolor"="#A4C639"] - "05-0017" ["fillcolor"="#A4C639"] - "05-0018" ["fillcolor"="#A4C639"] - "05-0019" ["fillcolor"="#A4C639"] - "05-0020" ["fillcolor"="#A4C639"] - "05-0021" ["fillcolor"="#A4C639"] - "05-0022" ["fillcolor"="#A4C639"] - "05-0023" ["fillcolor"="#A4C639"] - "05-0024" ["fillcolor"="#A4C639"] - "05-0025" ["fillcolor"="#F89820"] - "05-0026" ["fillcolor"="#F89820"] - "05-0027" ["fillcolor"="#F89820"] - "05-0028" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "06-0000" ["fillcolor"="#A4C639"] - "06-0001" ["fillcolor"="#A4C639"] - "06-0002" ["fillcolor"="#A4C639"] - "06-0003" ["fillcolor"="#A4C639"] - "06-0004" ["fillcolor"="#A4C639"] - "06-0005" ["fillcolor"="#A4C639"] - "06-0006" ["fillcolor"="#A4C639"] - "06-0007" ["fillcolor"="#A4C639"] - "06-0008" ["fillcolor"="#A4C639"] - "06-0009" ["fillcolor"="#A4C639"] - "06-0010" ["fillcolor"="#A4C639"] - "06-0011" ["fillcolor"="#A4C639"] - "06-0012" ["fillcolor"="#A4C639"] - "06-0013" ["fillcolor"="#A4C639"] - "06-0014" ["fillcolor"="#A4C639"] - "06-0015" ["fillcolor"="#F89820"] - "06-0016" ["fillcolor"="#F89820"] - "06-0017" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "07-0000" ["fillcolor"="#A4C639"] - "07-0001" ["fillcolor"="#A4C639"] - "07-0002" ["fillcolor"="#A4C639"] - "07-0003" ["fillcolor"="#A4C639"] - "07-0004" ["fillcolor"="#A4C639"] - "07-0005" ["fillcolor"="#A4C639"] - "07-0006" ["fillcolor"="#A4C639"] - "07-0007" ["fillcolor"="#A4C639"] - "07-0008" ["fillcolor"="#A4C639"] - "07-0009" ["fillcolor"="#A4C639"] - "07-0010" ["fillcolor"="#A4C639"] - "07-0011" ["fillcolor"="#A4C639"] - "07-0012" ["fillcolor"="#A4C639"] - "07-0013" ["fillcolor"="#A4C639"] - "07-0014" ["fillcolor"="#A4C639"] - "07-0015" ["fillcolor"="#F89820"] - "07-0016" ["fillcolor"="#F89820"] - "07-0017" ["fillcolor"="#F89820"] - "07-0018" ["fillcolor"="#F89820"] - "07-0019" ["fillcolor"="#F89820"] - "07-0020" ["fillcolor"="#F89820"] - "07-0021" ["fillcolor"="#F89820"] - "07-0022" ["fillcolor"="#F89820"] - "07-0023" ["fillcolor"="#F89820"] - "07-0024" ["fillcolor"="#F89820"] - "07-0025" ["fillcolor"="#F89820"] - "07-0026" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "08-0000" ["fillcolor"="#A4C639"] - "08-0001" ["fillcolor"="#A4C639"] - "08-0002" ["fillcolor"="#A4C639"] - "08-0003" ["fillcolor"="#A4C639"] - "08-0004" ["fillcolor"="#A4C639"] - "08-0005" ["fillcolor"="#A4C639"] - "08-0006" ["fillcolor"="#A4C639"] - "08-0007" ["fillcolor"="#A4C639"] - "08-0008" ["fillcolor"="#A4C639"] - "08-0009" ["fillcolor"="#A4C639"] - "08-0010" ["fillcolor"="#A4C639"] - "08-0011" ["fillcolor"="#A4C639"] - "08-0012" ["fillcolor"="#A4C639"] - "08-0013" ["fillcolor"="#F89820"] - "08-0014" ["fillcolor"="#F89820"] - "08-0015" ["fillcolor"="#F89820"] - "08-0016" ["fillcolor"="#F89820"] - "08-0017" ["fillcolor"="#F89820"] - "08-0018" ["fillcolor"="#F89820"] - "08-0019" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "09-0000" ["fillcolor"="#A4C639"] - "09-0001" ["fillcolor"="#A4C639"] - "09-0002" ["fillcolor"="#A4C639"] - "09-0003" ["fillcolor"="#A4C639"] - "09-0004" ["fillcolor"="#A4C639"] - "09-0005" ["fillcolor"="#A4C639"] - "09-0006" ["fillcolor"="#A4C639"] - "09-0007" ["fillcolor"="#F89820"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "10-0000" ["fillcolor"="#A4C639"] - "10-0001" ["fillcolor"="#F89820"] - "10-0002" ["fillcolor"="#A4C639"] - "10-0003" ["fillcolor"="#A4C639"] - "10-0004" ["fillcolor"="#A4C639"] - "10-0005" ["fillcolor"="#A4C639"] - "10-0006" ["fillcolor"="#A4C639"] - "10-0007" ["fillcolor"="#A4C639"] - "10-0008" ["fillcolor"="#A4C639"] - "10-0009" ["fillcolor"="#A4C639"] - "10-0010" ["fillcolor"="#A4C639"] - "10-0011" ["fillcolor"="#A4C639"] - "10-0012" ["fillcolor"="#A4C639"] - "10-0013" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "11-0000" ["fillcolor"="#A4C639"] - "11-0001" ["fillcolor"="#A4C639"] - "11-0002" ["fillcolor"="#A4C639"] - "11-0003" ["fillcolor"="#A4C639"] - "11-0004" ["fillcolor"="#A4C639"] - "11-0005" ["fillcolor"="#A4C639"] - "11-0006" ["fillcolor"="#A4C639"] - "11-0007" ["fillcolor"="#A4C639"] - "11-0008" ["fillcolor"="#A4C639"] - "11-0009" ["fillcolor"="#A4C639"] - "11-0010" ["fillcolor"="#A4C639"] - "11-0011" ["fillcolor"="#A4C639"] - "11-0012" ["fillcolor"="#A4C639"] - "11-0013" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "12-0000" ["fillcolor"="#A4C639"] - "12-0001" ["fillcolor"="#A4C639"] - "12-0002" ["fillcolor"="#A4C639"] - "12-0003" ["fillcolor"="#A4C639"] - "12-0004" ["fillcolor"="#A4C639"] - "12-0005" ["fillcolor"="#A4C639"] - "12-0006" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "13-0000" ["fillcolor"="#A4C639"] - "13-0001" ["fillcolor"="#A4C639"] - "13-0002" ["fillcolor"="#A4C639"] - "13-0003" ["fillcolor"="#A4C639"] - "13-0004" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "14-0000" ["fillcolor"="#A4C639"] - "14-0001" ["fillcolor"="#A4C639"] - "14-0002" ["fillcolor"="#A4C639"] - "14-0003" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "15-0000" ["fillcolor"="#A4C639"] - "15-0001" ["fillcolor"="#A4C639"] - "15-0002" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "16-0000" ["fillcolor"="#A4C639"] - "16-0001" ["fillcolor"="#A4C639"] - "16-0002" ["fillcolor"="#A4C639"] - "16-0003" ["fillcolor"="#A4C639"] - "16-0004" ["fillcolor"="#A4C639"] - "16-0005" ["fillcolor"="#A4C639"] - "16-0006" ["fillcolor"="#A4C639"] - "16-0007" ["fillcolor"="#A4C639"] - "16-0008" ["fillcolor"="#A4C639"] - "16-0009" ["fillcolor"="#A4C639"] - "16-0010" ["fillcolor"="#A4C639"] - "16-0011" ["fillcolor"="#A4C639"] - "16-0012" ["fillcolor"="#A4C639"] - "16-0013" ["fillcolor"="#A4C639"] - "16-0014" ["fillcolor"="#A4C639"] - "16-0015" ["fillcolor"="#A4C639"] - "16-0016" ["fillcolor"="#A4C639"] - "16-0017" ["fillcolor"="#A4C639"] - "16-0018" ["fillcolor"="#A4C639"] - "16-0019" ["fillcolor"="#A4C639"] - "16-0020" ["fillcolor"="#A4C639"] - "16-0021" ["fillcolor"="#A4C639"] - "16-0022" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "17-0000" ["fillcolor"="#A4C639"] - "17-0001" ["fillcolor"="#A4C639"] - "17-0002" ["fillcolor"="#A4C639"] - "17-0003" ["fillcolor"="#A4C639"] - "17-0004" ["fillcolor"="#A4C639"] - "17-0005" ["fillcolor"="#A4C639"] - "17-0006" ["fillcolor"="#A4C639"] - "17-0007" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "18-0000" ["fillcolor"="#A4C639"] - "18-0001" ["fillcolor"="#A4C639"] - "18-0002" ["fillcolor"="#A4C639"] - "18-0003" ["fillcolor"="#A4C639"] - "18-0004" ["fillcolor"="#A4C639"] - "18-0005" ["fillcolor"="#A4C639"] - "18-0006" ["fillcolor"="#A4C639"] - "18-0007" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "19-0000" ["fillcolor"="#A4C639"] - "19-0001" ["fillcolor"="#A4C639"] - "19-0002" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "20-0000" ["fillcolor"="#A4C639"] - "20-0001" ["fillcolor"="#A4C639"] - "20-0002" ["fillcolor"="#A4C639"] - "20-0003" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "21-0000" ["fillcolor"="#A4C639"] - "21-0001" ["fillcolor"="#A4C639"] - "21-0002" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "22-0000" ["fillcolor"="#A4C639"] - "22-0001" ["fillcolor"="#A4C639"] - "22-0002" ["fillcolor"="#A4C639"] - "22-0003" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "23-0000" ["fillcolor"="#A4C639"] - "23-0001" ["fillcolor"="#A4C639"] - "23-0002" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "24-0000" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "25-0000" ["fillcolor"="#A4C639"] - "25-0001" ["fillcolor"="#A4C639"] - "25-0002" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "26-0000" ["fillcolor"="#A4C639"] - } - { - edge ["dir"="none"] - graph ["rank"="same"] - "27-0000" ["fillcolor"="#A4C639"] - } - "10-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0000" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "07-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0034" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "01-0036" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0035" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0045" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0044" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0032" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0043" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0042" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0034" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "07-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0031" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "04-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0040" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "07-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "01-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "04-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0039" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0038" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0037" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0036" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "07-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0035" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0034" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "04-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0033" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0029" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0031" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0032" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "08-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "06-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "01-0029" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "07-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0028" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0027" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0031" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0030" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0029" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "08-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0028" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0025" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0023" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0028" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "08-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "07-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0025" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0022" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "08-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0023" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "05-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "07-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0022" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "07-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "04-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "01-0023" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "07-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "01-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "08-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "03-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "04-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "04-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "08-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "06-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "02-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "03-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "07-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "07-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0007" -> "01-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "02-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0007" -> "05-0025" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0000" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0000" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0000" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0000" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0000" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "03-0045" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "02-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0004" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "04-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "03-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "04-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "04-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "00-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0004" -> "00-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "00-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "00-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "11-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "04-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0004" -> "08-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0004" -> "05-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "07-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "16-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "06-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0004" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0007" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0007" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0007" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0007" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0007" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0007" -> "01-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0007" -> "00-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0007" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0007" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0007" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0007" -> "00-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0007" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "03-0045" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "03-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "00-0039" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "00-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "09-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "05-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "06-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "08-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "08-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "05-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0004" -> "07-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "01-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0004" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0003" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0003" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0003" -> "02-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0003" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0001" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0000" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0000" -> "02-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0006" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0016" -> "02-0034" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "01-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "05-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "01-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0016" -> "00-0056" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0000" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0000" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0000" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0000" -> "01-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0000" -> "01-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0002" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0001" -> "02-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0001" -> "03-0028" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0001" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0001" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0001" -> "02-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0001" -> "01-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "09-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "09-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "08-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "12-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "05-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "18-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0000" -> "18-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0003" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0003" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0003" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0003" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0003" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0003" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0003" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0003" -> "05-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0003" -> "08-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0004" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0004" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0004" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0004" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0002" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0002" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0002" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0002" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0002" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0002" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0002" -> "08-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0002" -> "11-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0004" -> "01-0035" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0004" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0004" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0004" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0004" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0004" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0004" -> "07-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0004" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "07-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "08-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "01-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "00-0050" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "07-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "13-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "13-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "14-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "07-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "10-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "00-0027" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "09-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "12-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "11-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0000" -> "06-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0000" -> "10-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0003" -> "05-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0003" -> "08-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0004" -> "05-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0004" -> "08-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0000" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "06-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "09-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "16-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "14-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "22-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0000" -> "00-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0000" -> "21-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0002" -> "05-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0002" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "02-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0002" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0002" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0002" -> "04-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0002" -> "10-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0002" -> "13-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "11-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "00-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0002" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0002" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0002" -> "08-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0002" -> "06-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0002" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0002" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0002" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0002" -> "02-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0002" -> "01-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0002" -> "05-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0002" -> "01-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0002" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0002" -> "06-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0011" -> "03-0029" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0011" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0011" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0013" -> "06-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0013" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0013" -> "00-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0013" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0013" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "06-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "00-0052" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "11-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "08-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "13-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "00-0043" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "10-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "03-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "08-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "00-0038" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "07-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "11-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "04-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "02-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "13-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "16-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "02-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "07-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "02-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "10-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "10-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "00-0029" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "10-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "00-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "18-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "18-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "20-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "19-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "05-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "11-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "16-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "05-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "07-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "06-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "12-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "16-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "08-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0002" -> "18-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0002" -> "10-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0014" -> "05-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0014" -> "00-0039" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0014" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0020" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0020" -> "03-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0020" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0020" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0020" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0001" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0001" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0008" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0000" -> "05-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0002" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0000" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0000" -> "02-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0000" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0013" -> "00-0057" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0013" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0013" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0013" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0013" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0013" -> "00-0051" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0013" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0013" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0013" -> "01-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0013" -> "00-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0013" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0005" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0005" -> "01-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "06-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "02-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "02-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0001" -> "00-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0001" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "00-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0001" -> "13-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0001" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0001" -> "14-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0001" -> "06-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0004" -> "01-0030" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0004" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0004" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0000" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0000" -> "06-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0000" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0000" -> "00-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0000" -> "05-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0000" -> "06-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0000" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0000" -> "01-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0000" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0002" -> "05-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0002" -> "03-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0002" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0002" -> "06-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0002" -> "05-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0001" -> "02-0033" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0001" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0001" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0001" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0003" -> "04-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0003" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0008" -> "03-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0008" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0008" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0008" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0008" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0008" -> "05-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0004" -> "02-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0004" -> "00-0059" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0004" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0001" -> "06-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0001" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0002" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0000" -> "03-0045" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0000" -> "01-0028" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0000" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0009" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0009" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0009" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0009" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0009" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0028" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0045" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0045" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0008" -> "00-0056" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0008" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0008" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0023" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0023" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0023" -> "00-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0023" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0000" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0000" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0000" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0000" -> "05-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0000" -> "06-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0017" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0017" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0033" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0033" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0018" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0018" -> "03-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0018" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0001" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0001" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0001" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0001" -> "06-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0001" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0002" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0002" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0002" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0002" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0013" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0013" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0013" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0013" -> "03-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0013" -> "00-0022" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0013" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0013" -> "00-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0016" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "02-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "04-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "00-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "06-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0000" -> "08-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0003" -> "03-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0006" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0006" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0006" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0006" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0015" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0015" -> "00-0051" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0001" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0001" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0001" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0010" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "00-0056" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0010" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "00-0048" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0010" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "03-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0010" -> "03-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0001" -> "10-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0001" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0001" -> "17-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0001" -> "00-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "01-0031" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0000" -> "01-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "16-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0000" -> "16-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0007" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0007" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0007" -> "00-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0007" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0007" -> "09-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0007" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0007" -> "00-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0001" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "16-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "22-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "16-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0001" -> "17-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0001" -> "09-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0001" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0001" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0001" -> "17-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "12-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "12-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "18-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0001" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0002" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0002" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0002" -> "01-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0002" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0002" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0002" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0002" -> "17-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0002" -> "16-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0001" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0001" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0001" -> "10-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0001" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0001" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0002" -> "08-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0002" -> "04-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0002" -> "02-0034" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0002" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0002" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0002" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0002" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0002" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0002" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0002" -> "10-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0006" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0006" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0006" -> "16-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0015" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0015" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0015" -> "00-0058" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0015" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0015" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0015" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0015" -> "01-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "19-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "20-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "04-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "17-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "00-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0002" -> "16-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0002" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0002" -> "10-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0019" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0019" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0002" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0002" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0002" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0002" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0002" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0002" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0002" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0010" -> "04-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0010" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "00-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "00-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "00-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0010" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0010" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0018" -> "04-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0018" -> "01-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0018" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0018" -> "03-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0018" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0018" -> "00-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0018" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0018" -> "00-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0018" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0012" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0012" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0012" -> "01-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0024" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0010" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0003" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0003" -> "07-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0003" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0017" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0017" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0017" -> "05-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0017" -> "03-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0017" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0017" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0017" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0017" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0027" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0027" -> "03-0041" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0027" -> "01-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0027" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0027" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0027" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0027" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0027" -> "01-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0000" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0000" -> "13-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0000" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0000" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0003" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0000" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0000" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0000" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0000" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0000" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "04-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "07-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "10-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "05-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "12-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0003" -> "14-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "03-0029" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "00-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0017" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0017" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0013" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0013" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0013" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0013" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0026" -> "00-0062" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0026" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0026" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0026" -> "06-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0022" -> "00-0062" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0022" -> "03-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0022" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0009" -> "03-0038" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0009" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0009" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "01-0035" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "00-0056" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0010" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0010" -> "08-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "05-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0010" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0010" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0010" -> "10-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "05-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "00-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "07-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0010" -> "05-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0022" -> "02-0034" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0022" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0022" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0022" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0022" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0022" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0022" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0022" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0018" -> "00-0056" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0013" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0013" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0013" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0013" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0002" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0034" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0034" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0019" -> "05-0028" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0019" -> "04-0022" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0019" -> "03-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0019" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0019" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0019" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0019" -> "02-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0019" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0019" -> "00-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0019" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0019" -> "04-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0019" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0000" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0000" -> "16-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0000" -> "19-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0031" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0007" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0007" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0007" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0007" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0035" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0005" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0005" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0005" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0005" -> "00-0040" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0003" -> "02-0034" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0003" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0003" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0003" -> "00-0040" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0000" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0000" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0000" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0000" -> "20-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0000" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0000" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0013" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0001" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0001" -> "05-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0001" -> "16-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0004" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0004" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0004" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0004" -> "05-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0008" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0008" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0008" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0008" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0008" -> "00-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0008" -> "04-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0003" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0003" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0003" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0003" -> "06-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0003" -> "01-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0004" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0004" -> "00-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0004" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0004" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0001" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0001" -> "13-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0000" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0000" -> "03-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0000" -> "01-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0000" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0000" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "02-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "02-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "04-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "07-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "08-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "01-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "19-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "05-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0001" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0001" -> "16-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0006" -> "11-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0006" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0006" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0006" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0006" -> "07-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0006" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0006" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0006" -> "06-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "19-0001" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "19-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0001" -> "00-0025" ["arrowhead"="normal","style"="bold","color"="#007744"] - "19-0001" -> "07-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "19-0001" -> "18-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "19-0001" -> "10-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0005" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0005" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0005" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0005" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0005" -> "10-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "00-0029" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "06-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0005" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0005" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0008" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0008" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0008" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0008" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0008" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0008" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0006" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0006" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0006" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0006" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0006" -> "03-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0009" -> "01-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0009" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0010" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "07-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "08-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "00-0055" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0006" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "00-0050" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0006" -> "00-0048" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0006" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "04-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0006" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "07-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "05-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0006" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0006" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0006" -> "06-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0006" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0003" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0003" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0002" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0002" -> "16-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0005" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0005" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0005" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0005" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0005" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0005" -> "01-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0005" -> "05-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0005" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0005" -> "02-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0002" -> "01-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0025" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0025" -> "04-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0025" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0023" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0004" -> "06-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0006" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0006" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0006" -> "02-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0006" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0006" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0006" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0006" -> "01-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0006" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0014" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0014" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0020" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0020" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "06-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "00-0052" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "00-0048" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "16-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "16-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "03-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "07-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "16-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "10-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0000" -> "09-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "05-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "24-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0000" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "06-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "00-0054" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "00-0052" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "16-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "03-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "02-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "11-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "00-0044" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "00-0039" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "23-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "18-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "16-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "02-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "04-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "10-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "06-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "16-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "05-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "00-0014" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "00-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "20-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "23-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "00-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "11-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "07-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "04-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "05-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "16-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "19-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "19-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "24-0000" -> "01-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "24-0000" -> "18-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0011" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0001" -> "08-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0001" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0013" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0005" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0005" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0005" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0017" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0017" -> "00-0048" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0017" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0017" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0013" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0013" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0001" -> "00-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0001" -> "01-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0028" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0028" -> "02-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0028" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0023" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0023" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0000" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0009" -> "00-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0005" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0005" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0005" -> "00-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0005" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0005" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0005" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0005" -> "07-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0006" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0011" -> "00-0059" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "01-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "03-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "00-0028" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0011" -> "02-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "03-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0011" -> "01-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0006" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0006" -> "02-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0006" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0007" -> "02-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0007" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0015" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0015" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0003" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0003" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0003" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0003" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0003" -> "16-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0003" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0008" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0008" -> "01-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0008" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0008" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0008" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0008" -> "05-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0012" -> "07-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "03-0045" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "03-0042" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "03-0034" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "04-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "01-0029" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0012" -> "03-0031" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "00-0056" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0012" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0012" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0012" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0012" -> "06-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0009" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0009" -> "05-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0012" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0012" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0012" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "06-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "16-0022" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "22-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "11-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "06-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "11-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "00-0047" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "08-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "15-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "07-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "22-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "16-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "09-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "23-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "07-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "04-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "26-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "16-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "04-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "08-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "10-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "00-0028" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "10-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "10-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "13-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "16-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "16-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "01-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "02-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "20-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "05-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "24-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "22-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "25-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "08-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "16-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "05-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "25-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "00-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "17-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "20-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "17-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "27-0000" -> "06-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "23-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "23-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "00-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "27-0000" -> "10-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0061" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "06-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "04-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0054" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "00-0052" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "03-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "16-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "15-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "07-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "12-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "11-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "11-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "18-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0034" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "02-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "16-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "10-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "02-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "17-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "10-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "01-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0030" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "10-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "16-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "05-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "00-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "24-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "00-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "00-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "08-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "01-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "21-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "23-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0001" -> "23-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "01-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0001" -> "18-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0007" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0007" -> "05-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0006" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0006" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0006" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0006" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0006" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0006" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "25-0002" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0002" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0002" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0002" -> "24-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0002" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0002" -> "21-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0002" -> "23-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "25-0002" -> "09-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0010" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0002" -> "19-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0009" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0009" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0001" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0001" -> "02-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0001" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0001" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "07-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "03-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "03-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "00-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0005" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0005" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0006" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0006" -> "01-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0006" -> "09-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0008" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0008" -> "04-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0008" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0008" -> "00-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0008" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0004" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0012" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0012" -> "03-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0012" -> "00-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0012" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0012" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0012" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0012" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0012" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "26-0000" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "17-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "22-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "02-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "26-0000" -> "06-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "08-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "00-0027" ["arrowhead"="normal","style"="bold","color"="#007744"] - "26-0000" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "09-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "05-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "00-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "26-0000" -> "25-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "26-0000" -> "07-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0008" -> "00-0058" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0008" -> "01-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0008" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0008" -> "00-0047" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0008" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0008" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0008" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0002" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "01-0023" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "22-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "11-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "00-0050" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "08-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "05-0023" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "00-0038" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "11-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "11-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0002" -> "22-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "05-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0002" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "00-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0002" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "19-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "06-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "23-0002" -> "11-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "23-0002" -> "19-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0005" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0005" -> "08-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0005" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0005" -> "04-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0005" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "09-0005" -> "03-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "09-0005" -> "06-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0016" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0016" -> "10-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0016" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0011" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0011" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0011" -> "06-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0011" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0011" -> "00-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0011" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "15-0002" -> "07-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0002" -> "00-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "15-0002" -> "14-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0010" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0010" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0010" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0010" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0010" -> "05-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0011" -> "00-0054" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0011" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0011" -> "09-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0012" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0012" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0012" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "07-0025" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "11-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "11-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "13-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "22-0003" -> "16-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0022" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0022" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0022" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0022" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0022" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0003" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0003" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0003" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0003" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0003" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0003" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0003" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0003" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0014" -> "03-0034" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0014" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0014" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0014" -> "02-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0014" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0014" -> "04-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0014" -> "03-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0014" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0014" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0010" -> "00-0061" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0010" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0010" -> "04-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0010" -> "00-0046" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0010" -> "07-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0010" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0010" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0010" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0010" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0010" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0010" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "00-0060" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "00-0050" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "00-0049" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "03-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "01-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "01-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "04-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "05-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "00-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "01-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "00-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "06-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "06-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0005" -> "16-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "05-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "17-0005" -> "05-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0009" -> "09-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0007" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0007" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0007" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0007" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0006" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0006" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0006" -> "16-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0006" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0006" -> "11-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0006" -> "01-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0006" -> "17-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0006" -> "06-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "05-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "00-0050" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "05-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "00-0035" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "06-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "07-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0006" -> "06-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0007" -> "10-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0007" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0006" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0006" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0006" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0006" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0012" -> "00-0061" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0012" -> "03-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0012" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0012" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0012" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0018" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0018" -> "00-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0018" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0018" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0010" -> "02-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0012" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0012" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0012" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0012" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0012" -> "03-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0012" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0012" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0012" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0038" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0038" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0001" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0001" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0001" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "21-0001" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "04-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "17-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "21-0001" -> "20-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0010" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0010" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0010" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0010" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0010" -> "03-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0010" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0010" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0011" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0021" -> "07-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "04-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "00-0030" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0021" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0021" -> "00-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0003" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0003" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0004" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "04-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "17-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "12-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0004" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0005" -> "00-0052" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0005" -> "06-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0004" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0004" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0004" -> "03-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "01-0029" ["arrowhead"="normal","style"="bold","color"="#007744"] - "12-0003" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "00-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "00-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "12-0003" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0029" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0012" -> "02-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0012" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0003" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "14-0003" -> "13-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0003" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "14-0003" -> "09-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "03-0041" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0002" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0002" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0002" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "10-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0002" -> "10-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "12-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0002" -> "09-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0002" -> "09-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0017" -> "00-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0016" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0016" -> "07-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0016" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0016" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0016" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0021" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0021" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0021" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0021" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0021" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0014" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0014" -> "01-0036" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0014" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0014" -> "02-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0014" -> "02-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0014" -> "01-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0014" -> "07-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0014" -> "01-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0002" -> "03-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0002" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0022" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0022" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0022" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0005" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0005" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0005" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0005" -> "00-0042" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0005" -> "17-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0005" -> "10-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0005" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0005" -> "05-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0006" -> "01-0037" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0006" -> "04-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0006" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "00-0031" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "00-0023" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0006" -> "01-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0006" -> "00-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0006" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0037" -> "00-0022" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0004" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0004" -> "04-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0004" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0004" -> "10-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0005" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0005" -> "01-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0005" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0005" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0005" -> "00-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0024" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0002" -> "02-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0022" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0022" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0034" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0034" -> "02-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0034" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0034" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0007" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0007" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0007" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0007" -> "00-0021" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0015" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0015" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0015" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0007" -> "00-0032" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0018" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0018" -> "03-0032" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0018" -> "05-0026" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0018" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0018" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0018" -> "07-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0018" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0011" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0011" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0011" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0019" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0019" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0024" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0024" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0024" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0020" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0020" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0020" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0003" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0003" -> "00-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0003" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0029" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0029" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0029" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0029" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0030" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0030" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0016" -> "02-0034" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0016" -> "03-0038" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0016" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0016" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0016" -> "00-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0016" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0016" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0016" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0007" -> "03-0029" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0007" -> "07-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0009" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0009" -> "05-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0030" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0012" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0012" -> "00-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0026" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0026" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0015" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0015" -> "01-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0015" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0015" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0001" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0001" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0001" -> "21-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "22-0001" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0007" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0007" -> "14-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0007" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "17-0007" -> "16-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0011" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "04-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "08-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "00-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0014" -> "06-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0014" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "05-0015" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0014" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0014" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0011" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0011" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0007" -> "02-0029" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0007" -> "00-0041" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0007" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0007" -> "03-0004" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0007" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0029" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0029" -> "01-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0019" -> "01-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0019" -> "04-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0019" -> "02-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0005" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0005" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0005" -> "00-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0020" -> "03-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "16-0020" -> "01-0018" ["arrowhead"="normal","style"="bold","color"="#007744"] - "16-0020" -> "15-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0020" -> "03-0035" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0020" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0020" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "10-0010" -> "09-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0017" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0017" -> "03-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0017" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0017" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0017" -> "01-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0041" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0041" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0041" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0008" -> "00-0055" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0008" -> "03-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0008" -> "03-0000" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0008" -> "04-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0008" -> "09-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0008" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0008" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0008" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0008" -> "10-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0008" -> "06-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0008" -> "07-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0009" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0009" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0009" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0009" -> "00-0045" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0009" -> "04-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0009" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0009" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0009" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0009" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0011" -> "05-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0011" -> "00-0040" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0011" -> "07-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0008" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0014" -> "00-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0012" -> "02-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0012" -> "07-0008" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0011" -> "09-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "10-0011" -> "05-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "20-0003" -> "19-0002" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "20-0003" -> "16-0003" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0002" -> "18-0007" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "19-0002" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0007" -> "04-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0007" -> "17-0005" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0007" -> "00-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0007" -> "15-0000" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0007" -> "16-0006" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "18-0007" -> "06-0003" ["arrowhead"="normal","style"="bold","color"="#007744"] - "18-0007" -> "10-0001" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0035" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0035" -> "02-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0035" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0035" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0009" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0009" -> "00-0036" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0019" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0019" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0019" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0021" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0021" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0009" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0009" -> "07-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0009" -> "07-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0015" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0015" -> "03-0044" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0015" -> "04-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0015" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0015" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0015" -> "01-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0015" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0015" -> "01-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0031" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0031" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0031" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0031" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0042" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0042" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0042" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0025" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0025" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0025" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0025" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0025" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0004" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "05-0023" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0004" -> "11-0010" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "01-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "07-0011" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "07-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "01-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "06-0008" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "12-0005" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "03-0002" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "13-0004" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "13-0004" -> "00-0013" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0014" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0014" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0014" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "11-0013" -> "07-0025" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0013" -> "09-0007" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0013" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0013" -> "10-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "11-0013" -> "03-0009" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0014" -> "00-0053" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0014" -> "04-0011" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0014" -> "05-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0014" -> "00-0033" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0014" -> "06-0010" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0021" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0021" -> "03-0044" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0021" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0019" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0022" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0019" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0019" -> "03-0034" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0019" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0044" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0044" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0016" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0016" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0016" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0016" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0016" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0016" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0012" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0012" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0012" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0016" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0016" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0015" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0015" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0015" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0015" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0015" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0026" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0026" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0026" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0026" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0032" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0013" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0013" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0013" -> "07-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0014" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0014" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0014" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0014" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0014" -> "03-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0015" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0015" -> "03-0042" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0015" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0015" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0015" -> "03-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0013" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0013" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0013" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0013" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0020" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0021" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "01-0025" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0016" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0016" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0016" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0016" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0017" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0017" -> "01-0025" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0017" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0017" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0018" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0018" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0018" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0018" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0018" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0027" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0027" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0027" -> "01-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0036" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0016" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "04-0016" -> "03-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "04-0016" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0027" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0027" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0027" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0027" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0020" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0020" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0020" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0021" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0021" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0021" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0018" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0018" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0018" -> "03-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0018" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0018" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0018" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0019" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0019" -> "03-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0019" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0019" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0019" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0019" -> "03-0018" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0019" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0026" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0021" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0021" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0023" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0023" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0023" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0023" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0015" -> "07-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "03-0013" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "04-0014" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0015" -> "07-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0024" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0024" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0024" -> "02-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0024" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0025" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0025" -> "02-0022" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0025" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0026" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0026" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0026" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0024" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0024" -> "01-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0027" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0025" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0025" -> "01-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0017" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "08-0017" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0017" -> "04-0017" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0017" -> "07-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0017" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "08-0017" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0028" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0028" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0017" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "06-0017" -> "05-0027" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0017" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "06-0017" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0032" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0032" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0032" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0030" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0030" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0033" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0033" -> "02-0020" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0022" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0022" -> "06-0016" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0036" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0036" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0036" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0037" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0037" -> "02-0021" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0037" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0039" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0039" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0033" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0023" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "07-0023" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0023" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "07-0023" -> "06-0015" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "03-0040" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0040" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0031" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0031" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "01-0034" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0043" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "03-0043" -> "02-0019" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "02-0032" -> "00-0063" ["arrowhead"="normal","style"="bold","color"="#007744"] - "02-0032" -> "01-0024" ["arrowhead"="normal","style"="bold","color"="#AA0000"] - "05-0028" -> "00-0062" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0028" -> "01-0016" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0028" -> "02-0012" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0028" -> "00-0037" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0028" -> "03-0006" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0028" -> "00-0020" ["arrowhead"="normal","style"="bold","color"="#007744"] - "05-0028" -> "04-0001" ["arrowhead"="normal","style"="bold","color"="#007744"] -} diff --git a/modulecheck-reporting/logging/api/api/api.api b/modulecheck-reporting/logging/api/api/api.api deleted file mode 100644 index 93b18c9ef6..0000000000 --- a/modulecheck-reporting/logging/api/api/api.api +++ /dev/null @@ -1,123 +0,0 @@ -public final class anvil/hint/Modulecheck_reporting_logging_TerminalModule_75a8fe3bKt { - public static final fun getModulecheck_reporting_logging_TerminalModule_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_reporting_logging_TerminalModule_scope0 ()Lkotlin/reflect/KClass; -} - -public abstract interface class modulecheck/reporting/logging/McLogger { - public abstract fun failure (Ljava/lang/String;)V - public abstract fun info (Ljava/lang/String;)V - public abstract fun printReport (Lmodulecheck/reporting/logging/Report;)V - public abstract fun success (Ljava/lang/String;)V - public abstract fun warning (Ljava/lang/String;)V -} - -public final class modulecheck/reporting/logging/PrintLogger : modulecheck/reporting/logging/McLogger { - public fun ()V - public fun failure (Ljava/lang/String;)V - public fun info (Ljava/lang/String;)V - public fun printReport (Lmodulecheck/reporting/logging/Report;)V - public fun success (Ljava/lang/String;)V - public fun warning (Ljava/lang/String;)V -} - -public final class modulecheck/reporting/logging/Report { - public static final field Companion Lmodulecheck/reporting/logging/Report$Companion; - public fun (Ljava/util/List;)V - public final fun component1 ()Ljava/util/List; - public final fun copy (Ljava/util/List;)Lmodulecheck/reporting/logging/Report; - public static synthetic fun copy$default (Lmodulecheck/reporting/logging/Report;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/logging/Report; - public fun equals (Ljava/lang/Object;)Z - public final fun getEntries ()Ljava/util/List; - public fun hashCode ()I - public final fun joinToString ()Ljava/lang/String; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/logging/Report$Companion { - public final fun build (Lkotlin/jvm/functions/Function1;)Lmodulecheck/reporting/logging/Report; -} - -public final class modulecheck/reporting/logging/Report$ReportBuilder { - public fun ()V - public fun (Ljava/util/List;)V - public synthetic fun (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun failure (Ljava/lang/String;)V - public final fun info (Ljava/lang/String;)V - public final fun success (Ljava/lang/String;)V - public final fun warning (Ljava/lang/String;)V -} - -public abstract interface class modulecheck/reporting/logging/Report$ReportEntry { - public abstract fun getMessage ()Ljava/lang/String; - public fun printToStdOut ()V -} - -public final class modulecheck/reporting/logging/Report$ReportEntry$Failure : modulecheck/reporting/logging/Report$ReportEntry { - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/reporting/logging/Report$ReportEntry$Failure; - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public fun getMessage ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/reporting/logging/Report$ReportEntry$Info : modulecheck/reporting/logging/Report$ReportEntry { - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/reporting/logging/Report$ReportEntry$Info; - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public fun getMessage ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/reporting/logging/Report$ReportEntry$Success : modulecheck/reporting/logging/Report$ReportEntry { - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/reporting/logging/Report$ReportEntry$Success; - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public fun getMessage ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/reporting/logging/Report$ReportEntry$Warning : modulecheck/reporting/logging/Report$ReportEntry { - public static final synthetic fun box-impl (Ljava/lang/String;)Lmodulecheck/reporting/logging/Report$ReportEntry$Warning; - public static fun constructor-impl (Ljava/lang/String;)Ljava/lang/String; - public fun equals (Ljava/lang/Object;)Z - public static fun equals-impl (Ljava/lang/String;Ljava/lang/Object;)Z - public static final fun equals-impl0 (Ljava/lang/String;Ljava/lang/String;)Z - public fun getMessage ()Ljava/lang/String; - public fun hashCode ()I - public static fun hashCode-impl (Ljava/lang/String;)I - public fun toString ()Ljava/lang/String; - public static fun toString-impl (Ljava/lang/String;)Ljava/lang/String; - public final synthetic fun unbox-impl ()Ljava/lang/String; -} - -public final class modulecheck/reporting/logging/TerminalModule { - public static final field INSTANCE Lmodulecheck/reporting/logging/TerminalModule; - public final fun provideTerminal ()Lcom/github/ajalt/mordant/terminal/Terminal; -} - -public final class modulecheck/reporting/logging/TerminalModule_ProvideTerminalFactory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/reporting/logging/TerminalModule_ProvideTerminalFactory; - public static final fun create ()Lmodulecheck/reporting/logging/TerminalModule_ProvideTerminalFactory; - public fun get ()Lcom/github/ajalt/mordant/terminal/Terminal; - public synthetic fun get ()Ljava/lang/Object; - public static final fun provideTerminal ()Lcom/github/ajalt/mordant/terminal/Terminal; -} - diff --git a/modulecheck-reporting/logging/api/build.gradle.kts b/modulecheck-reporting/logging/api/build.gradle.kts deleted file mode 100644 index c5fbf20876..0000000000 --- a/modulecheck-reporting/logging/api/build.gradle.kts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-reporting-logging-api" - ) - anvil() -} - -dependencies { - - api(libs.ajalt.mordant) - - compileOnly(libs.google.dagger.api) - - implementation(project(path = ":modulecheck-dagger")) -} diff --git a/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/McLogger.kt b/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/McLogger.kt deleted file mode 100644 index 0a66eb0122..0000000000 --- a/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/McLogger.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.logging - -import modulecheck.reporting.logging.Report.ReportEntry.Failure -import modulecheck.reporting.logging.Report.ReportEntry.Info -import modulecheck.reporting.logging.Report.ReportEntry.Success -import modulecheck.reporting.logging.Report.ReportEntry.Warning - -interface McLogger { - /** @since 0.11.0 */ - fun printReport(report: Report) - - /** @since 0.11.0 */ - fun warning(message: String) - - /** @since 0.11.0 */ - fun info(message: String) - - /** @since 0.11.0 */ - fun failure(message: String) - - /** @since 0.11.0 */ - fun success(message: String) -} - -data class Report(val entries: List) { - - fun joinToString(): String = buildString { - entries.forEach { reportEntry -> - when (reportEntry) { - is Failure -> appendLine(reportEntry.message) - is Info -> appendLine(reportEntry.message) - is Success -> appendLine(reportEntry.message) - is Warning -> appendLine(reportEntry.message) - } - } - } - - sealed interface ReportEntry { - val message: String - - /** @since 0.11.0 */ - @JvmInline - value class Warning(override val message: String) : ReportEntry - - /** @since 0.11.0 */ - @JvmInline - value class Info(override val message: String) : ReportEntry - - /** @since 0.11.0 */ - @JvmInline - value class Failure(override val message: String) : ReportEntry - - /** @since 0.11.0 */ - @JvmInline - value class Success(override val message: String) : ReportEntry - - fun printToStdOut() { - when (this) { - is Failure -> println(message) - is Info -> println(message) - is Success -> println(message) - is Warning -> println(message) - } - } - } - - class ReportBuilder( - private val entries: MutableList = mutableListOf() - ) { - - /** @since 0.11.0 */ - fun warning(message: String) { - entries.add(Warning(message)) - } - - /** @since 0.11.0 */ - fun info(message: String) { - entries.add(Info(message)) - } - - /** @since 0.11.0 */ - fun failure(message: String) { - entries.add(Failure(message)) - } - - /** @since 0.11.0 */ - fun success(message: String) { - entries.add(Success(message)) - } - } - - companion object { - - fun build(buildAction: ReportBuilder.() -> Unit): Report { - val entries = mutableListOf() - - ReportBuilder(entries).buildAction() - - return Report(entries) - } - } -} diff --git a/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/PrintLogger.kt b/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/PrintLogger.kt deleted file mode 100644 index b976de663d..0000000000 --- a/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/PrintLogger.kt +++ /dev/null @@ -1,25 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.logging - -class PrintLogger : McLogger { - - override fun failure(message: String) = println(message) - override fun info(message: String) = println(message) - override fun printReport(report: Report) = println(report.joinToString()) - override fun success(message: String) = println(message) - override fun warning(message: String) = println(message) -} diff --git a/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/TerminalModule.kt b/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/TerminalModule.kt deleted file mode 100644 index 1715108885..0000000000 --- a/modulecheck-reporting/logging/api/src/main/kotlin/modulecheck/reporting/logging/TerminalModule.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.logging - -import com.github.ajalt.mordant.rendering.AnsiLevel.TRUECOLOR -import com.github.ajalt.mordant.rendering.TextColors -import com.github.ajalt.mordant.rendering.TextStyle -import com.github.ajalt.mordant.rendering.Theme -import com.github.ajalt.mordant.terminal.Terminal -import com.squareup.anvil.annotations.ContributesTo -import dagger.Module -import dagger.Provides -import modulecheck.dagger.TaskScope - -@Module -@ContributesTo(TaskScope::class) -object TerminalModule { - @Provides - fun provideTerminal(): Terminal = Terminal( - ansiLevel = TRUECOLOR, - width = 2560, - theme = Theme(from = Theme.Default) { - styles.putAll( - mapOf( - "success" to TextColors.green, - "danger" to TextColors.red, - "warning" to TextColors.yellow, - "info" to TextColors.brightWhite, - "muted" to TextStyle(dim = true) - ) - ) - } - ) - .also { it.updateSize() } -} diff --git a/modulecheck-reporting/logging/testing/api/testing.api b/modulecheck-reporting/logging/testing/api/testing.api deleted file mode 100644 index 51cf1e581c..0000000000 --- a/modulecheck-reporting/logging/testing/api/testing.api +++ /dev/null @@ -1,13 +0,0 @@ -public final class modulecheck/reporting/logging/test/ReportingLogger : modulecheck/reporting/logging/McLogger { - public fun ()V - public fun (Z)V - public synthetic fun (ZILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun clear ()V - public final fun collectReport ()Lmodulecheck/reporting/logging/Report; - public fun failure (Ljava/lang/String;)V - public fun info (Ljava/lang/String;)V - public fun printReport (Lmodulecheck/reporting/logging/Report;)V - public fun success (Ljava/lang/String;)V - public fun warning (Ljava/lang/String;)V -} - diff --git a/modulecheck-reporting/logging/testing/build.gradle.kts b/modulecheck-reporting/logging/testing/build.gradle.kts deleted file mode 100644 index 5e9b3b9dc2..0000000000 --- a/modulecheck-reporting/logging/testing/build.gradle.kts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-reporting-logging-testing" - ) - anvil() -} - -dependencies { - api(project(path = ":modulecheck-reporting:logging:api")) -} diff --git a/modulecheck-reporting/logging/testing/src/main/kotlin/modulecheck/reporting/logging/test/ReportingLogger.kt b/modulecheck-reporting/logging/testing/src/main/kotlin/modulecheck/reporting/logging/test/ReportingLogger.kt deleted file mode 100644 index 09862f2785..0000000000 --- a/modulecheck-reporting/logging/testing/src/main/kotlin/modulecheck/reporting/logging/test/ReportingLogger.kt +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.logging.test - -import modulecheck.reporting.logging.McLogger -import modulecheck.reporting.logging.Report -import modulecheck.reporting.logging.Report.ReportEntry -import modulecheck.reporting.logging.Report.ReportEntry.Failure -import modulecheck.reporting.logging.Report.ReportEntry.Info -import modulecheck.reporting.logging.Report.ReportEntry.Success -import modulecheck.reporting.logging.Report.ReportEntry.Warning - -class ReportingLogger( - private val mirrorToStandardOut: Boolean = true -) : McLogger { - - private val entries = mutableListOf() - - fun collectReport(): Report = Report(entries) - - fun clear() { - entries.clear() - } - - private fun addEntry(reportEntry: ReportEntry) { - entries.add(reportEntry) - if (mirrorToStandardOut) { - reportEntry.printToStdOut() - println() - } - } - - override fun printReport(report: Report) { - entries.addAll(report.entries) - if (mirrorToStandardOut) { - report.entries - .forEach { it.printToStdOut() } - println() - } - } - - override fun failure(message: String) = addEntry(Failure(message)) - override fun info(message: String) = addEntry(Info(message)) - override fun success(message: String) = addEntry(Success(message)) - override fun warning(message: String) = addEntry(Warning(message)) -} diff --git a/modulecheck-reporting/sarif/api/sarif.api b/modulecheck-reporting/sarif/api/sarif.api deleted file mode 100644 index d176af89d9..0000000000 --- a/modulecheck-reporting/sarif/api/sarif.api +++ /dev/null @@ -1,2009 +0,0 @@ -public final class modulecheck/reporting/sarif/Address { - public fun ()V - public fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;)V - public synthetic fun (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/Integer; - public final fun component10 ()Ljava/lang/Integer; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/Integer; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/Integer; - public final fun component6 ()Ljava/lang/String; - public final fun component7 ()Ljava/lang/Integer; - public final fun component8 ()Ljava/lang/Integer; - public final fun component9 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;)Lmodulecheck/reporting/sarif/Address; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Address;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Address; - public fun equals (Ljava/lang/Object;)Z - public final fun getAbsoluteAddress ()Ljava/lang/Integer; - public final fun getFullyQualifiedName ()Ljava/lang/String; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getKind ()Ljava/lang/String; - public final fun getLength ()Ljava/lang/Integer; - public final fun getName ()Ljava/lang/String; - public final fun getOffsetFromParent ()Ljava/lang/Integer; - public final fun getParentIndex ()Ljava/lang/Integer; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRelativeAddress ()Ljava/lang/Integer; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/AddressJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Address; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Address;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Artifact { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun component10 ()Ljava/lang/Integer; - public final fun component11 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component12 ()Ljava/util/List; - public final fun component13 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/reporting/sarif/Message; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/util/Map; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Ljava/lang/Integer; - public final fun component7 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component8 ()Ljava/lang/String; - public final fun component9 ()Ljava/lang/Integer; - public final fun copy (Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;)Lmodulecheck/reporting/sarif/Artifact; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Artifact;Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Artifact; - public fun equals (Ljava/lang/Object;)Z - public final fun getContents ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getEncoding ()Ljava/lang/String; - public final fun getHashes ()Ljava/util/Map; - public final fun getLastModifiedTimeUTC ()Ljava/lang/String; - public final fun getLength ()Ljava/lang/Integer; - public final fun getLocation ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getMimeType ()Ljava/lang/String; - public final fun getOffset ()Ljava/lang/Integer; - public final fun getParentIndex ()Ljava/lang/Integer; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRoles ()Ljava/util/List; - public final fun getSourceLanguage ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ArtifactChange { - public fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component2 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component3 ()Ljava/util/List; - public final fun copy (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)Lmodulecheck/reporting/sarif/ArtifactChange; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ArtifactChange;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ArtifactChange; - public fun equals (Ljava/lang/Object;)Z - public final fun getArtifactLocation ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getReplacements ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ArtifactChangeJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ArtifactChange; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ArtifactChange;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ArtifactContent { - public fun ()V - public fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component3 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun component4 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;)Lmodulecheck/reporting/sarif/ArtifactContent; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ArtifactContent; - public fun equals (Ljava/lang/Object;)Z - public final fun getBinary ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRendered ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun getText ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ArtifactContentJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ArtifactContent; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ArtifactContent;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ArtifactJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Artifact; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Artifact;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ArtifactLocation { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Message; - public final fun component2 ()Ljava/lang/Integer; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun copy (Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/reporting/sarif/ArtifactLocation; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ArtifactLocation; - public fun equals (Ljava/lang/Object;)Z - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getUri ()Ljava/lang/String; - public final fun getUriBaseID ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ArtifactLocationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ArtifactLocation; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ArtifactLocation;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Attachment { - public fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component2 ()Lmodulecheck/reporting/sarif/Message; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component4 ()Ljava/util/List; - public final fun component5 ()Ljava/util/List; - public final fun copy (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;)Lmodulecheck/reporting/sarif/Attachment; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Attachment;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Attachment; - public fun equals (Ljava/lang/Object;)Z - public final fun getArtifactLocation ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRectangles ()Ljava/util/List; - public final fun getRegions ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/AttachmentJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Attachment; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Attachment;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/BaselineState : java/lang/Enum { - public static final field Absent Lmodulecheck/reporting/sarif/BaselineState; - public static final field New Lmodulecheck/reporting/sarif/BaselineState; - public static final field Unchanged Lmodulecheck/reporting/sarif/BaselineState; - public static final field Updated Lmodulecheck/reporting/sarif/BaselineState; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getValue ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/BaselineState; - public static fun values ()[Lmodulecheck/reporting/sarif/BaselineState; -} - -public final class modulecheck/reporting/sarif/CodeFlow { - public fun (Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Message; - public final fun component2 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component3 ()Ljava/util/List; - public final fun copy (Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)Lmodulecheck/reporting/sarif/CodeFlow; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/CodeFlow;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/CodeFlow; - public fun equals (Ljava/lang/Object;)Z - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getThreadFlows ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/CodeFlowJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/CodeFlow; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/CodeFlow;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ColumnKind : java/lang/Enum { - public static final field UnicodeCodePoints Lmodulecheck/reporting/sarif/ColumnKind; - public static final field Utf16CodeUnits Lmodulecheck/reporting/sarif/ColumnKind; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getValue ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/ColumnKind; - public static fun values ()[Lmodulecheck/reporting/sarif/ColumnKind; -} - -public final class modulecheck/reporting/sarif/ConfigurationOverride { - public fun (Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ReportingConfiguration; - public final fun component2 ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/ConfigurationOverride; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ConfigurationOverride;Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ConfigurationOverride; - public fun equals (Ljava/lang/Object;)Z - public final fun getConfiguration ()Lmodulecheck/reporting/sarif/ReportingConfiguration; - public final fun getDescriptor ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ConfigurationOverrideJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ConfigurationOverride; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ConfigurationOverride;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Content : java/lang/Enum { - public static final field LocalizedData Lmodulecheck/reporting/sarif/Content; - public static final field NonLocalizedData Lmodulecheck/reporting/sarif/Content; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getValue ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/Content; - public static fun values ()[Lmodulecheck/reporting/sarif/Content; -} - -public final class modulecheck/reporting/sarif/Conversion { - public fun (Ljava/util/List;Lmodulecheck/reporting/sarif/Invocation;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Tool;)V - public synthetic fun (Ljava/util/List;Lmodulecheck/reporting/sarif/Invocation;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Tool;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Lmodulecheck/reporting/sarif/Invocation; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component4 ()Lmodulecheck/reporting/sarif/Tool; - public final fun copy (Ljava/util/List;Lmodulecheck/reporting/sarif/Invocation;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Tool;)Lmodulecheck/reporting/sarif/Conversion; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Conversion;Ljava/util/List;Lmodulecheck/reporting/sarif/Invocation;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Tool;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Conversion; - public fun equals (Ljava/lang/Object;)Z - public final fun getAnalysisToolLogFiles ()Ljava/util/List; - public final fun getInvocation ()Lmodulecheck/reporting/sarif/Invocation; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getTool ()Lmodulecheck/reporting/sarif/Tool; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ConversionJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Conversion; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Conversion;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Edge { - public fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/reporting/sarif/Message; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/reporting/sarif/Edge; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Edge;Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Edge; - public fun equals (Ljava/lang/Object;)Z - public final fun getId ()Ljava/lang/String; - public final fun getLabel ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getSourceNodeID ()Ljava/lang/String; - public final fun getTargetNodeID ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/EdgeJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Edge; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Edge;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/EdgeTraversal { - public fun (Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;)V - public synthetic fun (Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/util/Map; - public final fun component3 ()Lmodulecheck/reporting/sarif/Message; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Ljava/lang/Integer; - public final fun copy (Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;)Lmodulecheck/reporting/sarif/EdgeTraversal; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/EdgeTraversal;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/EdgeTraversal; - public fun equals (Ljava/lang/Object;)Z - public final fun getEdgeID ()Ljava/lang/String; - public final fun getFinalState ()Ljava/util/Map; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getStepOverEdgeCount ()Ljava/lang/Integer; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/EdgeTraversalJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/EdgeTraversal; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/EdgeTraversal;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Exception { - public fun ()V - public fun (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;)V - public synthetic fun (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Lmodulecheck/reporting/sarif/Stack; - public final fun copy (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;)Lmodulecheck/reporting/sarif/Exception; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Exception;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Exception; - public fun equals (Ljava/lang/Object;)Z - public final fun getInnerExceptions ()Ljava/util/List; - public final fun getKind ()Ljava/lang/String; - public final fun getMessage ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getStack ()Lmodulecheck/reporting/sarif/Stack; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ExceptionJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Exception; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Exception;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ExternalProperties { - public fun ()V - public fun (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Conversion;Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Ljava/util/List;)V - public synthetic fun (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Conversion;Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component10 ()Ljava/util/List; - public final fun component11 ()Ljava/util/List; - public final fun component12 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component13 ()Ljava/util/List; - public final fun component14 ()Ljava/lang/String; - public final fun component15 ()Ljava/lang/String; - public final fun component16 ()Ljava/util/List; - public final fun component17 ()Ljava/util/List; - public final fun component18 ()Ljava/util/List; - public final fun component19 ()Lmodulecheck/reporting/sarif/Version; - public final fun component2 ()Ljava/util/List; - public final fun component20 ()Ljava/util/List; - public final fun component21 ()Ljava/util/List; - public final fun component3 ()Lmodulecheck/reporting/sarif/Conversion; - public final fun component4 ()Lmodulecheck/reporting/sarif/SarifDriver; - public final fun component5 ()Ljava/util/List; - public final fun component6 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component7 ()Ljava/util/List; - public final fun component8 ()Ljava/lang/String; - public final fun component9 ()Ljava/util/List; - public final fun copy (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Conversion;Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Ljava/util/List;)Lmodulecheck/reporting/sarif/ExternalProperties; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ExternalProperties;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Conversion;Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ExternalProperties; - public fun equals (Ljava/lang/Object;)Z - public final fun getAddresses ()Ljava/util/List; - public final fun getArtifacts ()Ljava/util/List; - public final fun getConversion ()Lmodulecheck/reporting/sarif/Conversion; - public final fun getDriver ()Lmodulecheck/reporting/sarif/SarifDriver; - public final fun getExtensions ()Ljava/util/List; - public final fun getExternalizedProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getGraphs ()Ljava/util/List; - public final fun getGuid ()Ljava/lang/String; - public final fun getInvocations ()Ljava/util/List; - public final fun getLogicalLocations ()Ljava/util/List; - public final fun getPolicies ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getResults ()Ljava/util/List; - public final fun getRunGUID ()Ljava/lang/String; - public final fun getSchema ()Ljava/lang/String; - public final fun getTaxonomies ()Ljava/util/List; - public final fun getThreadFlowLocations ()Ljava/util/List; - public final fun getTranslations ()Ljava/util/List; - public final fun getVersion ()Lmodulecheck/reporting/sarif/Version; - public final fun getWebRequests ()Ljava/util/List; - public final fun getWebResponses ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ExternalPropertiesJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ExternalProperties; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ExternalProperties;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ExternalPropertyFileReference { - public fun ()V - public fun (Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/Integer; - public final fun component3 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public fun equals (Ljava/lang/Object;)Z - public final fun getGuid ()Ljava/lang/String; - public final fun getItemCount ()Ljava/lang/Integer; - public final fun getLocation ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ExternalPropertyFileReferenceJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ExternalPropertyFileReferences { - public fun ()V - public fun (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V - public synthetic fun (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component10 ()Ljava/util/List; - public final fun component11 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component12 ()Ljava/util/List; - public final fun component13 ()Ljava/util/List; - public final fun component14 ()Ljava/util/List; - public final fun component15 ()Ljava/util/List; - public final fun component16 ()Ljava/util/List; - public final fun component17 ()Ljava/util/List; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public final fun component4 ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public final fun component5 ()Ljava/util/List; - public final fun component6 ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public final fun component7 ()Ljava/util/List; - public final fun component8 ()Ljava/util/List; - public final fun component9 ()Ljava/util/List; - public final fun copy (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Lmodulecheck/reporting/sarif/ExternalPropertyFileReference;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences; - public fun equals (Ljava/lang/Object;)Z - public final fun getAddresses ()Ljava/util/List; - public final fun getArtifacts ()Ljava/util/List; - public final fun getConversion ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public final fun getDriver ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public final fun getExtensions ()Ljava/util/List; - public final fun getExternalizedProperties ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReference; - public final fun getGraphs ()Ljava/util/List; - public final fun getInvocations ()Ljava/util/List; - public final fun getLogicalLocations ()Ljava/util/List; - public final fun getPolicies ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getResults ()Ljava/util/List; - public final fun getTaxonomies ()Ljava/util/List; - public final fun getThreadFlowLocations ()Ljava/util/List; - public final fun getTranslations ()Ljava/util/List; - public final fun getWebRequests ()Ljava/util/List; - public final fun getWebResponses ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ExternalPropertyFileReferencesJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Fix { - public fun (Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Lmodulecheck/reporting/sarif/Message; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/Fix; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Fix;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Fix; - public fun equals (Ljava/lang/Object;)Z - public final fun getArtifactChanges ()Ljava/util/List; - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/FixJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Fix; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Fix;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Graph { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Message; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/Graph; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Graph;Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Graph; - public fun equals (Ljava/lang/Object;)Z - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getEdges ()Ljava/util/List; - public final fun getNodes ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/GraphJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Graph; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Graph;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/GraphTraversal { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/Map;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/Integer;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/Map;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Message; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Ljava/util/Map; - public final fun component4 ()Ljava/util/Map; - public final fun component5 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component6 ()Ljava/lang/Integer; - public final fun component7 ()Ljava/lang/Integer; - public final fun copy (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/Map;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/Integer;)Lmodulecheck/reporting/sarif/GraphTraversal; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/GraphTraversal;Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/util/Map;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/Integer;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/GraphTraversal; - public fun equals (Ljava/lang/Object;)Z - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getEdgeTraversals ()Ljava/util/List; - public final fun getImmutableState ()Ljava/util/Map; - public final fun getInitialState ()Ljava/util/Map; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getResultGraphIndex ()Ljava/lang/Integer; - public final fun getRunGraphIndex ()Ljava/lang/Integer; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/GraphTraversalJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/GraphTraversal; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/GraphTraversal;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Importance : java/lang/Enum { - public static final field Essential Lmodulecheck/reporting/sarif/Importance; - public static final field Important Lmodulecheck/reporting/sarif/Importance; - public static final field Unimportant Lmodulecheck/reporting/sarif/Importance; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getValue ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/Importance; - public static fun values ()[Lmodulecheck/reporting/sarif/Importance; -} - -public final class modulecheck/reporting/sarif/Invocation { - public fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/ArtifactLocation;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ArtifactLocation;)V - public synthetic fun (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/ArtifactLocation;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ArtifactLocation;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component10 ()Ljava/lang/String; - public final fun component11 ()Ljava/lang/Integer; - public final fun component12 ()Ljava/lang/String; - public final fun component13 ()Ljava/util/List; - public final fun component14 ()Ljava/lang/Integer; - public final fun component15 ()Ljava/lang/String; - public final fun component16 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component17 ()Ljava/util/List; - public final fun component18 ()Ljava/util/List; - public final fun component19 ()Ljava/lang/String; - public final fun component2 ()Ljava/util/List; - public final fun component20 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component21 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component22 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component23 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component24 ()Ljava/util/List; - public final fun component25 ()Ljava/util/List; - public final fun component26 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/util/Map; - public final fun component6 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component7 ()Z - public final fun component8 ()Ljava/lang/Integer; - public final fun component9 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/ArtifactLocation;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ArtifactLocation;)Lmodulecheck/reporting/sarif/Invocation; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Invocation;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/ArtifactLocation;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/List;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/ArtifactLocation;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Invocation; - public fun equals (Ljava/lang/Object;)Z - public final fun getAccount ()Ljava/lang/String; - public final fun getArguments ()Ljava/util/List; - public final fun getCommandLine ()Ljava/lang/String; - public final fun getEndTimeUTC ()Ljava/lang/String; - public final fun getEnvironmentVariables ()Ljava/util/Map; - public final fun getExecutableLocation ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getExecutionSuccessful ()Z - public final fun getExitCode ()Ljava/lang/Integer; - public final fun getExitCodeDescription ()Ljava/lang/String; - public final fun getExitSignalName ()Ljava/lang/String; - public final fun getExitSignalNumber ()Ljava/lang/Integer; - public final fun getMachine ()Ljava/lang/String; - public final fun getNotificationConfigurationOverrides ()Ljava/util/List; - public final fun getProcessID ()Ljava/lang/Integer; - public final fun getProcessStartFailureMessage ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getResponseFiles ()Ljava/util/List; - public final fun getRuleConfigurationOverrides ()Ljava/util/List; - public final fun getStartTimeUTC ()Ljava/lang/String; - public final fun getStderr ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getStdin ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getStdout ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getStdoutStderr ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getToolConfigurationNotifications ()Ljava/util/List; - public final fun getToolExecutionNotifications ()Ljava/util/List; - public final fun getWorkingDirectory ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/InvocationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Invocation; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Invocation;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Level : java/lang/Enum { - public static final field Error Lmodulecheck/reporting/sarif/Level; - public static final field None Lmodulecheck/reporting/sarif/Level; - public static final field Note Lmodulecheck/reporting/sarif/Level; - public static final field Warning Lmodulecheck/reporting/sarif/Level; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getValue ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/Level; - public static fun values ()[Lmodulecheck/reporting/sarif/Level; -} - -public final class modulecheck/reporting/sarif/Location { - public fun ()V - public fun (Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PhysicalLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)V - public synthetic fun (Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PhysicalLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/lang/Integer; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Lmodulecheck/reporting/sarif/Message; - public final fun component5 ()Lmodulecheck/reporting/sarif/PhysicalLocation; - public final fun component6 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component7 ()Ljava/util/List; - public final fun copy (Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PhysicalLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)Lmodulecheck/reporting/sarif/Location; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Location;Ljava/util/List;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PhysicalLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Location; - public fun equals (Ljava/lang/Object;)Z - public final fun getAnnotations ()Ljava/util/List; - public final fun getId ()Ljava/lang/Integer; - public final fun getLogicalLocations ()Ljava/util/List; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getPhysicalLocation ()Lmodulecheck/reporting/sarif/PhysicalLocation; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRelationships ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/LocationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Location; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Location;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/LocationRelationship { - public fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;I)V - public synthetic fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;IILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Message; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component4 ()I - public final fun copy (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;I)Lmodulecheck/reporting/sarif/LocationRelationship; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/LocationRelationship;Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;IILjava/lang/Object;)Lmodulecheck/reporting/sarif/LocationRelationship; - public fun equals (Ljava/lang/Object;)Z - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getKinds ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getTarget ()I - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/LocationRelationshipJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/LocationRelationship; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/LocationRelationship;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/LogicalLocation { - public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/Integer; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Ljava/lang/Integer; - public final fun component7 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/LogicalLocation; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/LogicalLocation;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/LogicalLocation; - public fun equals (Ljava/lang/Object;)Z - public final fun getDecoratedName ()Ljava/lang/String; - public final fun getFullyQualifiedName ()Ljava/lang/String; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getKind ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public final fun getParentIndex ()Ljava/lang/Integer; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/LogicalLocationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/LogicalLocation; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/LogicalLocation;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Message { - public fun ()V - public fun (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;)V - public synthetic fun (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Ljava/lang/String; - public final fun copy (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;)Lmodulecheck/reporting/sarif/Message; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Message; - public fun equals (Ljava/lang/Object;)Z - public final fun getArguments ()Ljava/util/List; - public final fun getId ()Ljava/lang/String; - public final fun getMarkdown ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getText ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/MessageJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Message; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Message;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/MultiformatMessageString { - public fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component3 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;)Lmodulecheck/reporting/sarif/MultiformatMessageString; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/MultiformatMessageString; - public fun equals (Ljava/lang/Object;)Z - public final fun getMarkdown ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getText ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/MultiformatMessageStringJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/MultiformatMessageString; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/MultiformatMessageString;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Node { - public fun (Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Lmodulecheck/reporting/sarif/Message; - public final fun component4 ()Lmodulecheck/reporting/sarif/Location; - public final fun component5 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/Node; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Node;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Node; - public fun equals (Ljava/lang/Object;)Z - public final fun getChildren ()Ljava/util/List; - public final fun getId ()Ljava/lang/String; - public final fun getLabel ()Lmodulecheck/reporting/sarif/Message; - public final fun getLocation ()Lmodulecheck/reporting/sarif/Location; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/NodeJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Node; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Node;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Notification { - public fun (Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/Exception;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/String;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/Exception;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun component2 ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun component3 ()Lmodulecheck/reporting/sarif/Exception; - public final fun component4 ()Lmodulecheck/reporting/sarif/Level; - public final fun component5 ()Ljava/util/List; - public final fun component6 ()Lmodulecheck/reporting/sarif/Message; - public final fun component7 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component8 ()Ljava/lang/Integer; - public final fun component9 ()Ljava/lang/String; - public final fun copy (Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/Exception;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/String;)Lmodulecheck/reporting/sarif/Notification; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Notification;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Lmodulecheck/reporting/sarif/Exception;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Notification; - public fun equals (Ljava/lang/Object;)Z - public final fun getAssociatedRule ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun getDescriptor ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun getException ()Lmodulecheck/reporting/sarif/Exception; - public final fun getLevel ()Lmodulecheck/reporting/sarif/Level; - public final fun getLocations ()Ljava/util/List; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getThreadID ()Ljava/lang/Integer; - public final fun getTimeUTC ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/NotificationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Notification; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Notification;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/PhysicalLocation { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/Address;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Region;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Address;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Region;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Address; - public final fun component2 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component3 ()Lmodulecheck/reporting/sarif/Region; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Lmodulecheck/reporting/sarif/Region; - public final fun copy (Lmodulecheck/reporting/sarif/Address;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Region;)Lmodulecheck/reporting/sarif/PhysicalLocation; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/PhysicalLocation;Lmodulecheck/reporting/sarif/Address;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Region;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/PhysicalLocation; - public fun equals (Ljava/lang/Object;)Z - public final fun getAddress ()Lmodulecheck/reporting/sarif/Address; - public final fun getArtifactLocation ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getContextRegion ()Lmodulecheck/reporting/sarif/Region; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRegion ()Lmodulecheck/reporting/sarif/Region; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/PhysicalLocationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/PhysicalLocation; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/PhysicalLocation;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/PropertyBag { - public fun ()V - public fun (Ljava/util/List;)V - public synthetic fun (Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun copy (Ljava/util/List;)Lmodulecheck/reporting/sarif/PropertyBag; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/PropertyBag; - public fun equals (Ljava/lang/Object;)Z - public final fun getTags ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/PropertyBagJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/PropertyBag; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/PropertyBag;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Rectangle { - public fun ()V - public fun (Ljava/lang/Double;Ljava/lang/Double;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;Ljava/lang/Double;)V - public synthetic fun (Ljava/lang/Double;Ljava/lang/Double;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;Ljava/lang/Double;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/Double; - public final fun component2 ()Ljava/lang/Double; - public final fun component3 ()Lmodulecheck/reporting/sarif/Message; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Ljava/lang/Double; - public final fun component6 ()Ljava/lang/Double; - public final fun copy (Ljava/lang/Double;Ljava/lang/Double;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;Ljava/lang/Double;)Lmodulecheck/reporting/sarif/Rectangle; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Rectangle;Ljava/lang/Double;Ljava/lang/Double;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;Ljava/lang/Double;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Rectangle; - public fun equals (Ljava/lang/Object;)Z - public final fun getBottom ()Ljava/lang/Double; - public final fun getLeft ()Ljava/lang/Double; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRight ()Ljava/lang/Double; - public final fun getTop ()Ljava/lang/Double; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/RectangleJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Rectangle; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Rectangle;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Region { - public fun ()V - public fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;)V - public synthetic fun (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/Integer; - public final fun component10 ()Ljava/lang/String; - public final fun component11 ()Ljava/lang/Integer; - public final fun component12 ()Ljava/lang/Integer; - public final fun component2 ()Ljava/lang/Integer; - public final fun component3 ()Ljava/lang/Integer; - public final fun component4 ()Ljava/lang/Integer; - public final fun component5 ()Ljava/lang/Integer; - public final fun component6 ()Ljava/lang/Integer; - public final fun component7 ()Lmodulecheck/reporting/sarif/Message; - public final fun component8 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component9 ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun copy (Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;)Lmodulecheck/reporting/sarif/Region; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Region;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/Integer;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Region; - public fun equals (Ljava/lang/Object;)Z - public final fun getByteLength ()Ljava/lang/Integer; - public final fun getByteOffset ()Ljava/lang/Integer; - public final fun getCharLength ()Ljava/lang/Integer; - public final fun getCharOffset ()Ljava/lang/Integer; - public final fun getEndColumn ()Ljava/lang/Integer; - public final fun getEndLine ()Ljava/lang/Integer; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getSnippet ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun getSourceLanguage ()Ljava/lang/String; - public final fun getStartColumn ()Ljava/lang/Integer; - public final fun getStartLine ()Ljava/lang/Integer; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/RegionJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Region; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Region;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Replacement { - public fun (Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Region; - public final fun component2 ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/Replacement; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Replacement;Lmodulecheck/reporting/sarif/Region;Lmodulecheck/reporting/sarif/ArtifactContent;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Replacement; - public fun equals (Ljava/lang/Object;)Z - public final fun getDeletedRegion ()Lmodulecheck/reporting/sarif/Region; - public final fun getInsertedContent ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ReplacementJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Replacement; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Replacement;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ReportingConfiguration { - public fun ()V - public fun (Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/Level;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;)V - public synthetic fun (Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/Level;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/Boolean; - public final fun component2 ()Lmodulecheck/reporting/sarif/Level; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Ljava/lang/Double; - public final fun copy (Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/Level;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;)Lmodulecheck/reporting/sarif/ReportingConfiguration; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ReportingConfiguration;Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/Level;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Double;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ReportingConfiguration; - public fun equals (Ljava/lang/Object;)Z - public final fun getEnabled ()Ljava/lang/Boolean; - public final fun getLevel ()Lmodulecheck/reporting/sarif/Level; - public final fun getParameters ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRank ()Ljava/lang/Double; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ReportingConfigurationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ReportingConfiguration; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ReportingConfiguration;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ReportingDescriptorReference { - public fun ()V - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ToolComponentReference;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ToolComponentReference;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/Integer; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Lmodulecheck/reporting/sarif/ToolComponentReference; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ToolComponentReference;)Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ToolComponentReference;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public fun equals (Ljava/lang/Object;)Z - public final fun getGuid ()Ljava/lang/String; - public final fun getId ()Ljava/lang/String; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getToolComponent ()Lmodulecheck/reporting/sarif/ToolComponentReference; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ReportingDescriptorReferenceJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ReportingDescriptorRelationship { - public fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Message; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component4 ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun copy (Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;)Lmodulecheck/reporting/sarif/ReportingDescriptorRelationship; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ReportingDescriptorRelationship;Lmodulecheck/reporting/sarif/Message;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ReportingDescriptorRelationship; - public fun equals (Ljava/lang/Object;)Z - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getKinds ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getTarget ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ReportingDescriptorRelationshipJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ReportingDescriptorRelationship; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ReportingDescriptorRelationship;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ResultKind : java/lang/Enum { - public static final field Fail Lmodulecheck/reporting/sarif/ResultKind; - public static final field Informational Lmodulecheck/reporting/sarif/ResultKind; - public static final field NotApplicable Lmodulecheck/reporting/sarif/ResultKind; - public static final field Open Lmodulecheck/reporting/sarif/ResultKind; - public static final field Pass Lmodulecheck/reporting/sarif/ResultKind; - public static final field Review Lmodulecheck/reporting/sarif/ResultKind; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public final fun getValue ()Ljava/lang/String; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/ResultKind; - public static fun values ()[Lmodulecheck/reporting/sarif/ResultKind; -} - -public final class modulecheck/reporting/sarif/ResultProvenance { - public fun ()V - public fun (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/Integer; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Ljava/lang/String; - public final fun component7 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/ResultProvenance; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ResultProvenance;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ResultProvenance; - public fun equals (Ljava/lang/Object;)Z - public final fun getConversionSources ()Ljava/util/List; - public final fun getFirstDetectionRunGUID ()Ljava/lang/String; - public final fun getFirstDetectionTimeUTC ()Ljava/lang/String; - public final fun getInvocationIndex ()Ljava/lang/Integer; - public final fun getLastDetectionRunGUID ()Ljava/lang/String; - public final fun getLastDetectionTimeUTC ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ResultProvenanceJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ResultProvenance; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ResultProvenance;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Role : java/lang/Enum { - public static final field Added Lmodulecheck/reporting/sarif/Role; - public static final field AnalysisTarget Lmodulecheck/reporting/sarif/Role; - public static final field Attachment Lmodulecheck/reporting/sarif/Role; - public static final field DebugOutputFile Lmodulecheck/reporting/sarif/Role; - public static final field Deleted Lmodulecheck/reporting/sarif/Role; - public static final field Directory Lmodulecheck/reporting/sarif/Role; - public static final field Driver Lmodulecheck/reporting/sarif/Role; - public static final field Extension Lmodulecheck/reporting/sarif/Role; - public static final field MemoryContents Lmodulecheck/reporting/sarif/Role; - public static final field Modified Lmodulecheck/reporting/sarif/Role; - public static final field Policy Lmodulecheck/reporting/sarif/Role; - public static final field ReferencedOnCommandLine Lmodulecheck/reporting/sarif/Role; - public static final field Renamed Lmodulecheck/reporting/sarif/Role; - public static final field ResponseFile Lmodulecheck/reporting/sarif/Role; - public static final field ResultFile Lmodulecheck/reporting/sarif/Role; - public static final field StandardStream Lmodulecheck/reporting/sarif/Role; - public static final field Taxonomy Lmodulecheck/reporting/sarif/Role; - public static final field ToolSpecifiedConfiguration Lmodulecheck/reporting/sarif/Role; - public static final field TracedFile Lmodulecheck/reporting/sarif/Role; - public static final field Translation Lmodulecheck/reporting/sarif/Role; - public static final field Uncontrolled Lmodulecheck/reporting/sarif/Role; - public static final field Unmodified Lmodulecheck/reporting/sarif/Role; - public static final field UserSpecifiedConfiguration Lmodulecheck/reporting/sarif/Role; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/Role; - public static fun values ()[Lmodulecheck/reporting/sarif/Role; -} - -public final class modulecheck/reporting/sarif/Run { - public fun (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/RunAutomationDetails;Ljava/lang/String;Lmodulecheck/reporting/sarif/ColumnKind;Lmodulecheck/reporting/sarif/Conversion;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/SpecialLocations;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Tool;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)V - public synthetic fun (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/RunAutomationDetails;Ljava/lang/String;Lmodulecheck/reporting/sarif/ColumnKind;Lmodulecheck/reporting/sarif/Conversion;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/SpecialLocations;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Tool;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component10 ()Ljava/util/List; - public final fun component11 ()Ljava/util/List; - public final fun component12 ()Ljava/lang/String; - public final fun component13 ()Ljava/util/List; - public final fun component14 ()Ljava/util/List; - public final fun component15 ()Ljava/util/Map; - public final fun component16 ()Ljava/util/List; - public final fun component17 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component18 ()Ljava/util/List; - public final fun component19 ()Ljava/util/List; - public final fun component2 ()Ljava/util/List; - public final fun component20 ()Ljava/util/List; - public final fun component21 ()Lmodulecheck/reporting/sarif/SpecialLocations; - public final fun component22 ()Ljava/util/List; - public final fun component23 ()Ljava/util/List; - public final fun component24 ()Lmodulecheck/reporting/sarif/Tool; - public final fun component25 ()Ljava/util/List; - public final fun component26 ()Ljava/util/List; - public final fun component27 ()Ljava/util/List; - public final fun component28 ()Ljava/util/List; - public final fun component3 ()Lmodulecheck/reporting/sarif/RunAutomationDetails; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Lmodulecheck/reporting/sarif/ColumnKind; - public final fun component6 ()Lmodulecheck/reporting/sarif/Conversion; - public final fun component7 ()Ljava/lang/String; - public final fun component8 ()Ljava/lang/String; - public final fun component9 ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences; - public final fun copy (Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/RunAutomationDetails;Ljava/lang/String;Lmodulecheck/reporting/sarif/ColumnKind;Lmodulecheck/reporting/sarif/Conversion;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/SpecialLocations;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Tool;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;)Lmodulecheck/reporting/sarif/Run; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Run;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/RunAutomationDetails;Ljava/lang/String;Lmodulecheck/reporting/sarif/ColumnKind;Lmodulecheck/reporting/sarif/Conversion;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/util/List;Ljava/util/List;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/SpecialLocations;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/Tool;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Run; - public fun equals (Ljava/lang/Object;)Z - public final fun getAddresses ()Ljava/util/List; - public final fun getArtifacts ()Ljava/util/List; - public final fun getAutomationDetails ()Lmodulecheck/reporting/sarif/RunAutomationDetails; - public final fun getBaselineGUID ()Ljava/lang/String; - public final fun getColumnKind ()Lmodulecheck/reporting/sarif/ColumnKind; - public final fun getConversion ()Lmodulecheck/reporting/sarif/Conversion; - public final fun getDefaultEncoding ()Ljava/lang/String; - public final fun getDefaultSourceLanguage ()Ljava/lang/String; - public final fun getExternalPropertyFileReferences ()Lmodulecheck/reporting/sarif/ExternalPropertyFileReferences; - public final fun getGraphs ()Ljava/util/List; - public final fun getInvocations ()Ljava/util/List; - public final fun getLanguage ()Ljava/lang/String; - public final fun getLogicalLocations ()Ljava/util/List; - public final fun getNewlineSequences ()Ljava/util/List; - public final fun getOriginalURIBaseIDS ()Ljava/util/Map; - public final fun getPolicies ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRedactionTokens ()Ljava/util/List; - public final fun getResults ()Ljava/util/List; - public final fun getRunAggregates ()Ljava/util/List; - public final fun getSpecialLocations ()Lmodulecheck/reporting/sarif/SpecialLocations; - public final fun getTaxonomies ()Ljava/util/List; - public final fun getThreadFlowLocations ()Ljava/util/List; - public final fun getTool ()Lmodulecheck/reporting/sarif/Tool; - public final fun getTranslations ()Ljava/util/List; - public final fun getVersionControlProvenance ()Ljava/util/List; - public final fun getWebRequests ()Ljava/util/List; - public final fun getWebResponses ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/RunAutomationDetails { - public fun ()V - public fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/reporting/sarif/Message; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/RunAutomationDetails; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/RunAutomationDetails;Ljava/lang/String;Lmodulecheck/reporting/sarif/Message;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/RunAutomationDetails; - public fun equals (Ljava/lang/Object;)Z - public final fun getCorrelationGUID ()Ljava/lang/String; - public final fun getDescription ()Lmodulecheck/reporting/sarif/Message; - public final fun getGuid ()Ljava/lang/String; - public final fun getId ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/RunAutomationDetailsJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/RunAutomationDetails; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/RunAutomationDetails;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/RunJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Run; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Run;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifDriver { - public fun (Lmodulecheck/reporting/sarif/ToolComponentReference;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/TranslationMetadata;Ljava/lang/String;Ljava/util/List;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ToolComponentReference;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/TranslationMetadata;Ljava/lang/String;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ToolComponentReference; - public final fun component10 ()Ljava/lang/Boolean; - public final fun component11 ()Ljava/lang/String; - public final fun component12 ()Ljava/lang/String; - public final fun component13 ()Ljava/util/List; - public final fun component14 ()Ljava/lang/String; - public final fun component15 ()Ljava/lang/String; - public final fun component16 ()Ljava/util/List; - public final fun component17 ()Ljava/lang/String; - public final fun component18 ()Ljava/lang/String; - public final fun component19 ()Ljava/lang/String; - public final fun component2 ()Ljava/util/List; - public final fun component20 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component21 ()Ljava/lang/String; - public final fun component22 ()Ljava/lang/String; - public final fun component23 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun component24 ()Ljava/util/List; - public final fun component25 ()Ljava/util/List; - public final fun component26 ()Lmodulecheck/reporting/sarif/TranslationMetadata; - public final fun component27 ()Ljava/lang/String; - public final fun component28 ()Ljava/util/List; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun component6 ()Ljava/lang/String; - public final fun component7 ()Ljava/util/Map; - public final fun component8 ()Ljava/lang/String; - public final fun component9 ()Ljava/lang/String; - public final fun copy (Lmodulecheck/reporting/sarif/ToolComponentReference;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/TranslationMetadata;Ljava/lang/String;Ljava/util/List;)Lmodulecheck/reporting/sarif/SarifDriver; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/SarifDriver;Lmodulecheck/reporting/sarif/ToolComponentReference;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/TranslationMetadata;Ljava/lang/String;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/SarifDriver; - public fun equals (Ljava/lang/Object;)Z - public final fun getAssociatedComponent ()Lmodulecheck/reporting/sarif/ToolComponentReference; - public final fun getContents ()Ljava/util/List; - public final fun getDottedQuadFileVersion ()Ljava/lang/String; - public final fun getDownloadURI ()Ljava/lang/String; - public final fun getFullDescription ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun getFullName ()Ljava/lang/String; - public final fun getGlobalMessageStrings ()Ljava/util/Map; - public final fun getGuid ()Ljava/lang/String; - public final fun getInformationURI ()Ljava/lang/String; - public final fun getLanguage ()Ljava/lang/String; - public final fun getLocalizedDataSemanticVersion ()Ljava/lang/String; - public final fun getLocations ()Ljava/util/List; - public final fun getMinimumRequiredLocalizedDataSemanticVersion ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public final fun getNotifications ()Ljava/util/List; - public final fun getOrganization ()Ljava/lang/String; - public final fun getProduct ()Ljava/lang/String; - public final fun getProductSuite ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getReleaseDateUTC ()Ljava/lang/String; - public final fun getRules ()Ljava/util/List; - public final fun getSemanticVersion ()Ljava/lang/String; - public final fun getShortDescription ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun getSupportedTaxonomies ()Ljava/util/List; - public final fun getTaxa ()Ljava/util/List; - public final fun getTranslationMetadata ()Lmodulecheck/reporting/sarif/TranslationMetadata; - public final fun getVersion ()Ljava/lang/String; - public fun hashCode ()I - public final fun isComprehensive ()Ljava/lang/Boolean; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifDriverJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/SarifDriver; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/SarifDriver;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifReport { - public fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)V - public synthetic fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/reporting/sarif/Version; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)Lmodulecheck/reporting/sarif/SarifReport; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/SarifReport;Ljava/lang/String;Lmodulecheck/reporting/sarif/Version;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/SarifReport; - public fun equals (Ljava/lang/Object;)Z - public final fun getInlineExternalProperties ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRuns ()Ljava/util/List; - public final fun getSchema ()Ljava/lang/String; - public final fun getVersion ()Lmodulecheck/reporting/sarif/Version; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifReportFactory { - public fun (Lmodulecheck/dagger/SourceWebsiteUrlProvider;Lmodulecheck/dagger/ModuleCheckVersionProvider;Lmodulecheck/project/ProjectRoot;)V - public final fun create (Ljava/util/List;Ljava/util/List;)Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifReportFactory_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/reporting/sarif/SarifReportFactory_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/reporting/sarif/SarifReportFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/reporting/sarif/SarifReportFactory; - public static final fun newInstance (Lmodulecheck/dagger/SourceWebsiteUrlProvider;Lmodulecheck/dagger/ModuleCheckVersionProvider;Lmodulecheck/project/ProjectRoot;)Lmodulecheck/reporting/sarif/SarifReportFactory; -} - -public final class modulecheck/reporting/sarif/SarifReportFactory_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/reporting/sarif/SarifReportFactory_Factory; - public final fun newInstance (Lmodulecheck/dagger/SourceWebsiteUrlProvider;Lmodulecheck/dagger/ModuleCheckVersionProvider;Lmodulecheck/project/ProjectRoot;)Lmodulecheck/reporting/sarif/SarifReportFactory; -} - -public final class modulecheck/reporting/sarif/SarifReportJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/SarifReport; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/SarifReport;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifResult { - public fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Lmodulecheck/reporting/sarif/BaselineState;Ljava/util/List;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ResultKind;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ResultProvenance;Ljava/lang/Double;Ljava/util/List;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;Ljava/util/List;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Lmodulecheck/reporting/sarif/BaselineState;Ljava/util/List;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ResultKind;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ResultProvenance;Ljava/lang/Double;Ljava/util/List;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component10 ()Ljava/lang/String; - public final fun component11 ()Ljava/lang/String; - public final fun component12 ()Lmodulecheck/reporting/sarif/ResultKind; - public final fun component13 ()Lmodulecheck/reporting/sarif/Level; - public final fun component14 ()Ljava/util/List; - public final fun component15 ()Lmodulecheck/reporting/sarif/Message; - public final fun component16 ()Ljava/lang/Integer; - public final fun component17 ()Ljava/util/Map; - public final fun component18 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component19 ()Lmodulecheck/reporting/sarif/ResultProvenance; - public final fun component2 ()Ljava/util/List; - public final fun component20 ()Ljava/lang/Double; - public final fun component21 ()Ljava/util/List; - public final fun component22 ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun component23 ()Ljava/lang/String; - public final fun component24 ()Ljava/lang/Integer; - public final fun component25 ()Ljava/util/List; - public final fun component26 ()Ljava/util/List; - public final fun component27 ()Ljava/util/List; - public final fun component28 ()Lmodulecheck/reporting/sarif/WebRequest; - public final fun component29 ()Lmodulecheck/reporting/sarif/WebResponse; - public final fun component3 ()Lmodulecheck/reporting/sarif/BaselineState; - public final fun component30 ()Ljava/util/List; - public final fun component4 ()Ljava/util/List; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Ljava/util/Map; - public final fun component7 ()Ljava/util/List; - public final fun component8 ()Ljava/util/List; - public final fun component9 ()Ljava/util/List; - public final fun copy (Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Lmodulecheck/reporting/sarif/BaselineState;Ljava/util/List;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ResultKind;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ResultProvenance;Ljava/lang/Double;Ljava/util/List;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;Ljava/util/List;)Lmodulecheck/reporting/sarif/SarifResult; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/SarifResult;Lmodulecheck/reporting/sarif/ArtifactLocation;Ljava/util/List;Lmodulecheck/reporting/sarif/BaselineState;Ljava/util/List;Ljava/lang/String;Ljava/util/Map;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ResultKind;Lmodulecheck/reporting/sarif/Level;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Ljava/lang/Integer;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/ResultProvenance;Ljava/lang/Double;Ljava/util/List;Lmodulecheck/reporting/sarif/ReportingDescriptorReference;Ljava/lang/String;Ljava/lang/Integer;Ljava/util/List;Ljava/util/List;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/SarifResult; - public fun equals (Ljava/lang/Object;)Z - public final fun getAnalysisTarget ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getAttachments ()Ljava/util/List; - public final fun getBaselineState ()Lmodulecheck/reporting/sarif/BaselineState; - public final fun getCodeFlows ()Ljava/util/List; - public final fun getCorrelationGUID ()Ljava/lang/String; - public final fun getFingerprints ()Ljava/util/Map; - public final fun getFixes ()Ljava/util/List; - public final fun getGraphTraversals ()Ljava/util/List; - public final fun getGraphs ()Ljava/util/List; - public final fun getGuid ()Ljava/lang/String; - public final fun getHostedViewerURI ()Ljava/lang/String; - public final fun getKind ()Lmodulecheck/reporting/sarif/ResultKind; - public final fun getLevel ()Lmodulecheck/reporting/sarif/Level; - public final fun getLocations ()Ljava/util/List; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getOccurrenceCount ()Ljava/lang/Integer; - public final fun getPartialFingerprints ()Ljava/util/Map; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getProvenance ()Lmodulecheck/reporting/sarif/ResultProvenance; - public final fun getRank ()Ljava/lang/Double; - public final fun getRelatedLocations ()Ljava/util/List; - public final fun getRule ()Lmodulecheck/reporting/sarif/ReportingDescriptorReference; - public final fun getRuleID ()Ljava/lang/String; - public final fun getRuleIndex ()Ljava/lang/Integer; - public final fun getStacks ()Ljava/util/List; - public final fun getSuppressions ()Ljava/util/List; - public final fun getTaxa ()Ljava/util/List; - public final fun getWebRequest ()Lmodulecheck/reporting/sarif/WebRequest; - public final fun getWebResponse ()Lmodulecheck/reporting/sarif/WebResponse; - public final fun getWorkItemUris ()Ljava/util/List; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifResultJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/SarifResult; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/SarifResult;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifRule { - public fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/MultiformatMessageString;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/MultiformatMessageString;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component10 ()Ljava/lang/String; - public final fun component11 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun component12 ()Ljava/util/Map; - public final fun component13 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component14 ()Ljava/util/List; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Lmodulecheck/reporting/sarif/ReportingConfiguration; - public final fun component5 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun component6 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun component7 ()Ljava/util/List; - public final fun component8 ()Ljava/util/List; - public final fun component9 ()Ljava/util/List; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/MultiformatMessageString;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;)Lmodulecheck/reporting/sarif/SarifRule; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/SarifRule;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ReportingConfiguration;Lmodulecheck/reporting/sarif/MultiformatMessageString;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/List;Ljava/util/List;Ljava/util/List;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/SarifRule; - public fun equals (Ljava/lang/Object;)Z - public final fun getDefaultConfiguration ()Lmodulecheck/reporting/sarif/ReportingConfiguration; - public final fun getDeprecatedGuids ()Ljava/util/List; - public final fun getDeprecatedIDS ()Ljava/util/List; - public final fun getDeprecatedNames ()Ljava/util/List; - public final fun getFullDescription ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun getGuid ()Ljava/lang/String; - public final fun getHelp ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun getHelpURI ()Ljava/lang/String; - public final fun getId ()Ljava/lang/String; - public final fun getMessageStrings ()Ljava/util/Map; - public final fun getName ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRelationships ()Ljava/util/List; - public final fun getShortDescription ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SarifRuleJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/SarifRule; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/SarifRule;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SpecialLocations { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component2 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/SpecialLocations; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/SpecialLocations;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/SpecialLocations; - public fun equals (Ljava/lang/Object;)Z - public final fun getDisplayBase ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SpecialLocationsJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/SpecialLocations; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/SpecialLocations;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Stack { - public fun (Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/util/List; - public final fun component2 ()Lmodulecheck/reporting/sarif/Message; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/Stack; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Stack;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Stack; - public fun equals (Ljava/lang/Object;)Z - public final fun getFrames ()Ljava/util/List; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/StackFrame { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;)V - public synthetic fun (Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/Location; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/util/List; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Ljava/lang/Integer; - public final fun copy (Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;)Lmodulecheck/reporting/sarif/StackFrame; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/StackFrame;Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/Integer;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/StackFrame; - public fun equals (Ljava/lang/Object;)Z - public final fun getLocation ()Lmodulecheck/reporting/sarif/Location; - public final fun getModule ()Ljava/lang/String; - public final fun getParameters ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getThreadID ()Ljava/lang/Integer; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/StackFrameJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/StackFrame; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/StackFrame;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/StackJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Stack; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Stack;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/State : java/lang/Enum { - public static final field Accepted Lmodulecheck/reporting/sarif/State; - public static final field Rejected Lmodulecheck/reporting/sarif/State; - public static final field UnderReview Lmodulecheck/reporting/sarif/State; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/State; - public static fun values ()[Lmodulecheck/reporting/sarif/State; -} - -public final class modulecheck/reporting/sarif/Suppression { - public fun (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/SuppressionKind;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/State;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/SuppressionKind;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/State;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Lmodulecheck/reporting/sarif/SuppressionKind; - public final fun component4 ()Lmodulecheck/reporting/sarif/Location; - public final fun component5 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component6 ()Lmodulecheck/reporting/sarif/State; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/SuppressionKind;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/State;)Lmodulecheck/reporting/sarif/Suppression; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Suppression;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/SuppressionKind;Lmodulecheck/reporting/sarif/Location;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/State;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Suppression; - public fun equals (Ljava/lang/Object;)Z - public final fun getGuid ()Ljava/lang/String; - public final fun getJustification ()Ljava/lang/String; - public final fun getKind ()Lmodulecheck/reporting/sarif/SuppressionKind; - public final fun getLocation ()Lmodulecheck/reporting/sarif/Location; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getState ()Lmodulecheck/reporting/sarif/State; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SuppressionJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Suppression; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Suppression;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/SuppressionKind : java/lang/Enum { - public static final field External Lmodulecheck/reporting/sarif/SuppressionKind; - public static final field InSource Lmodulecheck/reporting/sarif/SuppressionKind; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/SuppressionKind; - public static fun values ()[Lmodulecheck/reporting/sarif/SuppressionKind; -} - -public final class modulecheck/reporting/sarif/ThreadFlow { - public fun (Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/util/Map; - public final fun component3 ()Ljava/util/Map; - public final fun component4 ()Ljava/util/List; - public final fun component5 ()Lmodulecheck/reporting/sarif/Message; - public final fun component6 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/ThreadFlow; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ThreadFlow;Ljava/lang/String;Ljava/util/Map;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/Message;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ThreadFlow; - public fun equals (Ljava/lang/Object;)Z - public final fun getId ()Ljava/lang/String; - public final fun getImmutableState ()Ljava/util/Map; - public final fun getInitialState ()Ljava/util/Map; - public final fun getLocations ()Ljava/util/List; - public final fun getMessage ()Lmodulecheck/reporting/sarif/Message; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ThreadFlowJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ThreadFlow; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ThreadFlow;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ThreadFlowLocation { - public fun ()V - public fun (Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/Importance;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;)V - public synthetic fun (Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/Importance;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/Integer; - public final fun component10 ()Lmodulecheck/reporting/sarif/Stack; - public final fun component11 ()Ljava/util/Map; - public final fun component12 ()Ljava/util/List; - public final fun component13 ()Lmodulecheck/reporting/sarif/WebRequest; - public final fun component14 ()Lmodulecheck/reporting/sarif/WebResponse; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Lmodulecheck/reporting/sarif/Importance; - public final fun component4 ()Ljava/lang/Integer; - public final fun component5 ()Ljava/util/List; - public final fun component6 ()Lmodulecheck/reporting/sarif/Location; - public final fun component7 ()Ljava/lang/String; - public final fun component8 ()Ljava/lang/Integer; - public final fun component9 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/Importance;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;)Lmodulecheck/reporting/sarif/ThreadFlowLocation; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ThreadFlowLocation;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/Importance;Ljava/lang/Integer;Ljava/util/List;Lmodulecheck/reporting/sarif/Location;Ljava/lang/String;Ljava/lang/Integer;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/Stack;Ljava/util/Map;Ljava/util/List;Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/WebResponse;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ThreadFlowLocation; - public fun equals (Ljava/lang/Object;)Z - public final fun getExecutionOrder ()Ljava/lang/Integer; - public final fun getExecutionTimeUTC ()Ljava/lang/String; - public final fun getImportance ()Lmodulecheck/reporting/sarif/Importance; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getKinds ()Ljava/util/List; - public final fun getLocation ()Lmodulecheck/reporting/sarif/Location; - public final fun getModule ()Ljava/lang/String; - public final fun getNestingLevel ()Ljava/lang/Integer; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getStack ()Lmodulecheck/reporting/sarif/Stack; - public final fun getState ()Ljava/util/Map; - public final fun getTaxa ()Ljava/util/List; - public final fun getWebRequest ()Lmodulecheck/reporting/sarif/WebRequest; - public final fun getWebResponse ()Lmodulecheck/reporting/sarif/WebResponse; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ThreadFlowLocationJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ThreadFlowLocation; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ThreadFlowLocation;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Tool { - public fun (Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/SarifDriver; - public final fun component2 ()Ljava/util/List; - public final fun component3 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/Tool; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/Tool;Lmodulecheck/reporting/sarif/SarifDriver;Ljava/util/List;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/Tool; - public fun equals (Ljava/lang/Object;)Z - public final fun getDriver ()Lmodulecheck/reporting/sarif/SarifDriver; - public final fun getExtensions ()Ljava/util/List; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ToolComponentReference { - public fun ()V - public fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/Integer; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun copy (Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;)Lmodulecheck/reporting/sarif/ToolComponentReference; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/ToolComponentReference;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/ToolComponentReference; - public fun equals (Ljava/lang/Object;)Z - public final fun getGuid ()Ljava/lang/String; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getName ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ToolComponentReferenceJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/ToolComponentReference; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/ToolComponentReference;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/ToolJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/Tool; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/Tool;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/TranslationMetadata { - public fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;)V - public synthetic fun (Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component7 ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun copy (Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;)Lmodulecheck/reporting/sarif/TranslationMetadata; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/TranslationMetadata;Ljava/lang/String;Lmodulecheck/reporting/sarif/MultiformatMessageString;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/PropertyBag;Lmodulecheck/reporting/sarif/MultiformatMessageString;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/TranslationMetadata; - public fun equals (Ljava/lang/Object;)Z - public final fun getDownloadURI ()Ljava/lang/String; - public final fun getFullDescription ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public final fun getFullName ()Ljava/lang/String; - public final fun getInformationURI ()Ljava/lang/String; - public final fun getName ()Ljava/lang/String; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getShortDescription ()Lmodulecheck/reporting/sarif/MultiformatMessageString; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/TranslationMetadataJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/TranslationMetadata; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/TranslationMetadata;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/Version : java/lang/Enum { - public static final field The210 Lmodulecheck/reporting/sarif/Version; - public static fun getEntries ()Lkotlin/enums/EnumEntries; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/reporting/sarif/Version; - public static fun values ()[Lmodulecheck/reporting/sarif/Version; -} - -public final class modulecheck/reporting/sarif/VersionControlDetails { - public fun (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Ljava/lang/String; - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun component4 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component5 ()Ljava/lang/String; - public final fun component6 ()Ljava/lang/String; - public final fun component7 ()Ljava/lang/String; - public final fun copy (Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/reporting/sarif/VersionControlDetails; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/VersionControlDetails;Ljava/lang/String;Ljava/lang/String;Lmodulecheck/reporting/sarif/ArtifactLocation;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/VersionControlDetails; - public fun equals (Ljava/lang/Object;)Z - public final fun getAsOfTimeUTC ()Ljava/lang/String; - public final fun getBranch ()Ljava/lang/String; - public final fun getMappedTo ()Lmodulecheck/reporting/sarif/ArtifactLocation; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getRepositoryURI ()Ljava/lang/String; - public final fun getRevisionID ()Ljava/lang/String; - public final fun getRevisionTag ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/VersionControlDetailsJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/VersionControlDetails; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/VersionControlDetails;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/WebRequest { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun component2 ()Ljava/util/Map; - public final fun component3 ()Ljava/lang/Integer; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/util/Map; - public final fun component6 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component7 ()Ljava/lang/String; - public final fun component8 ()Ljava/lang/String; - public final fun component9 ()Ljava/lang/String; - public final fun copy (Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/reporting/sarif/WebRequest; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/WebRequest;Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/String;Ljava/util/Map;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/WebRequest; - public fun equals (Ljava/lang/Object;)Z - public final fun getBody ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun getHeaders ()Ljava/util/Map; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getMethod ()Ljava/lang/String; - public final fun getParameters ()Ljava/util/Map; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getProtocol ()Ljava/lang/String; - public final fun getTarget ()Ljava/lang/String; - public final fun getVersion ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/WebRequestJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/WebRequest; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/WebRequest;)V - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/WebResponse { - public fun ()V - public fun (Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;)V - public synthetic fun (Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun component2 ()Ljava/util/Map; - public final fun component3 ()Ljava/lang/Integer; - public final fun component4 ()Ljava/lang/Boolean; - public final fun component5 ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun component6 ()Ljava/lang/String; - public final fun component7 ()Ljava/lang/String; - public final fun component8 ()Ljava/lang/Integer; - public final fun component9 ()Ljava/lang/String; - public final fun copy (Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;)Lmodulecheck/reporting/sarif/WebResponse; - public static synthetic fun copy$default (Lmodulecheck/reporting/sarif/WebResponse;Lmodulecheck/reporting/sarif/ArtifactContent;Ljava/util/Map;Ljava/lang/Integer;Ljava/lang/Boolean;Lmodulecheck/reporting/sarif/PropertyBag;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Integer;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/reporting/sarif/WebResponse; - public fun equals (Ljava/lang/Object;)Z - public final fun getBody ()Lmodulecheck/reporting/sarif/ArtifactContent; - public final fun getHeaders ()Ljava/util/Map; - public final fun getIndex ()Ljava/lang/Integer; - public final fun getNoResponseReceived ()Ljava/lang/Boolean; - public final fun getProperties ()Lmodulecheck/reporting/sarif/PropertyBag; - public final fun getProtocol ()Ljava/lang/String; - public final fun getReasonPhrase ()Ljava/lang/String; - public final fun getStatusCode ()Ljava/lang/Integer; - public final fun getVersion ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/reporting/sarif/WebResponseJsonAdapter : com/squareup/moshi/JsonAdapter { - public fun (Lcom/squareup/moshi/Moshi;)V - public synthetic fun fromJson (Lcom/squareup/moshi/JsonReader;)Ljava/lang/Object; - public fun fromJson (Lcom/squareup/moshi/JsonReader;)Lmodulecheck/reporting/sarif/WebResponse; - public synthetic fun toJson (Lcom/squareup/moshi/JsonWriter;Ljava/lang/Object;)V - public fun toJson (Lcom/squareup/moshi/JsonWriter;Lmodulecheck/reporting/sarif/WebResponse;)V - public fun toString ()Ljava/lang/String; -} - diff --git a/modulecheck-reporting/sarif/build.gradle.kts b/modulecheck-reporting/sarif/build.gradle.kts deleted file mode 100644 index 5f083bfa70..0000000000 --- a/modulecheck-reporting/sarif/build.gradle.kts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-reporting-sarif" - ) - anvil() - ksp() -} - -dependencies { - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-rule:api")) - - implementation(libs.square.moshi) - - implementation(project(":modulecheck-utils:stdlib")) - - "ksp"(libs.square.moshi.codegen) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotlinx.coroutines.test) - - // testImplementation(libs.square.okio) - - testImplementation(project(path = ":modulecheck-config:fake")) - testImplementation(project(path = ":modulecheck-finding:impl")) - testImplementation(project(path = ":modulecheck-finding:name")) - testImplementation(project(path = ":modulecheck-internal-testing")) - testImplementation(project(path = ":modulecheck-model:dependency:api")) - testImplementation(project(path = ":modulecheck-runtime:testing")) -} diff --git a/modulecheck-reporting/sarif/src/main/kotlin/modulecheck/reporting/sarif/SarifReport.kt b/modulecheck-reporting/sarif/src/main/kotlin/modulecheck/reporting/sarif/SarifReport.kt deleted file mode 100644 index 3e50833754..0000000000 --- a/modulecheck-reporting/sarif/src/main/kotlin/modulecheck/reporting/sarif/SarifReport.kt +++ /dev/null @@ -1,4324 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.sarif - -import com.squareup.moshi.Json -import com.squareup.moshi.JsonClass - -/** - * Static Analysis Results Format (SARIF) Version 2.1.0 JSON Schema: - * a standard format for the output of static analysis tools. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class SarifReport( - /** - * The URI of the JSON schema corresponding to the version. - * - * @since 0.12.0 - */ - @Json(name = "\$schema") - val schema: String, - - /** - * The SARIF format version of this log file. - * - * @since 0.12.0 - */ - @Json(name = "version") - val version: Version, - - /** - * References to external property files that share data between runs. - * - * @since 0.12.0 - */ - @Json(name = "inlineExternalProperties") - val inlineExternalProperties: List? = null, - - /** - * Key/value pairs that provide additional information about the log file. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The set of runs contained in this log file. - * - * @since 0.12.0 - */ - @Json(name = "runs") - val runs: List -) - -/** - * The top-level element of an external property file. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ExternalProperties( - /** - * Addresses that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "addresses") - val addresses: List

? = null, - - /** - * An array of artifact objects that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "artifacts") - val artifacts: List? = null, - - /** - * A conversion object that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "conversion") - val conversion: Conversion? = null, - - /** - * The analysis tool object that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "driver") - val driver: SarifDriver? = null, - - /** - * Tool extensions that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "extensions") - val extensions: List? = null, - - /** - * Key/value pairs that provide additional information that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "externalizedProperties") - val externalizedProperties: PropertyBag? = null, - - /** - * An array of graph objects that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "graphs") - val graphs: List? = null, - - /** - * A stable, unique identifer for this external properties object, in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * Describes the invocation of the analysis tool that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "invocations") - val invocations: List? = null, - - /** - * An array of logical locations such as namespaces, types - * or functions that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "logicalLocations") - val logicalLocations: List? = null, - - /** - * Tool policies that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "policies") - val policies: List? = null, - - /** - * Key/value pairs that provide additional information about the external properties. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of result objects that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "results") - val results: List? = null, - - /** - * A stable, unique identifer for the run associated with - * this external properties object, in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "runGuid") - val runGUID: String? = null, - - /** - * The URI of the JSON schema corresponding to the version of the external property file format. - * - * @since 0.12.0 - */ - @Json(name = "schema") - val schema: String? = null, - - /** - * Tool taxonomies that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "taxonomies") - val taxonomies: List? = null, - - /** - * An array of threadFlowLocation objects that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "threadFlowLocations") - val threadFlowLocations: List? = null, - - /** - * Tool translations that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "translations") - val translations: List? = null, - - /** - * The SARIF format version of this external properties object. - * - * @since 0.12.0 - */ - @Json(name = "version") - val version: Version? = null, - - /** - * Requests that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "webRequests") - val webRequests: List? = null, - - /** - * Responses that will be merged with a separate run. - * - * @since 0.12.0 - */ - @Json(name = "webResponses") - val webResponses: List? = null -) - -/** - * A physical or virtual address, or a range of addresses, - * in an 'addressable region' (memory or a binary file). - * - * The address of the location. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Address( - /** - * The address expressed as a byte offset from the start of the addressable region. - * - * @since 0.12.0 - */ - @Json(name = "absoluteAddress") - val absoluteAddress: Int? = null, - - /** - * A human-readable fully qualified name that is associated with the address. - * - * @since 0.12.0 - */ - @Json(name = "fullyQualifiedName") - val fullyQualifiedName: String? = null, - - /** - * The index within run.addresses of the cached object for this address. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * An open-ended string that identifies the address kind. 'data', - * 'function', 'header','instruction', 'module', 'page', 'section', - * 'segment', 'stack', 'stackFrame', 'table' are well-known values. - * - * @since 0.12.0 - */ - @Json(name = "kind") - val kind: String? = null, - - /** - * The number of bytes in this range of addresses. - * - * @since 0.12.0 - */ - @Json(name = "length") - val length: Int? = null, - - /** - * A name that is associated with the address, e.g., '.text'. - * - * @since 0.12.0 - */ - @Json(name = "name") - val name: String? = null, - - /** - * The byte offset of this address from the absolute or relative address of the parent object. - * - * @since 0.12.0 - */ - @Json(name = "offsetFromParent") - val offsetFromParent: Int? = null, - - /** - * The index within run.addresses of the parent object. - * - * @since 0.12.0 - */ - @Json(name = "parentIndex") - val parentIndex: Int? = null, - - /** - * Key/value pairs that provide additional information about the address. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The address expressed as a byte offset from the absolute address of the top-most parent object. - * - * @since 0.12.0 - */ - @Json(name = "relativeAddress") - val relativeAddress: Int? = null -) - -/** - * Key/value pairs. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class PropertyBag( - /** - * A set of distinct strings that provide additional information. - * - * @since 0.12.0 - */ - @Json(name = "tags") - val tags: List? = null -) - -/** - * A single artifact. In some cases, this artifact might be nested within another artifact. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Artifact( - /** - * The contents of the artifact. - * - * @since 0.12.0 - */ - @Json(name = "contents") - val contents: ArtifactContent? = null, - - /** - * A short description of the artifact. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * Specifies the encoding for an artifact object that refers to a text file. - * - * @since 0.12.0 - */ - @Json(name = "encoding") - val encoding: String? = null, - - /** - * A dictionary, each of whose keys is the name of a hash function and each of whose - * values is the hashed value of the artifact produced by the specified hash function. - * - * @since 0.12.0 - */ - @Json(name = "hashes") - val hashes: Map? = null, - - /** - * The Coordinated Universal Time (UTC) date and time at which the artifact was most - * recently modified. See "Date/time properties" in the SARIF spec for the required format. - * - * @since 0.12.0 - */ - @Json(name = "lastModifiedTimeUtc") - val lastModifiedTimeUTC: String? = null, - - /** - * The length of the artifact in bytes. - * - * @since 0.12.0 - */ - @Json(name = "length") - val length: Int? = null, - - /** - * The location of the artifact. - * - * @since 0.12.0 - */ - @Json(name = "location") - val location: ArtifactLocation? = null, - - /** - * The MIME type (RFC 2045) of the artifact. - * - * @since 0.12.0 - */ - @Json(name = "mimeType") - val mimeType: String? = null, - - /** - * The offset in bytes of the artifact within its containing artifact. - * - * @since 0.12.0 - */ - @Json(name = "offset") - val offset: Int? = null, - - /** - * Identifies the index of the immediate parent of the artifact, if this artifact is nested. - * - * @since 0.12.0 - */ - @Json(name = "parentIndex") - val parentIndex: Int? = null, - - /** - * Key/value pairs that provide additional information about the artifact. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The role or roles played by the artifact in the analysis. - * - * @since 0.12.0 - */ - @Json(name = "roles") - val roles: List? = null, - - /** - * Specifies the source language for any artifact object - * that refers to a text file that contains source code. - * - * @since 0.12.0 - */ - @Json(name = "sourceLanguage") - val sourceLanguage: String? = null -) - -/** - * The contents of the artifact. - * - * Represents the contents of an artifact. - * - * The portion of the artifact contents within the specified region. - * - * The body of the request. - * - * The body of the response. - * - * The content to insert at the location specified by the 'deletedRegion' property. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ArtifactContent( - /** - * MIME Base64-encoded content from a binary artifact, - * or from a text artifact in its original encoding. - * - * @since 0.12.0 - */ - @Json(name = "binary") - val binary: String? = null, - - /** - * Key/value pairs that provide additional information about the artifact content. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An alternate rendered representation of the artifact - * (e.g., a decompiled representation of a binary region). - * - * @since 0.12.0 - */ - @Json(name = "rendered") - val rendered: MultiformatMessageString? = null, - - /** - * UTF-8-encoded content from a text artifact. - * - * @since 0.12.0 - */ - @Json(name = "text") - val text: String? = null -) - -/** - * An alternate rendered representation of the artifact - * (e.g., a decompiled representation of a binary region). - * - * A message string or message format string rendered in multiple formats. - * - * A comprehensive description of the tool component. - * - * A description of the report. Should, as far as possible, provide details - * sufficient to enable resolution of any problem indicated by the result. - * - * Provides the primary documentation for the report, useful when there is no online documentation. - * - * A concise description of the report. Should be a single sentence that is - * understandable when visible space is limited to a single line of text. - * - * A brief description of the tool component. - * - * A comprehensive description of the translation metadata. - * - * A brief description of the translation metadata. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class MultiformatMessageString( - /** - * A Markdown message string or format string. - * - * @since 0.12.0 - */ - @Json(name = "markdown") - val markdown: String? = null, - - /** - * Key/value pairs that provide additional information about the message. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A plain text message string or format string. - * - * @since 0.12.0 - */ - @Json(name = "text") - val text: String -) - -/** - * A short description of the artifact. - * - * A short description of the artifact location. - * - * A message relevant to the region. - * - * A message relevant to the location. - * - * A description of the location relationship. - * - * A message relevant to this call stack. - * - * A message that describes the condition that was encountered. - * - * A description of the reporting descriptor relationship. - * - * A description of the graph. - * - * A short description of the edge. - * - * A short description of the node. - * - * A message describing the role played by the attachment. - * - * A message relevant to the rectangle. - * - * A message relevant to the code flow. - * - * A message relevant to the thread flow. - * - * A message that describes the proposed fix, enabling - * viewers to present the proposed change to an end user. - * - * A description of this graph traversal. - * - * A message to display to the user as the edge is traversed. - * - * A message that describes the result. The first sentence of the - * message only will be displayed when visible space is limited. - * - * A description of the identity and role played within the - * engineering system by this object's containing run object. - * - * Encapsulates a message intended to be read by the end user. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Message( - /** - * An array of strings to substitute into the message string. - * - * @since 0.12.0 - */ - @Json(name = "arguments") - val arguments: List? = null, - - /** - * The identifier for this message. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: String? = null, - - /** - * A Markdown message string. - * - * @since 0.12.0 - */ - @Json(name = "markdown") - val markdown: String? = null, - - /** - * Key/value pairs that provide additional information about the message. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A plain text message string. - * - * @since 0.12.0 - */ - @Json(name = "text") - val text: String? = null -) - -/** - * The location of the artifact. - * - * Specifies the location of an artifact. - * - * An absolute URI specifying the location of the analysis tool's executable. - * - * A file containing the standard error stream from the process that was invoked. - * - * A file containing the standard input stream to the process that was invoked. - * - * A file containing the standard output stream from the process that was invoked. - * - * A file containing the interleaved standard output and - * standard error stream from the process that was invoked. - * - * The working directory for the analysis tool run. - * - * Identifies the artifact that the analysis tool was instructed to scan. This - * need not be the same as the artifact where the result actually occurred. - * - * The location of the attachment. - * - * The location of the artifact to change. - * - * The location of the external property file. - * - * Provides a suggestion to SARIF consumers to display - * file paths relative to the specified location. - * - * The location in the local file system to which the root - * of the repository was mapped at the time of the analysis. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ArtifactLocation( - /** - * A short description of the artifact location. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * The index within the run artifacts array of the - * artifact object associated with the artifact location. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * Key/value pairs that provide additional information about the artifact location. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A string containing a valid relative or absolute URI. - * - * @since 0.12.0 - */ - @Json(name = "uri") - val uri: String? = null, - - /** - * A string which indirectly specifies the absolute URI with respect - * to which a relative URI in the "uri" property is interpreted. - * - * @since 0.12.0 - */ - @Json(name = "uriBaseId") - val uriBaseID: String? = null -) - -enum class Role { - @Json(name = "added") - Added, - - @Json(name = "analysisTarget") - AnalysisTarget, - - @Json(name = "attachment") - Attachment, - - @Json(name = "debugOutputFile") - DebugOutputFile, - - @Json(name = "deleted") - Deleted, - - @Json(name = "directory") - Directory, - - @Json(name = "driver") - Driver, - - @Json(name = "extension") - Extension, - - @Json(name = "memoryContents") - MemoryContents, - - @Json(name = "modified") - Modified, - - @Json(name = "policy") - Policy, - - @Json(name = "referencedOnCommandLine") - ReferencedOnCommandLine, - - @Json(name = "renamed") - Renamed, - - @Json(name = "responseFile") - ResponseFile, - - @Json(name = "resultFile") - ResultFile, - - @Json(name = "standardStream") - StandardStream, - - @Json(name = "taxonomy") - Taxonomy, - - @Json(name = "toolSpecifiedConfiguration") - ToolSpecifiedConfiguration, - - @Json(name = "tracedFile") - TracedFile, - - @Json(name = "translation") - Translation, - - @Json(name = "uncontrolled") - Uncontrolled, - - @Json(name = "unmodified") - Unmodified, - - @Json(name = "userSpecifiedConfiguration") - UserSpecifiedConfiguration -} - -/** - * A conversion object that will be merged with a separate run. - * - * Describes how a converter transformed the output of a static analysis - * tool from the analysis tool's native output format into the SARIF format. - * - * A conversion object that describes how a converter transformed - * an analysis tool's native reporting format into the SARIF format. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Conversion( - /** - * The locations of the analysis tool's per-run log files. - * - * @since 0.12.0 - */ - @Json(name = "analysisToolLogFiles") - val analysisToolLogFiles: List? = null, - - /** - * An invocation object that describes the invocation of the converter. - * - * @since 0.12.0 - */ - @Json(name = "invocation") - val invocation: Invocation? = null, - - /** - * Key/value pairs that provide additional information about the conversion. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A tool object that describes the converter. - * - * @since 0.12.0 - */ - @Json(name = "tool") - val tool: Tool -) - -/** - * An invocation object that describes the invocation of the converter. - * - * The runtime environment of the analysis tool run. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Invocation( - /** - * The account that ran the analysis tool. - * - * @since 0.12.0 - */ - @Json(name = "account") - val account: String? = null, - - /** - * An array of strings, containing in order the command line - * arguments passed to the tool from the operating system. - * - * @since 0.12.0 - */ - @Json(name = "arguments") - val arguments: List? = null, - - /** - * The command line used to invoke the tool. - * - * @since 0.12.0 - */ - @Json(name = "commandLine") - val commandLine: String? = null, - - /** - * The Coordinated Universal Time (UTC) date and time at which the run ended. - * See "Date/time properties" in the SARIF spec for the required format. - * - * @since 0.12.0 - */ - @Json(name = "endTimeUtc") - val endTimeUTC: String? = null, - - /** - * The environment variables associated with the - * analysis tool process, expressed as key/value pairs. - * - * @since 0.12.0 - */ - @Json(name = "environmentVariables") - val environmentVariables: Map? = null, - - /** - * An absolute URI specifying the location of the analysis tool's executable. - * - * @since 0.12.0 - */ - @Json(name = "executableLocation") - val executableLocation: ArtifactLocation? = null, - - /** - * Specifies whether the tool's execution completed successfully. - * - * @since 0.12.0 - */ - @Json(name = "executionSuccessful") - val executionSuccessful: Boolean, - - /** - * The process exit code. - * - * @since 0.12.0 - */ - @Json(name = "exitCode") - val exitCode: Int? = null, - - /** - * The reason for the process exit. - * - * @since 0.12.0 - */ - @Json(name = "exitCodeDescription") - val exitCodeDescription: String? = null, - - /** - * The name of the signal that caused the process to exit. - * - * @since 0.12.0 - */ - @Json(name = "exitSignalName") - val exitSignalName: String? = null, - - /** - * The numeric value of the signal that caused the process to exit. - * - * @since 0.12.0 - */ - @Json(name = "exitSignalNumber") - val exitSignalNumber: Int? = null, - - /** - * The machine that hosted the analysis tool run. - * - * @since 0.12.0 - */ - @Json(name = "machine") - val machine: String? = null, - - /** - * An array of configurationOverride objects that - * describe notifications related runtime overrides. - * - * @since 0.12.0 - */ - @Json(name = "notificationConfigurationOverrides") - val notificationConfigurationOverrides: List? = null, - - /** - * The process id for the analysis tool run. - * - * @since 0.12.0 - */ - @Json(name = "processId") - val processID: Int? = null, - - /** - * The reason given by the operating system that the process failed to start. - * - * @since 0.12.0 - */ - @Json(name = "processStartFailureMessage") - val processStartFailureMessage: String? = null, - - /** - * Key/value pairs that provide additional information about the invocation. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The locations of any response files specified on the tool's command line. - * - * @since 0.12.0 - */ - @Json(name = "responseFiles") - val responseFiles: List? = null, - - /** - * An array of configurationOverride objects that describe rules related runtime overrides. - * - * @since 0.12.0 - */ - @Json(name = "ruleConfigurationOverrides") - val ruleConfigurationOverrides: List? = null, - - /** - * The Coordinated Universal Time (UTC) date and time at which the run started. - * See "Date/time properties" in the SARIF spec for the required format. - * - * @since 0.12.0 - */ - @Json(name = "startTimeUtc") - val startTimeUTC: String? = null, - - /** - * A file containing the standard error stream from the process that was invoked. - * - * @since 0.12.0 - */ - @Json(name = "stderr") - val stderr: ArtifactLocation? = null, - - /** - * A file containing the standard input stream to the process that was invoked. - * - * @since 0.12.0 - */ - @Json(name = "stdin") - val stdin: ArtifactLocation? = null, - - /** - * A file containing the standard output stream from the process that was invoked. - * - * @since 0.12.0 - */ - @Json(name = "stdout") - val stdout: ArtifactLocation? = null, - - /** - * A file containing the interleaved standard output and - * standard error stream from the process that was invoked. - * - * @since 0.12.0 - */ - @Json(name = "stdoutStderr") - val stdoutStderr: ArtifactLocation? = null, - - /** - * A list of conditions detected by the tool that are relevant to the tool's configuration. - * - * @since 0.12.0 - */ - @Json(name = "toolConfigurationNotifications") - val toolConfigurationNotifications: List? = null, - - /** - * A list of runtime conditions detected by the tool during the analysis. - * - * @since 0.12.0 - */ - @Json(name = "toolExecutionNotifications") - val toolExecutionNotifications: List? = null, - - /** - * The working directory for the analysis tool run. - * - * @since 0.12.0 - */ - @Json(name = "workingDirectory") - val workingDirectory: ArtifactLocation? = null -) - -/** - * Information about how a specific rule or notification was reconfigured at runtime. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ConfigurationOverride( - /** - * Specifies how the rule or notification was configured during the scan. - * - * @since 0.12.0 - */ - @Json(name = "configuration") - val configuration: ReportingConfiguration, - - /** - * A reference used to locate the descriptor whose configuration was overridden. - * - * @since 0.12.0 - */ - @Json(name = "descriptor") - val descriptor: ReportingDescriptorReference, - - /** - * Key/value pairs that provide additional information about the configuration override. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * Specifies how the rule or notification was configured during the scan. - * - * Information about a rule or notification that can be configured at runtime. - * - * Default reporting configuration information. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ReportingConfiguration( - /** - * Specifies whether the report may be produced during the scan. - * - * @since 0.12.0 - */ - @Json(name = "enabled") - val enabled: Boolean? = null, - - /** - * Specifies the failure level for the report. - * - * @since 0.12.0 - */ - @Json(name = "level") - val level: Level? = null, - - /** - * Contains configuration information specific to a report. - * - * @since 0.12.0 - */ - @Json(name = "parameters") - val parameters: PropertyBag? = null, - - /** - * Key/value pairs that provide additional information about the reporting configuration. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * Specifies the relative priority of the report. Used for analysis output only. - * - * @since 0.12.0 - */ - @Json(name = "rank") - val rank: Double? = null -) - -/** - * Specifies the failure level for the report. - * - * A value specifying the severity level of the notification. - * - * A value specifying the severity level of the result. - * - * @since 0.12.0 - */ -enum class Level(val value: String) { - @Json(name = "error") - Error("error"), - - @Json(name = "none") - None("none"), - - @Json(name = "note") - Note("note"), - - @Json(name = "warning") - Warning("warning") -} - -/** - * A reference used to locate the descriptor whose configuration was overridden. - * - * A reference used to locate the rule descriptor associated with this notification. - * - * A reference used to locate the descriptor relevant to this notification. - * - * A reference to the related reporting descriptor. - * - * A reference used to locate the rule descriptor relevant to this result. - * - * Information about how to locate a relevant reporting descriptor. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ReportingDescriptorReference( - /** - * A guid that uniquely identifies the descriptor. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * The id of the descriptor. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: String? = null, - - /** - * The index into an array of descriptors in - * toolComponent.ruleDescriptors, toolComponent.notificationDescriptors, - * or toolComponent.taxonomyDescriptors, depending on context. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * Key/value pairs that provide additional information about the reporting descriptor reference. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A reference used to locate the toolComponent associated with the descriptor. - * - * @since 0.12.0 - */ - @Json(name = "toolComponent") - val toolComponent: ToolComponentReference? = null -) - -/** - * A reference used to locate the toolComponent associated with the descriptor. - * - * Identifies a particular toolComponent object, either the driver or an extension. - * - * The component which is strongly associated with this component. For a - * translation, this refers to the component which has been translated. For an - * extension, this is the driver that provides the extension's plugin model. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ToolComponentReference( - /** - * The 'guid' property of the referenced toolComponent. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * An index into the referenced toolComponent in tool.extensions. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * The 'name' property of the referenced toolComponent. - * - * @since 0.12.0 - */ - @Json(name = "name") - val name: String? = null, - - /** - * Key/value pairs that provide additional information about the toolComponentReference. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * Describes a condition relevant to the tool itself, as opposed - * to being relevant to a target being analyzed by the tool. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Notification( - /** - * A reference used to locate the rule descriptor associated with this notification. - * - * @since 0.12.0 - */ - @Json(name = "associatedRule") - val associatedRule: ReportingDescriptorReference? = null, - - /** - * A reference used to locate the descriptor relevant to this notification. - * - * @since 0.12.0 - */ - @Json(name = "descriptor") - val descriptor: ReportingDescriptorReference? = null, - - /** - * The runtime exception, if any, relevant to this notification. - * - * @since 0.12.0 - */ - @Json(name = "exception") - val exception: Exception? = null, - - /** - * A value specifying the severity level of the notification. - * - * @since 0.12.0 - */ - @Json(name = "level") - val level: Level? = null, - - /** - * The locations relevant to this notification. - * - * @since 0.12.0 - */ - @Json(name = "locations") - val locations: List? = null, - - /** - * A message that describes the condition that was encountered. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message, - - /** - * Key/value pairs that provide additional information about the notification. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The thread identifier of the code that generated the notification. - * - * @since 0.12.0 - */ - @Json(name = "threadId") - val threadID: Int? = null, - - /** - * The Coordinated Universal Time (UTC) date and time at - * which the analysis tool generated the notification. - * - * @since 0.12.0 - */ - @Json(name = "timeUtc") - val timeUTC: String? = null -) - -/** - * The runtime exception, if any, relevant to this notification. - * - * Describes a runtime exception encountered during the execution of an analysis tool. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Exception( - /** - * An array of exception objects each of which is considered a cause of this exception. - * - * @since 0.12.0 - */ - @Json(name = "innerExceptions") - val innerExceptions: List? = null, - - /** - * A string that identifies the kind of exception, for example, the fully qualified - * type name of an object that was thrown, or the symbolic name of a signal. - * - * @since 0.12.0 - */ - @Json(name = "kind") - val kind: String? = null, - - /** - * A message that describes the exception. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: String? = null, - - /** - * Key/value pairs that provide additional information about the exception. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The sequence of function calls leading to the exception. - * - * @since 0.12.0 - */ - @Json(name = "stack") - val stack: Stack? = null -) - -/** - * The sequence of function calls leading to the exception. - * - * A call stack that is relevant to a result. - * - * The call stack leading to this location. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Stack( - /** - * An array of stack frames that represents a sequence of calls, - * rendered in reverse chronological order, that comprise the call stack. - * - * @since 0.12.0 - */ - @Json(name = "frames") - val frames: List, - - /** - * A message relevant to this call stack. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message? = null, - - /** - * Key/value pairs that provide additional information about the stack. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * A function call within a stack trace. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class StackFrame( - /** - * The location to which this stack frame refers. - * - * @since 0.12.0 - */ - @Json(name = "location") - val location: Location? = null, - - /** - * The name of the module that contains the code of this stack frame. - * - * @since 0.12.0 - */ - @Json(name = "module") - val module: String? = null, - - /** - * The parameters of the call that is executing. - * - * @since 0.12.0 - */ - @Json(name = "parameters") - val parameters: List? = null, - - /** - * Key/value pairs that provide additional information about the stack frame. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The thread identifier of the stack frame. - * - * @since 0.12.0 - */ - @Json(name = "threadId") - val threadID: Int? = null -) - -/** - * The location to which this stack frame refers. - * - * A location within a programming artifact. - * - * A code location associated with the node. - * - * The code location. - * - * Identifies the location associated with the suppression. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Location( - /** - * A set of regions relevant to the location. - * - * @since 0.12.0 - */ - @Json(name = "annotations") - val annotations: List? = null, - - /** - * Value that distinguishes this location from all other locations within a single result object. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: Int? = null, - - /** - * The logical locations associated with the result. - * - * @since 0.12.0 - */ - @Json(name = "logicalLocations") - val logicalLocations: List? = null, - - /** - * A message relevant to the location. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message? = null, - - /** - * Identifies the artifact and region. - * - * @since 0.12.0 - */ - @Json(name = "physicalLocation") - val physicalLocation: PhysicalLocation? = null, - - /** - * Key/value pairs that provide additional information about the location. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of objects that describe relationships between this location and others. - * - * @since 0.12.0 - */ - @Json(name = "relationships") - val relationships: List? = null -) - -/** - * A region within an artifact where a result was detected. - * - * Specifies a portion of the artifact that encloses the region. - * Allows a viewer to display additional context around the region. - * - * Specifies a portion of the artifact. - * - * The region of the artifact to delete. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Region( - /** - * The length of the region in bytes. - * - * @since 0.12.0 - */ - @Json(name = "byteLength") - val byteLength: Int? = null, - - /** - * The zero-based offset from the beginning of the artifact of the first byte in the region. - * - * @since 0.12.0 - */ - @Json(name = "byteOffset") - val byteOffset: Int? = null, - - /** - * The length of the region in characters. - * - * @since 0.12.0 - */ - @Json(name = "charLength") - val charLength: Int? = null, - - /** - * The zero-based offset from the beginning of the artifact of the first character in the region. - * - * @since 0.12.0 - */ - @Json(name = "charOffset") - val charOffset: Int? = null, - - /** - * The column number of the character following the end of the region. - * - * @since 0.12.0 - */ - @Json(name = "endColumn") - val endColumn: Int? = null, - - /** - * The line number of the last character in the region. - * - * @since 0.12.0 - */ - @Json(name = "endLine") - val endLine: Int? = null, - - /** - * A message relevant to the region. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message? = null, - - /** - * Key/value pairs that provide additional information about the region. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The portion of the artifact contents within the specified region. - * - * @since 0.12.0 - */ - @Json(name = "snippet") - val snippet: ArtifactContent? = null, - - /** - * Specifies the source language, if any, of the portion - * of the artifact specified by the region object. - * - * @since 0.12.0 - */ - @Json(name = "sourceLanguage") - val sourceLanguage: String? = null, - - /** - * The column number of the first character in the region. - * - * @since 0.12.0 - */ - @Json(name = "startColumn") - val startColumn: Int? = null, - - /** - * The line number of the first character in the region. - * - * @since 0.12.0 - */ - @Json(name = "startLine") - val startLine: Int? = null -) - -/** - * A logical location of a construct that produced a result. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class LogicalLocation( - /** - * The machine-readable name for the logical location, such as a - * mangled function name provided by a C++ compiler that encodes calling - * convention, return type and other details along with the function name. - * - * @since 0.12.0 - */ - @Json(name = "decoratedName") - val decoratedName: String? = null, - - /** - * The human-readable fully qualified name of the logical location. - * - * @since 0.12.0 - */ - @Json(name = "fullyQualifiedName") - val fullyQualifiedName: String? = null, - - /** - * The index within the logical locations array. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * The type of construct this logical location component refers to. Should - * be one of 'function', 'member', 'module', 'namespace', 'parameter', - * 'resource', 'returnType', 'type', 'variable', 'object', 'array', 'property', - * 'value', 'element', 'text', 'attribute', 'comment', 'declaration', 'dtd' or - * 'processingInstruction', if any of those accurately describe the construct. - * - * @since 0.12.0 - */ - @Json(name = "kind") - val kind: String? = null, - - /** - * Identifies the construct in which the result occurred. For example, - * this property might contain the name of a class or a method. - * - * @since 0.12.0 - */ - @Json(name = "name") - val name: String? = null, - - /** - * Identifies the index of the immediate parent of the construct in which - * the result was detected. For example, this property might point to - * a logical location that represents the namespace that holds a type. - * - * @since 0.12.0 - */ - @Json(name = "parentIndex") - val parentIndex: Int? = null, - - /** - * Key/value pairs that provide additional information about the logical location. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * Identifies the artifact and region. - * - * A physical location relevant to a result. Specifies a reference to a programming - * artifact together with a range of bytes or characters within that artifact. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class PhysicalLocation( - /** - * The address of the location. - * - * @since 0.12.0 - */ - @Json(name = "address") - val address: Address? = null, - - /** - * The location of the artifact. - * - * @since 0.12.0 - */ - @Json(name = "artifactLocation") - val artifactLocation: ArtifactLocation? = null, - - /** - * Specifies a portion of the artifact that encloses the region. - * Allows a viewer to display additional context around the region. - * - * @since 0.12.0 - */ - @Json(name = "contextRegion") - val contextRegion: Region? = null, - - /** - * Key/value pairs that provide additional information about the physical location. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * Specifies a portion of the artifact. - * - * @since 0.12.0 - */ - @Json(name = "region") - val region: Region? = null -) - -/** - * Information about the relation of one location to another. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class LocationRelationship( - /** - * A description of the location relationship. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * A set of distinct strings that categorize the relationship. - * Well-known kinds include 'includes', 'isIncludedBy' and 'relevant'. - * - * @since 0.12.0 - */ - @Json(name = "kinds") - val kinds: List? = null, - - /** - * Key/value pairs that provide additional information about the location relationship. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A reference to the related location. - * - * @since 0.12.0 - */ - @Json(name = "target") - val target: Int -) - -/** - * A tool object that describes the converter. - * - * The analysis tool that was run. - * - * Information about the tool or tool pipeline that generated the results in this run. - * A run can only contain results produced by a single tool or tool pipeline. A run can - * aggregate results from multiple log files, as long as context around the tool run - * (tool command-line arguments and the like) is identical for all aggregated files. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Tool( - /** - * The analysis tool that was run. - * - * @since 0.12.0 - */ - @Json(name = "driver") - val driver: SarifDriver, - - /** - * Tool extensions that contributed to or reconfigured the analysis tool that was run. - * - * @since 0.12.0 - */ - @Json(name = "extensions") - val extensions: List? = null, - - /** - * Key/value pairs that provide additional information about the tool. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * The analysis tool that was run. - * - * A component, such as a plug-in or the driver, of the analysis tool that was run. - * - * The analysis tool object that will be merged with a separate run. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class SarifDriver( - /** - * The component which is strongly associated with this component. For a - * translation, this refers to the component which has been translated. For an - * extension, this is the driver that provides the extension's plugin model. - * - * @since 0.12.0 - */ - @Json(name = "associatedComponent") - val associatedComponent: ToolComponentReference? = null, - - /** - * The kinds of data contained in this object. - * - * @since 0.12.0 - */ - @Json(name = "contents") - val contents: List? = null, - - /** - * The binary version of the tool component's primary executable - * file expressed as four non-negative integers separated by a period - * (for operating systems that express file versions in this way). - * - * @since 0.12.0 - */ - @Json(name = "dottedQuadFileVersion") - val dottedQuadFileVersion: String? = null, - - /** - * The absolute URI from which the tool component can be downloaded. - * - * @since 0.12.0 - */ - @Json(name = "downloadUri") - val downloadURI: String? = null, - - /** - * A comprehensive description of the tool component. - * - * @since 0.12.0 - */ - @Json(name = "fullDescription") - val fullDescription: MultiformatMessageString? = null, - - /** - * The name of the tool component along with its version and - * any other useful identifying information, such as its locale. - * - * @since 0.12.0 - */ - @Json(name = "fullName") - val fullName: String? = null, - - /** - * A dictionary, each of whose keys is a resource identifier and each of whose values is a - * multiformatMessageString object, which holds message strings in plain text and (optionally) - * Markdown format. The strings can include placeholders, which can be used to construct - * a message in combination with an arbitrary number of additional string arguments. - * - * @since 0.12.0 - */ - @Json(name = "globalMessageStrings") - val globalMessageStrings: Map? = null, - - /** - * A unique identifer for the tool component in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * The absolute URI at which information about this version of the tool component can be found. - * - * @since 0.12.0 - */ - @Json(name = "informationUri") - val informationURI: String? = null, - - /** - * Specifies whether this object contains a complete definition of the localizable - * and/or non-localizable data for this component, as opposed to including - * only data that is relevant to the results persisted to this log file. - * - * @since 0.12.0 - */ - @Json(name = "isComprehensive") - val isComprehensive: Boolean? = null, - - /** - * The language of the messages emitted into the log file during this run (expressed as an - * ISO 639-1 two-letter lowercase language code) and an optional region (expressed as an - * ISO 3166-1 two-letter uppercase subculture code associated with a country or region). The - * casing is recommended but not required (in order for this data to conform to RFC5646). - * - * @since 0.12.0 - */ - @Json(name = "language") - val language: String? = null, - - /** - * The semantic version of the localized strings defined in this - * component; maintained by components that provide translations. - * - * @since 0.12.0 - */ - @Json(name = "localizedDataSemanticVersion") - val localizedDataSemanticVersion: String? = null, - - /** - * An array of the artifactLocation objects associated with the tool component. - * - * @since 0.12.0 - */ - @Json(name = "locations") - val locations: List? = null, - - /** - * The minimum value of localizedDataSemanticVersion required in translations - * consumed by this component; used by components that consume translations. - * - * @since 0.12.0 - */ - @Json(name = "minimumRequiredLocalizedDataSemanticVersion") - val minimumRequiredLocalizedDataSemanticVersion: String? = null, - - /** - * The name of the tool component. - * - * @since 0.12.0 - */ - @Json(name = "name") - val name: String, - - /** - * An array of reportingDescriptor objects relevant to the notifications - * related to the configuration and runtime execution of the tool component. - * - * @since 0.12.0 - */ - @Json(name = "notifications") - val notifications: List? = null, - - /** - * The organization or company that produced the tool component. - * - * @since 0.12.0 - */ - @Json(name = "organization") - val organization: String? = null, - - /** - * A product suite to which the tool component belongs. - * - * @since 0.12.0 - */ - @Json(name = "product") - val product: String? = null, - - /** - * A localizable string containing the name of the suite - * of products to which the tool component belongs. - * - * @since 0.12.0 - */ - @Json(name = "productSuite") - val productSuite: String? = null, - - /** - * Key/value pairs that provide additional information about the tool component. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A string specifying the UTC date (and optionally, the time) of the component's release. - * - * @since 0.12.0 - */ - @Json(name = "releaseDateUtc") - val releaseDateUTC: String? = null, - - /** - * The tool component version in the format specified by Semantic Versioning 2.0. - * - * @since 0.12.0 - */ - @Json(name = "semanticVersion") - val semanticVersion: String? = null, - - /** - * A brief description of the tool component. - * - * @since 0.12.0 - */ - @Json(name = "shortDescription") - val shortDescription: MultiformatMessageString? = null, - - /** - * An array of toolComponentReference objects to declare - * the taxonomies supported by the tool component. - * - * @since 0.12.0 - */ - @Json(name = "supportedTaxonomies") - val supportedTaxonomies: List? = null, - - /** - * An array of reportingDescriptor objects relevant to the - * definitions of both standalone and tool-defined taxonomies. - * - * @since 0.12.0 - */ - @Json(name = "taxa") - val taxa: List? = null, - - /** - * Translation metadata, required for a translation, not populated by other component types. - * - * @since 0.12.0 - */ - @Json(name = "translationMetadata") - val translationMetadata: TranslationMetadata? = null, - - /** - * The tool component version, in whatever format the component natively provides. - * - * @since 0.12.0 - */ - @Json(name = "version") - val version: String? = null, - - /** - * An array of reportingDescriptor objects relevant - * to the analysis performed by the tool component. - * - * @since 0.12.0 - */ - @Json(name = "rules") - val rules: List? = null -) - -enum class Content(val value: String) { - LocalizedData("localizedData"), - NonLocalizedData("nonLocalizedData") -} - -/** - * Metadata that describes a specific report produced by the tool, - * as part of the analysis it provides or its runtime reporting. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class SarifRule( - - /** - * A URI where the primary documentation for the report can be found. - * - * @since 0.12.0 - */ - @Json(name = "helpUri") - val helpURI: String? = null, - - /** - * A stable, opaque identifier for the report. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: String, - - /** - * A report identifier that is understandable to an end user. - * - * @since 0.12.0 - */ - @Json(name = "name") - val name: String? = null, - - /** - * Default reporting configuration information. - * - * @since 0.12.0 - */ - @Json(name = "defaultConfiguration") - val defaultConfiguration: ReportingConfiguration? = null, - - /** - * A concise description of the report. Should be a single sentence that is - * understandable when visible space is limited to a single line of text. - * - * @since 0.12.0 - */ - @Json(name = "shortDescription") - val shortDescription: MultiformatMessageString? = null, - - /** - * A description of the report. Should, as far as possible, provide details - * sufficient to enable resolution of any problem indicated by the result. - * - * @since 0.12.0 - */ - @Json(name = "fullDescription") - val fullDescription: MultiformatMessageString? = null, - - /** - * An array of unique identifies in the form of a GUID by which this - * report was known in some previous version of the analysis tool. - * - * @since 0.12.0 - */ - @Json(name = "deprecatedGuids") - val deprecatedGuids: List? = null, - - /** - * An array of stable, opaque identifiers by which this report - * was known in some previous version of the analysis tool. - * - * @since 0.12.0 - */ - @Json(name = "deprecatedIds") - val deprecatedIDS: List? = null, - - /** - * An array of readable identifiers by which this report - * was known in some previous version of the analysis tool. - * - * @since 0.12.0 - */ - @Json(name = "deprecatedNames") - val deprecatedNames: List? = null, - - /** - * A unique identifer for the reporting descriptor in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * Provides the primary documentation for the report, - * useful when there is no online documentation. - * - * @since 0.12.0 - */ - @Json(name = "help") - val help: MultiformatMessageString? = null, - - /** - * A set of name/value pairs with arbitrary names. Each value is a multiformatMessageString - * object, which holds message strings in plain text and (optionally) Markdown - * format. The strings can include placeholders, which can be used to construct a - * message in combination with an arbitrary number of additional string arguments. - * - * @since 0.12.0 - */ - @Json(name = "messageStrings") - val messageStrings: Map? = null, - - /** - * Key/value pairs that provide additional information about the report. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of objects that describe relationships between this reporting descriptor and others. - * - * @since 0.12.0 - */ - @Json(name = "relationships") - val relationships: List? = null -) - -/** - * Information about the relation of one reporting descriptor to another. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ReportingDescriptorRelationship( - /** - * A description of the reporting descriptor relationship. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * A set of distinct strings that categorize the relationship. Well-known - * kinds include 'canPrecede', 'canFollow', 'willPrecede', 'willFollow', - * 'superset', 'subset', 'equal', 'disjoint', 'relevant', and 'incomparable'. - * - * @since 0.12.0 - */ - @Json(name = "kinds") - val kinds: List? = null, - - /** - * Key/value pairs that provide additional information about the reporting descriptor reference. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A reference to the related reporting descriptor. - * - * @since 0.12.0 - */ - @Json(name = "target") - val target: ReportingDescriptorReference -) - -/** - * Translation metadata, required for a translation, not populated by other component types. - * - * Provides additional metadata related to translation. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class TranslationMetadata( - /** - * The absolute URI from which the translation metadata can be downloaded. - * - * @since 0.12.0 - */ - @Json(name = "downloadUri") - val downloadURI: String? = null, - - /** - * A comprehensive description of the translation metadata. - * - * @since 0.12.0 - */ - @Json(name = "fullDescription") - val fullDescription: MultiformatMessageString? = null, - - /** - * The full name associated with the translation metadata. - * - * @since 0.12.0 - */ - @Json(name = "fullName") - val fullName: String? = null, - - /** - * The absolute URI from which information related to the translation metadata can be downloaded. - * - * @since 0.12.0 - */ - @Json(name = "informationUri") - val informationURI: String? = null, - - /** - * The name associated with the translation metadata. - * - * @since 0.12.0 - */ - @Json(name = "name") - val name: String, - - /** - * Key/value pairs that provide additional information about the translation metadata. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A brief description of the translation metadata. - * - * @since 0.12.0 - */ - @Json(name = "shortDescription") - val shortDescription: MultiformatMessageString? = null -) - -/** - * A network of nodes and directed edges that describes some - * aspect of the structure of the code (for example, a call graph). - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Graph( - /** - * A description of the graph. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * An array of edge objects representing the edges of the graph. - * - * @since 0.12.0 - */ - @Json(name = "edges") - val edges: List? = null, - - /** - * An array of node objects representing the nodes of the graph. - * - * @since 0.12.0 - */ - @Json(name = "nodes") - val nodes: List? = null, - - /** - * Key/value pairs that provide additional information about the graph. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * Represents a directed edge in a graph. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Edge( - /** - * A string that uniquely identifies the edge within its graph. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: String, - - /** - * A short description of the edge. - * - * @since 0.12.0 - */ - @Json(name = "label") - val label: Message? = null, - - /** - * Key/value pairs that provide additional information about the edge. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * Identifies the source node (the node at which the edge starts). - * - * @since 0.12.0 - */ - @Json(name = "sourceNodeId") - val sourceNodeID: String, - - /** - * Identifies the target node (the node at which the edge ends). - * - * @since 0.12.0 - */ - @Json(name = "targetNodeId") - val targetNodeID: String -) - -/** - * Represents a node in a graph. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Node( - /** - * Array of child nodes. - * - * @since 0.12.0 - */ - @Json(name = "children") - val children: List? = null, - - /** - * A string that uniquely identifies the node within its graph. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: String, - - /** - * A short description of the node. - * - * @since 0.12.0 - */ - @Json(name = "label") - val label: Message? = null, - - /** - * A code location associated with the node. - * - * @since 0.12.0 - */ - @Json(name = "location") - val location: Location? = null, - - /** - * Key/value pairs that provide additional information about the node. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * A result produced by an analysis tool. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class SarifResult( - /** - * Identifies the artifact that the analysis tool was instructed to scan. This - * need not be the same as the artifact where the result actually occurred. - * - * @since 0.12.0 - */ - @Json(name = "analysisTarget") - val analysisTarget: ArtifactLocation? = null, - - /** - * A set of artifacts relevant to the result. - * - * @since 0.12.0 - */ - @Json(name = "attachments") - val attachments: List? = null, - - /** - * The state of a result relative to a baseline of a previous run. - * - * @since 0.12.0 - */ - @Json(name = "baselineState") - val baselineState: BaselineState? = null, - - /** - * An array of 'codeFlow' objects relevant to the result. - * - * @since 0.12.0 - */ - @Json(name = "codeFlows") - val codeFlows: List? = null, - - /** - * A stable, unique identifier for the equivalence class of logically - * identical results to which this result belongs, in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "correlationGuid") - val correlationGUID: String? = null, - - /** - * A set of strings each of which individually defines a stable, unique identity for the result. - * - * @since 0.12.0 - */ - @Json(name = "fingerprints") - val fingerprints: Map? = null, - - /** - * An array of 'fix' objects, each of which represents a - * proposed fix to the problem indicated by the result. - * - * @since 0.12.0 - */ - @Json(name = "fixes") - val fixes: List? = null, - - /** - * An array of zero or more unique graph objects associated with the result. - * - * @since 0.12.0 - */ - @Json(name = "graphs") - val graphs: List? = null, - - /** - * An array of one or more unique 'graphTraversal' objects. - * - * @since 0.12.0 - */ - @Json(name = "graphTraversals") - val graphTraversals: List? = null, - - /** - * A stable, unique identifer for the result in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * An absolute URI at which the result can be viewed. - * - * @since 0.12.0 - */ - @Json(name = "hostedViewerUri") - val hostedViewerURI: String? = null, - - /** - * A value that categorizes results by evaluation state. - * - * @since 0.12.0 - */ - @Json(name = "kind") - val kind: ResultKind? = null, - - /** - * A value specifying the severity level of the result. - * - * @since 0.12.0 - */ - @Json(name = "level") - val level: Level? = null, - - /** - * The set of locations where the result was detected. Specify only - * one location unless the problem indicated by the result can only - * be corrected by making a change at every specified location. - * - * @since 0.12.0 - */ - @Json(name = "locations") - val locations: List? = null, - - /** - * A message that describes the result. The first sentence of the - * message only will be displayed when visible space is limited. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message, - - /** - * A positive integer specifying the number of times - * this logically unique result was observed in this run. - * - * @since 0.12.0 - */ - @Json(name = "occurrenceCount") - val occurrenceCount: Int? = null, - - /** - * A set of strings that contribute to the stable, unique identity of the result. - * - * @since 0.12.0 - */ - @Json(name = "partialFingerprints") - val partialFingerprints: Map? = null, - - /** - * Key/value pairs that provide additional information about the result. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * Information about how and when the result was detected. - * - * @since 0.12.0 - */ - @Json(name = "provenance") - val provenance: ResultProvenance? = null, - - /** - * A number representing the priority or importance of the result. - * - * @since 0.12.0 - */ - @Json(name = "rank") - val rank: Double? = null, - - /** - * A set of locations relevant to this result. - * - * @since 0.12.0 - */ - @Json(name = "relatedLocations") - val relatedLocations: List? = null, - - /** - * A reference used to locate the rule descriptor relevant to this result. - * - * @since 0.12.0 - */ - @Json(name = "rule") - val rule: ReportingDescriptorReference? = null, - - /** - * The stable, unique identifier of the rule, if any, to which this notification is relevant. - * This member can be used to retrieve rule metadata from the rules dictionary, if it exists. - * - * @since 0.12.0 - */ - @Json(name = "ruleId") - val ruleID: String? = null, - - /** - * The index within the tool component rules array of the rule object associated with this result. - * - * @since 0.12.0 - */ - @Json(name = "ruleIndex") - val ruleIndex: Int? = null, - - /** - * An array of 'stack' objects relevant to the result. - * - * @since 0.12.0 - */ - @Json(name = "stacks") - val stacks: List? = null, - - /** - * A set of suppressions relevant to this result. - * - * @since 0.12.0 - */ - @Json(name = "suppressions") - val suppressions: List? = null, - - /** - * An array of references to taxonomy reporting descriptors that are applicable to the result. - * - * @since 0.12.0 - */ - @Json(name = "taxa") - val taxa: List? = null, - - /** - * A web request associated with this result. - * - * @since 0.12.0 - */ - @Json(name = "webRequest") - val webRequest: WebRequest? = null, - - /** - * A web response associated with this result. - * - * @since 0.12.0 - */ - @Json(name = "webResponse") - val webResponse: WebResponse? = null, - - /** - * The URIs of the work items associated with this result. - * - * @since 0.12.0 - */ - @Json(name = "workItemUris") - val workItemUris: List? = null -) - -/** - * An artifact relevant to a result. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Attachment( - /** - * The location of the attachment. - * - * @since 0.12.0 - */ - @Json(name = "artifactLocation") - val artifactLocation: ArtifactLocation, - - /** - * A message describing the role played by the attachment. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * Key/value pairs that provide additional information about the attachment. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of rectangles specifying areas of interest within the image. - * - * @since 0.12.0 - */ - @Json(name = "rectangles") - val rectangles: List? = null, - - /** - * An array of regions of interest within the attachment. - * - * @since 0.12.0 - */ - @Json(name = "regions") - val regions: List? = null -) - -/** - * An area within an image. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Rectangle( - /** - * The Y coordinate of the bottom edge of the rectangle, measured in the image's natural units. - * - * @since 0.12.0 - */ - @Json(name = "bottom") - val bottom: Double? = null, - - /** - * The X coordinate of the left edge of the rectangle, measured in the image's natural units. - * - * @since 0.12.0 - */ - @Json(name = "left") - val left: Double? = null, - - /** - * A message relevant to the rectangle. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message? = null, - - /** - * Key/value pairs that provide additional information about the rectangle. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The X coordinate of the right edge of the rectangle, measured in the image's natural units. - * - * @since 0.12.0 - */ - @Json(name = "right") - val right: Double? = null, - - /** - * The Y coordinate of the top edge of the rectangle, measured in the image's natural units. - * - * @since 0.12.0 - */ - @Json(name = "top") - val top: Double? = null -) - -/** - * The state of a result relative to a baseline of a previous run. - * - * @since 0.12.0 - */ -enum class BaselineState(val value: String) { - Absent("absent"), - New("new"), - Unchanged("unchanged"), - Updated("updated") -} - -/** - * A set of threadFlows which together describe a pattern - * of code execution relevant to detecting a result. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class CodeFlow( - /** - * A message relevant to the code flow. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message? = null, - - /** - * Key/value pairs that provide additional information about the code flow. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of one or more unique threadFlow objects, each of which - * describes the progress of a program through a thread of execution. - * - * @since 0.12.0 - */ - @Json(name = "threadFlows") - val threadFlows: List -) - -/** - * Describes a sequence of code locations that specify a path through - * a single thread of execution such as an operating system or fiber. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ThreadFlow( - /** - * An string that uniquely identifies the threadFlow within the codeFlow in which it occurs. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: String? = null, - - /** - * Values of relevant expressions at the start of the thread flow that remain constant. - * - * @since 0.12.0 - */ - @Json(name = "immutableState") - val immutableState: Map? = null, - - /** - * Values of relevant expressions at the start of the - * thread flow that may change during thread flow execution. - * - * @since 0.12.0 - */ - @Json(name = "initialState") - val initialState: Map? = null, - - /** - * A temporally ordered array of 'threadFlowLocation' objects, each of which - * describes a location visited by the tool while producing the result. - * - * @since 0.12.0 - */ - @Json(name = "locations") - val locations: List, - - /** - * A message relevant to the thread flow. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message? = null, - - /** - * Key/value pairs that provide additional information about the thread flow. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * A location visited by an analysis tool while simulating or monitoring the execution of a program. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ThreadFlowLocation( - /** - * An integer representing the temporal order in which execution reached this location. - * - * @since 0.12.0 - */ - @Json(name = "executionOrder") - val executionOrder: Int? = null, - - /** - * The Coordinated Universal Time (UTC) date and time at which this location was executed. - * - * @since 0.12.0 - */ - @Json(name = "executionTimeUtc") - val executionTimeUTC: String? = null, - - /** - * Specifies the importance of this location in understanding the code - * flow in which it occurs. The order from most to least important - * is "essential", "important", "unimportant". Default: "important". - * - * @since 0.12.0 - */ - @Json(name = "importance") - val importance: Importance? = null, - - /** - * The index within the run threadFlowLocations array. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * A set of distinct strings that categorize the thread flow location. Well-known - * kinds include 'acquire', 'release', 'enter', 'exit', 'call', 'return', 'branch', - * 'implicit', 'false', 'true', 'caution', 'danger', 'unknown', 'unreachable', - * 'taint', 'function', 'handler', 'lock', 'memory', 'resource', 'scope' and 'value'. - * - * @since 0.12.0 - */ - @Json(name = "kinds") - val kinds: List? = null, - - /** - * The code location. - * - * @since 0.12.0 - */ - @Json(name = "location") - val location: Location? = null, - - /** - * The name of the module that contains the code that is executing. - * - * @since 0.12.0 - */ - @Json(name = "module") - val module: String? = null, - - /** - * An integer representing a containment hierarchy within the thread flow. - * - * @since 0.12.0 - */ - @Json(name = "nestingLevel") - val nestingLevel: Int? = null, - - /** - * Key/value pairs that provide additional information about the threadflow location. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The call stack leading to this location. - * - * @since 0.12.0 - */ - @Json(name = "stack") - val stack: Stack? = null, - - /** - * A dictionary, each of whose keys specifies a variable or expression, the - * associated value of which represents the variable or expression value. - * For an annotation of kind 'continuation', for example, this dictionary - * might hold the current assumed values of a set of global variables. - * - * @since 0.12.0 - */ - @Json(name = "state") - val state: Map? = null, - - /** - * An array of references to rule or taxonomy reporting - * descriptors that are applicable to the thread flow location. - * - * @since 0.12.0 - */ - @Json(name = "taxa") - val taxa: List? = null, - - /** - * A web request associated with this thread flow location. - * - * @since 0.12.0 - */ - @Json(name = "webRequest") - val webRequest: WebRequest? = null, - - /** - * A web response associated with this thread flow location. - * - * @since 0.12.0 - */ - @Json(name = "webResponse") - val webResponse: WebResponse? = null -) - -/** - * Specifies the importance of this location in understanding the code - * flow in which it occurs. The order from most to least important - * is "essential", "important", "unimportant". Default: "important". - * - * @since 0.12.0 - */ -enum class Importance(val value: String) { - Essential("essential"), - Important("important"), - Unimportant("unimportant") -} - -/** - * A web request associated with this thread flow location. - * - * Describes an HTTP request. - * - * A web request associated with this result. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class WebRequest( - /** - * The body of the request. - * - * @since 0.12.0 - */ - @Json(name = "body") - val body: ArtifactContent? = null, - - /** - * The request headers. - * - * @since 0.12.0 - */ - @Json(name = "headers") - val headers: Map? = null, - - /** - * The index within the run.webRequests array of the request object associated with this result. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * The HTTP method. Well-known values are 'GET', 'PUT', 'POST', - * 'DELETE', 'PATCH', 'HEAD', 'OPTIONS', 'TRACE', 'CONNECT'. - * - * @since 0.12.0 - */ - @Json(name = "method") - val method: String? = null, - - /** - * The request parameters. - * - * @since 0.12.0 - */ - @Json(name = "parameters") - val parameters: Map? = null, - - /** - * Key/value pairs that provide additional information about the request. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The request protocol. Example: 'http'. - * - * @since 0.12.0 - */ - @Json(name = "protocol") - val protocol: String? = null, - - /** - * The target of the request. - * - * @since 0.12.0 - */ - @Json(name = "target") - val target: String? = null, - - /** - * The request version. Example: '1.1'. - * - * @since 0.12.0 - */ - @Json(name = "version") - val version: String? = null -) - -/** - * A web response associated with this thread flow location. - * - * Describes the response to an HTTP request. - * - * A web response associated with this result. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class WebResponse( - /** - * The body of the response. - * - * @since 0.12.0 - */ - @Json(name = "body") - val body: ArtifactContent? = null, - - /** - * The response headers. - * - * @since 0.12.0 - */ - @Json(name = "headers") - val headers: Map? = null, - - /** - * The index within the run.webResponses array of the response object associated with this result. - * - * @since 0.12.0 - */ - @Json(name = "index") - val index: Int? = null, - - /** - * Specifies whether a response was received from the server. - * - * @since 0.12.0 - */ - @Json(name = "noResponseReceived") - val noResponseReceived: Boolean? = null, - - /** - * Key/value pairs that provide additional information about the response. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The response protocol. Example: 'http'. - * - * @since 0.12.0 - */ - @Json(name = "protocol") - val protocol: String? = null, - - /** - * The response reason. Example: 'Not found'. - * - * @since 0.12.0 - */ - @Json(name = "reasonPhrase") - val reasonPhrase: String? = null, - - /** - * The response status code. Example: 451. - * - * @since 0.12.0 - */ - @Json(name = "statusCode") - val statusCode: Int? = null, - - /** - * The response version. Example: '1.1'. - * - * @since 0.12.0 - */ - @Json(name = "version") - val version: String? = null -) - -/** - * A proposed fix for the problem represented by a result object. A fix - * specifies a set of artifacts to modify. For each artifact, it specifies a - * set of bytes to remove, and provides a set of new bytes to replace them. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Fix( - /** - * One or more artifact changes that comprise a fix for a result. - * - * @since 0.12.0 - */ - @Json(name = "artifactChanges") - val artifactChanges: List, - - /** - * A message that describes the proposed fix, enabling - * viewers to present the proposed change to an end user. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * Key/value pairs that provide additional information about the fix. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * A change to a single artifact. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ArtifactChange( - /** - * The location of the artifact to change. - * - * @since 0.12.0 - */ - @Json(name = "artifactLocation") - val artifactLocation: ArtifactLocation, - - /** - * Key/value pairs that provide additional information about the change. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of replacement objects, each of which represents the replacement - * of a single region in a single artifact specified by 'artifactLocation'. - * - * @since 0.12.0 - */ - @Json(name = "replacements") - val replacements: List -) - -/** - * The replacement of a single region of an artifact. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Replacement( - /** - * The region of the artifact to delete. - * - * @since 0.12.0 - */ - @Json(name = "deletedRegion") - val deletedRegion: Region, - - /** - * The content to insert at the location specified by the 'deletedRegion' property. - * - * @since 0.12.0 - */ - @Json(name = "insertedContent") - val insertedContent: ArtifactContent? = null, - - /** - * Key/value pairs that provide additional information about the replacement. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * Represents a path through a graph. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class GraphTraversal( - /** - * A description of this graph traversal. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * The sequences of edges traversed by this graph traversal. - * - * @since 0.12.0 - */ - @Json(name = "edgeTraversals") - val edgeTraversals: List? = null, - - /** - * Values of relevant expressions at the start of the graph - * traversal that remain constant for the graph traversal. - * - * @since 0.12.0 - */ - @Json(name = "immutableState") - val immutableState: Map? = null, - - /** - * Values of relevant expressions at the start of the - * graph traversal that may change during graph traversal. - * - * @since 0.12.0 - */ - @Json(name = "initialState") - val initialState: Map? = null, - - /** - * Key/value pairs that provide additional information about the graph traversal. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The index within the result.graphs to be associated with the result. - * - * @since 0.12.0 - */ - @Json(name = "resultGraphIndex") - val resultGraphIndex: Int? = null, - - /** - * The index within the run.graphs to be associated with the result. - * - * @since 0.12.0 - */ - @Json(name = "runGraphIndex") - val runGraphIndex: Int? = null -) - -/** - * Represents the traversal of a single edge during a graph traversal. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class EdgeTraversal( - /** - * Identifies the edge being traversed. - * - * @since 0.12.0 - */ - @Json(name = "edgeId") - val edgeID: String, - - /** - * The values of relevant expressions after the edge has been traversed. - * - * @since 0.12.0 - */ - @Json(name = "finalState") - val finalState: Map? = null, - - /** - * A message to display to the user as the edge is traversed. - * - * @since 0.12.0 - */ - @Json(name = "message") - val message: Message? = null, - - /** - * Key/value pairs that provide additional information about the edge traversal. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The number of edge traversals necessary to return from a nested graph. - * - * @since 0.12.0 - */ - @Json(name = "stepOverEdgeCount") - val stepOverEdgeCount: Int? = null -) - -/** - * A value that categorizes results by evaluation state. - * - * @since 0.12.0 - */ -enum class ResultKind(val value: String) { - Fail("fail"), - Informational("informational"), - NotApplicable("notApplicable"), - Open("open"), - Pass("pass"), - Review("review") -} - -/** - * Information about how and when the result was detected. - * - * Contains information about how and when a result was detected. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ResultProvenance( - /** - * An array of physicalLocation objects which specify the portions of an - * analysis tool's output that a converter transformed into the result. - * - * @since 0.12.0 - */ - @Json(name = "conversionSources") - val conversionSources: List? = null, - - /** - * A GUID-valued string equal to the automationDetails.guid - * property of the run in which the result was first detected. - * - * @since 0.12.0 - */ - @Json(name = "firstDetectionRunGuid") - val firstDetectionRunGUID: String? = null, - - /** - * The Coordinated Universal Time (UTC) date and time at which the result was first - * detected. See "Date/time properties" in the SARIF spec for the required format. - * - * @since 0.12.0 - */ - @Json(name = "firstDetectionTimeUtc") - val firstDetectionTimeUTC: String? = null, - - /** - * The index within the run.invocations array of the invocation object - * which describes the tool invocation that detected the result. - * - * @since 0.12.0 - */ - @Json(name = "invocationIndex") - val invocationIndex: Int? = null, - - /** - * A GUID-valued string equal to the automationDetails.guid property - * of the run in which the result was most recently detected. - * - * @since 0.12.0 - */ - @Json(name = "lastDetectionRunGuid") - val lastDetectionRunGUID: String? = null, - - /** - * The Coordinated Universal Time (UTC) date and time at which the result was most - * recently detected. See "Date/time properties" in the SARIF spec for the required format. - * - * @since 0.12.0 - */ - @Json(name = "lastDetectionTimeUtc") - val lastDetectionTimeUTC: String? = null, - - /** - * Key/value pairs that provide additional information about the result. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * A suppression that is relevant to a result. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Suppression( - /** - * A stable, unique identifer for the suprression in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * A string representing the justification for the suppression. - * - * @since 0.12.0 - */ - @Json(name = "justification") - val justification: String? = null, - - /** - * A string that indicates where the suppression is persisted. - * - * @since 0.12.0 - */ - @Json(name = "kind") - val kind: SuppressionKind, - - /** - * Identifies the location associated with the suppression. - * - * @since 0.12.0 - */ - @Json(name = "location") - val location: Location? = null, - - /** - * Key/value pairs that provide additional information about the suppression. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * A string that indicates the state of the suppression. - * - * @since 0.12.0 - */ - @Json(name = "state") - val state: State? = null -) - -/** - * A string that indicates where the suppression is persisted. - * - * @since 0.12.0 - */ -enum class SuppressionKind { - @Json(name = "external") - External, - - @Json(name = "inSource") - InSource -} - -/** - * A string that indicates the state of the suppression. - * - * @since 0.12.0 - */ -enum class State { - @Json(name = "accepted") - Accepted, - - @Json(name = "rejected") - Rejected, - - @Json(name = "underReview") - UnderReview -} - -/** - * The SARIF format version of this external properties object. - * - * The SARIF format version of this log file. - * - * @since 0.12.0 - */ -enum class Version { - @Json(name = "2.1.0") - The210 -} - -/** - * Describes a single run of an analysis tool, and contains the reported output of that run. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class Run( - /** - * Addresses associated with this run instance, if any. - * - * @since 0.12.0 - */ - @Json(name = "addresses") - val addresses: List
? = null, - - /** - * An array of artifact objects relevant to the run. - * - * @since 0.12.0 - */ - @Json(name = "artifacts") - val artifacts: List? = null, - - /** - * Automation details that describe this run. - * - * @since 0.12.0 - */ - @Json(name = "automationDetails") - val automationDetails: RunAutomationDetails? = null, - - /** - * The 'guid' property of a previous SARIF 'run' that comprises the baseline - * that was used to compute result 'baselineState' properties for the run. - * - * @since 0.12.0 - */ - @Json(name = "baselineGuid") - val baselineGUID: String? = null, - - /** - * Specifies the unit in which the tool measures columns. - * - * @since 0.12.0 - */ - @Json(name = "columnKind") - val columnKind: ColumnKind? = null, - - /** - * A conversion object that describes how a converter transformed - * an analysis tool's native reporting format into the SARIF format. - * - * @since 0.12.0 - */ - @Json(name = "conversion") - val conversion: Conversion? = null, - - /** - * Specifies the default encoding for any artifact object that refers to a text file. - * - * @since 0.12.0 - */ - @Json(name = "defaultEncoding") - val defaultEncoding: String? = null, - - /** - * Specifies the default source language for any artifact - * object that refers to a text file that contains source code. - * - * @since 0.12.0 - */ - @Json(name = "defaultSourceLanguage") - val defaultSourceLanguage: String? = null, - - /** - * References to external property files that should - * be inlined with the content of a root log file. - * - * @since 0.12.0 - */ - @Json(name = "externalPropertyFileReferences") - val externalPropertyFileReferences: ExternalPropertyFileReferences? = null, - - /** - * An array of zero or more unique graph objects associated with the run. - * - * @since 0.12.0 - */ - @Json(name = "graphs") - val graphs: List? = null, - - /** - * Describes the invocation of the analysis tool. - * - * @since 0.12.0 - */ - @Json(name = "invocations") - val invocations: List? = null, - - /** - * The language of the messages emitted into the log file during this run (expressed as an - * ISO 639-1 two-letter lowercase culture code) and an optional region (expressed as an ISO - * 3166-1 two-letter uppercase subculture code associated with a country or region). The - * casing is recommended but not required (in order for this data to conform to RFC5646). - * - * @since 0.12.0 - */ - @Json(name = "language") - val language: String? = null, - - /** - * An array of logical locations such as namespaces, types or functions. - * - * @since 0.12.0 - */ - @Json(name = "logicalLocations") - val logicalLocations: List? = null, - - /** - * An ordered list of character sequences that were treated as - * line breaks when computing region information for the run. - * - * @since 0.12.0 - */ - @Json(name = "newlineSequences") - val newlineSequences: List? = null, - - /** - * The artifact location specified by each uriBaseId - * symbol on the machine where the tool originally ran. - * - * @since 0.12.0 - */ - @Json(name = "originalUriBaseIds") - val originalURIBaseIDS: Map? = null, - - /** - * Contains configurations that may potentially override both - * reportingDescriptor.defaultConfiguration (the tool's default severities) and - * invocation.configurationOverrides (severities established at run-time from the command line). - * - * @since 0.12.0 - */ - @Json(name = "policies") - val policies: List? = null, - - /** - * Key/value pairs that provide additional information about the run. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of strings used to replace sensitive information in a redaction-aware property. - * - * @since 0.12.0 - */ - @Json(name = "redactionTokens") - val redactionTokens: List? = null, - - /** - * The set of results contained in an SARIF log. The results array can - * be omitted when a run is solely exporting rules metadata. It must be - * present (but may be empty) if a log file represents an actual scan. - * - * @since 0.12.0 - */ - @Json(name = "results") - val results: List? = null, - - /** - * Automation details that describe the aggregate of runs to which this run belongs. - * - * @since 0.12.0 - */ - @Json(name = "runAggregates") - val runAggregates: List? = null, - - /** - * A specialLocations object that defines locations of special significance to SARIF consumers. - * - * @since 0.12.0 - */ - @Json(name = "specialLocations") - val specialLocations: SpecialLocations? = null, - - /** - * An array of toolComponent objects relevant to a taxonomy in which results are categorized. - * - * @since 0.12.0 - */ - @Json(name = "taxonomies") - val taxonomies: List? = null, - - /** - * An array of threadFlowLocation objects cached at run level. - * - * @since 0.12.0 - */ - @Json(name = "threadFlowLocations") - val threadFlowLocations: List? = null, - - /** - * Information about the tool or tool pipeline that generated the results in this run. - * A run can only contain results produced by a single tool or tool pipeline. A run can - * aggregate results from multiple log files, as long as context around the tool run - * (tool command-line arguments and the like) is identical for all aggregated files. - * - * @since 0.12.0 - */ - @Json(name = "tool") - val tool: Tool, - - /** - * The set of available translations of the localized data provided by the tool. - * - * @since 0.12.0 - */ - @Json(name = "translations") - val translations: List? = null, - - /** - * Specifies the revision in version control of the artifacts that were scanned. - * - * @since 0.12.0 - */ - @Json(name = "versionControlProvenance") - val versionControlProvenance: List? = null, - - /** - * An array of request objects cached at run level. - * - * @since 0.12.0 - */ - @Json(name = "webRequests") - val webRequests: List? = null, - - /** - * An array of response objects cached at run level. - * - * @since 0.12.0 - */ - @Json(name = "webResponses") - val webResponses: List? = null -) - -/** - * Automation details that describe this run. - * - * Information that describes a run's identity and role within an engineering system process. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class RunAutomationDetails( - /** - * A stable, unique identifier for the equivalence class of runs to which - * this object's containing run object belongs in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "correlationGuid") - val correlationGUID: String? = null, - - /** - * A description of the identity and role played within the - * engineering system by this object's containing run object. - * - * @since 0.12.0 - */ - @Json(name = "description") - val description: Message? = null, - - /** - * A stable, unique identifer for this object's containing run object in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * A hierarchical string that uniquely identifies this object's containing run object. - * - * @since 0.12.0 - */ - @Json(name = "id") - val id: String? = null, - - /** - * Key/value pairs that provide additional information about the run automation details. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * Specifies the unit in which the tool measures columns. - * - * @since 0.12.0 - */ -enum class ColumnKind(val value: String) { - UnicodeCodePoints("unicodeCodePoints"), - Utf16CodeUnits("utf16CodeUnits") -} - -/** - * References to external property files that should be inlined with the content of a root log file. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ExternalPropertyFileReferences( - /** - * An array of external property files containing - * run.addresses array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "addresses") - val addresses: List? = null, - - /** - * An array of external property files containing - * run.artifacts array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "artifacts") - val artifacts: List? = null, - - /** - * An external property file containing a run.conversion - * object to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "conversion") - val conversion: ExternalPropertyFileReference? = null, - - /** - * An external property file containing a run.driver object to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "driver") - val driver: ExternalPropertyFileReference? = null, - - /** - * An array of external property files containing - * run.extensions array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "extensions") - val extensions: List? = null, - - /** - * An external property file containing a run.properties - * object to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "externalizedProperties") - val externalizedProperties: ExternalPropertyFileReference? = null, - - /** - * An array of external property files containing a - * run.graphs object to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "graphs") - val graphs: List? = null, - - /** - * An array of external property files containing - * run.invocations array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "invocations") - val invocations: List? = null, - - /** - * An array of external property files containing - * run.logicalLocations array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "logicalLocations") - val logicalLocations: List? = null, - - /** - * An array of external property files containing - * run.policies array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "policies") - val policies: List? = null, - - /** - * Key/value pairs that provide additional information about the external property files. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * An array of external property files containing - * run.results array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "results") - val results: List? = null, - - /** - * An array of external property files containing - * run.taxonomies array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "taxonomies") - val taxonomies: List? = null, - - /** - * An array of external property files containing - * run.threadFlowLocations array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "threadFlowLocations") - val threadFlowLocations: List? = null, - - /** - * An array of external property files containing - * run.translations array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "translations") - val translations: List? = null, - - /** - * An array of external property files containing - * run.requests array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "webRequests") - val webRequests: List? = null, - - /** - * An array of external property files containing - * run.responses array to be merged with the root log file. - * - * @since 0.12.0 - */ - @Json(name = "webResponses") - val webResponses: List? = null -) - -/** - * An external property file containing a run.conversion object to be merged with the root log file. - * - * An external property file containing a run.driver object to be merged with the root log file. - * - * An external property file containing a run.properties object to be merged with the root log file. - * - * Contains information that enables a SARIF consumer to locate the external property - * file that contains the value of an externalized property associated with the run. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class ExternalPropertyFileReference( - /** - * A stable, unique identifer for the external property file in the form of a GUID. - * - * @since 0.12.0 - */ - @Json(name = "guid") - val guid: String? = null, - - /** - * A non-negative integer specifying the number of items contained in the external property file. - * - * @since 0.12.0 - */ - @Json(name = "itemCount") - val itemCount: Int? = null, - - /** - * The location of the external property file. - * - * @since 0.12.0 - */ - @Json(name = "location") - val location: ArtifactLocation? = null, - - /** - * Key/value pairs that provide additional information about the external property file. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * A specialLocations object that defines locations of special significance to SARIF consumers. - * - * Defines locations of special significance to SARIF consumers. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class SpecialLocations( - /** - * Provides a suggestion to SARIF consumers to display - * file paths relative to the specified location. - * - * @since 0.12.0 - */ - @Json(name = "displayBase") - val displayBase: ArtifactLocation? = null, - - /** - * Key/value pairs that provide additional information about the special locations. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null -) - -/** - * Specifies the information necessary to retrieve a desired revision from a version control system. - * - * @since 0.12.0 - */ -@JsonClass(generateAdapter = true) -data class VersionControlDetails( - /** - * A Coordinated Universal Time (UTC) date and time that can be used to - * synchronize an enlistment to the state of the repository at that time. - * - * @since 0.12.0 - */ - @Json(name = "asOfTimeUtc") - val asOfTimeUTC: String? = null, - - /** - * The name of a branch containing the revision. - * - * @since 0.12.0 - */ - @Json(name = "branch") - val branch: String? = null, - - /** - * The location in the local file system to which the root - * of the repository was mapped at the time of the analysis. - * - * @since 0.12.0 - */ - @Json(name = "mappedTo") - val mappedTo: ArtifactLocation? = null, - - /** - * Key/value pairs that provide additional information about the version control details. - * - * @since 0.12.0 - */ - @Json(name = "properties") - val properties: PropertyBag? = null, - - /** - * The absolute URI of the repository. - * - * @since 0.12.0 - */ - @Json(name = "repositoryUri") - val repositoryURI: String, - - /** - * A string that uniquely and permanently identifies the revision within the repository. - * - * @since 0.12.0 - */ - @Json(name = "revisionId") - val revisionID: String? = null, - - /** - * A tag that has been applied to the revision. - * - * @since 0.12.0 - */ - @Json(name = "revisionTag") - val revisionTag: String? = null -) diff --git a/modulecheck-reporting/sarif/src/main/kotlin/modulecheck/reporting/sarif/SarifReportFactory.kt b/modulecheck-reporting/sarif/src/main/kotlin/modulecheck/reporting/sarif/SarifReportFactory.kt deleted file mode 100644 index 308b221567..0000000000 --- a/modulecheck-reporting/sarif/src/main/kotlin/modulecheck/reporting/sarif/SarifReportFactory.kt +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.sarif - -import com.squareup.moshi.Moshi -import com.squareup.moshi.adapter -import modulecheck.dagger.ModuleCheckVersionProvider -import modulecheck.dagger.SourceWebsiteUrlProvider -import modulecheck.finding.Finding -import modulecheck.project.ProjectRoot -import modulecheck.reporting.sarif.Level.Warning -import modulecheck.rule.ModuleCheckRule -import modulecheck.utils.suffixIfNot -import java.io.File -import javax.inject.Inject -import kotlin.math.max -import kotlin.math.min - -class SarifReportFactory @Inject constructor( - private val websiteUrl: SourceWebsiteUrlProvider, - private val moduleCheckVersion: ModuleCheckVersionProvider, - private val projectRoot: ProjectRoot -) { - - fun create(findingResults: List, rules: List>): String { - - val sarifRules = rules.map { rule -> - rule.toSarifRule() - } - .sortedBy { it.name } - - val driver = SarifDriver( - name = "ModuleCheck", - fullName = "ModuleCheck", - version = moduleCheckVersion.get(), - semanticVersion = moduleCheckVersion.get(), - informationURI = websiteUrl.get().suffixIfNot("/"), - rules = sarifRules - ) - - val results = findingResults.map { findingResult -> - SarifResult( - ruleID = "modulecheck.${findingResult.findingName.id}", - level = Level.Warning, - message = Message(text = findingResult.message), - locations = listOf( - Location( - physicalLocation = PhysicalLocation( - artifactLocation = ArtifactLocation( - uri = findingResult.buildFile.relativeTo(projectRoot.get()).path, - uriBaseID = projectRoot.get().absolutePath.suffixIfNot(File.separator) - ), - // Extra area to be included in a code snippet, to show context. - contextRegion = findingResult.positionOrNull - ?.let { position -> - @Suppress("MagicNumber") - Region( - // these values are 1-indexed, instead of zero-indexed - // Add up to 3 lines of context on either side where possible - startLine = max(position.row - 3, 1), - endLine = min( - position.row + 3, - findingResult.buildFile.readText().lines().size - ) - ) - }, - region = Region( - startLine = findingResult.positionOrNull?.row, - startColumn = findingResult.positionOrNull?.column - ) - ) - ) - ) - ) - } - - val tool = Tool(driver = driver) - - val run = Run( - tool = tool, - results = results - ) - - val sarifReport = SarifReport( - schema = "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0.json", - version = Version.The210, - runs = listOf(run) - ) - - val moshi = Moshi.Builder().build() - - return moshi.adapter().indent(" ").toJson(sarifReport) - } - - private fun ModuleCheckRule<*>.toSarifRule() = SarifRule( - id = "modulecheck.${name.id}", - name = name.titleCase, - shortDescription = MultiformatMessageString(text = description), - fullDescription = MultiformatMessageString(text = description), - defaultConfiguration = ReportingConfiguration(level = Warning), - helpURI = documentationUrl - ) -} diff --git a/modulecheck-reporting/sarif/src/test/kotlin/modulecheck/reporting/sarif/SarifReportTest.kt b/modulecheck-reporting/sarif/src/test/kotlin/modulecheck/reporting/sarif/SarifReportTest.kt deleted file mode 100644 index d8d9704116..0000000000 --- a/modulecheck-reporting/sarif/src/test/kotlin/modulecheck/reporting/sarif/SarifReportTest.kt +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.reporting.sarif - -import com.rickbusarow.kase.files.relativePath -import io.kotest.assertions.asClue -import io.kotest.matchers.string.shouldContain -import modulecheck.config.fake.TestChecksSettings -import modulecheck.config.fake.TestSettings -import modulecheck.finding.FindingName -import modulecheck.finding.UnusedDependencyFinding -import modulecheck.model.dependency.ConfigurationName -import modulecheck.model.dependency.ProjectDependency.RuntimeProjectDependency -import modulecheck.runtime.test.RunnerTest -import modulecheck.runtime.test.RunnerTestEnvironment -import modulecheck.testing.alwaysUnixFileSeparators -import modulecheck.utils.suffixIfNot -import org.junit.jupiter.api.Test -import java.io.File - -@Suppress("BlockingMethodInNonBlockingContext") -class SarifReportTest : RunnerTest() { - - override val settings: RunnerTestEnvironment.() -> TestSettings = { - TestSettings( - checks = TestChecksSettings( - redundantDependency = true, - unusedDependency = true, - overShotDependency = true, - mustBeApi = true, - inheritedDependency = true, - sortDependencies = true, - sortPlugins = true, - unusedKapt = true, - anvilFactoryGeneration = true, - disableAndroidResources = true, - disableViewBinding = true, - unusedKotlinAndroidExtensions = true, - depths = true - ) - ) - } - - @Test - fun `report with unused dependency`() = test { - - val factory = SarifReportFactory( - websiteUrl = { "https://rbusarow.github.io/ModuleCheck" }, - moduleCheckVersion = { "0.12.1-SNAPSHOT" } - ) { workingDir } - - val p1 = kotlinProject(":lib1") - val p2 = kotlinProject(":lib2") { - buildFile { - """ - dependencies { - api(project(":lib1")) - } - """ - } - } - - val finding = UnusedDependencyFinding( - findingName = FindingName("unused-dependency"), - dependentProject = p2, - oldDependency = RuntimeProjectDependency(ConfigurationName.api, p1.projectPath, false), - dependencyIdentifier = p1.projectPath.value, - configurationName = ConfigurationName.api - ).toResult(true) - - val reportString = factory.create( - findingResults = listOf(finding), - rules = rules - ) - - val expected = this::class.java.classLoader - .getResourceAsStream("sarif_report_with_unused_dependency_finding.sarif.json")!! - .readAllBytes() - .decodeToString() - .also { fromFile -> - - """Couldn't find any `${"$"}TEST_DIR` tokens to replace. - |Be sure to replace any hard-coded absolute paths with `${'$'}TEST_DIR` so that this test will pass on other machines. - """.trimMargin() - .asClue { - fromFile shouldContain "\$TEST_DIR" - } - } - .replace("\$TEST_DIR", workingDir.path) - - val normalizedReport = reportString - .replace( - p2.buildFile.relativePath() - .removePrefix(File.separator) - .replace(File.separator, "${Regex.escape(File.separator)}+") - .toRegex(), - p2.buildFile.relativePath() - .removePrefix(File.separator) - .alwaysUnixFileSeparators() - ) - .replace( - workingDir.absolutePath - .suffixIfNot(File.separator) - .replace(File.separator, "${Regex.escape(File.separator)}+") - .toRegex(), - workingDir.absolutePath - .suffixIfNot(File.separator) - .alwaysUnixFileSeparators() - ).useRelativePaths() - - normalizedReport shouldBe expected.useRelativePaths() - } -} diff --git a/modulecheck-reporting/sarif/src/test/resources/sarif_report_with_unused_dependency_finding.sarif.json b/modulecheck-reporting/sarif/src/test/resources/sarif_report_with_unused_dependency_finding.sarif.json deleted file mode 100644 index fe139eeedf..0000000000 --- a/modulecheck-reporting/sarif/src/test/resources/sarif_report_with_unused_dependency_finding.sarif.json +++ /dev/null @@ -1,242 +0,0 @@ -{ - "$schema": "https://schemastore.azurewebsites.net/schemas/json/sarif-2.1.0.json", - "version": "2.1.0", - "runs": [ - { - "results": [ - { - "level": "warning", - "locations": [ - { - "physicalLocation": { - "artifactLocation": { - "uri": "lib2/build.gradle.kts", - "uriBaseId": "$TEST_DIR/" - }, - "contextRegion": { - "endLine": 3, - "startLine": 1 - }, - "region": { - "startColumn": 3, - "startLine": 2 - } - } - } - ], - "message": { - "text": "The declared dependency `api(\":lib1\")` is not used in this module." - }, - "ruleId": "modulecheck.unused-dependency" - } - ], - "tool": { - "driver": { - "fullName": "ModuleCheck", - "informationUri": "https://rbusarow.github.io/ModuleCheck/", - "name": "ModuleCheck", - "semanticVersion": "0.12.1-SNAPSHOT", - "version": "0.12.1-SNAPSHOT", - "rules": [ - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/disable_android_resources", - "id": "modulecheck.disable-android-resources", - "name": "DisableAndroidResources", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds modules which have android resources R file generation enabled, but don't actually use any resources from the module" - }, - "fullDescription": { - "text": "Finds modules which have android resources R file generation enabled, but don't actually use any resources from the module" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/disable_view_binding", - "id": "modulecheck.disable-view-binding", - "name": "DisableViewBinding", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds modules which have ViewBinding enabled, but don't actually use any generated ViewBinding objects from that module" - }, - "fullDescription": { - "text": "Finds modules which have ViewBinding enabled, but don't actually use any generated ViewBinding objects from that module" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/inherited_dependency", - "id": "modulecheck.inherited-dependency", - "name": "InheritedDependency", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds project dependencies which are used in the current module, but are not actually directly declared as dependencies in the current module" - }, - "fullDescription": { - "text": "Finds project dependencies which are used in the current module, but are not actually directly declared as dependencies in the current module" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/must_be_api", - "id": "modulecheck.must-be-api", - "name": "MustBeApi", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds project dependencies which are exposed by the module as part of its public ABI, but are only added as runtimeOnly, compileOnly, or implementation" - }, - "fullDescription": { - "text": "Finds project dependencies which are exposed by the module as part of its public ABI, but are only added as runtimeOnly, compileOnly, or implementation" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/overshot_dependency", - "id": "modulecheck.overshot-dependency", - "name": "OvershotDependency", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds project dependencies which aren't used by the declaring configuration, but are used by a dependent configuration." - }, - "fullDescription": { - "text": "Finds project dependencies which aren't used by the declaring configuration, but are used by a dependent configuration." - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/project_depth", - "id": "modulecheck.project-depth", - "name": "ProjectDepth", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "The longest path between this module and its leaf nodes" - }, - "fullDescription": { - "text": "The longest path between this module and its leaf nodes" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/redundant_dependency", - "id": "modulecheck.redundant-dependency", - "name": "RedundantDependency", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds project dependencies which are declared as `api` in dependent projects, but also declared in the current project unnecessarily" - }, - "fullDescription": { - "text": "Finds project dependencies which are declared as `api` in dependent projects, but also declared in the current project unnecessarily" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/sort_dependencies", - "id": "modulecheck.sort-dependencies", - "name": "SortDependencies", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Sorts all dependencies within a dependencies { ... } block" - }, - "fullDescription": { - "text": "Sorts all dependencies within a dependencies { ... } block" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/sort_plugins", - "id": "modulecheck.sort-plugins", - "name": "SortPlugins", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Sorts Gradle plugins which are applied using the plugins { ... } block" - }, - "fullDescription": { - "text": "Sorts Gradle plugins which are applied using the plugins { ... } block" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/unused_dependency", - "id": "modulecheck.unused-dependency", - "name": "UnusedDependency", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds project dependencies which aren't used in the declaring module" - }, - "fullDescription": { - "text": "Finds project dependencies which aren't used in the declaring module" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kapt_plugin", - "id": "modulecheck.unused-kapt-plugin", - "name": "UnusedKaptPlugin", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Warns if the kapt plugin is applied, but unused" - }, - "fullDescription": { - "text": "Warns if the kapt plugin is applied, but unused" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kapt_processor", - "id": "modulecheck.unused-kapt-processor", - "name": "UnusedKaptProcessor", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds unused kapt processor dependencies and warns if the kapt plugin is applied but unused" - }, - "fullDescription": { - "text": "Finds unused kapt processor dependencies and warns if the kapt plugin is applied but unused" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kotlin_android_extensions", - "id": "modulecheck.unused-kotlin-android-extensions", - "name": "UnusedKotlinAndroidExtensions", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds modules which have Kotlin AndroidExtensions enabled, but don't actually use any synthetic imports" - }, - "fullDescription": { - "text": "Finds modules which have Kotlin AndroidExtensions enabled, but don't actually use any synthetic imports" - } - }, - { - "helpUri": "https://rbusarow.github.io/ModuleCheck/docs/rules/use_anvil_factory_generation", - "id": "modulecheck.use-anvil-factory-generation", - "name": "UseAnvilFactoryGeneration", - "defaultConfiguration": { - "level": "warning" - }, - "shortDescription": { - "text": "Finds modules which could use Anvil's factory generation instead of Dagger's" - }, - "fullDescription": { - "text": "Finds modules which could use Anvil's factory generation instead of Dagger's" - } - } - ] - } - } - } - ] -} diff --git a/modulecheck-rule/api/api/api.api b/modulecheck-rule/api/api/api.api deleted file mode 100644 index b521ad7e22..0000000000 --- a/modulecheck-rule/api/api/api.api +++ /dev/null @@ -1,41 +0,0 @@ -public final class anvil/hint/Modulecheck_rule_RulesComponent_7021c374Kt { - public static final fun getModulecheck_rule_RulesComponent_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_rule_RulesComponent_scope0 ()Lkotlin/reflect/KClass; -} - -public abstract interface annotation class modulecheck/rule/AllRules : java/lang/annotation/Annotation { -} - -public abstract interface class modulecheck/rule/FindingFactory { - public abstract fun evaluateFixable (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun evaluateReports (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun evaluateSorts (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public abstract interface class modulecheck/rule/ModuleCheckRule { - public abstract fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getDescription ()Ljava/lang/String; - public abstract fun getDocumentationUrl ()Ljava/lang/String; - public abstract fun getName ()Lmodulecheck/finding/FindingName; - public abstract fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public abstract interface class modulecheck/rule/ReportOnlyRule : modulecheck/rule/ModuleCheckRule { -} - -public abstract interface class modulecheck/rule/RuleFilter { - public static final field Companion Lmodulecheck/rule/RuleFilter$Companion; - public abstract fun shouldEvaluate (Lmodulecheck/rule/ModuleCheckRule;Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/RuleFilter$Companion { - public final fun getDEFAULT ()Lmodulecheck/rule/RuleFilter; -} - -public abstract interface class modulecheck/rule/RulesComponent { - public abstract fun getAllRules ()Ljava/util/List; -} - -public abstract interface class modulecheck/rule/SortRule : modulecheck/rule/ModuleCheckRule { -} - diff --git a/modulecheck-rule/api/build.gradle.kts b/modulecheck-rule/api/build.gradle.kts deleted file mode 100644 index 1e4f62fa3f..0000000000 --- a/modulecheck-rule/api/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-rule-api" - ) - anvil() -} -dependencies { - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-project:api")) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-finding:api")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/FindingFactory.kt b/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/FindingFactory.kt deleted file mode 100644 index 4a3f4747e6..0000000000 --- a/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/FindingFactory.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule - -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.Finding -import modulecheck.project.McProject - -interface FindingFactory { - - suspend fun evaluateFixable(projects: List): List - suspend fun evaluateSorts(projects: List): List - suspend fun evaluateReports(projects: List): List -} - -fun interface RuleFilter { - fun shouldEvaluate(rule: ModuleCheckRule<*>, settings: ModuleCheckSettings): Boolean - - companion object { - val DEFAULT: RuleFilter = RuleFilter { rule, settings -> - rule.shouldApply(settings) - } - } -} diff --git a/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/ModuleCheckRule.kt b/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/ModuleCheckRule.kt deleted file mode 100644 index dd9e111716..0000000000 --- a/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/ModuleCheckRule.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule - -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.Finding -import modulecheck.finding.FindingName -import modulecheck.project.McProject -import javax.inject.Qualifier - -interface ModuleCheckRule { - - val name: FindingName - val description: String - val documentationUrl: String - - suspend fun check(project: McProject): List - fun shouldApply(settings: ModuleCheckSettings): Boolean -} - -interface ReportOnlyRule : ModuleCheckRule -interface SortRule : ModuleCheckRule - -@Qualifier -annotation class AllRules diff --git a/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/RulesComponent.kt b/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/RulesComponent.kt deleted file mode 100644 index 464c868000..0000000000 --- a/modulecheck-rule/api/src/main/kotlin/modulecheck/rule/RulesComponent.kt +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule - -import com.squareup.anvil.annotations.ContributesTo -import modulecheck.dagger.DaggerList -import modulecheck.dagger.TaskScope - -@ContributesTo(TaskScope::class) -interface RulesComponent { - - val allRules: DaggerList> -} diff --git a/modulecheck-rule/impl-factory/api/impl-factory.api b/modulecheck-rule/impl-factory/api/impl-factory.api deleted file mode 100644 index f6ccef27bd..0000000000 --- a/modulecheck-rule/impl-factory/api/impl-factory.api +++ /dev/null @@ -1,59 +0,0 @@ -public final class anvil/hint/Modulecheck_rule_impl_FindingFactoryModule_af1a469fKt { - public static final fun getModulecheck_rule_impl_FindingFactoryModule_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_rule_impl_FindingFactoryModule_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_rule_impl_RealFindingResultFactory_FindingResultFactory_TaskScope_BindingModule_acf50564_6518a9c6Kt { - public static final fun getModulecheck_rule_impl_RealFindingResultFactory_FindingResultFactory_TaskScope_BindingModule_acf50564_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_rule_impl_RealFindingResultFactory_FindingResultFactory_TaskScope_BindingModule_acf50564_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/rule/impl/FindingFactoryImpl : modulecheck/rule/FindingFactory, modulecheck/utils/trace/HasTraceTags { - public fun (Ljava/util/List;)V - public fun evaluateFixable (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun evaluateReports (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun evaluateSorts (Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getTags ()Ljava/lang/Iterable; -} - -public final class modulecheck/rule/impl/FindingFactoryImpl_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/rule/impl/FindingFactoryImpl_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/FindingFactoryImpl_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/FindingFactoryImpl; - public static final fun newInstance (Ljava/util/List;)Lmodulecheck/rule/impl/FindingFactoryImpl; -} - -public final class modulecheck/rule/impl/FindingFactoryImpl_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/FindingFactoryImpl_Factory; - public final fun newInstance (Ljava/util/List;)Lmodulecheck/rule/impl/FindingFactoryImpl; -} - -public abstract interface class modulecheck/rule/impl/FindingFactoryModule { - public abstract fun bindFindingFactory (Lmodulecheck/rule/impl/FindingFactoryImpl;)Lmodulecheck/rule/FindingFactory; -} - -public final class modulecheck/rule/impl/ProjectQueue : modulecheck/utils/trace/HasTraceTags { - public fun (Ljava/util/List;)V - public fun getTags ()Ljava/lang/Iterable; - public final fun process (Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; -} - -public final class modulecheck/rule/impl/RealFindingResultFactory : modulecheck/finding/FindingResultFactory { - public fun ()V - public fun create (Ljava/util/List;ZZLkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - -public final class modulecheck/rule/impl/RealFindingResultFactory_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/RealFindingResultFactory_Factory; - public static final fun create ()Lmodulecheck/rule/impl/RealFindingResultFactory_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/RealFindingResultFactory; - public static final fun newInstance ()Lmodulecheck/rule/impl/RealFindingResultFactory; -} - -public abstract interface class modulecheck/rule/impl/RealFindingResultFactory_FindingResultFactory_TaskScope_BindingModule_acf50564 { - public abstract fun bindFindingResultFactory (Lmodulecheck/rule/impl/RealFindingResultFactory;)Lmodulecheck/finding/FindingResultFactory; -} - diff --git a/modulecheck-rule/impl-factory/build.gradle.kts b/modulecheck-rule/impl-factory/build.gradle.kts deleted file mode 100644 index fd2bd07920..0000000000 --- a/modulecheck-rule/impl-factory/build.gradle.kts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-rule-impl-factory" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-rule:api")) - api(project(path = ":modulecheck-utils:trace")) - api(project(path = ":modulecheck-utils:trace")) - api(project(path = ":modulecheck-utils:trace")) - - implementation(project(path = ":modulecheck-api")) - implementation(project(path = ":modulecheck-finding:impl")) - implementation(project(path = ":modulecheck-model:dependency:api")) - implementation(project(path = ":modulecheck-model:dependency:api")) - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - implementation(project(path = ":modulecheck-utils:trace")) - implementation(project(path = ":modulecheck-utils:trace")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/FindingFactoryImpl.kt b/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/FindingFactoryImpl.kt deleted file mode 100644 index 6d91c29f83..0000000000 --- a/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/FindingFactoryImpl.kt +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import com.squareup.anvil.annotations.ContributesTo -import dagger.Binds -import dagger.Module -import kotlinx.coroutines.flow.toList -import modulecheck.dagger.DaggerList -import modulecheck.dagger.TaskScope -import modulecheck.finding.AddsDependency -import modulecheck.finding.Finding -import modulecheck.finding.ModifiesProjectDependency -import modulecheck.finding.OverShotDependencyFinding -import modulecheck.model.dependency.ConfiguredDependency -import modulecheck.project.McProject -import modulecheck.rule.FindingFactory -import modulecheck.rule.ModuleCheckRule -import modulecheck.rule.ReportOnlyRule -import modulecheck.rule.SortRule -import modulecheck.utils.sortedWith -import modulecheck.utils.trace.HasTraceTags -import modulecheck.utils.trace.traced -import javax.inject.Inject - -@Module -@ContributesTo(TaskScope::class) -interface FindingFactoryModule { - // TODO maybe take another stab at removing the generic Finding type from FindingFactory - @Binds - fun bindFindingFactory(findingFactoryImpl: FindingFactoryImpl): FindingFactory -} - -/** - * Sorts rules and applies the appropriate types for each function. Sorting is - * stable and prioritizes modification rules so that they don't clobber each other. - * - * NB The incoming rules should already be filtered using - * [RuleFilter][modulecheck.rule.RuleFilter]. The filtering done within this class should - * only be done with regard to categorizing rules up by fixable/sorts/reports categories. - * - * @since 0.12.0 - */ -class FindingFactoryImpl @Inject constructor( - private val rules: DaggerList> -) : FindingFactory, HasTraceTags { - - override val tags: Iterable - get() = listOf(FindingFactoryImpl::class) - - override suspend fun evaluateFixable(projects: List): List { - return evaluate(projects) { it !is SortRule && it !is ReportOnlyRule } - .asSequence() - // Use a stable but arbitrary sort before filtering out duplicates. This makes it so that - // if there are different finding types trying to modify the same dependency, the same one - // will be chosen each time. - .sortedBy { it.findingName.id } - .filterDuplicateAdds() - .toList() - } - - private fun Sequence.filterDuplicateAdds(): List { - - val adding = mutableSetOf>() - val removing = mutableSetOf>() - - val output = mutableListOf() - - sortedWith( - { it !is ModifiesProjectDependency }, - { it !is OverShotDependencyFinding } - ) - .forEach { finding -> - when (finding) { - - is ModifiesProjectDependency -> { - val newAdd = adding.add(finding.dependentProject to finding.newDependency) - val newRemove = removing.add(finding.dependentProject to finding.oldDependency) - if (newAdd || newRemove) { - output.add(finding) - } - } - - is AddsDependency -> { - if (adding.add(finding.dependentProject to finding.newDependency)) { - output.add(finding) - } - } - - else -> { - output.add(finding) - } - } - } - return output - } - - override suspend fun evaluateSorts(projects: List): List { - return evaluate(projects) { it is SortRule } - } - - override suspend fun evaluateReports(projects: List): List { - return evaluate(projects) { it is ReportOnlyRule } - } - - private suspend fun evaluate( - projects: List, - predicate: (ModuleCheckRule<*>) -> Boolean - ): List { - return ProjectQueue(projects) - .process { project -> - rules.filter { rule -> predicate(rule) } - .flatMap { rule -> - traced(project, rule) { rule.check(project) } - } - } - .toList() - .flatten() - } -} diff --git a/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/ProjectQueue.kt b/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/ProjectQueue.kt deleted file mode 100644 index 4bfa14d370..0000000000 --- a/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/ProjectQueue.kt +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.launch -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.Semaphore -import kotlinx.coroutines.sync.withLock -import kotlinx.coroutines.sync.withPermit -import modulecheck.api.context.depths -import modulecheck.model.dependency.ProjectPath.StringProjectPath -import modulecheck.project.McProject -import modulecheck.utils.coroutines.mapAsync -import modulecheck.utils.flatMapToSet -import modulecheck.utils.mapToSet -import modulecheck.utils.trace.HasTraceTags -import modulecheck.utils.trace.traced - -/** - * Processes projects in a set order, and automatically clears the cache of each - * - * @since 0.12.0 - */ -class ProjectQueue( - private val projects: List -) : HasTraceTags { - - override val tags: Iterable - get() = listOf(ProjectQueue::class) - - /** - * Processes projects in a set order, and automatically clears the cache of each - * - * @since 0.12.0 - */ - fun process(transform: suspend (project: McProject) -> T): Flow { - - return channelFlow { - - // A full set of all dependencies per project, regardless of their source set or classpath - val projectsToDependencyPaths = projects.associateWith { project -> - project.allDependencies().mapToSet { it.projectPath } - } - .toMutableMap() - - // Remaining projects with all their dependencies. The entry for a project is removed after - // it's processed. - val upstreamPending = projectsToDependencyPaths.toMutableMap() - - /** - * Are there any projects still being processed which depend upon the receiver project? - * - * @since 0.12.0 - */ - fun McProject.hasRemainingDownstream() = upstreamPending.entries - .none { it.value.contains(projectPath) } - - // safe access to the shared state of the queue - val lock = Mutex(false) - - // Limit concurrency to half the available processors when emitting the projects to the - // consumer. This is meant to ensure that high-priority/heavyweight projects get processed - // quickly, so that their contexts can be cleared quickly. This has to happen because the - // collection on the consumer's side isn't "fair", and without a low concurrency, - // some of the early projects effectively get trampled. - // - // This doesn't mean we'll only use half the available threads. Once the consumer starts - // applying rules, those checks will start creating more concurrency. - val concurrency = Integer.max(Runtime.getRuntime().availableProcessors(), 2) / 2 - val semaphore = Semaphore(concurrency) - - val toClear = mutableSetOf() - - projectsToDependencyPaths.sortByHierarchy() - .forEach { project -> - - launch { - semaphore.withPermit { - send(transform(project)) - } - - lock.withLock { - - toClear.add(project) - upstreamPending.remove(project) - - toClear.removeIf { maybeClear -> - maybeClear.hasRemainingDownstream() - .also { unused -> - if (unused) { - // after all checks are done for a given project, clear its cache - maybeClear.clearContext() - } - } - } - } - } - } - - invokeOnClose { _ -> - // If any projects somehow haven't cleared their context, do so now. - toClear.forEach { it.clearContext() } - } - } - } - - /** - * Prioritize the projects with the most dependencies - * - * @since 0.12.0 - */ - private suspend fun MutableMap>.sortByHierarchy(): List { - - val pending = keys.mapAsync { project -> - - traced(project) { - (project.depths().all().maxOfOrNull { it.depth } ?: 0) to project - } - } - .toList() - .sortedByDescending { it.first } - .map { it.second } - .toMutableList() - - val out = mutableListOf() - - while (pending.isNotEmpty()) { - val next = pending.firstOrNull { maybeNext -> - values.none { paths -> maybeNext.projectPath in paths } - } ?: pending.first() - - out.add(next) - pending.remove(next) - } - - return out - } - - private suspend fun McProject.allDependencies(): Set { - return generateSequence( - depths().all().asSequence() - ) { depths -> - depths.flatMap { it.children } - .takeIf { it.iterator().hasNext() } - } - .flatMapToSet { depths -> - depths.mapTo(mutableListOf()) { it.dependentProject } - .filterNot { it == this@allDependencies } - } - } -} diff --git a/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/RealFindingResultFactory.kt b/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/RealFindingResultFactory.kt deleted file mode 100644 index 169179a08c..0000000000 --- a/modulecheck-rule/impl-factory/src/main/kotlin/modulecheck/rule/impl/RealFindingResultFactory.kt +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import com.squareup.anvil.annotations.ContributesBinding -import kotlinx.coroutines.flow.toList -import modulecheck.dagger.TaskScope -import modulecheck.finding.AddsDependency -import modulecheck.finding.Deletable -import modulecheck.finding.Finding -import modulecheck.finding.FindingResultFactory -import modulecheck.finding.Fixable -import modulecheck.finding.ModifiesProjectDependency -import modulecheck.finding.ProjectDependencyFinding -import modulecheck.finding.RemovesDependency -import modulecheck.utils.coroutines.mapAsync -import modulecheck.utils.coroutines.onEachAsync -import modulecheck.utils.sortedWith -import javax.inject.Inject - -@ContributesBinding(TaskScope::class) -class RealFindingResultFactory @Inject constructor() : FindingResultFactory { - - override suspend fun create( - findings: List, - autoCorrect: Boolean, - deleteUnused: Boolean - ): List { - - return findings - .onEachAsync { finding -> - // This is a hack to ensure that the position reported - // reflects the position *before* fixes have been applied - finding.positionOrNull.await() - } - .toList() - .groupBy { it.dependentPath } - .toList() - .mapAsync { (_, findings) -> - findings - /* - Add all dependencies before removing any, because we need to find the source - dependency in order to determine where to put the new one. The source may also need - to be removed, so that needs to happen later. - For the same reason, if a finding *modifies* a dependency, then it implements both the - Adds- and Removes- interfaces. Do all the add-only work, then modify, then remove. - - Remember that Boolean Comparables are sorted so that true values are at the end. - */ - .sortedWith( - // only Adds-, without Modifies- - { !(it is AddsDependency && it !is ModifiesProjectDependency) }, - // ModifiesDependency is second - { it !is ModifiesProjectDependency }, - // Sort by type, ish. - { it::class.java.canonicalName }, - // Amongst findings of the same type, sort by path (if it exists) - { (it as? ProjectDependencyFinding)?.dependency?.projectPath ?: "" } - ) - .map { finding -> - - val removalStrategy = if (deleteUnused) { - RemovesDependency.RemovalStrategy.DELETE - } else { - RemovesDependency.RemovalStrategy.COMMENT - } - - val fixed = when { - !autoCorrect -> false - deleteUnused && finding is Deletable -> finding.delete() - finding is Fixable -> finding.fix(removalStrategy) - else -> false - } - - finding.toResult(fixed) - } - } - .toList() - .flatten() - } -} diff --git a/modulecheck-rule/impl/api/impl.api b/modulecheck-rule/impl/api/impl.api deleted file mode 100644 index f85611e181..0000000000 --- a/modulecheck-rule/impl/api/impl.api +++ /dev/null @@ -1,316 +0,0 @@ -public final class anvil/hint/Modulecheck_rule_impl_RuleModule_75b54769Kt { - public static final fun getModulecheck_rule_impl_RuleModule_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_rule_impl_RuleModule_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/rule/impl/AnvilFactoryRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public final fun parse (Lmodulecheck/finding/FindingName;Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/AnvilFactoryRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/AnvilFactoryRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/AnvilFactoryRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/AnvilFactoryRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/AnvilFactoryRule; -} - -public final class modulecheck/rule/impl/DepthRule : modulecheck/rule/impl/DocumentedRule, modulecheck/rule/ReportOnlyRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/DepthRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/DepthRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/DepthRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/DepthRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/DepthRule; -} - -public final class modulecheck/rule/impl/DisableAndroidResourcesRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/DisableAndroidResourcesRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/DisableAndroidResourcesRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/DisableAndroidResourcesRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/DisableAndroidResourcesRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/DisableAndroidResourcesRule; -} - -public final class modulecheck/rule/impl/DisableViewBindingRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/DisableViewBindingRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/DisableViewBindingRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/DisableViewBindingRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/DisableViewBindingRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/DisableViewBindingRule; -} - -public abstract class modulecheck/rule/impl/DocumentedRule : modulecheck/rule/ModuleCheckRule { - public static final field Companion Lmodulecheck/rule/impl/DocumentedRule$Companion; - public static final field RULES_BASE_URL Ljava/lang/String; - public final fun getDocumentationUrl ()Ljava/lang/String; - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/rule/impl/DocumentedRule$Companion { -} - -public final class modulecheck/rule/impl/InheritedDependencyRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/InheritedDependencyRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/InheritedDependencyRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/InheritedDependencyRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/InheritedDependencyRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/InheritedDependencyRule; -} - -public final class modulecheck/rule/impl/MustBeApiRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/MustBeApiRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/MustBeApiRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/MustBeApiRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/MustBeApiRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/MustBeApiRule; -} - -public final class modulecheck/rule/impl/OverShotDependencyRule : modulecheck/rule/impl/DocumentedRule { - public fun (Lmodulecheck/config/ModuleCheckSettings;)V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public final fun getSettings ()Lmodulecheck/config/ModuleCheckSettings; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/OverShotDependencyRule_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/rule/impl/OverShotDependencyRule_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/OverShotDependencyRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/OverShotDependencyRule; - public static final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/OverShotDependencyRule; -} - -public final class modulecheck/rule/impl/OverShotDependencyRule_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/OverShotDependencyRule_Factory; - public final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/OverShotDependencyRule; -} - -public final class modulecheck/rule/impl/RedundantRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/RedundantRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/RedundantRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/RedundantRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/RedundantRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/RedundantRule; -} - -public abstract interface class modulecheck/rule/impl/RuleModule { - public static final field Companion Lmodulecheck/rule/impl/RuleModule$Companion; - public abstract fun bindAnvilFactoryRule (Lmodulecheck/rule/impl/AnvilFactoryRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindDepthRule (Lmodulecheck/rule/impl/DepthRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindDisableAndroidResourcesRule (Lmodulecheck/rule/impl/DisableAndroidResourcesRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindDisableViewBindingRule (Lmodulecheck/rule/impl/DisableViewBindingRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindInheritedDependencyRule (Lmodulecheck/rule/impl/InheritedDependencyRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindMustBeApiRule (Lmodulecheck/rule/impl/MustBeApiRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindOverShotDependencyRule (Lmodulecheck/rule/impl/OverShotDependencyRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindRedundantRule (Lmodulecheck/rule/impl/RedundantRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindSortDependenciesRule (Lmodulecheck/rule/impl/SortDependenciesRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindSortPluginsRule (Lmodulecheck/rule/impl/SortPluginsRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindUnusedDependencyRule (Lmodulecheck/rule/impl/UnusedDependencyRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindUnusedKaptPluginRule (Lmodulecheck/rule/impl/UnusedKaptPluginRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindUnusedKaptProcessorRule (Lmodulecheck/rule/impl/UnusedKaptProcessorRule;)Lmodulecheck/rule/ModuleCheckRule; - public abstract fun bindUnusedKotlinAndroidExtensionsRule (Lmodulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule;)Lmodulecheck/rule/ModuleCheckRule; -} - -public final class modulecheck/rule/impl/RuleModule$Companion { - public final fun provideFilteredRules (Ljava/util/Set;Lmodulecheck/rule/RuleFilter;Lmodulecheck/config/ModuleCheckSettings;)Ljava/util/List; -} - -public final class modulecheck/rule/impl/RuleModule_Companion_ProvideFilteredRulesFactory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/rule/impl/RuleModule_Companion_ProvideFilteredRulesFactory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/rule/impl/RuleModule_Companion_ProvideFilteredRulesFactory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Ljava/util/List; - public static final fun provideFilteredRules (Ljava/util/Set;Lmodulecheck/rule/RuleFilter;Lmodulecheck/config/ModuleCheckSettings;)Ljava/util/List; -} - -public final class modulecheck/rule/impl/RuleModule_Companion_ProvideFilteredRulesFactory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/rule/impl/RuleModule_Companion_ProvideFilteredRulesFactory; - public final fun provideFilteredRules (Ljava/util/Set;Lmodulecheck/rule/RuleFilter;Lmodulecheck/config/ModuleCheckSettings;)Ljava/util/List; -} - -public final class modulecheck/rule/impl/SortDependenciesRule : modulecheck/rule/impl/DocumentedRule, modulecheck/rule/SortRule { - public fun (Lmodulecheck/config/ModuleCheckSettings;)V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/SortDependenciesRule_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/rule/impl/SortDependenciesRule_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/SortDependenciesRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/SortDependenciesRule; - public static final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/SortDependenciesRule; -} - -public final class modulecheck/rule/impl/SortDependenciesRule_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/SortDependenciesRule_Factory; - public final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/SortDependenciesRule; -} - -public final class modulecheck/rule/impl/SortPluginsRule : modulecheck/rule/impl/DocumentedRule, modulecheck/rule/SortRule { - public fun (Lmodulecheck/config/ModuleCheckSettings;)V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/SortPluginsRule_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/rule/impl/SortPluginsRule_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/SortPluginsRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/SortPluginsRule; - public static final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/SortPluginsRule; -} - -public final class modulecheck/rule/impl/SortPluginsRule_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/SortPluginsRule_Factory; - public final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/SortPluginsRule; -} - -public final class modulecheck/rule/impl/UnusedDependencyRule : modulecheck/rule/impl/DocumentedRule { - public fun (Lmodulecheck/config/ModuleCheckSettings;)V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/UnusedDependencyRule_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/rule/impl/UnusedDependencyRule_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/UnusedDependencyRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/UnusedDependencyRule; - public static final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/UnusedDependencyRule; -} - -public final class modulecheck/rule/impl/UnusedDependencyRule_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/UnusedDependencyRule_Factory; - public final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/UnusedDependencyRule; -} - -public final class modulecheck/rule/impl/UnusedKaptPluginRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/UnusedKaptPluginRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/UnusedKaptPluginRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/UnusedKaptPluginRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/UnusedKaptPluginRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/UnusedKaptPluginRule; -} - -public final class modulecheck/rule/impl/UnusedKaptProcessorRule : modulecheck/rule/impl/DocumentedRule { - public fun (Lmodulecheck/config/ModuleCheckSettings;)V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/UnusedKaptProcessorRuleKt { - public static final field KAPT_ALTERNATE_PLUGIN_ID Ljava/lang/String; - public static final field KAPT_PLUGIN_ID Ljava/lang/String; -} - -public final class modulecheck/rule/impl/UnusedKaptProcessorRule_Factory : dagger/internal/Factory { - public static final field Companion Lmodulecheck/rule/impl/UnusedKaptProcessorRule_Factory$Companion; - public fun (Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/UnusedKaptProcessorRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/UnusedKaptProcessorRule; - public static final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/UnusedKaptProcessorRule; -} - -public final class modulecheck/rule/impl/UnusedKaptProcessorRule_Factory$Companion { - public final fun create (Ljavax/inject/Provider;)Lmodulecheck/rule/impl/UnusedKaptProcessorRule_Factory; - public final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;)Lmodulecheck/rule/impl/UnusedKaptProcessorRule; -} - -public final class modulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule : modulecheck/rule/impl/DocumentedRule { - public fun ()V - public fun check (Lmodulecheck/project/McProject;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun getDescription ()Ljava/lang/String; - public fun getName ()Lmodulecheck/finding/FindingName; - public fun shouldApply (Lmodulecheck/config/ModuleCheckSettings;)Z -} - -public final class modulecheck/rule/impl/UnusedKotlinAndroidExtensionsRuleKt { - public static final field KOTLIN_ANDROID_EXTENSIONS_PLUGIN_ID Ljava/lang/String; -} - -public final class modulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule_Factory; - public static final fun create ()Lmodulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule; - public static final fun newInstance ()Lmodulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule; -} - diff --git a/modulecheck-rule/impl/build.gradle.kts b/modulecheck-rule/impl/build.gradle.kts deleted file mode 100644 index fe40da0a3e..0000000000 --- a/modulecheck-rule/impl/build.gradle.kts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-rule-impl" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-api")) - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-finding:impl")) - api(project(path = ":modulecheck-finding:impl-android")) - api(project(path = ":modulecheck-finding:impl-sort")) - api(project(path = ":modulecheck-finding:name")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:dependency:api")) - api(project(path = ":modulecheck-model:sourceset:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-rule:api")) - api(project(path = ":modulecheck-utils:lazy")) - - implementation(project(path = ":modulecheck-core")) - implementation(project(path = ":modulecheck-model:dependency:api")) - implementation(project(path = ":modulecheck-parsing:gradle:dsl:api")) - implementation(project(path = ":modulecheck-parsing:gradle:dsl:api")) - implementation(project(path = ":modulecheck-parsing:source:api")) - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/AnvilFactoryRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/AnvilFactoryRule.kt deleted file mode 100644 index 406f953f6a..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/AnvilFactoryRule.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import kotlinx.coroutines.flow.filterIsInstance -import modulecheck.api.context.jvmFilesForSourceSetName -import modulecheck.api.context.references -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.CouldUseAnvilFinding -import modulecheck.finding.FindingName -import modulecheck.model.sourceset.SourceSetName -import modulecheck.parsing.source.JavaFile -import modulecheck.parsing.source.KotlinFile -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.ReferenceName -import modulecheck.project.McProject -import modulecheck.utils.coroutines.any -import modulecheck.utils.lazy.containsAny -import net.swiftzer.semver.SemVer -import javax.inject.Inject - -class AnvilFactoryRule @Inject constructor() : DocumentedRule() { - - override val name: FindingName = FindingName("use-anvil-factory-generation") - override val description: String = "Finds modules which could use Anvil's factory generation " + - "instead of Dagger's" - - private val anvilMergeComponent = - ReferenceName("com.squareup.anvil.annotations.MergeComponent", KOTLIN) - private val daggerComponent = ReferenceName("dagger.Component", KOTLIN) - - private val daggerInject = ReferenceName("dagger.Inject", KOTLIN) - private val daggerModule = ReferenceName("dagger.Module", KOTLIN) - - @Suppress("MagicNumber") - private val minimumAnvilVersion = SemVer(2, 0, 11) - - override suspend fun check(project: McProject): List { - return parse(name, project) - } - - @Suppress("ComplexMethod") - suspend fun parse(findingName: FindingName, project: McProject): List { - val anvil = project.anvilGradlePlugin ?: return emptyList() - - if (anvil.generateDaggerFactories) return emptyList() - - val anvilVersion = anvil.version - - val hasAnvil = anvilVersion >= minimumAnvilVersion - - if (!hasAnvil) return emptyList() - - val allRefs = project.references().all() - - val componentOrMergeComponent = listOf(daggerComponent, anvilMergeComponent) - - val createsComponent = allRefs.containsAny(componentOrMergeComponent) - - if (createsComponent) return emptyList() - - val moduleOrInjectConstructor = listOf(daggerInject, daggerModule) - - val usesDaggerInJava = project - .jvmFilesForSourceSetName(SourceSetName.MAIN) - .filterIsInstance() - .any { file -> file.references.containsAny(moduleOrInjectConstructor) } - - if (usesDaggerInJava) return emptyList() - - val usesDaggerInKotlin = project - .jvmFilesForSourceSetName(SourceSetName.MAIN) - .filterIsInstance() - .any { file -> file.references.containsAny(moduleOrInjectConstructor) } - - if (!usesDaggerInKotlin) return emptyList() - - return listOf( - CouldUseAnvilFinding( - findingName = findingName, - dependentProject = project, - buildFile = project.buildFile - ) - ) - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.anvilFactoryGeneration - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DepthRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DepthRule.kt deleted file mode 100644 index ccbac74789..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DepthRule.kt +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.api.DepthFinding -import modulecheck.api.context.depthForSourceSetName -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.project.McProject -import modulecheck.rule.ReportOnlyRule -import javax.inject.Inject - -class DepthRule @Inject constructor() : - DocumentedRule(), - ReportOnlyRule { - - override val name: FindingName = DepthFinding.NAME - override val description: String = "The longest path between this module and its leaf nodes" - - override suspend fun check(project: McProject): List { - return project.sourceSets.keys - .map { sourceSetName -> - val intermediate = project.depthForSourceSetName(sourceSetName) - - DepthFinding( - dependentProject = project, - dependentPath = project.projectPath, - depth = intermediate.depth, - children = intermediate.children.map { it.toFinding(name) }, - sourceSetName = sourceSetName, - buildFile = project.buildFile - ) - } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.depths || - settings.reports.depths.enabled || - settings.reports.graphs.enabled - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DisableAndroidResourcesRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DisableAndroidResourcesRule.kt deleted file mode 100644 index 5d3afb3a89..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DisableAndroidResourcesRule.kt +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.api.context.androidDataBindingDeclarationsForSourceSetName -import modulecheck.api.context.androidRDeclaredNameForSourceSetName -import modulecheck.api.context.androidResourceDeclaredNamesForSourceSetName -import modulecheck.api.context.androidResourceReferencesForSourceSetName -import modulecheck.api.context.dependents -import modulecheck.api.context.referencesForSourceSetName -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.finding.android.UnusedResourcesGenerationFinding -import modulecheck.model.dependency.AndroidPlatformPlugin.AndroidLibraryPlugin -import modulecheck.project.McProject -import modulecheck.project.project -import javax.inject.Inject - -class DisableAndroidResourcesRule @Inject constructor() : - DocumentedRule() { - - override val name: FindingName = UnusedResourcesGenerationFinding.NAME - override val description: String = - "Finds modules which have android resources R file generation enabled, " + - "but don't actually use any resources from the module" - - override suspend fun check(project: McProject): List { - - val resourcesEnabled = (project.platformPlugin as? AndroidLibraryPlugin) - ?.androidResourcesEnabled == true - - if (!resourcesEnabled) return emptyList() - - fun findingList() = listOf( - UnusedResourcesGenerationFinding( - dependentProject = project, - dependentPath = project.projectPath, - buildFile = project.buildFile - ) - ) - - val usedLocally = project.sourceSets - .keys - .any { sourceSetName -> - - val rName = project.androidRDeclaredNameForSourceSetName(sourceSetName) - ?: return@any false - val references = project.referencesForSourceSetName(sourceSetName) - - references.contains(rName) || - references - .containsAny(project.androidResourceDeclaredNamesForSourceSetName(sourceSetName)) || - references - .containsAny(project.androidDataBindingDeclarationsForSourceSetName(sourceSetName)) - } - - if (usedLocally) return emptyList() - - val usedInDownstreamProject = project.dependents() - .any { downstream -> - downstream.project(project) - .sourceSets - .keys - .any any2@{ sourceSetName -> - - val rName = project.androidRDeclaredNameForSourceSetName(sourceSetName) - ?: return@any2 false - - val refsForSourceSet = project.projectCache - .getValue(downstream.dependentProjectPath) - .androidResourceReferencesForSourceSetName(sourceSetName) - - val resourceDeclarations = project - .androidResourceDeclaredNamesForSourceSetName(sourceSetName) - - refsForSourceSet.contains(rName) || - refsForSourceSet.containsAny(resourceDeclarations) - } - } - - if (usedInDownstreamProject) return emptyList() - - return findingList() - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.disableAndroidResources - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DisableViewBindingRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DisableViewBindingRule.kt deleted file mode 100644 index f24f9214dc..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DisableViewBindingRule.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.api.context.androidDataBindingDeclarationsForSourceSetName -import modulecheck.api.context.dependents -import modulecheck.api.context.referencesForSourceSetName -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.finding.android.DisableViewBindingGenerationFinding -import modulecheck.model.dependency.withDownStream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.project -import modulecheck.utils.coroutines.any -import modulecheck.utils.lazy.lazyDeferred -import javax.inject.Inject - -class DisableViewBindingRule @Inject constructor() : - DocumentedRule() { - - override val name: FindingName = DisableViewBindingGenerationFinding.NAME - override val description: String = "Finds modules which have ViewBinding enabled, " + - "but don't actually use any generated ViewBinding objects from that module" - - override suspend fun check(project: McProject): List { - val androidPlugin = project.platformPlugin.asAndroidOrNull() ?: return emptyList() - - // no chance of a finding if the feature's already disabled - if (!androidPlugin.viewBindingEnabled) return emptyList() - - val dependents = lazyDeferred { project.dependents() } - - androidPlugin.sourceSets.keys - .forEach { sourceSetName -> - - val generatedBindings = project - .androidDataBindingDeclarationsForSourceSetName(sourceSetName) - .takeIf { it.isNotEmpty() } - ?: return@forEach - - val usedInProject = sourceSetName.withDownStream(project).plus(SourceSetName.MAIN) - .any { sourceSetNameOrDownstream -> - - generatedBindings.any { generated -> - - project.referencesForSourceSetName(sourceSetNameOrDownstream) - .contains(generated) - } - } - - if (usedInProject) return emptyList() - - val usedInDependent = dependents - .await() - .any { downstream -> - - val downstreamProject = downstream.projectDependency - .project(project) - - // Get the source set which is exposed to the dependent project through its - // configuration. This will typically be `main`, but it could be another build variant - // if the entire dependency chain is using another source set's configuration. - val exposedSourceSetName = downstream.projectDependency - .declaringSourceSetName(downstreamProject.sourceSets) - - val references = downstream.project(project) - .referencesForSourceSetName(exposedSourceSetName) - - generatedBindings.any { generated -> - references.contains(generated) - } - } - - if (usedInDependent) return emptyList() - } - - return listOf( - DisableViewBindingGenerationFinding( - dependentProject = project, - dependentPath = project.projectPath, - buildFile = project.buildFile - ) - ) - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.disableViewBinding - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DocumentedRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DocumentedRule.kt deleted file mode 100644 index 1d92c3fa60..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/DocumentedRule.kt +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.finding.Finding -import modulecheck.rule.ModuleCheckRule - -sealed class DocumentedRule : ModuleCheckRule { - - /** - * This should correspond to the finding name in `snake_case`. So a rule with a `findingName.id` - * of 'unused-dependency' would have a documentation url of `/rules/unused_dependency`. - * - * @since 0.12.0 - */ - final override val documentationUrl: String - get() = "$RULES_BASE_URL${name.snakeCase}" - - override fun toString(): String = "${this::class.simpleName}(${name.id})" - - companion object { - const val RULES_BASE_URL: String = "https://rbusarow.github.io/ModuleCheck/docs/rules/" - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/InheritedDependencyRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/InheritedDependencyRule.kt deleted file mode 100644 index 32fb1f0af2..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/InheritedDependencyRule.kt +++ /dev/null @@ -1,239 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import kotlinx.coroutines.flow.toList -import modulecheck.api.context.classpathDependencies -import modulecheck.api.context.maybeAsApi -import modulecheck.api.context.uses -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.finding.InheritedDependencyFinding -import modulecheck.model.dependency.ProjectDependency -import modulecheck.model.dependency.SourceSetDependency -import modulecheck.model.dependency.TransitiveProjectDependency -import modulecheck.model.dependency.implementationConfig -import modulecheck.model.dependency.inheritsFrom -import modulecheck.model.dependency.sortedByInheritance -import modulecheck.model.dependency.toSourceSetDependency -import modulecheck.model.dependency.withDownStream -import modulecheck.model.dependency.withUpstream -import modulecheck.model.sourceset.SourceSetName -import modulecheck.project.McProject -import modulecheck.project.project -import modulecheck.utils.coroutines.mapAsync -import modulecheck.utils.flatMapToSet -import javax.inject.Inject - -class InheritedDependencyRule @Inject constructor() : - DocumentedRule() { - - override val name: FindingName = FindingName("inherited-dependency") - override val description: String = - "Finds project dependencies which are used in the current module, " + - "but are not actually directly declared as dependencies in the current module" - - override suspend fun check(project: McProject): List { - - // For each source set, the set of all module paths and whether they're test fixtures - val dependencyPathCache = mutableMapOf>() - - // Returns true if the dependency is already declared in this exact source set, - // **or** if it's declared in an upstream source set. - // - // For example, this function will return true for a `testImplementation` configured dependency - // which is already declared in the main source set (such as with `api` or `implementation`). - fun alreadyInLocalClasspath(cpd: ProjectDependency): Boolean { - fun dependencyPathsForSourceSet(sourceSetName: SourceSetName): Set { - return dependencyPathCache.getOrPut(sourceSetName) { - project.projectDependencies[sourceSetName] - .map { it.toSourceSetDependency() } - .toSet() - } - } - - return cpd.configurationName.toSourceSetName() - // Check the cpd's source set first, but if the dependency isn't defined there, - // also check the upstream configurations. - .withUpstream(project) - .any { sourceSetName -> - - dependencyPathsForSourceSet(sourceSetName) - .contains(cpd.toSourceSetDependency(sourceSetName)) - } - } - - val candidates = project.classpathDependencies() - .all() - .asSequence() - // Projects shouldn't inherit themselves. This false-positive can happen if a test - // fixture/utilities module depends upon a module, and that module uses the test module in - // testImplementation. - .filterNot { transitive -> transitive.contributed.projectPath == project.projectPath } - .flatMap { transitive -> - - /* - If a transitive dependency is used in the same configuration as its source, then that's - the configuration which should be used. - - Given this config: - ┌────────┐ ┌────────┐ ┌────────┐ - │ :lib3 │──testImplementation─▶│ :lib2 │────api──▶│ :lib1 │ - └────────┘ └────────┘ └────────┘ - - We'd want to check whether :lib3 uses :lib1, but with the `testImplementation` - configuration. We don't want to check whether :lib3 uses :lib1 in `api`, because :lib2 - only provides it to `testImplementation`. - - We want to see whether this configuration is valid: - ┌────────┐ ┌────────┐ - ┌──────────▶│ :lib2 │────api──▶│ :lib1 │ - testImplementation └────────┘ ▲────────┘ - ┌────────┐───────────┘ │ - │ :lib3 │ │ - └────────┘───────────────────testImplementation──────┘ - However, that transitive dependency is also providing the contributed dependency to other - source sets which depend upon it. So, check the downstream SourceSets as well. - */ - transitive - .withContributedConfiguration(transitive.source.configurationName.implementationVariant()) - // from `main` source set, get a sequence of [main, test, debug, release, testDebug, ...] - .withDownstreamVariants(project) - // if the transitive contributed dependency is testFixtures, check the main source as well - .withTestFixturesMainSource() - // Sorting by inheritance can be very expensive even for a single module's source sets, - // if the variant/flavor/build type matrix is complex. So filter out duplicates first, - // even though more filtering may be done below after the flatMap. - .filterNot { alreadyInLocalClasspath(it.contributed) } - .distinctBy { it.contributed.toSourceSetDependency() } - // check main before debug, debug before androidTestDebug, etc. - .sortedByInheritance(project) - } - .distinctBy { it.contributed.toSourceSetDependency() } - .groupBy { it.contributed.configurationName.toSourceSetName() } - - val visitedSourceSetMap = mutableMapOf>() - - project.sourceSets.values - .sortedByInheritance() - .forEach { sourceSet -> - - val allUpstreamTransitive = sourceSet.upstream - .flatMapToSet { visitedSourceSetMap.getValue(it) } - - val forThisSourceSet = candidates[sourceSet.name].orEmpty() - .mapNotNull { candidateTransitive -> - - val contributed = candidateTransitive.contributed - - val alreadyUpstream = allUpstreamTransitive.any { (_, upstreamCpd) -> - - if (contributed.isTestFixture && !upstreamCpd.isTestFixture) { - return@any false - } - - upstreamCpd.projectPath == contributed.projectPath && - contributed.isTestFixture == upstreamCpd.isTestFixture - } - - candidateTransitive.takeIf { !alreadyUpstream && project.uses(it.contributed) } - } - - visitedSourceSetMap[sourceSet.name] = forThisSourceSet - } - - return visitedSourceSetMap.values.flatten() - .mapAsync { (source, inherited) -> - - InheritedDependencyFinding( - findingName = name, - dependentProject = project, - newDependency = inherited.maybeAsApi(project), - source = source - ) - } - .toList() - .groupBy { it.configurationName } - .mapValues { (_, findings) -> - findings - .distinctBy { it.newDependency } - .sorted() - } - .values - .flatten() - } - - /** - * Returns a sequence starting with the receiver's - * configuration, then all **downstream** configurations. - * - * For example, if we're checking to see if a transitive dependency is used - * in `main`, we should also check whether it's used in the source sets which - * inherit from `main` (like `debug`, `release`, `androidTest`, `test`, etc.). - * - * @since 0.12.0 - */ - private fun TransitiveProjectDependency.withDownstreamVariants( - project: McProject - ): Sequence { - - return source.configurationName - .toSourceSetName() - .withDownStream(project) - .asSequence() - .map { it.implementationConfig() } - .map { configName -> withContributedConfiguration(configName) } - } - - private fun Sequence.sortedByInheritance( - project: McProject - ): Sequence { - - return sortedWith { o1, o2 -> - val o1SourceSets = o1.contributed.project(project).sourceSets - val o1SourceSet = o1.contributed.declaringSourceSetName(o1SourceSets) - - val o2SourceSets = o2.contributed.project(project).sourceSets - val o2SourceSet = o2.contributed.declaringSourceSetName(o2SourceSets) - - o2SourceSet.inheritsFrom(o1SourceSet, project).compareTo(true) - } - } - - /** - * @return a sequence containing all original transitive dependencies, - * but adds `main` contributed dependencies where the original - * transitive dependency was providing `main` via `testFixtures`. - * @since 0.12.0 - */ - private fun Sequence.withTestFixturesMainSource() = - flatMap { transitiveCpd -> - sequence { - yield(transitiveCpd) - if (transitiveCpd.contributed.isTestFixture) { - yield( - transitiveCpd.copy( - contributed = transitiveCpd.contributed.copy(isTestFixture = false) - ) - ) - } - } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.inheritedDependency - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/MustBeApiRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/MustBeApiRule.kt deleted file mode 100644 index be5ad77b88..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/MustBeApiRule.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.api.context.MustBeApi -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.finding.MustBeApiFinding -import modulecheck.project.McProject -import javax.inject.Inject - -class MustBeApiRule @Inject constructor() : DocumentedRule() { - - override val name: FindingName = FindingName("must-be-api") - override val description: String = "Finds project dependencies which are exposed by the module " + - "as part of its public ABI, but are only added as runtimeOnly, compileOnly, or implementation" - - override suspend fun check(project: McProject): List { - return project.get(MustBeApi) - .map { - val oldConfig = it.projectDependency.configurationName - MustBeApiFinding( - findingName = name, - dependentProject = project, - newDependency = it.projectDependency - .copy(configurationName = oldConfig.apiVariant()), - oldDependency = it.projectDependency, - configurationName = oldConfig, - source = it.source - ) - } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.mustBeApi - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/OverShotDependencyRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/OverShotDependencyRule.kt deleted file mode 100644 index 5b4d3766e5..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/OverShotDependencyRule.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.config.ModuleCheckSettings -import modulecheck.core.context.overshotDependencies -import modulecheck.finding.FindingName -import modulecheck.finding.OverShotDependencyFinding -import modulecheck.project.McProject -import javax.inject.Inject - -class OverShotDependencyRule @Inject constructor( - val settings: ModuleCheckSettings -) : DocumentedRule() { - - override val name: FindingName = OverShotDependencyFinding.NAME - override val description: String = - "Finds project dependencies which aren't used by the declaring" + - " configuration, but are used by a dependent configuration." - - override suspend fun check(project: McProject): List { - return project.overshotDependencies() - .all() - .filterNot { it.newDependency.identifier.name in settings.ignoreUnusedFinding } - .sortedByDescending { it.newDependency.configurationName } - .map { it.toFinding() } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.overShotDependency - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/RedundantRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/RedundantRule.kt deleted file mode 100644 index 6a4b87eb1b..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/RedundantRule.kt +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.config.ModuleCheckSettings -import modulecheck.core.context.RedundantDependencies -import modulecheck.finding.FindingName -import modulecheck.finding.RedundantDependencyFinding -import modulecheck.project.McProject -import javax.inject.Inject - -class RedundantRule @Inject constructor() : DocumentedRule() { - - override val name: FindingName = FindingName("redundant-dependency") - override val description: String = - "Finds project dependencies which are declared as `api` in dependent " + - "projects, but also declared in the current project unnecessarily" - - override suspend fun check(project: McProject): List { - return project.get(RedundantDependencies) - .all() - .distinctBy { it.dependency } - .map { it.toFinding(findingName = name) } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.redundantDependency - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/RuleModule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/RuleModule.kt deleted file mode 100644 index 9479f1206b..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/RuleModule.kt +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import com.squareup.anvil.annotations.ContributesTo -import dagger.Binds -import dagger.Module -import dagger.Provides -import dagger.multibindings.IntoSet -import modulecheck.config.ModuleCheckSettings -import modulecheck.dagger.DaggerList -import modulecheck.dagger.DaggerSet -import modulecheck.dagger.TaskScope -import modulecheck.rule.AllRules -import modulecheck.rule.ModuleCheckRule -import modulecheck.rule.RuleFilter - -@Suppress("UndocumentedPublicClass", "UndocumentedPublicFunction") -@Module -@ContributesTo(TaskScope::class) -interface RuleModule { - - @Binds - @IntoSet - @AllRules - fun bindAnvilFactoryRule(rule: AnvilFactoryRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindDepthRule(rule: DepthRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindDisableAndroidResourcesRule(rule: DisableAndroidResourcesRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindDisableViewBindingRule(rule: DisableViewBindingRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindInheritedDependencyRule(rule: InheritedDependencyRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindMustBeApiRule(rule: MustBeApiRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindOverShotDependencyRule(rule: OverShotDependencyRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindRedundantRule(rule: RedundantRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindSortDependenciesRule(rule: SortDependenciesRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindSortPluginsRule(rule: SortPluginsRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindUnusedDependencyRule(rule: UnusedDependencyRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindUnusedKaptPluginRule(rule: UnusedKaptPluginRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindUnusedKaptProcessorRule(rule: UnusedKaptProcessorRule): ModuleCheckRule<*> - - @Binds - @IntoSet - @AllRules - fun bindUnusedKotlinAndroidExtensionsRule( - rule: UnusedKotlinAndroidExtensionsRule - ): ModuleCheckRule<*> - - companion object { - @Provides - fun provideFilteredRules( - @AllRules - allRules: DaggerSet>, - ruleFilter: RuleFilter, - settings: ModuleCheckSettings - ): DaggerList> = allRules.filter { ruleFilter.shouldEvaluate(it, settings) } - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/SortDependenciesRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/SortDependenciesRule.kt deleted file mode 100644 index 1d0c3cbd72..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/SortDependenciesRule.kt +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.finding.SortDependenciesFinding -import modulecheck.finding.sortedDependenciesFileText -import modulecheck.project.McProject -import modulecheck.rule.SortRule -import java.util.Locale -import javax.inject.Inject - -class SortDependenciesRule @Inject constructor( - settings: ModuleCheckSettings -) : DocumentedRule(), SortRule { - - override val name: FindingName = SortDependenciesFinding.NAME - override val description: String = "Sorts all dependencies within a dependencies { ... } block" - - private val elementComparables: Array<(String) -> Comparable<*>> = - settings - .sort - .dependencyComparators - .map { it.toRegex() } - .map { regex -> - { - str: String -> - !str.matches(regex) - } - }.toTypedArray() - - @Suppress("SpreadOperator") - private val comparator: Comparator = compareBy( - *elementComparables, - { it.lowercase(Locale.US) } - ) - - override suspend fun check(project: McProject): List { - val allSorted = project.buildFileParser - .dependenciesBlocks() - .all { block -> - - if (block.lambdaContent.isBlank()) return@all true - - val fileText = project.buildFile.readText() - - fileText == sortedDependenciesFileText(block, fileText, comparator) - } - - return if (allSorted) { - emptyList() - } else { - listOf( - SortDependenciesFinding( - dependentProject = project, - dependentPath = project.projectPath, - buildFile = project.buildFile, - comparator = comparator - ) - ) - } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.sortDependencies - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/SortPluginsRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/SortPluginsRule.kt deleted file mode 100644 index 550d5454ea..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/SortPluginsRule.kt +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.finding.sort.SortPluginsFinding -import modulecheck.finding.sort.sortedPlugins -import modulecheck.parsing.gradle.dsl.PluginDeclaration -import modulecheck.project.McProject -import modulecheck.rule.SortRule -import javax.inject.Inject - -class SortPluginsRule @Inject constructor( - settings: ModuleCheckSettings -) : DocumentedRule(), SortRule { - - override val name: FindingName = SortPluginsFinding.NAME - override val description: String = - "Sorts Gradle plugins which are applied using the plugins { ... } block" - - private val comparables: Array<(PluginDeclaration) -> Comparable<*>> = - settings - .sort - .pluginComparators - .map { it.toRegex() } - .map { regex -> - { - str: String -> - !str.matches(regex) - } - } - .map { booleanLambda -> - { - dec: PluginDeclaration -> - - booleanLambda.invoke(dec.declarationText) - } - }.toTypedArray() - - @Suppress("SpreadOperator") - private val comparator: Comparator = compareBy(*comparables) - - override suspend fun check(project: McProject): List { - val block = project.buildFileParser - .pluginsBlock() - ?: return emptyList() - - val sortedPlugins = block.sortedPlugins(comparator) - - val sorted = block.lambdaContent == sortedPlugins - - return if (sorted) { - emptyList() - } else { - listOf( - SortPluginsFinding( - dependentProject = project, - dependentPath = project.projectPath, - buildFile = project.buildFile, - comparator = comparator - ) - ) - } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.sortPlugins - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedDependencyRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedDependencyRule.kt deleted file mode 100644 index c5aee03c87..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedDependencyRule.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.config.ModuleCheckSettings -import modulecheck.core.context.UnusedDependencies -import modulecheck.finding.FindingName -import modulecheck.finding.UnusedDependencyFinding -import modulecheck.project.McProject -import javax.inject.Inject - -class UnusedDependencyRule @Inject constructor( - private val settings: ModuleCheckSettings -) : DocumentedRule() { - - override val name: FindingName = FindingName("unused-dependency") - override val description: String = "Finds project dependencies which aren't used in the declaring module" - - override suspend fun check(project: McProject): List { - return project.get(UnusedDependencies) - .all() - .filterNot { it.dependency.identifier.name in settings.ignoreUnusedFinding } - // kapt has its own rule - .filterNot { it.configurationName.isKapt() } - .distinctBy { it.dependency } - .map { it.toFinding(name) } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.unusedDependency - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKaptPluginRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKaptPluginRule.kt deleted file mode 100644 index c87e1d56e4..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKaptPluginRule.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.api.context.kaptDependencies -import modulecheck.config.ModuleCheckSettings -import modulecheck.core.context.overshotDependencies -import modulecheck.core.context.unusedKaptProcessors -import modulecheck.finding.Finding -import modulecheck.finding.FindingName -import modulecheck.finding.UnusedPluginFinding -import modulecheck.model.dependency.MightHaveCodeGeneratorBinding -import modulecheck.model.dependency.PluginDefinition -import modulecheck.project.McProject -import modulecheck.utils.flatMapToSet -import modulecheck.utils.lazy.lazyDeferred -import javax.inject.Inject - -class UnusedKaptPluginRule @Inject constructor() : DocumentedRule() { - - override val name: FindingName = FindingName("unused-kapt-plugin") - override val description: String = "Warns if the kapt plugin is applied, but unused" - - override suspend fun check(project: McProject): List { - if (!project.hasKapt) return emptyList() - - val kaptDependencies = project.kaptDependencies() - - val overshotKapt = project.configurations.keys - .filter { it.isKapt() } - .flatMapToSet { project.overshotDependencies().get(it) } - - val processorIsUsed = lazyDeferred { - project - .configurations - .keys - .filter { it.isKapt() } - .any { configName -> - - val processors = kaptDependencies.get(configName) - .filterIsInstance() - .filter { it.codeGeneratorBindingOrNull != null } - - if (processors.isEmpty()) return@any false - - val unusedAndNotSuppressed = project.unusedKaptProcessors() - .get(configName) - .filterNot { it.isSuppressed.await() } - - processors.size - unusedAndNotSuppressed.size != 0 - } - } - - return when { - overshotKapt.isNotEmpty() -> emptyList() - processorIsUsed.await() -> emptyList() - else -> listOf( - UnusedPluginFinding( - dependentProject = project, - dependentPath = project.projectPath, - buildFile = project.buildFile, - findingName = name, - pluginDefinition = PluginDefinition( - name = "kapt", - qualifiedId = KAPT_PLUGIN_ID, - legacyIdOrNull = KAPT_ALTERNATE_PLUGIN_ID, - precompiledAccessorOrNull = null, - kotlinFunctionArgumentOrNull = KAPT_PLUGIN_FUN - ) - ) - ) - } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.unusedKapt - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKaptProcessorRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKaptProcessorRule.kt deleted file mode 100644 index 69140e731f..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKaptProcessorRule.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.config.ModuleCheckSettings -import modulecheck.core.context.unusedKaptProcessors -import modulecheck.finding.Finding -import modulecheck.finding.FindingName -import modulecheck.project.McProject -import javax.inject.Inject - -const val KAPT_PLUGIN_ID: String = "org.jetbrains.kotlin.kapt" -const val KAPT_ALTERNATE_PLUGIN_ID: String = "kotlin-kapt" -internal const val KAPT_PLUGIN_FUN = "kapt" - -class UnusedKaptProcessorRule @Inject constructor( - private val settings: ModuleCheckSettings -) : DocumentedRule() { - - override val name: FindingName = FindingName("unused-kapt-processor") - override val description: String = "Finds unused kapt processor dependencies " + - "and warns if the kapt plugin is applied but unused" - - override suspend fun check(project: McProject): List { - - return project.unusedKaptProcessors().all() - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.unusedKapt - } -} diff --git a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule.kt b/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule.kt deleted file mode 100644 index 144e2332c2..0000000000 --- a/modulecheck-rule/impl/src/main/kotlin/modulecheck/rule/impl/UnusedKotlinAndroidExtensionsRule.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.impl - -import modulecheck.api.context.referencesForSourceSetName -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.FindingName -import modulecheck.finding.UnusedPluginFinding -import modulecheck.model.dependency.PluginDefinition -import modulecheck.parsing.source.McName.CompatibleLanguage.KOTLIN -import modulecheck.parsing.source.ReferenceName -import modulecheck.project.McProject -import modulecheck.utils.coroutines.any -import javax.inject.Inject - -const val KOTLIN_ANDROID_EXTENSIONS_PLUGIN_ID: String = "org.jetbrains.kotlin.android.extensions" -private const val KOTLIN_ANDROID_EXTENSIONS_PLUGIN_FUN = "android-extensions" - -class UnusedKotlinAndroidExtensionsRule @Inject constructor() : - DocumentedRule() { - - override val name: FindingName = FindingName("unused-kotlin-android-extensions") - override val description: String = "Finds modules which have Kotlin AndroidExtensions enabled, " + - "but don't actually use any synthetic imports" - - private val parcelizeImport = ReferenceName("kotlinx.android.parcel.Parcelize", KOTLIN) - private val syntheticReferencePackage = - ReferenceName("kotlinx.android.synthetic", KOTLIN) - - override suspend fun check(project: McProject): List { - val androidPlugin = project.platformPlugin.asAndroidOrNull() ?: return emptyList() - - // no chance of a finding if the feature's already disabled - if (!androidPlugin.kotlinAndroidExtensionEnabled) return emptyList() - - val usedInProject = androidPlugin.sourceSets.keys - .any { sourceSetName -> - project.referencesForSourceSetName(sourceSetName) - .any { it == parcelizeImport || it.startsWith(syntheticReferencePackage) } - } - - return if (usedInProject) { - emptyList() - } else { - listOf( - UnusedPluginFinding( - dependentProject = project, - dependentPath = project.projectPath, - buildFile = project.buildFile, - findingName = name, - pluginDefinition = PluginDefinition( - name = "Kotlin Android Extensions", - qualifiedId = KOTLIN_ANDROID_EXTENSIONS_PLUGIN_ID, - legacyIdOrNull = null, - precompiledAccessorOrNull = null, - kotlinFunctionArgumentOrNull = KOTLIN_ANDROID_EXTENSIONS_PLUGIN_FUN - ) - ) - ) - } - } - - override fun shouldApply(settings: ModuleCheckSettings): Boolean { - return settings.checks.unusedKotlinAndroidExtensions - } -} diff --git a/modulecheck-rule/testing/api/testing.api b/modulecheck-rule/testing/api/testing.api deleted file mode 100644 index 1e9301cd8f..0000000000 --- a/modulecheck-rule/testing/api/testing.api +++ /dev/null @@ -1,16 +0,0 @@ -public abstract interface class modulecheck/rule/test/AllRulesComponent : modulecheck/rule/RulesComponent { - public static final field Companion Lmodulecheck/rule/test/AllRulesComponent$Companion; -} - -public final class modulecheck/rule/test/AllRulesComponent$Companion { - public final fun create (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/RuleFilter;)Lmodulecheck/rule/test/AllRulesComponent; -} - -public abstract interface class modulecheck/rule/test/AllRulesComponent$Factory { - public abstract fun create (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/RuleFilter;)Lmodulecheck/rule/test/AllRulesComponent; -} - -public final class modulecheck/rule/test/DaggerAllRulesComponent { - public static fun factory ()Lmodulecheck/rule/test/AllRulesComponent$Factory; -} - diff --git a/modulecheck-rule/testing/build.gradle.kts b/modulecheck-rule/testing/build.gradle.kts deleted file mode 100644 index 411bd3bed4..0000000000 --- a/modulecheck-rule/testing/build.gradle.kts +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-rule-testing" - ) - dagger() -} - -dependencies { - - api(libs.google.dagger.api) - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-rule:api")) - - implementation(project(path = ":modulecheck-dagger")) - implementation(project(path = ":modulecheck-reporting:logging:api")) - implementation(project(path = ":modulecheck-rule:impl")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) -} diff --git a/modulecheck-rule/testing/src/main/kotlin/modulecheck/rule/test/AllRulesComponent.kt b/modulecheck-rule/testing/src/main/kotlin/modulecheck/rule/test/AllRulesComponent.kt deleted file mode 100644 index 794d22c72a..0000000000 --- a/modulecheck-rule/testing/src/main/kotlin/modulecheck/rule/test/AllRulesComponent.kt +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.rule.test - -import com.squareup.anvil.annotations.MergeComponent -import dagger.BindsInstance -import dagger.Component -import modulecheck.config.ModuleCheckSettings -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import modulecheck.rule.RuleFilter -import modulecheck.rule.RulesComponent - -@SingleIn(TaskScope::class) -@MergeComponent(TaskScope::class) -interface AllRulesComponent : RulesComponent { - - @Component.Factory - fun interface Factory { - fun create( - @BindsInstance - settings: ModuleCheckSettings, - @BindsInstance - ruleFilter: RuleFilter - ): AllRulesComponent - } - - companion object { - fun create(settings: ModuleCheckSettings, ruleFilter: RuleFilter): AllRulesComponent = - DaggerAllRulesComponent.factory().create(settings, ruleFilter) - } -} diff --git a/modulecheck-runtime/api/api/api.api b/modulecheck-runtime/api/api/api.api deleted file mode 100644 index 74536e586a..0000000000 --- a/modulecheck-runtime/api/api/api.api +++ /dev/null @@ -1,83 +0,0 @@ -public final class modulecheck/runtime/ModuleCheckRunner { - public fun (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/FindingFactory;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/finding/FindingResultFactory;Lmodulecheck/reporting/console/ReportFactory;Lmodulecheck/reporting/checkstyle/CheckstyleReporter;Lmodulecheck/reporting/graphviz/GraphvizFileWriter;Ldispatch/core/DispatcherProvider;Lmodulecheck/reporting/sarif/SarifReportFactory;Ldagger/Lazy;Lmodulecheck/project/ProjectProvider;Ljava/util/List;Z)V - public final fun component1 ()Lmodulecheck/config/ModuleCheckSettings; - public final fun component10 ()Ldagger/Lazy; - public final fun component11 ()Lmodulecheck/project/ProjectProvider; - public final fun component12 ()Ljava/util/List; - public final fun component13 ()Z - public final fun component2 ()Lmodulecheck/rule/FindingFactory; - public final fun component3 ()Lmodulecheck/reporting/logging/McLogger; - public final fun component4 ()Lmodulecheck/finding/FindingResultFactory; - public final fun component5 ()Lmodulecheck/reporting/console/ReportFactory; - public final fun component6 ()Lmodulecheck/reporting/checkstyle/CheckstyleReporter; - public final fun component7 ()Lmodulecheck/reporting/graphviz/GraphvizFileWriter; - public final fun component8 ()Ldispatch/core/DispatcherProvider; - public final fun component9 ()Lmodulecheck/reporting/sarif/SarifReportFactory; - public final fun copy (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/FindingFactory;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/finding/FindingResultFactory;Lmodulecheck/reporting/console/ReportFactory;Lmodulecheck/reporting/checkstyle/CheckstyleReporter;Lmodulecheck/reporting/graphviz/GraphvizFileWriter;Ldispatch/core/DispatcherProvider;Lmodulecheck/reporting/sarif/SarifReportFactory;Ldagger/Lazy;Lmodulecheck/project/ProjectProvider;Ljava/util/List;Z)Lmodulecheck/runtime/ModuleCheckRunner; - public static synthetic fun copy$default (Lmodulecheck/runtime/ModuleCheckRunner;Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/FindingFactory;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/finding/FindingResultFactory;Lmodulecheck/reporting/console/ReportFactory;Lmodulecheck/reporting/checkstyle/CheckstyleReporter;Lmodulecheck/reporting/graphviz/GraphvizFileWriter;Ldispatch/core/DispatcherProvider;Lmodulecheck/reporting/sarif/SarifReportFactory;Ldagger/Lazy;Lmodulecheck/project/ProjectProvider;Ljava/util/List;ZILjava/lang/Object;)Lmodulecheck/runtime/ModuleCheckRunner; - public fun equals (Ljava/lang/Object;)Z - public final fun getAutoCorrect ()Z - public final fun getCheckstyleReporter ()Lmodulecheck/reporting/checkstyle/CheckstyleReporter; - public final fun getDepthLogFactoryLazy ()Ldagger/Lazy; - public final fun getDispatcherProvider ()Ldispatch/core/DispatcherProvider; - public final fun getFindingFactory ()Lmodulecheck/rule/FindingFactory; - public final fun getFindingResultFactory ()Lmodulecheck/finding/FindingResultFactory; - public final fun getGraphvizFileWriter ()Lmodulecheck/reporting/graphviz/GraphvizFileWriter; - public final fun getLogger ()Lmodulecheck/reporting/logging/McLogger; - public final fun getProjectProvider ()Lmodulecheck/project/ProjectProvider; - public final fun getReportFactory ()Lmodulecheck/reporting/console/ReportFactory; - public final fun getRules ()Ljava/util/List; - public final fun getSarifReportFactory ()Lmodulecheck/reporting/sarif/SarifReportFactory; - public final fun getSettings ()Lmodulecheck/config/ModuleCheckSettings; - public fun hashCode ()I - public final fun run-IoAF18A (Ljava/util/List;)Ljava/lang/Object; - public fun toString ()Ljava/lang/String; -} - -public abstract interface class modulecheck/runtime/ModuleCheckRunner$Factory { - public abstract fun create (Z)Lmodulecheck/runtime/ModuleCheckRunner; -} - -public final class modulecheck/runtime/ModuleCheckRunner$TimedResults { - public fun (JLjava/lang/Object;)V - public final fun component1 ()J - public final fun component2 ()Ljava/lang/Object; - public final fun copy (JLjava/lang/Object;)Lmodulecheck/runtime/ModuleCheckRunner$TimedResults; - public static synthetic fun copy$default (Lmodulecheck/runtime/ModuleCheckRunner$TimedResults;JLjava/lang/Object;ILjava/lang/Object;)Lmodulecheck/runtime/ModuleCheckRunner$TimedResults; - public fun equals (Ljava/lang/Object;)Z - public final fun getData ()Ljava/lang/Object; - public final fun getTimeMillis ()J - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/ModuleCheckRunner_Factory { - public static final field Companion Lmodulecheck/runtime/ModuleCheckRunner_Factory$Companion; - public fun (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)V - public static final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/runtime/ModuleCheckRunner_Factory; - public final fun get (Z)Lmodulecheck/runtime/ModuleCheckRunner; - public static final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/FindingFactory;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/finding/FindingResultFactory;Lmodulecheck/reporting/console/ReportFactory;Lmodulecheck/reporting/checkstyle/CheckstyleReporter;Lmodulecheck/reporting/graphviz/GraphvizFileWriter;Ldispatch/core/DispatcherProvider;Lmodulecheck/reporting/sarif/SarifReportFactory;Ldagger/Lazy;Lmodulecheck/project/ProjectProvider;Ljava/util/List;Z)Lmodulecheck/runtime/ModuleCheckRunner; -} - -public final class modulecheck/runtime/ModuleCheckRunner_Factory$Companion { - public final fun create (Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;Ljavax/inject/Provider;)Lmodulecheck/runtime/ModuleCheckRunner_Factory; - public final fun newInstance (Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/rule/FindingFactory;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/finding/FindingResultFactory;Lmodulecheck/reporting/console/ReportFactory;Lmodulecheck/reporting/checkstyle/CheckstyleReporter;Lmodulecheck/reporting/graphviz/GraphvizFileWriter;Ldispatch/core/DispatcherProvider;Lmodulecheck/reporting/sarif/SarifReportFactory;Ldagger/Lazy;Lmodulecheck/project/ProjectProvider;Ljava/util/List;Z)Lmodulecheck/runtime/ModuleCheckRunner; -} - -public final class modulecheck/runtime/ModuleCheckRunner_Factory_Impl : modulecheck/runtime/ModuleCheckRunner$Factory { - public static final field Companion Lmodulecheck/runtime/ModuleCheckRunner_Factory_Impl$Companion; - public fun (Lmodulecheck/runtime/ModuleCheckRunner_Factory;)V - public static final fun create (Lmodulecheck/runtime/ModuleCheckRunner_Factory;)Ljavax/inject/Provider; - public fun create (Z)Lmodulecheck/runtime/ModuleCheckRunner; - public static final fun createFactoryProvider (Lmodulecheck/runtime/ModuleCheckRunner_Factory;)Ldagger/internal/Provider; -} - -public final class modulecheck/runtime/ModuleCheckRunner_Factory_Impl$Companion { - public final fun create (Lmodulecheck/runtime/ModuleCheckRunner_Factory;)Ljavax/inject/Provider; - public final fun createFactoryProvider (Lmodulecheck/runtime/ModuleCheckRunner_Factory;)Ldagger/internal/Provider; -} - -public abstract interface class modulecheck/runtime/RunnerComponent { - public abstract fun getRunnerFactory ()Lmodulecheck/runtime/ModuleCheckRunner$Factory; -} - diff --git a/modulecheck-runtime/api/build.gradle.kts b/modulecheck-runtime/api/build.gradle.kts deleted file mode 100644 index ef4d13ad27..0000000000 --- a/modulecheck-runtime/api/build.gradle.kts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-runtime-api" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-reporting:checkstyle")) - api(project(path = ":modulecheck-reporting:console")) - api(project(path = ":modulecheck-reporting:graphviz")) - api(project(path = ":modulecheck-reporting:logging:api")) - api(project(path = ":modulecheck-reporting:sarif")) - api(project(path = ":modulecheck-rule:api")) - - implementation(project(path = ":modulecheck-api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - implementation(project(path = ":modulecheck-utils:trace")) -} diff --git a/modulecheck-runtime/api/src/main/kotlin/modulecheck/runtime/ModuleCheckRunner.kt b/modulecheck-runtime/api/src/main/kotlin/modulecheck/runtime/ModuleCheckRunner.kt deleted file mode 100644 index bde1c1c3ef..0000000000 --- a/modulecheck-runtime/api/src/main/kotlin/modulecheck/runtime/ModuleCheckRunner.kt +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.runtime - -import dagger.assisted.Assisted -import dagger.assisted.AssistedFactory -import dagger.assisted.AssistedInject -import dispatch.core.DispatcherProvider -import kotlinx.coroutines.runBlocking -import modulecheck.api.DepthFinding -import modulecheck.api.context.ProjectDepth -import modulecheck.config.ModuleCheckSettings -import modulecheck.dagger.DaggerLazy -import modulecheck.dagger.DaggerList -import modulecheck.finding.Finding -import modulecheck.finding.Finding.FindingResult -import modulecheck.finding.FindingResultFactory -import modulecheck.finding.Problem -import modulecheck.project.McProject -import modulecheck.project.ProjectProvider -import modulecheck.reporting.checkstyle.CheckstyleReporter -import modulecheck.reporting.console.DepthLogFactory -import modulecheck.reporting.console.DepthReportFactory -import modulecheck.reporting.console.ReportFactory -import modulecheck.reporting.graphviz.GraphvizFileWriter -import modulecheck.reporting.logging.McLogger -import modulecheck.reporting.sarif.SarifReportFactory -import modulecheck.rule.FindingFactory -import modulecheck.rule.ModuleCheckRule -import modulecheck.utils.createSafely -import modulecheck.utils.trace.Trace -import java.io.File -import kotlin.system.measureTimeMillis - -/** - * Proxy for a Gradle task, without all the Gradle framework - * stuff. Most logic is delegated to its various dependencies. - * - * @property findingFactory handles parsing of the projects in order to generate the findings - * @property findingResultFactory attempts to apply fixes to the findings and - * returns a list of [FindingResult][modulecheck.finding.Finding.FindingResult] - * @property reportFactory handles console output of the main results - * @property depthLogFactoryLazy handles console output of the depth results - * @since 0.12.0 - */ -data class ModuleCheckRunner @AssistedInject constructor( - val settings: ModuleCheckSettings, - val findingFactory: FindingFactory, - val logger: McLogger, - val findingResultFactory: FindingResultFactory, - val reportFactory: ReportFactory, - val checkstyleReporter: CheckstyleReporter, - val graphvizFileWriter: GraphvizFileWriter, - val dispatcherProvider: DispatcherProvider, - val sarifReportFactory: SarifReportFactory, - val depthLogFactoryLazy: DaggerLazy, - val projectProvider: ProjectProvider, - val rules: DaggerList>, - @Assisted - val autoCorrect: Boolean -) { - - fun run(projects: List): Result = runBlocking( - if (settings.trace) { - dispatcherProvider.default + Trace.start(ModuleCheckRunner::class) - } else { - dispatcherProvider.default - } - ) { - // total findings, whether they're fixed or not - var totalFindings = 0 - - val allFindings = mutableListOf() - - // number of findings which couldn't be fixed - // time does not include initial parsing from GradleProjectProvider, - // but does include all source file parsing and the amount of time spent applying fixes - val resultsWithTime = measured { - val fixableFindings = findingFactory.evaluateFixable(projects).distinct() - - val fixableResults = fixableFindings.filterIsInstance() - .filterNot { it.isSuppressed.await() } - .also { totalFindings += it.size } - .let { processFindings(it) } - - projectProvider.clearCaches() - - val sortFindings = findingFactory.evaluateSorts(projectProvider.getAll()) - .distinct() - - val sortsResults = sortFindings.filterIsInstance() - .filterNot { it.isSuppressed.await() } - .also { totalFindings += it.size } - .let { processFindings(it) } - - projectProvider.clearCaches() - - val reportOnlyFindings = findingFactory.evaluateReports(projectProvider.getAll()) - .distinct() - - processFindings(reportOnlyFindings) - - allFindings += fixableFindings + sortFindings + reportOnlyFindings - - fixableResults + sortsResults // + reportResults - } - - val allResults = resultsWithTime.data - - reportResults(allResults) - - val totalUnfixedIssues = allResults.count { !it.fixed } - - val depths = allFindings.filterIsInstance() - maybeLogDepths(depths) - maybeReportDepths(depths) - maybeCreateGraphs(depths.map { it.toProjectDepth() }) - - // Replace this with kotlinx Duration APIs as soon as it's stable - @Suppress("MagicNumber") - val secondsDouble = resultsWithTime.timeMillis / 1000.0 - - val issuePlural = if (totalFindings == 1) "issue" else "issues" - - logger.info("ModuleCheck found $totalFindings $issuePlural in $secondsDouble seconds.") - - if (totalFindings > 0) { - - logger.warning( - buildString { - appendLine() - appendLine() - append("To ignore any of these findings, ") - append("annotate the dependency declaration with ") - append("""@Suppress("") in Kotlin, """) - appendLine("or //noinspection in Groovy.") - appendLine( - "See https://rbusarow.github.io/ModuleCheck/docs/suppressing-findings for more info." - ) - } - ) - } - - if (totalUnfixedIssues > 0) { - - val wasPlural = if (totalFindings == 1) "was" else "were" - - Result.failure( - ModuleCheckFailure( - "ModuleCheck found $totalUnfixedIssues $issuePlural which $wasPlural not auto-corrected." - ) - ) - } else { - Result.success(Unit) - } - } - - /** - * Tries to fix all findings one project at a time, then reports the results. - * - * @since 0.12.0 - */ - private suspend fun processFindings(findings: List): List { - return findingResultFactory.create( - findings = findings, - autoCorrect = autoCorrect, - deleteUnused = settings.deleteUnused - ) - } - - /** - * Creates any applicable reports. - * - * @since 0.12.0 - */ - private fun reportResults(results: List) { - - val textReport = reportFactory.create(results) - - if (results.isNotEmpty()) { - logger.info(textReport) - } - - if (settings.reports.text.enabled) { - val path = settings.reports.text.outputPath - - File(path).createSafely(textReport) - } - - if (settings.reports.sarif.enabled) { - val path = settings.reports.sarif.outputPath - - val sarif = sarifReportFactory.create(results, rules) - - File(path) - .createSafely(sarif) - } - - if (settings.reports.checkstyle.enabled) { - val path = settings.reports.checkstyle.outputPath - - File(path) - .createSafely(checkstyleReporter.createXml(results)) - } - } - - private fun maybeLogDepths(depths: List) { - - if (depths.isEmpty()) return - - // TODO - this should probably be replaced with an explicit runtime argument, or the depths - // report should be folded into something like a "module metrics" finding/rule, so that - // `DepthFinding` can just be treated like a primitive. - // If the depths check is enabled, then just always log them. If the check is disabled but - // this is a single-rule "task", that means the user is explicitly running 'moduleCheckDepths' - // (or whatever that has been renamed to in the future) and the results should always be logged. - if (settings.checks.depths || rules.size == 1) { - val depthLog = depthLogFactoryLazy.get().create(depths) - - logger.info(depthLog) - } - } - - private fun maybeReportDepths(depths: List) { - if (settings.reports.depths.enabled) { - val path = settings.reports.depths.outputPath - - val depthReport = DepthReportFactory().create(depths) - - File(path).createSafely(depthReport) - } - } - - private suspend fun maybeCreateGraphs(depths: List) { - if (settings.reports.graphs.enabled) { - graphvizFileWriter.write(depths) - } - } - - private inline fun T.measured(action: T.() -> R): TimedResults { - var r: R - - val time = measureTimeMillis { - r = action() - } - - return TimedResults(time, r) - } - - data class TimedResults(val timeMillis: Long, val data: R) - - @AssistedFactory - interface Factory { - fun create(autoCorrect: Boolean): ModuleCheckRunner - } -} - -private class ModuleCheckFailure(message: String) : Exception(message) diff --git a/modulecheck-runtime/api/src/main/kotlin/modulecheck/runtime/RunnerComponent.kt b/modulecheck-runtime/api/src/main/kotlin/modulecheck/runtime/RunnerComponent.kt deleted file mode 100644 index 4990e3f546..0000000000 --- a/modulecheck-runtime/api/src/main/kotlin/modulecheck/runtime/RunnerComponent.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.runtime - -interface RunnerComponent { - - val runnerFactory: ModuleCheckRunner.Factory -} diff --git a/modulecheck-runtime/testing/api/testing.api b/modulecheck-runtime/testing/api/testing.api deleted file mode 100644 index 63eeca7c10..0000000000 --- a/modulecheck-runtime/testing/api/testing.api +++ /dev/null @@ -1,276 +0,0 @@ -public abstract interface class modulecheck/runtime/test/ProjectFindingReport { - public fun getConfiguration ()Ljava/lang/String; - public fun getDependency ()Ljava/lang/String; - public abstract fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun getSource ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$depth : modulecheck/runtime/test/ProjectFindingReport { - public fun (Z)V - public final fun component1 ()Z - public final fun copy (Z)Lmodulecheck/runtime/test/ProjectFindingReport$depth; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$depth;ZILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$depth; - public fun equals (Ljava/lang/Object;)Z - public fun getFixed ()Z - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$disableAndroidResources : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$disableAndroidResources; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$disableAndroidResources;ZLjava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$disableAndroidResources; - public fun equals (Ljava/lang/Object;)Z - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$disableViewBinding : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$disableViewBinding; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$disableViewBinding;ZLjava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$disableViewBinding; - public fun equals (Ljava/lang/Object;)Z - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$inheritedDependency : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$inheritedDependency; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$inheritedDependency;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$inheritedDependency; - public fun equals (Ljava/lang/Object;)Z - public fun getConfiguration ()Ljava/lang/String; - public fun getDependency ()Ljava/lang/String; - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun getSource ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$mustBeApi : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$mustBeApi; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$mustBeApi;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$mustBeApi; - public fun equals (Ljava/lang/Object;)Z - public fun getConfiguration ()Ljava/lang/String; - public fun getDependency ()Ljava/lang/String; - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$overshot : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$overshot; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$overshot;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$overshot; - public fun equals (Ljava/lang/Object;)Z - public fun getConfiguration ()Ljava/lang/String; - public fun getDependency ()Ljava/lang/String; - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$redundant : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun component5 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$redundant; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$redundant;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$redundant; - public fun equals (Ljava/lang/Object;)Z - public fun getConfiguration ()Ljava/lang/String; - public fun getDependency ()Ljava/lang/String; - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun getSource ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$unsortedDependencies : modulecheck/runtime/test/ProjectFindingReport { - public fun (Z)V - public final fun component1 ()Z - public final fun copy (Z)Lmodulecheck/runtime/test/ProjectFindingReport$unsortedDependencies; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$unsortedDependencies;ZILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$unsortedDependencies; - public fun equals (Ljava/lang/Object;)Z - public fun getFixed ()Z - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$unsortedPlugins : modulecheck/runtime/test/ProjectFindingReport { - public fun (Z)V - public final fun component1 ()Z - public final fun copy (Z)Lmodulecheck/runtime/test/ProjectFindingReport$unsortedPlugins; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$unsortedPlugins;ZILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$unsortedPlugins; - public fun equals (Ljava/lang/Object;)Z - public fun getFixed ()Z - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$unusedDependency : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedDependency; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$unusedDependency;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedDependency; - public fun equals (Ljava/lang/Object;)Z - public fun getConfiguration ()Ljava/lang/String; - public fun getDependency ()Ljava/lang/String; - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$unusedKaptPlugin : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;Ljava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedKaptPlugin; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$unusedKaptPlugin;ZLjava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedKaptPlugin; - public fun equals (Ljava/lang/Object;)Z - public fun getDependency ()Ljava/lang/String; - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$unusedKaptProcessor : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun component3 ()Ljava/lang/String; - public final fun component4 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedKaptProcessor; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$unusedKaptProcessor;ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedKaptProcessor; - public fun equals (Ljava/lang/Object;)Z - public fun getConfiguration ()Ljava/lang/String; - public fun getDependency ()Ljava/lang/String; - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$unusedKotlinAndroidExtensions : modulecheck/runtime/test/ProjectFindingReport { - public fun (ZLjava/lang/String;)V - public final fun component1 ()Z - public final fun component2 ()Ljava/lang/String; - public final fun copy (ZLjava/lang/String;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedKotlinAndroidExtensions; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$unusedKotlinAndroidExtensions;ZLjava/lang/String;ILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$unusedKotlinAndroidExtensions; - public fun equals (Ljava/lang/Object;)Z - public fun getFixed ()Z - public fun getPosition ()Ljava/lang/String; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/runtime/test/ProjectFindingReport$useAnvilFactories : modulecheck/runtime/test/ProjectFindingReport { - public fun (Z)V - public final fun component1 ()Z - public final fun copy (Z)Lmodulecheck/runtime/test/ProjectFindingReport$useAnvilFactories; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/ProjectFindingReport$useAnvilFactories;ZILjava/lang/Object;)Lmodulecheck/runtime/test/ProjectFindingReport$useAnvilFactories; - public fun equals (Ljava/lang/Object;)Z - public fun getFixed ()Z - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public abstract class modulecheck/runtime/test/RunnerTest : com/rickbusarow/kase/HasTestEnvironmentFactory, modulecheck/testing/assertions/TrimmedAsserts { - public fun ()V - public final fun findingFactory (Ljava/util/List;Ljava/util/List;Ljava/util/List;)Lmodulecheck/rule/FindingFactory; - public static synthetic fun findingFactory$default (Lmodulecheck/runtime/test/RunnerTest;Ljava/util/List;Ljava/util/List;Ljava/util/List;ILjava/lang/Object;)Lmodulecheck/rule/FindingFactory; - public fun getCodeGeneratorBindings ()Lkotlin/jvm/functions/Function1; - public fun getFindingFactory ()Lkotlin/jvm/functions/Function1; - public fun getLogger ()Lkotlin/jvm/functions/Function0; - public fun getRuleFilter ()Lkotlin/jvm/functions/Function0; - public fun getRules ()Lkotlin/jvm/functions/Function2; - public fun getSettings ()Lkotlin/jvm/functions/Function1; - public synthetic fun getTestEnvironmentFactory ()Lcom/rickbusarow/kase/TestEnvironmentFactory; - public fun getTestEnvironmentFactory ()Lmodulecheck/runtime/test/RunnerTestEnvironmentFactory; - public final fun run-5dDjBWM (Lmodulecheck/runtime/test/RunnerTestEnvironment;ZZLmodulecheck/rule/FindingFactory;Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/project/ProjectProvider;Lmodulecheck/finding/FindingResultFactory;Lcom/github/ajalt/mordant/terminal/Terminal;Lmodulecheck/reporting/console/ReportFactory;Lmodulecheck/reporting/checkstyle/CheckstyleReporter;Lmodulecheck/reporting/graphviz/GraphvizFileWriter;Ldispatch/core/DispatcherProvider;Ljava/util/List;)Ljava/lang/Object; - public static synthetic fun run-5dDjBWM$default (Lmodulecheck/runtime/test/RunnerTest;Lmodulecheck/runtime/test/RunnerTestEnvironment;ZZLmodulecheck/rule/FindingFactory;Lmodulecheck/config/ModuleCheckSettings;Lmodulecheck/reporting/logging/McLogger;Lmodulecheck/project/ProjectProvider;Lmodulecheck/finding/FindingResultFactory;Lcom/github/ajalt/mordant/terminal/Terminal;Lmodulecheck/reporting/console/ReportFactory;Lmodulecheck/reporting/checkstyle/CheckstyleReporter;Lmodulecheck/reporting/graphviz/GraphvizFileWriter;Ldispatch/core/DispatcherProvider;Ljava/util/List;ILjava/lang/Object;)Ljava/lang/Object; - public final fun shouldBe (Ljava/util/List;Ljava/util/List;)V - public fun test (Lcom/rickbusarow/kase/HasTestEnvironmentFactory;Ljava/lang/Object;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public fun test (Lcom/rickbusarow/kase/HasTestEnvironmentFactory;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public fun test (Lcom/rickbusarow/kase/NoParamTestEnvironmentFactory;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public final fun test (Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public fun test (Ljava/lang/Object;Lcom/rickbusarow/kase/TestEnvironmentFactory;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;)V - public static synthetic fun test$default (Lmodulecheck/runtime/test/RunnerTest;Lcom/rickbusarow/kase/files/TestLocation;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)V -} - -public class modulecheck/runtime/test/RunnerTestEnvironment : modulecheck/project/test/ProjectTestEnvironment { - public fun (Lmodulecheck/project/ProjectCache;Lmodulecheck/reporting/logging/test/ReportingLogger;Lmodulecheck/rule/RuleFilter;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;)V - public fun getCodeGeneratorBindings ()Ljava/util/List; - public final fun getFindingFactory ()Lmodulecheck/rule/FindingFactory; - public final fun getLogger ()Lmodulecheck/reporting/logging/test/ReportingLogger; - public fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public final fun getRuleFilter ()Lmodulecheck/rule/RuleFilter; - public final fun getRules ()Ljava/util/List; - public final fun getSettings ()Lmodulecheck/config/ModuleCheckSettings; - public final fun parsedReport (Lmodulecheck/reporting/logging/test/ReportingLogger;)Ljava/util/List; -} - -public final class modulecheck/runtime/test/RunnerTestEnvironmentFactory : com/rickbusarow/kase/ParamTestEnvironmentFactory { - public fun ()V - public synthetic fun create (Ljava/lang/Object;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;)Lcom/rickbusarow/kase/TestEnvironment; - public fun create (Lmodulecheck/runtime/test/RunnerTestEnvironmentParams;Ljava/util/List;Lcom/rickbusarow/kase/files/TestLocation;)Lmodulecheck/runtime/test/RunnerTestEnvironment; -} - -public final class modulecheck/runtime/test/RunnerTestEnvironmentParams : modulecheck/testing/TestEnvironmentParams { - public fun (Lmodulecheck/project/ProjectCache;Lmodulecheck/reporting/logging/test/ReportingLogger;Lmodulecheck/rule/RuleFilter;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)V - public final fun component1 ()Lmodulecheck/project/ProjectCache; - public final fun component2 ()Lmodulecheck/reporting/logging/test/ReportingLogger; - public final fun component3 ()Lmodulecheck/rule/RuleFilter; - public final fun component4 ()Lkotlin/jvm/functions/Function1; - public final fun component5 ()Lkotlin/jvm/functions/Function1; - public final fun component6 ()Lkotlin/jvm/functions/Function2; - public final fun component7 ()Lkotlin/jvm/functions/Function1; - public final fun copy (Lmodulecheck/project/ProjectCache;Lmodulecheck/reporting/logging/test/ReportingLogger;Lmodulecheck/rule/RuleFilter;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;)Lmodulecheck/runtime/test/RunnerTestEnvironmentParams; - public static synthetic fun copy$default (Lmodulecheck/runtime/test/RunnerTestEnvironmentParams;Lmodulecheck/project/ProjectCache;Lmodulecheck/reporting/logging/test/ReportingLogger;Lmodulecheck/rule/RuleFilter;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/runtime/test/RunnerTestEnvironmentParams; - public fun equals (Ljava/lang/Object;)Z - public final fun getCodeGeneratorBindings ()Lkotlin/jvm/functions/Function1; - public final fun getFindingFactory ()Lkotlin/jvm/functions/Function1; - public final fun getLogger ()Lmodulecheck/reporting/logging/test/ReportingLogger; - public final fun getProjectCache ()Lmodulecheck/project/ProjectCache; - public final fun getRuleFilter ()Lmodulecheck/rule/RuleFilter; - public final fun getRules ()Lkotlin/jvm/functions/Function2; - public final fun getSettings ()Lkotlin/jvm/functions/Function1; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - diff --git a/modulecheck-runtime/testing/build.gradle.kts b/modulecheck-runtime/testing/build.gradle.kts deleted file mode 100644 index f88ecc2edc..0000000000 --- a/modulecheck-runtime/testing/build.gradle.kts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-runtime-testing" - ) - anvil() -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - - api(project(path = ":modulecheck-config:api")) - api(project(path = ":modulecheck-dagger")) - api(project(path = ":modulecheck-finding:api")) - api(project(path = ":modulecheck-internal-testing")) - api(project(path = ":modulecheck-project:api")) - api(project(path = ":modulecheck-project:testing")) - api(project(path = ":modulecheck-reporting:checkstyle")) - api(project(path = ":modulecheck-reporting:console")) - api(project(path = ":modulecheck-reporting:graphviz")) - api(project(path = ":modulecheck-reporting:logging:api")) - api(project(path = ":modulecheck-reporting:logging:testing")) - api(project(path = ":modulecheck-rule:api")) - api(project(path = ":modulecheck-rule:impl-factory")) - - implementation(project(path = ":modulecheck-config:fake")) - implementation(project(path = ":modulecheck-config:impl")) - implementation(project(path = ":modulecheck-reporting:sarif")) - implementation(project(path = ":modulecheck-rule:testing")) - implementation(project(path = ":modulecheck-runtime:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) -} diff --git a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/ProjectFindingReport.kt b/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/ProjectFindingReport.kt deleted file mode 100644 index a89e638a68..0000000000 --- a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/ProjectFindingReport.kt +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.runtime.test - -sealed interface ProjectFindingReport { - - val fixed: Boolean - val configuration: String? get() = null - val dependency: String? get() = null - val source: String? get() = null - val position: String? get() = null - - data class inheritedDependency( - override val fixed: Boolean, - override val configuration: String?, - override val dependency: String?, - override val source: String?, - override val position: String? - ) : ProjectFindingReport - - data class mustBeApi( - override val fixed: Boolean, - override val configuration: String?, - override val dependency: String?, - override val position: String? - ) : ProjectFindingReport - - data class overshot( - override val fixed: Boolean, - override val configuration: String?, - override val dependency: String?, - override val position: String? - ) : ProjectFindingReport - - data class redundant( - override val fixed: Boolean, - override val configuration: String?, - override val dependency: String?, - override val source: String?, - override val position: String? - ) : ProjectFindingReport - - data class unusedDependency( - override val fixed: Boolean, - override val configuration: String?, - override val dependency: String?, - override val position: String? - ) : ProjectFindingReport - - data class depth(override val fixed: Boolean) : ProjectFindingReport - data class useAnvilFactories(override val fixed: Boolean) : ProjectFindingReport - data class disableViewBinding(override val fixed: Boolean, override val position: String?) : - ProjectFindingReport - - data class unsortedDependencies(override val fixed: Boolean) : ProjectFindingReport - data class unsortedPlugins(override val fixed: Boolean) : ProjectFindingReport - data class unusedKaptPlugin( - override val fixed: Boolean, - override val dependency: String?, - override val position: String? - ) : ProjectFindingReport - - data class unusedKaptProcessor( - override val fixed: Boolean, - override val configuration: String?, - override val dependency: String?, - override val position: String? - ) : ProjectFindingReport - - data class disableAndroidResources(override val fixed: Boolean, override val position: String?) : - ProjectFindingReport - - data class unusedKotlinAndroidExtensions( - override val fixed: Boolean, - override val position: String? - ) : - ProjectFindingReport -} diff --git a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/RunnerTest.kt b/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/RunnerTest.kt deleted file mode 100644 index cdd39cc3ac..0000000000 --- a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/RunnerTest.kt +++ /dev/null @@ -1,196 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.runtime.test - -import com.github.ajalt.mordant.terminal.Terminal -import com.rickbusarow.kase.HasTestEnvironmentFactory -import com.rickbusarow.kase.asClueCatching -import com.rickbusarow.kase.files.TestLocation -import dispatch.core.DispatcherProvider -import io.kotest.assertions.asClue -import kotlinx.coroutines.runBlocking -import modulecheck.config.ModuleCheckSettings -import modulecheck.config.fake.TestSettings -import modulecheck.config.internal.defaultCodeGeneratorBindings -import modulecheck.dagger.DaggerList -import modulecheck.finding.Finding -import modulecheck.finding.FindingResultFactory -import modulecheck.project.McProject -import modulecheck.project.ProjectCache -import modulecheck.project.ProjectProvider -import modulecheck.project.toTypeSafeProjectPathResolver -import modulecheck.reporting.checkstyle.CheckstyleReporter -import modulecheck.reporting.console.DepthLogFactory -import modulecheck.reporting.console.ReportFactory -import modulecheck.reporting.graphviz.GraphvizFactory -import modulecheck.reporting.graphviz.GraphvizFileWriter -import modulecheck.reporting.logging.McLogger -import modulecheck.reporting.logging.TerminalModule -import modulecheck.reporting.logging.test.ReportingLogger -import modulecheck.reporting.sarif.SarifReportFactory -import modulecheck.rule.FindingFactory -import modulecheck.rule.ModuleCheckRule -import modulecheck.rule.RuleFilter -import modulecheck.rule.impl.FindingFactoryImpl -import modulecheck.rule.impl.RealFindingResultFactory -import modulecheck.rule.test.AllRulesComponent -import modulecheck.runtime.ModuleCheckRunner -import modulecheck.testing.assertions.TrimmedAsserts -import modulecheck.utils.mapToSet - -@Suppress("UnnecessaryAbstractClass") -abstract class RunnerTest : - HasTestEnvironmentFactory, - TrimmedAsserts { - - override val testEnvironmentFactory = RunnerTestEnvironmentFactory() - - open val settings: RunnerTestEnvironment.() -> ModuleCheckSettings = { TestSettings() } - open val logger: () -> ReportingLogger = { ReportingLogger() } - - open val ruleFilter: () -> RuleFilter = { RuleFilter.DEFAULT } - - open val rules: (ModuleCheckSettings, RuleFilter) -> List> = - { settings, ruleFilter -> - AllRulesComponent.create(settings, ruleFilter).allRules - } - open val findingFactory: (List>) -> FindingFactory = { rules -> - FindingFactoryImpl(rules) - } - open val codeGeneratorBindings = { settings: ModuleCheckSettings -> - settings.additionalCodeGenerators - .plus(defaultCodeGeneratorBindings()) - .plus( - @Suppress("DEPRECATION") - settings.additionalKaptMatchers.mapToSet { it.toCodeGeneratorBinding() } - ) - } - - /** shorthand for executing a test in a hermetic TestEnvironment but without any kase parameters */ - fun test( - testLocation: TestLocation = TestLocation.get(), - testAction: suspend RunnerTestEnvironment.() -> Unit - ) { - val testEnvironment = testEnvironmentFactory.create( - params = RunnerTestEnvironmentParams( - projectCache = ProjectCache(), - logger = logger(), - ruleFilter = ruleFilter(), - settings = settings, - codeGeneratorBindings = codeGeneratorBindings, - rules = rules, - findingFactory = findingFactory - ), - names = emptyList(), - location = testLocation - ) - - runBlocking { - testEnvironment.asClueCatching { - testEnvironment.testAction() - println(testEnvironment) - } - } - } - - fun RunnerTestEnvironment.run( - autoCorrect: Boolean = true, - strictResolution: Boolean = false, - findingFactory: FindingFactory = this.findingFactory, - settings: ModuleCheckSettings = this.settings, - logger: McLogger = this.logger, - projectProvider: ProjectProvider = this.projectProvider, - findingResultFactory: FindingResultFactory = RealFindingResultFactory(), - terminal: Terminal = TerminalModule.provideTerminal(), - reportFactory: ReportFactory = ReportFactory(terminal), - checkstyleReporter: CheckstyleReporter = CheckstyleReporter(), - graphvizFileWriter: GraphvizFileWriter = GraphvizFileWriter( - settings = settings, - graphvizFactory = GraphvizFactory(projectProvider.toTypeSafeProjectPathResolver()) - ), - dispatcherProvider: DispatcherProvider = DispatcherProvider(), - rules: DaggerList> = this.rules - ): Result { - - "Resolving all references BEFORE running ModuleCheck".asClue { - if (strictResolution) { - runBlocking { resolveReferences() } - } - } - - val result = ModuleCheckRunner( - settings = settings, - findingFactory = findingFactory, - logger = logger, - findingResultFactory = findingResultFactory, - reportFactory = reportFactory, - checkstyleReporter = checkstyleReporter, - graphvizFileWriter = graphvizFileWriter, - dispatcherProvider = dispatcherProvider, - sarifReportFactory = SarifReportFactory( - websiteUrl = { "https://rbusarow.github.io/ModuleCheck" }, - moduleCheckVersion = { "0.12.1-SNAPSHOT" } - ) { workingDir }, - depthLogFactoryLazy = { DepthLogFactory(terminal) }, - projectProvider = projectProvider, - rules = rules, - autoCorrect = autoCorrect - ) - .run(allProjects()) - - if (autoCorrect) { - - // Re-parse everything from scratch to ensure that auto-correct didn't break anything. - projectCache.clearContexts() - - "Resolving all references after auto-correct\n".asClue { - if (strictResolution) { - runBlocking { resolveReferences() } - } - } - } - - return result - } - - fun findingFactory( - fixable: List = emptyList(), - sorts: List = emptyList(), - reports: List = emptyList() - ): FindingFactory<*> = object : FindingFactory { - - override suspend fun evaluateFixable(projects: List): List = fixable - override suspend fun evaluateSorts(projects: List): List = sorts - override suspend fun evaluateReports(projects: List): List = reports - } - - private fun List>>.sorted() = sortedBy { it.first } - .map { (path, findings) -> - path to findings.sortedBy { findingReport -> - - val findingName = findingReport::class.java.simpleName - val config = findingReport.configuration ?: "-" - - "$findingName$config${findingReport.position}" - } - } - - infix fun List>>.shouldBe( - expected: List>> - ) { - sorted().trimmedShouldBe(expected.sorted(), RunnerTest::class) - } -} diff --git a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/RunnerTestEnvironment.kt b/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/RunnerTestEnvironment.kt deleted file mode 100644 index 8dbd0b6f6d..0000000000 --- a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/RunnerTestEnvironment.kt +++ /dev/null @@ -1,126 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.runtime.test - -import com.rickbusarow.kase.ParamTestEnvironmentFactory -import com.rickbusarow.kase.files.TestLocation -import modulecheck.config.CodeGeneratorBinding -import modulecheck.config.ModuleCheckSettings -import modulecheck.finding.Finding -import modulecheck.project.ProjectCache -import modulecheck.project.test.ProjectTestEnvironment -import modulecheck.reporting.logging.test.ReportingLogger -import modulecheck.rule.FindingFactory -import modulecheck.rule.ModuleCheckRule -import modulecheck.rule.RuleFilter -import modulecheck.testing.TestEnvironmentParams -import modulecheck.testing.clean - -/** - * Defines a test environment which uses a - * [ModuleCheckRunner][modulecheck.runtime.ModuleCheckRunner]. - * - * @property projectCache An instance of [ProjectCache]. - * @property logger A [ReportingLogger] for logging reporting events. - * @property ruleFilter A [RuleFilter] for filtering out unwanted rules. - * @property settings A function to generate [ModuleCheckSettings]. - * @property codeGeneratorBindings A function to generate a list of [CodeGeneratorBinding]. - * @property rules A function to generate a list of [ModuleCheckRule]. - * @property findingFactory A function to generate a [FindingFactory]. - */ -data class RunnerTestEnvironmentParams( - val projectCache: ProjectCache, - val logger: ReportingLogger, - val ruleFilter: RuleFilter, - val settings: (RunnerTestEnvironment) -> ModuleCheckSettings, - val codeGeneratorBindings: (ModuleCheckSettings) -> List, - val rules: (ModuleCheckSettings, RuleFilter) -> List>, - val findingFactory: (List>) -> FindingFactory -) : TestEnvironmentParams - -class RunnerTestEnvironmentFactory : ParamTestEnvironmentFactory { - override fun create( - params: RunnerTestEnvironmentParams, - names: List, - location: TestLocation - ): RunnerTestEnvironment = RunnerTestEnvironment( - projectCache = params.projectCache, - logger = params.logger, - ruleFilter = params.ruleFilter, - settings = params.settings, - codeGeneratorBindings = params.codeGeneratorBindings, - rules = params.rules, - findingFactory = params.findingFactory, - names = names, - testLocation = location - ) -} - -/** - * Defines a test environment which uses a - * [ModuleCheckRunner][modulecheck.runtime.ModuleCheckRunner]. - * - * @property projectCache An instance of [ProjectCache]. - * @property logger A [ReportingLogger] for logging reporting events. - * @property ruleFilter A [RuleFilter] for filtering out unwanted rules. - * @param settings A function to generate [ModuleCheckSettings]. - * @param codeGeneratorBindings A function to generate a list of [CodeGeneratorBinding]. - * @param rules A function to generate a list of [ModuleCheckRule]. - * @param findingFactory A function to generate a [FindingFactory]. - * @param names Array of variant names for the test. - * @param testLocation details about the actual test function, so that we can - * get the test name. This must be grabbed as soon as possible, since default - * functions, inline functions, sequences, and iterators all redirect things - * and have a chance of hiding the original calling function completely. - */ -open class RunnerTestEnvironment( - override val projectCache: ProjectCache, - val logger: ReportingLogger, - val ruleFilter: RuleFilter, - settings: (RunnerTestEnvironment) -> ModuleCheckSettings, - codeGeneratorBindings: (ModuleCheckSettings) -> List, - rules: (ModuleCheckSettings, RuleFilter) -> List>, - findingFactory: (List>) -> FindingFactory, - names: List, - testLocation: TestLocation -) : ProjectTestEnvironment( - projectCache = projectCache, - names = names, - testLocation = testLocation -) { - - val settings: ModuleCheckSettings by lazy { settings.invoke(this) } - override val codeGeneratorBindings: List by lazy { - codeGeneratorBindings(this.settings) - } - - val rules: List> by lazy { rules.invoke(this.settings, ruleFilter) } - - val findingFactory: FindingFactory by lazy { findingFactory(this.rules) } - - /** - * Parses the log report into a list of pairs, each containing - * a report title and a list of [ProjectFindingReport]. - * - * @receiver The [ReportingLogger] whose logs are to be parsed. - * @return A list of pairs, each containing a report title and a list of [ProjectFindingReport]. - */ - fun ReportingLogger.parsedReport(): List>> { - return collectReport().joinToString() - .clean(workingDir) - .parseReportOutput() - } -} diff --git a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/outputParsing.kt b/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/outputParsing.kt deleted file mode 100644 index 30dfd63958..0000000000 --- a/modulecheck-runtime/testing/src/main/kotlin/modulecheck/runtime/test/outputParsing.kt +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.runtime.test - -import modulecheck.reporting.console.ReportFactory -import modulecheck.runtime.test.ProjectFindingReport.depth -import modulecheck.runtime.test.ProjectFindingReport.disableAndroidResources -import modulecheck.runtime.test.ProjectFindingReport.disableViewBinding -import modulecheck.runtime.test.ProjectFindingReport.inheritedDependency -import modulecheck.runtime.test.ProjectFindingReport.mustBeApi -import modulecheck.runtime.test.ProjectFindingReport.overshot -import modulecheck.runtime.test.ProjectFindingReport.redundant -import modulecheck.runtime.test.ProjectFindingReport.unsortedDependencies -import modulecheck.runtime.test.ProjectFindingReport.unsortedPlugins -import modulecheck.runtime.test.ProjectFindingReport.unusedDependency -import modulecheck.runtime.test.ProjectFindingReport.unusedKaptPlugin -import modulecheck.runtime.test.ProjectFindingReport.unusedKaptProcessor -import modulecheck.runtime.test.ProjectFindingReport.unusedKotlinAndroidExtensions -import modulecheck.runtime.test.ProjectFindingReport.useAnvilFactories -import modulecheck.utils.noAnsi -import modulecheck.utils.remove -import kotlin.properties.Delegates - -private typealias ProjectPath = String - -@Suppress("VariableNaming") -internal fun String.parseReportOutput(): List>> { - - val resultLineStarters = listOf(ReportFactory.FIXED, ReportFactory.ERROR) - - // use a LinkedHashMap so that the order of paths is preserved - val map = LinkedHashMap>() - - var currentPath by Delegates.notNull() - var fixedIndex = -1 - var configurationIndex = -1 - var dependencyIndex = -1 - var ruleNameIndex = -1 - var sourceIndex = -1 - var positionIndex = -1 - - val currentPathRegex = " *:\\S.*".toRegex() - val header = " *configuration *dependency *name *source *build file *".toRegex() - val filePathRegex = """/[^/]*/build\.gradle(?:\.kts)?:""".toRegex() - - lineSequence() - .map { it.noAnsi() } - .filter { it.isNotBlank() } - .map { it.remove(filePathRegex) } - .onEach { println(" line 1 --- $it") } - .forEach { line -> - val trimmed = line.trim() - - when { - line.matches(header) -> { - configurationIndex = line.indexOf("configuration") - fixedIndex = configurationIndex - (ReportFactory.PADDING + 2) - dependencyIndex = line.indexOf("dependency") - ruleNameIndex = line.indexOf("name") - sourceIndex = line.indexOf("source") - positionIndex = line.indexOf("build file") - } - - line.matches(currentPathRegex) -> { - require(map[trimmed] == null) { - "An entry for `$trimmed` already exists in the map of results. " + - "Are there two header lines for this path in the console output?" - } - map[trimmed] = mutableListOf() - currentPath = trimmed - } - - resultLineStarters.any { trimmed.startsWith(it) } -> { - - val fixedString = line.substring(fixedIndex until configurationIndex).trim() - - val configuration = line.substring(configurationIndex until dependencyIndex) - .trim() - .takeIf { it.isNotBlank() } - val dependency = line.substring(dependencyIndex until ruleNameIndex) - .trim() - .takeIf { it.isNotBlank() } - val ruleName = line.substring(ruleNameIndex until sourceIndex).trim() - val source = line.substring(sourceIndex until positionIndex).trim().takeIf { - it.isNotBlank() - } - val position = line.drop(positionIndex).trim() - .takeIf { it.isNotBlank() } - ?.remove("""[():]""".toRegex()) - - val fixed = when (fixedString) { - ReportFactory.FIXED -> true - ReportFactory.ERROR -> false - else -> error( - "The parsed string `$fixedString` must be one of " + - "[${resultLineStarters.joinToString { "`$it`" }}]." - ) - } - - val t = when (ruleName) { - "inherited-dependency" -> inheritedDependency( - fixed, - configuration, - dependency, - source, - position - ) - - "must-be-api" -> mustBeApi( - fixed = fixed, - configuration = configuration, - dependency = dependency, - position = position - ) - - "overshot-dependency" -> overshot( - fixed = fixed, - configuration = configuration, - dependency = dependency, - position = position - ) - - "redundant-dependency" -> redundant( - fixed = fixed, - configuration = configuration, - dependency = dependency, - source = source, - position = position - ) - - "unused-dependency" -> unusedDependency( - fixed = fixed, - configuration = configuration, - dependency = dependency, - position = position - ) - - "project-depth" -> depth(fixed) - "use-anvil-factory-generation" -> useAnvilFactories(fixed) - "disable-view-binding" -> disableViewBinding(fixed = fixed, position = position) - "sort-dependencies" -> unsortedDependencies(fixed) - "sort-plugins" -> unsortedPlugins(fixed) - "unused-kapt-plugin" -> unusedKaptPlugin( - fixed = fixed, - dependency = dependency, - position = position - ) - - "unused-kapt-processor" -> unusedKaptProcessor( - fixed = fixed, - configuration = configuration, - dependency = dependency, - position = position - ) - - "unused-kotlin-android-extensions" -> unusedKotlinAndroidExtensions( - fixed = fixed, - position = position - ) - - "disable-android-resources" -> disableAndroidResources( - fixed = fixed, - position = position - ) - - else -> error("could not parse a finding result type for name of `$ruleName`.") - } - - map.getValue(currentPath).add(t) - } - } - } - - return map.toList() -} diff --git a/modulecheck-utils/cache/api/cache.api b/modulecheck-utils/cache/api/cache.api deleted file mode 100644 index e4d6c50a81..0000000000 --- a/modulecheck-utils/cache/api/cache.api +++ /dev/null @@ -1,12 +0,0 @@ -public abstract interface class modulecheck/utils/cache/SafeCache : modulecheck/utils/trace/HasTraceTags { - public static final field Companion Lmodulecheck/utils/cache/SafeCache$Companion; - public abstract fun getOrPut (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getValues ()Lkotlinx/coroutines/flow/Flow; -} - -public final class modulecheck/utils/cache/SafeCache$Companion { - public final fun invoke (Ljava/lang/Iterable;Ljava/util/Map;)Lmodulecheck/utils/cache/SafeCache; - public final fun invoke (Ljava/lang/Iterable;[Lkotlin/Pair;)Lmodulecheck/utils/cache/SafeCache; - public static synthetic fun invoke$default (Lmodulecheck/utils/cache/SafeCache$Companion;Ljava/lang/Iterable;Ljava/util/Map;ILjava/lang/Object;)Lmodulecheck/utils/cache/SafeCache; -} - diff --git a/modulecheck-utils/cache/build.gradle.kts b/modulecheck-utils/cache/build.gradle.kts deleted file mode 100644 index 130ae40155..0000000000 --- a/modulecheck-utils/cache/build.gradle.kts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-cache" - ) -} - -dependencies { - - api(libs.benManes.caffeine) - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - api(project(path = ":modulecheck-utils:trace")) - - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:lazy")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotlinx.coroutines.test) - testImplementation(libs.square.turbine) - - testImplementation(project(path = ":modulecheck-utils:trace-testing")) -} diff --git a/modulecheck-utils/cache/src/main/kotlin/modulecheck/utils/cache/SafeCache.kt b/modulecheck-utils/cache/src/main/kotlin/modulecheck/utils/cache/SafeCache.kt deleted file mode 100644 index 82dd9d3923..0000000000 --- a/modulecheck-utils/cache/src/main/kotlin/modulecheck/utils/cache/SafeCache.kt +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.cache - -import com.github.benmanes.caffeine.cache.Cache -import com.github.benmanes.caffeine.cache.Caffeine -import kotlinx.coroutines.currentCoroutineContext -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.supervisorScope -import modulecheck.utils.coroutines.mapAsyncNotNull -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.trace.HasTraceTags -import modulecheck.utils.trace.Trace -import modulecheck.utils.trace.traced - -/** - * A thread (and coroutine) -safe cache, with automatic eviction. - * - * When accessing data via [getOrPut], the operation inside the lambda is guaranteed to only - * execute once for each key -- unless the previous data has been evicted from the cache. - * - * @since 0.12.0 - */ -interface SafeCache : HasTraceTags { - - val values: Flow - - /** - * This is conceptually similar to - * [ConcurrentHashMap.computeIfAbsent][java.util.concurrent.ConcurrentHashMap.computeIfAbsent]. - * - * @param key the unique key for the desired value - * @param loader the action to perform if [key] does not already have a value - * in the cache. This action is guaranteed only to be performed once per key. - * @return the value associated with this [key] - * @since 0.12.0 - */ - suspend fun getOrPut(key: K, loader: suspend () -> V): V - - companion object { - /** - * @return a [SafeCache] with initial initialValues of [initialValues] - * @since 0.12.0 - */ - operator fun invoke( - tags: Iterable, - initialValues: Map = emptyMap() - ): SafeCache { - - val tagsList = tags.toList() - - check(tagsList.isNotEmpty()) { - "You must provide at least one tag when creating a ${SafeCache::class.java.simpleName}." - } - return RealSafeCache(tagsList, initialValues.toList()) - } - - /** - * @return a [SafeCache] with initial initialValues of [initialValues] - * @since 0.12.0 - */ - operator fun invoke( - tags: Iterable, - vararg initialValues: Pair - ): SafeCache { - - val tagsList = tags.toList() - - check(tagsList.isNotEmpty()) { - "You must provide at least one tag when creating a ${SafeCache::class.java.simpleName}." - } - return RealSafeCache(tagsList, initialValues = initialValues.toList()) - } - } -} - -internal class RealSafeCache( - override val tags: Iterable, - initialValues: List> -) : SafeCache { - - /** - * Note that the api surface is that of a `Cache`, but this is using a - * `LazyDeferred`. This allows all "loader" operations to be light-weight and non-recursive. - * - * @see getOrPut - * @since 0.12.0 - */ - private val delegate: Cache> = Caffeine.newBuilder() - .build>() - .also { cache -> - val initialMap = initialValues.associate { (key, value) -> - key to lazyDeferred { value } - } - cache.putAll(initialMap) - } - - override val values: Flow - get() = delegate.asMap() - .values - .mapAsyncNotNull { it.await() } - - override suspend fun getOrPut(key: K, loader: suspend () -> V): V { - return traced(key) { - supervisorScope { - try { - // Note that the cache is only holding a LazyDeferred, - // and we return that LazyDeferred without actually calling `await()`. - val deferred = delegate.get(key) { lazyDeferred { loader() } } - - deferred.await() - } catch (exception: IllegalStateException) { - - val trace = currentCoroutineContext()[Trace] ?: throw exception - throw IllegalStateException( - """ - |${exception.message} - | - |${trace.asString()} - """.replaceIndentByMargin(), - exception - ) - } - } - } - } -} diff --git a/modulecheck-utils/cache/src/test/kotlin/modulecheck/utils/cache/SafeCacheTest.kt b/modulecheck-utils/cache/src/test/kotlin/modulecheck/utils/cache/SafeCacheTest.kt deleted file mode 100644 index 77ba7010ab..0000000000 --- a/modulecheck-utils/cache/src/test/kotlin/modulecheck/utils/cache/SafeCacheTest.kt +++ /dev/null @@ -1,85 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.cache - -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.CoroutineStart.UNDISPATCHED -import kotlinx.coroutines.async -import modulecheck.utils.lazy.lazyDeferred -import modulecheck.utils.trace.test.runTestTraced -import org.junit.jupiter.api.Test -import org.junit.jupiter.api.fail -import java.util.concurrent.atomic.AtomicInteger - -internal class SafeCacheTest { - - @Test - fun `concurrent misses should only execute the lambda once`() = runTestTraced { - - val expectCount = AtomicInteger(0) - - fun expect(value: Int) { - expectCount.incrementAndGet() shouldBe value - } - - val cache = SafeCache(listOf("cache")) - val lock = CompletableDeferred() - - val one = async(start = UNDISPATCHED) { - expect(1) - cache.getOrPut("key") { - lock.await() - 1 - } - } - val two = async(start = UNDISPATCHED) { - expect(2) - cache.getOrPut("key") { fail("This lambda should never execute") } - } - - expect(3) - - lock.complete(Unit) - - one.await() shouldBe 1 - two.await() shouldBe 1 - } - - @Test - fun `loaders can access other keys in the same cache`() = runTestTraced { - - val expectCount = AtomicInteger(0) - - fun expect(value: Int) { - expectCount.incrementAndGet() shouldBe value - } - - val cache = SafeCache(listOf("cache")) - - val one = lazyDeferred { - expect(2) - cache.getOrPut("one") { 1 } - } - val two = lazyDeferred { - expect(1) - cache.getOrPut("two") { one.await() } - } - - two.await() shouldBe 1 - one.await() shouldBe 1 - } -} diff --git a/modulecheck-utils/coroutines/api/api/api.api b/modulecheck-utils/coroutines/api/api/api.api deleted file mode 100644 index 27bb2a4415..0000000000 --- a/modulecheck-utils/coroutines/api/api/api.api +++ /dev/null @@ -1,28 +0,0 @@ -public final class modulecheck/utils/coroutines/FlowKt { - public static final fun any (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun contains (Lkotlinx/coroutines/flow/Flow;Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun distinct (Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; - public static final fun filterAsync (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun filterAsync (Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun filterAsync (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun flatMapListConcat (Lkotlinx/coroutines/flow/Flow;Ljava/util/List;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun flatMapListConcat (Lkotlinx/coroutines/flow/Flow;Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun flatMapListConcat$default (Lkotlinx/coroutines/flow/Flow;Ljava/util/List;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public static synthetic fun flatMapListConcat$default (Lkotlinx/coroutines/flow/Flow;Ljava/util/List;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public static final fun flatMapListMerge (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun flatMapListMerge (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun flatMapSetConcat (Lkotlinx/coroutines/flow/Flow;Ljava/util/Set;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun flatMapSetConcat (Lkotlinx/coroutines/flow/Flow;Ljava/util/Set;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static synthetic fun flatMapSetConcat$default (Lkotlinx/coroutines/flow/Flow;Ljava/util/Set;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public static synthetic fun flatMapSetConcat$default (Lkotlinx/coroutines/flow/Flow;Ljava/util/Set;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;ILjava/lang/Object;)Ljava/lang/Object; - public static final fun flatMapSetMerge (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun mapAsync (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun mapAsync (Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun mapAsync (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun mapAsyncNotNull (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun mapAsyncNotNull (Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun mapAsyncNotNull (Lkotlinx/coroutines/flow/Flow;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun onEachAsync (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;)Lkotlinx/coroutines/flow/Flow; - public static final fun plus (Lkotlinx/coroutines/flow/Flow;Lkotlinx/coroutines/flow/Flow;)Lkotlinx/coroutines/flow/Flow; -} - diff --git a/modulecheck-utils/coroutines/api/build.gradle.kts b/modulecheck-utils/coroutines/api/build.gradle.kts deleted file mode 100644 index e99f7b01c4..0000000000 --- a/modulecheck-utils/coroutines/api/build.gradle.kts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-coroutines-api" - ) -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jdk8) - api(libs.kotlinx.coroutines.jvm) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotlinx.coroutines.test) - testImplementation(libs.square.turbine) -} diff --git a/modulecheck-utils/coroutines/api/src/main/kotlin/modulecheck/utils/coroutines/flow.kt b/modulecheck-utils/coroutines/api/src/main/kotlin/modulecheck/utils/coroutines/flow.kt deleted file mode 100644 index 896e48960d..0000000000 --- a/modulecheck-utils/coroutines/api/src/main/kotlin/modulecheck/utils/coroutines/flow.kt +++ /dev/null @@ -1,312 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines - -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.channelFlow -import kotlinx.coroutines.flow.emitAll -import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.fold -import kotlinx.coroutines.flow.launchIn -import kotlinx.coroutines.flow.onCompletion -import kotlinx.coroutines.flow.onEach -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.launch - -/** - * @return true if at least one element matches the given predicate - * @since 0.12.0 - */ -suspend fun Flow.any(predicate: suspend (T) -> Boolean): Boolean { - val matching = firstOrNull(predicate) - - return matching != null -} - -/** - * @return a [Flow] containing only distinct elements from the receiver flow. When there are - * equal elements in the receiver, the first value is the one emitted in the returned flow. - * @since 0.12.0 - */ -fun Flow.distinct(): Flow = flow { - val past = mutableSetOf() - collect { - if (past.add(it)) emit(it) - } -} - -/** - * @return true if the receiver [Flow] contains [element], otherwise false. - * @since 0.12.0 - */ -suspend fun Flow.contains(element: T): Boolean { - return any { it == element } -} - -/** - * A slightly optimized version of `flatMapConcat {...}.toList()` - * - * @since 0.12.0 - */ -suspend fun Flow.flatMapListConcat( - destination: MutableList = mutableListOf(), - transform: suspend (T) -> Iterable -): List { - return fold(destination) { acc, value -> - acc.also { it.addAll(transform(value)) } - } -} - -/** - * A slightly optimized version of `flatMapConcat {...}.toList()` - * - * @since 0.12.0 - */ -suspend fun Flow>.flatMapListConcat( - destination: MutableList = mutableListOf() -): List { - return fold(destination) { acc, iterable -> - acc.also { it.addAll(iterable) } - } -} - -/** - * A slightly optimized version of `flatMapConcat {...}.toSet()` - * - * @since 0.12.0 - */ -suspend fun Flow.flatMapSetConcat( - destination: MutableSet = mutableSetOf(), - transform: suspend (T) -> Iterable -): Set { - return fold(destination) { acc, value -> - acc.also { - when (val iterable = transform(value)) { - is Set<*> -> it.addAll(iterable) - else -> it.addAll(iterable.toSet()) - } - } - } -} - -/** - * A slightly optimized version of `flatMapConcat {...}.toSet()` - * - * @since 0.12.0 - */ -suspend fun Flow>.flatMapSetConcat( - destination: MutableSet = mutableSetOf() -): Set { - return fold(destination) { acc, iterable -> - acc.also { - when (iterable) { - is Set<*> -> it.addAll(iterable) - else -> it.addAll(iterable.toSet()) - } - } - } -} - -/** - * Returns a [Flow] from the receiver [Flow], performing [transform] - * upon each element *concurrently* before that element is emitted. - * - * **This is a "hot" flow**, since [transform] is performed eagerly. - * - * @since 0.12.0 - */ -fun Flow.mapAsync(transform: suspend (T) -> R): Flow { - return channelFlow { - this@mapAsync.collect { - launch { send(transform(it)) } - } - } -} - -/** - * Shorthand for `mapAsync(transform).flatMapSetConcat { it.toSet() }` - * - * @since 0.12.0 - */ -suspend fun Iterable.flatMapSetMerge(transform: suspend (T) -> Iterable): Set { - return mapAsync(transform).flatMapSetConcat { it.toSet() } -} - -/** - * Shorthand for `mapAsync(transform).toList().flatten()` - * - * @since 0.12.0 - */ -suspend fun Iterable.flatMapListMerge(transform: suspend (T) -> Iterable): List { - return mapAsync(transform).toList().flatten() -} - -/** - * Shorthand for `mapAsync(transform).toList().flatten()` - * - * @since 0.12.0 - */ -suspend fun Flow.flatMapListMerge(transform: suspend (T) -> Iterable): List { - return mapAsync(transform).toList().flatten() -} - -/** - * Returns a [Flow] from the receiver [Iterable], performing [transform] - * upon each element *concurrently* before that element is emitted. - * - * **This is a "hot" flow**, since [transform] is performed eagerly. - * - * @since 0.12.0 - */ -fun Iterable.mapAsync(transform: suspend (T) -> R): Flow { - - return channelFlow { - forEach { - launch { send(transform(it)) } - } - } -} - -/** - * Returns a [Flow] from the receiver [Iterable], performing [action] - * upon each element *concurrently* before that element is emitted. - * - * **This is a "hot" flow**, since [action] is performed eagerly. - * - * @since 0.12.0 - */ -fun Iterable.onEachAsync(action: suspend (T) -> Unit): Flow { - - return channelFlow { - forEach { - launch { - action(it) - send(it) - } - } - } -} - -/** - * **This is a "hot" flow**, since [transform] is performed eagerly. - * - * @return a [Flow] from the receiver [Sequence], performing [transform] - * upon each element *concurrently* before that element is emitted. - * @since 0.12.0 - */ -fun Sequence.mapAsync(transform: suspend (T) -> R): Flow { - return channelFlow { - forEach { - launch { send(transform(it)) } - } - } -} - -/** - * **This is a "hot" flow**, since [transform] is performed eagerly. - * - * @return a [Flow] from the receiver [Flow], performing [transform] - * and filtering out `null` values upon each element *concurrently*. - * @since 0.12.0 - */ -fun Flow.mapAsyncNotNull(transform: suspend (T) -> R?): Flow { - return channelFlow { - this@mapAsyncNotNull.onEach { element -> transform(element)?.let { send(it) } } - .launchIn(this) - } -} - -/** - * **This is a "hot" flow**, since [transform] is performed eagerly. - * - * @return a [Flow] from the receiver [Iterable], performing [transform] - * and filtering out `null` values upon each element *concurrently*. - * @since 0.12.0 - */ -fun Iterable.mapAsyncNotNull(transform: suspend (T) -> R?): Flow { - return channelFlow { - forEach { element -> - launch { transform(element)?.let { send(it) } } - } - } -} - -/** - * **This is a "hot" flow**, since [transform] is performed eagerly. - * - * @return a [Flow] from the receiver [Sequence], performing [transform] - * and filtering out `null` values upon each element *concurrently*. - * @since 0.12.0 - */ -fun Sequence.mapAsyncNotNull(transform: suspend (T) -> R?): Flow { - return channelFlow { - forEach { element -> - launch { transform(element)?.let { send(it) } } - } - } -} - -/** - * **This is a "hot" flow**, since [predicate] is performed eagerly. - * - * @return a [Flow] from the receiver [Flow], filtering - * values based upon [predicate] *concurrently*. - * @since 0.12.0 - */ -fun Flow.filterAsync(predicate: suspend (T) -> Boolean): Flow { - return channelFlow { - this@filterAsync.onEach { if (predicate(it)) send(it) } - .launchIn(this) - } -} - -/** - * **This is a "hot" flow**, since [predicate] is performed eagerly. - * - * @return a [Flow] from the receiver [Iterable], filtering - * values based upon [predicate] *concurrently*. - * @since 0.12.0 - */ -fun Iterable.filterAsync(predicate: suspend (T) -> Boolean): Flow { - return channelFlow { - forEach { launch { if (predicate(it)) send(it) } } - } -} - -/** - * **This is a "hot" flow**, since [predicate] is performed eagerly. - * - * @return a [Flow] from the receiver [Sequence], filtering - * values based upon [predicate] *concurrently*. - * @since 0.12.0 - */ -fun Sequence.filterAsync(predicate: suspend (T) -> Boolean): Flow { - return channelFlow { - forEach { launch { if (predicate(it)) send(it) } } - } -} - -/** - * Shorthand for `onCompletion { if (it == null) emitAll(other) }` - * - * ``` - * val mySingleFlow = someFlow + someOtherFlow - * ``` - */ -operator fun Flow.plus(other: Flow): Flow { - return onCompletion { if (it == null) emitAll(other) } -} diff --git a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowAnyTest.kt b/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowAnyTest.kt deleted file mode 100644 index 551d56ad42..0000000000 --- a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowAnyTest.kt +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines - -import io.kotest.assertions.fail -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Test - -internal class FlowAnyTest { - - @Test - fun `should return true if flow contains matching element`() = runTest { - - flowOf(1, 2, 3).any { it == 3 } shouldBe true - } - - @Test - fun `should stop collecting after matching element is collected`() = runTest { - - flow { - emit(1) - emit(2) - emit(3) - fail("collection should stop after 3") - } - .any { it == 3 } shouldBe true - } - - @Test - fun `should return false if flow does not contain matching element`() = runTest { - - flowOf(1, 2, 3).any { it == 4 } shouldBe false - } -} diff --git a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowContainsTest.kt b/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowContainsTest.kt deleted file mode 100644 index 452d11efca..0000000000 --- a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowContainsTest.kt +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines - -import io.kotest.assertions.fail -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Test - -internal class FlowContainsTest { - - @Test - fun `should return true if flow contains matching element`() = runTest { - - flowOf(1, 2, 3).contains(3) shouldBe true - } - - @Test - fun `should stop collecting after matching element is collected`() = runTest { - - flow { - emit(1) - emit(2) - emit(3) - fail("collection should stop after 3") - } - .contains(3) shouldBe true - } - - @Test - fun `should return false if flow does not contain matching element`() = runTest { - - flowOf(1, 2, 3).contains(4) shouldBe false - } - - @Test - fun `should use equals for comparison`() = runTest { - - data class DataClass(val value: Int) - - val dc1 = DataClass(1) - val dc2 = DataClass(1) - - flowOf(dc1, DataClass(2), DataClass(3)).contains(dc2) shouldBe true - } -} diff --git a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowFilterAsyncTest.kt b/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowFilterAsyncTest.kt deleted file mode 100644 index b1352d347b..0000000000 --- a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowFilterAsyncTest.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines - -import app.cash.turbine.test -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.yield -import org.junit.jupiter.api.Test - -internal class FlowFilterAsyncTest { - - @Test - fun `should only emit elements which match the predicate`() = runTest { - - flowOf(1, 2, 3, 4) - .filterAsync { it % 2 == 0 } - .toList() shouldBe listOf(2, 4) - } - - @Test - fun `should emit async elements as soon as they're complete`() = runTest { - - val one = CompletableDeferred() - val two = CompletableDeferred() - val three = CompletableDeferred() - - val throughFilter = mutableListOf() - - flowOf(one, two, three) - .filterAsync { - - val done = it.await() - throughFilter.add(done) - done == 2 - } - .test { - expectNoEvents() - - // should trigger predicate and be filtered out - one.complete(1) - yield() - yield() - throughFilter shouldBe listOf(1) - expectNoEvents() - - // should trigger predicate and pass through - two.complete(2) - awaitItem() shouldBe two - throughFilter shouldBe listOf(1, 2) - expectNoEvents() - - // should trigger predicate and be filtered out - three.complete(3) - yield() - throughFilter shouldBe listOf(1, 2, 3) - - // filtered flow ends as soon as the source flow has no more elements - awaitComplete() - } - } -} diff --git a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowFlatMapTest.kt b/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowFlatMapTest.kt deleted file mode 100644 index cc2e661fa5..0000000000 --- a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/FlowFlatMapTest.kt +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines - -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Test - -internal class FlowFlatMapTest { - - @Test - fun `flow of lists should flatten to list`() = runTest { - - flowOf(listOf(1, 2, 3), listOf(4, 5, 6)) - .flatMapListConcat { it } shouldBe listOf(1, 2, 3, 4, 5, 6) - } - - @Test - fun `flow of lists should flatten to provided destination list`() = runTest { - - val destination = mutableListOf() - - flowOf(listOf(1, 2, 3), listOf(4, 5, 6)) - .flatMapListConcat(destination) { it } - - destination shouldBe listOf(1, 2, 3, 4, 5, 6) - } - - @Test - fun `flow of sets should flatten to set`() = runTest { - - flowOf(setOf(1, 2, 3), setOf(4, 5, 6)) - .flatMapSetConcat { it } shouldBe setOf(1, 2, 3, 4, 5, 6) - } - - @Test - fun `flow of sets should flatten to provided destination set`() = runTest { - - val destination = mutableSetOf() - - flowOf(setOf(1, 2, 3), setOf(4, 5, 6)) - .flatMapSetConcat(destination) { it } - - destination shouldBe setOf(1, 2, 3, 4, 5, 6) - } -} diff --git a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/MapAsyncTest.kt b/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/MapAsyncTest.kt deleted file mode 100644 index 0b398bb5bb..0000000000 --- a/modulecheck-utils/coroutines/api/src/test/kotlin/modulecheck/utils/coroutines/MapAsyncTest.kt +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines - -import app.cash.turbine.test -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.flow.flowOf -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.yield -import org.junit.jupiter.api.Nested -import org.junit.jupiter.api.Test - -internal class MapAsyncTest { - - @Nested - inner class `flow` { - - @Test - fun `flow executes eagerly when collection starts`() = runTest { - - val lock = CompletableDeferred() - - val waiting = mutableListOf() - - val subject = flowOf(1, 2) - .mapAsync { - - waiting.add(it) - lock.await() - - it - } - - yield() - yield() - yield() - - waiting shouldBe emptyList() - - subject.test { - - expectNoEvents() - - yield() - yield() - yield() - - waiting shouldBe listOf(1, 2) - - lock.complete(Unit) - - awaitItem() shouldBe 1 - awaitItem() shouldBe 2 - - awaitComplete() - } - } - - @Test - fun `flow should emit async elements as soon as they're transformed`() = runTest { - - val one = CompletableDeferred() - val two = CompletableDeferred() - val three = CompletableDeferred() - - val through = mutableListOf() - - flowOf(one, two, three) - .mapAsync { - - val done = it.await() - through.add(done) - done * 2 - } - .test { - expectNoEvents() - - // should trigger predicate and be transformed - one.complete(1) - awaitItem() shouldBe 2 - through shouldBe listOf(1) - - // should trigger predicate and be transformed - two.complete(2) - awaitItem() shouldBe 4 - through shouldBe listOf(1, 2) - expectNoEvents() - - // should trigger predicate and be transformed - three.complete(3) - awaitItem() shouldBe 6 - through shouldBe listOf(1, 2, 3) - - // filtered flow ends as soon as the source flow has no more elements - awaitComplete() - } - } - } - - @Nested - inner class `iterable` { - - @Test - fun `iterable executes eagerly when collection starts`() = runTest { - - val lock = CompletableDeferred() - - val waiting = mutableListOf() - - val subject = listOf(1, 2) - .mapAsync { - - waiting.add(it) - lock.await() - - it - } - - yield() - yield() - yield() - - waiting shouldBe emptyList() - - subject.test { - - expectNoEvents() - - yield() - yield() - yield() - - waiting shouldBe listOf(1, 2) - - lock.complete(Unit) - - awaitItem() shouldBe 1 - awaitItem() shouldBe 2 - - awaitComplete() - } - } - - @Test - fun `iterable should emit async elements as soon as they're transformed`() = runTest { - - val one = CompletableDeferred() - val two = CompletableDeferred() - val three = CompletableDeferred() - - val through = mutableListOf() - - listOf(one, two, three) - .mapAsync { - - val done = it.await() - through.add(done) - done * 2 - } - .test { - expectNoEvents() - - // should trigger predicate and be transformed - one.complete(1) - awaitItem() shouldBe 2 - through shouldBe listOf(1) - - // should trigger predicate and be transformed - two.complete(2) - awaitItem() shouldBe 4 - through shouldBe listOf(1, 2) - expectNoEvents() - - // should trigger predicate and be transformed - three.complete(3) - awaitItem() shouldBe 6 - through shouldBe listOf(1, 2, 3) - - // filtered flow ends as soon as the source flow has no more elements - awaitComplete() - } - } - } - - @Nested - inner class `sequence` { - - @Test - fun `sequence executes eagerly when collection starts`() = runTest { - - val lock = CompletableDeferred() - - val waiting = mutableListOf() - - val subject = sequenceOf(1, 2) - .mapAsync { - - waiting.add(it) - lock.await() - - it - } - - yield() - yield() - yield() - - waiting shouldBe emptyList() - - subject.test { - - expectNoEvents() - - yield() - yield() - yield() - - waiting shouldBe listOf(1, 2) - - lock.complete(Unit) - - awaitItem() shouldBe 1 - awaitItem() shouldBe 2 - - awaitComplete() - } - } - - @Test - fun `sequence should emit async elements as soon as they're transformed`() = runTest { - - val one = CompletableDeferred() - val two = CompletableDeferred() - val three = CompletableDeferred() - - val through = mutableListOf() - - sequenceOf(one, two, three) - .mapAsync { - - val done = it.await() - through.add(done) - done * 2 - } - .test { - expectNoEvents() - - // should trigger predicate and be transformed - one.complete(1) - awaitItem() shouldBe 2 - through shouldBe listOf(1) - - // should trigger predicate and be transformed - two.complete(2) - awaitItem() shouldBe 4 - through shouldBe listOf(1, 2) - expectNoEvents() - - // should trigger predicate and be transformed - three.complete(3) - awaitItem() shouldBe 6 - through shouldBe listOf(1, 2, 3) - - // filtered flow ends as soon as the source flow has no more elements - awaitComplete() - } - } - } -} diff --git a/modulecheck-utils/coroutines/impl/api/impl.api b/modulecheck-utils/coroutines/impl/api/impl.api deleted file mode 100644 index 930f9de2b3..0000000000 --- a/modulecheck-utils/coroutines/impl/api/impl.api +++ /dev/null @@ -1,103 +0,0 @@ -public final class anvil/hint/Modulecheck_utils_coroutines_impl_CoroutineScopeModule_cc8805f2Kt { - public static final fun getModulecheck_utils_coroutines_impl_CoroutineScopeModule_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_utils_coroutines_impl_CoroutineScopeModule_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_utils_coroutines_impl_DispatcherProviderComponent_f578d42aKt { - public static final fun getModulecheck_utils_coroutines_impl_DispatcherProviderComponent_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_utils_coroutines_impl_DispatcherProviderComponent_scope0 ()Lkotlin/reflect/KClass; -} - -public final class anvil/hint/Modulecheck_utils_coroutines_impl_ModuleCheckDispatcherProvider_DispatcherProvider_TaskScope_BindingModule_bfa56224_a5b135f9Kt { - public static final fun getModulecheck_utils_coroutines_impl_ModuleCheckDispatcherProvider_DispatcherProvider_TaskScope_BindingModule_bfa56224_reference ()Lkotlin/reflect/KClass; - public static final fun getModulecheck_utils_coroutines_impl_ModuleCheckDispatcherProvider_DispatcherProvider_TaskScope_BindingModule_bfa56224_scope0 ()Lkotlin/reflect/KClass; -} - -public final class modulecheck/utils/coroutines/impl/CoroutineScopeModule { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule; - public final fun provideCoroutineScope ()Lkotlinx/coroutines/CoroutineScope; - public final fun provideDefaultCoroutineScope ()Ldispatch/core/DefaultCoroutineScope; - public final fun provideIOCoroutineScope ()Ldispatch/core/IOCoroutineScope; - public final fun provideMainCoroutineScope ()Ldispatch/core/MainCoroutineScope; - public final fun provideMainImmediateCoroutineScope ()Ldispatch/core/MainImmediateCoroutineScope; - public final fun provideUnconfinedCoroutineScope ()Ldispatch/core/UnconfinedCoroutineScope; -} - -public final class modulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideCoroutineScopeFactory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideCoroutineScopeFactory; - public static final fun create ()Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideCoroutineScopeFactory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lkotlinx/coroutines/CoroutineScope; - public static final fun provideCoroutineScope ()Lkotlinx/coroutines/CoroutineScope; -} - -public final class modulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideDefaultCoroutineScopeFactory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideDefaultCoroutineScopeFactory; - public static final fun create ()Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideDefaultCoroutineScopeFactory; - public fun get ()Ldispatch/core/DefaultCoroutineScope; - public synthetic fun get ()Ljava/lang/Object; - public static final fun provideDefaultCoroutineScope ()Ldispatch/core/DefaultCoroutineScope; -} - -public final class modulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideIOCoroutineScopeFactory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideIOCoroutineScopeFactory; - public static final fun create ()Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideIOCoroutineScopeFactory; - public fun get ()Ldispatch/core/IOCoroutineScope; - public synthetic fun get ()Ljava/lang/Object; - public static final fun provideIOCoroutineScope ()Ldispatch/core/IOCoroutineScope; -} - -public final class modulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideMainCoroutineScopeFactory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideMainCoroutineScopeFactory; - public static final fun create ()Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideMainCoroutineScopeFactory; - public fun get ()Ldispatch/core/MainCoroutineScope; - public synthetic fun get ()Ljava/lang/Object; - public static final fun provideMainCoroutineScope ()Ldispatch/core/MainCoroutineScope; -} - -public final class modulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideMainImmediateCoroutineScopeFactory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideMainImmediateCoroutineScopeFactory; - public static final fun create ()Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideMainImmediateCoroutineScopeFactory; - public fun get ()Ldispatch/core/MainImmediateCoroutineScope; - public synthetic fun get ()Ljava/lang/Object; - public static final fun provideMainImmediateCoroutineScope ()Ldispatch/core/MainImmediateCoroutineScope; -} - -public final class modulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideUnconfinedCoroutineScopeFactory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideUnconfinedCoroutineScopeFactory; - public static final fun create ()Lmodulecheck/utils/coroutines/impl/CoroutineScopeModule_ProvideUnconfinedCoroutineScopeFactory; - public fun get ()Ldispatch/core/UnconfinedCoroutineScope; - public synthetic fun get ()Ljava/lang/Object; - public static final fun provideUnconfinedCoroutineScope ()Ldispatch/core/UnconfinedCoroutineScope; -} - -public abstract interface class modulecheck/utils/coroutines/impl/DispatcherProviderComponent { - public abstract fun getDispatcherProvider ()Ldispatch/core/DispatcherProvider; -} - -public final class modulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider : dispatch/core/DispatcherProvider { - public fun ()V - public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; - public fun get (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; - public fun getDefault ()Lkotlinx/coroutines/CoroutineDispatcher; - public fun getIo ()Lkotlinx/coroutines/CoroutineDispatcher; - public fun getKey ()Lkotlin/coroutines/CoroutineContext$Key; - public fun getMain ()Lkotlinx/coroutines/CoroutineDispatcher; - public fun getMainImmediate ()Lkotlinx/coroutines/CoroutineDispatcher; - public fun getUnconfined ()Lkotlinx/coroutines/CoroutineDispatcher; - public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; - public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; -} - -public abstract interface class modulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider_DispatcherProvider_TaskScope_BindingModule_bfa56224 { - public abstract fun bindDispatcherProvider (Lmodulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider;)Ldispatch/core/DispatcherProvider; -} - -public final class modulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider_Factory : dagger/internal/Factory { - public static final field INSTANCE Lmodulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider_Factory; - public static final fun create ()Lmodulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider_Factory; - public synthetic fun get ()Ljava/lang/Object; - public fun get ()Lmodulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider; - public static final fun newInstance ()Lmodulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider; -} - diff --git a/modulecheck-utils/coroutines/impl/build.gradle.kts b/modulecheck-utils/coroutines/impl/build.gradle.kts deleted file mode 100644 index 85cca7e53d..0000000000 --- a/modulecheck-utils/coroutines/impl/build.gradle.kts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-coroutines-impl" - ) - anvil() -} - -dependencies { - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jdk8) - api(libs.kotlinx.coroutines.jvm) - api(libs.rickBusarow.dispatch.core) - - api(project(path = ":modulecheck-utils:coroutines:api")) - - implementation(project(path = ":modulecheck-dagger")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.square.turbine) -} diff --git a/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/CoroutineScopeModule.kt b/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/CoroutineScopeModule.kt deleted file mode 100644 index c5cd99a77a..0000000000 --- a/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/CoroutineScopeModule.kt +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines.impl - -import com.squareup.anvil.annotations.ContributesTo -import dagger.Module -import dagger.Provides -import dispatch.core.DefaultCoroutineScope -import dispatch.core.DispatcherProvider -import dispatch.core.IOCoroutineScope -import dispatch.core.MainCoroutineScope -import dispatch.core.MainImmediateCoroutineScope -import dispatch.core.UnconfinedCoroutineScope -import kotlinx.coroutines.CoroutineScope -import modulecheck.dagger.TaskScope - -@Suppress("UndocumentedPublicFunction", "UndocumentedPublicClass", "InjectDispatcher") -@Module -@ContributesTo(TaskScope::class) -object CoroutineScopeModule { - - @Provides - fun provideCoroutineScope(): CoroutineScope = DefaultCoroutineScope() - - @Provides - fun provideDefaultCoroutineScope(): DefaultCoroutineScope = DefaultCoroutineScope() - - @Provides - fun provideIOCoroutineScope(): IOCoroutineScope = IOCoroutineScope() - - @Provides - fun provideMainCoroutineScope(): MainCoroutineScope = MainCoroutineScope() - - @Provides - fun provideMainImmediateCoroutineScope(): MainImmediateCoroutineScope = - MainImmediateCoroutineScope() - - @Provides - fun provideUnconfinedCoroutineScope(): UnconfinedCoroutineScope = UnconfinedCoroutineScope() -} - -@ContributesTo(TaskScope::class) -interface DispatcherProviderComponent { - val dispatcherProvider: DispatcherProvider -} diff --git a/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider.kt b/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider.kt deleted file mode 100644 index 434924d7cf..0000000000 --- a/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/ModuleCheckDispatcherProvider.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines.impl - -import com.squareup.anvil.annotations.ContributesBinding -import dispatch.core.DispatcherProvider -import kotlinx.coroutines.CoroutineDispatcher -import kotlinx.coroutines.Dispatchers -import modulecheck.dagger.SingleIn -import modulecheck.dagger.TaskScope -import javax.inject.Inject - -/** - * Uses [default] as the [io] dispatcher in order to keep things "fair" and limit heap size. - * - * @since 0.12.0 - */ -@Suppress("InjectDispatcher") -@SingleIn(TaskScope::class) -@ContributesBinding(TaskScope::class) -class ModuleCheckDispatcherProvider @Inject constructor() : DispatcherProvider { - - override val default: CoroutineDispatcher = Dispatchers.Default - override val io: CoroutineDispatcher = default - override val main: CoroutineDispatcher = Dispatchers.Main - override val mainImmediate: CoroutineDispatcher = Dispatchers.Main.immediate - override val unconfined: CoroutineDispatcher = Dispatchers.Unconfined -} diff --git a/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/atomic.kt b/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/atomic.kt deleted file mode 100644 index 044fa36475..0000000000 --- a/modulecheck-utils/coroutines/impl/src/main/kotlin/modulecheck/utils/coroutines/impl/atomic.kt +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.coroutines.impl - -import java.util.concurrent.atomic.AtomicReference - -internal inline fun AtomicReference.loop(action: (T) -> Unit): Nothing { - while (true) { - action(get()) - } -} - -internal inline fun AtomicReference.update(function: (T) -> T) { - while (true) { - val cur = get() - val upd = function(cur) - if (compareAndSet(cur, upd)) return - } -} diff --git a/modulecheck-utils/lazy/api/lazy.api b/modulecheck-utils/lazy/api/lazy.api deleted file mode 100644 index da96f68844..0000000000 --- a/modulecheck-utils/lazy/api/lazy.api +++ /dev/null @@ -1,133 +0,0 @@ -public final class modulecheck/utils/lazy/EmptyResetManager : modulecheck/utils/lazy/ResetManager { - public static final field INSTANCE Lmodulecheck/utils/lazy/EmptyResetManager; - public fun child (Ljava/util/Collection;)Lmodulecheck/utils/lazy/EmptyResetManager; - public synthetic fun child (Ljava/util/Collection;)Lmodulecheck/utils/lazy/ResetManager; - public fun dispose ()V - public fun register (Lmodulecheck/utils/lazy/Resets;)V - public fun reset ()V -} - -public abstract interface class modulecheck/utils/lazy/LazyDeferred { - public abstract fun await (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getCompleted ()Ljava/lang/Object; - public abstract fun isCompleted ()Z -} - -public final class modulecheck/utils/lazy/LazyDeferredKt { - public static final fun asLazyDeferred (Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/lazy/LazyDeferred; - public static final fun awaitAll (Ljava/util/Collection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun lazyDeferred (Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/lazy/LazyDeferred; -} - -public final class modulecheck/utils/lazy/LazyKt { - public static final fun lazyVar (Lkotlin/jvm/functions/Function0;)Lkotlin/properties/ReadWriteProperty; - public static final fun unsafeLazy (Lkotlin/jvm/functions/Function0;)Lkotlin/Lazy; -} - -public abstract interface class modulecheck/utils/lazy/LazyResets : kotlin/Lazy, modulecheck/utils/lazy/Resets { -} - -public final class modulecheck/utils/lazy/LazyResetsKt { - public static final fun LazyResets (Lmodulecheck/utils/lazy/ResetManager;Lkotlin/jvm/functions/Function0;)Lmodulecheck/utils/lazy/LazyResets; -} - -public abstract interface class modulecheck/utils/lazy/LazySet : kotlinx/coroutines/flow/Flow, modulecheck/utils/lazy/LazySetComponent { - public abstract fun contains (Ljava/lang/Object;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun containsAny (Lmodulecheck/utils/lazy/LazySet;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun isEmpty (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun isFullyCached ()Z - public abstract fun isNotEmpty (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun snapshot ()Lmodulecheck/utils/lazy/LazySet$State; -} - -public abstract interface class modulecheck/utils/lazy/LazySet$DataSource : java/lang/Comparable, modulecheck/utils/lazy/LazyDeferred, modulecheck/utils/lazy/LazySetComponent { - public synthetic fun compareTo (Ljava/lang/Object;)I - public fun compareTo (Lmodulecheck/utils/lazy/LazySet$DataSource;)I - public abstract fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public abstract fun getPriority ()Lmodulecheck/utils/lazy/LazySet$DataSource$Priority; -} - -public final class modulecheck/utils/lazy/LazySet$DataSource$Priority : java/lang/Enum, java/lang/Comparable { - public static final field HIGH Lmodulecheck/utils/lazy/LazySet$DataSource$Priority; - public static final field LOW Lmodulecheck/utils/lazy/LazySet$DataSource$Priority; - public static final field MEDIUM Lmodulecheck/utils/lazy/LazySet$DataSource$Priority; - public static fun valueOf (Ljava/lang/String;)Lmodulecheck/utils/lazy/LazySet$DataSource$Priority; - public static fun values ()[Lmodulecheck/utils/lazy/LazySet$DataSource$Priority; -} - -public final class modulecheck/utils/lazy/LazySet$State { - public fun (Ljava/util/Set;Ljava/util/List;)V - public final fun getCache ()Ljava/util/Set; - public final fun getRemaining ()Ljava/util/List; - public final fun nextSources ()Lkotlin/sequences/Sequence; -} - -public abstract interface class modulecheck/utils/lazy/LazySetComponent { -} - -public final class modulecheck/utils/lazy/LazySetKt { - public static final fun asDataSource (Lkotlin/Lazy;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static final fun asDataSource (Lkotlinx/coroutines/flow/Flow;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static final fun asDataSource (Lmodulecheck/utils/lazy/LazyDeferred;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static synthetic fun asDataSource$default (Lkotlin/Lazy;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static synthetic fun asDataSource$default (Lkotlinx/coroutines/flow/Flow;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static synthetic fun asDataSource$default (Lmodulecheck/utils/lazy/LazyDeferred;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static final fun containsAny (Lmodulecheck/utils/lazy/LazySet;Ljava/util/Collection;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun dataSource (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static final fun dataSource (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lmodulecheck/utils/lazy/LazyDeferred;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static synthetic fun dataSource$default (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static synthetic fun dataSource$default (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lmodulecheck/utils/lazy/LazyDeferred;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static final fun dataSourceOf ([Ljava/lang/Object;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static synthetic fun dataSourceOf$default ([Ljava/lang/Object;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet$DataSource; - public static final fun emptyLazySet ()Lmodulecheck/utils/lazy/LazySet; - public static final fun lazySet (Ljava/util/Collection;)Lmodulecheck/utils/lazy/LazySet; - public static final fun lazySet (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/lazy/LazySet; - public static final fun lazySet ([Lmodulecheck/utils/lazy/LazySetComponent;)Lmodulecheck/utils/lazy/LazySet; - public static synthetic fun lazySet$default (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet; - public static final fun lazySetSingle (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/lazy/LazySet; - public static synthetic fun lazySetSingle$default (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet; - public static final fun toLazySet (Ljava/util/Collection;)Lmodulecheck/utils/lazy/LazySet; - public static final fun toLazySet (Lkotlinx/coroutines/flow/Flow;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;)Lmodulecheck/utils/lazy/LazySet; - public static synthetic fun toLazySet$default (Lkotlinx/coroutines/flow/Flow;Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;ILjava/lang/Object;)Lmodulecheck/utils/lazy/LazySet; -} - -public final class modulecheck/utils/lazy/RealResetManager : kotlinx/coroutines/DisposableHandle, modulecheck/utils/lazy/ResetManager { - public fun ()V - public fun (Ljava/util/Collection;)V - public synthetic fun (Ljava/util/Collection;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun child (Ljava/util/Collection;)Lmodulecheck/utils/lazy/RealResetManager; - public synthetic fun child (Ljava/util/Collection;)Lmodulecheck/utils/lazy/ResetManager; - public fun dispose ()V - public fun register (Lmodulecheck/utils/lazy/Resets;)V - public fun reset ()V -} - -public abstract interface class modulecheck/utils/lazy/ResetManager : modulecheck/utils/lazy/Resets, org/jetbrains/kotlin/com/intellij/openapi/Disposable { - public static final field Companion Lmodulecheck/utils/lazy/ResetManager$Companion; - public abstract fun child (Ljava/util/Collection;)Lmodulecheck/utils/lazy/ResetManager; - public static synthetic fun child$default (Lmodulecheck/utils/lazy/ResetManager;Ljava/util/Collection;ILjava/lang/Object;)Lmodulecheck/utils/lazy/ResetManager; - public abstract fun dispose ()V - public abstract fun register (Lmodulecheck/utils/lazy/Resets;)V - public abstract fun reset ()V -} - -public final class modulecheck/utils/lazy/ResetManager$Companion { - public final fun invoke ()Lmodulecheck/utils/lazy/ResetManager; -} - -public abstract interface class modulecheck/utils/lazy/Resets { - public abstract fun reset ()V -} - -public final class modulecheck/utils/lazy/internal/DataSourceImpl : modulecheck/utils/lazy/LazyDeferred, modulecheck/utils/lazy/LazySet$DataSource { - public fun (Lmodulecheck/utils/lazy/LazySet$DataSource$Priority;Lmodulecheck/utils/lazy/LazyDeferred;)V - public fun await (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public fun equals (Ljava/lang/Object;)Z - public fun get (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public synthetic fun getCompleted ()Ljava/lang/Object; - public fun getCompleted ()Ljava/util/Set; - public fun getPriority ()Lmodulecheck/utils/lazy/LazySet$DataSource$Priority; - public fun hashCode ()I - public fun isCompleted ()Z -} - diff --git a/modulecheck-utils/lazy/build.gradle.kts b/modulecheck-utils/lazy/build.gradle.kts deleted file mode 100644 index ff13f14800..0000000000 --- a/modulecheck-utils/lazy/build.gradle.kts +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-lazy" - ) -} - -dependencies { - - api(libs.kotlin.compiler) - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - implementation(project(path = ":modulecheck-utils:coroutines:api")) - implementation(project(path = ":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotlinx.coroutines.test) - testImplementation(libs.square.turbine) -} diff --git a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazyDeferred.kt b/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazyDeferred.kt deleted file mode 100644 index f5902759f9..0000000000 --- a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazyDeferred.kt +++ /dev/null @@ -1,115 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.lazy - -import kotlinx.coroutines.Deferred -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.sync.Mutex -import kotlinx.coroutines.sync.withLock - -/** - * Lazily invokes some the first time [await][Deferred.await] - * or [join][kotlinx.coroutines.Job.join] is called. - * - * This action is only invoked once. The caller's coroutine is used to execute this action. - * - * ``` - * val expensive = lazyDeferred { repository.getAll() } - * - * suspend fun getExpensive() = expensive.await() - * ``` - * - * @since 0.12.0 - */ -interface LazyDeferred { - val isCompleted: Boolean - suspend fun await(): T - - /** - * Immediately returns the deferred value **if already completed**. - * - * This should only be called after manually checking the value of [isCompleted]. - * - * @throws [IllegalStateException] if this deferred value has not [completed][isCompleted] yet. - */ - fun getCompleted(): T -} - -/** - * Lazily invokes [action] the first time [await][Deferred.await] - * or [join][kotlinx.coroutines.Job.join] is called. - * - * This [action] is only invoked once. The caller's coroutine is used to execute this action. - * - * ``` - * val expensive = lazyDeferred { repository.getAll() } - * - * suspend fun getExpensive() = expensive.await() - * ``` - * - * @since 0.12.0 - */ -fun lazyDeferred(action: suspend () -> T): LazyDeferred { - - return LazyDeferredImpl( - action = action, - lock = Mutex(false) - ) -} - -fun (suspend () -> T).asLazyDeferred(): LazyDeferred = lazyDeferred(this) - -suspend fun Collection>.awaitAll(): List { - return if (isEmpty()) { - emptyList() - } else { - coroutineScope { - map { it.await() } - } - } -} - -internal class LazyDeferredImpl( - private val action: suspend () -> T, - private val lock: Mutex -) : LazyDeferred { - - @Volatile - private var _completed = false - private var _value: T? = null - - override val isCompleted: Boolean get() = _completed - - override suspend fun await(): T { - if (!_completed) { - lock.withLock { - // re-check for completion inside the lock to avoid races - if (!_completed) { - _value = action.invoke() - _completed = true - } - } - } - @Suppress("UNCHECKED_CAST") - return _value as T - } - - override fun getCompleted(): T { - check(_completed) { "LazyDeferred has not been completed yet." } - @Suppress("UNCHECKED_CAST") - return _value as T - } -} diff --git a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazyResets.kt b/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazyResets.kt deleted file mode 100644 index 84d9be70e5..0000000000 --- a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazyResets.kt +++ /dev/null @@ -1,102 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -@file:Suppress("UndocumentedPublicClass", "UndocumentedPublicFunction") - -package modulecheck.utils.lazy - -import kotlinx.coroutines.DisposableHandle -import org.jetbrains.kotlin.com.intellij.openapi.Disposable - -interface LazyResets : Lazy, Resets - -interface Resets { - fun reset() -} - -inline fun ResetManager.lazyResets( - noinline valueFactory: () -> T -): LazyResets = LazyResets(this, valueFactory) - -fun LazyResets(resetManager: ResetManager, valueFactory: () -> T): LazyResets = - LazyResetsImpl(resetManager, valueFactory) - -internal class LazyResetsImpl( - private val resetManager: ResetManager, - private val valueFactory: () -> T -) : LazyResets { - - private var lazyHolder: Lazy = createLazy() - - override val value: T - get() = lazyHolder.value - - override fun isInitialized(): Boolean = lazyHolder.isInitialized() - - private fun createLazy() = lazy { - resetManager.register(this) - valueFactory() - } - - override fun reset() { - lazyHolder = createLazy() - } -} - -interface ResetManager : Resets, Disposable { - fun register(delegate: Resets) - - override fun dispose() - - override fun reset() - fun child(childDelegates: MutableCollection = mutableListOf()): ResetManager - - companion object { - operator fun invoke(): ResetManager = RealResetManager() - } -} - -object EmptyResetManager : ResetManager { - override fun register(delegate: Resets): Unit = Unit - override fun dispose(): Unit = Unit - override fun reset(): Unit = Unit - override fun child(childDelegates: MutableCollection): EmptyResetManager = this -} - -class RealResetManager( - private val delegates: MutableCollection = mutableListOf() -) : DisposableHandle, ResetManager { - - override fun register(delegate: Resets) { - synchronized(delegates) { - delegates.add(delegate) - } - } - - override fun dispose() { - reset() - } - override fun reset() { - synchronized(delegates) { - delegates.forEach { it.reset() } - delegates.clear() - } - } - - override fun child(childDelegates: MutableCollection): RealResetManager { - return RealResetManager(childDelegates) - .also { child -> register(child) } - } -} diff --git a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazySet.kt b/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazySet.kt deleted file mode 100644 index 1ba505e8ad..0000000000 --- a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/LazySet.kt +++ /dev/null @@ -1,188 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.lazy - -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.filterIsInstance -import kotlinx.coroutines.flow.firstOrNull -import kotlinx.coroutines.flow.toSet -import modulecheck.utils.flatMapToSet -import modulecheck.utils.lazy.LazySet.DataSource -import modulecheck.utils.lazy.LazySet.DataSource.Priority -import modulecheck.utils.lazy.LazySet.DataSource.Priority.MEDIUM -import modulecheck.utils.lazy.internal.DataSourceImpl -import modulecheck.utils.lazy.internal.LazySetImpl - -interface LazySet : Flow, LazySetComponent { - - val isFullyCached: Boolean - - suspend fun contains(element: Any?): Boolean - - /** @return true if the two LazySets have any element in common, otherwise false */ - suspend fun containsAny(other: LazySet): Boolean - - suspend fun isEmpty(): Boolean - suspend fun isNotEmpty(): Boolean - - fun snapshot(): State - - /** - * A **Lazy** data source for a [LazySet], which performs some suspending - * operation [get] in order to incrementally add data to the `LazySet`. - * - * @since 0.12.0 - */ - interface DataSource : - Comparable>, - LazySetComponent, - LazyDeferred> { - - /** - * The priority which should be applied to this source while - * in a LazySet. Higher priority sources are invoked first. - * - * @since 0.12.0 - */ - val priority: Priority - - /** - * Called to retrieve this source's data. Implementations are thread-safe and lazy. - * - * @since 0.12.0 - */ - suspend fun get(): Set - - enum class Priority : Comparable { - HIGH, - MEDIUM, - LOW - } - - override fun compareTo(other: DataSource<*>): Int { - return priority.compareTo(other.priority) - } - } - - class State( - val cache: Set, - val remaining: List> - ) { - private val remainingMap by lazy { - remaining.groupBy { it.priority } - } - - fun nextSources(): Sequence>> { - return sequence { - Priority.values() - .forEach { priority -> - - val sources = remainingMap[priority] - - if (sources != null) { - yield(sources) - } - } - } - } - } -} - -suspend inline fun LazySet.getOrNull(element: E): T? { - return takeIf { it.contains(element) } - ?.filterIsInstance() - ?.firstOrNull { it == element } -} - -sealed interface LazySetComponent - -suspend fun LazySet.containsAny(elements: Collection): Boolean { - return elements.any { contains(it) } -} - -fun Flow.asDataSource(priority: Priority = MEDIUM): DataSource = - dataSource(priority) { toSet() } - -fun LazyDeferred>.asDataSource(priority: Priority = MEDIUM): DataSource = - dataSource(priority) { await() } - -fun Lazy>.asDataSource(priority: Priority = MEDIUM): DataSource = - dataSource(priority) { value } - -fun dataSourceOf(vararg elements: E, priority: Priority = MEDIUM): DataSource = - DataSourceImpl(priority, lazyDeferred { elements.toSet() }) - -/** - * @return A DataSource from this [priority] and [factory] - * @since 0.12.0 - */ -fun dataSource(priority: Priority = MEDIUM, factory: LazyDeferred>): DataSource = - DataSourceImpl(priority, factory) - -/** - * @return A DataSource from this [priority] and [factory] - * @since 0.12.0 - */ -fun dataSource(priority: Priority = MEDIUM, factory: suspend () -> Set): DataSource { - return DataSourceImpl(priority, lazyDeferred { factory() }) -} - -fun Collection>.toLazySet(): LazySet = lazySet(this) - -fun lazySet(vararg children: LazySetComponent): LazySet { - return lazySet(children.asList()) -} - -fun lazySet(priority: Priority = MEDIUM, dataSource: suspend () -> Set): LazySet { - return lazySet(dataSource(priority, dataSource)) -} - -@JvmName("lazySetSingle") -fun lazySet(priority: Priority = MEDIUM, dataSource: suspend () -> E): LazySet { - return lazySet(dataSource(priority) { setOf(dataSource()) }) -} - -fun Flow.toLazySet(priority: Priority = MEDIUM): LazySet { - return lazySet(priority) { toSet() } -} - -fun lazySet(children: Collection>): LazySet { - val (sets, dataSources) = children.partition { it is LazySet<*> } - @Suppress("UNCHECKED_CAST") - return createLazySet( - sets as List>, - dataSources as List> - ) -} - -fun emptyLazySet(): LazySet { - return createLazySet(emptyList(), emptyList()) -} - -internal fun createLazySet( - children: Collection>, - sources: Collection> -): LazySet { - val childCaches = children - .map { child -> child.snapshot() } - - val cache = childCaches.flatMapToSet { it.cache } - val remaining = childCaches.flatMapToSet { it.remaining } - .plus(sources) - .sortedByDescending { it.priority } - - return LazySetImpl(cache, remaining) -} diff --git a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/internal/DataSourceImpl.kt b/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/internal/DataSourceImpl.kt deleted file mode 100644 index 36bad1253a..0000000000 --- a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/internal/DataSourceImpl.kt +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.lazy.internal - -import modulecheck.utils.lazy.LazyDeferred -import modulecheck.utils.lazy.LazySet - -@PublishedApi -internal class DataSourceImpl( - override val priority: LazySet.DataSource.Priority, - private val lazyDeferred: LazyDeferred> -) : LazySet.DataSource, LazyDeferred> by lazyDeferred { - - override suspend fun get(): Set = await() - - override fun equals(other: Any?): Boolean { - if (this === other) return true - if (javaClass != other?.javaClass) return false - - other as DataSourceImpl<*> - - if (lazyDeferred != other.lazyDeferred) return false - - return true - } - - override fun hashCode(): Int = lazyDeferred.hashCode() -} diff --git a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/internal/LazySetImpl.kt b/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/internal/LazySetImpl.kt deleted file mode 100644 index 4b10f6c7ef..0000000000 --- a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/internal/LazySetImpl.kt +++ /dev/null @@ -1,175 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.lazy.internal - -import kotlinx.coroutines.flow.AbstractFlow -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.FlowCollector -import kotlinx.coroutines.flow.asFlow -import kotlinx.coroutines.flow.emitAll -import kotlinx.coroutines.flow.flow -import kotlinx.coroutines.flow.map -import kotlinx.coroutines.flow.take -import modulecheck.utils.containsAny -import modulecheck.utils.coroutines.any -import modulecheck.utils.coroutines.distinct -import modulecheck.utils.coroutines.flatMapSetConcat -import modulecheck.utils.coroutines.mapAsync -import modulecheck.utils.lazy.LazySet -import modulecheck.utils.lazy.LazySet.DataSource -import modulecheck.utils.lazy.LazySet.State -import java.util.concurrent.atomic.AtomicReference - -internal class LazySetImpl( - cache: Set, - sources: List> -) : AbstractFlow(), LazySet { - - internal val state = AtomicReference( - State( - cache = cache, - remaining = sources - ) - ) - - override val isFullyCached: Boolean - get() = state.get().remaining.isEmpty() - - override fun snapshot(): State = state.get() - - override suspend fun isEmpty(): Boolean { - val snap = snapshot() - - if (snap.remaining.isEmpty()) { - return snap.cache.isEmpty() - } - - if (snap.cache.isNotEmpty()) { - return false - } - - // There can be a queue of DataSources lined up, but they may all be empty. - // In order to determine whether the set has any more elements, we have to iterate over that - // queue, unwrapping all those DataSources. As soon as we reach any element, we know the set - // isn't empty and we can return. - var reachedElement = true - take(1) - .collect { reachedElement = true } - return !reachedElement - } - - override suspend fun isNotEmpty(): Boolean = !isEmpty() - - override suspend fun contains(element: Any?): Boolean { - - val snap = state.get() - - return snap.cache.contains(element) || snap.remainingFlow() - .any { it.contains(element) } - } - - override suspend fun containsAny(other: LazySet): Boolean { - - // contents will match if this is reflexive - if (this === other) return true - - val snap = snapshot() - val thisCached = snap.cache - val thisRemaining = snap.remainingFlow() - - val otherSnap = other.snapshot() - val otherCached = otherSnap.cache - val otherRemaining = with(other as LazySetImpl) { - otherSnap.remainingFlow() - } - - // avoid pulling non-cached data if possible - // prioritize building the cache for "this" before adding to the cache of the other LazySet - - return when { - // cached vs other cached - thisCached.containsAny(otherCached) -> true - - snap.remaining.isEmpty() && otherSnap.remaining.isEmpty() -> false - - // not-cached vs other cached, so that we build up "this" LazySet's cache first - thisRemaining.any { remainingSetChunk -> - remainingSetChunk.containsAny(otherCached) - } -> true - - else -> { - // At this point, the "this" LazySet is fully cached. So if there's a matching element, - // it must be in a "remaining" data source from the other. - val fullCache = snapshot().cache - otherRemaining.any { otherRemainingChunk -> - fullCache.containsAny(otherRemainingChunk) - } - } - } - } - - private fun updateCache(new: Set, completed: List>) { - - var fromAtomic: State - var newPair: State - - do { - fromAtomic = state.get() - newPair = State( - cache = fromAtomic.cache + new, - remaining = fromAtomic.remaining.minus(completed.toSet()) - ) - } while (!state.compareAndSet(fromAtomic, newPair)) - } - - private fun State.remainingFlow(): Flow> { - - return nextSources().asFlow() - .map { nextSources -> - - nextSources.mapAsync { it.get() } - .flatMapSetConcat() - .also { updateCache(it, nextSources) } - } - } - - override suspend fun collectSafely(collector: FlowCollector) { - - val snap = state.get() - - val distinctFlow = flow distinctFlow@{ - - this@distinctFlow.emitAll(snap.cache.asFlow()) - - @Suppress("MagicNumber") - snap.remaining.sorted() - .chunked(100) - .forEach { dataSourceChunk -> - - val new = dataSourceChunk - .mapAsync { dataSource -> dataSource.get() } - .flatMapSetConcat() - - updateCache(new, dataSourceChunk) - - this@distinctFlow.emitAll(new.asFlow()) - } - } - .distinct() - - collector.emitAll(distinctFlow) - } -} diff --git a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/lazy.kt b/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/lazy.kt deleted file mode 100644 index fb8776eb04..0000000000 --- a/modulecheck-utils/lazy/src/main/kotlin/modulecheck/utils/lazy/lazy.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.lazy - -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -fun unsafeLazy(initializer: () -> T): Lazy = - lazy(mode = LazyThreadSafetyMode.NONE, initializer = initializer) - -/** just a var, but the initial value is lazy */ -fun lazyVar(initializer: () -> T): ReadWriteProperty = SynchronizedLazyVar(initializer) - -private class SynchronizedLazyVar(initializer: () -> T) : ReadWriteProperty { - - @Volatile - private var isSet = false - private var initializer: (() -> T)? = initializer - private var value: Any? = null - - @Suppress("UNCHECKED_CAST") - override fun getValue(thisRef: Any?, property: KProperty<*>): T { - - if (isSet) { - return value as T - } - synchronized(this) { - if (!isSet) { - @Suppress("UnsafeCallOnNullableType") - value = initializer!!.invoke() - isSet = true - initializer = null - } - return value as T - } - } - - override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) { - synchronized(this) { - this.value = value - isSet = true - } - } -} diff --git a/modulecheck-utils/lazy/src/test/kotlin/modulecheck/utils/lazy/LazyDeferredTest.kt b/modulecheck-utils/lazy/src/test/kotlin/modulecheck/utils/lazy/LazyDeferredTest.kt deleted file mode 100644 index e2bcf0f2f8..0000000000 --- a/modulecheck-utils/lazy/src/test/kotlin/modulecheck/utils/lazy/LazyDeferredTest.kt +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.lazy - -import io.kotest.matchers.collections.shouldContainExactlyInAnyOrder -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Test -import java.util.concurrent.atomic.AtomicBoolean - -internal class LazyDeferredTest { - - @Test - fun `nothing should be invoked until await`() = runTest { - - val completed = AtomicBoolean(false) - - val deferred = lazyDeferred { - completed.lazySet(true) - true - } - - completed.get() shouldBe false - - deferred.await() shouldBe true - completed.get() shouldBe true - } - - @Test - fun `awaitAll should not deadlock`() = runTest { - - val one = lazyDeferred { 1 } - val two = lazyDeferred { 2 } - val three = lazyDeferred { 3 } - - val all = listOf(one, two, three).awaitAll() - - all shouldContainExactlyInAnyOrder listOf(1, 2, 3) - } -} diff --git a/modulecheck-utils/lazy/src/test/kotlin/modulecheck/utils/lazy/LazySetTest.kt b/modulecheck-utils/lazy/src/test/kotlin/modulecheck/utils/lazy/LazySetTest.kt deleted file mode 100644 index 9133a75fd0..0000000000 --- a/modulecheck-utils/lazy/src/test/kotlin/modulecheck/utils/lazy/LazySetTest.kt +++ /dev/null @@ -1,124 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.lazy - -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.flow.first -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.flow.toSet -import kotlinx.coroutines.test.runTest -import org.junit.jupiter.api.Test - -class LazySetTest { - - @Test - fun `isEmpty with empty LazySet when it's not cached`() = runTest { - - val subject = lazySet() - - subject.isEmpty() shouldBe true - subject.isNotEmpty() shouldBe false - } - - @Test - fun `data source is only evaluated once`() = runTest { - - var invocations = 0 - - val ds = dataSource { - setOf(++invocations) - } - - val ls1 = lazySet(ds) - val ls2 = lazySet(ds) - - ls1.toSet() shouldBe setOf(1) - ls2.toSet() shouldBe setOf(1) - } - - @Test - fun `isEmpty with empty LazySet when it's already cached`() = runTest { - - val subject = lazySet() - - subject.toList() shouldBe emptyList() - - subject.isEmpty() shouldBe true - subject.isNotEmpty() shouldBe false - } - - @Test - fun `isEmpty with non-empty LazySet when it's not cached`() = runTest { - - val subject = lazySet(dataSourceOf(1)) - - subject.isEmpty() shouldBe false - subject.isNotEmpty() shouldBe true - - subject.isFullyCached shouldBe true - subject.snapshot().cache shouldBe setOf(1) - } - - @Test - fun `isEmpty with single dataSource when it's not cached`() = runTest { - - val subject = lazySet { setOf(1, 2, 3, 4) } - - subject.isEmpty() shouldBe false - subject.isNotEmpty() shouldBe true - - subject.isFullyCached shouldBe true - subject.snapshot().cache shouldBe setOf(1, 2, 3, 4) - } - - @Test - fun `isEmpty with non-empty LazySet when it's already cached`() = runTest { - - val subject = lazySet(dataSourceOf(1)) - - subject.toList() shouldBe listOf(1) - - subject.isEmpty() shouldBe false - subject.isNotEmpty() shouldBe true - } - - @Test - fun `isEmpty with non-empty LazySet when it's partially cached`() = runTest { - - val subject = lazySet(List(101) { dataSourceOf(it) }) - - subject.first() shouldBe 0 - - subject.snapshot().cache shouldBe (0..99).toSet() - - subject.isEmpty() shouldBe false - subject.isNotEmpty() shouldBe true - - subject.snapshot().cache shouldBe (0..99).toSet() - - subject.toList() shouldBe List(101) { it } - } - - @Test - fun `should be fully cached if 'contains' returns false`() = runTest { - - val subject = lazySet(List(101) { dataSourceOf(it) }) - - subject.contains(9000) shouldBe false - - subject.isFullyCached shouldBe true - } -} diff --git a/modulecheck-utils/stdlib/api/stdlib.api b/modulecheck-utils/stdlib/api/stdlib.api deleted file mode 100644 index b72f6321e7..0000000000 --- a/modulecheck-utils/stdlib/api/stdlib.api +++ /dev/null @@ -1,182 +0,0 @@ -public final class modulecheck/utils/ApplyKt { - public static final fun alsoIf (Ljava/lang/Object;ZLkotlin/jvm/functions/Function1;)Ljava/lang/Object; - public static final fun applyEach (Ljava/lang/Object;Ljava/lang/Iterable;)Ljava/lang/Object; - public static final fun applyEach (Ljava/lang/Object;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; - public static final fun applyEach (Ljava/lang/Object;[Lkotlin/jvm/functions/Function1;)Ljava/lang/Object; - public static final fun applyEachIndexed (Ljava/lang/Object;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object; - public static final fun applyEachIndexed (Ljava/lang/Object;[Ljava/lang/Object;Lkotlin/jvm/functions/Function3;)Ljava/lang/Object; - public static final fun applyIf (Ljava/lang/Object;ZLkotlin/jvm/functions/Function1;)Ljava/lang/Object; - public static final fun letIf (Ljava/lang/Object;ZLkotlin/jvm/functions/Function1;)Ljava/lang/Object; -} - -public abstract class modulecheck/utils/CaseMatcher { - public synthetic fun (Lkotlin/text/Regex;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public fun matches (Ljava/lang/String;)Z - public fun toString ()Ljava/lang/String; -} - -public final class modulecheck/utils/CaseMatcher$CamelSnakeCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$CustomMatcher : modulecheck/utils/CaseMatcher { - public fun (Lkotlin/text/Regex;)V -} - -public final class modulecheck/utils/CaseMatcher$KebabCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$LowerCamelCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$LowerFlatCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$ScreamingKebabCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$ScreamingSnakeCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$SnakeCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$TrainCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$UpperCamelCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CaseMatcher$UpperFlatCaseMatcher : modulecheck/utils/CaseMatcher { - public fun ()V -} - -public final class modulecheck/utils/CastKt { - public static final fun cast (Ljava/lang/Object;)Ljava/lang/Object; - public static final fun requireNotNull (Ljava/lang/Object;)Ljava/lang/Object; - public static final fun requireNotNull (Ljava/lang/Object;Lkotlin/jvm/functions/Function0;)Ljava/lang/Object; -} - -public final class modulecheck/utils/CollectionKt { - public static final fun allValues (Ljava/util/Map;)Ljava/util/List; - public static final fun asCollection (Ljava/lang/Iterable;)Ljava/util/Collection; - public static final fun asList (Ljava/lang/Iterable;)Ljava/util/List; - public static final fun asSet (Ljava/lang/Iterable;)Ljava/util/Set; - public static final fun chunkedBy (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun containsAny (Ljava/lang/Iterable;Ljava/lang/Iterable;)Z - public static final fun filterToSet (Ljava/lang/Iterable;Ljava/util/Set;Lkotlin/jvm/functions/Function1;)Ljava/util/Set; - public static synthetic fun filterToSet$default (Ljava/lang/Iterable;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Set; - public static final fun flatMapToSet (Ljava/lang/Iterable;Ljava/util/Set;Lkotlin/jvm/functions/Function1;)Ljava/util/Set; - public static final fun flatMapToSet (Lkotlin/sequences/Sequence;Ljava/util/Set;Lkotlin/jvm/functions/Function1;)Ljava/util/Set; - public static synthetic fun flatMapToSet$default (Ljava/lang/Iterable;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Set; - public static synthetic fun flatMapToSet$default (Lkotlin/sequences/Sequence;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Set; - public static final fun indicesOf (Ljava/util/Collection;Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun mapToSet (Ljava/util/Collection;Ljava/util/Set;Lkotlin/jvm/functions/Function1;)Ljava/util/Set; - public static synthetic fun mapToSet$default (Ljava/util/Collection;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/util/Set; - public static final fun pluralString (Ljava/util/Collection;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public static final fun sequenceOfNotNull ([Ljava/lang/Object;)Lkotlin/sequences/Sequence; - public static final fun singletonList (Ljava/lang/Object;)Ljava/util/List; - public static final fun singletonSet (Ljava/lang/Object;)Ljava/util/Set; - public static final fun sortedWith (Ljava/lang/Iterable;[Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun sortedWith (Lkotlin/sequences/Sequence;[Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; - public static final fun sortedWithDescending (Ljava/lang/Iterable;[Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun takeWhileInclusive (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/util/List; -} - -public final class modulecheck/utils/ComparableKt { - public static final fun isGreaterThan (Ljava/lang/Comparable;Ljava/lang/Object;)Z -} - -public final class modulecheck/utils/FileKt { - public static final fun createSafely (Ljava/io/File;Ljava/lang/String;Z)Ljava/io/File; - public static synthetic fun createSafely$default (Ljava/io/File;Ljava/lang/String;ZILjava/lang/Object;)Ljava/io/File; - public static final fun div (Ljava/io/File;Ljava/lang/String;)Ljava/io/File; - public static final fun existsOrNull (Ljava/io/File;)Ljava/io/File; - public static final fun findMinimumIndent (Ljava/io/File;)Ljava/lang/String; - public static final fun parents (Ljava/io/File;)Lkotlin/sequences/Sequence; - public static final fun resolve (Ljava/io/File;[Ljava/lang/String;)Ljava/io/File; - public static final fun resolve (Ljava/nio/file/Path;[Ljava/lang/String;)Ljava/nio/file/Path; - public static final fun segments (Ljava/io/File;)Ljava/util/List; -} - -public final class modulecheck/utils/OptionalKt { - public static final fun getOrNull (Ljava/util/Optional;)Ljava/lang/Object; -} - -public final class modulecheck/utils/RegexBuilder { - public fun ()V - public final fun anyOf ([Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/RegexBuilder; - public final fun append (Ljava/lang/String;)Lmodulecheck/utils/RegexBuilder; - public final fun appendWithoutInjection (Ljava/lang/String;)Lmodulecheck/utils/RegexBuilder; - public final fun getStringBuilder ()Ljava/lang/StringBuilder; - public final fun grouped (Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/RegexBuilder; - public final fun or ()Lmodulecheck/utils/RegexBuilder; - public final fun regex (Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public final fun section (Lkotlin/jvm/functions/Function1;)Lmodulecheck/utils/RegexBuilder; -} - -public final class modulecheck/utils/RegexKt { - public static final fun regex (Lkotlin/jvm/functions/Function1;)Lkotlin/text/Regex; - public static final fun replaceDestructured (Ljava/lang/String;Lkotlin/text/Regex;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public static final fun replaceDestructured (Ljava/lang/String;Lkotlin/text/Regex;Lkotlin/jvm/functions/Function2;)Ljava/lang/String; - public static final fun replaceDestructured (Ljava/lang/String;Lkotlin/text/Regex;Lkotlin/jvm/functions/Function3;)Ljava/lang/String; - public static final fun replaceDestructured (Ljava/lang/String;Lkotlin/text/Regex;Lkotlin/jvm/functions/Function4;)Ljava/lang/String; - public static final fun replaceDestructured (Ljava/lang/String;Lkotlin/text/Regex;Lkotlin/jvm/functions/Function5;)Ljava/lang/String; - public static final fun replaceRegex (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; -} - -public final class modulecheck/utils/StringKt { - public static final fun capitalize (Ljava/lang/String;)Ljava/lang/String; - public static final fun capitalize (Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String; - public static synthetic fun capitalize$default (Ljava/lang/String;Ljava/util/Locale;ILjava/lang/Object;)Ljava/lang/String; - public static final fun decapitalize (Ljava/lang/String;Ljava/util/Locale;)Ljava/lang/String; - public static synthetic fun decapitalize$default (Ljava/lang/String;Ljava/util/Locale;ILjava/lang/Object;)Ljava/lang/String; - public static final fun findMinimumIndent (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static synthetic fun findMinimumIndent$default (Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; - public static final fun getDots (Ljava/lang/String;)Ljava/lang/String; - public static final fun getInterpuncts (Ljava/lang/String;)Ljava/lang/String; - public static final fun getNoDots (Ljava/lang/String;)Ljava/lang/String; - public static final fun getNoInterpuncts (Ljava/lang/String;)Ljava/lang/String; - public static final fun indent (Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;)V - public static synthetic fun indent$default (Ljava/lang/StringBuilder;Ljava/lang/String;Ljava/lang/String;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)V - public static final fun indentByBrackets (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static synthetic fun indentByBrackets$default (Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; - public static final fun joinToStringConcat (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public static final fun joinToStringConcat (Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public static synthetic fun joinToStringConcat$default (Ljava/lang/Iterable;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; - public static synthetic fun joinToStringConcat$default (Lkotlin/sequences/Sequence;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Ljava/lang/String; - public static final fun joinToStringIndexed (Lkotlin/sequences/Sequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function2;)Ljava/lang/String; - public static synthetic fun joinToStringIndexed$default (Lkotlin/sequences/Sequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;Ljava/lang/CharSequence;ILjava/lang/CharSequence;Lkotlin/jvm/functions/Function2;ILjava/lang/Object;)Ljava/lang/String; - public static final fun justifyToFirstLine (Ljava/lang/String;)Ljava/lang/String; - public static final fun mapLines (Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function1;)Ljava/lang/String; - public static final fun mapLinesIndexed (Ljava/lang/CharSequence;Lkotlin/jvm/functions/Function2;)Ljava/lang/String; - public static final fun noAnsi (Ljava/lang/String;)Ljava/lang/String; - public static final fun normaliseLineSeparators (Ljava/lang/String;)Ljava/lang/String; - public static final fun prefix (Ljava/lang/CharSequence;Ljava/lang/String;)Ljava/lang/String; - public static final fun prefixIfNot (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun prependContinuationIndent (Ljava/lang/CharSequence;Ljava/lang/String;Z)Ljava/lang/String; - public static synthetic fun prependContinuationIndent$default (Ljava/lang/CharSequence;Ljava/lang/String;ZILjava/lang/Object;)Ljava/lang/String; - public static final fun prettyToString (Ljava/lang/String;)Ljava/lang/String; - public static final fun remove (Ljava/lang/String;[Ljava/lang/String;)Ljava/lang/String; - public static final fun remove (Ljava/lang/String;[Lkotlin/text/Regex;)Ljava/lang/String; - public static final fun splitAndMap (Ljava/lang/String;[CLkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun splitAndMap (Ljava/lang/String;[Ljava/lang/String;Lkotlin/jvm/functions/Function1;)Ljava/util/List; - public static final fun splitAndTrim (Ljava/lang/String;[C)Ljava/util/List; - public static final fun splitAndTrim (Ljava/lang/String;[Ljava/lang/String;)Ljava/util/List; - public static final fun suffixIfNot (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static final fun toStringPretty (Ljava/lang/Object;)Ljava/lang/String; - public static final fun trimIndentAfterFirstLine (Ljava/lang/String;)Ljava/lang/String; - public static final fun trimSegments (Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static synthetic fun trimSegments$default (Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; - public static final fun wrapIn (Ljava/lang/CharSequence;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String; - public static synthetic fun wrapIn$default (Ljava/lang/CharSequence;Ljava/lang/String;Ljava/lang/String;ILjava/lang/Object;)Ljava/lang/String; -} - diff --git a/modulecheck-utils/stdlib/build.gradle.kts b/modulecheck-utils/stdlib/build.gradle.kts deleted file mode 100644 index 1f5cf170db..0000000000 --- a/modulecheck-utils/stdlib/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-stdlib" - ) -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.kotlinx.coroutines.test) - testImplementation(libs.square.turbine) - - testImplementation(project(path = ":modulecheck-utils:coroutines:api")) -} diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/CaseMatcher.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/CaseMatcher.kt deleted file mode 100644 index 043336b939..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/CaseMatcher.kt +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -/** - * https://gist.github.com/SuppieRK/a6fb471cf600271230c8c7e532bdae4b - * - * @since 0.12.0 - */ -sealed class CaseMatcher(private val regex: Regex) { - - /** - * Represents matching for flat case, e.g. 'flatcase' - * - * Can be also referred as: lower flat case - * - * @since 0.12.0 - */ - class LowerFlatCaseMatcher : CaseMatcher(Regex("[a-z\\d]+")) - - /** - * Represents matching for upper flat case, e.g. 'UPPERFLATCASE' - * - * @since 0.12.0 - */ - class UpperFlatCaseMatcher : CaseMatcher(Regex("[A-Z\\d]+")) - - /** - * Represents matching for camel case, e.g. 'camelCase' - * - * Can be also referred as: lower camel case, dromedary case - * - * @since 0.12.0 - */ - class LowerCamelCaseMatcher : CaseMatcher(Regex("""[a-z]+(?:[A-Z\d]+[a-z\d]+[A-Za-z\d]*)*""")) - - /** - * Represents matching for upper camel case, e.g. 'UpperCamelCase' - * - * Can be also referred as: pascal case, studly case - * - * @since 0.12.0 - */ - class UpperCamelCaseMatcher : CaseMatcher(Regex("""[A-Z][a-z\d]+(?:[A-Z]+[a-z\d]*)*""")) - - /** - * Represents matching for snake case, e.g. 'snake_case' - * - * Can be also referred as: lower snake case, pothole case - * - * @since 0.12.0 - */ - class SnakeCaseMatcher : CaseMatcher(Regex("""[a-z\d]+(?:_[a-z\d]+)*""")) - - /** - * Represents matching for screaming snake case, e.g. 'SCREAMING_SNAKE_CASE' - * - * Can be also referred as: upper snake case, macro case, constant case - * - * @since 0.12.0 - */ - class ScreamingSnakeCaseMatcher : CaseMatcher(Regex("""[A-Z\d]+(?:_[A-Z\d]+)*""")) - - /** - * Represents matching for camel snake case, e.g. 'Camel_Snake_Case' - * - * @since 0.12.0 - */ - class CamelSnakeCaseMatcher : CaseMatcher(Regex("""[A-Z][a-z\d]+(?:_[A-Z]+[a-z\d]*)*""")) - - /** - * Represents matching for kebab case, e.g. 'kebab-case' - * - * Can be also referred as: lower kebab case, dash case, lisp case - * - * @since 0.12.0 - */ - class KebabCaseMatcher : CaseMatcher(Regex("""[a-z\d]+(?:-[a-z\d]+)*""")) - - /** - * Represents matching for screaming kebab case, e.g. 'SCREAMING-KEBAB-CASE' - * - * Can be also referred as: upper kebab case, cobol case - * - * @since 0.12.0 - */ - class ScreamingKebabCaseMatcher : CaseMatcher(Regex("""[A-Z\d]+(?:-[A-Z\d]+)*""")) - - /** - * Represents matching for train case, e.g. 'Train-Case' - * - * @since 0.12.0 - */ - class TrainCaseMatcher : CaseMatcher(Regex("""[A-Z][a-z\d]+(?:-[A-Z]+[a-z\d]*)*""")) - - /** - * Represents matching for custom regular expressions - * - * @since 0.12.0 - */ - class CustomMatcher(regex: Regex) : CaseMatcher(regex) - - open fun matches(source: String?): Boolean { - return source?.matches(regex) ?: false - } - - override fun toString(): String { - return "${this.javaClass.simpleName}('$regex')" - } -} diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/apply.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/apply.kt deleted file mode 100644 index 9db5ef0730..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/apply.kt +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -/** - * Applies the given block to each element in the iterable and returns the receiver object. - * - * @param elements The iterable collection of elements to apply the block to. - * @param block The block of code to apply to each element. - * @return The receiver object after applying the block to each element. - */ -inline fun T.applyEach(elements: Iterable, block: T.(e: E) -> Unit): T = apply { - for (element in elements) { - block(element) - } -} - -/** - * Applies the given block to each element in the iterable and returns the receiver object. - * - * @param elements The iterable collection of elements to apply the block to. - * @param block The block of code to apply to each element. - * @return The receiver object after applying the block to each element. - */ -inline fun T.applyEachIndexed( - elements: Iterable, - block: T.(index: Int, e: E) -> Unit -): T = apply { - for ((index, element) in elements.withIndex()) { - block(index, element) - } -} - -/** - * Applies the given block to each element in the iterable and returns the receiver object. - * - * @param elements The iterable collection of elements to apply the block to. - * @param block The block of code to apply to each element. - * @return The receiver object after applying the block to each element. - */ -inline fun T.applyEachIndexed(elements: Array, block: T.(index: Int, e: E) -> Unit): T = - apply { - for ((index, element) in elements.withIndex()) { - block(index, element) - } - } - -/** - * Applies the given blocks to the receiver object. - * - * shorthand for `for (block in blocks) apply(block)` - * - * @param blocks The blocks of code to apply to each element. - * @return The receiver object after applying the block to each element. - */ -@Suppress("NOTHING_TO_INLINE") -inline fun T.applyEach(blocks: Iterable Unit>): T = apply { - for (block in blocks) block() -} - -/** - * Applies the given blocks to the receiver object. - * - * shorthand for `for (block in blocks) apply(block)` - * - * @param blocks The blocks of code to apply to each element. - * @return The receiver object after applying the block to each element. - */ -@Suppress("NOTHING_TO_INLINE") -inline fun T.applyEach(vararg blocks: T.() -> Unit): T = apply { - for (block in blocks) block() -} - -/** - * Conditionally applies the provided block to the receiver object - * if the predicate is true and returns the modified object. - * - * @param predicate The predicate to determine whether to apply the block. - * @param body The block of code to apply to the receiver object. - * @return The modified receiver object if the predicate - * is true, or the original receiver object otherwise. - */ -inline fun T.applyIf(predicate: Boolean, body: T.() -> T): T = apply { - if (predicate) { - body() - } -} - -/** - * Conditionally applies the provided transform function to the receiver - * object if the predicate is true, then returns the result of that transform. - * If the predicate is false, the receiver object itself is returned. - * - * @param predicate The predicate to determine whether to apply the transform function. - * @param transform The transform function to apply to the receiver object. - * @return The result of the transform function if the - * predicate is true, or the receiver object itself otherwise. - */ -inline fun T.letIf(predicate: Boolean, transform: (T) -> T): T { - return if (predicate) transform(this) else this -} - -/** - * Conditionally applies the provided transformation function to the - * receiver object if the predicate is true and returns the result. - * If the predicate is false, the receiver object itself is returned. - * - * @param predicate The predicate to determine whether to apply the transformation function. - * @param body The transformation function to apply to the receiver object. - * @return The result of the transformation function if the - * predicate is true, or the receiver object itself otherwise. - */ -inline fun T.alsoIf(predicate: Boolean, body: (T) -> Unit): T { - if (predicate) { - body(this) - } - return this -} diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/cast.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/cast.kt deleted file mode 100644 index bda46fa795..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/cast.kt +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -@Suppress("UNCHECKED_CAST", "NOTHING_TO_INLINE") -inline fun Any.cast(): T = this as T - -@Suppress("NOTHING_TO_INLINE") -inline fun T?.requireNotNull(): T = requireNotNull(this) - -inline fun T?.requireNotNull(lazyMessage: () -> Any): T = - requireNotNull(this, lazyMessage) - -inline fun Any?.safeAs(): T? = this as? T diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/collection.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/collection.kt deleted file mode 100644 index 69ead21bb7..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/collection.kt +++ /dev/null @@ -1,281 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -/** - * Wraps a given item in a list. - * - * This is a functional style shorthand for `listOf(this)`, - * allowing a simpler syntax for creating a list from a single item. - * - * @receiver The item to be wrapped in a list. - * @return A list containing only the receiver item. - * @since 0.12.0 - */ -fun T.singletonList(): List = listOf(this) - -/** - * Wraps a given item in a set. - * - * This is a functional style shorthand for `setOf(this)`, - * allowing a simpler syntax for creating a set from a single item. - * - * @receiver The item to be wrapped in a set. - * @return A set containing only the receiver item. - * @since 0.12.0 - */ -fun T.singletonSet(): Set = setOf(this) - -/** - * Filters the receiver iterable and adds the matching elements to a set. - * - * This is a shorthand for `filterTo(destination, predicate)` where destination is a set. - * - * @param destination The destination set where the elements that match - * the predicate are placed. By default, it is an empty mutable set. - * @param predicate A function that determines if an item should be included in the output set. - * @receiver The iterable to be filtered. - * @return A set containing elements from the receiver iterable that match the predicate. - */ -inline fun Iterable.filterToSet( - destination: MutableSet = mutableSetOf(), - predicate: (T) -> Boolean -): Set { - return filterTo(destination, predicate) -} - -/** - * Transforms the elements of the receiver collection and adds the results to a set. - * - * @param destination The destination set where the transformed - * elements are placed. By default, it is an empty mutable set. - * @param transform A function that maps elements of the receiver collection to the output set. - * @receiver The collection to be transformed. - * @return A set containing the transformed elements from the receiver collection. - */ -inline fun , T, R> C.mapToSet( - destination: MutableSet = mutableSetOf(), - transform: (T) -> R -): Set { - return mapTo(destination, transform) -} - -/** - * Transforms each element of the receiver iterable to an - * iterable and flattens these iterables into a single set. - * - * @param destination The destination set where the transformed - * elements are placed. By default, it is an empty mutable set. - * @param transform A function that maps elements of the - * receiver iterable to an iterable of output elements. - * @receiver The iterable to be transformed. - * @return A set containing the flattened transformed elements from the receiver iterable. - */ -inline fun Iterable.flatMapToSet( - destination: MutableSet = mutableSetOf(), - transform: (T) -> Iterable -): Set { - return flatMapTo(destination, transform) -} - -/** - * Transforms each element of the receiver iterable to an - * iterable and flattens these iterables into a single set. - * - * @param destination The destination set where the transformed - * elements are placed. By default, it is an empty mutable set. - * @param transform A function that maps elements of the - * receiver iterable to an iterable of output elements. - * @receiver The sequence to be transformed. - * @return A set containing the flattened transformed elements from the receiver iterable. - */ -inline fun Sequence.flatMapToSet( - destination: MutableSet = mutableSetOf(), - transform: (T) -> Iterable -): Set { - return flatMapTo(destination, transform) -} - -/** - * Returns a list of all elements sorted according to the specified [selectors]. - * - * The sort is _stable_. It means that equal elements - * preserve their order relative to each other after sorting. - * - * @since 0.12.0 - */ -fun Iterable.sortedWith(vararg selectors: (T) -> Comparable<*>): List { - if (this is Collection) { - if (size <= 1) return this.toList() - @Suppress("UNCHECKED_CAST") - return (toTypedArray() as Array).apply { sortWith(compareBy(*selectors)) }.asList() - } - return toMutableList().apply { sortWith(compareBy(*selectors)) } -} - -/** - * Returns a list of all elements sorted according to the specified [selectors]. - * - * The sort is _stable_. It means that equal elements - * preserve their order relative to each other after sorting. - * - * @since 0.12.0 - */ -fun Sequence.sortedWith(vararg selectors: (T) -> Comparable<*>): Sequence { - return sortedWith(compareBy(*selectors)) -} - -/** - * Returns a list of all elements sorted according to the specified [selectors]. - * - * The sort is _stable_. It means that equal elements - * preserve their order relative to each other after sorting. - * - * @since 0.12.0 - */ -fun Iterable.sortedWithDescending(vararg selectors: (T) -> Comparable<*>): List { - return sortedWith(*selectors).reversed() -} - -/** shorthand for `values.flatten().distinct()` */ -fun Map>.allValues(): List { - return values.flatten().distinct() -} - -/** Creates a sequence of those [elements] which are not null */ -fun sequenceOfNotNull(vararg elements: T?): Sequence = sequence { - elements.forEach { element -> - if (element != null) yield(element) - } -} - -/** - * @return true if any element in [other] is contained - * within the receiver collection, otherwise returns false - */ -fun Iterable.containsAny(other: Iterable): Boolean { - - return when { - this === other -> true - this is Set && other is Set<*> -> { - intersect(other.asSet()).isNotEmpty() - } - - else -> { - val thisAsSet = asSet() - other.any { thisAsSet.contains(it) } - } - } -} - -/** - * shorthand for `this as? Set ?: toSet()` - * - * @return itself if the receiver [Iterable] is already a - * `Set`, otherwise calls `toSet()` to create a new one - */ -fun Iterable.asSet(): Set = this as? Set ?: toSet() - -/** - * shorthand for `this as? List ?: toList()` - * - * @return itself if the receiver [Iterable] is already a - * `List`, otherwise calls `toList()` to create a new one - */ -fun Iterable.asList(): List = this as? List ?: toList() - -/** - * shorthand for `this as? Collection ?: toList()` - * - * @return itself if the receiver [Iterable] is already a - * `Collection`, otherwise calls `toList()` to create a new one - */ -fun Iterable.asCollection(): Collection = this as? Collection ?: toList() - -/** - * Returns a string representation of the collection based on its size. - * - * @param empty A function that generates a string for when the collection is empty. - * @param single A function that generates a string for when the collection contains - * a single element. The single element is passed as an argument to this function. - * @param moreThanOne A function that generates a string for when the collection contains - * more than one element. The entire collection is passed as an argument to this function. - * @return A string representation of the collection. - */ -fun Collection.pluralString( - empty: () -> String, - single: (E) -> String, - moreThanOne: (Iterable) -> String -): String = when (size) { - 0 -> empty() - 1 -> single(single()) - else -> moreThanOne(this) -} - -/** - * Finds the indices of all elements in the receiver collection that match the given predicate. - * - * @param predicate A function that determines if an - * element's index should be included in the output list. - * @receiver The collection to be searched. - * @return A list containing the indices of all elements that match the predicate. - */ -inline fun Collection.indicesOf(predicate: (E) -> Boolean): List { - return buildList { - for ((index, e) in this@indicesOf.withIndex()) { - if (predicate(e)) { - add(index) - } - } - } -} - -/** - * Returns a list containing the elements from the receiver iterable up to and - * including the first element for which the given predicate returns false. - * - * @param predicate A function that determines if an element should be included in the output list. - * @receiver The iterable to be processed. - * @return A list containing the elements from the receiver iterable up to - * and including the first element for which the predicate returns false. - */ -inline fun Iterable.takeWhileInclusive(predicate: (E) -> Boolean): List { - return buildList { - for (e in this@takeWhileInclusive) { - add(e) - if (!predicate(e)) break - } - } -} - -/** - * This function iterates over the receiver iterable and adds each element - * to the current chunk. Whenever the selector function returns true for an - * element, that element concludes the current chunk and a new chunk is started. - * - * @param selector A function that determines when to - * conclude the current chunk and start a new one. - * @receiver The iterable to be split into chunks. - * @return A list of chunks, where each chunk is a list of elements from the receiver iterable. - */ -fun Iterable.chunkedBy(selector: (E) -> Boolean): List> { - return fold(mutableListOf>(mutableListOf())) { acc, e -> - acc.last().add(e) - acc.alsoIf(selector(e)) { - it.add(mutableListOf()) - } - } -} diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/comparable.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/comparable.kt deleted file mode 100644 index cf9da02306..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/comparable.kt +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -infix fun Comparable.isGreaterThan(other: T): Boolean { - return compareTo(other) > 0 -} diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/file.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/file.kt deleted file mode 100644 index fea99107fc..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/file.kt +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -import java.io.File -import java.nio.file.Path - -/** - * Checks if the receiver [File] exists and returns it, or null if it does not exist. - * - * @receiver [File] The file to check. - * @return The file if it exists, null otherwise. - */ -fun File.existsOrNull(): File? = if (exists()) this else null - -/** - * vararg overload of [kotlin.io.resolve] - * - * @param relative The path segments of the child path. - * @return A [File] representing the child path. - */ -fun File.resolve(vararg relative: String): File { - return relative.fold(this) { parent, relativePath -> - check(!relativePath.startsWith(File.separatorChar)) { - "Do not include ${File.separatorChar} at the start of a relative path argument: $relativePath" - } - parent.resolve(relative = relativePath) - } -} - -/** - * vararg overload of [java.nio.file.Path.resolve] - * - * @param relative The path segments of the child path. - * @return A [File] representing the child path. - */ -fun Path.resolve(vararg relative: String): Path { - return relative.fold(this) { parent, relativePath -> - check(!relativePath.startsWith(File.separatorChar)) { - "Do not include ${File.separatorChar} at the start of a relative path argument: $relativePath" - } - parent.resolve(relativePath) - } -} - -/** - * Reads the receiver [File] and finds the minimum indent in its content. - * - * @receiver [File] The file to process. - * @return A [String] containing the minimum indent. - */ -fun File.findMinimumIndent(): String { - return readText().findMinimumIndent() -} - -/** - * Creates a new file if it doesn't already exist, creating parent - * directories if necessary. If the file already exists, its content will - * be overwritten. If content is provided, it will be written to the file. - * - * @param content The content to be written to the file. Defaults to null. - * @param overwrite If true, any existing content will be overwritten. Otherwise, nothing is done. - * @return The created file. - */ -fun File.createSafely(content: String? = null, overwrite: Boolean = true): File = apply { - when { - content != null && (!exists() || overwrite) -> makeParentDir().writeText(content) - else -> { - makeParentDir().createNewFile() - } - } -} - -/** - * Creates the directories represented by the receiver [File] if they don't already exist. - * - * @receiver [File] The directories to create. - * @return The directory file. - */ -internal fun File.mkdirsInline(): File = apply(File::mkdirs) - -/** - * Creates the parent directory of the receiver [File] if it doesn't already exist. - * - * @receiver [File] The file whose parent directory is to be created. - * @return The file with its parent directory created. - */ -internal fun File.makeParentDir(): File = apply { - val fileParent = requireNotNull(parentFile) { "File's `parentFile` must not be null." } - fileParent.mkdirs() -} - -/** - * Resolves the given child path against the receiver [File]. - * - * @param child The child path to be resolved against the receiver [File]. - * @return The resultant [File]. - */ -operator fun File.div(child: String): File = resolve(child) - -/** - * Splits the receiver [File]'s path into its individual segments. - * - * @receiver [File] The file to process. - * @return A list of strings representing the segments of the file's path. - */ -fun File.segments(): List = path.split(File.separatorChar) - -/** - * all parents starting from the direct parent. Does not include the receiver file. - * - * @receiver [File] The file whose parents to list. - * @return A sequence of all parent directories of the receiver [File]. - */ -fun File.parents(): Sequence = generateSequence(parentFile) { it.parentFile } diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/optional.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/optional.kt deleted file mode 100644 index 7c2bb3f35d..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/optional.kt +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -import java.util.Optional - -/** shorthand for `takeIf { it.isPresent }?.get()` */ -fun Optional.getOrNull(): T? = takeIf { it.isPresent }?.get() diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/regex.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/regex.kt deleted file mode 100644 index 7961bec34d..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/regex.kt +++ /dev/null @@ -1,208 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -import org.intellij.lang.annotations.Language -import kotlin.text.replace -import kotlin.text.replace as matchResultReplace - -/** - * code golf for `replace(regex.toRegex(), replacement)` - * - * @since 0.12.0 - */ -fun String.replaceRegex( - @Language("regexp") - regex: String, - replacement: String -): String = replace( - regex = regex.toRegex(), - replacement = replacement -) - -inline fun String.replaceDestructured( - regex: Regex, - crossinline transform: (group1: String) -> String -): String { - return matchResultReplace(regex) { matchResult -> - transform(matchResult.destructured.component1()) - } -} - -inline fun String.replaceDestructured( - regex: Regex, - crossinline transform: (group1: String, group2: String) -> String -): String { - return matchResultReplace(regex) { matchResult -> - transform( - matchResult.destructured.component1(), - matchResult.destructured.component2() - ) - } -} - -inline fun String.replaceDestructured( - regex: Regex, - crossinline transform: (group1: String, group2: String, group3: String) -> String -): String { - return matchResultReplace(regex) { matchResult -> - transform( - matchResult.destructured.component1(), - matchResult.destructured.component2(), - matchResult.destructured.component3() - ) - } -} - -inline fun String.replaceDestructured( - regex: Regex, - crossinline transform: (group1: String, group2: String, group3: String, group4: String) -> String -): String { - return matchResultReplace(regex) { matchResult -> - transform( - matchResult.destructured.component1(), - matchResult.destructured.component2(), - matchResult.destructured.component3(), - matchResult.destructured.component4() - ) - } -} - -inline fun String.replaceDestructured( - regex: Regex, - crossinline transform: ( - group1: String, - group2: String, - group3: String, - group4: String, - group5: String - ) -> String -): String { - return matchResultReplace(regex) { matchResult -> - transform( - matchResult.destructured.component1(), - matchResult.destructured.component2(), - matchResult.destructured.component3(), - matchResult.destructured.component4(), - matchResult.destructured.component5() - ) - } -} - -/** - * Constructs a `Regex` instance by applying the provided `builder` function - * within the context of a `RegexBuilderScope`. This enables the creation - * of complex regular expressions in a more readable and maintainable way. - * - * @param builder A lambda function with `RegexBuilderScope` as its receiver. - * @return The constructed `Regex` instance. - */ -inline fun regex(builder: RegexBuilder.() -> Unit): Regex { - return RegexBuilder() - .apply(builder) - .stringBuilder - .toString() - .toRegex() -} - -/** Supports the [regex] builder function. */ -class RegexBuilder { - - @PublishedApi - internal val stringBuilder: StringBuilder = StringBuilder() - - /** - * Appends a pattern to the regex builder, injecting the language in the IDE. - * @return The current `RegexBuilderScope` instance - */ - fun append(@Language("regexp") pattern: String): RegexBuilder = apply { - stringBuilder.append(pattern) - } - - /** - * The same as [append], except without the language injection. This is for special cases where - * the IDE incorrectly flags the pattern -- hopefully just because it doesn't have enough context. - * - * Before using this, try restructuring the different components of the - * builder invocation so that the [pattern] argument has enough context. - */ - fun appendWithoutInjection(pattern: String): RegexBuilder = apply { - stringBuilder.append(pattern) - } - - /** - * Appends the OR operator (`|`) to the regex builder. - * - * @return The current `RegexBuilderScope` instance - */ - fun or(): RegexBuilder = apply { - stringBuilder.append("|") - } - - /** - * Groups a segment of a regular expression, with the `groupStart` and - * `groupEnd` parameters marking the start and end of the group respectively. - * - * The [builder] parameter is applied in the middle. - * - * @param groupStart The opening characters of the group. - * @param groupEnd The closing characters of the group. - * @param builder Defines the group content in between the start and end. - * @return The current `RegexBuilderScope` instance - */ - inline fun grouped( - groupStart: String, - groupEnd: String, - builder: RegexBuilder.() -> Unit - ): RegexBuilder = apply { - append(groupStart) - builder() - append(groupEnd) - } - - /** - * This just provides an indent around related parts of the pattern. Defines - * a section of the regular expression string. The `builder` function - * is applied to the `RegexBuilderScope` to define the section content. - * - * @param builder A lambda function with `RegexBuilderScope` - * as its receiver, used to define the section content. - * @return The current `RegexBuilderScope` instance, enabling function chaining. - */ - inline fun section(builder: RegexBuilder.() -> Unit): RegexBuilder = apply(builder) - - /** overload for building a regex inside a regex builder */ - inline fun regex(builder: RegexBuilder.() -> Unit): String { - return RegexBuilder() - .apply(builder) - .stringBuilder - .toString() - } - - /** - * Combines multiple builders into a single builder, separated by the OR operator (|). - * @param builders The builders to combine. - * @return The current `RegexBuilder` instance. - */ - fun anyOf(vararg builders: RegexBuilder.() -> Unit): RegexBuilder { - return applyEachIndexed(builders) { index, builder -> - builder() - if (index != builders.lastIndex) { - appendWithoutInjection("|") - } - } - } -} diff --git a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/string.kt b/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/string.kt deleted file mode 100644 index a319dc94d6..0000000000 --- a/modulecheck-utils/stdlib/src/main/kotlin/modulecheck/utils/string.kt +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -import java.util.Locale -import kotlin.LazyThreadSafetyMode.NONE - -/** - * Appends the specified [prefix] to this [CharSequence] and returns the resulting string. - * - * @param prefix The prefix to be added. - * @receiver The original CharSequence. - * @return The string with the prefix added. - */ -fun CharSequence.prefix(prefix: String): String = "$prefix$this" - -/** - * Adds the specified [prefix] to this [String] if it does not already start with it. - * - * @param prefix The prefix to be added if not present. - * @receiver The original String. - * @return The string with the prefix added if not present. - */ -fun String.prefixIfNot(prefix: String): String = - if (this.startsWith(prefix)) this else "$prefix$this" - -/** - * Adds the specified [suffix] to this [String] if it does not already end with it. - * - * @param suffix The suffix to be added if not present. - * @receiver The original String. - * @return The string with the suffix added if not present. - */ -fun String.suffixIfNot(suffix: String): String = if (this.endsWith(suffix)) this else "$this$suffix" - -/** - * Decapitalizes the first character of this [String] using the specified [locale]. - * - * @param locale The [Locale] to be used for decapitalization. Defaults to [Locale.US]. - * @receiver The original String. - * @return The string with the first character decapitalized. - */ -fun String.decapitalize(locale: Locale = Locale.US): String = - replaceFirstChar { it.lowercase(locale) } - -/** - * Capitalizes the first character of this [String] using the specified [locale]. - * - * @param locale The [Locale] to be used for capitalization. Defaults to [Locale.US]. - * @receiver The original String. - * @return The string with the first character capitalized. - */ -fun String.capitalize(locale: Locale = Locale.US): String = - replaceFirstChar { it.uppercase(locale) } - -/** - * Finds and returns the minimum indentation for this [String], with an optional - * [absoluteMinimum] to be returned if the minimum indent is less than the absolute minimum. - * - * @param absoluteMinimum The absolute minimum indent to - * be returned if the minimum is less. Defaults to " ". - * @receiver The original String. - * @return The minimum indentation of the string, or the absolute minimum if the minimum is less. - */ -fun String.findMinimumIndent(absoluteMinimum: String = " "): String { - - if (contains("\t")) return "\t" - - val parsedMinimumOrNull = lines() - .filter { it.isNotBlank() } - .map { it.indentWidth() } - .filter { it > 0 } - .minOrNull() - ?.let { " ".repeat(it) } - - return parsedMinimumOrNull - ?.takeIf { it.length >= absoluteMinimum.length } - ?: absoluteMinimum -} - -/** - * Calculates and returns the width of the indentation for this [String]. - * - * @receiver The original String. - * @return The width of the indentation for this string. - */ -private fun String.indentWidth(): Int = - indexOfFirst { !it.isWhitespace() }.let { if (it == -1) length else it } - -/** - * A naive auto-indent which just counts brackets. - * - * @since 0.12.0 - */ -fun String.indentByBrackets(tab: String = " "): String { - - var tabCount = 0 - - val open = setOf('{', '(', '[', '<') - val close = setOf('}', ')', ']', '>') - - return lines() - .map { it.trim() } - .joinToString("\n") { line -> - - if (line.firstOrNull() in close) { - tabCount-- - } - - "${tab.repeat(tabCount)}$line" - .also { - - // Arrows aren't brackets - val noSpecials = line.remove("<=", "->") - - tabCount += noSpecials.count { char -> char in open } - // Skip the first char because if it's a closing bracket, it was already counted above. - tabCount -= noSpecials.drop(1).count { char -> char in close } - } - } -} - -/** - * Removes all occurrences of specified strings from the receiver string. - * - * @param strings Strings to be removed from the receiver string. - * @return A new string with all occurrences of specified strings removed. - */ -fun String.remove(vararg strings: String): String = strings.fold(this) { acc, string -> - acc.replace(string, "") -} - -/** - * Removes all matches of specified regular expressions from the receiver string. - * - * @param patterns Regular expressions to be removed from the receiver string. - * @return A new string with all matches of specified regular expressions removed. - */ -fun String.remove(vararg patterns: Regex): String = patterns.fold(this) { acc, regex -> - acc.replace(regex, "") -} - -/** - * @return a string with no leading or trailing whitespace, and - * no whitespace before or after any instance of [delimiter] - * @since 0.12.0 - */ -fun String.trimSegments(delimiter: String = "."): String { - - val regex = regex { - val escaped = Regex.escapeReplacement(delimiter) - append("""^\s+""") - or() - append("""\s+($escaped)\s+""") - or() - append("""\s+($escaped)""") - or() - append("""($escaped)\s+""") - or() - append("""\s+$""") - } - return replace(regex) { it.groupValues.getOrElse(1) { "" } } -} - -/** shorthand for `splitAndMap(*delimiters) { it.trim() }` */ -fun String.splitAndTrim(vararg delimiters: String): List { - return splitAndMap(*delimiters) { it.trim() } -} - -/** shorthand for `splitAndMap(*delimiters) { it.trim() }` */ -fun String.splitAndTrim(vararg delimiters: Char): List { - return splitAndMap(*delimiters) { it.trim() } -} - -/** shorthand for `split(*delimiters).map { /* ... */ }` */ -inline fun String.splitAndMap(vararg delimiters: String, transform: (String) -> T): List { - return split(*delimiters).map(transform) -} - -/** shorthand for `split(*delimiters).map { /* ... */ }` */ -inline fun String.splitAndMap(vararg delimiters: Char, transform: (String) -> T): List { - return split(*delimiters).map(transform) -} - -/** - * performs [transform] on each line - * - * Doesn't preserve the original line endings. - */ -fun CharSequence.mapLines(transform: (String) -> CharSequence): String = lineSequence() - .joinToString("\n", transform = transform) - -/** - * performs [transform] on each line - * - * Doesn't preserve the original line endings. - */ -fun CharSequence.mapLinesIndexed(transform: (Int, String) -> CharSequence): String = lineSequence() - .mapIndexed(transform) - .joinToString("\n") - -/** - * Creates a string from all the elements separated using [separator] - * and using the given [prefix] and [postfix] if supplied. - * - * If the collection could be huge, you can specify a non-negative value - * of [limit], in which case only the first [limit] elements will be - * appended, followed by the [truncated] string (which defaults to "..."). - * - * The operation is _terminal_. - */ -fun Sequence.joinToStringIndexed( - separator: CharSequence = ", ", - prefix: CharSequence = "", - postfix: CharSequence = "", - limit: Int = -1, - truncated: CharSequence = "...", - transform: (Int, T) -> CharSequence -): String { - return buildString { - append(prefix) - var count = 0 - for (element in this@joinToStringIndexed) { - if (++count > 1) append(separator) - if (limit < 0 || count <= limit) { - append(transform(count - 1, element)) - } else { - break - } - } - if (limit in 0 until count) append(truncated) - append(postfix) - } -} - -/** - * example: - * - * ``` - * override fun toString() = buildString { - * appendLine("SomeClass(") - * indent { - * appendLine("prop1=$prop1") - * appendLine("prop2=$prop2") - * } - * appendLine(")") - * } - * ``` - */ -inline fun StringBuilder.indent( - leadingIndent: String = " ", - continuationIndent: String = leadingIndent, - builder: StringBuilder.() -> Unit -) { - - append( - buildString { - append(leadingIndent) - - builder() - } - .prependContinuationIndent(continuationIndent) - ) -} - -/** - * Prepends [continuationIndent] to every line of the original string. - * - * Doesn't preserve the original line endings. - */ -fun CharSequence.prependContinuationIndent( - continuationIndent: String, - skipBlankLines: Boolean = true -): String = mapLinesIndexed { i, line -> - when { - i == 0 -> line - skipBlankLines && line.isBlank() -> line - else -> "$continuationIndent$line" - } -} - -/** `"$prefix$this$suffix"` */ -fun CharSequence.wrapIn(prefix: String, suffix: String = prefix): String = "$prefix$this$suffix" - -/** Replaces the deprecated Kotlin version, but hard-codes `Locale.US` */ -fun String.capitalize(): String = replaceFirstChar { - if (it.isLowerCase()) it.titlecase(Locale.US) else it.toString() -} - -/** shorthand for `joinToString("") { ... }` */ -fun Sequence.joinToStringConcat(transform: ((E) -> CharSequence)? = null): String = - joinToString("", transform = transform) - -/** shorthand for `joinToString("") { ... }` */ -fun Iterable.joinToStringConcat(transform: ((E) -> CharSequence)? = null): String = - joinToString("", transform = transform) - -/** Converts all line separators in the receiver string to use `\n`. */ -fun String.normaliseLineSeparators(): String = replace("\r\n|\r".toRegex(), "\n") - -/** - * Adds line breaks and indents to the output of data class `toString()`s. - * - * @see toStringPretty - */ -fun String.prettyToString(): String { - return replace(",", ",\n") - .replace("(", "(\n") - .replace(")", "\n)") - .replace("[", "[\n") - .replace("]", "\n]") - .replace("{", "{\n") - .replace("}", "\n}") - .replace("\\(\\s*\\)".toRegex(), "()") - .replace("\\[\\s*]".toRegex(), "[]") - .indentByBrackets() - .replace("""\n *\n""".toRegex(), "\n") -} - -/** - * shorthand for `toString().prettyToString()`, which adds line breaks and indents to a string - * - * @see prettyToString - */ -fun Any?.toStringPretty(): String = when (this) { - is Map<*, *> -> toList().joinToString("\n") - else -> toString().prettyToString() -} - -/** - * Removes the indentation from every line in this string after the first line, - * and also removes any blank lines appearing before the first non-blank line. - * - * This method assumes the original string has multiple lines. The first line is - * left intact, but all subsequent lines have their leading white space removed. - * - * Example usage: - * - * ``` - * val text = """ - * Keep leading - * Remove indent - * Remove indent - * """ - * val result = text.trimIndentAfterFirstLine() - * // Result is: - * // """ - * // Keep leading - * // Remove indent - * // Remove indent - * // """ - * ``` - * - * @receiver The string from which to remove indentation after the first line. - * @return A new string with the same first line, but - * with indentation removed from subsequent lines. - */ -fun String.trimIndentAfterFirstLine(): String { - val split = lines() - val first = split.first() - val remaining = split.drop(1).joinToString("\n").trimIndent() - return "$first\n$remaining" -} - -/** Removes */ -fun String.noAnsi(): String = """\u001B\[[;\d]*m""".toRegex().replace(this, "") - -/** replace ` ` with `·` */ -val String.dots: String get() = replace(" ", "·") - -/** replace ` ` with `·` */ -val String.interpuncts: String get() = replace(" ", "·") - -/** replace `·` with ` ` */ -val String.noDots: String get() = replace("·", " ") - -/** replace `·` with ` ` */ -val String.noInterpuncts: String get() = replace("·", " ") - -/** - * Adjusts the indentation of each line in the string to match the indentation - * of the first non-blank line. The first non-blank line determines the - * target indentation level, and subsequent lines are adjusted accordingly. - * - * @return The string with adjusted indentation. - */ -fun String.justifyToFirstLine(): String { - val targetIndent = lineSequence() - .firstOrNull { it.isNotBlank() } - ?.indentWidth() - ?: 0 - - val indent by lazy(NONE) { " ".repeat(targetIndent) } - - return mapLines { line -> - - if (line.indentWidth() < targetIndent) { - "$indent$line" - } else { - line - } - } - .trimIndent() -} diff --git a/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/CaseMatcherTest.kt b/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/CaseMatcherTest.kt deleted file mode 100644 index 3d6b9ad1c5..0000000000 --- a/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/CaseMatcherTest.kt +++ /dev/null @@ -1,606 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -import io.kotest.matchers.shouldBe -import modulecheck.utils.CaseMatcher.CamelSnakeCaseMatcher -import modulecheck.utils.CaseMatcher.KebabCaseMatcher -import modulecheck.utils.CaseMatcher.LowerCamelCaseMatcher -import modulecheck.utils.CaseMatcher.LowerFlatCaseMatcher -import modulecheck.utils.CaseMatcher.ScreamingKebabCaseMatcher -import modulecheck.utils.CaseMatcher.ScreamingSnakeCaseMatcher -import modulecheck.utils.CaseMatcher.SnakeCaseMatcher -import modulecheck.utils.CaseMatcher.TrainCaseMatcher -import modulecheck.utils.CaseMatcher.UpperCamelCaseMatcher -import modulecheck.utils.CaseMatcher.UpperFlatCaseMatcher -import org.junit.jupiter.api.DynamicTest -import org.junit.jupiter.api.TestFactory - -internal class CaseMatcherTest { - - @TestFactory - fun `lower flat case matches`() = listOf( - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should match") { - - LowerFlatCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `lower flat case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc" - ).dynamic("should not match") { - - LowerFlatCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `upper flat case matches`() = listOf( - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC" - ).dynamic("should match") { - - UpperFlatCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `upper flat case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should not match") { - - UpperFlatCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `lower camel case matches`() = listOf( - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should match") { - - LowerCamelCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `lower camel case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc" - ).dynamic("should not match") { - - LowerCamelCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `upper camel case matches`() = listOf( - "TwoABCWords" - ).dynamic("should match") { - - UpperCamelCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `upper camel case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should not match") { - - UpperCamelCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `snake case matches`() = listOf( - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should match") { - - SnakeCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `snake case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC" - ).dynamic("should not match") { - - SnakeCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `screaming snake case matches`() = listOf( - "ONE_WORD_123", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDS_ABC" - ).dynamic("should match") { - - ScreamingSnakeCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `screaming snake case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should not match") { - - ScreamingSnakeCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `camel snake case matches`() = listOf( - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC" - ).dynamic("should match") { - - CamelSnakeCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `camel snake case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should not match") { - - CamelSnakeCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `kebab case matches`() = listOf( - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should match") { - - KebabCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `kebab case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc" - ).dynamic("should not match") { - - KebabCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `screaming kebab case matches`() = listOf( - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC" - - ).dynamic("should match") { - - ScreamingKebabCaseMatcher().matches(it) shouldBe true - } - - @TestFactory - fun `screaming kebab case non-matches`() = listOf( - - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "Two-ABC-Words", - "Two-Words", - "Two-Words-ABC", - "Two-Words456", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should not match") { - - ScreamingKebabCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `train case matches`() = listOf( - "ONE_WORD_", - "ONE_WORD_123" - ).dynamic("should match") { - - TrainCaseMatcher().matches(it) shouldBe false - } - - @TestFactory - fun `train case non-matches`() = listOf( - " ", - "", - "ONE_WORD_", - "ONE_WORD_123", - "TWO-ABC-WORDS", - "TWO-WORDS", - "TWO-WORDS-ABC", - "TWO-WORDS456", - "TWOABCWORDS", - "TWOWORDS", - "TWOWORDS456", - "TWOWORDSABC", - "TWO_ABC_WORDS", - "TWO_WORDS", - "TWO_WORDS456", - "TWO_WORDSABC", - "TWO_WORDS_ABC", - "TwoABCWords", - "Two_ABC_Words", - "Two_Words", - "Two_Words456", - "Two_Words_ABC", - "two-abc-words", - "two-words", - "two-words-abc", - "two-words456", - "twoABCWords", - "twoWords", - "twoWords456", - "twoWordsABC", - "two_abc_words", - "two_words", - "two_words456", - "two_words_abc", - "twoabcwords", - "twowords", - "twowords456", - "twowordsabc" - ).dynamic("should not match") { - - TrainCaseMatcher().matches(it) shouldBe false - } - - fun List.dynamic(extraName: String = "", test: (String) -> Unit): List { - return map { subject -> - - val displayName = if (extraName.isNotBlank()) { - "'$subject' -- $extraName" - } else { - subject - } - - DynamicTest.dynamicTest(displayName) { - test.invoke(subject) - } - } - } -} diff --git a/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/IterableFilterAsyncTest.kt b/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/IterableFilterAsyncTest.kt deleted file mode 100644 index 87396de686..0000000000 --- a/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/IterableFilterAsyncTest.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -import app.cash.turbine.test -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.yield -import modulecheck.utils.coroutines.filterAsync -import org.junit.jupiter.api.Test - -internal class IterableFilterAsyncTest { - - @Test - fun `should only emit elements which match the predicate`() = runTest { - - listOf(1, 2, 3, 4) - .filterAsync { it % 2 == 0 } - .toList() shouldBe listOf(2, 4) - } - - @Test - fun `should emit async elements as soon as they're complete`() = runTest { - - val one = CompletableDeferred() - val two = CompletableDeferred() - val three = CompletableDeferred() - - val throughFilter = mutableListOf() - - setOf(one, two, three) - .filterAsync { - - val done = it.await() - throughFilter.add(done) - done == 2 - } - .test { - expectNoEvents() - - // should trigger predicate and be filtered out - one.complete(1) - yield() - yield() - throughFilter shouldBe listOf(1) - expectNoEvents() - - // should trigger predicate and pass through - two.complete(2) - awaitItem() shouldBe two - throughFilter shouldBe listOf(1, 2) - expectNoEvents() - - // should trigger predicate and be filtered out - three.complete(3) - yield() - throughFilter shouldBe listOf(1, 2, 3) - - // filtered flow ends as soon as the source flow has no more elements - awaitComplete() - } - } -} diff --git a/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/SequenceFilterAsyncTest.kt b/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/SequenceFilterAsyncTest.kt deleted file mode 100644 index 78ad40e7e7..0000000000 --- a/modulecheck-utils/stdlib/src/test/kotlin/modulecheck/utils/SequenceFilterAsyncTest.kt +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils - -import app.cash.turbine.test -import io.kotest.matchers.shouldBe -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.flow.toList -import kotlinx.coroutines.test.runTest -import kotlinx.coroutines.yield -import modulecheck.utils.coroutines.filterAsync -import org.junit.jupiter.api.Test - -internal class SequenceFilterAsyncTest { - - @Test - fun `should only emit elements which match the predicate`() = runTest { - - sequenceOf(1, 2, 3, 4) - .filterAsync { it % 2 == 0 } - .toList() shouldBe listOf(2, 4) - } - - @Test - fun `should emit async elements as soon as they're complete`() = runTest { - - val one = CompletableDeferred() - val two = CompletableDeferred() - val three = CompletableDeferred() - - val throughFilter = mutableListOf() - - sequenceOf(one, two, three) - .filterAsync { - - val done = it.await() - throughFilter.add(done) - done == 2 - } - .test { - expectNoEvents() - - // should trigger predicate and be filtered out - one.complete(1) - yield() - yield() - throughFilter shouldBe listOf(1) - expectNoEvents() - - // should trigger predicate and pass through - two.complete(2) - awaitItem() shouldBe two - throughFilter shouldBe listOf(1, 2) - expectNoEvents() - - // should trigger predicate and be filtered out - three.complete(3) - yield() - throughFilter shouldBe listOf(1, 2, 3) - - // filtered flow ends as soon as the source flow has no more elements - awaitComplete() - } - } -} diff --git a/modulecheck-utils/trace-testing/api/trace-testing.api b/modulecheck-utils/trace-testing/api/trace-testing.api deleted file mode 100644 index 1582cb2068..0000000000 --- a/modulecheck-utils/trace-testing/api/trace-testing.api +++ /dev/null @@ -1,4 +0,0 @@ -public final class modulecheck/utils/trace/test/RunTestTracedKt { - public static final fun runTestTraced (Lkotlin/jvm/functions/Function2;)V -} - diff --git a/modulecheck-utils/trace-testing/build.gradle.kts b/modulecheck-utils/trace-testing/build.gradle.kts deleted file mode 100644 index 9e9708af17..0000000000 --- a/modulecheck-utils/trace-testing/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-trace-testing" - ) -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - api(libs.rickBusarow.dispatch.core) - - implementation(project(path = ":modulecheck-utils:trace")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.square.turbine) -} diff --git a/modulecheck-utils/trace-testing/src/main/kotlin/modulecheck/utils/trace/test/runTestTraced.kt b/modulecheck-utils/trace-testing/src/main/kotlin/modulecheck/utils/trace/test/runTestTraced.kt deleted file mode 100644 index cfb8ed4c18..0000000000 --- a/modulecheck-utils/trace-testing/src/main/kotlin/modulecheck/utils/trace/test/runTestTraced.kt +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.trace.test - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.runBlocking -import modulecheck.utils.trace.Trace - -fun runTestTraced(action: suspend CoroutineScope.() -> Unit) { - runBlocking(Trace.start("test-start"), action) -} - -@Suppress("UnusedReceiverParameter") -inline fun T.runTestTraced(noinline action: suspend CoroutineScope.() -> Unit) { - runBlocking(Trace.start(T::class), action) -} diff --git a/modulecheck-utils/trace/api/trace.api b/modulecheck-utils/trace/api/trace.api deleted file mode 100644 index 9e3caba938..0000000000 --- a/modulecheck-utils/trace/api/trace.api +++ /dev/null @@ -1,30 +0,0 @@ -public abstract interface class modulecheck/utils/trace/HasTraceTags { - public abstract fun getTags ()Ljava/lang/Iterable; -} - -public abstract class modulecheck/utils/trace/Trace : kotlin/coroutines/CoroutineContext$Element { - public static final field Key Lmodulecheck/utils/trace/Trace$Key; - public synthetic fun (Ljava/util/List;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public abstract fun asString ()Ljava/lang/String; - public fun fold (Ljava/lang/Object;Lkotlin/jvm/functions/Function2;)Ljava/lang/Object; - public fun get (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext$Element; - public abstract fun getDepth ()I - public fun getKey ()Lkotlin/coroutines/CoroutineContext$Key; - public final fun getTags ()Ljava/util/List; - public fun minusKey (Lkotlin/coroutines/CoroutineContext$Key;)Lkotlin/coroutines/CoroutineContext; - public fun plus (Lkotlin/coroutines/CoroutineContext;)Lkotlin/coroutines/CoroutineContext; -} - -public final class modulecheck/utils/trace/Trace$Key : kotlin/coroutines/CoroutineContext$Key { - public final fun start ([Ljava/lang/Object;)Lmodulecheck/utils/trace/Trace; -} - -public final class modulecheck/utils/trace/TraceKt { - public static final fun requireTrace (Lkotlin/coroutines/CoroutineContext;)Lmodulecheck/utils/trace/Trace; - public static final fun trace (Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun traced (Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun traced (Lmodulecheck/utils/trace/HasTraceTags;Ljava/lang/Iterable;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun traced (Lmodulecheck/utils/trace/HasTraceTags;Ljava/lang/Iterable;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; - public static final fun traced (Lmodulecheck/utils/trace/HasTraceTags;[Ljava/lang/Object;Lkotlin/jvm/functions/Function2;Lkotlin/coroutines/Continuation;)Ljava/lang/Object; -} - diff --git a/modulecheck-utils/trace/build.gradle.kts b/modulecheck-utils/trace/build.gradle.kts deleted file mode 100644 index 7dd9d19255..0000000000 --- a/modulecheck-utils/trace/build.gradle.kts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-trace" - ) -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jvm) - api(libs.rickBusarow.dispatch.core) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.square.turbine) -} diff --git a/modulecheck-utils/trace/src/main/kotlin/modulecheck/utils/trace/Trace.kt b/modulecheck-utils/trace/src/main/kotlin/modulecheck/utils/trace/Trace.kt deleted file mode 100644 index fa69a10e3b..0000000000 --- a/modulecheck-utils/trace/src/main/kotlin/modulecheck/utils/trace/Trace.kt +++ /dev/null @@ -1,286 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.trace - -import kotlinx.coroutines.CoroutineScope -import kotlinx.coroutines.coroutineScope -import kotlinx.coroutines.currentCoroutineContext -import kotlinx.coroutines.withContext -import kotlin.DeprecationLevel.ERROR -import kotlin.contracts.InvocationKind.EXACTLY_ONCE -import kotlin.contracts.contract -import kotlin.coroutines.CoroutineContext -import kotlin.coroutines.coroutineContext -import kotlin.reflect.KClass - -/** - * Models a curated call stack from some root, up to this Trace - * node. In practice, the root will be `ModuleCheckRunner.run`. - * - * This class this leverages [CoroutineContext.Element] in order to avoid passing - * a 'TraceContext' around. Trace nodes are stored in the [CoroutineContext]. - * This means that traces can only be started or added to from within a coroutine. - * - * The simplest way to add to a trace is to make the class implement [HasTraceTags] - * to provide static tags, then use one of the [traced] extensions at the trace site. - * - * ``` - * class SomeClass : HasTraceTags { - * override val traceTags = listOf(SomeClass::class) - * - * suspend fun doSomethingImportant(someArgument: String) { - * traced(someArgument) { /* anything happening here is wrapped in the new Trace */ } - * } - * } - * ``` - * - * @since 0.12.0 - */ -sealed class Trace( - val tags: List -) : CoroutineContext.Element { - init { - check(tags.isNotEmpty()) { - "You must provide at least one tag when creating a ${Trace::class.simpleName}." - } - } - - override val key: CoroutineContext.Key<*> get() = Key - - abstract val depth: Int - - /** - * ``` - * - * tags: [Weather Underground] - * └─ tags: [Kitchen] -- args: [spaghetti] - * └─ tags: [Computer] -- args: [Website(name=reddit.com)] - * └─ tags: [Garage] -- args: [bike] - * └─ tags: [Oak Leaf Trail] -- args: [] - * └─ tags: [home] -- args: [shower] - * ``` - * - * @since 0.12.0 - */ - abstract fun asString(): String - - internal fun child(tags: Iterable, args: Iterable): Trace = Child( - parent = this, - depth = depth + 1, - tags = tags.traceStrings(), - args = args.traceStrings() - ) - - internal fun child(vararg tags: Any, args: Iterable): Trace = Child( - parent = this, - depth = depth + 1, - tags = tags.traceStrings(), - args = args.traceStrings() - ) - - private class Root(tags: List) : Trace(tags) { - override val depth = 0 - override fun asString(): String = buildString { - appendLine("") - append("tags: $tags") - } - } - - private class Child( - val parent: Trace, - override val depth: Int, - tags: List, - val args: List - ) : Trace(tags) { - - override fun asString(): String = StringBuilder(parent.asString()) - .apply { - val indent = " ".repeat(depth - 1) - - append("\n$indent└─ tags: $tags -- args: $args") - } - .toString() - } - - companion object Key : CoroutineContext.Key { - /** - * Creates a new [Trace] root. Prefer adding to an existing trace via a [traced] extension. - * - * @since 0.12.0 - */ - fun start(vararg tags: Any): Trace = Root(tags.traceStrings()) - - private fun Array.traceStrings(): List = map { it.traceString() } - private fun Iterable.traceStrings(): List = map { it.traceString() } - private fun Any.traceString() = when (this) { - is String -> this - is KClass<*> -> simpleName ?: "--" - is Class<*> -> simpleName ?: "--" - else -> toString() - } - } -} - -/** - * Convenience interface for providing static tags to a - * [Trace], then consuming them via a [traced] extension. - * - * ``` - * class MyCache(override val tags: List) : HasTraceTags { - * - * suspend fun doSomethingImportant(someArgument: String) { - * traced(someArgument) { /* anything happening here is wrapped in the new Trace */ } - * } - * } - * - * val cache = MyCache(listOf(MyCache::class, project)) - * ``` - * - * @since 0.12.0 - */ -interface HasTraceTags { - val tags: Iterable -} - -/** - * Creates a [Trace] child node from outside a [HasTraceTags] implementation. - * - * The difference between the two parameters is that tags essentially describe the - * receiver of the trace (the class, any identifying immutable instance properties - * like project path, etc.), and the arguments are just like function arguments. - * - * @param tags the [Trace.tags] added to this trace child - * @param args the dynamic runtime [Trace.Child.args] arguments added to this trace - * @param block performed with the updated trace - * @since 0.12.0 - * @throws IllegalArgumentException if the [coroutineContext] does not have a [Trace] - */ -suspend fun traced( - tags: Iterable, - args: Iterable, - block: suspend CoroutineScope.() -> T -): T = tracedInternal(tags, args, block) - -/** - * Don't use. This overload exists in order to prevent accidentally providing the - * wrong tags to a [Trace] from inside a [HasTraceTags]. If you need to provide runtime - * - * @since 0.12.0 - */ -@Deprecated( - message = "Don't provide dynamic tags from inside HasTraceTags.", - level = ERROR, - replaceWith = ReplaceWith("traced(args, block)") -) -suspend fun HasTraceTags.traced( - @Suppress("UNUSED_PARAMETER") - tags: Iterable, - args: Iterable, - block: suspend CoroutineScope.() -> T -): T = traced(args, block) - -/** - * Creates a [Trace] child node from inside a [HasTraceTags] implementation. - * - * If you're sure you need to provide [Trace.tags] arguments as well, - * then remove the [HasTraceTags] implementation from the receiver. - * - * @param args the dynamic runtime [Trace.Child.args] arguments added to this trace - * @param block performed with the updated trace - * @since 0.12.0 - * @throws IllegalArgumentException if the [coroutineContext] does not have a [Trace] - */ -suspend fun HasTraceTags.traced(args: Iterable, block: suspend CoroutineScope.() -> T): T = - tracedInternal(tags, args, block) - -/** - * Creates a [Trace] child node from inside a [HasTraceTags] implementation. - * - * If you're sure you need to provide [Trace.tags] arguments as well, - * then remove the [HasTraceTags] implementation from the receiver. - * - * @param args the dynamic runtime [Trace.Child.args] arguments added to this trace - * @param block performed with the updated trace - * @since 0.12.0 - * @throws IllegalArgumentException if the [coroutineContext] does not have a [Trace] - */ -suspend fun HasTraceTags.traced(vararg args: Any, block: suspend CoroutineScope.() -> T): T = - tracedInternal(tags, args.toList(), block) - -private suspend fun tracedInternal( - tags: Iterable, - args: Iterable, - block: suspend CoroutineScope.() -> T -): T { - contract { - callsInPlace(block, EXACTLY_ONCE) - } - - val oldTrace = traceOrNull() - // If the Trace doesn't already exist in the context, it must be disabled. - // In that case, just make this a no-op - ?: return coroutineScope { block() } - - val newTrace = oldTrace.child(tags, args) - return withContext(newTrace, block) -} - -/** - * Unsafe-ish extension for extracting a [Trace] from inside a coroutine. - * - * @see requireTrace - * @since 0.12.0 - * @throws IllegalArgumentException if the [coroutineContext] does not have a [Trace] - */ -suspend fun trace(): Trace = currentCoroutineContext().requireTrace() - -/** - * @return a [Trace] from inside a coroutine if it exists, else null - * @since 0.12.0 - */ -internal suspend fun traceOrNull(): Trace? = currentCoroutineContext()[Trace] - -/** - * Unsafe-ish extension for extracting a [Trace] from inside a coroutine. - * - * This will throw if attempting to do any sort of tracing from inside a no-context - * [runBlocking][kotlinx.coroutines.runBlocking] call. If it's necessary to use - * `runBlocking`, the parent trace must be passed in as a `coroutineContext] argument. - * - * ``` - * suspend function doSomething() { - * // extract the trace from the existing context. - * val trace = coroutineContext.requireTrace() - * - * // Sequence.forEach { ... } is an example of a lambda which doesn't suspend - * // or provide a CoroutineScope - * getSomeSequence().forEach { - * // now if we want to do suspending work, we need runBlocking - * // manually pass in the trace from the parent coroutine - * runBlocking(trace) { - * // now the trace continues - * } - * } - * } - * ``` - * - * @see trace - * @since 0.12.0 - * @throws IllegalArgumentException if the [coroutineContext] does not have a [Trace] - */ -fun CoroutineContext.requireTrace(): Trace = requireNotNull(get(Trace)) { - "This coroutineContext doesn't have a ${Trace::class.simpleName} in it -- $this" -} diff --git a/modulecheck-utils/trace/src/test/kotlin/modulecheck/utils/trace/TraceTest.kt b/modulecheck-utils/trace/src/test/kotlin/modulecheck/utils/trace/TraceTest.kt deleted file mode 100644 index 03de2f566b..0000000000 --- a/modulecheck-utils/trace/src/test/kotlin/modulecheck/utils/trace/TraceTest.kt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.trace - -import io.kotest.matchers.shouldBe -import org.junit.jupiter.api.Test - -class TraceTest { - - @Test - fun `asString formatting`() { - - val trace = Trace.start("Weather Underground") - .child(tags = listOf(Kitchen::class), args = listOf("spaghetti")) - .child(tags = listOf(Computer::class), args = listOf(Website("reddit.com"))) - .child(tags = listOf(Garage::class), args = listOf("bike")) - .child(tags = listOf("Oak Leaf Trail"), args = emptyList()) - .child(tags = listOf("home"), args = listOf("shower")) - - trace.asString() shouldBe """ - - tags: [Weather Underground] - └─ tags: [Kitchen] -- args: [spaghetti] - └─ tags: [Computer] -- args: [Website(name=reddit.com)] - └─ tags: [Garage] -- args: [bike] - └─ tags: [Oak Leaf Trail] -- args: [] - └─ tags: [home] -- args: [shower] - """.trimIndent() - } - - data class Website(val name: String) - object Computer - object Kitchen - object Garage -} diff --git a/modulecheck-utils/traversal/api/traversal.api b/modulecheck-utils/traversal/api/traversal.api deleted file mode 100644 index a8bcb062ca..0000000000 --- a/modulecheck-utils/traversal/api/traversal.api +++ /dev/null @@ -1,19 +0,0 @@ -public abstract class modulecheck/utils/traversal/AbstractTreePrinter { - public fun ()V - public fun (C)V - public synthetic fun (CILkotlin/jvm/internal/DefaultConstructorMarker;)V - public abstract fun children (Ljava/lang/Object;)Lkotlin/sequences/Sequence; - public abstract fun parent (Ljava/lang/Object;)Ljava/lang/Object; - public final fun printTreeString (Ljava/lang/Object;)V - public abstract fun simpleClassName (Ljava/lang/Object;)Ljava/lang/String; - public abstract fun text (Ljava/lang/Object;)Ljava/lang/String; - public final fun treeString (Ljava/lang/Object;)Ljava/lang/String; - public abstract fun typeName (Ljava/lang/Object;)Ljava/lang/String; -} - -public final class modulecheck/utils/traversal/Traversals { - public static final field INSTANCE Lmodulecheck/utils/traversal/Traversals; - public final fun breadthFirstTraversal (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; - public final fun depthFirstTraversal (Ljava/lang/Object;Lkotlin/jvm/functions/Function1;)Lkotlin/sequences/Sequence; -} - diff --git a/modulecheck-utils/traversal/build.gradle.kts b/modulecheck-utils/traversal/build.gradle.kts deleted file mode 100644 index eac9eb8575..0000000000 --- a/modulecheck-utils/traversal/build.gradle.kts +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -plugins { - id("mcbuild") -} - -mcbuild { - published( - artifactId = "modulecheck-utils-traversal" - ) -} - -dependencies { - - api(libs.kotlinx.coroutines.core) - api(libs.kotlinx.coroutines.jdk8) - api(libs.kotlinx.coroutines.jvm) - - implementation(project(":modulecheck-utils:stdlib")) - - testImplementation(libs.bundles.junit) - testImplementation(libs.bundles.kotest) - testImplementation(libs.square.turbine) -} diff --git a/modulecheck-utils/traversal/src/main/kotlin/modulecheck/utils/traversal/AbstractTreePrinter.kt b/modulecheck-utils/traversal/src/main/kotlin/modulecheck/utils/traversal/AbstractTreePrinter.kt deleted file mode 100644 index fdfefd3429..0000000000 --- a/modulecheck-utils/traversal/src/main/kotlin/modulecheck/utils/traversal/AbstractTreePrinter.kt +++ /dev/null @@ -1,219 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.traversal - -import modulecheck.utils.mapLines -import modulecheck.utils.noAnsi -import modulecheck.utils.traversal.AbstractTreePrinter.Color.Companion.colorized -import modulecheck.utils.traversal.AbstractTreePrinter.NameType.SIMPLE -import modulecheck.utils.traversal.AbstractTreePrinter.NameType.TYPE - -/** - * Base class for printing a tree structure of objects of type [T]. - * - * @param whitespaceChar the character to use for replacing - * whitespaces in the node text when printing. Default is ' '. - */ -abstract class AbstractTreePrinter( - private val whitespaceChar: Char = ' ' -) { - private val elementSimpleNameMap = mutableMapOf() - private val elementTypeNameMap = mutableMapOf() - - private var currentColorIndex = 0 - - /** Returns the simple class name of an object of type [T]. */ - abstract fun T.simpleClassName(): String - - /** Returns the parent of an object of type [T]. */ - abstract fun T.parent(): T? - - /** Returns the type name of an object of type [T]. */ - abstract fun T.typeName(): String - - /** Returns the text representation of an object of type [T]. */ - abstract fun T.text(): String - - /** Returns the children of an object of type [T] as a [Sequence]. */ - abstract fun T.children(): Sequence - - /** - * Prints the tree structure of an object of type [T] to the console. - * - * @param [rootNode] the root node of the tree. - */ - fun printTreeString(rootNode: T) { - println(treeString(rootNode)) - } - - /** - * Returns the tree structure of an object of type [T] as a string. - * - * @param [rootNode] the root node of the tree. - * @return the tree structure as a string. - */ - fun treeString(rootNode: T): String { - return buildTreeString(rootNode, 0) - } - - private fun buildTreeString(rootNode: T, indentLevel: Int): String { - val indent = "╎ ".repeat(indentLevel) - - val thisName = rootNode.uniqueSimpleName() - - fun String.colorized(): String { - return this - // return colorized(getCurrentColor()) - } - - val parentName = rootNode.parent()?.uniqueSimpleName() ?: "null" - val parentType = rootNode.parent()?.typeName() ?: "null" - - val childrenText = rootNode.children() - .joinToString("\n") { child -> - buildTreeString(child, indentLevel + 1) - } - - val typeName = rootNode.typeName() - - @Suppress("MagicNumber") - return buildString { - - val header = - "$thisName [type: $typeName] [parent: $parentName] [parent type: $parentType]" - - val text = rootNode.text().replace(" ", "$whitespaceChar") - - val headerLength = header.countVisibleChars() - - val len = maxOf(headerLength + 4, text.lines().maxOf { it.countVisibleChars() }) - - val headerBoxStart = "┏━".colorized() - - val headerBoxEnd = ("━".repeat(len - 3 - headerLength) + "┓").colorized() - - append("$indent$headerBoxStart $header $headerBoxEnd") - - append('\n') - append(indent) - append("┣${"━".repeat(len)}┫".colorized()) - append('\n') - - val paddedText = text.mapLines { line -> - - val pipe = "┃".colorized() - - "$indent$pipe${line.padEnd(len)}$pipe" - } - - append(paddedText) - - append('\n') - append(indent) - append("┗${"━".repeat(len)}┛".colorized()) - - if (childrenText.isNotEmpty()) { - append("\n") - append(childrenText) - } - } - } - - private fun T.uniqueSimpleName(): String = uniqueName(SIMPLE) - - private fun T.uniqueName(nameType: NameType): String { - val map = when (nameType) { - SIMPLE -> elementSimpleNameMap - TYPE -> elementTypeNameMap - } - - return map.getOrPut(this@uniqueName) { - val count = map.keys.count { key -> - if (nameType == SIMPLE) { - key.simpleClassName() == simpleClassName() - } else { - key.typeName() == typeName() - } - } - - val name = if (nameType == SIMPLE) simpleClassName() else typeName() - - val unique = if (count == 0) { - name - } else { - "$name (${count + 1})" - } - - unique.colorized(getNextColor()) - } - } - - private fun getCurrentColor(): Color = Color.values()[currentColorIndex] - - private fun getNextColor(): Color { - currentColorIndex = (currentColorIndex + 1) % Color.values().size - return getCurrentColor() - } - - private fun String.countVisibleChars(): Int = noAnsi().length - - private enum class NameType { - SIMPLE, - TYPE - } - - @Suppress("MagicNumber") - internal enum class Color(val code: Int) { - LIGHT_RED(91), - LIGHT_YELLOW(93), - LIGHT_BLUE(94), - LIGHT_GREEN(92), - LIGHT_MAGENTA(95), - RED(31), - YELLOW(33), - BLUE(34), - GREEN(32), - MAGENTA(35), - CYAN(36), - LIGHT_CYAN(96), - ORANGE_DARK(38), - ORANGE_BRIGHT(48), - PURPLE_DARK(53), - PURPLE_BRIGHT(93), - PINK_BRIGHT(198), - BROWN_DARK(94), - BROWN_BRIGHT(178), - LIGHT_GRAY(37), - DARK_GRAY(90), - BLACK(30), - WHITE(97); - - companion object { - - private val supported = "win" !in System.getProperty("os.name").lowercase() - - /** returns a string in the given color */ - fun String.colorized(color: Color): String { - - return if (supported) { - "\u001B[${color.code}m$this\u001B[0m" - } else { - this - } - } - } - } -} diff --git a/modulecheck-utils/traversal/src/main/kotlin/modulecheck/utils/traversal/Traversals.kt b/modulecheck-utils/traversal/src/main/kotlin/modulecheck/utils/traversal/Traversals.kt deleted file mode 100644 index bff8b44d22..0000000000 --- a/modulecheck-utils/traversal/src/main/kotlin/modulecheck/utils/traversal/Traversals.kt +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.traversal - -/** Depth-first and breadth-first traversals of any tree */ -object Traversals { - - /** - * Generates a depth-first traversal sequence for a given tree or graph structure. - * - * @param t The root element of the tree/graph. - * @param childrenFactory A lambda that returns the children of a given element. - * @return A depth-first traversal sequence for the tree/graph. - */ - inline fun depthFirstTraversal( - t: T, - crossinline childrenFactory: T.() -> List - ): Sequence { - val stack = ArrayDeque() - stack.addLast(t) - - return generateSequence { - stack.removeLastOrNull() - ?.also { current -> - val children = childrenFactory(current) - when (children.size) { - 0 -> Unit // Do nothing for empty children - 1 -> stack.addLast(children[0]) // Add the only child directly - else -> stack.addAll(children.asReversed()) // Add all the children in reversed order - } - } - } - } - - /** - * Generates a breadth-first traversal sequence for a given tree or graph structure. - * - * @param t The root element of the tree/graph. - * @param childrenFactory A lambda that returns the children of a given element. - * @return A breadth-first traversal sequence for the tree/graph. - */ - inline fun breadthFirstTraversal( - t: T, - crossinline childrenFactory: T.() -> List - ): Sequence { - val queue = ArrayDeque() - queue.addLast(t) - - return generateSequence { - val current = queue.removeFirstOrNull() ?: return@generateSequence null - val children = childrenFactory(current) - - when (children.size) { - // 0 -> Unit // Do nothing for empty children - // 1 -> queue.addLast(children[0]) // Add the only child directly - else -> queue.addAll(children) - } - - current - } - } -} diff --git a/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/AbstractTreePrinterTest.kt b/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/AbstractTreePrinterTest.kt deleted file mode 100644 index 3f517cec66..0000000000 --- a/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/AbstractTreePrinterTest.kt +++ /dev/null @@ -1,138 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.traversal - -import io.kotest.matchers.shouldBe -import modulecheck.utils.noAnsi -import org.junit.jupiter.api.Test - -class AbstractTreePrinterTest { - @Test - fun `tree string output is nested`() { - val tree = rootNode("root", "root") { - compositeNode("a", "composite") { - leafNode("a1", "leaf") - leafNode("a2", "leaf") - } - compositeNode("b", "composite") { - leafNode("b1", "leaf") - leafNode("b2", "leaf") - } - leafNode("c", "typeC") - } - - TestNodeTreePrinter().treeString(tree).noAnsi() shouldBe """ - ┏━ CompositeNode [type: root] [parent: null] [parent type: null] ━┓ - ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ┃text for root ┃ - ┃the element type is root ┃ - ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ┏━ CompositeNode (2) [type: composite] [parent: CompositeNode] [parent type: root] ━┓ - ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ┃text for a ┃ - ╎ ┃the element type is composite ┃ - ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode [type: leaf] [parent: CompositeNode (2)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text for a1 ┃ - ╎ ╎ ┃the element type is leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode (2) [type: leaf] [parent: CompositeNode (2)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text for a2 ┃ - ╎ ╎ ┃the element type is leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ┏━ CompositeNode (3) [type: composite] [parent: CompositeNode] [parent type: root] ━┓ - ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ┃text for b ┃ - ╎ ┃the element type is composite ┃ - ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode (3) [type: leaf] [parent: CompositeNode (3)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text for b1 ┃ - ╎ ╎ ┃the element type is leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode (4) [type: leaf] [parent: CompositeNode (3)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text for b2 ┃ - ╎ ╎ ┃the element type is leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ┏━ LeafNode (5) [type: typeC] [parent: CompositeNode] [parent type: root] ━┓ - ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ┃text for c ┃ - ╎ ┃the element type is typeC ┃ - ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - """.trimIndent() - } - - @Test - fun `a custom whitespace character does not pad the entire text box`() { - val tree = rootNode("root", "root") { - compositeNode("a", "composite") { - leafNode("a1", "leaf") - leafNode("a2", "leaf") - } - compositeNode("b", "composite") { - leafNode("b1", "leaf") - leafNode("b2", "leaf") - } - leafNode("c", "typeC") - } - - TestNodeTreePrinter('·').treeString(tree).noAnsi() shouldBe """ - ┏━ CompositeNode [type: root] [parent: null] [parent type: null] ━┓ - ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ┃text·for·root ┃ - ┃the·element·type·is·root ┃ - ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ┏━ CompositeNode (2) [type: composite] [parent: CompositeNode] [parent type: root] ━┓ - ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ┃text·for·a ┃ - ╎ ┃the·element·type·is·composite ┃ - ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode [type: leaf] [parent: CompositeNode (2)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text·for·a1 ┃ - ╎ ╎ ┃the·element·type·is·leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode (2) [type: leaf] [parent: CompositeNode (2)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text·for·a2 ┃ - ╎ ╎ ┃the·element·type·is·leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ┏━ CompositeNode (3) [type: composite] [parent: CompositeNode] [parent type: root] ━┓ - ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ┃text·for·b ┃ - ╎ ┃the·element·type·is·composite ┃ - ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode (3) [type: leaf] [parent: CompositeNode (3)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text·for·b1 ┃ - ╎ ╎ ┃the·element·type·is·leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ╎ ┏━ LeafNode (4) [type: leaf] [parent: CompositeNode (3)] [parent type: composite] ━┓ - ╎ ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ╎ ┃text·for·b2 ┃ - ╎ ╎ ┃the·element·type·is·leaf ┃ - ╎ ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - ╎ ┏━ LeafNode (5) [type: typeC] [parent: CompositeNode] [parent type: root] ━┓ - ╎ ┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫ - ╎ ┃text·for·c ┃ - ╎ ┃the·element·type·is·typeC ┃ - ╎ ┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛ - """.trimIndent() - } -} diff --git a/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/TestNode.kt b/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/TestNode.kt deleted file mode 100644 index c1a1733e29..0000000000 --- a/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/TestNode.kt +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.traversal - -sealed interface TestNode { - val name: String - val elementType: String - val children: List - var parent: TestNode? - - val text: String get() = "text for $name\nthe element type is $elementType" -} - -data class CompositeNode( - override val name: String, - override val elementType: String, - override val children: List -) : TestNode { - override var parent: TestNode? = null -} - -data class LeafNode( - override val name: String, - override val elementType: String -) : TestNode { - override var parent: TestNode? = null - override val children: List - get() = emptyList() -} - -fun rootNode(name: String, elementType: String, init: CompositeNodeBuilder.() -> Unit): TestNode { - val builder = CompositeNodeBuilder(name, elementType, null) - builder.init() - return builder.build() -} - -class CompositeNodeBuilder( - private val name: String, - private val elementType: String, - private val parent: TestNode? -) { - private val children = mutableListOf() - - fun compositeNode(name: String, elementType: String, init: CompositeNodeBuilder.() -> Unit) { - val childBuilder = CompositeNodeBuilder(name, elementType, build()) - childBuilder.init() - children.add(childBuilder.build()) - } - - fun leafNode(name: String, elementType: String) { - children.add(LeafNode(name, elementType).also { it.parent = build() }) - } - - fun build(): TestNode = CompositeNode(name, elementType, children).apply { - this@apply.parent = this@CompositeNodeBuilder.parent - children.forEach { it.parent = this } - } -} - -class TestNodeTreePrinter( - whitespaceChar: Char = ' ' -) : AbstractTreePrinter(whitespaceChar) { - override fun TestNode.simpleClassName(): String = this::class.java.simpleName - override fun TestNode.parent(): TestNode? = parent - override fun TestNode.typeName(): String = elementType - - override fun TestNode.text(): String = text - override fun TestNode.children() = children.asSequence() -} diff --git a/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/TraversalsTest.kt b/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/TraversalsTest.kt deleted file mode 100644 index a0b3f9845d..0000000000 --- a/modulecheck-utils/traversal/src/test/kotlin/modulecheck/utils/traversal/TraversalsTest.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package modulecheck.utils.traversal - -import io.kotest.matchers.collections.shouldContainExactly -import modulecheck.utils.traversal.Traversals.breadthFirstTraversal -import modulecheck.utils.traversal.Traversals.depthFirstTraversal -import org.junit.jupiter.api.Test - -class TraversalsTest { - @Test - fun `depthFirstTraversal should return nodes in the correct order`() { - val tree = rootNode("root", "rootType") { - compositeNode("a", "typeA") { - leafNode("a1", "typeA1") - leafNode("a2", "typeA2") - } - compositeNode("b", "typeB") { - leafNode("b1", "typeB1") - leafNode("b2", "typeB2") - } - leafNode("c", "typeC") - } - - val traversalOrder = depthFirstTraversal(tree) { children }.toList() - - traversalOrder.map { it.name } shouldContainExactly listOf( - "root", - "a", - "a1", - "a2", - "b", - "b1", - "b2", - "c" - ) - } - - @Test - fun `breadthFirstTraversal should return nodes in the correct order`() { - val tree = rootNode("root", "rootType") { - compositeNode("a", "typeA") { - leafNode("a1", "typeA1") - leafNode("a2", "typeA2") - } - compositeNode("b", "typeB") { - leafNode("b1", "typeB1") - leafNode("b2", "typeB2") - } - leafNode("c", "typeC") - } - - val traversalOrder = breadthFirstTraversal(tree) { children }.toList() - - traversalOrder.map { it.name } shouldContainExactly listOf( - "root", - "a", - "b", - "c", - "a1", - "a2", - "b1", - "b2" - ) - } -} diff --git a/opensearch.xml b/opensearch.xml new file mode 100644 index 0000000000..f413518116 --- /dev/null +++ b/opensearch.xml @@ -0,0 +1,11 @@ + + + ModuleCheck + Search ModuleCheck + UTF-8 + https://rbusarow.github.io/ModuleCheck/img/favicon.ico + + + https://rbusarow.github.io/ModuleCheck/ + \ No newline at end of file diff --git a/project.aff b/project.aff deleted file mode 100644 index bc3de4c601..0000000000 --- a/project.aff +++ /dev/null @@ -1,5 +0,0 @@ -SET UTF-8 - -SFX S Y 2 -SFX S 0 s . -SFX S 0 's . diff --git a/project.dic b/project.dic deleted file mode 100644 index 0be812162e..0000000000 --- a/project.dic +++ /dev/null @@ -1,28 +0,0 @@ -Busarow/S -Downstreams -Kotest -UPPERFLATCASE -ajalt -arturbosch -burrunan -busarow -cacheability -clikt -databinding -decapitalization -decapitalize -doks -flatcase -interpunct/S -johnrengelman -kase -kotest -ktlint -mcbuild -modulecheck -rbusarow -reactivecircus -rickbusarow -sourceset -squareup -vanniktech diff --git a/release.sh b/release.sh deleted file mode 100644 index a405cfa79b..0000000000 --- a/release.sh +++ /dev/null @@ -1,57 +0,0 @@ -#!/bin/bash - -# -# Copyright (C) 2021-2023 Rick Busarow -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# exit when any command fails -set -e - -# keep track of the last executed command -trap 'last_command=$current_command; current_command=$BASH_COMMAND' DEBUG -# echo an error message before exiting -trap 'echo "\"${last_command}\" command filed with exit code $?."' EXIT - -./gradlew clean - -# Publish Maven release -./gradlew publish --no-daemon --no-configuration-cache - -# Publish to Gradle Plugin Portal -./gradlew publishPlugins --no-configuration-cache - -# Create new website docs version -./gradlew versionDocs - -# Set all versions in the root README to the new version -./gradlew updateProjectReadmeVersionRefs --no-configuration-cache - -# Copy the CHANGELOG from project root to the website dir and update its formatting -./gradlew updateWebsiteChangelog - -# Capture a snapshot of the current version's dokka api docs -./gradlew dokkaHtmlMultiModule syncDokkaToArchive - -echo -echo ' ___ _ _ ___ ___ ___ ___ ___' -echo '/ __| | | |/ __/ __/ _ \/ __/ __|' -echo '\__ \ |_| | (_| (_| __/\__ \__ \' -echo '|___/\__,_|\___\___\___||___/___/' -echo -echo -echo The release is done and a new docs version has been created for Docusaurus. -echo -echo These changes need to get merged into main and published. -echo -echo diff --git a/search/index.html b/search/index.html new file mode 100644 index 0000000000..870089b86c --- /dev/null +++ b/search/index.html @@ -0,0 +1,16 @@ + + + + + +Search the documentation | ModuleCheck + + + + + + + + + + \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts deleted file mode 100644 index 1b0d4ad7e3..0000000000 --- a/settings.gradle.kts +++ /dev/null @@ -1,194 +0,0 @@ -/* - * Copyright (C) 2021-2025 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -rootProject.name = "ModuleCheck" - -pluginManagement { - - val allowMavenLocal = providers - .gradleProperty("moduleCheck.allow-maven-local") - .orNull.toBoolean() - - repositories { - if (allowMavenLocal) { - logger.lifecycle("${rootProject.name} -- allowing mavenLocal for plugins") - mavenLocal() - } - gradlePluginPortal() - mavenCentral() - google() - maven { - url = uri("https://oss.sonatype.org/content/repositories/snapshots/") - content { - includeGroup("com.rickbusarow.module-check") - includeGroup("com.rickbusarow.modulecheck") - } - } - } - includeBuild("build-logic") -} - -val allowMavenLocal = providers - .gradleProperty("moduleCheck.allow-maven-local") - .orNull.toBoolean() - -dependencyResolutionManagement { - @Suppress("UnstableApiUsage") - repositories { - if (allowMavenLocal) { - logger.lifecycle("${rootProject.name} -- allowing mavenLocal for dependencies") - mavenLocal() - } - mavenCentral() - google() - maven("https://plugins.gradle.org/m2/") - } -} - -plugins { - id("com.gradle.develocity") version "4.0.2" -} - -val isCI = System.getenv("CI")?.toBoolean() == true - -if (isCI) { - printCiEnvironment() -} - -develocity { - buildScan { - - uploadInBackground = !isCI && gradle.parent == null - termsOfUseUrl = "https://gradle.com/help/legal-terms-of-use" - termsOfUseAgree = "yes" - - capture { - testLogging = true - buildLogging = true - fileFingerprints = true - } - - obfuscation { - hostname { "" } - ipAddresses { listOf("") } - username { "" } - } - - val gitHubActions = System.getenv("GITHUB_ACTIONS")?.toBoolean() ?: false - if (gitHubActions) { - // ex: `octocat/Hello-World` as in github.com/octocat/Hello-World - val repository = System.getenv("GITHUB_REPOSITORY")!! - val runId = System.getenv("GITHUB_RUN_ID")!! - - link( - "GitHub Action Run", - "https://github.com/$repository/actions/runs/$runId" - ) - } - } -} - -include( - ":modulecheck-api", - ":modulecheck-config:api", - ":modulecheck-config:fake", - ":modulecheck-config:impl", - ":modulecheck-core", - ":modulecheck-dagger", - ":modulecheck-finding:api", - ":modulecheck-finding:impl", - ":modulecheck-finding:impl-android", - ":modulecheck-finding:impl-sort", - ":modulecheck-finding:name", - ":modulecheck-gradle:platforms:api", - ":modulecheck-gradle:platforms:impl", - ":modulecheck-gradle:platforms:internal-android", - ":modulecheck-gradle:platforms:internal-jvm", - ":modulecheck-gradle:plugin", - ":modulecheck-internal-testing", - ":modulecheck-model:dependency:api", - ":modulecheck-model:dependency:impl", - ":modulecheck-model:sourceset:api", - ":modulecheck-parsing:android", - ":modulecheck-parsing:gradle:dsl:api", - ":modulecheck-parsing:gradle:dsl:internal", - ":modulecheck-parsing:gradle:dsl:precompiled", - ":modulecheck-parsing:gradle:dsl:testing", - ":modulecheck-parsing:gradle:model:api", - ":modulecheck-parsing:gradle:model:impl-typesafe", - ":modulecheck-parsing:groovy-antlr", - ":modulecheck-parsing:java", - ":modulecheck-parsing:kotlin-compiler:api", - ":modulecheck-parsing:kotlin-compiler:impl", - ":modulecheck-parsing:psi", - ":modulecheck-parsing:source:api", - ":modulecheck-parsing:source:testing", - ":modulecheck-parsing:wiring", - ":modulecheck-project:api", - ":modulecheck-project:impl", - ":modulecheck-project:testing", - ":modulecheck-project-generation:api", - ":modulecheck-reporting:checkstyle", - ":modulecheck-reporting:console", - ":modulecheck-reporting:graphviz", - ":modulecheck-reporting:logging:api", - ":modulecheck-reporting:logging:testing", - ":modulecheck-reporting:sarif", - ":modulecheck-rule:api", - ":modulecheck-rule:impl", - ":modulecheck-rule:impl-factory", - ":modulecheck-rule:testing", - ":modulecheck-runtime:api", - ":modulecheck-runtime:testing", - ":modulecheck-utils:cache", - ":modulecheck-utils:coroutines:api", - ":modulecheck-utils:coroutines:impl", - ":modulecheck-utils:lazy", - ":modulecheck-utils:stdlib", - ":modulecheck-utils:trace", - ":modulecheck-utils:trace-testing", - ":modulecheck-utils:traversal" -) - -fun printCiEnvironment() { - fun Long.gigabytes(): String { - return "%.1f GB".format(toDouble() / (1024 * 1024 * 1024)).padEnd(52) - } - - val os = System.getProperty("os.name").toString().padEnd(52) - val processors = Runtime.getRuntime().availableProcessors().toString().padEnd(52) - val totalMemory = Runtime.getRuntime().totalMemory().gigabytes() - val freeMemory = Runtime.getRuntime().freeMemory().gigabytes() - val maxMemory = Runtime.getRuntime().maxMemory().gigabytes() - println( - """ - ╔══════════════════════════════════════════════════╗ - ║ CI environment ║ - ║ ║ - ║ OS - $os ║ - ║ available processors - $processors ║ - ║ ║ - ║ allocated memory - $totalMemory ║ - ║ free memory - $freeMemory ║ - ║ max memory - $maxMemory ║ - ╚══════════════════════════════════════════════════╝ - """.trimIndent() - .lineSequence() - .joinToString("\n") { line -> - val sub = line.substringBeforeLast('║', "") - if (sub.length > 51) sub.substring(0..50) + '║' else line - } - ) -} diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000000..ef4584d8fe --- /dev/null +++ b/sitemap.xml @@ -0,0 +1 @@ +https://rbusarow.github.io/ModuleCheck/changelogweekly0.5https://rbusarow.github.io/ModuleCheck/migrationsweekly0.5https://rbusarow.github.io/ModuleCheck/searchweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/mdxweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/android/disable_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/android/disable_viewbindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/kapt/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/kapt/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/overshotweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/redundantweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/sorting/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/sorting/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.10.0/rules/unusedweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/android/disable_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/android/disable_viewbindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/compiler/could_use_anvil_factoryweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/kapt/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/kapt/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/sorting/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/sorting/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.0/rules/unusedweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/android/disable_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/android/disable_viewbindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/compiler/could_use_anvil_factoryweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/kapt/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/kapt/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/sorting/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/sorting/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.1/rules/unusedweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/android/disable_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/android/disable_viewbindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/compiler/could_use_anvil_factoryweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/kapt/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/kapt/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/sorting/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/sorting/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.2/rules/unusedweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/android/disable_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/android/disable_viewbindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/compiler/could_use_anvil_factoryweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/kapt/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/kapt/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/sorting/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/sorting/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/rules/unusedweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.11.3/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/android/disable_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/android/disable_viewbindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/android/unused_kotlin_android_extensionsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/compiler/could_use_anvil_factoryweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/depthsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/kapt/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/kapt/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/overshot_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/redundant_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/sorting/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/sorting/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/rules/unusedweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.0/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/disable_android_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/disable_view_bindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/overshot_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/project_depthweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/redundant_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/unused_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/unused_kotlin_android_extensionsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/rules/use_anvil_factory_generationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.1/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/disable_android_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/disable_view_bindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/overshot_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/project_depthweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/redundant_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/unused_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/unused_kotlin_android_extensionsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/rules/use_anvil_factory_generationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.2/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/disable_android_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/disable_view_bindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/overshot_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/project_depthweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/redundant_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/unused_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/unused_kotlin_android_extensionsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/rules/use_anvil_factory_generationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.3/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/disable_android_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/disable_view_bindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/overshot_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/project_depthweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/redundant_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/unused_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/unused_kotlin_android_extensionsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/rules/use_anvil_factory_generationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/0.12.4/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/disable_android_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/disable_view_bindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/overshot_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/project_depthweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/redundant_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/unused_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/unused_kotlin_android_extensionsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/rules/use_anvil_factory_generationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/next/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/weekly0.5https://rbusarow.github.io/ModuleCheck/docs/ci-workflowweekly0.5https://rbusarow.github.io/ModuleCheck/docs/configurationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/custom_kapt_matchersweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/disable_android_resourcesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/disable_view_bindingweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/inherited_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/must_be_apiweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/overshot_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/project_depthweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/redundant_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/sort_dependenciesweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/sort_pluginsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/unused_dependencyweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kapt_pluginweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kapt_processorweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kotlin_android_extensionsweekly0.5https://rbusarow.github.io/ModuleCheck/docs/rules/use_anvil_factory_generationweekly0.5https://rbusarow.github.io/ModuleCheck/docs/suppressing-findingsweekly0.5https://rbusarow.github.io/ModuleCheck/weekly0.5 \ No newline at end of file diff --git a/website/.gitignore b/website/.gitignore deleted file mode 100644 index b2d6de3062..0000000000 --- a/website/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -# Dependencies -/node_modules - -# Production -/build - -# Generated files -.docusaurus -.cache-loader - -# Misc -.DS_Store -.env.local -.env.development.local -.env.test.local -.env.production.local - -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/website/README.md b/website/README.md deleted file mode 100644 index 8960fa2afa..0000000000 --- a/website/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Website - -This website is built using [Docusaurus 2](https://v2.docusaurus.io/), a modern static website generator. - -## Installation - -```console -yarn install -``` - -## Local Development - -```console -yarn start -``` - -This command starts a local development server and open up a browser window. Most changes are reflected live without having to restart the server. - -## Build - -```console -yarn build -``` - -This command generates static content into the `build` directory and can be served using any static contents hosting service. - -## Deployment - -```console -GIT_USER= USE_SSH=true yarn deploy -``` - -If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch. diff --git a/website/babel.config.js b/website/babel.config.js deleted file mode 100644 index 5a2daced3c..0000000000 --- a/website/babel.config.js +++ /dev/null @@ -1,18 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - presets: [require.resolve("@docusaurus/core/lib/babel/preset")], -}; diff --git a/website/docs/ci_workflow.md b/website/docs/ci_workflow.md deleted file mode 100644 index 5a410bf3b6..0000000000 --- a/website/docs/ci_workflow.md +++ /dev/null @@ -1,145 +0,0 @@ ---- -id: ci-workflow - -sidebar_label: CI Workflow - -title: CI Workflow ---- - -ModuleCheck will automatically fix most issues. Most CI platforms are able to commit changes, and -automatically cancel out-of-date jobs when the branch has been updated. This tooling can be used to -apply ModuleCheck's automatic fixes (if any) as part of a CI run, then cancel and start a new run. -This is similar to a git pre-commit hook, except the work is delegated to a build server. - -### Using CI over git hooks - -The traditional method for applying changes automatically is with a git hook, such as pre-commit or -pre-push. But if the task-to-be-automated has a runtime of more than a few seconds, this is a poor -developer experience. With a CI task, the execution is done automatically and asynchronously, while -the developer is already moving on to something else. - -A git hook also technically doesn't guarantee that a task is executed before code is checked in to a -main branch, since there's no guarantee that a hook is enabled. With CI, the task will output a -status check. If a branch protection rule is enabled, that status check can be required. This will -then guarantee that the task has run (successfully) before any code is checked in to the protected -branch. - -### Example Flow chart - -This is a simplified flowchart of how I would run ModuleCheck with unit tests in CI. The -cancellation, test, and ModuleCheck jobs run in parallel on three different runners. This is an -"optimistic" workflow, in that it assumes that the `modulecheck` task will not generate changes -which would trigger a restart. - -```mermaid -flowchart TB - Start(CI Start):::good --> mGraph - Start --> tGraph - Start --> cGraph - - subgraph mGraph [runner 1] - direction TB - ModuleCheck(./gradlew moduleCheckAuto):::code --> ChangesModuleCheck - ChangesModuleCheck{Graph changes?} --- yesM[yes]:::lineLabel --> CommitModuleCheck(Commit changes and push):::stop - ChangesModuleCheck --- noM[no]:::lineLabel --> EndModuleCheck("#10003;"):::good - end - - subgraph tGraph [runner 2] - direction TB - Tests(./gradlew test):::code --> EndTests("#10003;"):::good - end - - subgraph cGraph [runner 3] - direction TB - Cancel(Cancel previous CI run):::code - end - - style tGraph fill:#EEE,stroke:#000 - style cGraph fill:#EEE,stroke:#000 - style mGraph fill:#EEE,stroke:#000 - - classDef good fill:#0B0,stroke:#000 - classDef stop fill:#E33,stroke:#000 - - classDef code fill:#AAA,stroke:#000 - - style ChangesModuleCheck fill:#CD1,stroke:#000 - - classDef lineLabel fill:#FFF,stroke:#FFF -``` - -### Example GitHub Action - -Here's an Action which will run ModuleCheck, then commit any changes -using [Stefanzweifel's auto-commit](https://github.com/stefanzweifel/git-auto-commit-action). This -requires a personal access token secret, or the commit step will fail. - -```yaml title=.github/workflows.module-check.yml -name: ModuleCheck - -on: - pull_request: - -jobs: - - cancel-stale-jobs: - name: Cancel stale jobs - runs-on: ubuntu-latest - - steps: - # cancel previous jobs - - name: Cancel Previous Runs - uses: styfle/cancel-workflow-action@0.9.0 - env: - GITHUB_TOKEN: '${{ secrets.GITHUB_TOKEN }}' - - ModuleCheck: - name: ModuleCheck - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.ref }} - # Must use a personal access token in order to commit changes - token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} - fetch-depth: 0 - - - name: Set up JDK - uses : actions/setup-java@v2 - with : - distribution : 'temurin' - java-version : '11' - - # performs tree-shaking on the Gradle dependency graph - - name: modulecheck - run: ./gradlew moduleCheckAuto --no-daemon - - # If ModuleCheck generated changes, commit and push those changes. - # If there are no changes, then this is a no-op. - - name: commit changes - uses: stefanzweifel/git-auto-commit-action@v4 - with: - commit_message: Apply ModuleCheck changes - commit_options: '--no-verify --signoff' - - tests: - name: Unit tests - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - with: - ref: ${{ github.event.pull_request.head.ref }} - token: ${{ secrets.GITHUB_TOKEN }} - fetch-depth: 0 - - - name: Set up JDK - uses : actions/setup-java@v2 - with : - distribution : 'temurin' - java-version : '14' - - - name: all tests - run: ./gradlew test --no-daemon -``` diff --git a/website/docs/configuration.mdx b/website/docs/configuration.mdx deleted file mode 100644 index ab8ab7cd16..0000000000 --- a/website/docs/configuration.mdx +++ /dev/null @@ -1,176 +0,0 @@ ---- -id: configuration -sidebar_label: Configuration ---- - -import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - - - - - - - -```kotlin title = root/build.gradle.kts -plugins { - id("com.rickbusarow.module-check") -} - -moduleCheck { - - deleteUnused = true // default is false - trace = true // default is false - - checks { - overShotDependency = true // default is true - redundantDependency = false // default is false - unusedDependency = true // default is true - mustBeApi = true // default is true - inheritedDependency = true // default is true - sortDependencies = false // default is false - sortPlugins = false // default is false - unusedKapt = true // default is true - anvilFactoryGeneration = true // default is true - disableAndroidResources = false // default is false - disableViewBinding = false // default is false - unusedKotlinAndroidExtensions = false // default is false - depths = false // default is false - } - - // allow these modules to be declared as dependency anywhere, - // regardless of whether they're used - ignoreUnusedFinding = setOf(":test:core-jvm", ":test:core-android") - - // do not check the dependencies of these modules. - // in this case, :app could declare any module it wants without issue - doNotCheck = setOf(":app") - - additionalCodeGenerators = listOf( - modulecheck.config.CodeGeneratorBinding.AnnotationProcessor( - name = "My Processor", - generatorMavenCoordinates = "my-project.codegen:processor", - annotationNames = listOf( - "myproject.MyInject", - "myproject.MyInject.Factory", - "myproject.MyInjectParam", - "myproject.MyInjectModule" - ) - ) - ) - - reports { - checkstyle { - enabled = true // default is false - outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml" - } - sarif { - enabled = true // default is false - outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif" - } - depths { - enabled = true // default is false - outputPath = "${project.buildDir}/reports/modulecheck/depths.txt" - } - graphs { - enabled = true // default is false - // The root directory of all generated graphs. If set, directories will be created - // for each module, mirroring the structure of the project. If this property is null, - // graphs will be created in the `build/reports/modulecheck/graphs/` relative - // directory of each project. - outputDir = "${project.buildDir}/reports/modulecheck/graphs" - } - text { - enabled = true // default is false - outputPath = "${project.buildDir}/reports/modulecheck/report.txt" - } - } -} -``` - - - - - - - - - -```groovy title = root/build.gradle -plugins { - id 'com.rickbusarow.module-check' -} - -moduleCheck { - deleteUnused = true // default is false - trace = true // default is false - - checks { - overShotDependency = true // default is true - redundantDependency = false // default is false - unusedDependency = true // default is true - mustBeApi = true // default is true - inheritedDependency = true // default is true - sortDependencies = false // default is false - sortPlugins = false // default is false - unusedKapt = true // default is true - anvilFactoryGeneration = true // default is true - disableAndroidResources = false // default is false - disableViewBinding = false // default is false - unusedKotlinAndroidExtensions = false // default is false - depths = false // default is false - } - - // allow these modules to be declared as dependency anywhere, - // regardless of whether they're used - ignoreUnusedFinding = [':test:core-jvm', ':test:core-android'] - - // do not check the dependencies of these modules. - // in this case, :app could declare any module it wants without issue - doNotCheck = [':app'] - - additionalCodeGenerators = [ - new modulecheck.config.CodeGeneratorBinding.AnnotationProcessor( - 'My Processor', - 'my-project.codegen:processor', - [ - "myproject.MyInject", - "myproject.MyInject.Factory", - "myproject.MyInjectParam", - "myproject.MyInjectModule" - ] - ) - ] - - reports { - checkstyle { - it.enabled = true // default is false - it.outputPath = "${project.buildDir}/reports/modulecheck/checkstyle.xml" - } - sarif { - it.enabled = true // default is false - it.outputPath = "${project.buildDir}/reports/modulecheck/modulecheck.sarif" - } - depths { - it.enabled = true // default is false - it.outputPath = "${project.buildDir}/reports/modulecheck/depths.txt" - } - graphs { - it.enabled = true // default is false - // The root directory of all generated graphs. If set, directories will be created - // for each module, mirroring the structure of the project. If this property is null, - // graphs will be created in the `build/reports/modulecheck/graphs/` relative - // directory of each project. - it.outputDir = "${project.buildDir}/reports/modulecheck/graphs" - } - text { - it.enabled = true // default is false - it.outputPath = "${project.buildDir}/reports/modulecheck/report.txt" - } - } - -} -``` - - - - diff --git a/website/docs/quickstart.mdx b/website/docs/quickstart.mdx deleted file mode 100644 index c7b8c544c6..0000000000 --- a/website/docs/quickstart.mdx +++ /dev/null @@ -1,150 +0,0 @@ ---- -id: quickstart -title: Quick Start -sidebar_label: Quick Start -slug: / ---- - - -import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - - -## Dependencies - - - - -```kotlin -// settings.gradle.kts - -pluginManagement { - repositories { - gradlePluginPortal() - // Add for SNAPSHOT builds - maven("https://oss.sonatype.org/content/repositories/snapshots/") - } -} -``` - - -```kotlin -// top-level build.gradle.kts - -plugins { - id("com.rickbusarow.module-check") version "0.13.0-SNAPSHOT" -} -``` - - - - - - -```groovy -// settings.gradle - -pluginManagement { - repositories { - gradlePluginPortal() - // Add for SNAPSHOT builds - maven { - url "https://oss.sonatype.org/content/repositories/snapshots" - } - } -} -``` - - -```groovy -// top-level build.gradle - -plugins { - id 'com.rickbusarow.module-check' version '0.13.0-SNAPSHOT' -} -``` - - - - - -## Tasks - -all checks -```shell -./gradlew moduleCheck -``` - -all checks with auto-correct -```shell -./gradlew moduleCheckAuto -``` - -check sorting -```shell -./gradlew moduleCheckSortPlugins moduleCheckSortDependencies -``` - -apply sorting -```shell -./gradlew moduleCheckSortPluginsAuto moduleCheckSortDependenciesAuto -``` - -report depths of each module -```shell -./gradlew moduleCheckDepths -``` - -generate (module-only) dependency graphs -```shell -./gradlew moduleCheckGraphs -``` - -## Configuration - -See [configuration](./configuration.mdx) for a full list of options. - - - - - -```kotlin title="root/build.gradle.kts" -configure { - - alwaysIgnore.set(setOf(":app")) - - checks { - redundant.set(false) - } -} -``` - ---or-- - -```kotlin title="root/build.gradle.kts" -moduleCheck { - - alwaysIgnore.set(setOf(":app")) - - checks { - redundant.set(false) - } -} -``` - - - - - -```groovy title="root/build.gradle" -moduleCheck { - - alwaysIgnore.set(setOf(":app")) - - checks { - redundant.set(false) - } -} -``` - - - diff --git a/website/docs/rules/android/disable_android_resources.md b/website/docs/rules/android/disable_android_resources.md deleted file mode 100644 index 71ec297305..0000000000 --- a/website/docs/rules/android/disable_android_resources.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: disable_android_resources -slug: /rules/disable_android_resources -title: Disable Android Resources -sidebar_label: Disable Android Resources ---- - -If an Android module doesn't actually have any resources in the `src/__/res` directory, -then `android.buildFeatures.androidResources` can be disabled. - -```kotlin -android { - buildFeatures { - androidResource = false - } -} -``` diff --git a/website/docs/rules/android/disable_view_binding.md b/website/docs/rules/android/disable_view_binding.md deleted file mode 100644 index 45a27be804..0000000000 --- a/website/docs/rules/android/disable_view_binding.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -id: disable_view_binding -slug: /rules/disable_view_binding -title: Disable ViewBinding -sidebar_label: Disable ViewBinding ---- - -If an Android module has `viewBinding` enabled, but doesn't contribute any generated `____Binding` -objects from layout files which are actually used, then `viewBinding` can be disabled. - -```kotlin -android { - buildFeatures { - viewBinding = false - } -} -``` diff --git a/website/docs/rules/android/unused_kotlin_android_extensions.md b/website/docs/rules/android/unused_kotlin_android_extensions.md deleted file mode 100644 index 1c376f3c86..0000000000 --- a/website/docs/rules/android/unused_kotlin_android_extensions.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: unused_kotlin_android_extensions -slug: /rules/unused_kotlin_android_extensions -title: Unused Kotlin Android Extensions -sidebar_label: Unused Kotlin Android Extensions ---- - -Finds modules which have deprecated Kotlin Android Extensions enabled, but don't actually use any -synthetic imports or deprecated @Parcelize annotation diff --git a/website/docs/rules/compiler/custom_kapt_matchers.md b/website/docs/rules/compiler/custom_kapt_matchers.md deleted file mode 100644 index f6323ac4b8..0000000000 --- a/website/docs/rules/compiler/custom_kapt_matchers.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -id: custom_kapt_matchers -slug: /rules/custom_kapt_matchers -title: Custom Kapt Matchers -sidebar_label: Custom Kapt Matchers ---- - -It's simple to add a custom matcher for an internal-use annotation processor. - -Just define a list of regex strings for all of the fully qualified names of its annotations. - -```kotlin -moduleCheck { - additionalKaptMatchers.set( - listOf( - modulecheck.api.KaptMatcher( - name = "MyProcessor", - processor = "my-project.codegen:processor", - annotationImports = listOf( - "myproject\\.\\*", - "myproject\\.MyInject", - "myproject\\.MyInject\\.Factory", - "myproject\\.MyInjectParam", - "myproject\\.MyInjectModule" - ) - ) - ) - ) -} -``` diff --git a/website/docs/rules/compiler/unused_kapt_plugin.md b/website/docs/rules/compiler/unused_kapt_plugin.md deleted file mode 100644 index 9a45eadfa1..0000000000 --- a/website/docs/rules/compiler/unused_kapt_plugin.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -id: unused_kapt_plugin -slug: /rules/unused_kapt_plugin -title: Unused Kapt Plugin -sidebar_label: Unused Kapt Plugin ---- - -If there are no `kapt`/`kaptTest`/etc. processor dependencies in a module, there's no point in -applying the `org.jetbrains.kotlin.kapt` plugin. diff --git a/website/docs/rules/compiler/unused_kapt_processor.md b/website/docs/rules/compiler/unused_kapt_processor.md deleted file mode 100644 index 325423fd94..0000000000 --- a/website/docs/rules/compiler/unused_kapt_processor.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -id: unused_kapt_processor -slug: /rules/unused_kapt_processor -title: Unused Kapt Processor -sidebar_label: Unused Kapt Processor ---- - -Annotation processors act upon a defined set of annotations. If an annotation processor is -sufficiently popular and its api is stable, then it's relatively simple to define a list of -annotations to search for. For instance, Dagger looks for the following annotations: - -- `javax.inject.Inject` -- `dagger.Binds` -- `dagger.Module` -- `dagger.multibindings.IntoMap` -- `dagger.multibindings.IntoSet` -- `dagger.BindsInstance` -- `dagger.Component` -- `dagger.assisted.Assisted` -- `dagger.assisted.AssistedInject` -- `dagger.assisted.AssistedFactory` -- `com.squareup.anvil.annotations.ContributesTo` -- `com.squareup.anvil.annotations.MergeComponent` -- `com.squareup.anvil.annotations.MergeSubomponent` - -If a module has the Dagger `kapt` dependency, and that module *does not* have one of the above -annotations somewhere, then Dagger isn't actually doing anything and can be removed. - -This is simply a best-effort approach, and it isn't maintenance-free. Over time, the list of -annotations for any processor may change. If this rule gives a false-positive finding because of a -new annotation, please open an issue and/or pull request. diff --git a/website/docs/rules/compiler/use_anvil_factory_generation.md b/website/docs/rules/compiler/use_anvil_factory_generation.md deleted file mode 100644 index 681ca679d9..0000000000 --- a/website/docs/rules/compiler/use_anvil_factory_generation.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -id: use_anvil_factory_generation -slug: /rules/use_anvil_factory_generation -title: Could Use Anvil Factory Generation -sidebar_label: Could Use Anvil Factory Generation ---- - -Anvil's [factory generation](https://github.com/square/anvil#dagger-factory-generation) is faster -than Dagger's generation using Kapt. However, it doesn't support generating Components or -Subcomponents, and it doesn't work in Java code. - -This rule detects whether a module could switch from Dagger's kapt to Anvil factory generation. - -Criteria: - -- Anvil plugin applied with a version greater than 2.0.11 -- Anvil's factory generation isn't already enabled (nothing to do in this case) -- No `@MergeComponent`, `@MergeSubcomponent`, `@Component` or `@Subcomponent` annotations -- No Dagger annotations in `.java` files diff --git a/website/docs/rules/inherited_dependency.md b/website/docs/rules/inherited_dependency.md deleted file mode 100644 index 3089fb97eb..0000000000 --- a/website/docs/rules/inherited_dependency.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -id: inherited_dependency -slug: /rules/inherited_dependency -title: Inherited Dependency -sidebar_label: Inherited Dependency ---- - -Assume that `:moduleA` depends upon `:moduleB`, and `:moduleB` depends upon `:moduleC` via -an `api` configuration. Also assume that `:moduleA` uses something from `:moduleC`, but doesn't -have an explicit dependency for it. It just inherits that dependency from `:moduleB`. - -ModuleCheck will recommend adding a direct, explicit dependency for `:moduleA` -> `:moduleC`. diff --git a/website/docs/rules/must_be_api.md b/website/docs/rules/must_be_api.md deleted file mode 100644 index c650fdba66..0000000000 --- a/website/docs/rules/must_be_api.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: must_be_api -slug: /rules/must_be_api -title: Must Be Api -sidebar_label: Must Be Api ---- - -Dependencies are considered to be part of a module's public "ABI" if that module exposes some aspect -of the dependency in its own API. - -For instance, if a `:moduleA` extends a class/interface from `:moduleB`, or takes a type -from `:moduleB` as a function parameter, then any consumer of `:moduleA`'s API must also have a -dependency upon `:moduleB`. In scenarios like this, the dependency module(s) should be declared -using Gradle's `api` configuration. diff --git a/website/docs/rules/overshot_dependency.md b/website/docs/rules/overshot_dependency.md deleted file mode 100644 index 0dc9a3fdeb..0000000000 --- a/website/docs/rules/overshot_dependency.md +++ /dev/null @@ -1,27 +0,0 @@ ---- -id: overshot_dependency -slug: /rules/overshot_dependency -title: Overshot Dependency -sidebar_label: Overshot Dependency ---- - -Finds project dependencies which aren't used by the declaring configuration, but are used by a -dependent, downstream configuration. - -For instance, assume that `:moduleB` declares an `implementation` dependency upon `:moduleA`. - -```kotlin title="moduleB/build.gradle.kts" -dependencies { - implementation(project(":moduleA")) -} -``` - -If `:moduleB` doesn't actually use `:moduleA` in its `main` source, but it _does_ use it in `test` -source, it's an __overshot dependency__. The declaration should be changed to -use `testImplementation`: - -```kotlin title="moduleB/build.gradle.kts" -dependencies { - testImplementation(project(":moduleA")) -} -``` diff --git a/website/docs/rules/project_depth.md b/website/docs/rules/project_depth.md deleted file mode 100644 index 11b79760bd..0000000000 --- a/website/docs/rules/project_depth.md +++ /dev/null @@ -1,194 +0,0 @@ ---- -id: project_depth -slug: /rules/project_depth -title: Project Depth -sidebar_label: Project Depth ---- - -TL;DR - Low depth values mean faster builds and better all-around scalability. - ---- - -It's often useful to think of module dependencies as a directed tree -or [directed acyclic graph](https://en.wikipedia.org/wiki/Directed_acyclic_graph). If a module is a -node, then each module dependency is a child node, and the dependencies of those dependencies are -grand-child nodes. - -This is especially useful when thinking about **build performance**, because the parent-child -relationship is clear: _child nodes must build before parent nodes_. - -```mermaid -flowchart TB - - classDef depth2 fill:#BBF,stroke:#000,color:#000 - classDef depth1 fill:#B9B,stroke:#000,color:#000 - classDef depth0 fill:#FBB,stroke:#000,color:#000 - - linkStyle default stroke-width:2px,fill:none,stroke:green; - - app(:app):::depth2 - - screen1(:screen-1):::depth1 - screen2(:screen-2):::depth1 - - lib1(:lib-1):::depth0 - lib2(:lib-2):::depth0 - - app --> screen1 - app --> screen2 - - screen1 --> lib1 - screen1 --> lib2 - screen2 --> lib2 -``` - -In the above example, - -- `:lib-1` and `:lib-2` must be built before `:screen-1`. -- `:lib-2` must be build before `:screen-2`. -- `:screen-1` and `:screen-2` must be built before `:app`. - -It's worth pointing out that this relationship is recursive, as well. Grand-child nodes must build -before their parents. - -### Dependencies and Build Concurrency - -Individual module builds are always done single-threaded, but multiple modules may build in parallel -so long as no module in the set depends upon another module in that set. In the above graph, - -- `:lib-1` and `:lib-2` may build in parallel -- `:lib-1` and `:screen-2` may build in parallel -- `:scren-1` and `:screen-2` may build in parallel - -The maximum number of parallel module builds is determined by the structure of the dependency graph -and the number of available processor cores on the machine which is performing the build. - -### Depth - -**Depth** refers to the maximum number of edges between a module and each of its leaf nodes in the -project dependency graph. - -Low depth values indicate a shallow or flat project structure with loose (or no) coupling between -modules. In a full build, these projects scale well with hardware upgrades because they're able to -build all those independent modules in parallel. - -```mermaid -flowchart TB - - subgraph sg [A shallow graph] - direction TB - - classDef depth3 fill:#F7B,stroke:#000,color:#000 - classDef depth2 fill:#BBF,stroke:#000,color:#000 - classDef depth1 fill:#B9B,stroke:#000,color:#000 - classDef depth0 fill:#FBB,stroke:#000,color:#000 - - linkStyle default stroke-width:2px,fill:none,stroke:green; - - app(depth: 2):::depth2 - - screen1(depth: 1):::depth1 - screen2(depth: 1):::depth1 - screen3(depth: 1):::depth1 - screen4(depth: 1):::depth1 - - lib1(depth: 0):::depth0 - lib2(depth: 0):::depth0 - lib3(depth: 0):::depth0 - lib4(depth: 0):::depth0 - lib5(depth: 0):::depth0 - - app --> screen1 - app --> screen2 - app --> screen3 - app --> screen4 - - screen1 --> lib1 - screen1 --> lib4 - - screen2 --> lib1 - screen2 --> lib3 - screen2 --> lib4 - - screen3 --> lib2 - screen3 --> lib3 - screen3 --> lib4 - - screen4 --> lib3 - screen4 --> lib5 - - end - - style sg opacity:0.0 - -``` - -On the other hand, "deep" projects do not offer many opportunities for parallelization. They have -project dependencies which must be built *sequentially*. They also perform poorly in incremental -builds, because a single change to even a mid-level module invalidates cached builds for half of the -project. - -```mermaid -flowchart TB - - style sg opacity:0.0 - subgraph sg [A deep graph] - direction TB - - classDef depth6 fill:#800,stroke:#000,color:#FFF - classDef depth5 fill:#A50,stroke:#000,color:#FFF - classDef depth4 fill:#C0B,stroke:#000,color:#000 - classDef depth3 fill:#F7B,stroke:#000,color:#000 - classDef depth2 fill:#BBF,stroke:#000,color:#000 - classDef depth1 fill:#B9B,stroke:#000,color:#000 - classDef depth0 fill:#FBB,stroke:#000,color:#000 - - linkStyle default stroke-width:2px,fill:none,stroke:green; - - app(depth: 6):::depth6 - - screen1(depth: 5):::depth5 - screen2(depth: 5):::depth5 - - screen3(depth: 4):::depth4 - screen4(depth: 4):::depth4 - - lib1(depth: 3):::depth3 - lib2(depth: 3):::depth3 - - lib3(depth: 2):::depth2 - lib4(depth: 2):::depth2 - - lib5(depth: 1):::depth1 - - lib6(depth: 0):::depth0 - - app --> screen1 - app --> screen2 - app --> screen3 - app --> screen4 - - screen1 --> screen3 - screen1 --> screen4 - - screen2 --> screen4 - - screen3 --> lib1 - screen3 --> lib2 - - screen4 --> lib1 - screen4 --> lib4 - - lib1 --> lib3 - lib1 --> lib4 - - lib2 --> lib3 - - lib3 --> lib5 - lib4 --> lib5 - - lib5 --> lib6 - - end - -``` diff --git a/website/docs/rules/redundant_dependency.md b/website/docs/rules/redundant_dependency.md deleted file mode 100644 index 92a0da6bf7..0000000000 --- a/website/docs/rules/redundant_dependency.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -id: redundant_dependency -slug: /rules/redundant_dependency -title: Redundant Dependency -sidebar_label: Redundant Dependency ---- -:::caution - -This rule creates a brittle dependency graph, because some necessary dependencies are only provided -transitively by other dependencies. Any manual changes to dependencies can have unexpected -consequences downstream. - -This rule is **not recommended** and disabled by default, but it's still available for those who -want to keep their build files as small as possible. - -::: - -Finds project dependencies which are declared as `api` in other dependency projects, but also -declared in the current project. These dependencies can be removed without actually breaking the -build, since they're still provided by an upstream dependency through the `api` configuration. - -```mermaid -flowchart LR - - linkStyle default stroke-width:2px,fill:none,stroke:green; - - classDef depth2 fill:#BBF,stroke:#000,color:#000 - classDef depth1 fill:#B9B,stroke:#000,color:#000 - classDef depth0 fill:#FBB,stroke:#000,color:#000 - - subgraph sg_redundant [A redundant graph] - direction TB - - lib1_redundant(:lib-1):::depth0 - lib2_redundant(:lib-2):::depth1 - app_redundant(:app):::depth2 - - app_redundant --> |api| lib1_redundant - app_redundant --> |api| lib2_redundant - - lib2_redundant --> |api| lib1_redundant - end - - subgraph sg_minimalist [A graph with no redundancy] - direction TB - - lib1_minimalist(:lib-1):::depth0 - lib2_minimalist(:lib-2):::depth1 - app_minimalist(:app):::depth2 - - app_minimalist --> |api| lib2_minimalist - - lib2_minimalist --> |api| lib1_minimalist - end - - style sg_redundant fill:#C66,stroke:#000,color:#FFF - style sg_minimalist fill:#696,stroke:#000,color:#FFF - - sg_redundant --> |./gradlew moduleCheck| sg_minimalist - -``` - -This is the opposite of the [inherited dependency] rule, which ensures a stable graph by explicitly -declaring each dependency. [Inherited dependency] is enabled by default, and is the recommended -approach. Both rules may not be enabled at the same time. - -[Inherited dependency]:inherited_dependency.md diff --git a/website/docs/rules/sorting/sort_dependencies.md b/website/docs/rules/sorting/sort_dependencies.md deleted file mode 100644 index 34e6f7feee..0000000000 --- a/website/docs/rules/sorting/sort_dependencies.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: sort_dependencies -slug: /rules/sort_dependencies -title: Sort Dependencies -sidebar_label: Sort Dependencies ---- diff --git a/website/docs/rules/sorting/sort_plugins.md b/website/docs/rules/sorting/sort_plugins.md deleted file mode 100644 index c293df4633..0000000000 --- a/website/docs/rules/sorting/sort_plugins.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -id: sort_plugins -slug: /rules/sort_plugins -title: Sort Plugins -sidebar_label: Sort Plugins ---- diff --git a/website/docs/rules/unused_dependency.md b/website/docs/rules/unused_dependency.md deleted file mode 100644 index b8285c7c73..0000000000 --- a/website/docs/rules/unused_dependency.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -id: unused_dependency -slug: /rules/unused_dependency -title: Unused Dependency -sidebar_label: Unused Dependency ---- - -Unused module dependencies which are unused create unnecessary bottlenecks in a build task. Instead -of building modules concurrently, Gradle must wait until the dependency module is built before -beginning to build the dependent one. - -ModuleCheck determines whether a dependency is unused by looking for all fully qualified names -declared in its API, then searching the dependent module's code for references to any of those -names. If there are no references, the dependency module is considered to be unused. diff --git a/website/docs/suppressing-findings.mdx b/website/docs/suppressing-findings.mdx deleted file mode 100644 index c3c292c61a..0000000000 --- a/website/docs/suppressing-findings.mdx +++ /dev/null @@ -1,62 +0,0 @@ ---- -id: suppressing-findings -title: Suppressing Findings -sidebar_label: Suppressing Findings ---- - - -import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem'; - -You can disable individual ModuleCheck findings via annotation, just like with any other lint tool. - -The name of the check to disable can be found in the `name` column of console output: - -``` -> Task :moduleCheck -ModuleCheck found 3 issues in 6.157 seconds - -:app - dependency name build file - :fat-and-leaky inherited-dependency /Users//projects/sample/app/build.gradle.kts: (15, 3): - :fat-and-leaky must-be-api /Users//projects/sample/app/build.gradle.kts: (15, 3): - :unused-lib unused-dependency /Users//projects/sample/app/build.gradle.kts: (49, 3): - -``` - - - - - -```kotlin title="build.gradle.kts" -@Suppress("must-be-api") // don't switch anything to an api config -dependencies { - - @Suppress("unused-dependency") // don't comment out or delete this dependency - implementation(project(":unused-lib")) - - @Suppress("inherited-dependency") // don't add dependencies which are inherited from this library - implementation(project(":leaky")) -} -``` - - - - - -```groovy title="build.gradle" -// don't switch anything to an api config -//noinspection must-be-api -dependencies { - - // don't comment out or delete this dependency - //noinspection unused-dependency - implementation(project(":unused-lib")) - - // don't add dependencies which are inherited from this library - //noinspection inherited-dependency - implementation(project(":leaky")) -} -``` - - - diff --git a/website/docusaurus.config.js b/website/docusaurus.config.js deleted file mode 100644 index fe5dc22450..0000000000 --- a/website/docusaurus.config.js +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Copyright (C) 2021-2024 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import mermaid from 'mdx-mermaid'; - -const {themes} = require('prism-react-renderer'); -const lightTheme = themes.github; -const darkTheme = themes.dracula; - -module.exports = { - title: "ModuleCheck", - tagline: "Fast dependency graph linting for Gradle projects", - url: "https://rbusarow.github.io/", - baseUrl: "/ModuleCheck/", - onBrokenLinks: "throw", - onBrokenMarkdownLinks: "throw", - favicon: "img/favicon.ico", - markdown: { - mermaid: true, - }, - themes: ['@docusaurus/theme-mermaid'], - organizationName: "rickbusarow", - projectName: "ModuleCheck", - presets: [ - [ - 'classic', - /** @type {import('@docusaurus/preset-classic').Options} */ - ({ - docs: { - remarkPlugins: [mermaid], - sidebarPath: './sidebars.js', - editUrl: "https://github.com/rbusarow/ModuleCheck/blob/main/website", - }, - blog: { - showReadingTime: true, - editUrl: "https://github.com/rbusarow/ModuleCheck", - }, - theme: { - customCss: './src/css/custom.css', - }, - }), - ], - ], - themeConfig: - /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ - ({ - docs: { - sidebar: { - hideable: true, - } - }, - colorMode: { - defaultMode: "light", - disableSwitch: false, - respectPrefersColorScheme: true, - }, - // announcementBar: {id: "supportus", content: '⭐️ If you like ModuleCheck, give it a star on GitHub! ⭐️',}, - navbar: { - title: "ModuleCheck", - logo: { - alt: 'ModuleCheck Logo', - src: 'img/logo.png', - }, - items: [ - { - type: "doc", - docId: "quickstart", - label: "Docs", - position: "left", - }, - { - to: 'changelog', - label: 'ChangeLog', - position: 'left' - }, - { - to: 'migrations', - label: 'Migrations', - position: 'left' - }, - { - type: "docsVersionDropdown", - position: "left", - dropdownActiveClassDisabled: true, - dropdownItemsAfter: [ - { - to: "/changelog", - label: "CHANGELOG", - }, - ], - }, - { - label: "Api", - href: 'pathname:///api/index.html', - position: "left", - }, - { - label: "GitHub", - href: "https://github.com/rbusarow/ModuleCheck", - position: "right", - }, - ], - }, - footer: { - copyright: `Copyright © ${new Date().getFullYear()} Rick Busarow, Built with Docusaurus.`, - }, - mermaid: { - theme: { - light: 'neutral', - }, - options: {}, - }, - prism: { - theme: lightTheme, - darkTheme: darkTheme, - additionalLanguages: ["kotlin", "groovy", "java"], - }, - algolia: { - // The application ID provided by Algolia - appId: 'D6Z21RYLG1', - - // Public API key: it is safe to commit it - apiKey: '2b25d0dd3470c3fdbe2ffa4e3299b0e9', - - indexName: 'modulecheck', - - // Optional: see doc section below - contextualSearch: true, - - // Optional: Algolia search parameters - searchParameters: {}, - - // Optional: path for search page that enabled by default (`false` to disable it) - searchPagePath: 'search', - - //... other Algolia params - }, - }), -}; diff --git a/website/package.json b/website/package.json deleted file mode 100644 index ad7ea4c817..0000000000 --- a/website/package.json +++ /dev/null @@ -1,52 +0,0 @@ -{ - "name": "modulecheck", - "version": "0.13.0-SNAPSHOT", - "private": true, - "scripts": { - "docusaurus": "docusaurus", - "start": "docusaurus start", - "build": "docusaurus build", - "swizzle": "docusaurus swizzle", - "deploy": "docusaurus deploy", - "clear": "docusaurus clear", - "serve": "docusaurus serve", - "write-translations": "docusaurus write-translations", - "write-heading-ids": "docusaurus write-heading-ids" - }, - "dependencies": { - "@docusaurus/core": "3.8.1", - "@docusaurus/plugin-content-docs": "3.8.1", - "@docusaurus/plugin-content-pages": "3.8.1", - "@docusaurus/plugin-ideal-image": "3.8.1", - "@docusaurus/preset-classic": "3.8.1", - "@docusaurus/remark-plugin-npm2yarn": "3.8.1", - "@docusaurus/theme-classic": "3.8.1", - "@docusaurus/theme-common": "3.8.1", - "@docusaurus/theme-live-codeblock": "3.8.1", - "@docusaurus/theme-mermaid": "3.8.1", - "@mdx-js/react": "3.1.0", - "clsx": "2.1.1", - "mdx-mermaid": "2.0.3", - "mermaid": "11.8.1", - "prism-react-renderer": "^2.3.1", - "react": "19.1.0", - "react-dom": "19.1.0" - }, - "browserslist": { - "production": [ - ">0.5%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 3 chrome version", - "last 3 firefox version", - "last 5 safari version" - ] - }, - "engines": { - "node": ">=18.0" - }, - "main": "index.js", - "license": "MIT" -} diff --git a/website/pnpm-lock.yaml b/website/pnpm-lock.yaml deleted file mode 100644 index 3dd9dbdb2a..0000000000 --- a/website/pnpm-lock.yaml +++ /dev/null @@ -1,13826 +0,0 @@ -lockfileVersion: '9.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -importers: - - .: - dependencies: - '@docusaurus/core': - specifier: 3.8.1 - version: 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-content-docs': - specifier: 3.8.1 - version: 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-content-pages': - specifier: 3.8.1 - version: 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-ideal-image': - specifier: 3.8.1 - version: 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/preset-classic': - specifier: 3.8.1 - version: 3.8.1(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.7.3) - '@docusaurus/remark-plugin-npm2yarn': - specifier: 3.8.1 - version: 3.8.1 - '@docusaurus/theme-classic': - specifier: 3.8.1 - version: 3.8.1(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-common': - specifier: 3.8.1 - version: 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/theme-live-codeblock': - specifier: 3.8.1 - version: 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-mermaid': - specifier: 3.8.1 - version: 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@mdx-js/react': - specifier: 3.1.0 - version: 3.1.0(@types/react@19.0.8)(react@19.1.0) - clsx: - specifier: 2.1.1 - version: 2.1.1 - mdx-mermaid: - specifier: 2.0.3 - version: 2.0.3(mermaid@11.8.1)(react@19.1.0)(typescript@5.7.3)(unist-util-visit@5.0.0) - mermaid: - specifier: 11.8.1 - version: 11.8.1 - prism-react-renderer: - specifier: ^2.3.1 - version: 2.4.1(react@19.1.0) - react: - specifier: 19.1.0 - version: 19.1.0 - react-dom: - specifier: 19.1.0 - version: 19.1.0(react@19.1.0) - -packages: - - '@algolia/autocomplete-core@1.17.9': - resolution: {integrity: sha512-O7BxrpLDPJWWHv/DLA9DRFWs+iY1uOJZkqUwjS5HSZAGcl0hIVCQ97LTLewiZmZ402JYUrun+8NqFP+hCknlbQ==} - - '@algolia/autocomplete-plugin-algolia-insights@1.17.9': - resolution: {integrity: sha512-u1fEHkCbWF92DBeB/KHeMacsjsoI0wFhjZtlCq2ddZbAehshbZST6Hs0Avkc0s+4UyBGbMDnSuXHLuvRWK5iDQ==} - peerDependencies: - search-insights: '>= 1 < 3' - - '@algolia/autocomplete-preset-algolia@1.17.9': - resolution: {integrity: sha512-Na1OuceSJeg8j7ZWn5ssMu/Ax3amtOwk76u4h5J4eK2Nx2KB5qt0Z4cOapCsxot9VcEN11ADV5aUSlQF4RhGjQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/autocomplete-shared@1.17.9': - resolution: {integrity: sha512-iDf05JDQ7I0b7JEA/9IektxN/80a2MZ1ToohfmNS3rfeuQnIKI3IJlIafD0xu4StbtQTghx9T3Maa97ytkXenQ==} - peerDependencies: - '@algolia/client-search': '>= 4.9.1 < 6' - algoliasearch: '>= 4.9.1 < 6' - - '@algolia/client-abtesting@5.20.0': - resolution: {integrity: sha512-YaEoNc1Xf2Yk6oCfXXkZ4+dIPLulCx8Ivqj0OsdkHWnsI3aOJChY5qsfyHhDBNSOhqn2ilgHWxSfyZrjxBcAww==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-analytics@5.20.0': - resolution: {integrity: sha512-CIT9ni0+5sYwqehw+t5cesjho3ugKQjPVy/iPiJvtJX4g8Cdb6je6SPt2uX72cf2ISiXCAX9U3cY0nN0efnRDw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-common@5.20.0': - resolution: {integrity: sha512-iSTFT3IU8KNpbAHcBUJw2HUrPnMXeXLyGajmCL7gIzWOsYM4GabZDHXOFx93WGiXMti1dymz8k8R+bfHv1YZmA==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-insights@5.20.0': - resolution: {integrity: sha512-w9RIojD45z1csvW1vZmAko82fqE/Dm+Ovsy2ElTsjFDB0HMAiLh2FO86hMHbEXDPz6GhHKgGNmBRiRP8dDPgJg==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-personalization@5.20.0': - resolution: {integrity: sha512-p/hftHhrbiHaEcxubYOzqVV4gUqYWLpTwK+nl2xN3eTrSW9SNuFlAvUBFqPXSVBqc6J5XL9dNKn3y8OA1KElSQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-query-suggestions@5.20.0': - resolution: {integrity: sha512-m4aAuis5vZi7P4gTfiEs6YPrk/9hNTESj3gEmGFgfJw3hO2ubdS4jSId1URd6dGdt0ax2QuapXufcrN58hPUcw==} - engines: {node: '>= 14.0.0'} - - '@algolia/client-search@5.20.0': - resolution: {integrity: sha512-KL1zWTzrlN4MSiaK1ea560iCA/UewMbS4ZsLQRPoDTWyrbDKVbztkPwwv764LAqgXk0fvkNZvJ3IelcK7DqhjQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/events@4.0.1': - resolution: {integrity: sha512-FQzvOCgoFXAbf5Y6mYozw2aj5KCJoA3m4heImceldzPSMbdyS4atVjJzXKMsfX3wnZTFYwkkt8/z8UesLHlSBQ==} - - '@algolia/ingestion@1.20.0': - resolution: {integrity: sha512-shj2lTdzl9un4XJblrgqg54DoK6JeKFO8K8qInMu4XhE2JuB8De6PUuXAQwiRigZupbI0xq8aM0LKdc9+qiLQA==} - engines: {node: '>= 14.0.0'} - - '@algolia/monitoring@1.20.0': - resolution: {integrity: sha512-aF9blPwOhKtWvkjyyXh9P5peqmhCA1XxLBRgItT+K6pbT0q4hBDQrCid+pQZJYy4HFUKjB/NDDwyzFhj/rwKhw==} - engines: {node: '>= 14.0.0'} - - '@algolia/recommend@5.20.0': - resolution: {integrity: sha512-T6B/WPdZR3b89/F9Vvk6QCbt/wrLAtrGoL8z4qPXDFApQ8MuTFWbleN/4rHn6APWO3ps+BUePIEbue2rY5MlRw==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-browser-xhr@5.20.0': - resolution: {integrity: sha512-t6//lXsq8E85JMenHrI6mhViipUT5riNhEfCcvtRsTV+KIBpC6Od18eK864dmBhoc5MubM0f+sGpKOqJIlBSCg==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-fetch@5.20.0': - resolution: {integrity: sha512-FHxYGqRY+6bgjKsK4aUsTAg6xMs2S21elPe4Y50GB0Y041ihvw41Vlwy2QS6K9ldoftX4JvXodbKTcmuQxywdQ==} - engines: {node: '>= 14.0.0'} - - '@algolia/requester-node-http@5.20.0': - resolution: {integrity: sha512-kmtQClq/w3vtPteDSPvaW9SPZL/xrIgMrxZyAgsFwrJk0vJxqyC5/hwHmrCraDnStnGSADnLpBf4SpZnwnkwWw==} - engines: {node: '>= 14.0.0'} - - '@ampproject/remapping@2.2.1': - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - - '@antfu/install-pkg@0.4.1': - resolution: {integrity: sha512-T7yB5QNG29afhWVkVq7XeIMBa5U/vs9mX69YqayXypPRmYzUmzwnYltplHmPtZ4HPCn+sQKeXW8I47wCbuBOjw==} - - '@antfu/utils@0.7.10': - resolution: {integrity: sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==} - - '@babel/code-frame@7.26.2': - resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==} - engines: {node: '>=6.9.0'} - - '@babel/compat-data@7.26.5': - resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==} - engines: {node: '>=6.9.0'} - - '@babel/core@7.26.0': - resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==} - engines: {node: '>=6.9.0'} - - '@babel/generator@7.26.5': - resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-annotate-as-pure@7.25.9': - resolution: {integrity: sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==} - engines: {node: '>=6.9.0'} - - '@babel/helper-compilation-targets@7.26.5': - resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-create-class-features-plugin@7.25.9': - resolution: {integrity: sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-create-regexp-features-plugin@7.26.3': - resolution: {integrity: sha512-G7ZRb40uUgdKOQqPLjfD12ZmGA54PzqDFUv2BKImnC9QIfGhIHKvVML0oN8IUiDq4iRqpq74ABpvOaerfWdong==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-define-polyfill-provider@0.6.3': - resolution: {integrity: sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - '@babel/helper-member-expression-to-functions@7.25.9': - resolution: {integrity: sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-imports@7.25.9': - resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-module-transforms@7.26.0': - resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-optimise-call-expression@7.25.9': - resolution: {integrity: sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-plugin-utils@7.26.5': - resolution: {integrity: sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==} - engines: {node: '>=6.9.0'} - - '@babel/helper-remap-async-to-generator@7.25.9': - resolution: {integrity: sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-replace-supers@7.26.5': - resolution: {integrity: sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - resolution: {integrity: sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-string-parser@7.25.9': - resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-identifier@7.25.9': - resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==} - engines: {node: '>=6.9.0'} - - '@babel/helper-validator-option@7.25.9': - resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==} - engines: {node: '>=6.9.0'} - - '@babel/helper-wrap-function@7.25.9': - resolution: {integrity: sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==} - engines: {node: '>=6.9.0'} - - '@babel/helpers@7.26.0': - resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==} - engines: {node: '>=6.9.0'} - - '@babel/parser@7.26.5': - resolution: {integrity: sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==} - engines: {node: '>=6.0.0'} - hasBin: true - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9': - resolution: {integrity: sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9': - resolution: {integrity: sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9': - resolution: {integrity: sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9': - resolution: {integrity: sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.13.0 - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9': - resolution: {integrity: sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2': - resolution: {integrity: sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-dynamic-import@7.8.3': - resolution: {integrity: sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-assertions@7.26.0': - resolution: {integrity: sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-import-attributes@7.26.0': - resolution: {integrity: sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-jsx@7.25.9': - resolution: {integrity: sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-typescript@7.25.9': - resolution: {integrity: sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6': - resolution: {integrity: sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-arrow-functions@7.25.9': - resolution: {integrity: sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-generator-functions@7.25.9': - resolution: {integrity: sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-async-to-generator@7.25.9': - resolution: {integrity: sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoped-functions@7.26.5': - resolution: {integrity: sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-block-scoping@7.25.9': - resolution: {integrity: sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-properties@7.25.9': - resolution: {integrity: sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-class-static-block@7.26.0': - resolution: {integrity: sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - - '@babel/plugin-transform-classes@7.25.9': - resolution: {integrity: sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-computed-properties@7.25.9': - resolution: {integrity: sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-destructuring@7.25.9': - resolution: {integrity: sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-dotall-regex@7.25.9': - resolution: {integrity: sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-keys@7.25.9': - resolution: {integrity: sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-dynamic-import@7.25.9': - resolution: {integrity: sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-exponentiation-operator@7.26.3': - resolution: {integrity: sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-export-namespace-from@7.25.9': - resolution: {integrity: sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-for-of@7.25.9': - resolution: {integrity: sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-function-name@7.25.9': - resolution: {integrity: sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-json-strings@7.25.9': - resolution: {integrity: sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-literals@7.25.9': - resolution: {integrity: sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9': - resolution: {integrity: sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-member-expression-literals@7.25.9': - resolution: {integrity: sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-amd@7.25.9': - resolution: {integrity: sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-commonjs@7.26.3': - resolution: {integrity: sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-systemjs@7.25.9': - resolution: {integrity: sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-modules-umd@7.25.9': - resolution: {integrity: sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9': - resolution: {integrity: sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-new-target@7.25.9': - resolution: {integrity: sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6': - resolution: {integrity: sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-numeric-separator@7.25.9': - resolution: {integrity: sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-super@7.25.9': - resolution: {integrity: sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-catch-binding@7.25.9': - resolution: {integrity: sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-optional-chaining@7.25.9': - resolution: {integrity: sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-parameters@7.25.9': - resolution: {integrity: sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-methods@7.25.9': - resolution: {integrity: sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-private-property-in-object@7.25.9': - resolution: {integrity: sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-property-literals@7.25.9': - resolution: {integrity: sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-constant-elements@7.23.3': - resolution: {integrity: sha512-zP0QKq/p6O42OL94udMgSfKXyse4RyJ0JqbQ34zDAONWjyrEsghYEyTSK5FIpmXmCpB55SHokL1cRRKHv8L2Qw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-display-name@7.25.9': - resolution: {integrity: sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx-development@7.25.9': - resolution: {integrity: sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-jsx@7.25.9': - resolution: {integrity: sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-react-pure-annotations@7.25.9': - resolution: {integrity: sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regenerator@7.25.9': - resolution: {integrity: sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-regexp-modifiers@7.26.0': - resolution: {integrity: sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/plugin-transform-reserved-words@7.25.9': - resolution: {integrity: sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-runtime@7.25.9': - resolution: {integrity: sha512-nZp7GlEl+yULJrClz0SwHPqir3lc0zsPrDHQUcxGspSL7AKrexNSEfTbfqnDNJUO13bgKyfuOLMF8Xqtu8j3YQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-shorthand-properties@7.25.9': - resolution: {integrity: sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-spread@7.25.9': - resolution: {integrity: sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-sticky-regex@7.25.9': - resolution: {integrity: sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-template-literals@7.25.9': - resolution: {integrity: sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typeof-symbol@7.25.9': - resolution: {integrity: sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-typescript@7.26.5': - resolution: {integrity: sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-escapes@7.25.9': - resolution: {integrity: sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-property-regex@7.25.9': - resolution: {integrity: sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-regex@7.25.9': - resolution: {integrity: sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9': - resolution: {integrity: sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - - '@babel/preset-env@7.26.0': - resolution: {integrity: sha512-H84Fxq0CQJNdPFT2DrfnylZ3cf5K43rGfWK4LJGPpjKHiZlk0/RzwEus3PDDZZg+/Er7lCA03MVacueUuXdzfw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-modules@0.1.6-no-external-plugins': - resolution: {integrity: sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==} - peerDependencies: - '@babel/core': ^7.0.0-0 || ^8.0.0-0 <8.0.0 - - '@babel/preset-react@7.26.3': - resolution: {integrity: sha512-Nl03d6T9ky516DGK2YMxrTqvnpUW63TnJMOMonj+Zae0JiPC5BC9xPMSL6L8fiSpA5vP88qfygavVQvnLp+6Cw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/preset-typescript@7.26.0': - resolution: {integrity: sha512-NMk1IGZ5I/oHhoXEElcm+xUnL/szL6xflkFZmoEU9xj1qSJXpiS7rsspYo92B4DRCDvZn2erT5LdsCeXAKNCkg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/runtime-corejs3@7.26.0': - resolution: {integrity: sha512-YXHu5lN8kJCb1LOb9PgV6pvak43X2h4HvRApcN5SdWeaItQOzfn1hgP6jasD6KWQyJDBxrVmA9o9OivlnNJK/w==} - engines: {node: '>=6.9.0'} - - '@babel/runtime@7.26.0': - resolution: {integrity: sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==} - engines: {node: '>=6.9.0'} - - '@babel/template@7.25.9': - resolution: {integrity: sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==} - engines: {node: '>=6.9.0'} - - '@babel/traverse@7.26.5': - resolution: {integrity: sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==} - engines: {node: '>=6.9.0'} - - '@babel/types@7.26.5': - resolution: {integrity: sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==} - engines: {node: '>=6.9.0'} - - '@braintree/sanitize-url@7.1.1': - resolution: {integrity: sha512-i1L7noDNxtFyL5DmZafWy1wRVhGehQmzZaz1HiN5e7iylJMSZR7ekOV7NsIqa5qBldlLrsKv4HbgFUVlQrz8Mw==} - - '@chevrotain/cst-dts-gen@11.0.3': - resolution: {integrity: sha512-BvIKpRLeS/8UbfxXxgC33xOumsacaeCKAjAeLyOn7Pcp95HiRbrpl14S+9vaZLolnbssPIUuiUd8IvgkRyt6NQ==} - - '@chevrotain/gast@11.0.3': - resolution: {integrity: sha512-+qNfcoNk70PyS/uxmj3li5NiECO+2YKZZQMbmjTqRI3Qchu8Hig/Q9vgkHpI3alNjr7M+a2St5pw5w5F6NL5/Q==} - - '@chevrotain/regexp-to-ast@11.0.3': - resolution: {integrity: sha512-1fMHaBZxLFvWI067AVbGJav1eRY7N8DDvYCTwGBiE/ytKBgP8azTdgyrKyWZ9Mfh09eHWb5PgTSO8wi7U824RA==} - - '@chevrotain/types@11.0.3': - resolution: {integrity: sha512-gsiM3G8b58kZC2HaWR50gu6Y1440cHiJ+i3JUvcp/35JchYejb2+5MVeJK0iKThYpAa/P2PYFV4hoi44HD+aHQ==} - - '@chevrotain/utils@11.0.3': - resolution: {integrity: sha512-YslZMgtJUyuMbZ+aKvfF3x1f5liK4mWNxghFRv7jqRR9C3R3fAOGTTKvxXDa2Y1s9zSbcpuO0cAxDYsc9SrXoQ==} - - '@colors/colors@1.5.0': - resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} - engines: {node: '>=0.1.90'} - - '@csstools/cascade-layer-name-parser@2.0.5': - resolution: {integrity: sha512-p1ko5eHgV+MgXFVa4STPKpvPxr6ReS8oS2jzTukjR74i5zJNyWO1ZM1m8YKBXnzDKWfBN1ztLYlHxbVemDD88A==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/color-helpers@5.0.2': - resolution: {integrity: sha512-JqWH1vsgdGcw2RR6VliXXdA0/59LttzlU8UlRT/iUUsEeWfYq8I+K0yhihEUTTHLRm1EXvpsCx3083EU15ecsA==} - engines: {node: '>=18'} - - '@csstools/css-calc@2.1.4': - resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-color-parser@3.0.10': - resolution: {integrity: sha512-TiJ5Ajr6WRd1r8HSiwJvZBiJOqtH86aHpUjq5aEKWHiII2Qfjqd/HCWKPOW8EP4vcspXbHnXrwIDlu5savQipg==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-parser-algorithms@3.0.5': - resolution: {integrity: sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/css-tokenizer@3.0.4': - resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} - engines: {node: '>=18'} - - '@csstools/media-query-list-parser@4.0.3': - resolution: {integrity: sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==} - engines: {node: '>=18'} - peerDependencies: - '@csstools/css-parser-algorithms': ^3.0.5 - '@csstools/css-tokenizer': ^3.0.4 - - '@csstools/postcss-cascade-layers@5.0.1': - resolution: {integrity: sha512-XOfhI7GShVcKiKwmPAnWSqd2tBR0uxt+runAxttbSp/LY2U16yAVPmAf7e9q4JJ0d+xMNmpwNDLBXnmRCl3HMQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-color-function@4.0.10': - resolution: {integrity: sha512-4dY0NBu7NVIpzxZRgh/Q/0GPSz/jLSw0i/u3LTUor0BkQcz/fNhN10mSWBDsL0p9nDb0Ky1PD6/dcGbhACuFTQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-color-mix-function@3.0.10': - resolution: {integrity: sha512-P0lIbQW9I4ShE7uBgZRib/lMTf9XMjJkFl/d6w4EMNHu2qvQ6zljJGEcBkw/NsBtq/6q3WrmgxSS8kHtPMkK4Q==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-color-mix-variadic-function-arguments@1.0.0': - resolution: {integrity: sha512-Z5WhouTyD74dPFPrVE7KydgNS9VvnjB8qcdes9ARpCOItb4jTnm7cHp4FhxCRUoyhabD0WVv43wbkJ4p8hLAlQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-content-alt-text@2.0.6': - resolution: {integrity: sha512-eRjLbOjblXq+byyaedQRSrAejKGNAFued+LcbzT+LCL78fabxHkxYjBbxkroONxHHYu2qxhFK2dBStTLPG3jpQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-exponential-functions@2.0.9': - resolution: {integrity: sha512-abg2W/PI3HXwS/CZshSa79kNWNZHdJPMBXeZNyPQFbbj8sKO3jXxOt/wF7juJVjyDTc6JrvaUZYFcSBZBhaxjw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-font-format-keywords@4.0.0': - resolution: {integrity: sha512-usBzw9aCRDvchpok6C+4TXC57btc4bJtmKQWOHQxOVKen1ZfVqBUuCZ/wuqdX5GHsD0NRSr9XTP+5ID1ZZQBXw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-gamut-mapping@2.0.10': - resolution: {integrity: sha512-QDGqhJlvFnDlaPAfCYPsnwVA6ze+8hhrwevYWlnUeSjkkZfBpcCO42SaUD8jiLlq7niouyLgvup5lh+f1qessg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-gradients-interpolation-method@5.0.10': - resolution: {integrity: sha512-HHPauB2k7Oits02tKFUeVFEU2ox/H3OQVrP3fSOKDxvloOikSal+3dzlyTZmYsb9FlY9p5EUpBtz0//XBmy+aw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-hwb-function@4.0.10': - resolution: {integrity: sha512-nOKKfp14SWcdEQ++S9/4TgRKchooLZL0TUFdun3nI4KPwCjETmhjta1QT4ICQcGVWQTvrsgMM/aLB5We+kMHhQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-ic-unit@4.0.2': - resolution: {integrity: sha512-lrK2jjyZwh7DbxaNnIUjkeDmU8Y6KyzRBk91ZkI5h8nb1ykEfZrtIVArdIjX4DHMIBGpdHrgP0n4qXDr7OHaKA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-initial@2.0.1': - resolution: {integrity: sha512-L1wLVMSAZ4wovznquK0xmC7QSctzO4D0Is590bxpGqhqjboLXYA16dWZpfwImkdOgACdQ9PqXsuRroW6qPlEsg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-is-pseudo-class@5.0.1': - resolution: {integrity: sha512-JLp3POui4S1auhDR0n8wHd/zTOWmMsmK3nQd3hhL6FhWPaox5W7j1se6zXOG/aP07wV2ww0lxbKYGwbBszOtfQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-light-dark-function@2.0.9': - resolution: {integrity: sha512-1tCZH5bla0EAkFAI2r0H33CDnIBeLUaJh1p+hvvsylJ4svsv2wOmJjJn+OXwUZLXef37GYbRIVKX+X+g6m+3CQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-logical-float-and-clear@3.0.0': - resolution: {integrity: sha512-SEmaHMszwakI2rqKRJgE+8rpotFfne1ZS6bZqBoQIicFyV+xT1UF42eORPxJkVJVrH9C0ctUgwMSn3BLOIZldQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-logical-overflow@2.0.0': - resolution: {integrity: sha512-spzR1MInxPuXKEX2csMamshR4LRaSZ3UXVaRGjeQxl70ySxOhMpP2252RAFsg8QyyBXBzuVOOdx1+bVO5bPIzA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-logical-overscroll-behavior@2.0.0': - resolution: {integrity: sha512-e/webMjoGOSYfqLunyzByZj5KKe5oyVg/YSbie99VEaSDE2kimFm0q1f6t/6Jo+VVCQ/jbe2Xy+uX+C4xzWs4w==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-logical-resize@3.0.0': - resolution: {integrity: sha512-DFbHQOFW/+I+MY4Ycd/QN6Dg4Hcbb50elIJCfnwkRTCX05G11SwViI5BbBlg9iHRl4ytB7pmY5ieAFk3ws7yyg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-logical-viewport-units@3.0.4': - resolution: {integrity: sha512-q+eHV1haXA4w9xBwZLKjVKAWn3W2CMqmpNpZUk5kRprvSiBEGMgrNH3/sJZ8UA3JgyHaOt3jwT9uFa4wLX4EqQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-media-minmax@2.0.9': - resolution: {integrity: sha512-af9Qw3uS3JhYLnCbqtZ9crTvvkR+0Se+bBqSr7ykAnl9yKhk6895z9rf+2F4dClIDJWxgn0iZZ1PSdkhrbs2ig==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5': - resolution: {integrity: sha512-zhAe31xaaXOY2Px8IYfoVTB3wglbJUVigGphFLj6exb7cjZRH9A6adyE22XfFK3P2PzwRk0VDeTJmaxpluyrDg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-nested-calc@4.0.0': - resolution: {integrity: sha512-jMYDdqrQQxE7k9+KjstC3NbsmC063n1FTPLCgCRS2/qHUbHM0mNy9pIn4QIiQGs9I/Bg98vMqw7mJXBxa0N88A==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-normalize-display-values@4.0.0': - resolution: {integrity: sha512-HlEoG0IDRoHXzXnkV4in47dzsxdsjdz6+j7MLjaACABX2NfvjFS6XVAnpaDyGesz9gK2SC7MbNwdCHusObKJ9Q==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-oklab-function@4.0.10': - resolution: {integrity: sha512-ZzZUTDd0fgNdhv8UUjGCtObPD8LYxMH+MJsW9xlZaWTV8Ppr4PtxlHYNMmF4vVWGl0T6f8tyWAKjoI6vePSgAg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-progressive-custom-properties@4.1.0': - resolution: {integrity: sha512-YrkI9dx8U4R8Sz2EJaoeD9fI7s7kmeEBfmO+UURNeL6lQI7VxF6sBE+rSqdCBn4onwqmxFdBU3lTwyYb/lCmxA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-random-function@2.0.1': - resolution: {integrity: sha512-q+FQaNiRBhnoSNo+GzqGOIBKoHQ43lYz0ICrV+UudfWnEF6ksS6DsBIJSISKQT2Bvu3g4k6r7t0zYrk5pDlo8w==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-relative-color-syntax@3.0.10': - resolution: {integrity: sha512-8+0kQbQGg9yYG8hv0dtEpOMLwB9M+P7PhacgIzVzJpixxV4Eq9AUQtQw8adMmAJU1RBBmIlpmtmm3XTRd/T00g==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-scope-pseudo-class@4.0.1': - resolution: {integrity: sha512-IMi9FwtH6LMNuLea1bjVMQAsUhFxJnyLSgOp/cpv5hrzWmrUYU5fm0EguNDIIOHUqzXode8F/1qkC/tEo/qN8Q==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-sign-functions@1.1.4': - resolution: {integrity: sha512-P97h1XqRPcfcJndFdG95Gv/6ZzxUBBISem0IDqPZ7WMvc/wlO+yU0c5D/OCpZ5TJoTt63Ok3knGk64N+o6L2Pg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-stepped-value-functions@4.0.9': - resolution: {integrity: sha512-h9btycWrsex4dNLeQfyU3y3w40LMQooJWFMm/SK9lrKguHDcFl4VMkncKKoXi2z5rM9YGWbUQABI8BT2UydIcA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-text-decoration-shorthand@4.0.2': - resolution: {integrity: sha512-8XvCRrFNseBSAGxeaVTaNijAu+FzUvjwFXtcrynmazGb/9WUdsPCpBX+mHEHShVRq47Gy4peYAoxYs8ltUnmzA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-trigonometric-functions@4.0.9': - resolution: {integrity: sha512-Hnh5zJUdpNrJqK9v1/E3BbrQhaDTj5YiX7P61TOvUhoDHnUmsNNxcDAgkQ32RrcWx9GVUvfUNPcUkn8R3vIX6A==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/postcss-unset-value@4.0.0': - resolution: {integrity: sha512-cBz3tOCI5Fw6NIFEwU3RiwK6mn3nKegjpJuzCndoGq3BZPkUjnsq7uQmIeMNeMbMk7YD2MfKcgCpZwX5jyXqCA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@csstools/selector-resolve-nested@3.0.0': - resolution: {integrity: sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==} - engines: {node: '>=18'} - peerDependencies: - postcss-selector-parser: ^7.0.0 - - '@csstools/selector-specificity@5.0.0': - resolution: {integrity: sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==} - engines: {node: '>=18'} - peerDependencies: - postcss-selector-parser: ^7.0.0 - - '@csstools/utilities@2.0.0': - resolution: {integrity: sha512-5VdOr0Z71u+Yp3ozOx8T11N703wIFGVRgOWbOZMKgglPJsWA54MRIoMNVMa7shUToIhx5J8vX4sOZgD2XiihiQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - '@discoveryjs/json-ext@0.5.7': - resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} - engines: {node: '>=10.0.0'} - - '@docsearch/css@3.9.0': - resolution: {integrity: sha512-cQbnVbq0rrBwNAKegIac/t6a8nWoUAn8frnkLFW6YARaRmAQr5/Eoe6Ln2fqkUCZ40KpdrKbpSAmgrkviOxuWA==} - - '@docsearch/react@3.9.0': - resolution: {integrity: sha512-mb5FOZYZIkRQ6s/NWnM98k879vu5pscWqTLubLFBO87igYYT4VzVazh4h5o/zCvTIZgEt3PvsCOMOswOUo9yHQ==} - peerDependencies: - '@types/react': '>= 16.8.0 < 20.0.0' - react: '>= 16.8.0 < 20.0.0' - react-dom: '>= 16.8.0 < 20.0.0' - search-insights: '>= 1 < 3' - peerDependenciesMeta: - '@types/react': - optional: true - react: - optional: true - react-dom: - optional: true - search-insights: - optional: true - - '@docusaurus/babel@3.8.1': - resolution: {integrity: sha512-3brkJrml8vUbn9aeoZUlJfsI/GqyFcDgQJwQkmBtclJgWDEQBKKeagZfOgx0WfUQhagL1sQLNW0iBdxnI863Uw==} - engines: {node: '>=18.0'} - - '@docusaurus/bundler@3.8.1': - resolution: {integrity: sha512-/z4V0FRoQ0GuSLToNjOSGsk6m2lQUG4FRn8goOVoZSRsTrU8YR2aJacX5K3RG18EaX9b+52pN4m1sL3MQZVsQA==} - engines: {node: '>=18.0'} - peerDependencies: - '@docusaurus/faster': '*' - peerDependenciesMeta: - '@docusaurus/faster': - optional: true - - '@docusaurus/core@3.8.1': - resolution: {integrity: sha512-ENB01IyQSqI2FLtOzqSI3qxG2B/jP4gQPahl2C3XReiLebcVh5B5cB9KYFvdoOqOWPyr5gXK4sjgTKv7peXCrA==} - engines: {node: '>=18.0'} - hasBin: true - peerDependencies: - '@mdx-js/react': ^3.0.0 - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/cssnano-preset@3.8.1': - resolution: {integrity: sha512-G7WyR2N6SpyUotqhGznERBK+x84uyhfMQM2MmDLs88bw4Flom6TY46HzkRkSEzaP9j80MbTN8naiL1fR17WQug==} - engines: {node: '>=18.0'} - - '@docusaurus/logger@3.8.1': - resolution: {integrity: sha512-2wjeGDhKcExEmjX8k1N/MRDiPKXGF2Pg+df/bDDPnnJWHXnVEZxXj80d6jcxp1Gpnksl0hF8t/ZQw9elqj2+ww==} - engines: {node: '>=18.0'} - - '@docusaurus/lqip-loader@3.8.1': - resolution: {integrity: sha512-wSc/TDw6TjKle9MnFO4yqbc9120GIt6YIMT5obqThGcDcBXtkwUsSnw0ghEk22VXqAsgAxD/cGCp6O0SegRtYA==} - engines: {node: '>=18.0'} - - '@docusaurus/mdx-loader@3.8.1': - resolution: {integrity: sha512-DZRhagSFRcEq1cUtBMo4TKxSNo/W6/s44yhr8X+eoXqCLycFQUylebOMPseHi5tc4fkGJqwqpWJLz6JStU9L4w==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/module-type-aliases@3.8.1': - resolution: {integrity: sha512-6xhvAJiXzsaq3JdosS7wbRt/PwEPWHr9eM4YNYqVlbgG1hSK3uQDXTVvQktasp3VO6BmfYWPozueLWuj4gB+vg==} - peerDependencies: - react: '*' - react-dom: '*' - - '@docusaurus/plugin-content-blog@3.8.1': - resolution: {integrity: sha512-vNTpMmlvNP9n3hGEcgPaXyvTljanAKIUkuG9URQ1DeuDup0OR7Ltvoc8yrmH+iMZJbcQGhUJF+WjHLwuk8HSdw==} - engines: {node: '>=18.0'} - peerDependencies: - '@docusaurus/plugin-content-docs': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-content-docs@3.8.1': - resolution: {integrity: sha512-oByRkSZzeGNQByCMaX+kif5Nl2vmtj2IHQI2fWjCfCootsdKZDPFLonhIp5s3IGJO7PLUfe0POyw0Xh/RrGXJA==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-content-pages@3.8.1': - resolution: {integrity: sha512-a+V6MS2cIu37E/m7nDJn3dcxpvXb6TvgdNI22vJX8iUTp8eoMoPa0VArEbWvCxMY/xdC26WzNv4wZ6y0iIni/w==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-css-cascade-layers@3.8.1': - resolution: {integrity: sha512-VQ47xRxfNKjHS5ItzaVXpxeTm7/wJLFMOPo1BkmoMG4Cuz4nuI+Hs62+RMk1OqVog68Swz66xVPK8g9XTrBKRw==} - engines: {node: '>=18.0'} - - '@docusaurus/plugin-debug@3.8.1': - resolution: {integrity: sha512-nT3lN7TV5bi5hKMB7FK8gCffFTBSsBsAfV84/v293qAmnHOyg1nr9okEw8AiwcO3bl9vije5nsUvP0aRl2lpaw==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-google-analytics@3.8.1': - resolution: {integrity: sha512-Hrb/PurOJsmwHAsfMDH6oVpahkEGsx7F8CWMjyP/dw1qjqmdS9rcV1nYCGlM8nOtD3Wk/eaThzUB5TSZsGz+7Q==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-google-gtag@3.8.1': - resolution: {integrity: sha512-tKE8j1cEZCh8KZa4aa80zpSTxsC2/ZYqjx6AAfd8uA8VHZVw79+7OTEP2PoWi0uL5/1Is0LF5Vwxd+1fz5HlKg==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-google-tag-manager@3.8.1': - resolution: {integrity: sha512-iqe3XKITBquZq+6UAXdb1vI0fPY5iIOitVjPQ581R1ZKpHr0qe+V6gVOrrcOHixPDD/BUKdYwkxFjpNiEN+vBw==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-ideal-image@3.8.1': - resolution: {integrity: sha512-Y+ts2dAvBFqLjt5VjpEn15Ct4D93RyZXcpdU3gtrrQETg2V2aSRP4jOXexoUzJACIOG5IWjEXCUeaoVT9o7GFQ==} - engines: {node: '>=18.0'} - peerDependencies: - jimp: '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - peerDependenciesMeta: - jimp: - optional: true - - '@docusaurus/plugin-sitemap@3.8.1': - resolution: {integrity: sha512-+9YV/7VLbGTq8qNkjiugIelmfUEVkTyLe6X8bWq7K5qPvGXAjno27QAfFq63mYfFFbJc7z+pudL63acprbqGzw==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/plugin-svgr@3.8.1': - resolution: {integrity: sha512-rW0LWMDsdlsgowVwqiMb/7tANDodpy1wWPwCcamvhY7OECReN3feoFwLjd/U4tKjNY3encj0AJSTxJA+Fpe+Gw==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/preset-classic@3.8.1': - resolution: {integrity: sha512-yJSjYNHXD8POMGc2mKQuj3ApPrN+eG0rO1UPgSx7jySpYU+n4WjBikbrA2ue5ad9A7aouEtMWUoiSRXTH/g7KQ==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/react-loadable@6.0.0': - resolution: {integrity: sha512-YMMxTUQV/QFSnbgrP3tjDzLHRg7vsbMn8e9HAa8o/1iXoiomo48b7sk/kkmWEuWNDPJVlKSJRB6Y2fHqdJk+SQ==} - peerDependencies: - react: '*' - - '@docusaurus/remark-plugin-npm2yarn@3.8.1': - resolution: {integrity: sha512-lrws3n7jyJrDKqpdFiEX0ZIwVOgGj9z+ZXf0k/rXrftcNh06Y+cEMnNVoNpO3EJKiLDXmTWoxGf/I1qWb/WV6g==} - engines: {node: '>=18.0'} - - '@docusaurus/responsive-loader@1.7.0': - resolution: {integrity: sha512-N0cWuVqTRXRvkBxeMQcy/OF2l7GN8rmni5EzR3HpwR+iU2ckYPnziceojcxvvxQ5NqZg1QfEW0tycQgHp+e+Nw==} - engines: {node: '>=12'} - peerDependencies: - jimp: '*' - sharp: '*' - peerDependenciesMeta: - jimp: - optional: true - sharp: - optional: true - - '@docusaurus/theme-classic@3.8.1': - resolution: {integrity: sha512-bqDUCNqXeYypMCsE1VcTXSI1QuO4KXfx8Cvl6rYfY0bhhqN6d2WZlRkyLg/p6pm+DzvanqHOyYlqdPyP0iz+iw==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/theme-common@3.8.1': - resolution: {integrity: sha512-UswMOyTnPEVRvN5Qzbo+l8k4xrd5fTFu2VPPfD6FcW/6qUtVLmJTQCktbAL3KJ0BVXGm5aJXz/ZrzqFuZERGPw==} - engines: {node: '>=18.0'} - peerDependencies: - '@docusaurus/plugin-content-docs': '*' - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/theme-live-codeblock@3.8.1': - resolution: {integrity: sha512-TuCdnbJdTCAR4xv/dEU9m299/+hr+DrxQnQyK1mAmxnvWM/KrfaWdKMfjJ9h4hHa54ctPGm6ykdTvZic0GWdIw==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/theme-mermaid@3.8.1': - resolution: {integrity: sha512-IWYqjyTPjkNnHsFFu9+4YkeXS7PD1xI3Bn2shOhBq+f95mgDfWInkpfBN4aYvx4fTT67Am6cPtohRdwh4Tidtg==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/theme-search-algolia@3.8.1': - resolution: {integrity: sha512-NBFH5rZVQRAQM087aYSRKQ9yGEK9eHd+xOxQjqNpxMiV85OhJDD4ZGz6YJIod26Fbooy54UWVdzNU0TFeUUUzQ==} - engines: {node: '>=18.0'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/theme-translations@3.8.1': - resolution: {integrity: sha512-OTp6eebuMcf2rJt4bqnvuwmm3NVXfzfYejL+u/Y1qwKhZPrjPoKWfk1CbOP5xH5ZOPkiAsx4dHdQBRJszK3z2g==} - engines: {node: '>=18.0'} - - '@docusaurus/types@3.8.1': - resolution: {integrity: sha512-ZPdW5AB+pBjiVrcLuw3dOS6BFlrG0XkS2lDGsj8TizcnREQg3J8cjsgfDviszOk4CweNfwo1AEELJkYaMUuOPg==} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - react-dom: ^18.0.0 || ^19.0.0 - - '@docusaurus/utils-common@3.8.1': - resolution: {integrity: sha512-zTZiDlvpvoJIrQEEd71c154DkcriBecm4z94OzEE9kz7ikS3J+iSlABhFXM45mZ0eN5pVqqr7cs60+ZlYLewtg==} - engines: {node: '>=18.0'} - - '@docusaurus/utils-validation@3.8.1': - resolution: {integrity: sha512-gs5bXIccxzEbyVecvxg6upTwaUbfa0KMmTj7HhHzc016AGyxH2o73k1/aOD0IFrdCsfJNt37MqNI47s2MgRZMA==} - engines: {node: '>=18.0'} - - '@docusaurus/utils@3.8.1': - resolution: {integrity: sha512-P1ml0nvOmEFdmu0smSXOqTS1sxU5tqvnc0dA4MTKV39kye+bhQnjkIKEE18fNOvxjyB86k8esoCIFM3x4RykOQ==} - engines: {node: '>=18.0'} - - '@hapi/hoek@9.3.0': - resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} - - '@hapi/topo@5.1.0': - resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} - - '@iconify/types@2.0.0': - resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} - - '@iconify/utils@2.2.1': - resolution: {integrity: sha512-0/7J7hk4PqXmxo5PDBDxmnecw5PxklZJfNjIVG9FM0mEfVrvfudS22rYWsqVk6gR3UJ/mSYS90X4R3znXnqfNA==} - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jest/types@29.6.3': - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.1': - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/source-map@0.3.5': - resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} - - '@jridgewell/sourcemap-codec@1.4.15': - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@leichtgewicht/ip-codec@2.0.4': - resolution: {integrity: sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==} - - '@mdx-js/mdx@3.0.0': - resolution: {integrity: sha512-Icm0TBKBLYqroYbNW3BPnzMGn+7mwpQOK310aZ7+fkCtiU3aqv2cdcX+nd0Ydo3wI5Rx8bX2Z2QmGb/XcAClCw==} - - '@mdx-js/react@3.1.0': - resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==} - peerDependencies: - '@types/react': '>=16' - react: '>=16' - - '@mermaid-js/parser@0.6.1': - resolution: {integrity: sha512-lCQNpV8R4lgsGcjX5667UiuDLk2micCtjtxR1YKbBXvN5w2v+FeLYoHrTSSrjwXdMcDYvE4ZBPvKT31dfeSmmA==} - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@philpl/buble@0.19.7': - resolution: {integrity: sha512-wKTA2DxAGEW+QffRQvOhRQ0VBiYU2h2p8Yc1oBNlqSKws48/8faxqKNIuub0q4iuyTuLwtB8EkwiKwhlfV1PBA==} - hasBin: true - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@pnpm/config.env-replace@1.1.0': - resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} - engines: {node: '>=12.22.0'} - - '@pnpm/network.ca-file@1.0.2': - resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==} - engines: {node: '>=12.22.0'} - - '@pnpm/npm-conf@2.2.2': - resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==} - engines: {node: '>=12'} - - '@polka/url@1.0.0-next.24': - resolution: {integrity: sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==} - - '@puppeteer/browsers@2.3.0': - resolution: {integrity: sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==} - engines: {node: '>=18'} - hasBin: true - - '@sideway/address@4.1.4': - resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} - - '@sideway/formula@3.0.1': - resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} - - '@sideway/pinpoint@2.0.0': - resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} - - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - - '@sindresorhus/is@4.6.0': - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - - '@sindresorhus/is@5.6.0': - resolution: {integrity: sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g==} - engines: {node: '>=14.16'} - - '@slorber/react-helmet-async@1.3.0': - resolution: {integrity: sha512-e9/OK8VhwUSc67diWI8Rb3I0YgI9/SBQtnhe9aEuK6MhZm7ntZZimXgwXnd8W96YTmSOb9M4d8LwhRZyhWr/1A==} - peerDependencies: - react: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - react-dom: ^16.6.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 - - '@slorber/remark-comment@1.0.0': - resolution: {integrity: sha512-RCE24n7jsOj1M0UPvIQCHTe7fI0sFL4S2nwKVWwHyVr/wI/H8GosgsJGyhnsZoGFnD/P2hLf1mSbrrgSLN93NA==} - - '@svgr/babel-plugin-add-jsx-attribute@8.0.0': - resolution: {integrity: sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0': - resolution: {integrity: sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0': - resolution: {integrity: sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0': - resolution: {integrity: sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-svg-dynamic-title@8.0.0': - resolution: {integrity: sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-svg-em-dimensions@8.0.0': - resolution: {integrity: sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-transform-react-native-svg@8.1.0': - resolution: {integrity: sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-plugin-transform-svg-component@8.0.0': - resolution: {integrity: sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==} - engines: {node: '>=12'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/babel-preset@8.1.0': - resolution: {integrity: sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==} - engines: {node: '>=14'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@svgr/core@8.1.0': - resolution: {integrity: sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==} - engines: {node: '>=14'} - - '@svgr/hast-util-to-babel-ast@8.0.0': - resolution: {integrity: sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==} - engines: {node: '>=14'} - - '@svgr/plugin-jsx@8.1.0': - resolution: {integrity: sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' - - '@svgr/plugin-svgo@8.1.0': - resolution: {integrity: sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==} - engines: {node: '>=14'} - peerDependencies: - '@svgr/core': '*' - - '@svgr/webpack@8.1.0': - resolution: {integrity: sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==} - engines: {node: '>=14'} - - '@szmarczak/http-timer@5.0.1': - resolution: {integrity: sha512-+PmQX0PiAYPMeVYe237LJAYvOMYW1j2rH5YROyS3b4CTVJum34HfRvKvAzozHAQG0TnHNdUfY9nCeUyRAs//cw==} - engines: {node: '>=14.16'} - - '@tootallnate/quickjs-emscripten@0.23.0': - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - - '@trysound/sax@0.2.0': - resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} - engines: {node: '>=10.13.0'} - - '@types/acorn@4.0.6': - resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} - - '@types/body-parser@1.19.5': - resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} - - '@types/bonjour@3.5.13': - resolution: {integrity: sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==} - - '@types/connect-history-api-fallback@1.5.4': - resolution: {integrity: sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==} - - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - - '@types/d3-array@3.2.1': - resolution: {integrity: sha512-Y2Jn2idRrLzUfAKV2LyRImR+y4oa2AntrgID95SHJxuMUrkNXmanDSed71sRNZysveJVt1hLLemQZIady0FpEg==} - - '@types/d3-axis@3.0.6': - resolution: {integrity: sha512-pYeijfZuBd87T0hGn0FO1vQ/cgLk6E1ALJjfkC0oJ8cbwkZl3TpgS8bVBLZN+2jjGgg38epgxb2zmoGtSfvgMw==} - - '@types/d3-brush@3.0.6': - resolution: {integrity: sha512-nH60IZNNxEcrh6L1ZSMNA28rj27ut/2ZmI3r96Zd+1jrZD++zD3LsMIjWlvg4AYrHn/Pqz4CF3veCxGjtbqt7A==} - - '@types/d3-chord@3.0.6': - resolution: {integrity: sha512-LFYWWd8nwfwEmTZG9PfQxd17HbNPksHBiJHaKuY1XeqscXacsS2tyoo6OdRsjf+NQYeB6XrNL3a25E3gH69lcg==} - - '@types/d3-color@3.1.3': - resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} - - '@types/d3-contour@3.0.6': - resolution: {integrity: sha512-BjzLgXGnCWjUSYGfH1cpdo41/hgdWETu4YxpezoztawmqsvCeep+8QGfiY6YbDvfgHz/DkjeIkkZVJavB4a3rg==} - - '@types/d3-delaunay@6.0.4': - resolution: {integrity: sha512-ZMaSKu4THYCU6sV64Lhg6qjf1orxBthaC161plr5KuPHo3CNm8DTHiLw/5Eq2b6TsNP0W0iJrUOFscY6Q450Hw==} - - '@types/d3-dispatch@3.0.6': - resolution: {integrity: sha512-4fvZhzMeeuBJYZXRXrRIQnvUYfyXwYmLsdiN7XXmVNQKKw1cM8a5WdID0g1hVFZDqT9ZqZEY5pD44p24VS7iZQ==} - - '@types/d3-drag@3.0.7': - resolution: {integrity: sha512-HE3jVKlzU9AaMazNufooRJ5ZpWmLIoc90A37WU2JMmeq28w1FQqCZswHZ3xR+SuxYftzHq6WU6KJHvqxKzTxxQ==} - - '@types/d3-dsv@3.0.7': - resolution: {integrity: sha512-n6QBF9/+XASqcKK6waudgL0pf/S5XHPPI8APyMLLUHd8NqouBGLsU8MgtO7NINGtPBtk9Kko/W4ea0oAspwh9g==} - - '@types/d3-ease@3.0.2': - resolution: {integrity: sha512-NcV1JjO5oDzoK26oMzbILE6HW7uVXOHLQvHshBUW4UMdZGfiY6v5BeQwh9a9tCzv+CeefZQHJt5SRgK154RtiA==} - - '@types/d3-fetch@3.0.7': - resolution: {integrity: sha512-fTAfNmxSb9SOWNB9IoG5c8Hg6R+AzUHDRlsXsDZsNp6sxAEOP0tkP3gKkNSO/qmHPoBFTxNrjDprVHDQDvo5aA==} - - '@types/d3-force@3.0.10': - resolution: {integrity: sha512-ZYeSaCF3p73RdOKcjj+swRlZfnYpK1EbaDiYICEEp5Q6sUiqFaFQ9qgoshp5CzIyyb/yD09kD9o2zEltCexlgw==} - - '@types/d3-format@3.0.4': - resolution: {integrity: sha512-fALi2aI6shfg7vM5KiR1wNJnZ7r6UuggVqtDA+xiEdPZQwy/trcQaHnwShLuLdta2rTymCNpxYTiMZX/e09F4g==} - - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - - '@types/d3-hierarchy@3.1.7': - resolution: {integrity: sha512-tJFtNoYBtRtkNysX1Xq4sxtjK8YgoWUNpIiUee0/jHGRwqvzYxkq0hGVbbOGSz+JgFxxRu4K8nb3YpG3CMARtg==} - - '@types/d3-interpolate@3.0.4': - resolution: {integrity: sha512-mgLPETlrpVV1YRJIglr4Ez47g7Yxjl1lj7YKsiMCb27VJH9W8NVM6Bb9d8kkpG/uAQS5AmbA48q2IAolKKo1MA==} - - '@types/d3-path@3.1.0': - resolution: {integrity: sha512-P2dlU/q51fkOc/Gfl3Ul9kicV7l+ra934qBFXCFhrZMOL6du1TM0pm1ThYvENukyOn5h9v+yMJ9Fn5JK4QozrQ==} - - '@types/d3-polygon@3.0.2': - resolution: {integrity: sha512-ZuWOtMaHCkN9xoeEMr1ubW2nGWsp4nIql+OPQRstu4ypeZ+zk3YKqQT0CXVe/PYqrKpZAi+J9mTs05TKwjXSRA==} - - '@types/d3-quadtree@3.0.6': - resolution: {integrity: sha512-oUzyO1/Zm6rsxKRHA1vH0NEDG58HrT5icx/azi9MF1TWdtttWl0UIUsjEQBBh+SIkrpd21ZjEv7ptxWys1ncsg==} - - '@types/d3-random@3.0.3': - resolution: {integrity: sha512-Imagg1vJ3y76Y2ea0871wpabqp613+8/r0mCLEBfdtqC7xMSfj9idOnmBYyMoULfHePJyxMAw3nWhJxzc+LFwQ==} - - '@types/d3-scale-chromatic@3.0.3': - resolution: {integrity: sha512-laXM4+1o5ImZv3RpFAsTRn3TEkzqkytiOY0Dz0sq5cnd1dtNlk6sHLon4OvqaiJb28T0S/TdsBI3Sjsy+keJrw==} - - '@types/d3-scale@4.0.8': - resolution: {integrity: sha512-gkK1VVTr5iNiYJ7vWDI+yUFFlszhNMtVeneJ6lUTKPjprsvLLI9/tgEGiXJOnlINJA8FyA88gfnQsHbybVZrYQ==} - - '@types/d3-selection@3.0.11': - resolution: {integrity: sha512-bhAXu23DJWsrI45xafYpkQ4NtcKMwWnAC/vKrd2l+nxMFuvOT3XMYTIj2opv8vq8AO5Yh7Qac/nSeP/3zjTK0w==} - - '@types/d3-shape@3.1.7': - resolution: {integrity: sha512-VLvUQ33C+3J+8p+Daf+nYSOsjB4GXp19/S/aGo60m9h1v6XaxjiT82lKVWJCfzhtuZ3yD7i/TPeC/fuKLLOSmg==} - - '@types/d3-time-format@4.0.3': - resolution: {integrity: sha512-5xg9rC+wWL8kdDj153qZcsJ0FWiFt0J5RB6LYUNZjwSnesfblqrI/bJ1wBdJ8OQfncgbJG5+2F+qfqnqyzYxyg==} - - '@types/d3-time@3.0.3': - resolution: {integrity: sha512-2p6olUZ4w3s+07q3Tm2dbiMZy5pCDfYwtLXXHUnVzXgQlZ/OyPtUz6OL382BkOuGlLXqfT+wqv8Fw2v8/0geBw==} - - '@types/d3-timer@3.0.2': - resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} - - '@types/d3-transition@3.0.9': - resolution: {integrity: sha512-uZS5shfxzO3rGlu0cC3bjmMFKsXv+SmZZcgp0KD22ts4uGXp5EVYGzu/0YdwZeKmddhcAccYtREJKkPfXkZuCg==} - - '@types/d3-zoom@3.0.8': - resolution: {integrity: sha512-iqMC4/YlFCSlO8+2Ii1GGGliCAY4XdeG748w5vQUbevlbDu0zSjH/+jojorQVBK/se0j6DUFNPBGSqD3YWYnDw==} - - '@types/d3@7.4.3': - resolution: {integrity: sha512-lZXZ9ckh5R8uiFVt8ogUNf+pIrK4EsWrx2Np75WvF/eTpJ0FMHNhjXk8CKEx/+gpHbNQyJWehbFaTvqmHWB3ww==} - - '@types/debug@4.1.12': - resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} - - '@types/eslint-scope@3.7.7': - resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} - - '@types/eslint@8.56.2': - resolution: {integrity: sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw==} - - '@types/estree-jsx@1.0.3': - resolution: {integrity: sha512-pvQ+TKeRHeiUGRhvYwRrQ/ISnohKkSJR14fT2yqyZ4e9K5vqc7hrtY2Y1Dw0ZwAzQ6DQsxsaCUuSIIi8v0Cq6w==} - - '@types/estree@1.0.5': - resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} - - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - - '@types/express-serve-static-core@4.17.41': - resolution: {integrity: sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA==} - - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - - '@types/geojson@7946.0.16': - resolution: {integrity: sha512-6C8nqWur3j98U6+lXDfTUWIfgvZU+EumvpHKcYjujKH7woYyLj2sUmff0tRhrqM7BohUw7Pz3ZB1jj2gW9Fvmg==} - - '@types/gtag.js@0.0.12': - resolution: {integrity: sha512-YQV9bUsemkzG81Ea295/nF/5GijnD2Af7QhEofh7xu+kvCN6RdodgNwwGWXB5GMI3NoyvQo0odNctoH/qLMIpg==} - - '@types/hast@2.3.9': - resolution: {integrity: sha512-pTHyNlaMD/oKJmS+ZZUyFUcsZeBZpC0lmGquw98CqRVNgAdJZJeD7GoeLiT6Xbx5rU9VCjSt0RwEvDgzh4obFw==} - - '@types/hast@3.0.3': - resolution: {integrity: sha512-2fYGlaDy/qyLlhidX42wAH0KBi2TCjKMH8CHmBXgRlJ3Y+OXTiqsPQ6IWarZKwF1JoUcAJdPogv1d4b0COTpmQ==} - - '@types/history@4.7.11': - resolution: {integrity: sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==} - - '@types/html-minifier-terser@6.1.0': - resolution: {integrity: sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==} - - '@types/http-cache-semantics@4.0.4': - resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} - - '@types/http-errors@2.0.4': - resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} - - '@types/http-proxy@1.17.14': - resolution: {integrity: sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==} - - '@types/istanbul-lib-coverage@2.0.6': - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - - '@types/istanbul-lib-report@3.0.3': - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - - '@types/istanbul-reports@3.0.4': - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/mdast@3.0.15': - resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} - - '@types/mdast@4.0.3': - resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} - - '@types/mdx@2.0.10': - resolution: {integrity: sha512-Rllzc5KHk0Al5/WANwgSPl1/CwjqCy+AZrGd78zuK+jO9aDM6ffblZ+zIjgPNAaEBmlO0RYDvLNh7wD0zKVgEg==} - - '@types/mime@1.3.5': - resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - - '@types/mime@3.0.4': - resolution: {integrity: sha512-iJt33IQnVRkqeqC7PzBHPTC6fDlRNRW8vjrgqtScAhrmMwe8c4Eo7+fUGTa+XdWrpEgpyKWMYmi2dIwMAYRzPw==} - - '@types/ms@0.7.34': - resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} - - '@types/node-forge@1.3.11': - resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==} - - '@types/node@17.0.45': - resolution: {integrity: sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw==} - - '@types/node@20.11.0': - resolution: {integrity: sha512-o9bjXmDNcF7GbM4CNQpmi+TutCgap/K3w1JyKgxAjqx41zp9qlIAVFi0IhCNsJcXolEqLWhbFbEeL0PvYm4pcQ==} - - '@types/prismjs@1.26.5': - resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} - - '@types/qs@6.9.11': - resolution: {integrity: sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==} - - '@types/range-parser@1.2.7': - resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} - - '@types/react-router-config@5.0.11': - resolution: {integrity: sha512-WmSAg7WgqW7m4x8Mt4N6ZyKz0BubSj/2tVUMsAHp+Yd2AMwcSbeFq9WympT19p5heCFmF97R9eD5uUR/t4HEqw==} - - '@types/react-router-dom@5.3.3': - resolution: {integrity: sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==} - - '@types/react-router@5.1.20': - resolution: {integrity: sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==} - - '@types/react@19.0.8': - resolution: {integrity: sha512-9P/o1IGdfmQxrujGbIMDyYaaCykhLKc0NGCtYcECNUr9UAaDe4gwvV9bR6tvd5Br1SG0j+PBpbKr2UYY8CwqSw==} - - '@types/retry@0.12.0': - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - - '@types/sax@1.2.7': - resolution: {integrity: sha512-rO73L89PJxeYM3s3pPPjiPgVVcymqU490g0YO5n5By0k2Erzj6tay/4lr1CHAAU4JyOWd1rpQ8bCf6cZfHU96A==} - - '@types/send@0.17.4': - resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} - - '@types/serve-index@1.9.4': - resolution: {integrity: sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==} - - '@types/serve-static@1.15.5': - resolution: {integrity: sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==} - - '@types/sockjs@0.3.36': - resolution: {integrity: sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==} - - '@types/trusted-types@2.0.7': - resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} - - '@types/unist@2.0.10': - resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} - - '@types/unist@3.0.2': - resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} - - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - - '@types/yargs-parser@21.0.3': - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - - '@types/yargs@17.0.32': - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - - '@types/yauzl@2.10.3': - resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - '@webassemblyjs/ast@1.14.1': - resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} - - '@webassemblyjs/floating-point-hex-parser@1.13.2': - resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} - - '@webassemblyjs/helper-api-error@1.13.2': - resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} - - '@webassemblyjs/helper-buffer@1.14.1': - resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} - - '@webassemblyjs/helper-numbers@1.13.2': - resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': - resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} - - '@webassemblyjs/helper-wasm-section@1.14.1': - resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} - - '@webassemblyjs/ieee754@1.13.2': - resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} - - '@webassemblyjs/leb128@1.13.2': - resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} - - '@webassemblyjs/utf8@1.13.2': - resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} - - '@webassemblyjs/wasm-edit@1.14.1': - resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} - - '@webassemblyjs/wasm-gen@1.14.1': - resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} - - '@webassemblyjs/wasm-opt@1.14.1': - resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} - - '@webassemblyjs/wasm-parser@1.14.1': - resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} - - '@webassemblyjs/wast-printer@1.14.1': - resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - - '@xtuc/ieee754@1.2.0': - resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} - - '@xtuc/long@4.2.2': - resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} - - accepts@1.3.8: - resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} - engines: {node: '>= 0.6'} - - acorn-class-fields@0.2.1: - resolution: {integrity: sha512-US/kqTe0H8M4LN9izoL+eykVAitE68YMuYZ3sHn3i1fjniqR7oQ3SPvuMK/VT1kjOQHrx5Q88b90TtOKgAv2hQ==} - engines: {node: '>=4.8.2'} - peerDependencies: - acorn: ^6.0.0 - - acorn-dynamic-import@4.0.0: - resolution: {integrity: sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==} - deprecated: This is probably built in to whatever tool you're using. If you still need it... idk - peerDependencies: - acorn: ^6.0.0 - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn-walk@8.3.2: - resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} - engines: {node: '>=0.4.0'} - - acorn@6.4.2: - resolution: {integrity: sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.11.3: - resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} - engines: {node: '>=0.4.0'} - hasBin: true - - acorn@8.14.0: - resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} - engines: {node: '>=0.4.0'} - hasBin: true - - address@1.2.2: - resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} - engines: {node: '>= 10.0.0'} - - agent-base@7.1.3: - resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} - engines: {node: '>= 14'} - - aggregate-error@3.1.0: - resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} - engines: {node: '>=8'} - - ajv-formats@2.1.1: - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - - ajv-keywords@3.5.2: - resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} - peerDependencies: - ajv: ^6.9.1 - - ajv-keywords@5.1.0: - resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} - peerDependencies: - ajv: ^8.8.2 - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - - algoliasearch-helper@3.23.1: - resolution: {integrity: sha512-j/dF2ZELJBm4SJTK5ECsMuCDJpBB8ITiWKRjd3S15bK2bqrXKLWqDiA5A96WhVvCpZ2NmgNlUYmFbKOfcqivbg==} - peerDependencies: - algoliasearch: '>= 3.1 < 6' - - algoliasearch@5.20.0: - resolution: {integrity: sha512-groO71Fvi5SWpxjI9Ia+chy0QBwT61mg6yxJV27f5YFf+Mw+STT75K6SHySpP8Co5LsCrtsbCH5dJZSRtkSKaQ==} - engines: {node: '>= 14.0.0'} - - ansi-align@3.0.1: - resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} - - ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - - ansi-html-community@0.0.8: - resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} - engines: {'0': node >= 0.8.0} - hasBin: true - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - array-flatten@1.1.1: - resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - - astring@1.8.6: - resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} - hasBin: true - - autoprefixer@10.4.19: - resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - autoprefixer@10.4.21: - resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==} - engines: {node: ^10 || ^12 || >=14} - hasBin: true - peerDependencies: - postcss: ^8.1.0 - - b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - - babel-loader@9.2.1: - resolution: {integrity: sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@babel/core': ^7.12.0 - webpack: '>=5' - - babel-plugin-dynamic-import-node@2.3.3: - resolution: {integrity: sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==} - - babel-plugin-polyfill-corejs2@0.4.12: - resolution: {integrity: sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-corejs3@0.10.6: - resolution: {integrity: sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - babel-plugin-polyfill-regenerator@0.6.3: - resolution: {integrity: sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==} - peerDependencies: - '@babel/core': ^7.4.0 || ^8.0.0-0 <8.0.0 - - bail@2.0.2: - resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - bare-events@2.5.4: - resolution: {integrity: sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA==} - - bare-fs@4.0.1: - resolution: {integrity: sha512-ilQs4fm/l9eMfWY2dY0WCIUplSUp7U0CT1vrqMg1MUdeZl4fypu5UP0XcDBK5WBQPJAKP1b7XEodISmekH/CEg==} - engines: {bare: '>=1.7.0'} - - bare-os@3.4.0: - resolution: {integrity: sha512-9Ous7UlnKbe3fMi7Y+qh0DwAup6A1JkYgPnjvMDNOlmnxNRQvQ/7Nst+OnUQKzk0iAT0m9BisbDVp9gCv8+ETA==} - engines: {bare: '>=1.6.0'} - - bare-path@3.0.0: - resolution: {integrity: sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==} - - bare-stream@2.6.4: - resolution: {integrity: sha512-G6i3A74FjNq4nVrrSTUz5h3vgXzBJnjmWAVlBWaZETkgu+LgKd7AiyOml3EDJY1AHlIbBHKDXE+TUT53Ff8OaA==} - peerDependencies: - bare-buffer: '*' - bare-events: '*' - peerDependenciesMeta: - bare-buffer: - optional: true - bare-events: - optional: true - - base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - basic-ftp@5.0.5: - resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} - engines: {node: '>=10.0.0'} - - batch@0.6.1: - resolution: {integrity: sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==} - - big.js@5.2.2: - resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - - binary-extensions@2.2.0: - resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} - engines: {node: '>=8'} - - bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - - body-parser@1.20.2: - resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - bonjour-service@1.2.1: - resolution: {integrity: sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==} - - boolbase@1.0.0: - resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} - - boxen@6.2.1: - resolution: {integrity: sha512-H4PEsJXfFI/Pt8sjDWbHlQPx4zL/bvSQjcilJmaulGt5mLDorHOHpmdXAJcBcmru7PhYSp/cDMWRko4ZUMFkSw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - boxen@7.1.1: - resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} - engines: {node: '>=14.16'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - - browserslist@4.24.4: - resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - browserslist@4.25.0: - resolution: {integrity: sha512-PJ8gYKeS5e/whHBh8xrwYK+dAvEj7JXtz6uTucnMRB8OiGTsKccFekoRrjajPBHV8oOY+2tI4uxeceSimKwMFA==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - - buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - - buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - - bytes@3.0.0: - resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} - engines: {node: '>= 0.8'} - - bytes@3.1.2: - resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} - engines: {node: '>= 0.8'} - - cacheable-lookup@7.0.0: - resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==} - engines: {node: '>=14.16'} - - cacheable-request@10.2.14: - resolution: {integrity: sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==} - engines: {node: '>=14.16'} - - call-bind@1.0.5: - resolution: {integrity: sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - - camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - - camelcase@7.0.1: - resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} - engines: {node: '>=14.16'} - - caniuse-api@3.0.0: - resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} - - caniuse-lite@1.0.30001695: - resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==} - - caniuse-lite@1.0.30001721: - resolution: {integrity: sha512-cOuvmUVtKrtEaoKiO0rSc29jcjwMwX5tOHDy4MgVFEWiUXj4uBMJkwI8MDySkgXidpMiHUcviogAvFi4pA2hDQ==} - - ccount@2.0.1: - resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} - - chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - - char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - - character-entities-html4@2.1.0: - resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} - - character-entities-legacy@3.0.0: - resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} - - character-entities@2.0.2: - resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} - - character-reference-invalid@2.0.1: - resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - - cheerio-select@2.1.0: - resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} - - cheerio@1.0.0-rc.12: - resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} - engines: {node: '>= 6'} - - chevrotain-allstar@0.3.1: - resolution: {integrity: sha512-b7g+y9A0v4mxCW1qUhf3BSVPg+/NvGErk/dOkrDaHA0nQIQGAtrOjlX//9OQtRlSCy+x9rfB5N8yC71lH1nvMw==} - peerDependencies: - chevrotain: ^11.0.0 - - chevrotain@11.0.3: - resolution: {integrity: sha512-ci2iJH6LeIkvP9eJW6gpueU8cnZhv85ELY8w8WiFtNjMHA5ad6pQLaJo9mEly/9qUyCpvqX8/POVUTf18/HFdw==} - - chokidar@3.5.3: - resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} - engines: {node: '>= 8.10.0'} - - chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - - chrome-trace-event@1.0.3: - resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} - engines: {node: '>=6.0'} - - chromium-bidi@0.6.3: - resolution: {integrity: sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==} - peerDependencies: - devtools-protocol: '*' - - ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - - clean-css@5.3.3: - resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} - engines: {node: '>= 10.0'} - - clean-stack@2.2.0: - resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} - engines: {node: '>=6'} - - cli-boxes@3.0.0: - resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} - engines: {node: '>=10'} - - cli-table3@0.6.3: - resolution: {integrity: sha512-w5Jac5SykAeZJKntOxJCrm63Eg5/4dhMWIcuTbo9rpE+brgaSZo0RuNJZeOyMgsUdhDeojvgyQLmjI+K50ZGyg==} - engines: {node: 10.* || >= 12.*} - - cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - - clone-deep@4.0.1: - resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} - engines: {node: '>=6'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - collapse-white-space@2.1.0: - resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} - - color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - color-string@1.9.1: - resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - - color@4.2.3: - resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} - engines: {node: '>=12.5.0'} - - colord@2.9.3: - resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - - combine-promises@1.2.0: - resolution: {integrity: sha512-VcQB1ziGD0NXrhKxiwyNbCDmRzs/OShMs2GqW2DlU2A/Sd0nQxE1oWDAE5O0ygSx5mgQOn9eIFh7yKPgFRVkPQ==} - engines: {node: '>=10'} - - comma-separated-tokens@2.0.3: - resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} - - commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - commander@5.1.0: - resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} - engines: {node: '>= 6'} - - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - - commander@8.3.0: - resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} - engines: {node: '>= 12'} - - common-path-prefix@3.0.0: - resolution: {integrity: sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==} - - compressible@2.0.18: - resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} - engines: {node: '>= 0.6'} - - compression@1.7.4: - resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} - engines: {node: '>= 0.8.0'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - - config-chain@1.1.13: - resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} - - configstore@6.0.0: - resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} - engines: {node: '>=12'} - - connect-history-api-fallback@2.0.0: - resolution: {integrity: sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==} - engines: {node: '>=0.8'} - - consola@3.4.0: - resolution: {integrity: sha512-EiPU8G6dQG0GFHNR8ljnZFki/8a+cQwEQ+7wpxdChl02Q8HXlwEZWD5lqAF8vC2sEC3Tehr8hy7vErz88LHyUA==} - engines: {node: ^14.18.0 || >=16.10.0} - - content-disposition@0.5.2: - resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==} - engines: {node: '>= 0.6'} - - content-disposition@0.5.4: - resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} - engines: {node: '>= 0.6'} - - content-type@1.0.5: - resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} - engines: {node: '>= 0.6'} - - convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - - cookie-signature@1.0.6: - resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} - - cookie@0.6.0: - resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} - engines: {node: '>= 0.6'} - - copy-text-to-clipboard@3.2.0: - resolution: {integrity: sha512-RnJFp1XR/LOBDckxTib5Qjr/PMfkatD0MUCQgdpqS8MdKiNUzBjAQBEN6oUy+jW7LI93BBG3DtMB2KOOKpGs2Q==} - engines: {node: '>=12'} - - copy-webpack-plugin@11.0.0: - resolution: {integrity: sha512-fX2MWpamkW0hZxMEg0+mYnA40LTosOSa5TqZ9GYIBzyJa9C3QUaMPSE2xAi/buNr8u89SfD9wHSQVBzrRa/SOQ==} - engines: {node: '>= 14.15.0'} - peerDependencies: - webpack: ^5.1.0 - - core-js-compat@3.40.0: - resolution: {integrity: sha512-0XEDpr5y5mijvw8Lbc6E5AkjrHfp7eEoPlu36SWeAbcL8fn1G1ANe8DBlo2XoNN89oVpxWwOjYIPVzR4ZvsKCQ==} - - core-js-pure@3.35.0: - resolution: {integrity: sha512-f+eRYmkou59uh7BPcyJ8MC76DiGhspj1KMxVIcF24tzP8NA9HVa1uC7BTW2tgx7E1QVCzDzsgp7kArrzhlz8Ew==} - - core-js@3.35.0: - resolution: {integrity: sha512-ntakECeqg81KqMueeGJ79Q5ZgQNR+6eaE8sxGCx62zMbAIj65q+uYvatToew3m6eAGdU4gNZwpZ34NMe4GYswg==} - - core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - - cose-base@1.0.3: - resolution: {integrity: sha512-s9whTXInMSgAp/NVXVNuVxVKzGH2qck3aQlVHxDCdAEPgtMKwc4Wq6/QKhgdEdgbLSi9rBTAcPoRa6JpiG4ksg==} - - cose-base@2.2.0: - resolution: {integrity: sha512-AzlgcsCbUMymkADOJtQm3wO9S3ltPfYOFD5033keQn9NJzIbtnZj+UdBJe7DYml/8TdbtHJW3j58SOnKhWY/5g==} - - cosmiconfig@8.3.6: - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - cosmiconfig@9.0.0: - resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - crypto-random-string@4.0.0: - resolution: {integrity: sha512-x8dy3RnvYdlUcPOjkEHqozhiwzKNSq7GcPuXFbnyMOCHxX8V3OgIg/pYuabl2sbUPfIJaeAQB7PMOK8DFIdoRA==} - engines: {node: '>=12'} - - css-blank-pseudo@7.0.1: - resolution: {integrity: sha512-jf+twWGDf6LDoXDUode+nc7ZlrqfaNphrBIBrcmeP3D8yw1uPaix1gCC8LUQUGQ6CycuK2opkbFFWFuq/a94ag==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - css-declaration-sorter@7.2.0: - resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==} - engines: {node: ^14 || ^16 || >=18} - peerDependencies: - postcss: ^8.0.9 - - css-has-pseudo@7.0.2: - resolution: {integrity: sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - css-loader@6.11.0: - resolution: {integrity: sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==} - engines: {node: '>= 12.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.0.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - css-minimizer-webpack-plugin@5.0.1: - resolution: {integrity: sha512-3caImjKFQkS+ws1TGcFn0V1HyDJFq1Euy589JlD6/3rV2kj+w7r5G9WDMgSHvpvXHNZ2calVypZWuEDQd9wfLg==} - engines: {node: '>= 14.15.0'} - peerDependencies: - '@parcel/css': '*' - '@swc/css': '*' - clean-css: '*' - csso: '*' - esbuild: '*' - lightningcss: '*' - webpack: ^5.0.0 - peerDependenciesMeta: - '@parcel/css': - optional: true - '@swc/css': - optional: true - clean-css: - optional: true - csso: - optional: true - esbuild: - optional: true - lightningcss: - optional: true - - css-prefers-color-scheme@10.0.0: - resolution: {integrity: sha512-VCtXZAWivRglTZditUfB4StnsWr6YVZ2PRtuxQLKTNRdtAf8tpzaVPE9zXIF3VaSc7O70iK/j1+NXxyQCqdPjQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - css-select@4.3.0: - resolution: {integrity: sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==} - - css-select@5.1.0: - resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} - - css-tree@2.2.1: - resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - - css-what@6.1.0: - resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} - engines: {node: '>= 6'} - - cssdb@8.3.0: - resolution: {integrity: sha512-c7bmItIg38DgGjSwDPZOYF/2o0QU/sSgkWOMyl8votOfgFuyiFKWPesmCGEsrGLxEA9uL540cp8LdaGEjUGsZQ==} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - cssnano-preset-advanced@6.1.2: - resolution: {integrity: sha512-Nhao7eD8ph2DoHolEzQs5CfRpiEP0xa1HBdnFZ82kvqdmbwVBUr2r1QuQ4t1pi+D1ZpqpcO4T+wy/7RxzJ/WPQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - cssnano-preset-default@6.1.2: - resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - cssnano-utils@4.0.2: - resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - cssnano@6.1.2: - resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - csso@5.0.5: - resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - cytoscape-cose-bilkent@4.1.0: - resolution: {integrity: sha512-wgQlVIUJF13Quxiv5e1gstZ08rnZj2XaLHGoFMYXz7SkNfCDOOteKBE6SYRfA9WxxI/iBc3ajfDoc6hb/MRAHQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape-fcose@2.2.0: - resolution: {integrity: sha512-ki1/VuRIHFCzxWNrsshHYPs6L7TvLu3DL+TyIGEsRcvVERmxokbf5Gdk7mFxZnTdiGtnA4cfSmjZJMviqSuZrQ==} - peerDependencies: - cytoscape: ^3.2.0 - - cytoscape@3.31.0: - resolution: {integrity: sha512-zDGn1K/tfZwEnoGOcHc0H4XazqAAXAuDpcYw9mUnUjATjqljyCNGJv8uEvbvxGaGHaVshxMecyl6oc6uKzRfbw==} - engines: {node: '>=0.10'} - - d3-array@2.12.1: - resolution: {integrity: sha512-B0ErZK/66mHtEsR1TkPEEkwdy+WDesimkM5gpZr5Dsg54BiTA5RXtYW5qTLIAcekaS9xfZrzBLF/OAkB3Qn1YQ==} - - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-axis@3.0.0: - resolution: {integrity: sha512-IH5tgjV4jE/GhHkRV0HiVYPDtvfjHQlQfJHs0usq7M30XcSBvOotpmH1IgkcXsO/5gEQZD43B//fc7SRT5S+xw==} - engines: {node: '>=12'} - - d3-brush@3.0.0: - resolution: {integrity: sha512-ALnjWlVYkXsVIGlOsuWH1+3udkYFI48Ljihfnh8FZPF2QS9o+PzGLBslO0PjzVoHLZ2KCVgAM8NVkXPJB2aNnQ==} - engines: {node: '>=12'} - - d3-chord@3.0.1: - resolution: {integrity: sha512-VE5S6TNa+j8msksl7HwjxMHDM2yNK3XCkusIlpX5kwauBfXuyLAtNg9jCp/iHH61tgI4sb6R/EIMWCqEIdjT/g==} - engines: {node: '>=12'} - - d3-color@3.1.0: - resolution: {integrity: sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==} - engines: {node: '>=12'} - - d3-contour@4.0.2: - resolution: {integrity: sha512-4EzFTRIikzs47RGmdxbeUvLWtGedDUNkTcmzoeyg4sP/dvCexO47AaQL7VKy/gul85TOxw+IBgA8US2xwbToNA==} - engines: {node: '>=12'} - - d3-delaunay@6.0.4: - resolution: {integrity: sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==} - engines: {node: '>=12'} - - d3-dispatch@3.0.1: - resolution: {integrity: sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==} - engines: {node: '>=12'} - - d3-drag@3.0.0: - resolution: {integrity: sha512-pWbUJLdETVA8lQNJecMxoXfH6x+mO2UQo8rSmZ+QqxcbyA3hfeprFgIT//HW2nlHChWeIIMwS2Fq+gEARkhTkg==} - engines: {node: '>=12'} - - d3-dsv@3.0.1: - resolution: {integrity: sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==} - engines: {node: '>=12'} - hasBin: true - - d3-ease@3.0.1: - resolution: {integrity: sha512-wR/XK3D3XcLIZwpbvQwQ5fK+8Ykds1ip7A2Txe0yxncXSdq1L9skcG7blcedkOX+ZcgxGAmLX1FrRGbADwzi0w==} - engines: {node: '>=12'} - - d3-fetch@3.0.1: - resolution: {integrity: sha512-kpkQIM20n3oLVBKGg6oHrUchHM3xODkTzjMoj7aWQFq5QEM+R6E4WkzT5+tojDY7yjez8KgCBRoj4aEr99Fdqw==} - engines: {node: '>=12'} - - d3-force@3.0.0: - resolution: {integrity: sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==} - engines: {node: '>=12'} - - d3-format@3.1.0: - resolution: {integrity: sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==} - engines: {node: '>=12'} - - d3-geo@3.1.0: - resolution: {integrity: sha512-JEo5HxXDdDYXCaWdwLRt79y7giK8SbhZJbFWXqbRTolCHFI5jRqteLzCsq51NKbUoX0PjBVSohxrx+NoOUujYA==} - engines: {node: '>=12'} - - d3-hierarchy@3.1.2: - resolution: {integrity: sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==} - engines: {node: '>=12'} - - d3-interpolate@3.0.1: - resolution: {integrity: sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==} - engines: {node: '>=12'} - - d3-path@1.0.9: - resolution: {integrity: sha512-VLaYcn81dtHVTjEHd8B+pbe9yHWpXKZUC87PzoFmsFrJqgFwDe/qxfp5MlfsfM1V5E/iVt0MmEbWQ7FVIXh/bg==} - - d3-path@3.1.0: - resolution: {integrity: sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==} - engines: {node: '>=12'} - - d3-polygon@3.0.1: - resolution: {integrity: sha512-3vbA7vXYwfe1SYhED++fPUQlWSYTTGmFmQiany/gdbiWgU/iEyQzyymwL9SkJjFFuCS4902BSzewVGsHHmHtXg==} - engines: {node: '>=12'} - - d3-quadtree@3.0.1: - resolution: {integrity: sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==} - engines: {node: '>=12'} - - d3-random@3.0.1: - resolution: {integrity: sha512-FXMe9GfxTxqd5D6jFsQ+DJ8BJS4E/fT5mqqdjovykEB2oFbTMDVdg1MGFxfQW+FBOGoB++k8swBrgwSHT1cUXQ==} - engines: {node: '>=12'} - - d3-sankey@0.12.3: - resolution: {integrity: sha512-nQhsBRmM19Ax5xEIPLMY9ZmJ/cDvd1BG3UVvt5h3WRxKg5zGRbvnteTyWAbzeSvlh3tW7ZEmq4VwR5mB3tutmQ==} - - d3-scale-chromatic@3.0.0: - resolution: {integrity: sha512-Lx9thtxAKrO2Pq6OO2Ua474opeziKr279P/TKZsMAhYyNDD3EnCffdbgeSYN5O7m2ByQsxtuP2CSDczNUIZ22g==} - engines: {node: '>=12'} - - d3-scale@4.0.2: - resolution: {integrity: sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==} - engines: {node: '>=12'} - - d3-selection@3.0.0: - resolution: {integrity: sha512-fmTRWbNMmsmWq6xJV8D19U/gw/bwrHfNXxrIN+HfZgnzqTHp9jOmKMhsTUjXOJnZOdZY9Q28y4yebKzqDKlxlQ==} - engines: {node: '>=12'} - - d3-shape@1.3.7: - resolution: {integrity: sha512-EUkvKjqPFUAZyOlhY5gzCxCeI0Aep04LwIRpsZ/mLFelJiUfnK56jo5JMDSE7yyP2kLSb6LtF+S5chMk7uqPqw==} - - d3-shape@3.2.0: - resolution: {integrity: sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==} - engines: {node: '>=12'} - - d3-time-format@4.1.0: - resolution: {integrity: sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==} - engines: {node: '>=12'} - - d3-time@3.1.0: - resolution: {integrity: sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==} - engines: {node: '>=12'} - - d3-timer@3.0.1: - resolution: {integrity: sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==} - engines: {node: '>=12'} - - d3-transition@3.0.1: - resolution: {integrity: sha512-ApKvfjsSR6tg06xrL434C0WydLr7JewBB3V+/39RMHsaXTOG0zmt/OAXeng5M5LBm0ojmxJrpomQVZ1aPvBL4w==} - engines: {node: '>=12'} - peerDependencies: - d3-selection: 2 - 3 - - d3-zoom@3.0.0: - resolution: {integrity: sha512-b8AmV3kfQaqWAuacbPuNbL6vahnOJflOhexLzMMNLga62+/nh0JzvJ0aO/5a5MVgUFGS7Hu1P9P03o3fJkDCyw==} - engines: {node: '>=12'} - - d3@7.9.0: - resolution: {integrity: sha512-e1U46jVP+w7Iut8Jt8ri1YsPOvFpg46k+K8TpCb0P+zjCkjkPnV7WzfDJzMHy1LnA+wj5pLT1wjO901gLXeEhA==} - engines: {node: '>=12'} - - dagre-d3-es@7.0.11: - resolution: {integrity: sha512-tvlJLyQf834SylNKax8Wkzco/1ias1OPw8DcUMDE7oUIoSEW25riQVuiu/0OWEFqT0cxHT3Pa9/D82Jr47IONw==} - - data-uri-to-buffer@6.0.2: - resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} - engines: {node: '>= 14'} - - dayjs@1.11.13: - resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} - - debounce@1.2.1: - resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} - - debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.4.0: - resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - decode-named-character-reference@1.0.2: - resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} - - decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - - deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - - default-gateway@6.0.3: - resolution: {integrity: sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==} - engines: {node: '>= 10'} - - defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - - define-data-property@1.1.1: - resolution: {integrity: sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==} - engines: {node: '>= 0.4'} - - define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - - delaunator@5.0.0: - resolution: {integrity: sha512-AyLvtyJdbv/U1GkiS6gUUzclRoAY4Gs75qkMygJJhU75LW4DNuSF2RMzpxs9jw9Oz1BobHjTdkG3zdP55VxAqw==} - - depd@1.1.2: - resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} - engines: {node: '>= 0.6'} - - depd@2.0.0: - resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} - engines: {node: '>= 0.8'} - - dequal@2.0.3: - resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} - engines: {node: '>=6'} - - destroy@1.2.0: - resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} - engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - - detect-libc@2.0.2: - resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} - engines: {node: '>=8'} - - detect-node@2.1.0: - resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} - - detect-port@1.5.1: - resolution: {integrity: sha512-aBzdj76lueB6uUst5iAs7+0H/oOjqI5D16XUWxlWMIMROhcM0rfsNVk93zTngq1dDNpoXRr++Sus7ETAExppAQ==} - hasBin: true - - devlop@1.1.0: - resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} - - devtools-protocol@0.0.1312386: - resolution: {integrity: sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==} - - diff@5.1.0: - resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} - engines: {node: '>=0.3.1'} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dns-packet@5.6.1: - resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==} - engines: {node: '>=6'} - - dom-converter@0.2.0: - resolution: {integrity: sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==} - - dom-serializer@1.4.1: - resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} - - dom-serializer@2.0.0: - resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} - - domelementtype@2.3.0: - resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} - - domhandler@4.3.1: - resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} - engines: {node: '>= 4'} - - domhandler@5.0.3: - resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} - engines: {node: '>= 4'} - - dompurify@3.2.5: - resolution: {integrity: sha512-mLPd29uoRe9HpvwP2TxClGQBzGXeEC/we/q+bFlmPPmj2p2Ugl3r6ATu/UU1v77DXNcehiBg9zsr1dREyA/dJQ==} - - domutils@2.8.0: - resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} - - domutils@3.1.0: - resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - - dot-prop@6.0.1: - resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} - engines: {node: '>=10'} - - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - ee-first@1.1.1: - resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - - electron-to-chromium@1.5.165: - resolution: {integrity: sha512-naiMx1Z6Nb2TxPU6fiFrUrDTjyPMLdTtaOd2oLmG8zVSg2hCWGkhPyxwk+qRmZ1ytwVqUv0u7ZcDA5+ALhaUtw==} - - electron-to-chromium@1.5.87: - resolution: {integrity: sha512-mPFwmEWmRivw2F8x3w3l2m6htAUN97Gy0kwpO++2m9iT1Gt8RCFVUfv9U/sIbHJ6rY4P6/ooqFL/eL7ock+pPg==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - emojilib@2.4.0: - resolution: {integrity: sha512-5U0rVMU5Y2n2+ykNLQqMoqklN9ICBT/KsvC1Gz6vqHbz2AXXGkG+Pm5rMWk/8Vjrr/mY9985Hi8DYzn1F09Nyw==} - - emojis-list@3.0.0: - resolution: {integrity: sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==} - engines: {node: '>= 4'} - - emoticon@4.0.1: - resolution: {integrity: sha512-dqx7eA9YaqyvYtUhJwT4rC1HIp82j5ybS1/vQ42ur+jBe17dJMwZE4+gvL1XadSFfxaPFFGt3Xsw+Y8akThDlw==} - - encodeurl@1.0.2: - resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} - engines: {node: '>= 0.8'} - - end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - - enhanced-resolve@5.18.0: - resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} - engines: {node: '>=10.13.0'} - - entities@2.2.0: - resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} - - entities@4.5.0: - resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} - engines: {node: '>=0.12'} - - env-paths@2.2.1: - resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} - engines: {node: '>=6'} - - error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - - es-module-lexer@1.4.1: - resolution: {integrity: sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==} - - escalade@3.2.0: - resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} - engines: {node: '>=6'} - - escape-goat@4.0.0: - resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} - engines: {node: '>=12'} - - escape-html@1.0.3: - resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} - - escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - escape-string-regexp@5.0.0: - resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} - engines: {node: '>=12'} - - escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - - eslint-scope@5.1.1: - resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} - engines: {node: '>=8.0.0'} - - esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@4.3.0: - resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - estree-util-attach-comments@2.1.1: - resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} - - estree-util-attach-comments@3.0.0: - resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} - - estree-util-build-jsx@3.0.1: - resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} - - estree-util-is-identifier-name@2.1.0: - resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} - - estree-util-is-identifier-name@3.0.0: - resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} - - estree-util-to-js@1.2.0: - resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} - - estree-util-to-js@2.0.0: - resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} - - estree-util-value-to-estree@3.0.1: - resolution: {integrity: sha512-b2tdzTurEIbwRh+mKrEcaWfu1wgb8J1hVsgREg7FFiecWwK/PhO8X0kyc+0bIcKNtD4sqxIdNoRy6/p/TvECEA==} - engines: {node: '>=16.0.0'} - - estree-util-visit@1.2.1: - resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} - - estree-util-visit@2.0.0: - resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} - - estree-walker@3.0.3: - resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - eta@2.2.0: - resolution: {integrity: sha512-UVQ72Rqjy/ZKQalzV5dCCJP80GrmPrMxh6NlNf+erV6ObL0ZFkhCstWRawS85z3smdr3d2wXPsZEY7rDPfGd2g==} - engines: {node: '>=6.0.0'} - - etag@1.8.1: - resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} - engines: {node: '>= 0.6'} - - eval@0.1.8: - resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} - engines: {node: '>= 0.8'} - - eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - - events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - - expand-template@2.0.3: - resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} - engines: {node: '>=6'} - - express@4.19.2: - resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} - engines: {node: '>= 0.10.0'} - - extend-shallow@2.0.1: - resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} - engines: {node: '>=0.10.0'} - - extend@3.0.2: - resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - - extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fastq@1.16.0: - resolution: {integrity: sha512-ifCoaXsDrsdkWTtiNJX5uzHDsrck5TzfKKDcuFFTIrrc/BS076qgEIfoIy1VeZqViznfKiysPYTh/QeHtnIsYA==} - - fault@2.0.1: - resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} - - faye-websocket@0.11.4: - resolution: {integrity: sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==} - engines: {node: '>=0.8.0'} - - fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - - feed@4.2.2: - resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==} - engines: {node: '>=0.4.0'} - - figures@3.2.0: - resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} - engines: {node: '>=8'} - - file-loader@6.2.0: - resolution: {integrity: sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - - finalhandler@1.2.0: - resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} - engines: {node: '>= 0.8'} - - find-cache-dir@4.0.0: - resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} - engines: {node: '>=14.16'} - - find-up@6.3.0: - resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - flat@5.0.2: - resolution: {integrity: sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==} - hasBin: true - - follow-redirects@1.15.6: - resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - - form-data-encoder@2.1.4: - resolution: {integrity: sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw==} - engines: {node: '>= 14.17'} - - format@0.2.2: - resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} - engines: {node: '>=0.4.x'} - - forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - fraction.js@4.3.7: - resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} - - fresh@0.5.2: - resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} - engines: {node: '>= 0.6'} - - fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - - fs-extra@11.2.0: - resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} - engines: {node: '>=14.14'} - - fs-monkey@1.0.5: - resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - - get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - get-intrinsic@1.2.2: - resolution: {integrity: sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==} - - get-own-enumerable-property-symbols@3.0.2: - resolution: {integrity: sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==} - - get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - - get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - - get-uri@6.0.4: - resolution: {integrity: sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==} - engines: {node: '>= 14'} - - github-from-package@0.0.0: - resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} - - github-slugger@1.5.0: - resolution: {integrity: sha512-wIh+gKBI9Nshz2o46B0B3f5k/W+WI9ZAv6y5Dn5WJ5SK1t0TnDimB4WE5rmTD05ZAIn8HALCZVmCsvj0w0v0lw==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob-to-regexp@0.4.1: - resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - global-dirs@3.0.1: - resolution: {integrity: sha512-NBcGGFbBA9s1VzD41QXDG+3++t9Mn5t1FpLdhESY6oKY4gYTFpX4wO3sqGUa0Srjtbfj3szX0RnemmrVRUdULA==} - engines: {node: '>=10'} - - globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - - globals@15.14.0: - resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} - engines: {node: '>=18'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - got@12.6.1: - resolution: {integrity: sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ==} - engines: {node: '>=14.16'} - - graceful-fs@4.2.10: - resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - gray-matter@4.0.3: - resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} - engines: {node: '>=6.0'} - - gzip-size@6.0.0: - resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} - engines: {node: '>=10'} - - hachure-fill@0.5.2: - resolution: {integrity: sha512-3GKBOn+m2LX9iq+JC1064cSFprJY4jL1jCXTcpnfER5HYE2l/4EfWSGzkPa/ZDBmYI0ZOEj5VHV/eKnPGkHuOg==} - - handle-thing@2.0.1: - resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} - - has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.1: - resolution: {integrity: sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==} - - has-proto@1.0.1: - resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-yarn@3.0.0: - resolution: {integrity: sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - hasown@2.0.0: - resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} - engines: {node: '>= 0.4'} - - hast-util-from-html@1.0.2: - resolution: {integrity: sha512-LhrTA2gfCbLOGJq2u/asp4kwuG0y6NhWTXiPKP+n0qNukKy7hc10whqqCFfyvIA1Q5U5d0sp9HhNim9gglEH4A==} - - hast-util-from-parse5@7.1.2: - resolution: {integrity: sha512-Nz7FfPBuljzsN3tCQ4kCBKqdNhQE2l0Tn+X1ubgKBPRoiDIu1mL08Cfw4k7q71+Duyaw7DXDN+VTAp4Vh3oCOw==} - - hast-util-from-parse5@8.0.1: - resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} - - hast-util-parse-selector@3.1.1: - resolution: {integrity: sha512-jdlwBjEexy1oGz0aJ2f4GKMaVKkA9jwjr4MjAAI22E5fM/TXVZHuS5OpONtdeIkRKqAaryQ2E9xNQxijoThSZA==} - - hast-util-parse-selector@4.0.0: - resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} - - hast-util-raw@9.0.1: - resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} - - hast-util-to-estree@2.3.3: - resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} - - hast-util-to-estree@3.1.0: - resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} - - hast-util-to-jsx-runtime@2.3.0: - resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} - - hast-util-to-parse5@8.0.0: - resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} - - hast-util-whitespace@2.0.1: - resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} - - hast-util-whitespace@3.0.0: - resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} - - hastscript@7.2.0: - resolution: {integrity: sha512-TtYPq24IldU8iKoJQqvZOuhi5CyCQRAbvDOX0x1eW6rsHSxa/1i2CCiptNTotGHJ3VoHRGmqiv6/D3q113ikkw==} - - hastscript@8.0.0: - resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} - - he@1.2.0: - resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} - hasBin: true - - history@4.10.1: - resolution: {integrity: sha512-36nwAD620w12kuzPAsyINPWJqlNbij+hpK1k9XRloDtym8mxzGYl2c17LnV6IAGB2Dmg4tEa7G7DlawS0+qjew==} - - hoist-non-react-statics@3.3.2: - resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} - - hpack.js@2.1.6: - resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==} - - html-entities@2.4.0: - resolution: {integrity: sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==} - - html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - - html-minifier-terser@6.1.0: - resolution: {integrity: sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==} - engines: {node: '>=12'} - hasBin: true - - html-minifier-terser@7.2.0: - resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} - engines: {node: ^14.13.1 || >=16.0.0} - hasBin: true - - html-tags@3.3.1: - resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} - engines: {node: '>=8'} - - html-void-elements@3.0.0: - resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} - - html-webpack-plugin@5.6.0: - resolution: {integrity: sha512-iwaY4wzbe48AfKLZ/Cc8k0L+FKG6oSNRaZ8x5A/T/IVDGyXcbHncM9TdDa93wn0FsSm82FhTKW7f3vS61thXAw==} - engines: {node: '>=10.13.0'} - peerDependencies: - '@rspack/core': 0.x || 1.x - webpack: ^5.20.0 - peerDependenciesMeta: - '@rspack/core': - optional: true - webpack: - optional: true - - htmlparser2@6.1.0: - resolution: {integrity: sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==} - - htmlparser2@8.0.2: - resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} - - http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - - http-deceiver@1.2.7: - resolution: {integrity: sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==} - - http-errors@1.6.3: - resolution: {integrity: sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==} - engines: {node: '>= 0.6'} - - http-errors@2.0.0: - resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} - engines: {node: '>= 0.8'} - - http-parser-js@0.5.8: - resolution: {integrity: sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==} - - http-proxy-agent@7.0.2: - resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} - engines: {node: '>= 14'} - - http-proxy-middleware@2.0.6: - resolution: {integrity: sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==} - engines: {node: '>=12.0.0'} - peerDependencies: - '@types/express': ^4.17.13 - peerDependenciesMeta: - '@types/express': - optional: true - - http-proxy@1.18.1: - resolution: {integrity: sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==} - engines: {node: '>=8.0.0'} - - http2-wrapper@2.2.1: - resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==} - engines: {node: '>=10.19.0'} - - https-proxy-agent@7.0.6: - resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} - engines: {node: '>= 14'} - - human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - - iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - - iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - - icss-utils@5.1.0: - resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - ignore@5.3.0: - resolution: {integrity: sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==} - engines: {node: '>= 4'} - - image-size@2.0.2: - resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} - engines: {node: '>=16.x'} - hasBin: true - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - import-lazy@4.0.0: - resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} - engines: {node: '>=8'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - indent-string@4.0.0: - resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} - engines: {node: '>=8'} - - infima@0.2.0-alpha.45: - resolution: {integrity: sha512-uyH0zfr1erU1OohLk0fT4Rrb94AOhguWNOcD9uGrSpRvNB+6gZXUoJX5J0NtvzBO10YZ9PgvA4NFgt+fYg8ojw==} - engines: {node: '>=12'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.3: - resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==} - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - ini@1.3.8: - resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - - ini@2.0.0: - resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} - engines: {node: '>=10'} - - inline-style-parser@0.1.1: - resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} - - inline-style-parser@0.2.2: - resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} - - internmap@1.0.1: - resolution: {integrity: sha512-lDB5YccMydFBtasVtxnZ3MRBHuaoE8GKsppq+EchKL2U4nK/DmEpPHNH8MZe5HkMtpSiTSOZwfN0tzYjO/lJEw==} - - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - - invariant@2.2.4: - resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==} - - ip-address@9.0.5: - resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} - engines: {node: '>= 12'} - - ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - ipaddr.js@2.1.0: - resolution: {integrity: sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==} - engines: {node: '>= 10'} - - is-alphabetical@2.0.1: - resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} - - is-alphanumerical@2.0.1: - resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} - - is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - is-arrayish@0.3.2: - resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-buffer@2.0.5: - resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} - engines: {node: '>=4'} - - is-ci@3.0.1: - resolution: {integrity: sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==} - hasBin: true - - is-core-module@2.13.1: - resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} - - is-decimal@2.0.1: - resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} - - is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - is-extendable@0.1.1: - resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} - engines: {node: '>=0.10.0'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-hexadecimal@2.0.1: - resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} - - is-installed-globally@0.4.0: - resolution: {integrity: sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==} - engines: {node: '>=10'} - - is-npm@6.0.0: - resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-obj@1.0.1: - resolution: {integrity: sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==} - engines: {node: '>=0.10.0'} - - is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-plain-obj@3.0.0: - resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} - engines: {node: '>=10'} - - is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - - is-plain-object@2.0.4: - resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==} - engines: {node: '>=0.10.0'} - - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - - is-regexp@1.0.0: - resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==} - engines: {node: '>=0.10.0'} - - is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - - is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - - is-yarn-global@0.4.1: - resolution: {integrity: sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ==} - engines: {node: '>=12'} - - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - - isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - isobject@3.0.1: - resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} - engines: {node: '>=0.10.0'} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jest-worker@27.5.1: - resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} - engines: {node: '>= 10.13.0'} - - jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - - jiti@1.21.0: - resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} - hasBin: true - - joi@17.11.0: - resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - jsbn@1.1.0: - resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} - - jsesc@0.5.0: - resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} - hasBin: true - - jsesc@3.0.2: - resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} - engines: {node: '>=6'} - hasBin: true - - jsesc@3.1.0: - resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==} - engines: {node: '>=6'} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - - jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - - katex@0.16.10: - resolution: {integrity: sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==} - hasBin: true - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - khroma@2.1.0: - resolution: {integrity: sha512-Ls993zuzfayK269Svk9hzpeGUKob/sIgZzyHYdjQoAdQetRKpOLj+k/QQQ/6Qi0Yz65mlROrfd+Ev+1+7dz9Kw==} - - kind-of@6.0.3: - resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} - engines: {node: '>=0.10.0'} - - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - - kleur@4.1.5: - resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} - engines: {node: '>=6'} - - kolorist@1.8.0: - resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} - - langium@3.3.1: - resolution: {integrity: sha512-QJv/h939gDpvT+9SiLVlY7tZC3xB2qK57v0J04Sh9wpMb6MP1q8gB21L3WIo8T5P1MSMg3Ep14L7KkDCFG3y4w==} - engines: {node: '>=16.0.0'} - - latest-version@7.0.0: - resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} - engines: {node: '>=14.16'} - - launch-editor@2.6.1: - resolution: {integrity: sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==} - - layout-base@1.0.2: - resolution: {integrity: sha512-8h2oVEZNktL4BH2JCOI90iD1yXwL6iNW7KcCKT2QZgQJR2vbqDsldCTPRU9NifTCqHZci57XvQQ15YTu+sTYPg==} - - layout-base@2.0.1: - resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - - leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - - lilconfig@3.1.1: - resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - loader-runner@4.3.0: - resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} - engines: {node: '>=6.11.5'} - - loader-utils@2.0.4: - resolution: {integrity: sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==} - engines: {node: '>=8.9.0'} - - local-pkg@0.5.1: - resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} - engines: {node: '>=14'} - - locate-path@7.2.0: - resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lodash-es@4.17.21: - resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} - - lodash.debounce@4.0.8: - resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - - lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - - lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - - lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - longest-streak@3.1.0: - resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - - lowercase-keys@3.0.0: - resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - lru-cache@10.1.0: - resolution: {integrity: sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==} - engines: {node: 14 || >=16.14} - - lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - - lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - - markdown-extensions@2.0.0: - resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} - engines: {node: '>=16'} - - markdown-table@2.0.0: - resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} - - markdown-table@3.0.3: - resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} - - marked@15.0.8: - resolution: {integrity: sha512-rli4l2LyZqpQuRve5C0rkn6pj3hT8EWPC+zkAxFTAJLxRbENfTAhEQq9itrmf1Y81QtAX5D/MYlGlIomNgj9lA==} - engines: {node: '>= 18'} - hasBin: true - - mdast-util-directive@3.0.0: - resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} - - mdast-util-find-and-replace@3.0.1: - resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} - - mdast-util-from-markdown@1.3.1: - resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} - - mdast-util-from-markdown@2.0.0: - resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} - - mdast-util-frontmatter@2.0.1: - resolution: {integrity: sha512-LRqI9+wdgC25P0URIJY9vwocIzCcksduHQ9OF2joxQoyTNVduwLAFUzjoopuRJbJAReaKrNQKAZKL3uCMugWJA==} - - mdast-util-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} - - mdast-util-gfm-footnote@2.0.0: - resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} - - mdast-util-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} - - mdast-util-gfm-table@2.0.0: - resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} - - mdast-util-gfm-task-list-item@2.0.0: - resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} - - mdast-util-gfm@3.0.0: - resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} - - mdast-util-mdx-expression@1.3.2: - resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} - - mdast-util-mdx-expression@2.0.0: - resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} - - mdast-util-mdx-jsx@2.1.4: - resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} - - mdast-util-mdx-jsx@3.0.0: - resolution: {integrity: sha512-XZuPPzQNBPAlaqsTTgRrcJnyFbSOBovSadFgbFu8SnuNgm+6Bdx1K+IWoitsmj6Lq6MNtI+ytOqwN70n//NaBA==} - - mdast-util-mdx@2.0.1: - resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} - - mdast-util-mdx@3.0.0: - resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} - - mdast-util-mdxjs-esm@1.3.1: - resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} - - mdast-util-mdxjs-esm@2.0.1: - resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} - - mdast-util-phrasing@3.0.1: - resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} - - mdast-util-phrasing@4.0.0: - resolution: {integrity: sha512-xadSsJayQIucJ9n053dfQwVu1kuXg7jCTdYsMK8rqzKZh52nLfSH/k0sAxE0u+pj/zKZX+o5wB+ML5mRayOxFA==} - - mdast-util-to-hast@13.1.0: - resolution: {integrity: sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==} - - mdast-util-to-markdown@1.5.0: - resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} - - mdast-util-to-markdown@2.1.0: - resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} - - mdast-util-to-string@3.2.0: - resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} - - mdast-util-to-string@4.0.0: - resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} - - mdn-data@2.0.28: - resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} - - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - - mdx-mermaid@2.0.3: - resolution: {integrity: sha512-aVLaaVbQD8KmqzEk2AdLFb02MMENWkq5QQPD25sdtiswTIWk684JoaCOmy8oV+w3pthkcy2lRp0xVKIq1sLsqg==} - peerDependencies: - mermaid: '>=8.11.0' - react: ^16.8.4 || ^17.0.0 || ^18.0.0 || ^19.0.0 - unist-util-visit: ^4.1.0 - - media-typer@0.3.0: - resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} - engines: {node: '>= 0.6'} - - memfs@3.5.3: - resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} - engines: {node: '>= 4.0.0'} - - merge-descriptors@1.0.1: - resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - mermaid@11.8.1: - resolution: {integrity: sha512-VSXJLqP1Sqw5sGr273mhvpPRhXwE6NlmMSqBZQw+yZJoAJkOIPPn/uT3teeCBx60Fkt5zEI3FrH2eVT0jXRDzw==} - - methods@1.1.2: - resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} - engines: {node: '>= 0.6'} - - micromark-core-commonmark@1.1.0: - resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} - - micromark-core-commonmark@2.0.0: - resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} - - micromark-extension-directive@3.0.0: - resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} - - micromark-extension-frontmatter@2.0.0: - resolution: {integrity: sha512-C4AkuM3dA58cgZha7zVnuVxBhDsbttIMiytjgsM2XbHAB2faRVaHRle40558FBN+DJcrLNCoqG5mlrpdU4cRtg==} - - micromark-extension-gfm-autolink-literal@2.0.0: - resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} - - micromark-extension-gfm-footnote@2.0.0: - resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} - - micromark-extension-gfm-strikethrough@2.0.0: - resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} - - micromark-extension-gfm-table@2.0.0: - resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} - - micromark-extension-gfm-tagfilter@2.0.0: - resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} - - micromark-extension-gfm-task-list-item@2.0.1: - resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} - - micromark-extension-gfm@3.0.0: - resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} - - micromark-extension-mdx-expression@1.0.8: - resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} - - micromark-extension-mdx-expression@3.0.0: - resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} - - micromark-extension-mdx-jsx@1.0.5: - resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} - - micromark-extension-mdx-jsx@3.0.0: - resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} - - micromark-extension-mdx-md@1.0.1: - resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} - - micromark-extension-mdx-md@2.0.0: - resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} - - micromark-extension-mdxjs-esm@1.0.5: - resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} - - micromark-extension-mdxjs-esm@3.0.0: - resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} - - micromark-extension-mdxjs@1.0.1: - resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} - - micromark-extension-mdxjs@3.0.0: - resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} - - micromark-factory-destination@1.1.0: - resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} - - micromark-factory-destination@2.0.0: - resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} - - micromark-factory-label@1.1.0: - resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} - - micromark-factory-label@2.0.0: - resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} - - micromark-factory-mdx-expression@1.0.9: - resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} - - micromark-factory-mdx-expression@2.0.1: - resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} - - micromark-factory-space@1.1.0: - resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} - - micromark-factory-space@2.0.0: - resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} - - micromark-factory-title@1.1.0: - resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} - - micromark-factory-title@2.0.0: - resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} - - micromark-factory-whitespace@1.1.0: - resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} - - micromark-factory-whitespace@2.0.0: - resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} - - micromark-util-character@1.2.0: - resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} - - micromark-util-character@2.0.1: - resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} - - micromark-util-chunked@1.1.0: - resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} - - micromark-util-chunked@2.0.0: - resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} - - micromark-util-classify-character@1.1.0: - resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} - - micromark-util-classify-character@2.0.0: - resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} - - micromark-util-combine-extensions@1.1.0: - resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} - - micromark-util-combine-extensions@2.0.0: - resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} - - micromark-util-decode-numeric-character-reference@1.1.0: - resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} - - micromark-util-decode-numeric-character-reference@2.0.1: - resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} - - micromark-util-decode-string@1.1.0: - resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} - - micromark-util-decode-string@2.0.0: - resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} - - micromark-util-encode@1.1.0: - resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} - - micromark-util-encode@2.0.0: - resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} - - micromark-util-events-to-acorn@1.2.3: - resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} - - micromark-util-events-to-acorn@2.0.2: - resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} - - micromark-util-html-tag-name@1.2.0: - resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} - - micromark-util-html-tag-name@2.0.0: - resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} - - micromark-util-normalize-identifier@1.1.0: - resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} - - micromark-util-normalize-identifier@2.0.0: - resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} - - micromark-util-resolve-all@1.1.0: - resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} - - micromark-util-resolve-all@2.0.0: - resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} - - micromark-util-sanitize-uri@1.2.0: - resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} - - micromark-util-sanitize-uri@2.0.0: - resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} - - micromark-util-subtokenize@1.1.0: - resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} - - micromark-util-subtokenize@2.0.0: - resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} - - micromark-util-symbol@1.1.0: - resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} - - micromark-util-symbol@2.0.0: - resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} - - micromark-util-types@1.1.0: - resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} - - micromark-util-types@2.0.0: - resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} - - micromark@3.2.0: - resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} - - micromark@4.0.0: - resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} - - micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - - mime-db@1.33.0: - resolution: {integrity: sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==} - engines: {node: '>= 0.6'} - - mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - - mime-types@2.1.18: - resolution: {integrity: sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==} - engines: {node: '>= 0.6'} - - mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - - mime@1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} - engines: {node: '>=4'} - hasBin: true - - mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - - mimic-response@4.0.0: - resolution: {integrity: sha512-e5ISH9xMYU0DzrT+jl8q2ze9D6eWBto+I8CNpe+VI+K2J/F/k3PdkdTdz4wvGVH4NTpo+NRYTVIuMQEMMcsLqg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - mini-css-extract-plugin@2.9.2: - resolution: {integrity: sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^5.0.0 - - minimalistic-assert@1.0.1: - resolution: {integrity: sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - - mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - - mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - - mrmime@2.0.0: - resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} - engines: {node: '>=10'} - - ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - multicast-dns@7.2.5: - resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} - hasBin: true - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.3.11: - resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - napi-build-utils@1.0.2: - resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - - negotiator@0.6.3: - resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} - engines: {node: '>= 0.6'} - - neo-async@2.6.2: - resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} - - netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - - node-abi@3.54.0: - resolution: {integrity: sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==} - engines: {node: '>=10'} - - node-addon-api@6.1.0: - resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - - node-emoji@2.1.3: - resolution: {integrity: sha512-E2WEOVsgs7O16zsURJ/eH8BqhF029wGpEOnv7Urwdo2wmQanOACwJQh0devF9D9RhoZru0+9JXIS0dBXIAz+lA==} - engines: {node: '>=18'} - - node-forge@1.3.1: - resolution: {integrity: sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==} - engines: {node: '>= 6.13.0'} - - node-releases@2.0.19: - resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - normalize-range@0.1.2: - resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} - engines: {node: '>=0.10.0'} - - normalize-url@8.0.0: - resolution: {integrity: sha512-uVFpKhj5MheNBJRTiMZ9pE/7hD1QTeEvugSJW/OmLzAp78PB5O6adfMNTvmfKhXBkvCzC+rqifWcVYpGFwTjnw==} - engines: {node: '>=14.16'} - - npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - - npm-to-yarn@3.0.1: - resolution: {integrity: sha512-tt6PvKu4WyzPwWUzy/hvPFqn+uwXO0K1ZHka8az3NnrhWJDmSqI8ncWq0fkL0k/lmmi5tAC11FXwXuh0rFbt1A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - nprogress@0.2.0: - resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} - - nth-check@2.1.1: - resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} - - null-loader@4.0.1: - resolution: {integrity: sha512-pxqVbi4U6N26lq+LmgIbB5XATP0VdZKOG25DhHi8btMmJJefGArFyDg1yc4U3hWCJbMqSrw0qyrz1UQX+qYXqg==} - engines: {node: '>= 10.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-inspect@1.13.1: - resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - - on-finished@2.4.1: - resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} - engines: {node: '>= 0.8'} - - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - - open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - - opener@1.5.2: - resolution: {integrity: sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==} - hasBin: true - - os-homedir@1.0.2: - resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} - engines: {node: '>=0.10.0'} - - p-cancelable@3.0.0: - resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==} - engines: {node: '>=12.20'} - - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - - p-limit@4.0.0: - resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-locate@6.0.0: - resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - p-map@4.0.0: - resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} - engines: {node: '>=10'} - - p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - - p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - - p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - - pac-proxy-agent@7.1.0: - resolution: {integrity: sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==} - engines: {node: '>= 14'} - - pac-resolver@7.0.1: - resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} - engines: {node: '>= 14'} - - package-json@8.1.1: - resolution: {integrity: sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA==} - engines: {node: '>=14.16'} - - package-manager-detector@0.2.8: - resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} - - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - parse-entities@4.0.1: - resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} - - parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - - parse-numeric-range@1.3.0: - resolution: {integrity: sha512-twN+njEipszzlMJd4ONUYgSfZPDxgHhT9Ahed5uTigpQn90FggW4SA/AIPq/6a149fTbE9qBEcSwE3FAEp6wQQ==} - - parse5-htmlparser2-tree-adapter@7.0.0: - resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} - - parse5@7.1.2: - resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} - - parseurl@1.3.3: - resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} - engines: {node: '>= 0.8'} - - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - - path-data-parser@0.1.0: - resolution: {integrity: sha512-NOnmBpt5Y2RWbuv0LMzsayp3lVylAHLPUTut412ZA3l+C4uw4ZVkQbjShYCQ8TCpUMdPapr4YjUqLYD6v68j+w==} - - path-exists@5.0.0: - resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-is-inside@1.0.2: - resolution: {integrity: sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - - path-to-regexp@0.1.7: - resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} - - path-to-regexp@1.8.0: - resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} - - path-to-regexp@3.3.0: - resolution: {integrity: sha512-qyCH421YQPS2WFDxDjftfc1ZR5WKQzVzqsp4n9M2kQhVOo/ByahFoUNJfl58kOcEGfQ//7weFTDhm+ss8Ecxgw==} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - pathe@2.0.2: - resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} - - pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - - picocolors@1.1.1: - resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - pkg-dir@7.0.0: - resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} - engines: {node: '>=14.16'} - - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - - points-on-curve@0.2.0: - resolution: {integrity: sha512-0mYKnYYe9ZcqMCWhUjItv/oHjvgEsfKvnUTg8sAtnHr3GVy7rGkXCb6d5cSyqrWqL4k81b9CPg3urd+T7aop3A==} - - points-on-path@0.2.1: - resolution: {integrity: sha512-25ClnWWuw7JbWZcgqY/gJ4FQWadKxGWk+3kR/7kD0tCaDtPPMj7oHu2ToLaVhfpnHrZzYby2w6tUA0eOIuUg8g==} - - postcss-attribute-case-insensitive@7.0.1: - resolution: {integrity: sha512-Uai+SupNSqzlschRyNx3kbCTWgY/2hcwtHEI/ej2LJWc9JJ77qKgGptd8DHwY1mXtZ7Aoh4z4yxfwMBue9eNgw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-calc@9.0.1: - resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.2.2 - - postcss-clamp@4.1.0: - resolution: {integrity: sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==} - engines: {node: '>=7.6.0'} - peerDependencies: - postcss: ^8.4.6 - - postcss-color-functional-notation@7.0.10: - resolution: {integrity: sha512-k9qX+aXHBiLTRrWoCJuUFI6F1iF6QJQUXNVWJVSbqZgj57jDhBlOvD8gNUGl35tgqDivbGLhZeW3Ongz4feuKA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-color-hex-alpha@10.0.0: - resolution: {integrity: sha512-1kervM2cnlgPs2a8Vt/Qbe5cQ++N7rkYo/2rz2BkqJZIHQwaVuJgQH38REHrAi4uM0b1fqxMkWYmese94iMp3w==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-color-rebeccapurple@10.0.0: - resolution: {integrity: sha512-JFta737jSP+hdAIEhk1Vs0q0YF5P8fFcj+09pweS8ktuGuZ8pPlykHsk6mPxZ8awDl4TrcxUqJo9l1IhVr/OjQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-colormin@6.1.0: - resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-convert-values@6.1.0: - resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-custom-media@11.0.6: - resolution: {integrity: sha512-C4lD4b7mUIw+RZhtY7qUbf4eADmb7Ey8BFA2px9jUbwg7pjTZDl4KY4bvlUV+/vXQvzQRfiGEVJyAbtOsCMInw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-custom-properties@14.0.6: - resolution: {integrity: sha512-fTYSp3xuk4BUeVhxCSJdIPhDLpJfNakZKoiTDx7yRGCdlZrSJR7mWKVOBS4sBF+5poPQFMj2YdXx1VHItBGihQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-custom-selectors@8.0.5: - resolution: {integrity: sha512-9PGmckHQswiB2usSO6XMSswO2yFWVoCAuih1yl9FVcwkscLjRKjwsjM3t+NIWpSU2Jx3eOiK2+t4vVTQaoCHHg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-dir-pseudo-class@9.0.1: - resolution: {integrity: sha512-tRBEK0MHYvcMUrAuYMEOa0zg9APqirBcgzi6P21OhxtJyJADo/SWBwY1CAwEohQ/6HDaa9jCjLRG7K3PVQYHEA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-discard-comments@6.0.2: - resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-duplicates@6.0.3: - resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-empty@6.0.3: - resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-overridden@6.0.2: - resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-discard-unused@6.0.5: - resolution: {integrity: sha512-wHalBlRHkaNnNwfC8z+ppX57VhvS+HWgjW508esjdaEYr3Mx7Gnn2xA4R/CKf5+Z9S5qsqC+Uzh4ueENWwCVUA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-double-position-gradients@6.0.2: - resolution: {integrity: sha512-7qTqnL7nfLRyJK/AHSVrrXOuvDDzettC+wGoienURV8v2svNbu6zJC52ruZtHaO6mfcagFmuTGFdzRsJKB3k5Q==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-focus-visible@10.0.1: - resolution: {integrity: sha512-U58wyjS/I1GZgjRok33aE8juW9qQgQUNwTSdxQGuShHzwuYdcklnvK/+qOWX1Q9kr7ysbraQ6ht6r+udansalA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-focus-within@9.0.1: - resolution: {integrity: sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-font-variant@5.0.0: - resolution: {integrity: sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==} - peerDependencies: - postcss: ^8.1.0 - - postcss-gap-properties@6.0.0: - resolution: {integrity: sha512-Om0WPjEwiM9Ru+VhfEDPZJAKWUd0mV1HmNXqp2C29z80aQ2uP9UVhLc7e3aYMIor/S5cVhoPgYQ7RtfeZpYTRw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-image-set-function@7.0.0: - resolution: {integrity: sha512-QL7W7QNlZuzOwBTeXEmbVckNt1FSmhQtbMRvGGqqU4Nf4xk6KUEQhAoWuMzwbSv5jxiRiSZ5Tv7eiDB9U87znA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-lab-function@7.0.10: - resolution: {integrity: sha512-tqs6TCEv9tC1Riq6fOzHuHcZyhg4k3gIAMB8GGY/zA1ssGdm6puHMVE7t75aOSoFg7UD2wyrFFhbldiCMyyFTQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-loader@7.3.4: - resolution: {integrity: sha512-iW5WTTBSC5BfsBJ9daFMPVrLT36MrNiC6fqOZTTaHjBNX6Pfd5p+hSBqe/fEeNd7pc13QiAyGt7VdGMw4eRC4A==} - engines: {node: '>= 14.15.0'} - peerDependencies: - postcss: ^7.0.0 || ^8.0.1 - webpack: ^5.0.0 - - postcss-logical@8.1.0: - resolution: {integrity: sha512-pL1hXFQ2fEXNKiNiAgtfA005T9FBxky5zkX6s4GZM2D8RkVgRqz3f4g1JUoq925zXv495qk8UNldDwh8uGEDoA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-merge-idents@6.0.3: - resolution: {integrity: sha512-1oIoAsODUs6IHQZkLQGO15uGEbK3EAl5wi9SS8hs45VgsxQfMnxvt+L+zIr7ifZFIH14cfAeVe2uCTa+SPRa3g==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-merge-longhand@6.0.5: - resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-merge-rules@6.1.1: - resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-font-values@6.1.0: - resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-gradients@6.0.3: - resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-params@6.1.0: - resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-minify-selectors@6.0.4: - resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-modules-extract-imports@3.1.0: - resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-local-by-default@4.2.0: - resolution: {integrity: sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-scope@3.2.1: - resolution: {integrity: sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-modules-values@4.0.0: - resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} - engines: {node: ^10 || ^12 || >= 14} - peerDependencies: - postcss: ^8.1.0 - - postcss-nesting@13.0.1: - resolution: {integrity: sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-normalize-charset@6.0.2: - resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-display-values@6.0.2: - resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-positions@6.0.2: - resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-repeat-style@6.0.2: - resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-string@6.0.2: - resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-timing-functions@6.0.2: - resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-unicode@6.1.0: - resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-url@6.0.2: - resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-normalize-whitespace@6.0.2: - resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-opacity-percentage@3.0.0: - resolution: {integrity: sha512-K6HGVzyxUxd/VgZdX04DCtdwWJ4NGLG212US4/LA1TLAbHgmAsTWVR86o+gGIbFtnTkfOpb9sCRBx8K7HO66qQ==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-ordered-values@6.0.2: - resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-overflow-shorthand@6.0.0: - resolution: {integrity: sha512-BdDl/AbVkDjoTofzDQnwDdm/Ym6oS9KgmO7Gr+LHYjNWJ6ExORe4+3pcLQsLA9gIROMkiGVjjwZNoL/mpXHd5Q==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-page-break@3.0.4: - resolution: {integrity: sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==} - peerDependencies: - postcss: ^8 - - postcss-place@10.0.0: - resolution: {integrity: sha512-5EBrMzat2pPAxQNWYavwAfoKfYcTADJ8AXGVPcUZ2UkNloUTWzJQExgrzrDkh3EKzmAx1evfTAzF9I8NGcc+qw==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-preset-env@10.2.1: - resolution: {integrity: sha512-mDInnlm4mYhmR0S79hNLzseW9nx4Ihd8s15K99iu6u6QhoSQgqWX9Oj6nTd/8Dz3b0T7v2JSrfnXsDfv9TFvDg==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-pseudo-class-any-link@10.0.1: - resolution: {integrity: sha512-3el9rXlBOqTFaMFkWDOkHUTQekFIYnaQY55Rsp8As8QQkpiSgIYEcF/6Ond93oHiDsGb4kad8zjt+NPlOC1H0Q==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-reduce-idents@6.0.3: - resolution: {integrity: sha512-G3yCqZDpsNPoQgbDUy3T0E6hqOQ5xigUtBQyrmq3tn2GxlyiL0yyl7H+T8ulQR6kOcHJ9t7/9H4/R2tv8tJbMA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-reduce-initial@6.1.0: - resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-reduce-transforms@6.0.2: - resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-replace-overflow-wrap@4.0.0: - resolution: {integrity: sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==} - peerDependencies: - postcss: ^8.0.3 - - postcss-selector-not@8.0.1: - resolution: {integrity: sha512-kmVy/5PYVb2UOhy0+LqUYAhKj7DUGDpSWa5LZqlkWJaaAV+dxxsOG3+St0yNLu6vsKD7Dmqx+nWQt0iil89+WA==} - engines: {node: '>=18'} - peerDependencies: - postcss: ^8.4 - - postcss-selector-parser@6.0.16: - resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} - engines: {node: '>=4'} - - postcss-selector-parser@7.0.0: - resolution: {integrity: sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==} - engines: {node: '>=4'} - - postcss-sort-media-queries@5.2.0: - resolution: {integrity: sha512-AZ5fDMLD8SldlAYlvi8NIqo0+Z8xnXU2ia0jxmuhxAU+Lqt9K+AlmLNJ/zWEnE9x+Zx3qL3+1K20ATgNOr3fAA==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.4.23 - - postcss-svgo@6.0.3: - resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} - engines: {node: ^14 || ^16 || >= 18} - peerDependencies: - postcss: ^8.4.31 - - postcss-unique-selectors@6.0.4: - resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss-zindex@6.0.2: - resolution: {integrity: sha512-5BxW9l1evPB/4ZIc+2GobEBoKC+h8gPGCMi+jxsYvd2x0mjq7wazk6DrP71pStqxE9Foxh5TVnonbWpFZzXaYg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - postcss@8.5.4: - resolution: {integrity: sha512-QSa9EBe+uwlGTFmHsPKokv3B/oEMQZxfqW0QqNCyhpa6mB1afzulwn8hihglqAb2pOw+BJgNlmXQ8la2VeHB7w==} - engines: {node: ^10 || ^12 || >=14} - - prebuild-install@7.1.1: - resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} - engines: {node: '>=10'} - hasBin: true - - pretty-error@4.0.0: - resolution: {integrity: sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==} - - pretty-time@1.1.0: - resolution: {integrity: sha512-28iF6xPQrP8Oa6uxE6a1biz+lWeTOAPKggvjB8HAs6nVMKZwf5bG++632Dx614hIWgUPkgivRfG+a8uAXGTIbA==} - engines: {node: '>=4'} - - prism-react-renderer@2.4.1: - resolution: {integrity: sha512-ey8Ls/+Di31eqzUxC46h8MksNuGx/n0AAC8uKpwFau4RPDYLuE3EXTp8N8G2vX2N7UC/+IXeNUnlWBGGcAG+Ig==} - peerDependencies: - react: '>=16.0.0' - - prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - - process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - - progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - property-information@6.4.0: - resolution: {integrity: sha512-9t5qARVofg2xQqKtytzt+lZ4d1Qvj8t5B8fEwXK6qOfgRLgH/b13QlgEyDh033NOS31nXeFbYv7CLUDG1CeifQ==} - - proto-list@1.2.4: - resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - - proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - - proxy-agent@6.5.0: - resolution: {integrity: sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==} - engines: {node: '>= 14'} - - proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - pupa@3.1.0: - resolution: {integrity: sha512-FLpr4flz5xZTSJxSeaheeMKN/EDzMdK7b8PTOC6a5PYFKTucWbdqjgqaEyH0shFiSJrVB1+Qqi4Tk19ccU6Aug==} - engines: {node: '>=12.20'} - - puppeteer-core@22.15.0: - resolution: {integrity: sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==} - engines: {node: '>=18'} - - puppeteer@22.15.0: - resolution: {integrity: sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==} - engines: {node: '>=18'} - hasBin: true - - qs@6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} - engines: {node: '>=0.6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - - quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - - randombytes@2.1.0: - resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} - - range-parser@1.2.0: - resolution: {integrity: sha512-kA5WQoNVo4t9lNx2kQNFCxKeBl5IbbSNBl1M/tLkw9WCn+hxNBAW5Qh8gdhs63CJnhjJ2zQWFoqPJP2sK1AV5A==} - engines: {node: '>= 0.6'} - - range-parser@1.2.1: - resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} - engines: {node: '>= 0.6'} - - raw-body@2.5.2: - resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} - engines: {node: '>= 0.8'} - - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - - react-dom@19.1.0: - resolution: {integrity: sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==} - peerDependencies: - react: ^19.1.0 - - react-fast-compare@3.2.2: - resolution: {integrity: sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==} - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react-json-view-lite@2.4.1: - resolution: {integrity: sha512-fwFYknRIBxjbFm0kBDrzgBy1xa5tDg2LyXXBepC5f1b+MY3BUClMCsvanMPn089JbV1Eg3nZcrp0VCuH43aXnA==} - engines: {node: '>=18'} - peerDependencies: - react: ^18.0.0 || ^19.0.0 - - react-live@4.1.6: - resolution: {integrity: sha512-2oq3MADi3rupqZcdoHMrV9p+Eg/92BDds278ZuoOz8d68qw6ct0xZxX89MRxeChrnFHy1XPr8BVknDJNJNdvVw==} - engines: {node: '>= 0.12.0', npm: '>= 2.0.0'} - peerDependencies: - react: '>=18.0.0' - react-dom: '>=18.0.0' - - react-loadable-ssr-addon-v5-slorber@1.0.1: - resolution: {integrity: sha512-lq3Lyw1lGku8zUEJPDxsNm1AfYHBrO9Y1+olAYwpUJ2IGFBskM0DMKok97A6LWUpHm+o7IvQBOWu9MLenp9Z+A==} - engines: {node: '>=10.13.0'} - peerDependencies: - react-loadable: '*' - webpack: '>=4.41.1 || 5.x' - - react-router-config@5.1.1: - resolution: {integrity: sha512-DuanZjaD8mQp1ppHjgnnUnyOlqYXZVjnov/JzFhjLEwd3Z4dYjMSnqrEzzGThH47vpCOqPPwJM2FtthLeJ8Pbg==} - peerDependencies: - react: '>=15' - react-router: '>=5' - - react-router-dom@5.3.4: - resolution: {integrity: sha512-m4EqFMHv/Ih4kpcBCONHbkT68KoAeHN4p3lAGoNryfHi0dMy0kCzEZakiKRsvg5wHZ/JLrLW8o8KomWiz/qbYQ==} - peerDependencies: - react: '>=15' - - react-router@5.3.4: - resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} - peerDependencies: - react: '>=15' - - react@19.1.0: - resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} - engines: {node: '>=0.10.0'} - - readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - regenerate-unicode-properties@10.2.0: - resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==} - engines: {node: '>=4'} - - regenerate-unicode-properties@9.0.0: - resolution: {integrity: sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==} - engines: {node: '>=4'} - - regenerate@1.4.2: - resolution: {integrity: sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==} - - regenerator-runtime@0.14.1: - resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} - - regenerator-transform@0.15.2: - resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==} - - regexpu-core@4.8.0: - resolution: {integrity: sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==} - engines: {node: '>=4'} - - regexpu-core@6.2.0: - resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==} - engines: {node: '>=4'} - - registry-auth-token@5.0.2: - resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==} - engines: {node: '>=14'} - - registry-url@6.0.1: - resolution: {integrity: sha512-+crtS5QjFRqFCoQmvGduwYWEBng99ZvmFvF+cUJkGYF1L1BfU8C6Zp9T7f5vPAwyLkUExpvK+ANVZmGU49qi4Q==} - engines: {node: '>=12'} - - regjsgen@0.5.2: - resolution: {integrity: sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==} - - regjsgen@0.8.0: - resolution: {integrity: sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==} - - regjsparser@0.12.0: - resolution: {integrity: sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ==} - hasBin: true - - regjsparser@0.7.0: - resolution: {integrity: sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==} - hasBin: true - - rehype-raw@7.0.0: - resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} - - relateurl@0.2.7: - resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} - engines: {node: '>= 0.10'} - - remark-directive@3.0.0: - resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} - - remark-emoji@4.0.1: - resolution: {integrity: sha512-fHdvsTR1dHkWKev9eNyhTo4EFwbUvJ8ka9SgeWkMPYFX4WoI7ViVBms3PjlQYgw5TLvNQso3GUB/b/8t3yo+dg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - remark-frontmatter@5.0.0: - resolution: {integrity: sha512-XTFYvNASMe5iPN0719nPrdItC9aU0ssC4v14mH1BCi1u0n1gAocqcujWUrByftZTbLhRtiKRyjYTSIOcr69UVQ==} - - remark-gfm@4.0.0: - resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} - - remark-mdx@3.0.0: - resolution: {integrity: sha512-O7yfjuC6ra3NHPbRVxfflafAj3LTwx3b73aBvkEFU5z4PsD6FD4vrqJAkE5iNGLz71GdjXfgRqm3SQ0h0VuE7g==} - - remark-parse@11.0.0: - resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} - - remark-rehype@11.1.0: - resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} - - remark-stringify@11.0.0: - resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} - - renderkid@3.0.0: - resolution: {integrity: sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==} - - repeat-string@1.6.1: - resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} - engines: {node: '>=0.10'} - - require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - require-like@0.1.2: - resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} - - requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - - resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pathname@3.0.0: - resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - responselike@3.0.0: - resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==} - engines: {node: '>=14.16'} - - retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - robust-predicates@3.0.2: - resolution: {integrity: sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==} - - roughjs@4.6.6: - resolution: {integrity: sha512-ZUz/69+SYpFN/g/lUlo2FXcIjRkSu3nDarreVdGGndHEBJ6cXPdKguS8JGxwj5HA5xIbVKSmLgr5b3AWxtRfvQ==} - - rtlcss@4.1.1: - resolution: {integrity: sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==} - engines: {node: '>=12.0.0'} - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - rw@1.3.3: - resolution: {integrity: sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==} - - sade@1.8.1: - resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} - engines: {node: '>=6'} - - safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - - scheduler@0.26.0: - resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - - schema-dts@1.1.5: - resolution: {integrity: sha512-RJr9EaCmsLzBX2NDiO5Z3ux2BVosNZN5jo0gWgsyKvxKIUL5R3swNvoorulAeL9kLB0iTSX7V6aokhla2m7xbg==} - - schema-utils@3.3.0: - resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} - engines: {node: '>= 10.13.0'} - - schema-utils@4.2.0: - resolution: {integrity: sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==} - engines: {node: '>= 12.13.0'} - - search-insights@2.17.3: - resolution: {integrity: sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==} - - section-matter@1.0.0: - resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} - engines: {node: '>=4'} - - select-hose@2.0.0: - resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} - - selfsigned@2.4.1: - resolution: {integrity: sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==} - engines: {node: '>=10'} - - semver-diff@4.0.0: - resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} - engines: {node: '>=12'} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - send@0.18.0: - resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} - engines: {node: '>= 0.8.0'} - - serialize-javascript@6.0.2: - resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} - - serve-handler@6.1.6: - resolution: {integrity: sha512-x5RL9Y2p5+Sh3D38Fh9i/iQ5ZK+e4xuXRd/pGbM4D13tgo/MGwbttUk8emytcr1YYzBYs+apnUngBDFYfpjPuQ==} - - serve-index@1.9.1: - resolution: {integrity: sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==} - engines: {node: '>= 0.8.0'} - - serve-static@1.15.0: - resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} - engines: {node: '>= 0.8.0'} - - set-function-length@1.1.1: - resolution: {integrity: sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==} - engines: {node: '>= 0.4'} - - setprototypeof@1.1.0: - resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==} - - setprototypeof@1.2.0: - resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} - - shallow-clone@3.0.1: - resolution: {integrity: sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==} - engines: {node: '>=8'} - - shallowequal@1.1.0: - resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} - - sharp@0.32.6: - resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} - engines: {node: '>=14.15.0'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - shell-quote@1.8.1: - resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} - - side-channel@1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} - - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - simple-concat@1.0.1: - resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - - simple-get@4.0.1: - resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} - - simple-swizzle@0.2.2: - resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} - - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - - sitemap@7.1.1: - resolution: {integrity: sha512-mK3aFtjz4VdJN0igpIJrinf3EO8U8mxOPsTBzSsy06UtjZQJ3YY3o3Xa7zSc5nMqcMrRwlChHZ18Kxg0caiPBg==} - engines: {node: '>=12.0.0', npm: '>=5.6.0'} - hasBin: true - - skin-tone@2.0.0: - resolution: {integrity: sha512-kUMbT1oBJCpgrnKoSr0o6wPtvRWT9W9UKvGLwfJYO2WuahZRHOpEyL1ckyMGgMWh0UdpmaoFqKKD29WTomNEGA==} - engines: {node: '>=8'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - - smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - - sockjs@0.3.24: - resolution: {integrity: sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==} - - socks-proxy-agent@8.0.5: - resolution: {integrity: sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==} - engines: {node: '>= 14'} - - socks@2.8.3: - resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} - engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} - - sort-css-media-queries@2.2.0: - resolution: {integrity: sha512-0xtkGhWCC9MGt/EzgnvbbbKhqWjl1+/rncmhTh5qCpbYguXh6S/qwePfv/JQ8jePXXmqingylxoC49pCkSPIbA==} - engines: {node: '>= 6.3.0'} - - source-map-js@1.2.0: - resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} - engines: {node: '>=0.10.0'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - source-map-support@0.5.21: - resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} - - source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - source-map@0.7.4: - resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} - engines: {node: '>= 8'} - - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - - space-separated-tokens@2.0.2: - resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - - spdy-transport@3.0.0: - resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} - - spdy@4.0.2: - resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} - engines: {node: '>=6.0.0'} - - sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - sprintf-js@1.1.3: - resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} - - srcset@4.0.0: - resolution: {integrity: sha512-wvLeHgcVHKO8Sc/H/5lkGreJQVeYMm9rlmt8PuR1xE31rIuXhuzznUUqAt8MqLhB3MqJdFzlNAfpcWnxiFUcPw==} - engines: {node: '>=12'} - - statuses@1.5.0: - resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} - engines: {node: '>= 0.6'} - - statuses@2.0.1: - resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} - engines: {node: '>= 0.8'} - - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} - - streamx@2.21.1: - resolution: {integrity: sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - - stringify-entities@4.0.3: - resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} - - stringify-object@3.3.0: - resolution: {integrity: sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==} - engines: {node: '>=4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom-string@1.0.0: - resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} - engines: {node: '>=0.10.0'} - - strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - style-to-object@0.4.4: - resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} - - style-to-object@1.0.5: - resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} - - stylehacks@6.1.1: - resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} - engines: {node: ^14 || ^16 || >=18.0} - peerDependencies: - postcss: ^8.4.31 - - stylis@4.3.6: - resolution: {integrity: sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==} - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - svg-parser@2.0.4: - resolution: {integrity: sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==} - - svgo@3.2.0: - resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==} - engines: {node: '>=14.0.0'} - hasBin: true - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - - tar-fs@3.0.8: - resolution: {integrity: sha512-ZoROL70jptorGAlgAYiLoBLItEKw/fUxg9BSYK/dF/GAGYFJOJJJMvjPAKDJraCXFwadD456FCuvLWgfhMsPwg==} - - tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - - tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} - - terser-webpack-plugin@5.3.10: - resolution: {integrity: sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==} - engines: {node: '>= 10.13.0'} - peerDependencies: - '@swc/core': '*' - esbuild: '*' - uglify-js: '*' - webpack: ^5.1.0 - peerDependenciesMeta: - '@swc/core': - optional: true - esbuild: - optional: true - uglify-js: - optional: true - - terser@5.26.0: - resolution: {integrity: sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==} - engines: {node: '>=10'} - hasBin: true - - text-decoder@1.2.3: - resolution: {integrity: sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - thunky@1.1.0: - resolution: {integrity: sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==} - - tiny-invariant@1.3.1: - resolution: {integrity: sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==} - - tiny-warning@1.0.3: - resolution: {integrity: sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==} - - tinyexec@0.3.2: - resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} - - tinypool@1.0.2: - resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} - engines: {node: ^18.0.0 || >=20.0.0} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - toidentifier@1.0.1: - resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} - engines: {node: '>=0.6'} - - totalist@3.0.1: - resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} - engines: {node: '>=6'} - - trim-lines@3.0.1: - resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} - - trough@2.1.0: - resolution: {integrity: sha512-AqTiAOLcj85xS7vQ8QkAV41hPDIJ71XJB4RCUrzo/1GM2CQwhkJGaf9Hgr7BOugMRpgGUrqRg/DrBDl4H40+8g==} - - ts-dedent@2.2.0: - resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} - engines: {node: '>=6.10'} - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - tunnel-agent@0.6.0: - resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - - type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - - type-fest@1.4.0: - resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} - engines: {node: '>=10'} - - type-fest@2.19.0: - resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} - engines: {node: '>=12.20'} - - type-is@1.6.18: - resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} - engines: {node: '>= 0.6'} - - typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - - typescript@5.7.3: - resolution: {integrity: sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==} - engines: {node: '>=14.17'} - hasBin: true - - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} - - unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - - undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - unicode-canonical-property-names-ecmascript@2.0.0: - resolution: {integrity: sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==} - engines: {node: '>=4'} - - unicode-emoji-modifier-base@1.0.0: - resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} - engines: {node: '>=4'} - - unicode-match-property-ecmascript@2.0.0: - resolution: {integrity: sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==} - engines: {node: '>=4'} - - unicode-match-property-value-ecmascript@2.1.0: - resolution: {integrity: sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==} - engines: {node: '>=4'} - - unicode-property-aliases-ecmascript@2.1.0: - resolution: {integrity: sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==} - engines: {node: '>=4'} - - unified@11.0.4: - resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} - - unique-string@3.0.0: - resolution: {integrity: sha512-VGXBUVwxKMBUznyffQweQABPRRW1vHZAbadFZud4pLFAqRGvv/96vafgjWFqzourzr8YonlQiPgH0YCJfawoGQ==} - engines: {node: '>=12'} - - unist-util-is@5.2.1: - resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} - - unist-util-is@6.0.0: - resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} - - unist-util-position-from-estree@1.1.2: - resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} - - unist-util-position-from-estree@2.0.0: - resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} - - unist-util-position@4.0.4: - resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} - - unist-util-position@5.0.0: - resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} - - unist-util-remove-position@4.0.2: - resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} - - unist-util-remove-position@5.0.0: - resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} - - unist-util-stringify-position@3.0.3: - resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} - - unist-util-stringify-position@4.0.0: - resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} - - unist-util-visit-parents@5.1.3: - resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} - - unist-util-visit-parents@6.0.1: - resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} - - unist-util-visit@4.1.2: - resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} - - unist-util-visit@5.0.0: - resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} - - universalify@2.0.1: - resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} - engines: {node: '>= 10.0.0'} - - unpipe@1.0.0: - resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} - engines: {node: '>= 0.8'} - - update-browserslist-db@1.1.2: - resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-browserslist-db@1.1.3: - resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - - update-notifier@6.0.2: - resolution: {integrity: sha512-EDxhTEVPZZRLWYcJ4ZXjGFN0oP7qYvbXWzEgRm/Yql4dHX5wDbvh89YHP6PK1lzZJYrMtXUuZZz8XGK+U6U1og==} - engines: {node: '>=14.16'} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - url-loader@4.1.1: - resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} - engines: {node: '>= 10.13.0'} - peerDependencies: - file-loader: '*' - webpack: ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - file-loader: - optional: true - - urlpattern-polyfill@10.0.0: - resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} - - use-editable@2.3.3: - resolution: {integrity: sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==} - peerDependencies: - react: '>= 16.8.0' - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - utila@0.4.0: - resolution: {integrity: sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==} - - utility-types@3.10.0: - resolution: {integrity: sha512-O11mqxmi7wMKCo6HKFt5AhO4BwY3VV68YU07tgxfz8zJTIxr4BpsezN49Ffwy9j3ZpwwJp4fkRwjRzq3uWE6Rg==} - engines: {node: '>= 4'} - - utils-merge@1.0.1: - resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} - engines: {node: '>= 0.4.0'} - - uuid@11.1.0: - resolution: {integrity: sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==} - hasBin: true - - uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - - uvu@0.5.6: - resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} - engines: {node: '>=8'} - hasBin: true - - value-equal@1.0.1: - resolution: {integrity: sha512-NOJ6JZCAWr0zlxZt+xqCHNTEKOsrks2HQd4MqhP1qy4z1SkbEP467eNx6TgDKXMvUOb+OENfJCZwM+16n7fRfw==} - - vary@1.1.2: - resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} - engines: {node: '>= 0.8'} - - vfile-location@4.1.0: - resolution: {integrity: sha512-YF23YMyASIIJXpktBa4vIGLJ5Gs88UB/XePgqPmTa7cDA+JeO3yclbpheQYCHjVHBn/yePzrXuygIL+xbvRYHw==} - - vfile-location@5.0.2: - resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} - - vfile-message@3.1.4: - resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} - - vfile-message@4.0.2: - resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} - - vfile@5.3.7: - resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} - - vfile@6.0.1: - resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} - - vscode-jsonrpc@8.2.0: - resolution: {integrity: sha512-C+r0eKJUIfiDIfwJhria30+TYWPtuHJXHtI7J0YlOmKAo7ogxP20T0zxB7HZQIFhIyvoBPwWskjxrvAtfjyZfA==} - engines: {node: '>=14.0.0'} - - vscode-languageserver-protocol@3.17.5: - resolution: {integrity: sha512-mb1bvRJN8SVznADSGWM9u/b07H7Ecg0I3OgXDuLdn307rl/J3A9YD6/eYOssqhecL27hK1IPZAsaqh00i/Jljg==} - - vscode-languageserver-textdocument@1.0.12: - resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==} - - vscode-languageserver-types@3.17.5: - resolution: {integrity: sha512-Ld1VelNuX9pdF39h2Hgaeb5hEZM2Z3jUrrMgWQAu82jMtZp7p3vJT3BzToKtZI7NgQssZje5o0zryOrhQvzQAg==} - - vscode-languageserver@9.0.1: - resolution: {integrity: sha512-woByF3PDpkHFUreUa7Hos7+pUWdeWMXRd26+ZX2A8cFx6v/JPTtd4/uN0/jB6XQHYaOlHbio03NTHCqrgG5n7g==} - hasBin: true - - vscode-uri@3.0.8: - resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} - - watchpack@2.4.2: - resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==} - engines: {node: '>=10.13.0'} - - wbuf@1.7.3: - resolution: {integrity: sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==} - - web-namespaces@2.0.1: - resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} - - webpack-bundle-analyzer@4.10.2: - resolution: {integrity: sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==} - engines: {node: '>= 10.13.0'} - hasBin: true - - webpack-dev-middleware@5.3.4: - resolution: {integrity: sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==} - engines: {node: '>= 12.13.0'} - peerDependencies: - webpack: ^4.0.0 || ^5.0.0 - - webpack-dev-server@4.15.2: - resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} - engines: {node: '>= 12.13.0'} - hasBin: true - peerDependencies: - webpack: ^4.37.0 || ^5.0.0 - webpack-cli: '*' - peerDependenciesMeta: - webpack: - optional: true - webpack-cli: - optional: true - - webpack-merge@5.10.0: - resolution: {integrity: sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==} - engines: {node: '>=10.0.0'} - - webpack-merge@6.0.1: - resolution: {integrity: sha512-hXXvrjtx2PLYx4qruKl+kyRSLc52V+cCvMxRjmKwoA+CBbbF5GfIBtR6kCvl0fYGqTUPKB+1ktVmTHqMOzgCBg==} - engines: {node: '>=18.0.0'} - - webpack-sources@3.2.3: - resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} - engines: {node: '>=10.13.0'} - - webpack@5.97.1: - resolution: {integrity: sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==} - engines: {node: '>=10.13.0'} - hasBin: true - peerDependencies: - webpack-cli: '*' - peerDependenciesMeta: - webpack-cli: - optional: true - - webpackbar@6.0.1: - resolution: {integrity: sha512-TnErZpmuKdwWBdMoexjio3KKX6ZtoKHRVvLIU0A47R0VVBDtx3ZyOJDktgYixhoJokZTYTt1Z37OkO9pnGJa9Q==} - engines: {node: '>=14.21.3'} - peerDependencies: - webpack: 3 || 4 || 5 - - websocket-driver@0.7.4: - resolution: {integrity: sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==} - engines: {node: '>=0.8.0'} - - websocket-extensions@0.1.4: - resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==} - engines: {node: '>=0.8.0'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - widest-line@4.0.1: - resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} - engines: {node: '>=12'} - - wildcard@2.0.1: - resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - - ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - ws@8.18.0: - resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - xdg-basedir@5.1.0: - resolution: {integrity: sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==} - engines: {node: '>=12'} - - xml-js@1.6.11: - resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==} - hasBin: true - - y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - - yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - - yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - - yocto-queue@1.0.0: - resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} - engines: {node: '>=12.20'} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - - zwitch@2.0.4: - resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} - -snapshots: - - '@algolia/autocomplete-core@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-plugin-algolia-insights': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3) - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - search-insights - - '@algolia/autocomplete-plugin-algolia-insights@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - algoliasearch - - '@algolia/autocomplete-preset-algolia@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': - dependencies: - '@algolia/autocomplete-shared': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) - '@algolia/client-search': 5.20.0 - algoliasearch: 5.20.0 - - '@algolia/autocomplete-shared@1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)': - dependencies: - '@algolia/client-search': 5.20.0 - algoliasearch: 5.20.0 - - '@algolia/client-abtesting@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/client-analytics@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/client-common@5.20.0': {} - - '@algolia/client-insights@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/client-personalization@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/client-query-suggestions@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/client-search@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/events@4.0.1': {} - - '@algolia/ingestion@1.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/monitoring@1.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/recommend@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - '@algolia/requester-browser-xhr@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - - '@algolia/requester-fetch@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - - '@algolia/requester-node-http@5.20.0': - dependencies: - '@algolia/client-common': 5.20.0 - - '@ampproject/remapping@2.2.1': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@antfu/install-pkg@0.4.1': - dependencies: - package-manager-detector: 0.2.8 - tinyexec: 0.3.2 - - '@antfu/utils@0.7.10': {} - - '@babel/code-frame@7.26.2': - dependencies: - '@babel/helper-validator-identifier': 7.25.9 - js-tokens: 4.0.0 - picocolors: 1.1.1 - - '@babel/compat-data@7.26.5': {} - - '@babel/core@7.26.0': - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helpers': 7.26.0 - '@babel/parser': 7.26.5 - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 - convert-source-map: 2.0.0 - debug: 4.4.0 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/generator@7.26.5': - dependencies: - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 3.1.0 - - '@babel/helper-annotate-as-pure@7.25.9': - dependencies: - '@babel/types': 7.26.5 - - '@babel/helper-compilation-targets@7.26.5': - dependencies: - '@babel/compat-data': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - browserslist: 4.24.4 - lru-cache: 5.1.1 - semver: 6.3.1 - - '@babel/helper-create-class-features-plugin@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/traverse': 7.26.5 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/helper-create-regexp-features-plugin@7.26.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - regexpu-core: 6.2.0 - semver: 6.3.1 - - '@babel/helper-define-polyfill-provider@0.6.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - debug: 4.4.0 - lodash.debounce: 4.0.8 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - '@babel/helper-member-expression-to-functions@7.25.9': - dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-imports@7.25.9': - dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-optimise-call-expression@7.25.9': - dependencies: - '@babel/types': 7.26.5 - - '@babel/helper-plugin-utils@7.26.5': {} - - '@babel/helper-remap-async-to-generator@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-wrap-function': 7.25.9 - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-replace-supers@7.26.5(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-member-expression-to-functions': 7.25.9 - '@babel/helper-optimise-call-expression': 7.25.9 - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-skip-transparent-expression-wrappers@7.25.9': - dependencies: - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/helper-string-parser@7.25.9': {} - - '@babel/helper-validator-identifier@7.25.9': {} - - '@babel/helper-validator-option@7.25.9': {} - - '@babel/helper-wrap-function@7.25.9': - dependencies: - '@babel/template': 7.25.9 - '@babel/traverse': 7.26.5 - '@babel/types': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/helpers@7.26.0': - dependencies: - '@babel/template': 7.25.9 - '@babel/types': 7.26.5 - - '@babel/parser@7.26.5': - dependencies: - '@babel/types': 7.26.5 - - '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@babel/plugin-syntax-dynamic-import@7.8.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-assertions@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-jsx@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-typescript@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-arrow-functions@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-async-generator-functions@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-remap-async-to-generator': 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-block-scoped-functions@7.26.5(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-block-scoping@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-class-properties@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-class-static-block@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-classes@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) - '@babel/traverse': 7.26.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-computed-properties@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/template': 7.25.9 - - '@babel/plugin-transform-destructuring@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dotall-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-keys@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-dynamic-import@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-exponentiation-operator@7.26.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-export-namespace-from@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-for-of@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-function-name@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-json-strings@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-literals@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-logical-assignment-operators@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-member-expression-literals@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-modules-amd@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-commonjs@7.26.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-systemjs@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-identifier': 7.25.9 - '@babel/traverse': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-modules-umd@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-named-capturing-groups-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-new-target@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-nullish-coalescing-operator@7.26.6(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-numeric-separator@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - - '@babel/plugin-transform-object-super@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-replace-supers': 7.26.5(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-optional-catch-binding@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-optional-chaining@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-parameters@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-private-methods@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-private-property-in-object@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-property-literals@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-react-constant-elements@7.23.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-react-display-name@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-react-jsx-development@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-jsx@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/types': 7.26.5 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-react-pure-annotations@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-regenerator@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - regenerator-transform: 0.15.2 - - '@babel/plugin-transform-regexp-modifiers@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-reserved-words@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-runtime@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-module-imports': 7.25.9 - '@babel/helper-plugin-utils': 7.26.5 - babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-shorthand-properties@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-spread@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-sticky-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-template-literals@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typeof-symbol@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-typescript@7.26.5(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-annotate-as-pure': 7.25.9 - '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-skip-transparent-expression-wrappers': 7.25.9 - '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/plugin-transform-unicode-escapes@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-property-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/plugin-transform-unicode-sets-regex@7.25.9(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-create-regexp-features-plugin': 7.26.3(@babel/core@7.26.0) - '@babel/helper-plugin-utils': 7.26.5 - - '@babel/preset-env@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/compat-data': 7.26.5 - '@babel/core': 7.26.0 - '@babel/helper-compilation-targets': 7.26.5 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.0) - '@babel/plugin-syntax-import-assertions': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-import-attributes': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.0) - '@babel/plugin-transform-arrow-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-generator-functions': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-async-to-generator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoped-functions': 7.26.5(@babel/core@7.26.0) - '@babel/plugin-transform-block-scoping': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-class-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-transform-classes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-computed-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-destructuring': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-dotall-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-duplicate-keys': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-dynamic-import': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-exponentiation-operator': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-export-namespace-from': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-for-of': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-function-name': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-json-strings': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-logical-assignment-operators': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-member-expression-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-amd': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-modules-systemjs': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-umd': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-named-capturing-groups-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-new-target': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-nullish-coalescing-operator': 7.26.6(@babel/core@7.26.0) - '@babel/plugin-transform-numeric-separator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-object-super': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-catch-binding': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-optional-chaining': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-parameters': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-private-property-in-object': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-property-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-regenerator': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-regexp-modifiers': 7.26.0(@babel/core@7.26.0) - '@babel/plugin-transform-reserved-words': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-shorthand-properties': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-spread': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-sticky-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-template-literals': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-typeof-symbol': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-escapes': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-property-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-regex': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-unicode-sets-regex': 7.25.9(@babel/core@7.26.0) - '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.0) - babel-plugin-polyfill-corejs2: 0.4.12(@babel/core@7.26.0) - babel-plugin-polyfill-corejs3: 0.10.6(@babel/core@7.26.0) - babel-plugin-polyfill-regenerator: 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.40.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/types': 7.26.5 - esutils: 2.0.3 - - '@babel/preset-react@7.26.3(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-transform-react-display-name': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-jsx-development': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-react-pure-annotations': 7.25.9(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/preset-typescript@7.26.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-plugin-utils': 7.26.5 - '@babel/helper-validator-option': 7.25.9 - '@babel/plugin-syntax-jsx': 7.25.9(@babel/core@7.26.0) - '@babel/plugin-transform-modules-commonjs': 7.26.3(@babel/core@7.26.0) - '@babel/plugin-transform-typescript': 7.26.5(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - '@babel/runtime-corejs3@7.26.0': - dependencies: - core-js-pure: 3.35.0 - regenerator-runtime: 0.14.1 - - '@babel/runtime@7.26.0': - dependencies: - regenerator-runtime: 0.14.1 - - '@babel/template@7.25.9': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/parser': 7.26.5 - '@babel/types': 7.26.5 - - '@babel/traverse@7.26.5': - dependencies: - '@babel/code-frame': 7.26.2 - '@babel/generator': 7.26.5 - '@babel/parser': 7.26.5 - '@babel/template': 7.25.9 - '@babel/types': 7.26.5 - debug: 4.4.0 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - - '@babel/types@7.26.5': - dependencies: - '@babel/helper-string-parser': 7.25.9 - '@babel/helper-validator-identifier': 7.25.9 - - '@braintree/sanitize-url@7.1.1': {} - - '@chevrotain/cst-dts-gen@11.0.3': - dependencies: - '@chevrotain/gast': 11.0.3 - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 - - '@chevrotain/gast@11.0.3': - dependencies: - '@chevrotain/types': 11.0.3 - lodash-es: 4.17.21 - - '@chevrotain/regexp-to-ast@11.0.3': {} - - '@chevrotain/types@11.0.3': {} - - '@chevrotain/utils@11.0.3': {} - - '@colors/colors@1.5.0': - optional: true - - '@csstools/cascade-layer-name-parser@2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - - '@csstools/color-helpers@5.0.2': {} - - '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - - '@csstools/css-color-parser@3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/color-helpers': 5.0.2 - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - - '@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/css-tokenizer': 3.0.4 - - '@csstools/css-tokenizer@3.0.4': {} - - '@csstools/media-query-list-parser@4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - - '@csstools/postcss-cascade-layers@5.0.1(postcss@8.5.4)': - dependencies: - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0) - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - '@csstools/postcss-color-function@4.0.10(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-color-mix-function@3.0.10(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-color-mix-variadic-function-arguments@1.0.0(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-content-alt-text@2.0.6(postcss@8.5.4)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-exponential-functions@2.0.9(postcss@8.5.4)': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.4 - - '@csstools/postcss-font-format-keywords@4.0.0(postcss@8.5.4)': - dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - '@csstools/postcss-gamut-mapping@2.0.10(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.4 - - '@csstools/postcss-gradients-interpolation-method@5.0.10(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-hwb-function@4.0.10(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-ic-unit@4.0.2(postcss@8.5.4)': - dependencies: - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - '@csstools/postcss-initial@2.0.1(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - - '@csstools/postcss-is-pseudo-class@5.0.1(postcss@8.5.4)': - dependencies: - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0) - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - '@csstools/postcss-light-dark-function@2.0.9(postcss@8.5.4)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-logical-float-and-clear@3.0.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - - '@csstools/postcss-logical-overflow@2.0.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - - '@csstools/postcss-logical-overscroll-behavior@2.0.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - - '@csstools/postcss-logical-resize@3.0.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - '@csstools/postcss-logical-viewport-units@3.0.4(postcss@8.5.4)': - dependencies: - '@csstools/css-tokenizer': 3.0.4 - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-media-minmax@2.0.9(postcss@8.5.4)': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.4 - - '@csstools/postcss-media-queries-aspect-ratio-number-values@3.0.5(postcss@8.5.4)': - dependencies: - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.4 - - '@csstools/postcss-nested-calc@4.0.0(postcss@8.5.4)': - dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - '@csstools/postcss-normalize-display-values@4.0.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - '@csstools/postcss-oklab-function@4.0.10(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-progressive-custom-properties@4.1.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - '@csstools/postcss-random-function@2.0.1(postcss@8.5.4)': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.4 - - '@csstools/postcss-relative-color-syntax@3.0.10(postcss@8.5.4)': - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - '@csstools/postcss-scope-pseudo-class@4.0.1(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - '@csstools/postcss-sign-functions@1.1.4(postcss@8.5.4)': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.4 - - '@csstools/postcss-stepped-value-functions@4.0.9(postcss@8.5.4)': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.4 - - '@csstools/postcss-text-decoration-shorthand@4.0.2(postcss@8.5.4)': - dependencies: - '@csstools/color-helpers': 5.0.2 - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - '@csstools/postcss-trigonometric-functions@4.0.9(postcss@8.5.4)': - dependencies: - '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.4 - - '@csstools/postcss-unset-value@4.0.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - - '@csstools/selector-resolve-nested@3.0.0(postcss-selector-parser@7.0.0)': - dependencies: - postcss-selector-parser: 7.0.0 - - '@csstools/selector-specificity@5.0.0(postcss-selector-parser@7.0.0)': - dependencies: - postcss-selector-parser: 7.0.0 - - '@csstools/utilities@2.0.0(postcss@8.5.4)': - dependencies: - postcss: 8.5.4 - - '@discoveryjs/json-ext@0.5.7': {} - - '@docsearch/css@3.9.0': {} - - '@docsearch/react@3.9.0(@algolia/client-search@5.20.0)(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)': - dependencies: - '@algolia/autocomplete-core': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0)(search-insights@2.17.3) - '@algolia/autocomplete-preset-algolia': 1.17.9(@algolia/client-search@5.20.0)(algoliasearch@5.20.0) - '@docsearch/css': 3.9.0 - algoliasearch: 5.20.0 - optionalDependencies: - '@types/react': 19.0.8 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - search-insights: 2.17.3 - transitivePeerDependencies: - - '@algolia/client-search' - - '@docusaurus/babel@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@babel/core': 7.26.0 - '@babel/generator': 7.26.5 - '@babel/plugin-syntax-dynamic-import': 7.8.3(@babel/core@7.26.0) - '@babel/plugin-transform-runtime': 7.25.9(@babel/core@7.26.0) - '@babel/preset-env': 7.26.0(@babel/core@7.26.0) - '@babel/preset-react': 7.26.3(@babel/core@7.26.0) - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) - '@babel/runtime': 7.26.0 - '@babel/runtime-corejs3': 7.26.0 - '@babel/traverse': 7.26.5 - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - babel-plugin-dynamic-import-node: 2.3.3 - fs-extra: 11.2.0 - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - react - - react-dom - - supports-color - - uglify-js - - webpack-cli - - '@docusaurus/bundler@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@babel/core': 7.26.0 - '@docusaurus/babel': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/cssnano-preset': 3.8.1 - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.97.1) - clean-css: 5.3.3 - copy-webpack-plugin: 11.0.0(webpack@5.97.1) - css-loader: 6.11.0(webpack@5.97.1) - css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(webpack@5.97.1) - cssnano: 6.1.2(postcss@8.5.4) - file-loader: 6.2.0(webpack@5.97.1) - html-minifier-terser: 7.2.0 - mini-css-extract-plugin: 2.9.2(webpack@5.97.1) - null-loader: 4.0.1(webpack@5.97.1) - postcss: 8.5.4 - postcss-loader: 7.3.4(postcss@8.5.4)(typescript@5.7.3)(webpack@5.97.1) - postcss-preset-env: 10.2.1(postcss@8.5.4) - terser-webpack-plugin: 5.3.10(webpack@5.97.1) - tslib: 2.6.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1) - webpack: 5.97.1 - webpackbar: 6.0.1(webpack@5.97.1) - transitivePeerDependencies: - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - csso - - esbuild - - lightningcss - - react - - react-dom - - supports-color - - typescript - - uglify-js - - webpack-cli - - '@docusaurus/core@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/babel': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/bundler': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@mdx-js/react': 3.1.0(@types/react@19.0.8)(react@19.1.0) - boxen: 6.2.1 - chalk: 4.1.2 - chokidar: 3.5.3 - cli-table3: 0.6.3 - combine-promises: 1.2.0 - commander: 5.1.0 - core-js: 3.35.0 - detect-port: 1.5.1 - escape-html: 1.0.3 - eta: 2.2.0 - eval: 0.1.8 - execa: 5.1.1 - fs-extra: 11.2.0 - html-tags: 3.3.1 - html-webpack-plugin: 5.6.0(webpack@5.97.1) - leven: 3.1.0 - lodash: 4.17.21 - open: 8.4.2 - p-map: 4.0.0 - prompts: 2.4.2 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)' - react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.0)' - react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@19.1.0))(webpack@5.97.1) - react-router: 5.3.4(react@19.1.0) - react-router-config: 5.1.1(react-router@5.3.4(react@19.1.0))(react@19.1.0) - react-router-dom: 5.3.4(react@19.1.0) - semver: 7.6.3 - serve-handler: 6.1.6 - tinypool: 1.0.2 - tslib: 2.6.2 - update-notifier: 6.0.2 - webpack: 5.97.1 - webpack-bundle-analyzer: 4.10.2 - webpack-dev-server: 4.15.2(webpack@5.97.1) - webpack-merge: 6.0.1 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/cssnano-preset@3.8.1': - dependencies: - cssnano-preset-advanced: 6.1.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-sort-media-queries: 5.2.0(postcss@8.5.4) - tslib: 2.6.2 - - '@docusaurus/logger@3.8.1': - dependencies: - chalk: 4.1.2 - tslib: 2.6.2 - - '@docusaurus/lqip-loader@3.8.1(webpack@5.97.1)': - dependencies: - '@docusaurus/logger': 3.8.1 - file-loader: 6.2.0(webpack@5.97.1) - lodash: 4.17.21 - sharp: 0.32.6 - tslib: 2.6.2 - transitivePeerDependencies: - - bare-buffer - - webpack - - '@docusaurus/mdx-loader@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@mdx-js/mdx': 3.0.0 - '@slorber/remark-comment': 1.0.0 - escape-html: 1.0.3 - estree-util-value-to-estree: 3.0.1 - file-loader: 6.2.0(webpack@5.97.1) - fs-extra: 11.2.0 - image-size: 2.0.2 - mdast-util-mdx: 3.0.0 - mdast-util-to-string: 4.0.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - rehype-raw: 7.0.0 - remark-directive: 3.0.0 - remark-emoji: 4.0.1 - remark-frontmatter: 5.0.0 - remark-gfm: 4.0.0 - stringify-object: 3.3.0 - tslib: 2.6.2 - unified: 11.0.4 - unist-util-visit: 5.0.0 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1) - vfile: 6.0.1 - webpack: 5.97.1 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@docusaurus/module-type-aliases@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@types/history': 4.7.11 - '@types/react': 19.0.8 - '@types/react-router-config': 5.0.11 - '@types/react-router-dom': 5.3.3 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)' - react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.0)' - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@docusaurus/plugin-content-blog@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - cheerio: 1.0.0-rc.12 - feed: 4.2.2 - fs-extra: 11.2.0 - lodash: 4.17.21 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - schema-dts: 1.1.5 - srcset: 4.0.0 - tslib: 2.6.2 - unist-util-visit: 5.0.0 - utility-types: 3.10.0 - webpack: 5.97.1 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/module-type-aliases': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@types/react-router-config': 5.0.11 - combine-promises: 1.2.0 - fs-extra: 11.2.0 - js-yaml: 4.1.0 - lodash: 4.17.21 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - schema-dts: 1.1.5 - tslib: 2.6.2 - utility-types: 3.10.0 - webpack: 5.97.1 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-content-pages@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/mdx-loader': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - fs-extra: 11.2.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - webpack: 5.97.1 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-css-cascade-layers@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - react - - react-dom - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-debug@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - fs-extra: 11.2.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-json-view-lite: 2.4.1(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-google-analytics@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-google-gtag@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@types/gtag.js': 0.0.12 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-google-tag-manager@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-ideal-image@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/lqip-loader': 3.8.1(webpack@5.97.1) - '@docusaurus/responsive-loader': 1.7.0(sharp@0.32.6) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - sharp: 0.32.6 - tslib: 2.6.2 - webpack: 5.97.1 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bare-buffer - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-sitemap@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - fs-extra: 11.2.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - sitemap: 7.1.1 - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/plugin-svgr@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@svgr/core': 8.1.0(typescript@5.7.3) - '@svgr/webpack': 8.1.0(typescript@5.7.3) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - webpack: 5.97.1 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/preset-classic@3.8.1(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-content-pages': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-css-cascade-layers': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-debug': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-google-analytics': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-google-gtag': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-google-tag-manager': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-sitemap': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-svgr': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-classic': 3.8.1(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/theme-search-algolia': 3.8.1(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.7.3) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - transitivePeerDependencies: - - '@algolia/client-search' - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@types/react' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - search-insights - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/react-loadable@6.0.0(react@19.1.0)': - dependencies: - '@types/react': 19.0.8 - react: 19.1.0 - - '@docusaurus/remark-plugin-npm2yarn@3.8.1': - dependencies: - mdast-util-mdx: 3.0.0 - npm-to-yarn: 3.0.1 - tslib: 2.6.2 - unified: 11.0.4 - unist-util-visit: 5.0.0 - transitivePeerDependencies: - - supports-color - - '@docusaurus/responsive-loader@1.7.0(sharp@0.32.6)': - dependencies: - loader-utils: 2.0.4 - optionalDependencies: - sharp: 0.32.6 - - '@docusaurus/theme-classic@3.8.1(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/logger': 3.8.1 - '@docusaurus/mdx-loader': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/module-type-aliases': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/plugin-content-blog': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/plugin-content-pages': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@mdx-js/react': 3.1.0(@types/react@19.0.8)(react@19.1.0) - clsx: 2.1.1 - copy-text-to-clipboard: 3.2.0 - infima: 0.2.0-alpha.45 - lodash: 4.17.21 - nprogress: 0.2.0 - postcss: 8.5.4 - prism-react-renderer: 2.4.1(react@19.1.0) - prismjs: 1.29.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-router-dom: 5.3.4(react@19.1.0) - rtlcss: 4.1.1 - tslib: 2.6.2 - utility-types: 3.10.0 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@types/react' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/theme-common@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@docusaurus/mdx-loader': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/module-type-aliases': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@types/history': 4.7.11 - '@types/react': 19.0.8 - '@types/react-router-config': 5.0.11 - clsx: 2.1.1 - parse-numeric-range: 1.3.0 - prism-react-renderer: 2.4.1(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - utility-types: 3.10.0 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@docusaurus/theme-live-codeblock@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@philpl/buble': 0.19.7 - clsx: 2.1.1 - fs-extra: 11.2.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-live: 4.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@docusaurus/plugin-content-docs' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/theme-mermaid@3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3)': - dependencies: - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/module-type-aliases': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - mermaid: 11.8.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@docusaurus/faster' - - '@docusaurus/plugin-content-docs' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/theme-search-algolia@3.8.1(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3)(typescript@5.7.3)': - dependencies: - '@docsearch/react': 3.9.0(@algolia/client-search@5.20.0)(@types/react@19.0.8)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(search-insights@2.17.3) - '@docusaurus/core': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/logger': 3.8.1 - '@docusaurus/plugin-content-docs': 3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3) - '@docusaurus/theme-common': 3.8.1(@docusaurus/plugin-content-docs@3.8.1(@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0))(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(typescript@5.7.3))(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/theme-translations': 3.8.1 - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-validation': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - algoliasearch: 5.20.0 - algoliasearch-helper: 3.23.1(algoliasearch@5.20.0) - clsx: 2.1.1 - eta: 2.2.0 - fs-extra: 11.2.0 - lodash: 4.17.21 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - tslib: 2.6.2 - utility-types: 3.10.0 - transitivePeerDependencies: - - '@algolia/client-search' - - '@docusaurus/faster' - - '@mdx-js/react' - - '@parcel/css' - - '@rspack/core' - - '@swc/core' - - '@swc/css' - - '@types/react' - - bufferutil - - csso - - debug - - esbuild - - lightningcss - - search-insights - - supports-color - - typescript - - uglify-js - - utf-8-validate - - webpack-cli - - '@docusaurus/theme-translations@3.8.1': - dependencies: - fs-extra: 11.2.0 - tslib: 2.6.2 - - '@docusaurus/types@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@mdx-js/mdx': 3.0.0 - '@types/history': 4.7.11 - '@types/react': 19.0.8 - commander: 5.1.0 - joi: 17.11.0 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-helmet-async: '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)' - utility-types: 3.10.0 - webpack: 5.97.1 - webpack-merge: 5.10.0 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - supports-color - - uglify-js - - webpack-cli - - '@docusaurus/utils-common@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - react - - react-dom - - supports-color - - uglify-js - - webpack-cli - - '@docusaurus/utils-validation@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/utils': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - fs-extra: 11.2.0 - joi: 17.11.0 - js-yaml: 4.1.0 - lodash: 4.17.21 - tslib: 2.6.2 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - react - - react-dom - - supports-color - - uglify-js - - webpack-cli - - '@docusaurus/utils@3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@docusaurus/logger': 3.8.1 - '@docusaurus/types': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - '@docusaurus/utils-common': 3.8.1(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - escape-string-regexp: 4.0.0 - execa: 5.1.1 - file-loader: 6.2.0(webpack@5.97.1) - fs-extra: 11.2.0 - github-slugger: 1.5.0 - globby: 11.1.0 - gray-matter: 4.0.3 - jiti: 1.21.0 - js-yaml: 4.1.0 - lodash: 4.17.21 - micromatch: 4.0.5 - p-queue: 6.6.2 - prompts: 2.4.2 - resolve-pathname: 3.0.0 - tslib: 2.6.2 - url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1) - utility-types: 3.10.0 - webpack: 5.97.1 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - react - - react-dom - - supports-color - - uglify-js - - webpack-cli - - '@hapi/hoek@9.3.0': {} - - '@hapi/topo@5.1.0': - dependencies: - '@hapi/hoek': 9.3.0 - - '@iconify/types@2.0.0': {} - - '@iconify/utils@2.2.1': - dependencies: - '@antfu/install-pkg': 0.4.1 - '@antfu/utils': 0.7.10 - '@iconify/types': 2.0.0 - debug: 4.4.0 - globals: 15.14.0 - kolorist: 1.8.0 - local-pkg: 0.5.1 - mlly: 1.7.4 - transitivePeerDependencies: - - supports-color - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - - '@jest/types@29.6.3': - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 20.11.0 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.1': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/source-map@0.3.5': - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/sourcemap-codec@1.4.15': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - - '@leichtgewicht/ip-codec@2.0.4': {} - - '@mdx-js/mdx@3.0.0': - dependencies: - '@types/estree': 1.0.6 - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - '@types/mdx': 2.0.10 - collapse-white-space: 2.1.0 - devlop: 1.1.0 - estree-util-build-jsx: 3.0.1 - estree-util-is-identifier-name: 3.0.0 - estree-util-to-js: 2.0.0 - estree-walker: 3.0.3 - hast-util-to-estree: 3.1.0 - hast-util-to-jsx-runtime: 2.3.0 - markdown-extensions: 2.0.0 - periscopic: 3.1.0 - remark-mdx: 3.0.0 - remark-parse: 11.0.0 - remark-rehype: 11.1.0 - source-map: 0.7.4 - unified: 11.0.4 - unist-util-position-from-estree: 2.0.0 - unist-util-stringify-position: 4.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - transitivePeerDependencies: - - supports-color - - '@mdx-js/react@3.1.0(@types/react@19.0.8)(react@19.1.0)': - dependencies: - '@types/mdx': 2.0.10 - '@types/react': 19.0.8 - react: 19.1.0 - - '@mermaid-js/parser@0.6.1': - dependencies: - langium: 3.3.1 - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.16.0 - - '@philpl/buble@0.19.7': - dependencies: - acorn: 6.4.2 - acorn-class-fields: 0.2.1(acorn@6.4.2) - acorn-dynamic-import: 4.0.0(acorn@6.4.2) - acorn-jsx: 5.3.2(acorn@6.4.2) - chalk: 2.4.2 - magic-string: 0.25.9 - minimist: 1.2.8 - os-homedir: 1.0.2 - regexpu-core: 4.8.0 - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@pnpm/config.env-replace@1.1.0': {} - - '@pnpm/network.ca-file@1.0.2': - dependencies: - graceful-fs: 4.2.10 - - '@pnpm/npm-conf@2.2.2': - dependencies: - '@pnpm/config.env-replace': 1.1.0 - '@pnpm/network.ca-file': 1.0.2 - config-chain: 1.1.13 - - '@polka/url@1.0.0-next.24': {} - - '@puppeteer/browsers@2.3.0': - dependencies: - debug: 4.4.0 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.5.0 - semver: 7.6.3 - tar-fs: 3.0.8 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - transitivePeerDependencies: - - bare-buffer - - supports-color - optional: true - - '@sideway/address@4.1.4': - dependencies: - '@hapi/hoek': 9.3.0 - - '@sideway/formula@3.0.1': {} - - '@sideway/pinpoint@2.0.0': {} - - '@sinclair/typebox@0.27.8': {} - - '@sindresorhus/is@4.6.0': {} - - '@sindresorhus/is@5.6.0': {} - - '@slorber/react-helmet-async@1.3.0(react-dom@19.1.0(react@19.1.0))(react@19.1.0)': - dependencies: - '@babel/runtime': 7.26.0 - invariant: 2.2.4 - prop-types: 15.8.1 - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - react-fast-compare: 3.2.2 - shallowequal: 1.1.0 - - '@slorber/remark-comment@1.0.0': - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - - '@svgr/babel-plugin-add-jsx-attribute@8.0.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-plugin-remove-jsx-attribute@8.0.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-plugin-svg-dynamic-title@8.0.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-plugin-svg-em-dimensions@8.0.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-plugin-transform-react-native-svg@8.1.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-plugin-transform-svg-component@8.0.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - - '@svgr/babel-preset@8.1.0(@babel/core@7.26.0)': - dependencies: - '@babel/core': 7.26.0 - '@svgr/babel-plugin-add-jsx-attribute': 8.0.0(@babel/core@7.26.0) - '@svgr/babel-plugin-remove-jsx-attribute': 8.0.0(@babel/core@7.26.0) - '@svgr/babel-plugin-remove-jsx-empty-expression': 8.0.0(@babel/core@7.26.0) - '@svgr/babel-plugin-replace-jsx-attribute-value': 8.0.0(@babel/core@7.26.0) - '@svgr/babel-plugin-svg-dynamic-title': 8.0.0(@babel/core@7.26.0) - '@svgr/babel-plugin-svg-em-dimensions': 8.0.0(@babel/core@7.26.0) - '@svgr/babel-plugin-transform-react-native-svg': 8.1.0(@babel/core@7.26.0) - '@svgr/babel-plugin-transform-svg-component': 8.0.0(@babel/core@7.26.0) - - '@svgr/core@8.1.0(typescript@5.7.3)': - dependencies: - '@babel/core': 7.26.0 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) - camelcase: 6.3.0 - cosmiconfig: 8.3.6(typescript@5.7.3) - snake-case: 3.0.4 - transitivePeerDependencies: - - supports-color - - typescript - - '@svgr/hast-util-to-babel-ast@8.0.0': - dependencies: - '@babel/types': 7.26.5 - entities: 4.5.0 - - '@svgr/plugin-jsx@8.1.0(@svgr/core@8.1.0(typescript@5.7.3))': - dependencies: - '@babel/core': 7.26.0 - '@svgr/babel-preset': 8.1.0(@babel/core@7.26.0) - '@svgr/core': 8.1.0(typescript@5.7.3) - '@svgr/hast-util-to-babel-ast': 8.0.0 - svg-parser: 2.0.4 - transitivePeerDependencies: - - supports-color - - '@svgr/plugin-svgo@8.1.0(@svgr/core@8.1.0(typescript@5.7.3))(typescript@5.7.3)': - dependencies: - '@svgr/core': 8.1.0(typescript@5.7.3) - cosmiconfig: 8.3.6(typescript@5.7.3) - deepmerge: 4.3.1 - svgo: 3.2.0 - transitivePeerDependencies: - - typescript - - '@svgr/webpack@8.1.0(typescript@5.7.3)': - dependencies: - '@babel/core': 7.26.0 - '@babel/plugin-transform-react-constant-elements': 7.23.3(@babel/core@7.26.0) - '@babel/preset-env': 7.26.0(@babel/core@7.26.0) - '@babel/preset-react': 7.26.3(@babel/core@7.26.0) - '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) - '@svgr/core': 8.1.0(typescript@5.7.3) - '@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3)) - '@svgr/plugin-svgo': 8.1.0(@svgr/core@8.1.0(typescript@5.7.3))(typescript@5.7.3) - transitivePeerDependencies: - - supports-color - - typescript - - '@szmarczak/http-timer@5.0.1': - dependencies: - defer-to-connect: 2.0.1 - - '@tootallnate/quickjs-emscripten@0.23.0': - optional: true - - '@trysound/sax@0.2.0': {} - - '@types/acorn@4.0.6': - dependencies: - '@types/estree': 1.0.6 - - '@types/body-parser@1.19.5': - dependencies: - '@types/connect': 3.4.38 - '@types/node': 20.11.0 - - '@types/bonjour@3.5.13': - dependencies: - '@types/node': 20.11.0 - - '@types/connect-history-api-fallback@1.5.4': - dependencies: - '@types/express-serve-static-core': 4.17.41 - '@types/node': 20.11.0 - - '@types/connect@3.4.38': - dependencies: - '@types/node': 20.11.0 - - '@types/d3-array@3.2.1': {} - - '@types/d3-axis@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-brush@3.0.6': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-chord@3.0.6': {} - - '@types/d3-color@3.1.3': {} - - '@types/d3-contour@3.0.6': - dependencies: - '@types/d3-array': 3.2.1 - '@types/geojson': 7946.0.16 - - '@types/d3-delaunay@6.0.4': {} - - '@types/d3-dispatch@3.0.6': {} - - '@types/d3-drag@3.0.7': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-dsv@3.0.7': {} - - '@types/d3-ease@3.0.2': {} - - '@types/d3-fetch@3.0.7': - dependencies: - '@types/d3-dsv': 3.0.7 - - '@types/d3-force@3.0.10': {} - - '@types/d3-format@3.0.4': {} - - '@types/d3-geo@3.1.0': - dependencies: - '@types/geojson': 7946.0.16 - - '@types/d3-hierarchy@3.1.7': {} - - '@types/d3-interpolate@3.0.4': - dependencies: - '@types/d3-color': 3.1.3 - - '@types/d3-path@3.1.0': {} - - '@types/d3-polygon@3.0.2': {} - - '@types/d3-quadtree@3.0.6': {} - - '@types/d3-random@3.0.3': {} - - '@types/d3-scale-chromatic@3.0.3': {} - - '@types/d3-scale@4.0.8': - dependencies: - '@types/d3-time': 3.0.3 - - '@types/d3-selection@3.0.11': {} - - '@types/d3-shape@3.1.7': - dependencies: - '@types/d3-path': 3.1.0 - - '@types/d3-time-format@4.0.3': {} - - '@types/d3-time@3.0.3': {} - - '@types/d3-timer@3.0.2': {} - - '@types/d3-transition@3.0.9': - dependencies: - '@types/d3-selection': 3.0.11 - - '@types/d3-zoom@3.0.8': - dependencies: - '@types/d3-interpolate': 3.0.4 - '@types/d3-selection': 3.0.11 - - '@types/d3@7.4.3': - dependencies: - '@types/d3-array': 3.2.1 - '@types/d3-axis': 3.0.6 - '@types/d3-brush': 3.0.6 - '@types/d3-chord': 3.0.6 - '@types/d3-color': 3.1.3 - '@types/d3-contour': 3.0.6 - '@types/d3-delaunay': 6.0.4 - '@types/d3-dispatch': 3.0.6 - '@types/d3-drag': 3.0.7 - '@types/d3-dsv': 3.0.7 - '@types/d3-ease': 3.0.2 - '@types/d3-fetch': 3.0.7 - '@types/d3-force': 3.0.10 - '@types/d3-format': 3.0.4 - '@types/d3-geo': 3.1.0 - '@types/d3-hierarchy': 3.1.7 - '@types/d3-interpolate': 3.0.4 - '@types/d3-path': 3.1.0 - '@types/d3-polygon': 3.0.2 - '@types/d3-quadtree': 3.0.6 - '@types/d3-random': 3.0.3 - '@types/d3-scale': 4.0.8 - '@types/d3-scale-chromatic': 3.0.3 - '@types/d3-selection': 3.0.11 - '@types/d3-shape': 3.1.7 - '@types/d3-time': 3.0.3 - '@types/d3-time-format': 4.0.3 - '@types/d3-timer': 3.0.2 - '@types/d3-transition': 3.0.9 - '@types/d3-zoom': 3.0.8 - - '@types/debug@4.1.12': - dependencies: - '@types/ms': 0.7.34 - - '@types/eslint-scope@3.7.7': - dependencies: - '@types/eslint': 8.56.2 - '@types/estree': 1.0.6 - - '@types/eslint@8.56.2': - dependencies: - '@types/estree': 1.0.6 - '@types/json-schema': 7.0.15 - - '@types/estree-jsx@1.0.3': - dependencies: - '@types/estree': 1.0.6 - - '@types/estree@1.0.5': - optional: true - - '@types/estree@1.0.6': {} - - '@types/express-serve-static-core@4.17.41': - dependencies: - '@types/node': 20.11.0 - '@types/qs': 6.9.11 - '@types/range-parser': 1.2.7 - '@types/send': 0.17.4 - - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.17.41 - '@types/qs': 6.9.11 - '@types/serve-static': 1.15.5 - - '@types/geojson@7946.0.16': {} - - '@types/gtag.js@0.0.12': {} - - '@types/hast@2.3.9': - dependencies: - '@types/unist': 2.0.10 - optional: true - - '@types/hast@3.0.3': - dependencies: - '@types/unist': 3.0.2 - - '@types/history@4.7.11': {} - - '@types/html-minifier-terser@6.1.0': {} - - '@types/http-cache-semantics@4.0.4': {} - - '@types/http-errors@2.0.4': {} - - '@types/http-proxy@1.17.14': - dependencies: - '@types/node': 20.11.0 - - '@types/istanbul-lib-coverage@2.0.6': {} - - '@types/istanbul-lib-report@3.0.3': - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - - '@types/istanbul-reports@3.0.4': - dependencies: - '@types/istanbul-lib-report': 3.0.3 - - '@types/json-schema@7.0.15': {} - - '@types/mdast@3.0.15': - dependencies: - '@types/unist': 2.0.10 - optional: true - - '@types/mdast@4.0.3': - dependencies: - '@types/unist': 3.0.2 - - '@types/mdx@2.0.10': {} - - '@types/mime@1.3.5': {} - - '@types/mime@3.0.4': {} - - '@types/ms@0.7.34': {} - - '@types/node-forge@1.3.11': - dependencies: - '@types/node': 20.11.0 - - '@types/node@17.0.45': {} - - '@types/node@20.11.0': - dependencies: - undici-types: 5.26.5 - - '@types/prismjs@1.26.5': {} - - '@types/qs@6.9.11': {} - - '@types/range-parser@1.2.7': {} - - '@types/react-router-config@5.0.11': - dependencies: - '@types/history': 4.7.11 - '@types/react': 19.0.8 - '@types/react-router': 5.1.20 - - '@types/react-router-dom@5.3.3': - dependencies: - '@types/history': 4.7.11 - '@types/react': 19.0.8 - '@types/react-router': 5.1.20 - - '@types/react-router@5.1.20': - dependencies: - '@types/history': 4.7.11 - '@types/react': 19.0.8 - - '@types/react@19.0.8': - dependencies: - csstype: 3.1.3 - - '@types/retry@0.12.0': {} - - '@types/sax@1.2.7': - dependencies: - '@types/node': 20.11.0 - - '@types/send@0.17.4': - dependencies: - '@types/mime': 1.3.5 - '@types/node': 20.11.0 - - '@types/serve-index@1.9.4': - dependencies: - '@types/express': 4.17.21 - - '@types/serve-static@1.15.5': - dependencies: - '@types/http-errors': 2.0.4 - '@types/mime': 3.0.4 - '@types/node': 20.11.0 - - '@types/sockjs@0.3.36': - dependencies: - '@types/node': 20.11.0 - - '@types/trusted-types@2.0.7': - optional: true - - '@types/unist@2.0.10': {} - - '@types/unist@3.0.2': {} - - '@types/ws@8.5.10': - dependencies: - '@types/node': 20.11.0 - - '@types/yargs-parser@21.0.3': {} - - '@types/yargs@17.0.32': - dependencies: - '@types/yargs-parser': 21.0.3 - - '@types/yauzl@2.10.3': - dependencies: - '@types/node': 20.11.0 - optional: true - - '@ungap/structured-clone@1.2.0': {} - - '@webassemblyjs/ast@1.14.1': - dependencies: - '@webassemblyjs/helper-numbers': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - - '@webassemblyjs/floating-point-hex-parser@1.13.2': {} - - '@webassemblyjs/helper-api-error@1.13.2': {} - - '@webassemblyjs/helper-buffer@1.14.1': {} - - '@webassemblyjs/helper-numbers@1.13.2': - dependencies: - '@webassemblyjs/floating-point-hex-parser': 1.13.2 - '@webassemblyjs/helper-api-error': 1.13.2 - '@xtuc/long': 4.2.2 - - '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} - - '@webassemblyjs/helper-wasm-section@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/wasm-gen': 1.14.1 - - '@webassemblyjs/ieee754@1.13.2': - dependencies: - '@xtuc/ieee754': 1.2.0 - - '@webassemblyjs/leb128@1.13.2': - dependencies: - '@xtuc/long': 4.2.2 - - '@webassemblyjs/utf8@1.13.2': {} - - '@webassemblyjs/wasm-edit@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/helper-wasm-section': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-opt': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - '@webassemblyjs/wast-printer': 1.14.1 - - '@webassemblyjs/wasm-gen@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wasm-opt@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-buffer': 1.14.1 - '@webassemblyjs/wasm-gen': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - - '@webassemblyjs/wasm-parser@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/helper-api-error': 1.13.2 - '@webassemblyjs/helper-wasm-bytecode': 1.13.2 - '@webassemblyjs/ieee754': 1.13.2 - '@webassemblyjs/leb128': 1.13.2 - '@webassemblyjs/utf8': 1.13.2 - - '@webassemblyjs/wast-printer@1.14.1': - dependencies: - '@webassemblyjs/ast': 1.14.1 - '@xtuc/long': 4.2.2 - - '@xtuc/ieee754@1.2.0': {} - - '@xtuc/long@4.2.2': {} - - accepts@1.3.8: - dependencies: - mime-types: 2.1.35 - negotiator: 0.6.3 - - acorn-class-fields@0.2.1(acorn@6.4.2): - dependencies: - acorn: 6.4.2 - - acorn-dynamic-import@4.0.0(acorn@6.4.2): - dependencies: - acorn: 6.4.2 - - acorn-jsx@5.3.2(acorn@6.4.2): - dependencies: - acorn: 6.4.2 - - acorn-jsx@5.3.2(acorn@8.11.3): - dependencies: - acorn: 8.11.3 - optional: true - - acorn-jsx@5.3.2(acorn@8.14.0): - dependencies: - acorn: 8.14.0 - - acorn-walk@8.3.2: {} - - acorn@6.4.2: {} - - acorn@8.11.3: - optional: true - - acorn@8.14.0: {} - - address@1.2.2: {} - - agent-base@7.1.3: - optional: true - - aggregate-error@3.1.0: - dependencies: - clean-stack: 2.2.0 - indent-string: 4.0.0 - - ajv-formats@2.1.1(ajv@8.12.0): - optionalDependencies: - ajv: 8.12.0 - - ajv-keywords@3.5.2(ajv@6.12.6): - dependencies: - ajv: 6.12.6 - - ajv-keywords@5.1.0(ajv@8.12.0): - dependencies: - ajv: 8.12.0 - fast-deep-equal: 3.1.3 - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ajv@8.12.0: - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - - algoliasearch-helper@3.23.1(algoliasearch@5.20.0): - dependencies: - '@algolia/events': 4.0.1 - algoliasearch: 5.20.0 - - algoliasearch@5.20.0: - dependencies: - '@algolia/client-abtesting': 5.20.0 - '@algolia/client-analytics': 5.20.0 - '@algolia/client-common': 5.20.0 - '@algolia/client-insights': 5.20.0 - '@algolia/client-personalization': 5.20.0 - '@algolia/client-query-suggestions': 5.20.0 - '@algolia/client-search': 5.20.0 - '@algolia/ingestion': 1.20.0 - '@algolia/monitoring': 1.20.0 - '@algolia/recommend': 5.20.0 - '@algolia/requester-browser-xhr': 5.20.0 - '@algolia/requester-fetch': 5.20.0 - '@algolia/requester-node-http': 5.20.0 - - ansi-align@3.0.1: - dependencies: - string-width: 4.2.3 - - ansi-escapes@4.3.2: - dependencies: - type-fest: 0.21.3 - - ansi-html-community@0.0.8: {} - - ansi-regex@5.0.1: {} - - ansi-regex@6.0.1: {} - - ansi-styles@3.2.1: - dependencies: - color-convert: 1.9.3 - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@5.0.2: {} - - argparse@1.0.10: - dependencies: - sprintf-js: 1.0.3 - - argparse@2.0.1: {} - - array-flatten@1.1.1: {} - - array-union@2.1.0: {} - - ast-types@0.13.4: - dependencies: - tslib: 2.6.2 - optional: true - - astring@1.8.6: {} - - autoprefixer@10.4.19(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - autoprefixer@10.4.21(postcss@8.5.4): - dependencies: - browserslist: 4.25.0 - caniuse-lite: 1.0.30001721 - fraction.js: 4.3.7 - normalize-range: 0.1.2 - picocolors: 1.1.1 - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - b4a@1.6.4: {} - - babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.97.1): - dependencies: - '@babel/core': 7.26.0 - find-cache-dir: 4.0.0 - schema-utils: 4.2.0 - webpack: 5.97.1 - - babel-plugin-dynamic-import-node@2.3.3: - dependencies: - object.assign: 4.1.5 - - babel-plugin-polyfill-corejs2@0.4.12(@babel/core@7.26.0): - dependencies: - '@babel/compat-data': 7.26.5 - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-corejs3@0.10.6(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) - core-js-compat: 3.40.0 - transitivePeerDependencies: - - supports-color - - babel-plugin-polyfill-regenerator@0.6.3(@babel/core@7.26.0): - dependencies: - '@babel/core': 7.26.0 - '@babel/helper-define-polyfill-provider': 0.6.3(@babel/core@7.26.0) - transitivePeerDependencies: - - supports-color - - bail@2.0.2: {} - - balanced-match@1.0.2: {} - - bare-events@2.5.4: - optional: true - - bare-fs@4.0.1: - dependencies: - bare-events: 2.5.4 - bare-path: 3.0.0 - bare-stream: 2.6.4(bare-events@2.5.4) - transitivePeerDependencies: - - bare-buffer - optional: true - - bare-os@3.4.0: - optional: true - - bare-path@3.0.0: - dependencies: - bare-os: 3.4.0 - optional: true - - bare-stream@2.6.4(bare-events@2.5.4): - dependencies: - streamx: 2.21.1 - optionalDependencies: - bare-events: 2.5.4 - optional: true - - base64-js@1.5.1: {} - - basic-ftp@5.0.5: - optional: true - - batch@0.6.1: {} - - big.js@5.2.2: {} - - binary-extensions@2.2.0: {} - - bl@4.1.0: - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - - body-parser@1.20.2: - dependencies: - bytes: 3.1.2 - content-type: 1.0.5 - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - on-finished: 2.4.1 - qs: 6.11.0 - raw-body: 2.5.2 - type-is: 1.6.18 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - bonjour-service@1.2.1: - dependencies: - fast-deep-equal: 3.1.3 - multicast-dns: 7.2.5 - - boolbase@1.0.0: {} - - boxen@6.2.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 6.3.0 - chalk: 4.1.2 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - - boxen@7.1.1: - dependencies: - ansi-align: 3.0.1 - camelcase: 7.0.1 - chalk: 5.3.0 - cli-boxes: 3.0.0 - string-width: 5.1.2 - type-fest: 2.19.0 - widest-line: 4.0.1 - wrap-ansi: 8.1.0 - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.2: - dependencies: - fill-range: 7.0.1 - - browserslist@4.24.4: - dependencies: - caniuse-lite: 1.0.30001695 - electron-to-chromium: 1.5.87 - node-releases: 2.0.19 - update-browserslist-db: 1.1.2(browserslist@4.24.4) - - browserslist@4.25.0: - dependencies: - caniuse-lite: 1.0.30001721 - electron-to-chromium: 1.5.165 - node-releases: 2.0.19 - update-browserslist-db: 1.1.3(browserslist@4.25.0) - - buffer-crc32@0.2.13: - optional: true - - buffer-from@1.1.2: {} - - buffer@5.7.1: - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - bytes@3.0.0: {} - - bytes@3.1.2: {} - - cacheable-lookup@7.0.0: {} - - cacheable-request@10.2.14: - dependencies: - '@types/http-cache-semantics': 4.0.4 - get-stream: 6.0.1 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - mimic-response: 4.0.0 - normalize-url: 8.0.0 - responselike: 3.0.0 - - call-bind@1.0.5: - dependencies: - function-bind: 1.1.2 - get-intrinsic: 1.2.2 - set-function-length: 1.1.1 - - callsites@3.1.0: {} - - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.2 - - camelcase@6.3.0: {} - - camelcase@7.0.1: {} - - caniuse-api@3.0.0: - dependencies: - browserslist: 4.24.4 - caniuse-lite: 1.0.30001695 - lodash.memoize: 4.1.2 - lodash.uniq: 4.5.0 - - caniuse-lite@1.0.30001695: {} - - caniuse-lite@1.0.30001721: {} - - ccount@2.0.1: {} - - chalk@2.4.2: - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chalk@5.3.0: {} - - char-regex@1.0.2: {} - - character-entities-html4@2.1.0: {} - - character-entities-legacy@3.0.0: {} - - character-entities@2.0.2: {} - - character-reference-invalid@2.0.1: {} - - cheerio-select@2.1.0: - dependencies: - boolbase: 1.0.0 - css-select: 5.1.0 - css-what: 6.1.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - - cheerio@1.0.0-rc.12: - dependencies: - cheerio-select: 2.1.0 - dom-serializer: 2.0.0 - domhandler: 5.0.3 - domutils: 3.1.0 - htmlparser2: 8.0.2 - parse5: 7.1.2 - parse5-htmlparser2-tree-adapter: 7.0.0 - - chevrotain-allstar@0.3.1(chevrotain@11.0.3): - dependencies: - chevrotain: 11.0.3 - lodash-es: 4.17.21 - - chevrotain@11.0.3: - dependencies: - '@chevrotain/cst-dts-gen': 11.0.3 - '@chevrotain/gast': 11.0.3 - '@chevrotain/regexp-to-ast': 11.0.3 - '@chevrotain/types': 11.0.3 - '@chevrotain/utils': 11.0.3 - lodash-es: 4.17.21 - - chokidar@3.5.3: - dependencies: - anymatch: 3.1.3 - braces: 3.0.2 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chownr@1.1.4: {} - - chrome-trace-event@1.0.3: {} - - chromium-bidi@0.6.3(devtools-protocol@0.0.1312386): - dependencies: - devtools-protocol: 0.0.1312386 - mitt: 3.0.1 - urlpattern-polyfill: 10.0.0 - zod: 3.23.8 - optional: true - - ci-info@3.9.0: {} - - clean-css@5.3.3: - dependencies: - source-map: 0.6.1 - - clean-stack@2.2.0: {} - - cli-boxes@3.0.0: {} - - cli-table3@0.6.3: - dependencies: - string-width: 4.2.3 - optionalDependencies: - '@colors/colors': 1.5.0 - - cliui@8.0.1: - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - optional: true - - clone-deep@4.0.1: - dependencies: - is-plain-object: 2.0.4 - kind-of: 6.0.3 - shallow-clone: 3.0.1 - - clsx@2.1.1: {} - - collapse-white-space@2.1.0: {} - - color-convert@1.9.3: - dependencies: - color-name: 1.1.3 - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.3: {} - - color-name@1.1.4: {} - - color-string@1.9.1: - dependencies: - color-name: 1.1.4 - simple-swizzle: 0.2.2 - - color@4.2.3: - dependencies: - color-convert: 2.0.1 - color-string: 1.9.1 - - colord@2.9.3: {} - - colorette@2.0.20: {} - - combine-promises@1.2.0: {} - - comma-separated-tokens@2.0.3: {} - - commander@10.0.1: {} - - commander@2.20.3: {} - - commander@4.1.1: {} - - commander@5.1.0: {} - - commander@7.2.0: {} - - commander@8.3.0: {} - - common-path-prefix@3.0.0: {} - - compressible@2.0.18: - dependencies: - mime-db: 1.52.0 - - compression@1.7.4: - dependencies: - accepts: 1.3.8 - bytes: 3.0.0 - compressible: 2.0.18 - debug: 2.6.9 - on-headers: 1.0.2 - safe-buffer: 5.1.2 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - concat-map@0.0.1: {} - - confbox@0.1.8: {} - - config-chain@1.1.13: - dependencies: - ini: 1.3.8 - proto-list: 1.2.4 - - configstore@6.0.0: - dependencies: - dot-prop: 6.0.1 - graceful-fs: 4.2.11 - unique-string: 3.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 5.1.0 - - connect-history-api-fallback@2.0.0: {} - - consola@3.4.0: {} - - content-disposition@0.5.2: {} - - content-disposition@0.5.4: - dependencies: - safe-buffer: 5.2.1 - - content-type@1.0.5: {} - - convert-source-map@2.0.0: {} - - cookie-signature@1.0.6: {} - - cookie@0.6.0: {} - - copy-text-to-clipboard@3.2.0: {} - - copy-webpack-plugin@11.0.0(webpack@5.97.1): - dependencies: - fast-glob: 3.3.2 - glob-parent: 6.0.2 - globby: 13.2.2 - normalize-path: 3.0.0 - schema-utils: 4.2.0 - serialize-javascript: 6.0.2 - webpack: 5.97.1 - - core-js-compat@3.40.0: - dependencies: - browserslist: 4.24.4 - - core-js-pure@3.35.0: {} - - core-js@3.35.0: {} - - core-util-is@1.0.3: {} - - cose-base@1.0.3: - dependencies: - layout-base: 1.0.2 - - cose-base@2.2.0: - dependencies: - layout-base: 2.0.1 - - cosmiconfig@8.3.6(typescript@5.7.3): - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - optionalDependencies: - typescript: 5.7.3 - - cosmiconfig@9.0.0(typescript@5.7.3): - dependencies: - env-paths: 2.2.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - optionalDependencies: - typescript: 5.7.3 - optional: true - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - crypto-random-string@4.0.0: - dependencies: - type-fest: 1.4.0 - - css-blank-pseudo@7.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - css-declaration-sorter@7.2.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - css-has-pseudo@7.0.2(postcss@8.5.4): - dependencies: - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0) - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - postcss-value-parser: 4.2.0 - - css-loader@6.11.0(webpack@5.97.1): - dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-modules-extract-imports: 3.1.0(postcss@8.5.4) - postcss-modules-local-by-default: 4.2.0(postcss@8.5.4) - postcss-modules-scope: 3.2.1(postcss@8.5.4) - postcss-modules-values: 4.0.0(postcss@8.5.4) - postcss-value-parser: 4.2.0 - semver: 7.6.3 - optionalDependencies: - webpack: 5.97.1 - - css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(webpack@5.97.1): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - cssnano: 6.1.2(postcss@8.5.4) - jest-worker: 29.7.0 - postcss: 8.5.4 - schema-utils: 4.2.0 - serialize-javascript: 6.0.2 - webpack: 5.97.1 - optionalDependencies: - clean-css: 5.3.3 - - css-prefers-color-scheme@10.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - css-select@4.3.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 4.3.1 - domutils: 2.8.0 - nth-check: 2.1.1 - - css-select@5.1.0: - dependencies: - boolbase: 1.0.0 - css-what: 6.1.0 - domhandler: 5.0.3 - domutils: 3.1.0 - nth-check: 2.1.1 - - css-tree@2.2.1: - dependencies: - mdn-data: 2.0.28 - source-map-js: 1.2.0 - - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.0 - - css-what@6.1.0: {} - - cssdb@8.3.0: {} - - cssesc@3.0.0: {} - - cssnano-preset-advanced@6.1.2(postcss@8.5.4): - dependencies: - autoprefixer: 10.4.19(postcss@8.5.4) - browserslist: 4.24.4 - cssnano-preset-default: 6.1.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-discard-unused: 6.0.5(postcss@8.5.4) - postcss-merge-idents: 6.0.3(postcss@8.5.4) - postcss-reduce-idents: 6.0.3(postcss@8.5.4) - postcss-zindex: 6.0.2(postcss@8.5.4) - - cssnano-preset-default@6.1.2(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - css-declaration-sorter: 7.2.0(postcss@8.5.4) - cssnano-utils: 4.0.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-calc: 9.0.1(postcss@8.5.4) - postcss-colormin: 6.1.0(postcss@8.5.4) - postcss-convert-values: 6.1.0(postcss@8.5.4) - postcss-discard-comments: 6.0.2(postcss@8.5.4) - postcss-discard-duplicates: 6.0.3(postcss@8.5.4) - postcss-discard-empty: 6.0.3(postcss@8.5.4) - postcss-discard-overridden: 6.0.2(postcss@8.5.4) - postcss-merge-longhand: 6.0.5(postcss@8.5.4) - postcss-merge-rules: 6.1.1(postcss@8.5.4) - postcss-minify-font-values: 6.1.0(postcss@8.5.4) - postcss-minify-gradients: 6.0.3(postcss@8.5.4) - postcss-minify-params: 6.1.0(postcss@8.5.4) - postcss-minify-selectors: 6.0.4(postcss@8.5.4) - postcss-normalize-charset: 6.0.2(postcss@8.5.4) - postcss-normalize-display-values: 6.0.2(postcss@8.5.4) - postcss-normalize-positions: 6.0.2(postcss@8.5.4) - postcss-normalize-repeat-style: 6.0.2(postcss@8.5.4) - postcss-normalize-string: 6.0.2(postcss@8.5.4) - postcss-normalize-timing-functions: 6.0.2(postcss@8.5.4) - postcss-normalize-unicode: 6.1.0(postcss@8.5.4) - postcss-normalize-url: 6.0.2(postcss@8.5.4) - postcss-normalize-whitespace: 6.0.2(postcss@8.5.4) - postcss-ordered-values: 6.0.2(postcss@8.5.4) - postcss-reduce-initial: 6.1.0(postcss@8.5.4) - postcss-reduce-transforms: 6.0.2(postcss@8.5.4) - postcss-svgo: 6.0.3(postcss@8.5.4) - postcss-unique-selectors: 6.0.4(postcss@8.5.4) - - cssnano-utils@4.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - cssnano@6.1.2(postcss@8.5.4): - dependencies: - cssnano-preset-default: 6.1.2(postcss@8.5.4) - lilconfig: 3.1.1 - postcss: 8.5.4 - - csso@5.0.5: - dependencies: - css-tree: 2.2.1 - - csstype@3.1.3: {} - - cytoscape-cose-bilkent@4.1.0(cytoscape@3.31.0): - dependencies: - cose-base: 1.0.3 - cytoscape: 3.31.0 - - cytoscape-fcose@2.2.0(cytoscape@3.31.0): - dependencies: - cose-base: 2.2.0 - cytoscape: 3.31.0 - - cytoscape@3.31.0: {} - - d3-array@2.12.1: - dependencies: - internmap: 1.0.1 - - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-axis@3.0.0: {} - - d3-brush@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3-chord@3.0.1: - dependencies: - d3-path: 3.1.0 - - d3-color@3.1.0: {} - - d3-contour@4.0.2: - dependencies: - d3-array: 3.2.4 - - d3-delaunay@6.0.4: - dependencies: - delaunator: 5.0.0 - - d3-dispatch@3.0.1: {} - - d3-drag@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-selection: 3.0.0 - - d3-dsv@3.0.1: - dependencies: - commander: 7.2.0 - iconv-lite: 0.6.3 - rw: 1.3.3 - - d3-ease@3.0.1: {} - - d3-fetch@3.0.1: - dependencies: - d3-dsv: 3.0.1 - - d3-force@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-quadtree: 3.0.1 - d3-timer: 3.0.1 - - d3-format@3.1.0: {} - - d3-geo@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-hierarchy@3.1.2: {} - - d3-interpolate@3.0.1: - dependencies: - d3-color: 3.1.0 - - d3-path@1.0.9: {} - - d3-path@3.1.0: {} - - d3-polygon@3.0.1: {} - - d3-quadtree@3.0.1: {} - - d3-random@3.0.1: {} - - d3-sankey@0.12.3: - dependencies: - d3-array: 2.12.1 - d3-shape: 1.3.7 - - d3-scale-chromatic@3.0.0: - dependencies: - d3-color: 3.1.0 - d3-interpolate: 3.0.1 - - d3-scale@4.0.2: - dependencies: - d3-array: 3.2.4 - d3-format: 3.1.0 - d3-interpolate: 3.0.1 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - - d3-selection@3.0.0: {} - - d3-shape@1.3.7: - dependencies: - d3-path: 1.0.9 - - d3-shape@3.2.0: - dependencies: - d3-path: 3.1.0 - - d3-time-format@4.1.0: - dependencies: - d3-time: 3.1.0 - - d3-time@3.1.0: - dependencies: - d3-array: 3.2.4 - - d3-timer@3.0.1: {} - - d3-transition@3.0.1(d3-selection@3.0.0): - dependencies: - d3-color: 3.1.0 - d3-dispatch: 3.0.1 - d3-ease: 3.0.1 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-timer: 3.0.1 - - d3-zoom@3.0.0: - dependencies: - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-interpolate: 3.0.1 - d3-selection: 3.0.0 - d3-transition: 3.0.1(d3-selection@3.0.0) - - d3@7.9.0: - dependencies: - d3-array: 3.2.4 - d3-axis: 3.0.0 - d3-brush: 3.0.0 - d3-chord: 3.0.1 - d3-color: 3.1.0 - d3-contour: 4.0.2 - d3-delaunay: 6.0.4 - d3-dispatch: 3.0.1 - d3-drag: 3.0.0 - d3-dsv: 3.0.1 - d3-ease: 3.0.1 - d3-fetch: 3.0.1 - d3-force: 3.0.0 - d3-format: 3.1.0 - d3-geo: 3.1.0 - d3-hierarchy: 3.1.2 - d3-interpolate: 3.0.1 - d3-path: 3.1.0 - d3-polygon: 3.0.1 - d3-quadtree: 3.0.1 - d3-random: 3.0.1 - d3-scale: 4.0.2 - d3-scale-chromatic: 3.0.0 - d3-selection: 3.0.0 - d3-shape: 3.2.0 - d3-time: 3.1.0 - d3-time-format: 4.1.0 - d3-timer: 3.0.1 - d3-transition: 3.0.1(d3-selection@3.0.0) - d3-zoom: 3.0.0 - - dagre-d3-es@7.0.11: - dependencies: - d3: 7.9.0 - lodash-es: 4.17.21 - - data-uri-to-buffer@6.0.2: - optional: true - - dayjs@1.11.13: {} - - debounce@1.2.1: {} - - debug@2.6.9: - dependencies: - ms: 2.0.0 - - debug@4.4.0: - dependencies: - ms: 2.1.3 - - decode-named-character-reference@1.0.2: - dependencies: - character-entities: 2.0.2 - - decompress-response@6.0.0: - dependencies: - mimic-response: 3.1.0 - - deep-extend@0.6.0: {} - - deepmerge@4.3.1: {} - - default-gateway@6.0.3: - dependencies: - execa: 5.1.1 - - defer-to-connect@2.0.1: {} - - define-data-property@1.1.1: - dependencies: - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - - define-lazy-prop@2.0.0: {} - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.1 - has-property-descriptors: 1.0.1 - object-keys: 1.1.1 - - degenerator@5.0.1: - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - optional: true - - delaunator@5.0.0: - dependencies: - robust-predicates: 3.0.2 - - depd@1.1.2: {} - - depd@2.0.0: {} - - dequal@2.0.3: {} - - destroy@1.2.0: {} - - detect-libc@2.0.2: {} - - detect-node@2.1.0: {} - - detect-port@1.5.1: - dependencies: - address: 1.2.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - - devlop@1.1.0: - dependencies: - dequal: 2.0.3 - - devtools-protocol@0.0.1312386: - optional: true - - diff@5.1.0: - optional: true - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dns-packet@5.6.1: - dependencies: - '@leichtgewicht/ip-codec': 2.0.4 - - dom-converter@0.2.0: - dependencies: - utila: 0.4.0 - - dom-serializer@1.4.1: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - entities: 2.2.0 - - dom-serializer@2.0.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - entities: 4.5.0 - - domelementtype@2.3.0: {} - - domhandler@4.3.1: - dependencies: - domelementtype: 2.3.0 - - domhandler@5.0.3: - dependencies: - domelementtype: 2.3.0 - - dompurify@3.2.5: - optionalDependencies: - '@types/trusted-types': 2.0.7 - - domutils@2.8.0: - dependencies: - dom-serializer: 1.4.1 - domelementtype: 2.3.0 - domhandler: 4.3.1 - - domutils@3.1.0: - dependencies: - dom-serializer: 2.0.0 - domelementtype: 2.3.0 - domhandler: 5.0.3 - - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - - dot-prop@6.0.1: - dependencies: - is-obj: 2.0.0 - - duplexer@0.1.2: {} - - eastasianwidth@0.2.0: {} - - ee-first@1.1.1: {} - - electron-to-chromium@1.5.165: {} - - electron-to-chromium@1.5.87: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - emojilib@2.4.0: {} - - emojis-list@3.0.0: {} - - emoticon@4.0.1: {} - - encodeurl@1.0.2: {} - - end-of-stream@1.4.4: - dependencies: - once: 1.4.0 - - enhanced-resolve@5.18.0: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - entities@2.2.0: {} - - entities@4.5.0: {} - - env-paths@2.2.1: - optional: true - - error-ex@1.3.2: - dependencies: - is-arrayish: 0.2.1 - - es-module-lexer@1.4.1: {} - - escalade@3.2.0: {} - - escape-goat@4.0.0: {} - - escape-html@1.0.3: {} - - escape-string-regexp@1.0.5: {} - - escape-string-regexp@4.0.0: {} - - escape-string-regexp@5.0.0: {} - - escodegen@2.1.0: - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - optional: true - - eslint-scope@5.1.1: - dependencies: - esrecurse: 4.3.0 - estraverse: 4.3.0 - - esprima@4.0.1: {} - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@4.3.0: {} - - estraverse@5.3.0: {} - - estree-util-attach-comments@2.1.1: - dependencies: - '@types/estree': 1.0.6 - optional: true - - estree-util-attach-comments@3.0.0: - dependencies: - '@types/estree': 1.0.6 - - estree-util-build-jsx@3.0.1: - dependencies: - '@types/estree-jsx': 1.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - estree-walker: 3.0.3 - - estree-util-is-identifier-name@2.1.0: - optional: true - - estree-util-is-identifier-name@3.0.0: {} - - estree-util-to-js@1.2.0: - dependencies: - '@types/estree-jsx': 1.0.3 - astring: 1.8.6 - source-map: 0.7.4 - optional: true - - estree-util-to-js@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.3 - astring: 1.8.6 - source-map: 0.7.4 - - estree-util-value-to-estree@3.0.1: - dependencies: - '@types/estree': 1.0.6 - is-plain-obj: 4.1.0 - - estree-util-visit@1.2.1: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/unist': 2.0.10 - optional: true - - estree-util-visit@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/unist': 3.0.2 - - estree-walker@3.0.3: - dependencies: - '@types/estree': 1.0.6 - - esutils@2.0.3: {} - - eta@2.2.0: {} - - etag@1.8.1: {} - - eval@0.1.8: - dependencies: - '@types/node': 20.11.0 - require-like: 0.1.2 - - eventemitter3@4.0.7: {} - - events@3.3.0: {} - - execa@5.1.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - - expand-template@2.0.3: {} - - express@4.19.2: - dependencies: - accepts: 1.3.8 - array-flatten: 1.1.1 - body-parser: 1.20.2 - content-disposition: 0.5.4 - content-type: 1.0.5 - cookie: 0.6.0 - cookie-signature: 1.0.6 - debug: 2.6.9 - depd: 2.0.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - finalhandler: 1.2.0 - fresh: 0.5.2 - http-errors: 2.0.0 - merge-descriptors: 1.0.1 - methods: 1.1.2 - on-finished: 2.4.1 - parseurl: 1.3.3 - path-to-regexp: 0.1.7 - proxy-addr: 2.0.7 - qs: 6.11.0 - range-parser: 1.2.1 - safe-buffer: 5.2.1 - send: 0.18.0 - serve-static: 1.15.0 - setprototypeof: 1.2.0 - statuses: 2.0.1 - type-is: 1.6.18 - utils-merge: 1.0.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - - extend-shallow@2.0.1: - dependencies: - is-extendable: 0.1.1 - - extend@3.0.2: {} - - extract-zip@2.0.1: - dependencies: - debug: 4.4.0 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.3 - transitivePeerDependencies: - - supports-color - optional: true - - fast-deep-equal@3.1.3: {} - - fast-fifo@1.3.2: {} - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - fast-json-stable-stringify@2.1.0: {} - - fastq@1.16.0: - dependencies: - reusify: 1.0.4 - - fault@2.0.1: - dependencies: - format: 0.2.2 - - faye-websocket@0.11.4: - dependencies: - websocket-driver: 0.7.4 - - fd-slicer@1.1.0: - dependencies: - pend: 1.2.0 - optional: true - - feed@4.2.2: - dependencies: - xml-js: 1.6.11 - - figures@3.2.0: - dependencies: - escape-string-regexp: 1.0.5 - - file-loader@6.2.0(webpack@5.97.1): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.97.1 - - fill-range@7.0.1: - dependencies: - to-regex-range: 5.0.1 - - finalhandler@1.2.0: - dependencies: - debug: 2.6.9 - encodeurl: 1.0.2 - escape-html: 1.0.3 - on-finished: 2.4.1 - parseurl: 1.3.3 - statuses: 2.0.1 - unpipe: 1.0.0 - transitivePeerDependencies: - - supports-color - - find-cache-dir@4.0.0: - dependencies: - common-path-prefix: 3.0.0 - pkg-dir: 7.0.0 - - find-up@6.3.0: - dependencies: - locate-path: 7.2.0 - path-exists: 5.0.0 - - flat@5.0.2: {} - - follow-redirects@1.15.6: {} - - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - form-data-encoder@2.1.4: {} - - format@0.2.2: {} - - forwarded@0.2.0: {} - - fraction.js@4.3.7: {} - - fresh@0.5.2: {} - - fs-constants@1.0.0: {} - - fs-extra@11.2.0: - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.1 - - fs-monkey@1.0.5: {} - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - gensync@1.0.0-beta.2: {} - - get-caller-file@2.0.5: - optional: true - - get-intrinsic@1.2.2: - dependencies: - function-bind: 1.1.2 - has-proto: 1.0.1 - has-symbols: 1.0.3 - hasown: 2.0.0 - - get-own-enumerable-property-symbols@3.0.2: {} - - get-stream@5.2.0: - dependencies: - pump: 3.0.0 - optional: true - - get-stream@6.0.1: {} - - get-uri@6.0.4: - dependencies: - basic-ftp: 5.0.5 - data-uri-to-buffer: 6.0.2 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - optional: true - - github-from-package@0.0.0: {} - - github-slugger@1.5.0: {} - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob-to-regexp@0.4.1: {} - - glob@10.3.10: - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - global-dirs@3.0.1: - dependencies: - ini: 2.0.0 - - globals@11.12.0: {} - - globals@15.14.0: {} - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 3.0.0 - - globby@13.2.2: - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.0 - merge2: 1.4.1 - slash: 4.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.2 - - got@12.6.1: - dependencies: - '@sindresorhus/is': 5.6.0 - '@szmarczak/http-timer': 5.0.1 - cacheable-lookup: 7.0.0 - cacheable-request: 10.2.14 - decompress-response: 6.0.0 - form-data-encoder: 2.1.4 - get-stream: 6.0.1 - http2-wrapper: 2.2.1 - lowercase-keys: 3.0.0 - p-cancelable: 3.0.0 - responselike: 3.0.0 - - graceful-fs@4.2.10: {} - - graceful-fs@4.2.11: {} - - gray-matter@4.0.3: - dependencies: - js-yaml: 3.14.1 - kind-of: 6.0.3 - section-matter: 1.0.0 - strip-bom-string: 1.0.0 - - gzip-size@6.0.0: - dependencies: - duplexer: 0.1.2 - - hachure-fill@0.5.2: {} - - handle-thing@2.0.1: {} - - has-flag@3.0.0: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.1: - dependencies: - get-intrinsic: 1.2.2 - - has-proto@1.0.1: {} - - has-symbols@1.0.3: {} - - has-yarn@3.0.0: {} - - hasown@2.0.0: - dependencies: - function-bind: 1.1.2 - - hast-util-from-html@1.0.2: - dependencies: - '@types/hast': 2.3.9 - hast-util-from-parse5: 7.1.2 - parse5: 7.1.2 - vfile: 5.3.7 - vfile-message: 3.1.4 - optional: true - - hast-util-from-parse5@7.1.2: - dependencies: - '@types/hast': 2.3.9 - '@types/unist': 2.0.10 - hastscript: 7.2.0 - property-information: 6.4.0 - vfile: 5.3.7 - vfile-location: 4.1.0 - web-namespaces: 2.0.1 - optional: true - - hast-util-from-parse5@8.0.1: - dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - devlop: 1.1.0 - hastscript: 8.0.0 - property-information: 6.4.0 - vfile: 6.0.1 - vfile-location: 5.0.2 - web-namespaces: 2.0.1 - - hast-util-parse-selector@3.1.1: - dependencies: - '@types/hast': 2.3.9 - optional: true - - hast-util-parse-selector@4.0.0: - dependencies: - '@types/hast': 3.0.3 - - hast-util-raw@9.0.1: - dependencies: - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - '@ungap/structured-clone': 1.2.0 - hast-util-from-parse5: 8.0.1 - hast-util-to-parse5: 8.0.0 - html-void-elements: 3.0.0 - mdast-util-to-hast: 13.1.0 - parse5: 7.1.2 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-to-estree@2.3.3: - dependencies: - '@types/estree': 1.0.5 - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 - '@types/unist': 2.0.10 - comma-separated-tokens: 2.0.3 - estree-util-attach-comments: 2.1.1 - estree-util-is-identifier-name: 2.1.0 - hast-util-whitespace: 2.0.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdxjs-esm: 1.3.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 4.0.4 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - optional: true - - hast-util-to-estree@3.1.0: - dependencies: - '@types/estree': 1.0.6 - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-attach-comments: 3.0.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.0.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - style-to-object: 0.4.4 - unist-util-position: 5.0.0 - zwitch: 2.0.4 - transitivePeerDependencies: - - supports-color - - hast-util-to-jsx-runtime@2.3.0: - dependencies: - '@types/estree': 1.0.6 - '@types/hast': 3.0.3 - '@types/unist': 3.0.2 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - hast-util-whitespace: 3.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.0.0 - mdast-util-mdxjs-esm: 2.0.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - style-to-object: 1.0.5 - unist-util-position: 5.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - - hast-util-to-parse5@8.0.0: - dependencies: - '@types/hast': 3.0.3 - comma-separated-tokens: 2.0.3 - devlop: 1.1.0 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - web-namespaces: 2.0.1 - zwitch: 2.0.4 - - hast-util-whitespace@2.0.1: - optional: true - - hast-util-whitespace@3.0.0: - dependencies: - '@types/hast': 3.0.3 - - hastscript@7.2.0: - dependencies: - '@types/hast': 2.3.9 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 3.1.1 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - optional: true - - hastscript@8.0.0: - dependencies: - '@types/hast': 3.0.3 - comma-separated-tokens: 2.0.3 - hast-util-parse-selector: 4.0.0 - property-information: 6.4.0 - space-separated-tokens: 2.0.2 - - he@1.2.0: {} - - history@4.10.1: - dependencies: - '@babel/runtime': 7.26.0 - loose-envify: 1.4.0 - resolve-pathname: 3.0.0 - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - value-equal: 1.0.1 - - hoist-non-react-statics@3.3.2: - dependencies: - react-is: 16.13.1 - - hpack.js@2.1.6: - dependencies: - inherits: 2.0.4 - obuf: 1.1.2 - readable-stream: 2.3.8 - wbuf: 1.7.3 - - html-entities@2.4.0: {} - - html-escaper@2.0.2: {} - - html-minifier-terser@6.1.0: - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.3 - commander: 8.3.0 - he: 1.2.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.26.0 - - html-minifier-terser@7.2.0: - dependencies: - camel-case: 4.1.2 - clean-css: 5.3.3 - commander: 10.0.1 - entities: 4.5.0 - param-case: 3.0.4 - relateurl: 0.2.7 - terser: 5.26.0 - - html-tags@3.3.1: {} - - html-void-elements@3.0.0: {} - - html-webpack-plugin@5.6.0(webpack@5.97.1): - dependencies: - '@types/html-minifier-terser': 6.1.0 - html-minifier-terser: 6.1.0 - lodash: 4.17.21 - pretty-error: 4.0.0 - tapable: 2.2.1 - optionalDependencies: - webpack: 5.97.1 - - htmlparser2@6.1.0: - dependencies: - domelementtype: 2.3.0 - domhandler: 4.3.1 - domutils: 2.8.0 - entities: 2.2.0 - - htmlparser2@8.0.2: - dependencies: - domelementtype: 2.3.0 - domhandler: 5.0.3 - domutils: 3.1.0 - entities: 4.5.0 - - http-cache-semantics@4.1.1: {} - - http-deceiver@1.2.7: {} - - http-errors@1.6.3: - dependencies: - depd: 1.1.2 - inherits: 2.0.3 - setprototypeof: 1.1.0 - statuses: 1.5.0 - - http-errors@2.0.0: - dependencies: - depd: 2.0.0 - inherits: 2.0.4 - setprototypeof: 1.2.0 - statuses: 2.0.1 - toidentifier: 1.0.1 - - http-parser-js@0.5.8: {} - - http-proxy-agent@7.0.2: - dependencies: - agent-base: 7.1.3 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - optional: true - - http-proxy-middleware@2.0.6(@types/express@4.17.21): - dependencies: - '@types/http-proxy': 1.17.14 - http-proxy: 1.18.1 - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.5 - optionalDependencies: - '@types/express': 4.17.21 - transitivePeerDependencies: - - debug - - http-proxy@1.18.1: - dependencies: - eventemitter3: 4.0.7 - follow-redirects: 1.15.6 - requires-port: 1.0.0 - transitivePeerDependencies: - - debug - - http2-wrapper@2.2.1: - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - - https-proxy-agent@7.0.6: - dependencies: - agent-base: 7.1.3 - debug: 4.4.0 - transitivePeerDependencies: - - supports-color - optional: true - - human-signals@2.1.0: {} - - iconv-lite@0.4.24: - dependencies: - safer-buffer: 2.1.2 - - iconv-lite@0.6.3: - dependencies: - safer-buffer: 2.1.2 - - icss-utils@5.1.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - ieee754@1.2.1: {} - - ignore@5.3.0: {} - - image-size@2.0.2: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - import-lazy@4.0.0: {} - - imurmurhash@0.1.4: {} - - indent-string@4.0.0: {} - - infima@0.2.0-alpha.45: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.3: {} - - inherits@2.0.4: {} - - ini@1.3.8: {} - - ini@2.0.0: {} - - inline-style-parser@0.1.1: {} - - inline-style-parser@0.2.2: {} - - internmap@1.0.1: {} - - internmap@2.0.3: {} - - invariant@2.2.4: - dependencies: - loose-envify: 1.4.0 - - ip-address@9.0.5: - dependencies: - jsbn: 1.1.0 - sprintf-js: 1.1.3 - optional: true - - ipaddr.js@1.9.1: {} - - ipaddr.js@2.1.0: {} - - is-alphabetical@2.0.1: {} - - is-alphanumerical@2.0.1: - dependencies: - is-alphabetical: 2.0.1 - is-decimal: 2.0.1 - - is-arrayish@0.2.1: {} - - is-arrayish@0.3.2: {} - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.2.0 - - is-buffer@2.0.5: - optional: true - - is-ci@3.0.1: - dependencies: - ci-info: 3.9.0 - - is-core-module@2.13.1: - dependencies: - hasown: 2.0.0 - - is-decimal@2.0.1: {} - - is-docker@2.2.1: {} - - is-extendable@0.1.1: {} - - is-extglob@2.1.1: {} - - is-fullwidth-code-point@3.0.0: {} - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-hexadecimal@2.0.1: {} - - is-installed-globally@0.4.0: - dependencies: - global-dirs: 3.0.1 - is-path-inside: 3.0.3 - - is-npm@6.0.0: {} - - is-number@7.0.0: {} - - is-obj@1.0.1: {} - - is-obj@2.0.0: {} - - is-path-inside@3.0.3: {} - - is-plain-obj@3.0.0: {} - - is-plain-obj@4.1.0: {} - - is-plain-object@2.0.4: - dependencies: - isobject: 3.0.1 - - is-reference@3.0.2: - dependencies: - '@types/estree': 1.0.6 - - is-regexp@1.0.0: {} - - is-stream@2.0.1: {} - - is-typedarray@1.0.0: {} - - is-wsl@2.2.0: - dependencies: - is-docker: 2.2.1 - - is-yarn-global@0.4.1: {} - - isarray@0.0.1: {} - - isarray@1.0.0: {} - - isexe@2.0.0: {} - - isobject@3.0.1: {} - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jest-util@29.7.0: - dependencies: - '@jest/types': 29.6.3 - '@types/node': 20.11.0 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - - jest-worker@27.5.1: - dependencies: - '@types/node': 20.11.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jest-worker@29.7.0: - dependencies: - '@types/node': 20.11.0 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - - jiti@1.21.0: {} - - joi@17.11.0: - dependencies: - '@hapi/hoek': 9.3.0 - '@hapi/topo': 5.1.0 - '@sideway/address': 4.1.4 - '@sideway/formula': 3.0.1 - '@sideway/pinpoint': 2.0.0 - - js-tokens@4.0.0: {} - - js-yaml@3.14.1: - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - jsbn@1.1.0: - optional: true - - jsesc@0.5.0: {} - - jsesc@3.0.2: {} - - jsesc@3.1.0: {} - - json-buffer@3.0.1: {} - - json-parse-even-better-errors@2.3.1: {} - - json-schema-traverse@0.4.1: {} - - json-schema-traverse@1.0.0: {} - - json5@2.2.3: {} - - jsonfile@6.1.0: - dependencies: - universalify: 2.0.1 - optionalDependencies: - graceful-fs: 4.2.11 - - katex@0.16.10: - dependencies: - commander: 8.3.0 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - khroma@2.1.0: {} - - kind-of@6.0.3: {} - - kleur@3.0.3: {} - - kleur@4.1.5: - optional: true - - kolorist@1.8.0: {} - - langium@3.3.1: - dependencies: - chevrotain: 11.0.3 - chevrotain-allstar: 0.3.1(chevrotain@11.0.3) - vscode-languageserver: 9.0.1 - vscode-languageserver-textdocument: 1.0.12 - vscode-uri: 3.0.8 - - latest-version@7.0.0: - dependencies: - package-json: 8.1.1 - - launch-editor@2.6.1: - dependencies: - picocolors: 1.1.1 - shell-quote: 1.8.1 - - layout-base@1.0.2: {} - - layout-base@2.0.1: {} - - leven@3.1.0: {} - - lilconfig@3.1.1: {} - - lines-and-columns@1.2.4: {} - - loader-runner@4.3.0: {} - - loader-utils@2.0.4: - dependencies: - big.js: 5.2.2 - emojis-list: 3.0.0 - json5: 2.2.3 - - local-pkg@0.5.1: - dependencies: - mlly: 1.7.4 - pkg-types: 1.3.1 - - locate-path@7.2.0: - dependencies: - p-locate: 6.0.0 - - lodash-es@4.17.21: {} - - lodash.debounce@4.0.8: {} - - lodash.memoize@4.1.2: {} - - lodash.uniq@4.5.0: {} - - lodash@4.17.21: {} - - longest-streak@3.1.0: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lower-case@2.0.2: - dependencies: - tslib: 2.6.2 - - lowercase-keys@3.0.0: {} - - lru-cache@10.1.0: {} - - lru-cache@5.1.1: - dependencies: - yallist: 3.1.1 - - lru-cache@7.18.3: - optional: true - - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - - markdown-extensions@2.0.0: {} - - markdown-table@2.0.0: - dependencies: - repeat-string: 1.6.1 - - markdown-table@3.0.3: {} - - marked@15.0.8: {} - - mdast-util-directive@3.0.0: - dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.3 - unist-util-visit-parents: 6.0.1 - transitivePeerDependencies: - - supports-color - - mdast-util-find-and-replace@3.0.1: - dependencies: - '@types/mdast': 4.0.3 - escape-string-regexp: 5.0.0 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - mdast-util-from-markdown@1.3.1: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - decode-named-character-reference: 1.0.2 - mdast-util-to-string: 3.2.0 - micromark: 3.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-decode-string: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-stringify-position: 3.0.3 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - optional: true - - mdast-util-from-markdown@2.0.0: - dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - mdast-util-to-string: 4.0.0 - micromark: 4.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-decode-string: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-stringify-position: 4.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-frontmatter@2.0.1: - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - escape-string-regexp: 5.0.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-extension-frontmatter: 2.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-autolink-literal@2.0.0: - dependencies: - '@types/mdast': 4.0.3 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-find-and-replace: 3.0.1 - micromark-util-character: 2.0.1 - - mdast-util-gfm-footnote@2.0.0: - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - micromark-util-normalize-identifier: 2.0.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-strikethrough@2.0.0: - dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-table@2.0.0: - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - markdown-table: 3.0.3 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm-task-list-item@2.0.0: - dependencies: - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-gfm@3.0.0: - dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-gfm-autolink-literal: 2.0.0 - mdast-util-gfm-footnote: 2.0.0 - mdast-util-gfm-strikethrough: 2.0.0 - mdast-util-gfm-table: 2.0.0 - mdast-util-gfm-task-list-item: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-expression@1.3.2: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - optional: true - - mdast-util-mdx-expression@2.0.0: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx-jsx@2.1.4: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - ccount: 2.0.1 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.3 - unist-util-remove-position: 4.0.2 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - transitivePeerDependencies: - - supports-color - optional: true - - mdast-util-mdx-jsx@3.0.0: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - ccount: 2.0.1 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - parse-entities: 4.0.1 - stringify-entities: 4.0.3 - unist-util-remove-position: 5.0.0 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - transitivePeerDependencies: - - supports-color - - mdast-util-mdx@2.0.1: - dependencies: - mdast-util-from-markdown: 1.3.1 - mdast-util-mdx-expression: 1.3.2 - mdast-util-mdx-jsx: 2.1.4 - mdast-util-mdxjs-esm: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - optional: true - - mdast-util-mdx@3.0.0: - dependencies: - mdast-util-from-markdown: 2.0.0 - mdast-util-mdx-expression: 2.0.0 - mdast-util-mdx-jsx: 3.0.0 - mdast-util-mdxjs-esm: 2.0.1 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-mdxjs-esm@1.3.1: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 2.3.9 - '@types/mdast': 3.0.15 - mdast-util-from-markdown: 1.3.1 - mdast-util-to-markdown: 1.5.0 - transitivePeerDependencies: - - supports-color - optional: true - - mdast-util-mdxjs-esm@2.0.1: - dependencies: - '@types/estree-jsx': 1.0.3 - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - devlop: 1.1.0 - mdast-util-from-markdown: 2.0.0 - mdast-util-to-markdown: 2.1.0 - transitivePeerDependencies: - - supports-color - - mdast-util-phrasing@3.0.1: - dependencies: - '@types/mdast': 3.0.15 - unist-util-is: 5.2.1 - optional: true - - mdast-util-phrasing@4.0.0: - dependencies: - '@types/mdast': 4.0.3 - unist-util-is: 6.0.0 - - mdast-util-to-hast@13.1.0: - dependencies: - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - '@ungap/structured-clone': 1.2.0 - devlop: 1.1.0 - micromark-util-sanitize-uri: 2.0.0 - trim-lines: 3.0.1 - unist-util-position: 5.0.0 - unist-util-visit: 5.0.0 - vfile: 6.0.1 - - mdast-util-to-markdown@1.5.0: - dependencies: - '@types/mdast': 3.0.15 - '@types/unist': 2.0.10 - longest-streak: 3.1.0 - mdast-util-phrasing: 3.0.1 - mdast-util-to-string: 3.2.0 - micromark-util-decode-string: 1.1.0 - unist-util-visit: 4.1.2 - zwitch: 2.0.4 - optional: true - - mdast-util-to-markdown@2.1.0: - dependencies: - '@types/mdast': 4.0.3 - '@types/unist': 3.0.2 - longest-streak: 3.1.0 - mdast-util-phrasing: 4.0.0 - mdast-util-to-string: 4.0.0 - micromark-util-decode-string: 2.0.0 - unist-util-visit: 5.0.0 - zwitch: 2.0.4 - - mdast-util-to-string@3.2.0: - dependencies: - '@types/mdast': 3.0.15 - optional: true - - mdast-util-to-string@4.0.0: - dependencies: - '@types/mdast': 4.0.3 - - mdn-data@2.0.28: {} - - mdn-data@2.0.30: {} - - mdx-mermaid@2.0.3(mermaid@11.8.1)(react@19.1.0)(typescript@5.7.3)(unist-util-visit@5.0.0): - dependencies: - mermaid: 11.8.1 - react: 19.1.0 - unist-util-visit: 5.0.0 - optionalDependencies: - estree-util-to-js: 1.2.0 - estree-util-visit: 1.2.1 - hast-util-from-html: 1.0.2 - hast-util-to-estree: 2.3.3 - mdast-util-from-markdown: 1.3.1 - mdast-util-mdx: 2.0.1 - micromark-extension-mdxjs: 1.0.1 - puppeteer: 22.15.0(typescript@5.7.3) - transitivePeerDependencies: - - bare-buffer - - bufferutil - - supports-color - - typescript - - utf-8-validate - - media-typer@0.3.0: {} - - memfs@3.5.3: - dependencies: - fs-monkey: 1.0.5 - - merge-descriptors@1.0.1: {} - - merge-stream@2.0.0: {} - - merge2@1.4.1: {} - - mermaid@11.8.1: - dependencies: - '@braintree/sanitize-url': 7.1.1 - '@iconify/utils': 2.2.1 - '@mermaid-js/parser': 0.6.1 - '@types/d3': 7.4.3 - cytoscape: 3.31.0 - cytoscape-cose-bilkent: 4.1.0(cytoscape@3.31.0) - cytoscape-fcose: 2.2.0(cytoscape@3.31.0) - d3: 7.9.0 - d3-sankey: 0.12.3 - dagre-d3-es: 7.0.11 - dayjs: 1.11.13 - dompurify: 3.2.5 - katex: 0.16.10 - khroma: 2.1.0 - lodash-es: 4.17.21 - marked: 15.0.8 - roughjs: 4.6.6 - stylis: 4.3.6 - ts-dedent: 2.2.0 - uuid: 11.1.0 - transitivePeerDependencies: - - supports-color - - methods@1.1.2: {} - - micromark-core-commonmark@1.1.0: - dependencies: - decode-named-character-reference: 1.0.2 - micromark-factory-destination: 1.1.0 - micromark-factory-label: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-factory-title: 1.1.0 - micromark-factory-whitespace: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-classify-character: 1.1.0 - micromark-util-html-tag-name: 1.2.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - optional: true - - micromark-core-commonmark@2.0.0: - dependencies: - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-factory-destination: 2.0.0 - micromark-factory-label: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-factory-title: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-html-tag-name: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-directive@3.0.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-factory-whitespace: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - parse-entities: 4.0.1 - - micromark-extension-frontmatter@2.0.0: - dependencies: - fault: 2.0.1 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-autolink-literal@2.0.0: - dependencies: - micromark-util-character: 2.0.1 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-footnote@2.0.0: - dependencies: - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-strikethrough@2.0.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-classify-character: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-table@2.0.0: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm-tagfilter@2.0.0: - dependencies: - micromark-util-types: 2.0.0 - - micromark-extension-gfm-task-list-item@2.0.1: - dependencies: - devlop: 1.1.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-gfm@3.0.0: - dependencies: - micromark-extension-gfm-autolink-literal: 2.0.0 - micromark-extension-gfm-footnote: 2.0.0 - micromark-extension-gfm-strikethrough: 2.0.0 - micromark-extension-gfm-table: 2.0.0 - micromark-extension-gfm-tagfilter: 2.0.0 - micromark-extension-gfm-task-list-item: 2.0.1 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-mdx-expression@1.0.8: - dependencies: - '@types/estree': 1.0.6 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - optional: true - - micromark-extension-mdx-expression@3.0.0: - dependencies: - '@types/estree': 1.0.6 - devlop: 1.1.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-extension-mdx-jsx@1.0.5: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 - estree-util-is-identifier-name: 2.1.0 - micromark-factory-mdx-expression: 1.0.9 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 - optional: true - - micromark-extension-mdx-jsx@3.0.0: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 - devlop: 1.1.0 - estree-util-is-identifier-name: 3.0.0 - micromark-factory-mdx-expression: 2.0.1 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 - - micromark-extension-mdx-md@1.0.1: - dependencies: - micromark-util-types: 1.1.0 - optional: true - - micromark-extension-mdx-md@2.0.0: - dependencies: - micromark-util-types: 2.0.0 - - micromark-extension-mdxjs-esm@1.0.5: - dependencies: - '@types/estree': 1.0.6 - micromark-core-commonmark: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - optional: true - - micromark-extension-mdxjs-esm@3.0.0: - dependencies: - '@types/estree': 1.0.6 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - - micromark-extension-mdxjs@1.0.1: - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - micromark-extension-mdx-expression: 1.0.8 - micromark-extension-mdx-jsx: 1.0.5 - micromark-extension-mdx-md: 1.0.1 - micromark-extension-mdxjs-esm: 1.0.5 - micromark-util-combine-extensions: 1.1.0 - micromark-util-types: 1.1.0 - optional: true - - micromark-extension-mdxjs@3.0.0: - dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) - micromark-extension-mdx-expression: 3.0.0 - micromark-extension-mdx-jsx: 3.0.0 - micromark-extension-mdx-md: 2.0.0 - micromark-extension-mdxjs-esm: 3.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-destination@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - optional: true - - micromark-factory-destination@2.0.0: - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-label@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - optional: true - - micromark-factory-label@2.0.0: - dependencies: - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-mdx-expression@1.0.9: - dependencies: - '@types/estree': 1.0.6 - micromark-util-character: 1.2.0 - micromark-util-events-to-acorn: 1.2.3 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - unist-util-position-from-estree: 1.1.2 - uvu: 0.5.6 - vfile-message: 3.1.4 - optional: true - - micromark-factory-mdx-expression@2.0.1: - dependencies: - '@types/estree': 1.0.6 - devlop: 1.1.0 - micromark-util-character: 2.0.1 - micromark-util-events-to-acorn: 2.0.2 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - unist-util-position-from-estree: 2.0.0 - vfile-message: 4.0.2 - - micromark-factory-space@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-types: 1.1.0 - - micromark-factory-space@2.0.0: - dependencies: - micromark-util-character: 2.0.1 - micromark-util-types: 2.0.0 - - micromark-factory-title@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - optional: true - - micromark-factory-title@2.0.0: - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-factory-whitespace@1.1.0: - dependencies: - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - optional: true - - micromark-factory-whitespace@2.0.0: - dependencies: - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-character@1.2.0: - dependencies: - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - - micromark-util-character@2.0.1: - dependencies: - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-chunked@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - optional: true - - micromark-util-chunked@2.0.0: - dependencies: - micromark-util-symbol: 2.0.0 - - micromark-util-classify-character@1.1.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - optional: true - - micromark-util-classify-character@2.0.0: - dependencies: - micromark-util-character: 2.0.1 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-combine-extensions@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-types: 1.1.0 - optional: true - - micromark-util-combine-extensions@2.0.0: - dependencies: - micromark-util-chunked: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-decode-numeric-character-reference@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - optional: true - - micromark-util-decode-numeric-character-reference@2.0.1: - dependencies: - micromark-util-symbol: 2.0.0 - - micromark-util-decode-string@1.1.0: - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 1.2.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-symbol: 1.1.0 - optional: true - - micromark-util-decode-string@2.0.0: - dependencies: - decode-named-character-reference: 1.0.2 - micromark-util-character: 2.0.1 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-symbol: 2.0.0 - - micromark-util-encode@1.1.0: - optional: true - - micromark-util-encode@2.0.0: {} - - micromark-util-events-to-acorn@1.2.3: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 - '@types/unist': 2.0.10 - estree-util-visit: 1.2.1 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - vfile-message: 3.1.4 - optional: true - - micromark-util-events-to-acorn@2.0.2: - dependencies: - '@types/acorn': 4.0.6 - '@types/estree': 1.0.6 - '@types/unist': 3.0.2 - devlop: 1.1.0 - estree-util-visit: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - vfile-message: 4.0.2 - - micromark-util-html-tag-name@1.2.0: - optional: true - - micromark-util-html-tag-name@2.0.0: {} - - micromark-util-normalize-identifier@1.1.0: - dependencies: - micromark-util-symbol: 1.1.0 - optional: true - - micromark-util-normalize-identifier@2.0.0: - dependencies: - micromark-util-symbol: 2.0.0 - - micromark-util-resolve-all@1.1.0: - dependencies: - micromark-util-types: 1.1.0 - optional: true - - micromark-util-resolve-all@2.0.0: - dependencies: - micromark-util-types: 2.0.0 - - micromark-util-sanitize-uri@1.2.0: - dependencies: - micromark-util-character: 1.2.0 - micromark-util-encode: 1.1.0 - micromark-util-symbol: 1.1.0 - optional: true - - micromark-util-sanitize-uri@2.0.0: - dependencies: - micromark-util-character: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-symbol: 2.0.0 - - micromark-util-subtokenize@1.1.0: - dependencies: - micromark-util-chunked: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - optional: true - - micromark-util-subtokenize@2.0.0: - dependencies: - devlop: 1.1.0 - micromark-util-chunked: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - - micromark-util-symbol@1.1.0: {} - - micromark-util-symbol@2.0.0: {} - - micromark-util-types@1.1.0: {} - - micromark-util-types@2.0.0: {} - - micromark@3.2.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.0 - decode-named-character-reference: 1.0.2 - micromark-core-commonmark: 1.1.0 - micromark-factory-space: 1.1.0 - micromark-util-character: 1.2.0 - micromark-util-chunked: 1.1.0 - micromark-util-combine-extensions: 1.1.0 - micromark-util-decode-numeric-character-reference: 1.1.0 - micromark-util-encode: 1.1.0 - micromark-util-normalize-identifier: 1.1.0 - micromark-util-resolve-all: 1.1.0 - micromark-util-sanitize-uri: 1.2.0 - micromark-util-subtokenize: 1.1.0 - micromark-util-symbol: 1.1.0 - micromark-util-types: 1.1.0 - uvu: 0.5.6 - transitivePeerDependencies: - - supports-color - optional: true - - micromark@4.0.0: - dependencies: - '@types/debug': 4.1.12 - debug: 4.4.0 - decode-named-character-reference: 1.0.2 - devlop: 1.1.0 - micromark-core-commonmark: 2.0.0 - micromark-factory-space: 2.0.0 - micromark-util-character: 2.0.1 - micromark-util-chunked: 2.0.0 - micromark-util-combine-extensions: 2.0.0 - micromark-util-decode-numeric-character-reference: 2.0.1 - micromark-util-encode: 2.0.0 - micromark-util-normalize-identifier: 2.0.0 - micromark-util-resolve-all: 2.0.0 - micromark-util-sanitize-uri: 2.0.0 - micromark-util-subtokenize: 2.0.0 - micromark-util-symbol: 2.0.0 - micromark-util-types: 2.0.0 - transitivePeerDependencies: - - supports-color - - micromatch@4.0.5: - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - mime-db@1.33.0: {} - - mime-db@1.52.0: {} - - mime-types@2.1.18: - dependencies: - mime-db: 1.33.0 - - mime-types@2.1.35: - dependencies: - mime-db: 1.52.0 - - mime@1.6.0: {} - - mimic-fn@2.1.0: {} - - mimic-response@3.1.0: {} - - mimic-response@4.0.0: {} - - mini-css-extract-plugin@2.9.2(webpack@5.97.1): - dependencies: - schema-utils: 4.2.0 - tapable: 2.2.1 - webpack: 5.97.1 - - minimalistic-assert@1.0.1: {} - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - minipass@7.0.4: {} - - mitt@3.0.1: - optional: true - - mkdirp-classic@0.5.3: {} - - mlly@1.7.4: - dependencies: - acorn: 8.14.0 - pathe: 2.0.2 - pkg-types: 1.3.1 - ufo: 1.5.4 - - mri@1.2.0: - optional: true - - mrmime@2.0.0: {} - - ms@2.0.0: {} - - ms@2.1.3: {} - - multicast-dns@7.2.5: - dependencies: - dns-packet: 5.6.1 - thunky: 1.1.0 - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.11: {} - - napi-build-utils@1.0.2: {} - - negotiator@0.6.3: {} - - neo-async@2.6.2: {} - - netmask@2.0.2: - optional: true - - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.6.2 - - node-abi@3.54.0: - dependencies: - semver: 7.6.3 - - node-addon-api@6.1.0: {} - - node-emoji@2.1.3: - dependencies: - '@sindresorhus/is': 4.6.0 - char-regex: 1.0.2 - emojilib: 2.4.0 - skin-tone: 2.0.0 - - node-forge@1.3.1: {} - - node-releases@2.0.19: {} - - normalize-path@3.0.0: {} - - normalize-range@0.1.2: {} - - normalize-url@8.0.0: {} - - npm-run-path@4.0.1: - dependencies: - path-key: 3.1.1 - - npm-to-yarn@3.0.1: {} - - nprogress@0.2.0: {} - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - null-loader@4.0.1(webpack@5.97.1): - dependencies: - loader-utils: 2.0.4 - schema-utils: 3.3.0 - webpack: 5.97.1 - - object-assign@4.1.1: {} - - object-inspect@1.13.1: {} - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.5 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - obuf@1.1.2: {} - - on-finished@2.4.1: - dependencies: - ee-first: 1.1.1 - - on-headers@1.0.2: {} - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - onetime@5.1.2: - dependencies: - mimic-fn: 2.1.0 - - open@8.4.2: - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - opener@1.5.2: {} - - os-homedir@1.0.2: {} - - p-cancelable@3.0.0: {} - - p-finally@1.0.0: {} - - p-limit@4.0.0: - dependencies: - yocto-queue: 1.0.0 - - p-locate@6.0.0: - dependencies: - p-limit: 4.0.0 - - p-map@4.0.0: - dependencies: - aggregate-error: 3.1.0 - - p-queue@6.6.2: - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - - p-retry@4.6.2: - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - - p-timeout@3.2.0: - dependencies: - p-finally: 1.0.0 - - pac-proxy-agent@7.1.0: - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.3 - debug: 4.4.0 - get-uri: 6.0.4 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - pac-resolver: 7.0.1 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - optional: true - - pac-resolver@7.0.1: - dependencies: - degenerator: 5.0.1 - netmask: 2.0.2 - optional: true - - package-json@8.1.1: - dependencies: - got: 12.6.1 - registry-auth-token: 5.0.2 - registry-url: 6.0.1 - semver: 7.6.3 - - package-manager-detector@0.2.8: {} - - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - parse-entities@4.0.1: - dependencies: - '@types/unist': 2.0.10 - character-entities: 2.0.2 - character-entities-legacy: 3.0.0 - character-reference-invalid: 2.0.1 - decode-named-character-reference: 1.0.2 - is-alphanumerical: 2.0.1 - is-decimal: 2.0.1 - is-hexadecimal: 2.0.1 - - parse-json@5.2.0: - dependencies: - '@babel/code-frame': 7.26.2 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - parse-numeric-range@1.3.0: {} - - parse5-htmlparser2-tree-adapter@7.0.0: - dependencies: - domhandler: 5.0.3 - parse5: 7.1.2 - - parse5@7.1.2: - dependencies: - entities: 4.5.0 - - parseurl@1.3.3: {} - - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.6.2 - - path-data-parser@0.1.0: {} - - path-exists@5.0.0: {} - - path-is-absolute@1.0.1: {} - - path-is-inside@1.0.2: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.10.1: - dependencies: - lru-cache: 10.1.0 - minipass: 7.0.4 - - path-to-regexp@0.1.7: {} - - path-to-regexp@1.8.0: - dependencies: - isarray: 0.0.1 - - path-to-regexp@3.3.0: {} - - path-type@4.0.0: {} - - pathe@2.0.2: {} - - pend@1.2.0: - optional: true - - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.2 - - picocolors@1.1.1: {} - - picomatch@2.3.1: {} - - pirates@4.0.6: {} - - pkg-dir@7.0.0: - dependencies: - find-up: 6.3.0 - - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.2 - - points-on-curve@0.2.0: {} - - points-on-path@0.2.1: - dependencies: - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 - - postcss-attribute-case-insensitive@7.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-calc@9.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 6.0.16 - postcss-value-parser: 4.2.0 - - postcss-clamp@4.1.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-color-functional-notation@7.0.10(postcss@8.5.4): - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - postcss-color-hex-alpha@10.0.0(postcss@8.5.4): - dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-color-rebeccapurple@10.0.0(postcss@8.5.4): - dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-colormin@6.1.0(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - caniuse-api: 3.0.0 - colord: 2.9.3 - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-convert-values@6.1.0(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-custom-media@11.0.6(postcss@8.5.4): - dependencies: - '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/media-query-list-parser': 4.0.3(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - postcss: 8.5.4 - - postcss-custom-properties@14.0.6(postcss@8.5.4): - dependencies: - '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-custom-selectors@8.0.5(postcss@8.5.4): - dependencies: - '@csstools/cascade-layer-name-parser': 2.0.5(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-dir-pseudo-class@9.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-discard-comments@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-discard-duplicates@6.0.3(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-discard-empty@6.0.3(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-discard-overridden@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-discard-unused@6.0.5(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 6.0.16 - - postcss-double-position-gradients@6.0.2(postcss@8.5.4): - dependencies: - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-focus-visible@10.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-focus-within@9.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-font-variant@5.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-gap-properties@6.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-image-set-function@7.0.0(postcss@8.5.4): - dependencies: - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-lab-function@7.0.10(postcss@8.5.4): - dependencies: - '@csstools/css-color-parser': 3.0.10(@csstools/css-parser-algorithms@3.0.5(@csstools/css-tokenizer@3.0.4))(@csstools/css-tokenizer@3.0.4) - '@csstools/css-parser-algorithms': 3.0.5(@csstools/css-tokenizer@3.0.4) - '@csstools/css-tokenizer': 3.0.4 - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/utilities': 2.0.0(postcss@8.5.4) - postcss: 8.5.4 - - postcss-loader@7.3.4(postcss@8.5.4)(typescript@5.7.3)(webpack@5.97.1): - dependencies: - cosmiconfig: 8.3.6(typescript@5.7.3) - jiti: 1.21.0 - postcss: 8.5.4 - semver: 7.6.3 - webpack: 5.97.1 - transitivePeerDependencies: - - typescript - - postcss-logical@8.1.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-merge-idents@6.0.3(postcss@8.5.4): - dependencies: - cssnano-utils: 4.0.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-merge-longhand@6.0.5(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - stylehacks: 6.1.1(postcss@8.5.4) - - postcss-merge-rules@6.1.1(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - caniuse-api: 3.0.0 - cssnano-utils: 4.0.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-selector-parser: 6.0.16 - - postcss-minify-font-values@6.1.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-minify-gradients@6.0.3(postcss@8.5.4): - dependencies: - colord: 2.9.3 - cssnano-utils: 4.0.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-minify-params@6.1.0(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - cssnano-utils: 4.0.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-minify-selectors@6.0.4(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 6.0.16 - - postcss-modules-extract-imports@3.1.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-modules-local-by-default@4.2.0(postcss@8.5.4): - dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - postcss-value-parser: 4.2.0 - - postcss-modules-scope@3.2.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-modules-values@4.0.0(postcss@8.5.4): - dependencies: - icss-utils: 5.1.0(postcss@8.5.4) - postcss: 8.5.4 - - postcss-nesting@13.0.1(postcss@8.5.4): - dependencies: - '@csstools/selector-resolve-nested': 3.0.0(postcss-selector-parser@7.0.0) - '@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0) - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-normalize-charset@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-normalize-display-values@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-normalize-positions@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-normalize-repeat-style@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-normalize-string@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-normalize-timing-functions@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-normalize-unicode@6.1.0(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-normalize-url@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-normalize-whitespace@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-opacity-percentage@3.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-ordered-values@6.0.2(postcss@8.5.4): - dependencies: - cssnano-utils: 4.0.2(postcss@8.5.4) - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-overflow-shorthand@6.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-page-break@3.0.4(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-place@10.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-preset-env@10.2.1(postcss@8.5.4): - dependencies: - '@csstools/postcss-cascade-layers': 5.0.1(postcss@8.5.4) - '@csstools/postcss-color-function': 4.0.10(postcss@8.5.4) - '@csstools/postcss-color-mix-function': 3.0.10(postcss@8.5.4) - '@csstools/postcss-color-mix-variadic-function-arguments': 1.0.0(postcss@8.5.4) - '@csstools/postcss-content-alt-text': 2.0.6(postcss@8.5.4) - '@csstools/postcss-exponential-functions': 2.0.9(postcss@8.5.4) - '@csstools/postcss-font-format-keywords': 4.0.0(postcss@8.5.4) - '@csstools/postcss-gamut-mapping': 2.0.10(postcss@8.5.4) - '@csstools/postcss-gradients-interpolation-method': 5.0.10(postcss@8.5.4) - '@csstools/postcss-hwb-function': 4.0.10(postcss@8.5.4) - '@csstools/postcss-ic-unit': 4.0.2(postcss@8.5.4) - '@csstools/postcss-initial': 2.0.1(postcss@8.5.4) - '@csstools/postcss-is-pseudo-class': 5.0.1(postcss@8.5.4) - '@csstools/postcss-light-dark-function': 2.0.9(postcss@8.5.4) - '@csstools/postcss-logical-float-and-clear': 3.0.0(postcss@8.5.4) - '@csstools/postcss-logical-overflow': 2.0.0(postcss@8.5.4) - '@csstools/postcss-logical-overscroll-behavior': 2.0.0(postcss@8.5.4) - '@csstools/postcss-logical-resize': 3.0.0(postcss@8.5.4) - '@csstools/postcss-logical-viewport-units': 3.0.4(postcss@8.5.4) - '@csstools/postcss-media-minmax': 2.0.9(postcss@8.5.4) - '@csstools/postcss-media-queries-aspect-ratio-number-values': 3.0.5(postcss@8.5.4) - '@csstools/postcss-nested-calc': 4.0.0(postcss@8.5.4) - '@csstools/postcss-normalize-display-values': 4.0.0(postcss@8.5.4) - '@csstools/postcss-oklab-function': 4.0.10(postcss@8.5.4) - '@csstools/postcss-progressive-custom-properties': 4.1.0(postcss@8.5.4) - '@csstools/postcss-random-function': 2.0.1(postcss@8.5.4) - '@csstools/postcss-relative-color-syntax': 3.0.10(postcss@8.5.4) - '@csstools/postcss-scope-pseudo-class': 4.0.1(postcss@8.5.4) - '@csstools/postcss-sign-functions': 1.1.4(postcss@8.5.4) - '@csstools/postcss-stepped-value-functions': 4.0.9(postcss@8.5.4) - '@csstools/postcss-text-decoration-shorthand': 4.0.2(postcss@8.5.4) - '@csstools/postcss-trigonometric-functions': 4.0.9(postcss@8.5.4) - '@csstools/postcss-unset-value': 4.0.0(postcss@8.5.4) - autoprefixer: 10.4.21(postcss@8.5.4) - browserslist: 4.25.0 - css-blank-pseudo: 7.0.1(postcss@8.5.4) - css-has-pseudo: 7.0.2(postcss@8.5.4) - css-prefers-color-scheme: 10.0.0(postcss@8.5.4) - cssdb: 8.3.0 - postcss: 8.5.4 - postcss-attribute-case-insensitive: 7.0.1(postcss@8.5.4) - postcss-clamp: 4.1.0(postcss@8.5.4) - postcss-color-functional-notation: 7.0.10(postcss@8.5.4) - postcss-color-hex-alpha: 10.0.0(postcss@8.5.4) - postcss-color-rebeccapurple: 10.0.0(postcss@8.5.4) - postcss-custom-media: 11.0.6(postcss@8.5.4) - postcss-custom-properties: 14.0.6(postcss@8.5.4) - postcss-custom-selectors: 8.0.5(postcss@8.5.4) - postcss-dir-pseudo-class: 9.0.1(postcss@8.5.4) - postcss-double-position-gradients: 6.0.2(postcss@8.5.4) - postcss-focus-visible: 10.0.1(postcss@8.5.4) - postcss-focus-within: 9.0.1(postcss@8.5.4) - postcss-font-variant: 5.0.0(postcss@8.5.4) - postcss-gap-properties: 6.0.0(postcss@8.5.4) - postcss-image-set-function: 7.0.0(postcss@8.5.4) - postcss-lab-function: 7.0.10(postcss@8.5.4) - postcss-logical: 8.1.0(postcss@8.5.4) - postcss-nesting: 13.0.1(postcss@8.5.4) - postcss-opacity-percentage: 3.0.0(postcss@8.5.4) - postcss-overflow-shorthand: 6.0.0(postcss@8.5.4) - postcss-page-break: 3.0.4(postcss@8.5.4) - postcss-place: 10.0.0(postcss@8.5.4) - postcss-pseudo-class-any-link: 10.0.1(postcss@8.5.4) - postcss-replace-overflow-wrap: 4.0.0(postcss@8.5.4) - postcss-selector-not: 8.0.1(postcss@8.5.4) - - postcss-pseudo-class-any-link@10.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-reduce-idents@6.0.3(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-reduce-initial@6.1.0(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - caniuse-api: 3.0.0 - postcss: 8.5.4 - - postcss-reduce-transforms@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - - postcss-replace-overflow-wrap@4.0.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss-selector-not@8.0.1(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 7.0.0 - - postcss-selector-parser@6.0.16: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-selector-parser@7.0.0: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-sort-media-queries@5.2.0(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - sort-css-media-queries: 2.2.0 - - postcss-svgo@6.0.3(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-value-parser: 4.2.0 - svgo: 3.2.0 - - postcss-unique-selectors@6.0.4(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - postcss-selector-parser: 6.0.16 - - postcss-value-parser@4.2.0: {} - - postcss-zindex@6.0.2(postcss@8.5.4): - dependencies: - postcss: 8.5.4 - - postcss@8.5.4: - dependencies: - nanoid: 3.3.11 - picocolors: 1.1.1 - source-map-js: 1.2.1 - - prebuild-install@7.1.1: - dependencies: - detect-libc: 2.0.2 - expand-template: 2.0.3 - github-from-package: 0.0.0 - minimist: 1.2.8 - mkdirp-classic: 0.5.3 - napi-build-utils: 1.0.2 - node-abi: 3.54.0 - pump: 3.0.0 - rc: 1.2.8 - simple-get: 4.0.1 - tar-fs: 2.1.1 - tunnel-agent: 0.6.0 - - pretty-error@4.0.0: - dependencies: - lodash: 4.17.21 - renderkid: 3.0.0 - - pretty-time@1.1.0: {} - - prism-react-renderer@2.4.1(react@19.1.0): - dependencies: - '@types/prismjs': 1.26.5 - clsx: 2.1.1 - react: 19.1.0 - - prismjs@1.29.0: {} - - process-nextick-args@2.0.1: {} - - progress@2.0.3: - optional: true - - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - property-information@6.4.0: {} - - proto-list@1.2.4: {} - - proxy-addr@2.0.7: - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - proxy-agent@6.5.0: - dependencies: - agent-base: 7.1.3 - debug: 4.4.0 - http-proxy-agent: 7.0.2 - https-proxy-agent: 7.0.6 - lru-cache: 7.18.3 - pac-proxy-agent: 7.1.0 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.5 - transitivePeerDependencies: - - supports-color - optional: true - - proxy-from-env@1.1.0: - optional: true - - pump@3.0.0: - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - punycode@2.3.1: {} - - pupa@3.1.0: - dependencies: - escape-goat: 4.0.0 - - puppeteer-core@22.15.0: - dependencies: - '@puppeteer/browsers': 2.3.0 - chromium-bidi: 0.6.3(devtools-protocol@0.0.1312386) - debug: 4.4.0 - devtools-protocol: 0.0.1312386 - ws: 8.18.0 - transitivePeerDependencies: - - bare-buffer - - bufferutil - - supports-color - - utf-8-validate - optional: true - - puppeteer@22.15.0(typescript@5.7.3): - dependencies: - '@puppeteer/browsers': 2.3.0 - cosmiconfig: 9.0.0(typescript@5.7.3) - devtools-protocol: 0.0.1312386 - puppeteer-core: 22.15.0 - transitivePeerDependencies: - - bare-buffer - - bufferutil - - supports-color - - typescript - - utf-8-validate - optional: true - - qs@6.11.0: - dependencies: - side-channel: 1.0.4 - - queue-microtask@1.2.3: {} - - queue-tick@1.0.1: {} - - quick-lru@5.1.1: {} - - randombytes@2.1.0: - dependencies: - safe-buffer: 5.2.1 - - range-parser@1.2.0: {} - - range-parser@1.2.1: {} - - raw-body@2.5.2: - dependencies: - bytes: 3.1.2 - http-errors: 2.0.0 - iconv-lite: 0.4.24 - unpipe: 1.0.0 - - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - - react-dom@19.1.0(react@19.1.0): - dependencies: - react: 19.1.0 - scheduler: 0.26.0 - - react-fast-compare@3.2.2: {} - - react-is@16.13.1: {} - - react-json-view-lite@2.4.1(react@19.1.0): - dependencies: - react: 19.1.0 - - react-live@4.1.6(react-dom@19.1.0(react@19.1.0))(react@19.1.0): - dependencies: - prism-react-renderer: 2.4.1(react@19.1.0) - react: 19.1.0 - react-dom: 19.1.0(react@19.1.0) - sucrase: 3.35.0 - use-editable: 2.3.3(react@19.1.0) - - react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@19.1.0))(webpack@5.97.1): - dependencies: - '@babel/runtime': 7.26.0 - react-loadable: '@docusaurus/react-loadable@6.0.0(react@19.1.0)' - webpack: 5.97.1 - - react-router-config@5.1.1(react-router@5.3.4(react@19.1.0))(react@19.1.0): - dependencies: - '@babel/runtime': 7.26.0 - react: 19.1.0 - react-router: 5.3.4(react@19.1.0) - - react-router-dom@5.3.4(react@19.1.0): - dependencies: - '@babel/runtime': 7.26.0 - history: 4.10.1 - loose-envify: 1.4.0 - prop-types: 15.8.1 - react: 19.1.0 - react-router: 5.3.4(react@19.1.0) - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - - react-router@5.3.4(react@19.1.0): - dependencies: - '@babel/runtime': 7.26.0 - history: 4.10.1 - hoist-non-react-statics: 3.3.2 - loose-envify: 1.4.0 - path-to-regexp: 1.8.0 - prop-types: 15.8.1 - react: 19.1.0 - react-is: 16.13.1 - tiny-invariant: 1.3.1 - tiny-warning: 1.0.3 - - react@19.1.0: {} - - readable-stream@2.3.8: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - regenerate-unicode-properties@10.2.0: - dependencies: - regenerate: 1.4.2 - - regenerate-unicode-properties@9.0.0: - dependencies: - regenerate: 1.4.2 - - regenerate@1.4.2: {} - - regenerator-runtime@0.14.1: {} - - regenerator-transform@0.15.2: - dependencies: - '@babel/runtime': 7.26.0 - - regexpu-core@4.8.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 9.0.0 - regjsgen: 0.5.2 - regjsparser: 0.7.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - - regexpu-core@6.2.0: - dependencies: - regenerate: 1.4.2 - regenerate-unicode-properties: 10.2.0 - regjsgen: 0.8.0 - regjsparser: 0.12.0 - unicode-match-property-ecmascript: 2.0.0 - unicode-match-property-value-ecmascript: 2.1.0 - - registry-auth-token@5.0.2: - dependencies: - '@pnpm/npm-conf': 2.2.2 - - registry-url@6.0.1: - dependencies: - rc: 1.2.8 - - regjsgen@0.5.2: {} - - regjsgen@0.8.0: {} - - regjsparser@0.12.0: - dependencies: - jsesc: 3.0.2 - - regjsparser@0.7.0: - dependencies: - jsesc: 0.5.0 - - rehype-raw@7.0.0: - dependencies: - '@types/hast': 3.0.3 - hast-util-raw: 9.0.1 - vfile: 6.0.1 - - relateurl@0.2.7: {} - - remark-directive@3.0.0: - dependencies: - '@types/mdast': 4.0.3 - mdast-util-directive: 3.0.0 - micromark-extension-directive: 3.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - - remark-emoji@4.0.1: - dependencies: - '@types/mdast': 4.0.3 - emoticon: 4.0.1 - mdast-util-find-and-replace: 3.0.1 - node-emoji: 2.1.3 - unified: 11.0.4 - - remark-frontmatter@5.0.0: - dependencies: - '@types/mdast': 4.0.3 - mdast-util-frontmatter: 2.0.1 - micromark-extension-frontmatter: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - - remark-gfm@4.0.0: - dependencies: - '@types/mdast': 4.0.3 - mdast-util-gfm: 3.0.0 - micromark-extension-gfm: 3.0.0 - remark-parse: 11.0.0 - remark-stringify: 11.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - - remark-mdx@3.0.0: - dependencies: - mdast-util-mdx: 3.0.0 - micromark-extension-mdxjs: 3.0.0 - transitivePeerDependencies: - - supports-color - - remark-parse@11.0.0: - dependencies: - '@types/mdast': 4.0.3 - mdast-util-from-markdown: 2.0.0 - micromark-util-types: 2.0.0 - unified: 11.0.4 - transitivePeerDependencies: - - supports-color - - remark-rehype@11.1.0: - dependencies: - '@types/hast': 3.0.3 - '@types/mdast': 4.0.3 - mdast-util-to-hast: 13.1.0 - unified: 11.0.4 - vfile: 6.0.1 - - remark-stringify@11.0.0: - dependencies: - '@types/mdast': 4.0.3 - mdast-util-to-markdown: 2.1.0 - unified: 11.0.4 - - renderkid@3.0.0: - dependencies: - css-select: 4.3.0 - dom-converter: 0.2.0 - htmlparser2: 6.1.0 - lodash: 4.17.21 - strip-ansi: 6.0.1 - - repeat-string@1.6.1: {} - - require-directory@2.1.1: - optional: true - - require-from-string@2.0.2: {} - - require-like@0.1.2: {} - - requires-port@1.0.0: {} - - resolve-alpn@1.2.1: {} - - resolve-from@4.0.0: {} - - resolve-pathname@3.0.0: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.13.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - responselike@3.0.0: - dependencies: - lowercase-keys: 3.0.0 - - retry@0.13.1: {} - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - robust-predicates@3.0.2: {} - - roughjs@4.6.6: - dependencies: - hachure-fill: 0.5.2 - path-data-parser: 0.1.0 - points-on-curve: 0.2.0 - points-on-path: 0.2.1 - - rtlcss@4.1.1: - dependencies: - escalade: 3.2.0 - picocolors: 1.1.1 - postcss: 8.5.4 - strip-json-comments: 3.1.1 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - rw@1.3.3: {} - - sade@1.8.1: - dependencies: - mri: 1.2.0 - optional: true - - safe-buffer@5.1.2: {} - - safe-buffer@5.2.1: {} - - safer-buffer@2.1.2: {} - - sax@1.3.0: {} - - scheduler@0.26.0: {} - - schema-dts@1.1.5: {} - - schema-utils@3.3.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 6.12.6 - ajv-keywords: 3.5.2(ajv@6.12.6) - - schema-utils@4.2.0: - dependencies: - '@types/json-schema': 7.0.15 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - ajv-keywords: 5.1.0(ajv@8.12.0) - - search-insights@2.17.3: {} - - section-matter@1.0.0: - dependencies: - extend-shallow: 2.0.1 - kind-of: 6.0.3 - - select-hose@2.0.0: {} - - selfsigned@2.4.1: - dependencies: - '@types/node-forge': 1.3.11 - node-forge: 1.3.1 - - semver-diff@4.0.0: - dependencies: - semver: 7.6.3 - - semver@6.3.1: {} - - semver@7.6.3: {} - - send@0.18.0: - dependencies: - debug: 2.6.9 - depd: 2.0.0 - destroy: 1.2.0 - encodeurl: 1.0.2 - escape-html: 1.0.3 - etag: 1.8.1 - fresh: 0.5.2 - http-errors: 2.0.0 - mime: 1.6.0 - ms: 2.1.3 - on-finished: 2.4.1 - range-parser: 1.2.1 - statuses: 2.0.1 - transitivePeerDependencies: - - supports-color - - serialize-javascript@6.0.2: - dependencies: - randombytes: 2.1.0 - - serve-handler@6.1.6: - dependencies: - bytes: 3.0.0 - content-disposition: 0.5.2 - mime-types: 2.1.18 - minimatch: 3.1.2 - path-is-inside: 1.0.2 - path-to-regexp: 3.3.0 - range-parser: 1.2.0 - - serve-index@1.9.1: - dependencies: - accepts: 1.3.8 - batch: 0.6.1 - debug: 2.6.9 - escape-html: 1.0.3 - http-errors: 1.6.3 - mime-types: 2.1.35 - parseurl: 1.3.3 - transitivePeerDependencies: - - supports-color - - serve-static@1.15.0: - dependencies: - encodeurl: 1.0.2 - escape-html: 1.0.3 - parseurl: 1.3.3 - send: 0.18.0 - transitivePeerDependencies: - - supports-color - - set-function-length@1.1.1: - dependencies: - define-data-property: 1.1.1 - get-intrinsic: 1.2.2 - gopd: 1.0.1 - has-property-descriptors: 1.0.1 - - setprototypeof@1.1.0: {} - - setprototypeof@1.2.0: {} - - shallow-clone@3.0.1: - dependencies: - kind-of: 6.0.3 - - shallowequal@1.1.0: {} - - sharp@0.32.6: - dependencies: - color: 4.2.3 - detect-libc: 2.0.2 - node-addon-api: 6.1.0 - prebuild-install: 7.1.1 - semver: 7.6.3 - simple-get: 4.0.1 - tar-fs: 3.0.8 - tunnel-agent: 0.6.0 - transitivePeerDependencies: - - bare-buffer - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - shell-quote@1.8.1: {} - - side-channel@1.0.4: - dependencies: - call-bind: 1.0.5 - get-intrinsic: 1.2.2 - object-inspect: 1.13.1 - - signal-exit@3.0.7: {} - - signal-exit@4.1.0: {} - - simple-concat@1.0.1: {} - - simple-get@4.0.1: - dependencies: - decompress-response: 6.0.0 - once: 1.4.0 - simple-concat: 1.0.1 - - simple-swizzle@0.2.2: - dependencies: - is-arrayish: 0.3.2 - - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.24 - mrmime: 2.0.0 - totalist: 3.0.1 - - sisteransi@1.0.5: {} - - sitemap@7.1.1: - dependencies: - '@types/node': 17.0.45 - '@types/sax': 1.2.7 - arg: 5.0.2 - sax: 1.3.0 - - skin-tone@2.0.0: - dependencies: - unicode-emoji-modifier-base: 1.0.0 - - slash@3.0.0: {} - - slash@4.0.0: {} - - smart-buffer@4.2.0: - optional: true - - snake-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.2 - - sockjs@0.3.24: - dependencies: - faye-websocket: 0.11.4 - uuid: 8.3.2 - websocket-driver: 0.7.4 - - socks-proxy-agent@8.0.5: - dependencies: - agent-base: 7.1.3 - debug: 4.4.0 - socks: 2.8.3 - transitivePeerDependencies: - - supports-color - optional: true - - socks@2.8.3: - dependencies: - ip-address: 9.0.5 - smart-buffer: 4.2.0 - optional: true - - sort-css-media-queries@2.2.0: {} - - source-map-js@1.2.0: {} - - source-map-js@1.2.1: {} - - source-map-support@0.5.21: - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - - source-map@0.6.1: {} - - source-map@0.7.4: {} - - sourcemap-codec@1.4.8: {} - - space-separated-tokens@2.0.2: {} - - spdy-transport@3.0.0: - dependencies: - debug: 4.4.0 - detect-node: 2.1.0 - hpack.js: 2.1.6 - obuf: 1.1.2 - readable-stream: 3.6.2 - wbuf: 1.7.3 - transitivePeerDependencies: - - supports-color - - spdy@4.0.2: - dependencies: - debug: 4.4.0 - handle-thing: 2.0.1 - http-deceiver: 1.2.7 - select-hose: 2.0.0 - spdy-transport: 3.0.0 - transitivePeerDependencies: - - supports-color - - sprintf-js@1.0.3: {} - - sprintf-js@1.1.3: - optional: true - - srcset@4.0.0: {} - - statuses@1.5.0: {} - - statuses@2.0.1: {} - - std-env@3.7.0: {} - - streamx@2.21.1: - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - text-decoder: 1.2.3 - optionalDependencies: - bare-events: 2.5.4 - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string_decoder@1.1.1: - dependencies: - safe-buffer: 5.1.2 - - string_decoder@1.3.0: - dependencies: - safe-buffer: 5.2.1 - - stringify-entities@4.0.3: - dependencies: - character-entities-html4: 2.1.0 - character-entities-legacy: 3.0.0 - - stringify-object@3.3.0: - dependencies: - get-own-enumerable-property-symbols: 3.0.2 - is-obj: 1.0.1 - is-regexp: 1.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - - strip-bom-string@1.0.0: {} - - strip-final-newline@2.0.0: {} - - strip-json-comments@2.0.1: {} - - strip-json-comments@3.1.1: {} - - style-to-object@0.4.4: - dependencies: - inline-style-parser: 0.1.1 - - style-to-object@1.0.5: - dependencies: - inline-style-parser: 0.2.2 - - stylehacks@6.1.1(postcss@8.5.4): - dependencies: - browserslist: 4.24.4 - postcss: 8.5.4 - postcss-selector-parser: 6.0.16 - - stylis@4.3.6: {} - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.8 - commander: 4.1.1 - glob: 10.3.10 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - - supports-color@5.5.0: - dependencies: - has-flag: 3.0.0 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-color@8.1.1: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - svg-parser@2.0.4: {} - - svgo@3.2.0: - dependencies: - '@trysound/sax': 0.2.0 - commander: 7.2.0 - css-select: 5.1.0 - css-tree: 2.3.1 - css-what: 6.1.0 - csso: 5.0.5 - picocolors: 1.1.1 - - tapable@2.2.1: {} - - tar-fs@2.1.1: - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - - tar-fs@3.0.8: - dependencies: - pump: 3.0.0 - tar-stream: 3.1.6 - optionalDependencies: - bare-fs: 4.0.1 - bare-path: 3.0.0 - transitivePeerDependencies: - - bare-buffer - - tar-stream@2.2.0: - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - - tar-stream@3.1.6: - dependencies: - b4a: 1.6.4 - fast-fifo: 1.3.2 - streamx: 2.21.1 - - terser-webpack-plugin@5.3.10(webpack@5.97.1): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - jest-worker: 27.5.1 - schema-utils: 3.3.0 - serialize-javascript: 6.0.2 - terser: 5.26.0 - webpack: 5.97.1 - - terser@5.26.0: - dependencies: - '@jridgewell/source-map': 0.3.5 - acorn: 8.14.0 - commander: 2.20.3 - source-map-support: 0.5.21 - - text-decoder@1.2.3: - dependencies: - b4a: 1.6.4 - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - through@2.3.8: - optional: true - - thunky@1.1.0: {} - - tiny-invariant@1.3.1: {} - - tiny-warning@1.0.3: {} - - tinyexec@0.3.2: {} - - tinypool@1.0.2: {} - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - toidentifier@1.0.1: {} - - totalist@3.0.1: {} - - trim-lines@3.0.1: {} - - trough@2.1.0: {} - - ts-dedent@2.2.0: {} - - ts-interface-checker@0.1.13: {} - - tslib@2.6.2: {} - - tunnel-agent@0.6.0: - dependencies: - safe-buffer: 5.2.1 - - type-fest@0.21.3: {} - - type-fest@1.4.0: {} - - type-fest@2.19.0: {} - - type-is@1.6.18: - dependencies: - media-typer: 0.3.0 - mime-types: 2.1.35 - - typedarray-to-buffer@3.1.5: - dependencies: - is-typedarray: 1.0.0 - - typescript@5.7.3: - optional: true - - ufo@1.5.4: {} - - unbzip2-stream@1.4.3: - dependencies: - buffer: 5.7.1 - through: 2.3.8 - optional: true - - undici-types@5.26.5: {} - - unicode-canonical-property-names-ecmascript@2.0.0: {} - - unicode-emoji-modifier-base@1.0.0: {} - - unicode-match-property-ecmascript@2.0.0: - dependencies: - unicode-canonical-property-names-ecmascript: 2.0.0 - unicode-property-aliases-ecmascript: 2.1.0 - - unicode-match-property-value-ecmascript@2.1.0: {} - - unicode-property-aliases-ecmascript@2.1.0: {} - - unified@11.0.4: - dependencies: - '@types/unist': 3.0.2 - bail: 2.0.2 - devlop: 1.1.0 - extend: 3.0.2 - is-plain-obj: 4.1.0 - trough: 2.1.0 - vfile: 6.0.1 - - unique-string@3.0.0: - dependencies: - crypto-random-string: 4.0.0 - - unist-util-is@5.2.1: - dependencies: - '@types/unist': 2.0.10 - optional: true - - unist-util-is@6.0.0: - dependencies: - '@types/unist': 3.0.2 - - unist-util-position-from-estree@1.1.2: - dependencies: - '@types/unist': 2.0.10 - optional: true - - unist-util-position-from-estree@2.0.0: - dependencies: - '@types/unist': 3.0.2 - - unist-util-position@4.0.4: - dependencies: - '@types/unist': 2.0.10 - optional: true - - unist-util-position@5.0.0: - dependencies: - '@types/unist': 3.0.2 - - unist-util-remove-position@4.0.2: - dependencies: - '@types/unist': 2.0.10 - unist-util-visit: 4.1.2 - optional: true - - unist-util-remove-position@5.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-visit: 5.0.0 - - unist-util-stringify-position@3.0.3: - dependencies: - '@types/unist': 2.0.10 - optional: true - - unist-util-stringify-position@4.0.0: - dependencies: - '@types/unist': 3.0.2 - - unist-util-visit-parents@5.1.3: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - optional: true - - unist-util-visit-parents@6.0.1: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - - unist-util-visit@4.1.2: - dependencies: - '@types/unist': 2.0.10 - unist-util-is: 5.2.1 - unist-util-visit-parents: 5.1.3 - optional: true - - unist-util-visit@5.0.0: - dependencies: - '@types/unist': 3.0.2 - unist-util-is: 6.0.0 - unist-util-visit-parents: 6.0.1 - - universalify@2.0.1: {} - - unpipe@1.0.0: {} - - update-browserslist-db@1.1.2(browserslist@4.24.4): - dependencies: - browserslist: 4.24.4 - escalade: 3.2.0 - picocolors: 1.1.1 - - update-browserslist-db@1.1.3(browserslist@4.25.0): - dependencies: - browserslist: 4.25.0 - escalade: 3.2.0 - picocolors: 1.1.1 - - update-notifier@6.0.2: - dependencies: - boxen: 7.1.1 - chalk: 5.3.0 - configstore: 6.0.0 - has-yarn: 3.0.0 - import-lazy: 4.0.0 - is-ci: 3.0.1 - is-installed-globally: 0.4.0 - is-npm: 6.0.0 - is-yarn-global: 0.4.1 - latest-version: 7.0.0 - pupa: 3.1.0 - semver: 7.6.3 - semver-diff: 4.0.0 - xdg-basedir: 5.1.0 - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - url-loader@4.1.1(file-loader@6.2.0(webpack@5.97.1))(webpack@5.97.1): - dependencies: - loader-utils: 2.0.4 - mime-types: 2.1.35 - schema-utils: 3.3.0 - webpack: 5.97.1 - optionalDependencies: - file-loader: 6.2.0(webpack@5.97.1) - - urlpattern-polyfill@10.0.0: - optional: true - - use-editable@2.3.3(react@19.1.0): - dependencies: - react: 19.1.0 - - util-deprecate@1.0.2: {} - - utila@0.4.0: {} - - utility-types@3.10.0: {} - - utils-merge@1.0.1: {} - - uuid@11.1.0: {} - - uuid@8.3.2: {} - - uvu@0.5.6: - dependencies: - dequal: 2.0.3 - diff: 5.1.0 - kleur: 4.1.5 - sade: 1.8.1 - optional: true - - value-equal@1.0.1: {} - - vary@1.1.2: {} - - vfile-location@4.1.0: - dependencies: - '@types/unist': 2.0.10 - vfile: 5.3.7 - optional: true - - vfile-location@5.0.2: - dependencies: - '@types/unist': 3.0.2 - vfile: 6.0.1 - - vfile-message@3.1.4: - dependencies: - '@types/unist': 2.0.10 - unist-util-stringify-position: 3.0.3 - optional: true - - vfile-message@4.0.2: - dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - - vfile@5.3.7: - dependencies: - '@types/unist': 2.0.10 - is-buffer: 2.0.5 - unist-util-stringify-position: 3.0.3 - vfile-message: 3.1.4 - optional: true - - vfile@6.0.1: - dependencies: - '@types/unist': 3.0.2 - unist-util-stringify-position: 4.0.0 - vfile-message: 4.0.2 - - vscode-jsonrpc@8.2.0: {} - - vscode-languageserver-protocol@3.17.5: - dependencies: - vscode-jsonrpc: 8.2.0 - vscode-languageserver-types: 3.17.5 - - vscode-languageserver-textdocument@1.0.12: {} - - vscode-languageserver-types@3.17.5: {} - - vscode-languageserver@9.0.1: - dependencies: - vscode-languageserver-protocol: 3.17.5 - - vscode-uri@3.0.8: {} - - watchpack@2.4.2: - dependencies: - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - - wbuf@1.7.3: - dependencies: - minimalistic-assert: 1.0.1 - - web-namespaces@2.0.1: {} - - webpack-bundle-analyzer@4.10.2: - dependencies: - '@discoveryjs/json-ext': 0.5.7 - acorn: 8.14.0 - acorn-walk: 8.3.2 - commander: 7.2.0 - debounce: 1.2.1 - escape-string-regexp: 4.0.0 - gzip-size: 6.0.0 - html-escaper: 2.0.2 - opener: 1.5.2 - picocolors: 1.1.1 - sirv: 2.0.4 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - utf-8-validate - - webpack-dev-middleware@5.3.4(webpack@5.97.1): - dependencies: - colorette: 2.0.20 - memfs: 3.5.3 - mime-types: 2.1.35 - range-parser: 1.2.1 - schema-utils: 4.2.0 - webpack: 5.97.1 - - webpack-dev-server@4.15.2(webpack@5.97.1): - dependencies: - '@types/bonjour': 3.5.13 - '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 - '@types/serve-index': 1.9.4 - '@types/serve-static': 1.15.5 - '@types/sockjs': 0.3.36 - '@types/ws': 8.5.10 - ansi-html-community: 0.0.8 - bonjour-service: 1.2.1 - chokidar: 3.5.3 - colorette: 2.0.20 - compression: 1.7.4 - connect-history-api-fallback: 2.0.0 - default-gateway: 6.0.3 - express: 4.19.2 - graceful-fs: 4.2.11 - html-entities: 2.4.0 - http-proxy-middleware: 2.0.6(@types/express@4.17.21) - ipaddr.js: 2.1.0 - launch-editor: 2.6.1 - open: 8.4.2 - p-retry: 4.6.2 - rimraf: 3.0.2 - schema-utils: 4.2.0 - selfsigned: 2.4.1 - serve-index: 1.9.1 - sockjs: 0.3.24 - spdy: 4.0.2 - webpack-dev-middleware: 5.3.4(webpack@5.97.1) - ws: 8.18.0 - optionalDependencies: - webpack: 5.97.1 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate - - webpack-merge@5.10.0: - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - - webpack-merge@6.0.1: - dependencies: - clone-deep: 4.0.1 - flat: 5.0.2 - wildcard: 2.0.1 - - webpack-sources@3.2.3: {} - - webpack@5.97.1: - dependencies: - '@types/eslint-scope': 3.7.7 - '@types/estree': 1.0.6 - '@webassemblyjs/ast': 1.14.1 - '@webassemblyjs/wasm-edit': 1.14.1 - '@webassemblyjs/wasm-parser': 1.14.1 - acorn: 8.14.0 - browserslist: 4.24.4 - chrome-trace-event: 1.0.3 - enhanced-resolve: 5.18.0 - es-module-lexer: 1.4.1 - eslint-scope: 5.1.1 - events: 3.3.0 - glob-to-regexp: 0.4.1 - graceful-fs: 4.2.11 - json-parse-even-better-errors: 2.3.1 - loader-runner: 4.3.0 - mime-types: 2.1.35 - neo-async: 2.6.2 - schema-utils: 3.3.0 - tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(webpack@5.97.1) - watchpack: 2.4.2 - webpack-sources: 3.2.3 - transitivePeerDependencies: - - '@swc/core' - - esbuild - - uglify-js - - webpackbar@6.0.1(webpack@5.97.1): - dependencies: - ansi-escapes: 4.3.2 - chalk: 4.1.2 - consola: 3.4.0 - figures: 3.2.0 - markdown-table: 2.0.0 - pretty-time: 1.1.0 - std-env: 3.7.0 - webpack: 5.97.1 - wrap-ansi: 7.0.0 - - websocket-driver@0.7.4: - dependencies: - http-parser-js: 0.5.8 - safe-buffer: 5.2.1 - websocket-extensions: 0.1.4 - - websocket-extensions@0.1.4: {} - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - widest-line@4.0.1: - dependencies: - string-width: 5.1.2 - - wildcard@2.0.1: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - write-file-atomic@3.0.3: - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - - ws@7.5.9: {} - - ws@8.18.0: {} - - xdg-basedir@5.1.0: {} - - xml-js@1.6.11: - dependencies: - sax: 1.3.0 - - y18n@5.0.8: - optional: true - - yallist@3.1.1: {} - - yargs-parser@21.1.1: - optional: true - - yargs@17.7.2: - dependencies: - cliui: 8.0.1 - escalade: 3.2.0 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - optional: true - - yauzl@2.10.0: - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - optional: true - - yocto-queue@1.0.0: {} - - zod@3.23.8: - optional: true - - zwitch@2.0.4: {} diff --git a/website/sidebars.js b/website/sidebars.js deleted file mode 100644 index cf0d7a7c08..0000000000 --- a/website/sidebars.js +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -module.exports = { - Docs: [ - "quickstart", - "configuration", - "suppressing-findings", - "ci-workflow", - { - type: "category", - label: "Rules", - collapsed: false, - items: [ - "rules/unused_dependency", - "rules/must_be_api", - "rules/inherited_dependency", - "rules/redundant_dependency", - "rules/overshot_dependency", - "rules/project_depth", - { - type: "category", - label: "Compiler", - collapsed: false, - items: [ - "rules/compiler/use_anvil_factory_generation", - "rules/compiler/unused_kapt_processor", - "rules/compiler/unused_kapt_plugin", - "rules/compiler/custom_kapt_matchers", - ], - }, - { - type: "category", - label: "Sorting", - collapsed: false, - items: [ - "rules/sorting/sort_dependencies", - "rules/sorting/sort_plugins" - ], - }, - { - type: "category", - label: "Android", - collapsed: false, - items: [ - "rules/android/disable_android_resources", - "rules/android/disable_view_binding", - "rules/android/unused_kotlin_android_extensions", - ], - } - ], - }, - ], -}; diff --git a/website/src/css/custom.css b/website/src/css/custom.css deleted file mode 100644 index e2e64c713c..0000000000 --- a/website/src/css/custom.css +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -/** - * Any CSS included here will be global. The classic template - * bundles Infima by default. Infima is a CSS framework designed to - * work well for content-centric websites. - */ - -/* You can override the default Infima variables here. */ -:root { - --ifm-color-primary: #5500aa; - --ifm-color-primary-dark: #4c0099; - --ifm-color-primary-darker: #480090; - --ifm-color-primary-darkest: #3b0077; - --ifm-color-primary-light: #5d00bb; - --ifm-color-primary-lighter: #6200c3; - --ifm-color-primary-lightest: #6e00dd; - --ifm-code-font-size: 95%; -} -html[data-theme='dark'] { - --ifm-color-primary: #7700cc; - --ifm-color-primary-dark: #6b00b8; - --ifm-color-primary-darker: #6500ad; - --ifm-color-primary-darkest: #53008f; - --ifm-color-primary-light: #8300e0; - --ifm-color-primary-lighter: #8900eb; - --ifm-color-primary-lightest: #990aff; - /*--ifm-background-color: #333;*/ -} - -.docusaurus-highlight-code-line { - background-color: rgb(72, 77, 91); - display: block; - margin: 0 calc(-1 * var(--ifm-pre-padding)); - padding: 0 var(--ifm-pre-padding); -} - -.menu button { - margin-bottom: 70px; -} - -article { - max-width: 1800px; - margin-left: auto; - margin-right: auto; -} diff --git a/website/src/pages/changelog.md b/website/src/pages/changelog.md deleted file mode 100644 index d0e4387db0..0000000000 --- a/website/src/pages/changelog.md +++ /dev/null @@ -1,419 +0,0 @@ -## 0.12.5 - -This is a re-release of [0.12.4](#0124). - -#### 🐛 Bug Fixes - -* don't crash if Anvil isn't in the buildScript classpath by @RBusarow - in https://github.com/RBusarow/ModuleCheck/pull/944 -* ignore suppress/noinspection names which don't fit the FindingName pattern by @RBusarow - in https://github.com/RBusarow/ModuleCheck/pull/945 - -#### Other Changes - -* GitHub release notes config by @RBusarow in https://github.com/RBusarow/ModuleCheck/pull/946 - -**Full Changelog**: https://github.com/RBusarow/ModuleCheck/compare/0.12.3...0.12.5 - -## 0.12.4 - -This version was published with stale artifacts. Use 0.12.5 instead. - -## 0.12.3 - -#### 🐛 Bug Fixes - -- fix suppressing findings within the AGP - DSL ([#712](https://github.com/rbusarow/ModuleCheck/pull/712)) -- parse the declarations of named companion objects and their - members ([#706](https://github.com/rbusarow/ModuleCheck/pull/706)) -- treat annotation processor dependencies the same as runtime dependencies for `McProject.uses()` - and overshot behavior ([#701](https://github.com/rbusarow/ModuleCheck/pull/701)) -- fix false positive for 'unused-dependency' when consuming `debug` source - from `testImplementation` [@tasomaniac](https://github.com/tasomaniac) ([#685](https://github.com/rbusarow/ModuleCheck/pull/685)) -- revert Kotlin to 1.6.10 to fix build issues in targets using - 1.6.10 ([#683](https://github.com/rbusarow/ModuleCheck/pull/683)) - -#### 🧰 Maintenance - -- Update dependency com.vanniktech:gradle-maven-publish-plugin to - v0.20.0 ([#707](https://github.com/rbusarow/ModuleCheck/pull/707)) -- Update dependency com.autonomousapps.dependency-analysis to - v1.4.0 ([#698](https://github.com/rbusarow/ModuleCheck/pull/698)) -- Update dependency com.osacky.doctor to - v0.8.1 ([#699](https://github.com/rbusarow/ModuleCheck/pull/699)) -- Update docusaurus monorepo to - v2.0.0-beta.21 ([#691](https://github.com/rbusarow/ModuleCheck/pull/691)) -- Update kotlinx-coroutines to v1.6.2 ([#695](https://github.com/rbusarow/ModuleCheck/pull/695)) -- Update dependency com.autonomousapps.dependency-analysis to - v1.3.0 ([#696](https://github.com/rbusarow/ModuleCheck/pull/696)) -- Update dependency com.github.ben-manes.caffeine:caffeine to - v3.1.1 ([#694](https://github.com/rbusarow/ModuleCheck/pull/694)) -- remove CI's `tests-windows` need - for `publish-maven-local` [@RBusarow](https://github.com/RBusarow) ([#693](https://github.com/rbusarow/ModuleCheck/pull/693)) -- use Caffeine for caching, with `LazyDeferred` - loaders [@RBusarow](https://github.com/RBusarow) ([#692](https://github.com/rbusarow/ModuleCheck/pull/692)) -- Update dropbox-dependencyGuard to - v0.3.0 ([#690](https://github.com/rbusarow/ModuleCheck/pull/690)) -- don't sign `-SNAPSHOT` - builds [@RBusarow](https://github.com/RBusarow) ([#686](https://github.com/rbusarow/ModuleCheck/pull/686)) -- disable KtLint's broken `experimental:type-parameter-list-spacing` - rule [@RBusarow](https://github.com/RBusarow) ([#681](https://github.com/rbusarow/ModuleCheck/pull/681)) -- Update crazy-max/ghaction-github-pages action to - v3 ([#679](https://github.com/rbusarow/ModuleCheck/pull/679)) -- update changelog for `0.12.2` - release [@RBusarow](https://github.com/RBusarow) ([#680](https://github.com/rbusarow/ModuleCheck/pull/680)) -- Update dependency com.rickbusarow.module-check to - v0.12.2 ([#678](https://github.com/rbusarow/ModuleCheck/pull/678)) - -#### Contributors - -[@RBusarow](https://github.com/RBusarow) and [@tasomaniac](https://github.com/tasomaniac) - -## 0.12.2 - -#### 🐛 Bug Fixes - -- false positives for unused kapt processors which are defined in - additionalKaptMatchers ([8c55fd1](https://github.com/RBusarow/ModuleCheck/commit/8c55fd188f15c826ba4b6b28d293f68f49bafcb9)) - -## 0.12.1 - -#### 🗑 Deprecations - -- The names of all findings have been updated/standardized. Any declarations which were suppressing - a finding with the old ID (via `@Suppress("someFinding")` or `//suppress=someFinding`) will still - work, but they should be updated to use the new names. - See [the migrations guide](https://rbusarow.github.io/ModuleCheck/migrations#standardized-finding-names) -- The method for defining `additionalKaptMatchers` in the Gradle DSL has been deprecated, replaced - with the `additionalCodeGenerators` property and `CodeGeneratorBinding`. - See [the migrations guide](https://rbusarow.github.io/ModuleCheck/migrations#code-generator-binding) - -#### 💥 Breaking Changes - -- The base `:moduleCheck` task will now automatically hook into the root project's `:check` task, if - one - exists. [@RBusarow](https://github.com/RBusarow) ([#611](https://github.com/rbusarow/ModuleCheck/pull/611)) - -#### 🚀 Features - -- Added support - for [Static Analysis Results Interchange Format (SARIF)](https://sarifweb.azurewebsites.net) - report - output [@RBusarow](https://github.com/RBusarow) ([#566](https://github.com/rbusarow/ModuleCheck/pull/566)) - -#### 🐛 Bug Fixes - -- don't find `must-be-api` if the project is already an api dependency - also [@RBusarow](https://github.com/RBusarow) ([#666](https://github.com/rbusarow/ModuleCheck/pull/666)) -- remove AGP and KGP from the plugin's runtime - classpath ([079ab9d](https://github.com/RBusarow/ModuleCheck/commit/079ab9d709add63dbf44ecbd8a534bf279becd47)) -- fix matching to custom - kaptMatchers [@RBusarow](https://github.com/RBusarow) ([#658](https://github.com/rbusarow/ModuleCheck/pull/658)) -- properly use settings to determine which kinds of depth output to - create [@RBusarow](https://github.com/RBusarow) ([#647](https://github.com/rbusarow/ModuleCheck/pull/647)) -- fix relative paths for custom graph report - directory [@RBusarow](https://github.com/RBusarow) ([#612](https://github.com/rbusarow/ModuleCheck/pull/612)) -- use type-safe accessor "path" when adding a dependency with type-safe - syntax [@RBusarow](https://github.com/RBusarow) ([#608](https://github.com/rbusarow/ModuleCheck/pull/608)) -- evaluate suppress/noinspection annotations - eagerly [@RBusarow](https://github.com/RBusarow) ([#604](https://github.com/rbusarow/ModuleCheck/pull/604)) -- fixes false negative for unused kapt plugin when there are no - processors [@RBusarow](https://github.com/RBusarow) ([#603](https://github.com/rbusarow/ModuleCheck/pull/603)) -- fix Dagger NoSuchMethodError for `dagger.internal.Preconditions.checkNotNullFromProvides` in - SNAPSHOT [@RBusarow](https://github.com/RBusarow) ([#570](https://github.com/rbusarow/ModuleCheck/pull/570)) - -#### 🧰 Maintenance - -- add a discrete job in CI for publishing to mavenLocal, then cache - it [@RBusarow](https://github.com/RBusarow) ([#668](https://github.com/rbusarow/ModuleCheck/pull/668)) -- update the build classpath baseline for the snapshot build's new - runt… [@RBusarow](https://github.com/RBusarow) ([#664](https://github.com/rbusarow/ModuleCheck/pull/664)) -- use the current SNAPSHOT for plugin - dogfooding [@RBusarow](https://github.com/RBusarow) ([#663](https://github.com/rbusarow/ModuleCheck/pull/663)) -- migrate TestKit tests away from the Specs - DSLs [@RBusarow](https://github.com/RBusarow) ([#660](https://github.com/rbusarow/ModuleCheck/pull/660)) -- hook dependencyGuard into the `check` - task [@RBusarow](https://github.com/RBusarow) ([#661](https://github.com/rbusarow/ModuleCheck/pull/661)) -- give Dokka explicit dependency upon KtLint tasks and more broadly - dis… [@RBusarow](https://github.com/RBusarow) ([#659](https://github.com/rbusarow/ModuleCheck/pull/659)) -- Update dropbox-dependencyGuard to - v0.2.0 [@renovate](https://github.com/renovate) ([#657](https://github.com/rbusarow/ModuleCheck/pull/657)) -- require comments for public APIs in Detekt, and add - baselines [@RBusarow](https://github.com/RBusarow) ([#656](https://github.com/rbusarow/ModuleCheck/pull/656)) -- add dependency-guard and - baselines [@RBusarow](https://github.com/RBusarow) ([#654](https://github.com/rbusarow/ModuleCheck/pull/654)) -- Update dependency prism-react-renderer to - v1.3.3 [@renovate](https://github.com/renovate) ([#653](https://github.com/rbusarow/ModuleCheck/pull/653)) -- Update dependency com.android.tools.build:gradle to - v7.2.0 [@renovate](https://github.com/renovate) ([#620](https://github.com/rbusarow/ModuleCheck/pull/620)) -- Update actions/setup-java action to - v3 [@renovate](https://github.com/renovate) ([#652](https://github.com/rbusarow/ModuleCheck/pull/652)) -- Update dependency com.autonomousapps.dependency-analysis to - v1.2.1 [@renovate](https://github.com/renovate) ([#651](https://github.com/rbusarow/ModuleCheck/pull/651)) -- Update actions/upload-artifact action to - v3 [@renovate](https://github.com/renovate) ([#629](https://github.com/rbusarow/ModuleCheck/pull/629)) -- Update dependency com.gradleup.auto.manifest to - v2 [@renovate](https://github.com/renovate) ([#645](https://github.com/rbusarow/ModuleCheck/pull/645)) -- Update react monorepo to v18 ( - major) [@renovate](https://github.com/renovate) ([#646](https://github.com/rbusarow/ModuleCheck/pull/646)) -- remove github actions - caching [@RBusarow](https://github.com/RBusarow) ([#649](https://github.com/rbusarow/ModuleCheck/pull/649)) -- remove - dependabot [@RBusarow](https://github.com/RBusarow) ([#648](https://github.com/rbusarow/ModuleCheck/pull/648)) -- create a shared `.gradle` cache for TestKit - tests [@RBusarow](https://github.com/RBusarow) ([#640](https://github.com/rbusarow/ModuleCheck/pull/640)) -- add the `artifacts-check` convention - plugin [@RBusarow](https://github.com/RBusarow) ([#615](https://github.com/rbusarow/ModuleCheck/pull/615)) -- fix incorrect/duplicate maven artifact - ids [@RBusarow](https://github.com/RBusarow) ([#614](https://github.com/rbusarow/ModuleCheck/pull/614)) -- revert KaptMatcher name - to `modulecheck.api.KaptMatcher` [@RBusarow](https://github.com/RBusarow) ([#613](https://github.com/rbusarow/ModuleCheck/pull/613)) -- - -delete `ConfiguredModule` [@RBusarow](https://github.com/RBusarow) ([#609](https://github.com/rbusarow/ModuleCheck/pull/609)) - -- disable the "use tab character" option in IDE - codestyle [@RBusarow](https://github.com/RBusarow) ([#607](https://github.com/rbusarow/ModuleCheck/pull/607)) -- replace `java-test-fixtures` usages with `-testing` - modules [@RBusarow](https://github.com/RBusarow) ([#605](https://github.com/rbusarow/ModuleCheck/pull/605)) -- Bump mermaid from 8.14.0 to 9.1.1 in - /website [@dependabot](https://github.com/dependabot) ([#601](https://github.com/rbusarow/ModuleCheck/pull/601)) -- Dependency block to dependencies - block [@RBusarow](https://github.com/RBusarow) ([#600](https://github.com/rbusarow/ModuleCheck/pull/600)) -- split - up `:modulecheck-parsing:gradle` [@RBusarow](https://github.com/RBusarow) ([#599](https://github.com/rbusarow/ModuleCheck/pull/599)) -- Bump dagger from 2.41 to - 2.42 [@dependabot](https://github.com/dependabot) ([#597](https://github.com/rbusarow/ModuleCheck/pull/597)) -- rename `modulecheck.reporting.logging.Logger` - to `McLogger` [@RBusarow](https://github.com/RBusarow) ([#593](https://github.com/rbusarow/ModuleCheck/pull/593)) -- pull `Finding` apis out of `:modulecheck-rules:api` and into their - ow… [@RBusarow](https://github.com/RBusarow) ([#591](https://github.com/rbusarow/ModuleCheck/pull/591)) -- Fix execution optimization for KtLint - in `:modulecheck-plugin` [@RBusarow](https://github.com/RBusarow) ([#590](https://github.com/rbusarow/ModuleCheck/pull/590)) -- use the stable version of the plugin in - CI [@RBusarow](https://github.com/RBusarow) ([#589](https://github.com/rbusarow/ModuleCheck/pull/589)) -- suppress Detekt's ComplexMethod for single `when` - statements [@RBusarow](https://github.com/RBusarow) ([#584](https://github.com/rbusarow/ModuleCheck/pull/584)) -- pull rules and configs into their own - modules [@RBusarow](https://github.com/RBusarow) ([#583](https://github.com/rbusarow/ModuleCheck/pull/583)) -- Bump kotest-assertions-core-jvm from 5.2.3 to - 5.3.0 [@dependabot](https://github.com/dependabot) ([#579](https://github.com/rbusarow/ModuleCheck/pull/579)) -- Bump turbine from 0.7.0 to - 0.8.0 [@dependabot](https://github.com/dependabot) ([#580](https://github.com/rbusarow/ModuleCheck/pull/580)) -- fix `BasePluginTest`'s unused `stacktrace` - parameter [@RBusarow](https://github.com/RBusarow) ([#578](https://github.com/rbusarow/ModuleCheck/pull/578)) -- add Detekt's SARIF reports to - CI [@RBusarow](https://github.com/RBusarow) ([#568](https://github.com/rbusarow/ModuleCheck/pull/568)) -- standardize hermit's definition - in `libs.versions.toml` [@RBusarow](https://github.com/RBusarow) ([#567](https://github.com/rbusarow/ModuleCheck/pull/567)) -- move `File.createSafely()` to production - code [@RBusarow](https://github.com/RBusarow) ([#565](https://github.com/rbusarow/ModuleCheck/pull/565)) -- Bump dokka-gradle-plugin from 1.6.20 to - 1.6.21 [@dependabot](https://github.com/dependabot) ([#563](https://github.com/rbusarow/ModuleCheck/pull/563)) -- Bump async from 2.6.3 to 2.6.4 in - /website [@dependabot](https://github.com/dependabot) ([#543](https://github.com/rbusarow/ModuleCheck/pull/543)) -- Bump kotlin-reflect from 1.6.20 to - 1.6.21 [@dependabot](https://github.com/dependabot) ([#553](https://github.com/rbusarow/ModuleCheck/pull/553)) -- Bump mermaid from 8.13.8 to 8.14.0 in - /website [@dependabot](https://github.com/dependabot) ([#545](https://github.com/rbusarow/ModuleCheck/pull/545)) -- Bump dokka-gradle-plugin from 1.6.10 to - 1.6.20 [@dependabot](https://github.com/dependabot) ([#544](https://github.com/rbusarow/ModuleCheck/pull/544)) -- Bump @mdx-js/react from 1.6.22 to 2.1.1 in - /website [@dependabot](https://github.com/dependabot) ([#546](https://github.com/rbusarow/ModuleCheck/pull/546)) -- Bump antlr4 from 4.10 to - 4.10.1 [@dependabot](https://github.com/dependabot) ([#550](https://github.com/rbusarow/ModuleCheck/pull/550)) - -#### ℹ️ Website - -- remove the `google()` repository requirement from - docs [@RBusarow](https://github.com/RBusarow) ([#667](https://github.com/rbusarow/ModuleCheck/pull/667)) -- 594 hook into root project check - task [@RBusarow](https://github.com/RBusarow) ([#611](https://github.com/rbusarow/ModuleCheck/pull/611)) -- replace `KaptMatcher` - with `CodeGeneratorBinding` [@RBusarow](https://github.com/RBusarow) ([#610](https://github.com/rbusarow/ModuleCheck/pull/610)) -- update Docusaurus to - 2.0.0-beta.20 [@RBusarow](https://github.com/RBusarow) ([#592](https://github.com/rbusarow/ModuleCheck/pull/592)) -- add support for sarif - reporting [@RBusarow](https://github.com/RBusarow) ([#566](https://github.com/rbusarow/ModuleCheck/pull/566)) -- strict rule/finding name - conventions [@RBusarow](https://github.com/RBusarow) ([#564](https://github.com/rbusarow/ModuleCheck/pull/564)) -- add `google()` repository to config - docs [@RBusarow](https://github.com/RBusarow) ([#559](https://github.com/rbusarow/ModuleCheck/pull/559)) -- add missing docs for - rules [@RBusarow](https://github.com/RBusarow) ([#555](https://github.com/rbusarow/ModuleCheck/pull/555)) -- fix - publishing [@RBusarow](https://github.com/RBusarow) ([#548](https://github.com/rbusarow/ModuleCheck/pull/548)) -- release - 0.12.0 [@RBusarow](https://github.com/RBusarow) ([#547](https://github.com/rbusarow/ModuleCheck/pull/547)) - -#### Contributors - -@RBusarow - -## 0.12.0 - -#### 💥 Breaking Changes - -- The `autoCorrect` property in the Gradle settings DSL has been removed. Instead, to perform a - check with auto-correct, add the `Auto` suffix to the task name. - ```bash - # perform all checks and fail if errors are found - ./gradlew moduleCheck - - # perform all checks and auto-correct if possible - ./gradlew moduleCheckAuto - ``` -- Tasks are no longer generated for most individual rules. Instead, rules should be toggled via - the [Gradle DSL](https://rbusarow.github.io/ModuleCheck/docs/next/configuration) and can be - invoked - through `./gradlew modulecheck` or `./gradlew moduleCheckAuto`. - -#### 📐 New Rules - -- Add the [Depths](https://rbusarow.github.io/ModuleCheck/docs/rules/project_depth) - rule [@RBusarow](https://github.com/RBusarow) ([#278](https://github.com/rbusarow/ModuleCheck/pull/278)) -- New - rule: [Unused Android Extensions](https://rbusarow.github.io/ModuleCheck/docs/rules/unused_kotlin_android_extensions) [@tasomaniac](https://github.com/tasomaniac) ([#440](https://github.com/rbusarow/ModuleCheck/pull/440)) - -#### 🚀 Features - -- Add support for depths, dotviz dependency graph, checkstyle, and plaintext result - reporting [@RBusarow](https://github.com/RBusarow) ([#243](https://github.com/rbusarow/ModuleCheck/pull/243)) - -#### 🐛 Bug Fixes - -- Add a test case for false - positive [@tasomaniac](https://github.com/tasomaniac) ([#419](https://github.com/rbusarow/ModuleCheck/pull/419)) -- Don't call a dependency overshot if it's already declared in that source - set [@RBusarow](https://github.com/RBusarow) ([#521](https://github.com/rbusarow/ModuleCheck/pull/521)) -- don't try to parse `.png`s as - xml [@RBusarow](https://github.com/RBusarow) ([#522](https://github.com/rbusarow/ModuleCheck/pull/522)) -- fix parsing xml resource declarations when there's a dot in the - name [@RBusarow](https://github.com/RBusarow) ([#512](https://github.com/rbusarow/ModuleCheck/pull/512)) -- Fix false positive for `unusedDependency` when a resource from the dependency is used with R from - the dependent in a downstream - project [@RBusarow](https://github.com/RBusarow) ([#510](https://github.com/rbusarow/ModuleCheck/pull/510)) -- better modeling for generated databinding declarations and - references [@RBusarow](https://github.com/RBusarow) ([#509](https://github.com/rbusarow/ModuleCheck/pull/509)) -- count layout files and `@+id/__` declarations as part of a module's - declarations [@RBusarow](https://github.com/RBusarow) ([#499](https://github.com/rbusarow/ModuleCheck/pull/499)) -- Support the alternative usage of kapt - plugin [@tasomaniac](https://github.com/tasomaniac) ([#481](https://github.com/rbusarow/ModuleCheck/pull/481)) -- add new dependency declarations even if their transitive source can't be - found [@RBusarow](https://github.com/RBusarow) ([#469](https://github.com/rbusarow/ModuleCheck/pull/469)) -- don't generate BuildConfig if it's ignored in Android - settings [@RBusarow](https://github.com/RBusarow) ([#470](https://github.com/rbusarow/ModuleCheck/pull/470)) -- force single-threaded GroovyLangParser - access [@RBusarow](https://github.com/RBusarow) ([#463](https://github.com/rbusarow/ModuleCheck/pull/463)) -- fix false positive for `disableViewBinding` when used in debug source set of different - module [@RBusarow](https://github.com/RBusarow) ([#446](https://github.com/rbusarow/ModuleCheck/pull/446)) -- don't swallow a newline when replacing a dependency with a preceding blank - line [@RBusarow](https://github.com/RBusarow) ([#444](https://github.com/rbusarow/ModuleCheck/pull/444)) -- better handling for detecting complex precompiled configuration - names [@RBusarow](https://github.com/RBusarow) ([#442](https://github.com/rbusarow/ModuleCheck/pull/442)) -- support multiple android base - packages [@RBusarow](https://github.com/RBusarow) ([#411](https://github.com/rbusarow/ModuleCheck/pull/411)) -- support `.java` files without a package - declaration [@RBusarow](https://github.com/RBusarow) ([#400](https://github.com/rbusarow/ModuleCheck/pull/400)) -- strip illegal characters from XML before - parsing [@RBusarow](https://github.com/RBusarow) ([#376](https://github.com/rbusarow/ModuleCheck/pull/376)) -- fix auto-correct when using a non-standard config - name [@RBusarow](https://github.com/RBusarow) ([#368](https://github.com/rbusarow/ModuleCheck/pull/368)) -- fix false positive for kapt processors in non-kapt - configurations [@RBusarow](https://github.com/RBusarow) ([#350](https://github.com/rbusarow/ModuleCheck/pull/350)) -- don't allow projects to inherit - themselves [@RBusarow](https://github.com/RBusarow) ([#343](https://github.com/rbusarow/ModuleCheck/pull/343)) -- update configuration - docs [@RBusarow](https://github.com/RBusarow) ([#335](https://github.com/rbusarow/ModuleCheck/pull/335)) -- always create depth and graph reports when running their explicit - tasks [@RBusarow](https://github.com/RBusarow) ([#332](https://github.com/rbusarow/ModuleCheck/pull/332)) -- collect depth info after applying - changes [@RBusarow](https://github.com/RBusarow) ([#331](https://github.com/rbusarow/ModuleCheck/pull/331)) -- fix testFixtures handling in - OverShotDependencyFinding [@RBusarow](https://github.com/RBusarow) ([#297](https://github.com/rbusarow/ModuleCheck/pull/297)) -- treat testFixtures and the associated main sources like different - projects [@RBusarow](https://github.com/RBusarow) ([#288](https://github.com/rbusarow/ModuleCheck/pull/288)) -- correctly apply the `testFixtures(...)` wrapper for replaced/added - dependencies [@RBusarow](https://github.com/RBusarow) ([#287](https://github.com/rbusarow/ModuleCheck/pull/287)) - -#### ℹ️ Website - -- Add documentation for new - rule [@tasomaniac](https://github.com/tasomaniac) ([#454](https://github.com/rbusarow/ModuleCheck/pull/454)) -- add snapshots badge to README and website - home [@RBusarow](https://github.com/RBusarow) ([#410](https://github.com/rbusarow/ModuleCheck/pull/410)) -- add `moduleCheckAuto` to main README and call out "next" docs - version [@RBusarow](https://github.com/RBusarow) ([#408](https://github.com/rbusarow/ModuleCheck/pull/408)) -- correct the tasks listed in the "next" version of the - docs [@RBusarow](https://github.com/RBusarow) ([#404](https://github.com/rbusarow/ModuleCheck/pull/404)) -- update copyright template for - 2022 [@RBusarow](https://github.com/RBusarow) ([#362](https://github.com/rbusarow/ModuleCheck/pull/362)) -- update configuration - docs [@RBusarow](https://github.com/RBusarow) ([#335](https://github.com/rbusarow/ModuleCheck/pull/335)) -- add the Depths - feature [@RBusarow](https://github.com/RBusarow) ([#278](https://github.com/rbusarow/ModuleCheck/pull/278)) -- replace `autoCorrect` with `-Auto` - suffixes [@RBusarow](https://github.com/RBusarow) ([#249](https://github.com/rbusarow/ModuleCheck/pull/249)) - -#### Contributors - -@RBusarow, @diego-gomez-olvera and @tasomaniac - -## 0.11.3 - -#### 🚀 Features - -- support suppressing findings ([#235](https://github.com/rbusarow/ModuleCheck/pull/235)) - -#### 🐛 Bug Fixes - -- support testFixtures ([#232](https://github.com/rbusarow/ModuleCheck/pull/232)) - -#### 🧰 Maintenance - -- Bump kotlinpoet from 1.10.1 to 1.10.2 ([#233](https://github.com/rbusarow/ModuleCheck/pull/233)) -- Bump gradle-plugin from 2.3.6 to 2.3.7 ([#229](https://github.com/rbusarow/ModuleCheck/pull/229)) - -#### ℹ️ Website - -- use titles in docs code snippets ([#237](https://github.com/rbusarow/ModuleCheck/pull/237)) -- clarify CI workflow docs ([#221](https://github.com/rbusarow/ModuleCheck/pull/221)) -- add example CI workflow to docs ([#220](https://github.com/rbusarow/ModuleCheck/pull/220)) - -## 0.11.2 - -#### 🐛 Bug Fixes - -- support overshot dependencies ([#217](https://github.com/rbusarow/ModuleCheck/pull/217)) -- sorting fixes ([#215](https://github.com/rbusarow/ModuleCheck/pull/215)) - -## 0.11.1 - -#### 🐛 Bug Fixes - -- support constant or enum declarations in Java - classes ([#209](https://github.com/rbusarow/ModuleCheck/pull/209)) -- include generated data/viewbinding objects as - declarations ([#208](https://github.com/rbusarow/ModuleCheck/pull/208)) -- support closures in dependency - declarations ([#205](https://github.com/rbusarow/ModuleCheck/pull/205)) -- count resources as R references when used in - AndroidManifest.xml ([#203](https://github.com/rbusarow/ModuleCheck/pull/203)) - -## 0.11.0 - Groovy auto-correct support - -#### 🐛 Bug Fixes - -- Support generated manifests ([#197](https://github.com/rbusarow/ModuleCheck/pull/197)) -- fix redundant "from: " output ([#193](https://github.com/rbusarow/ModuleCheck/pull/193)) -- support Groovy parsing ([#190](https://github.com/rbusarow/ModuleCheck/pull/190)) -- capture a finding's log string before it's - fixed ([#184](https://github.com/rbusarow/ModuleCheck/pull/184)) -- include class literal expressions when looking for type - references ([#177](https://github.com/rbusarow/ModuleCheck/pull/177)) -- check for Android kotlin sources ([#173](https://github.com/rbusarow/ModuleCheck/pull/173)) - -## 0.10.0 - -Initial release diff --git a/website/src/pages/index.js b/website/src/pages/index.js deleted file mode 100644 index 132c58307c..0000000000 --- a/website/src/pages/index.js +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (C) 2021-2023 Rick Busarow - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import React from "react"; -import clsx from "clsx"; -import Layout from "@theme/Layout"; -import Link from "@docusaurus/Link"; -import useDocusaurusContext from "@docusaurus/useDocusaurusContext"; -import useBaseUrl from "@docusaurus/useBaseUrl"; -import styles from "./styles.module.css"; - -const features = [ - { - title: 'Tree shaking', - imageUrl: 'img/modulecheck_diagram.png', - description: ( - <> - Blah blah blah. - -

- - More text. - -

- - - ), - }, -]; - -function Feature({imageUrl, title, description}) { - const imgUrl = useBaseUrl(imageUrl); - return ( -
- {imgUrl && ( -
- {title}/ -
- )} - {/*

{title}

*/} - - {/*

{description}

*/} -
- ); -} - -function Home() { - const context = useDocusaurusContext(); - const {siteConfig = {}} = context; - return ( - -
-
-

- ModuleCheck removes unused module dependencies from your gradle - project. -

-
- - Get Started - - -        - - { - //