{
  "title" : "Duplication",
  "timestamp" : "2026-01-18 17:33:01",
  "duplicates" : [ {
    "blockSize" : 52,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 66,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 11,
      "endLine" : 72,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 58
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTOTargetList.kt",
        "extension" : "kt",
        "linesOfCode" : 65,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 11,
      "endLine" : 72,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 59
    } ]
  }, {
    "blockSize" : 32,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 1,
      "endLine" : 33,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 32
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 33,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 32
    } ]
  }, {
    "blockSize" : 32,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 41,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 40
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 41,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 40
    } ]
  }, {
    "blockSize" : 27,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 39,
      "endLine" : 69,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 40
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 164,
      "endLine" : 194,
      "cleanedStartLine" : 120,
      "cleanedEndLine" : 146
    } ]
  }, {
    "blockSize" : 25,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 25,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 25,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 25,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 25,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 26,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 1,
      "endLine" : 24,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 3,
      "endLine" : 26,
      "cleanedStartLine" : 2,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 197,
      "endLine" : 220,
      "cleanedStartLine" : 171,
      "cleanedEndLine" : 194
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 286,
      "endLine" : 309,
      "cleanedStartLine" : 251,
      "cleanedEndLine" : 274
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 162,
      "endLine" : 185,
      "cleanedStartLine" : 139,
      "cleanedEndLine" : 162
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 197,
      "endLine" : 220,
      "cleanedStartLine" : 171,
      "cleanedEndLine" : 194
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 28,
      "endLine" : 51,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 50
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 30,
      "endLine" : 53,
      "cleanedStartLine" : 28,
      "cleanedEndLine" : 51
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 197,
      "endLine" : 220,
      "cleanedStartLine" : 171,
      "cleanedEndLine" : 194
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 232,
      "endLine" : 255,
      "cleanedStartLine" : 203,
      "cleanedEndLine" : 226
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 28,
      "endLine" : 51,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 50
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 30,
      "endLine" : 53,
      "cleanedStartLine" : 28,
      "cleanedEndLine" : 51
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 28,
      "endLine" : 51,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 50
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 28,
      "endLine" : 51,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 50
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 232,
      "endLine" : 255,
      "cleanedStartLine" : 203,
      "cleanedEndLine" : 226
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 286,
      "endLine" : 309,
      "cleanedStartLine" : 251,
      "cleanedEndLine" : 274
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 70,
      "endLine" : 95,
      "cleanedStartLine" : 60,
      "cleanedEndLine" : 83
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 119,
      "endLine" : 144,
      "cleanedStartLine" : 104,
      "cleanedEndLine" : 127
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 162,
      "endLine" : 185,
      "cleanedStartLine" : 139,
      "cleanedEndLine" : 162
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 286,
      "endLine" : 309,
      "cleanedStartLine" : 251,
      "cleanedEndLine" : 274
    } ]
  }, {
    "blockSize" : 24,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 162,
      "endLine" : 185,
      "cleanedStartLine" : 139,
      "cleanedEndLine" : 162
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 232,
      "endLine" : 255,
      "cleanedStartLine" : 203,
      "cleanedEndLine" : 226
    } ]
  }, {
    "blockSize" : 22,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/model/TargetGroups.kt",
        "extension" : "kt",
        "linesOfCode" : 140,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 75,
      "endLine" : 96,
      "cleanedStartLine" : 74,
      "cleanedEndLine" : 95
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/model/TargetGroups.kt",
        "extension" : "kt",
        "linesOfCode" : 140,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 99,
      "endLine" : 120,
      "cleanedStartLine" : 98,
      "cleanedEndLine" : 119
    } ]
  }, {
    "blockSize" : 21,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/api/PackageDetailsResponse.kt",
        "extension" : "kt",
        "linesOfCode" : 79,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 78,
      "startLine" : 22,
      "endLine" : 46,
      "cleanedStartLine" : 17,
      "cleanedEndLine" : 37
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/api/PackageOverviewResponse.kt",
        "extension" : "kt",
        "linesOfCode" : 40,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 16,
      "endLine" : 40,
      "cleanedStartLine" : 12,
      "cleanedEndLine" : 32
    } ]
  }, {
    "blockSize" : 20,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 29,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 28
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 10,
      "endLine" : 29,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 28
    } ]
  }, {
    "blockSize" : 20,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 10,
      "endLine" : 29,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 28
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 10,
      "endLine" : 29,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 28
    } ]
  }, {
    "blockSize" : 19,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 31,
      "endLine" : 49,
      "cleanedStartLine" : 30,
      "cleanedEndLine" : 48
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 37,
      "endLine" : 55,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 51
    } ]
  }, {
    "blockSize" : 19,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 14,
      "endLine" : 32,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 31
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 14,
      "endLine" : 32,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 19,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/dto/PackageDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 86,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 43,
      "endLine" : 61,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 43
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/entity/PackageEntity.kt",
        "extension" : "kt",
        "linesOfCode" : 120,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 98,
      "startLine" : 143,
      "endLine" : 161,
      "cleanedStartLine" : 76,
      "cleanedEndLine" : 94
    } ]
  }, {
    "blockSize" : 18,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 120,
      "endLine" : 139,
      "cleanedStartLine" : 83,
      "cleanedEndLine" : 100
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 227,
      "endLine" : 246,
      "cleanedStartLine" : 175,
      "cleanedEndLine" : 192
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 8,
      "endLine" : 24,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 8,
      "endLine" : 24,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 8,
      "endLine" : 24,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 8,
      "endLine" : 24,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 153,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 129,
      "startLine" : 130,
      "endLine" : 159,
      "cleanedStartLine" : 74,
      "cleanedEndLine" : 90
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 236,
      "endLine" : 265,
      "cleanedStartLine" : 139,
      "cleanedEndLine" : 155
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 34,
      "endLine" : 50,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 49
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 34,
      "endLine" : 50,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 49
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 10,
      "endLine" : 26,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 14,
      "endLine" : 30,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 29
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 17,
      "endLine" : 34,
      "cleanedStartLine" : 15,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 17,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 14,
      "endLine" : 30,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 29
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 17,
      "endLine" : 34,
      "cleanedStartLine" : 15,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 16,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 34,
      "endLine" : 49,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 48
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 40,
      "endLine" : 55,
      "cleanedStartLine" : 36,
      "cleanedEndLine" : 51
    } ]
  }, {
    "blockSize" : 16,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 1,
      "endLine" : 17,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 1,
      "endLine" : 17,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    } ]
  }, {
    "blockSize" : 16,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 1,
      "endLine" : 17,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 1,
      "endLine" : 17,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    } ]
  }, {
    "blockSize" : 16,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 1,
      "endLine" : 18,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 1,
      "endLine" : 17,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    } ]
  }, {
    "blockSize" : 16,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 1,
      "endLine" : 17,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 1,
      "endLine" : 17,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 16
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 85,
      "endLine" : 100,
      "cleanedStartLine" : 53,
      "cleanedEndLine" : 67
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 196,
      "endLine" : 211,
      "cleanedStartLine" : 147,
      "cleanedEndLine" : 161
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 85,
      "endLine" : 100,
      "cleanedStartLine" : 53,
      "cleanedEndLine" : 67
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 227,
      "endLine" : 242,
      "cleanedStartLine" : 175,
      "cleanedEndLine" : 189
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 28,
      "endLine" : 42,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 41
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 40,
      "endLine" : 54,
      "cleanedStartLine" : 36,
      "cleanedEndLine" : 50
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 28,
      "endLine" : 42,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 41
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 34,
      "endLine" : 48,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 47
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 85,
      "endLine" : 100,
      "cleanedStartLine" : 53,
      "cleanedEndLine" : 67
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 120,
      "endLine" : 135,
      "cleanedStartLine" : 83,
      "cleanedEndLine" : 97
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 26,
      "endLine" : 40,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 28,
      "endLine" : 42,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 120,
      "endLine" : 135,
      "cleanedStartLine" : 83,
      "cleanedEndLine" : 97
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 196,
      "endLine" : 211,
      "cleanedStartLine" : 147,
      "cleanedEndLine" : 161
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 113,
      "endLine" : 127,
      "cleanedStartLine" : 96,
      "cleanedEndLine" : 110
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 139,
      "endLine" : 153,
      "cleanedStartLine" : 119,
      "cleanedEndLine" : 133
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 196,
      "endLine" : 211,
      "cleanedStartLine" : 147,
      "cleanedEndLine" : 161
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 227,
      "endLine" : 242,
      "cleanedStartLine" : 175,
      "cleanedEndLine" : 189
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 87,
      "endLine" : 101,
      "cleanedStartLine" : 73,
      "cleanedEndLine" : 87
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 139,
      "endLine" : 153,
      "cleanedStartLine" : 119,
      "cleanedEndLine" : 133
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 28,
      "endLine" : 42,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 41
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 34,
      "endLine" : 48,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 47
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 26,
      "endLine" : 40,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 30,
      "endLine" : 44,
      "cleanedStartLine" : 28,
      "cleanedEndLine" : 42
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 26,
      "endLine" : 40,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 28,
      "endLine" : 42,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 15,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 87,
      "endLine" : 101,
      "cleanedStartLine" : 73,
      "cleanedEndLine" : 87
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 113,
      "endLine" : 127,
      "cleanedStartLine" : 96,
      "cleanedEndLine" : 110
    } ]
  }, {
    "blockSize" : 14,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 153,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 129,
      "startLine" : 59,
      "endLine" : 79,
      "cleanedStartLine" : 36,
      "cleanedEndLine" : 49
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 126,
      "endLine" : 146,
      "cleanedStartLine" : 97,
      "cleanedEndLine" : 110
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 27,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 26
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 32,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 15,
      "endLine" : 27,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 26
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 32,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 27,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 26
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 32,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 15,
      "endLine" : 27,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 26
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 32,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 15,
      "endLine" : 27,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 26
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 32,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 23,
      "endLine" : 37,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 33
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 44,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 43
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 1,
      "endLine" : 14,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 13
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 1,
      "endLine" : 14,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 13
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 84,
      "endLine" : 97,
      "cleanedStartLine" : 63,
      "cleanedEndLine" : 75
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 104,
      "endLine" : 117,
      "cleanedStartLine" : 80,
      "cleanedEndLine" : 92
    } ]
  }, {
    "blockSize" : 13,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 15,
      "endLine" : 27,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 26
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 32,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 23,
      "endLine" : 35,
      "cleanedStartLine" : 11,
      "cleanedEndLine" : 22
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 104,
      "endLine" : 116,
      "cleanedStartLine" : 80,
      "cleanedEndLine" : 91
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 23,
      "endLine" : 35,
      "cleanedStartLine" : 11,
      "cleanedEndLine" : 22
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 84,
      "endLine" : 96,
      "cleanedStartLine" : 63,
      "cleanedEndLine" : 74
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 23,
      "endLine" : 35,
      "cleanedStartLine" : 11,
      "cleanedEndLine" : 22
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 61,
      "endLine" : 73,
      "cleanedStartLine" : 43,
      "cleanedEndLine" : 54
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 13,
      "endLine" : 24,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 31,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 30
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 18,
      "endLine" : 31,
      "cleanedStartLine" : 12,
      "cleanedEndLine" : 23
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 66,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 35,
      "endLine" : 48,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 38
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 39,
      "endLine" : 50,
      "cleanedStartLine" : 35,
      "cleanedEndLine" : 46
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 46,
      "endLine" : 57,
      "cleanedStartLine" : 45,
      "cleanedEndLine" : 56
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 13,
      "endLine" : 24,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 31,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 30
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 26,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 31,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 30
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 26,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 31,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 30
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 18,
      "endLine" : 31,
      "cleanedStartLine" : 12,
      "cleanedEndLine" : 23
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 40,
      "endLine" : 53,
      "cleanedStartLine" : 32,
      "cleanedEndLine" : 43
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 33,
      "endLine" : 44,
      "cleanedStartLine" : 32,
      "cleanedEndLine" : 43
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 46,
      "endLine" : 57,
      "cleanedStartLine" : 45,
      "cleanedEndLine" : 56
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTOTargetList.kt",
        "extension" : "kt",
        "linesOfCode" : 65,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 35,
      "endLine" : 48,
      "cleanedStartLine" : 28,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 40,
      "endLine" : 53,
      "cleanedStartLine" : 32,
      "cleanedEndLine" : 43
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 26,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 31,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 30
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 61,
      "endLine" : 73,
      "cleanedStartLine" : 43,
      "cleanedEndLine" : 54
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 84,
      "endLine" : 96,
      "cleanedStartLine" : 63,
      "cleanedEndLine" : 74
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 61,
      "endLine" : 73,
      "cleanedStartLine" : 43,
      "cleanedEndLine" : 54
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectController.kt",
        "extension" : "kt",
        "linesOfCode" : 134,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 117,
      "startLine" : 104,
      "endLine" : 116,
      "cleanedStartLine" : 80,
      "cleanedEndLine" : 91
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 58,
      "endLine" : 69,
      "cleanedStartLine" : 48,
      "cleanedEndLine" : 59
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 106,
      "endLine" : 117,
      "cleanedStartLine" : 91,
      "cleanedEndLine" : 102
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 66,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 35,
      "endLine" : 48,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 38
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 40,
      "endLine" : 53,
      "cleanedStartLine" : 32,
      "cleanedEndLine" : 43
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 26,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 31,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 30
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/controller/PackageController.kt",
        "extension" : "kt",
        "linesOfCode" : 164,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 63,
      "endLine" : 75,
      "cleanedStartLine" : 41,
      "cleanedEndLine" : 52
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/controller/PackageController.kt",
        "extension" : "kt",
        "linesOfCode" : 164,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 86,
      "endLine" : 98,
      "cleanedStartLine" : 61,
      "cleanedEndLine" : 72
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "scripts/kubernetes/apply-prod-dump-on-klibs-features-environment-job.yaml",
        "extension" : "yaml",
        "linesOfCode" : 49,
        "components" : [ "primary::scripts" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 39,
      "endLine" : 50,
      "cleanedStartLine" : 38,
      "cleanedEndLine" : 49
    }, {
      "file" : {
        "relativePath" : "scripts/kubernetes/create-prod-dump-cronjob.yaml",
        "extension" : "yaml",
        "linesOfCode" : 42,
        "components" : [ "primary::scripts" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 32,
      "endLine" : 43,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 42
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 17,
      "endLine" : 28,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 19
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 52,
      "endLine" : 63,
      "cleanedStartLine" : 40,
      "cleanedEndLine" : 51
    } ]
  }, {
    "blockSize" : 12,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 18,
      "endLine" : 31,
      "cleanedStartLine" : 12,
      "cleanedEndLine" : 23
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTOTargetList.kt",
        "extension" : "kt",
        "linesOfCode" : 65,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 35,
      "endLine" : 48,
      "cleanedStartLine" : 28,
      "cleanedEndLine" : 39
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 34,
      "endLine" : 44,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 43
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 47,
      "endLine" : 57,
      "cleanedStartLine" : 46,
      "cleanedEndLine" : 56
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 28,
      "endLine" : 38,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 37
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 47,
      "endLine" : 57,
      "cleanedStartLine" : 46,
      "cleanedEndLine" : 56
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 30,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 29
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 23,
      "endLine" : 34,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 23,
      "endLine" : 34,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 49,
      "endLine" : 61,
      "cleanedStartLine" : 38,
      "cleanedEndLine" : 48
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 59,
      "endLine" : 71,
      "cleanedStartLine" : 48,
      "cleanedEndLine" : 58
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/kotlin/io/klibs/app/indexing/GitHubIndexingService.kt",
        "extension" : "kt",
        "linesOfCode" : 332,
        "components" : [ "primary::app" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 269,
      "startLine" : 193,
      "endLine" : 203,
      "cleanedStartLine" : 117,
      "cleanedEndLine" : 127
    }, {
      "file" : {
        "relativePath" : "app/src/main/kotlin/io/klibs/app/indexing/GitHubIndexingService.kt",
        "extension" : "kt",
        "linesOfCode" : 332,
        "components" : [ "primary::app" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 269,
      "startLine" : 325,
      "endLine" : 335,
      "cleanedStartLine" : 220,
      "cleanedEndLine" : 230
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 23,
      "endLine" : 34,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 23,
      "endLine" : 34,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 13,
      "endLine" : 23,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 23
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 20,
      "endLine" : 30,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 29
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 31,
      "endLine" : 43,
      "cleanedStartLine" : 23,
      "cleanedEndLine" : 33
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 16,
      "endLine" : 28,
      "cleanedStartLine" : 12,
      "cleanedEndLine" : 22
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/controller/PackageController.kt",
        "extension" : "kt",
        "linesOfCode" : 164,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 32,
      "endLine" : 43,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/controller/PackageController.kt",
        "extension" : "kt",
        "linesOfCode" : 164,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 63,
      "endLine" : 74,
      "cleanedStartLine" : 41,
      "cleanedEndLine" : 51
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/controller/PackageController.kt",
        "extension" : "kt",
        "linesOfCode" : 164,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 32,
      "endLine" : 43,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/controller/PackageController.kt",
        "extension" : "kt",
        "linesOfCode" : 164,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 86,
      "endLine" : 97,
      "cleanedStartLine" : 61,
      "cleanedEndLine" : 71
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 32,
      "endLine" : 42,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 41
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 15,
      "endLine" : 25,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 23,
      "endLine" : 34,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 11,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 13,
      "endLine" : 23,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 23
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 23,
      "endLine" : 34,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 31
    } ]
  }, {
    "blockSize" : 10,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 32,
      "endLine" : 41,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 40
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 34,
      "endLine" : 43,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 42
    } ]
  }, {
    "blockSize" : 10,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "integrations/maven/src/main/kotlin/io/klibs/integration/maven/scraper/impl/CentralSonatypeScraper.kt",
        "extension" : "kt",
        "linesOfCode" : 118,
        "components" : [ "primary::integrations" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 90,
      "startLine" : 70,
      "endLine" : 80,
      "cleanedStartLine" : 43,
      "cleanedEndLine" : 52
    }, {
      "file" : {
        "relativePath" : "integrations/maven/src/main/kotlin/io/klibs/integration/maven/scraper/impl/CentralSonatypeScraper.kt",
        "extension" : "kt",
        "linesOfCode" : 118,
        "components" : [ "primary::integrations" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 90,
      "startLine" : 105,
      "endLine" : 115,
      "cleanedStartLine" : 72,
      "cleanedEndLine" : 81
    } ]
  }, {
    "blockSize" : 10,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 308,
      "endLine" : 317,
      "cleanedStartLine" : 243,
      "cleanedEndLine" : 252
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 324,
      "endLine" : 333,
      "cleanedStartLine" : 257,
      "cleanedEndLine" : 266
    } ]
  }, {
    "blockSize" : 10,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-04_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 38,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 38,
      "startLine" : 14,
      "endLine" : 23,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 22
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-23_package_index_concurrent.sql",
        "extension" : "sql",
        "linesOfCode" : 33,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 33,
      "startLine" : 4,
      "endLine" : 13,
      "cleanedStartLine" : 3,
      "cleanedEndLine" : 12
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTOTargetList.kt",
        "extension" : "kt",
        "linesOfCode" : 65,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 25,
      "endLine" : 35,
      "cleanedStartLine" : 20,
      "cleanedEndLine" : 28
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 24,
      "endLine" : 34,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 27
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/repository/ProjectRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 161,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 110,
      "endLine" : 118,
      "cleanedStartLine" : 75,
      "cleanedEndLine" : 83
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/repository/ProjectRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 161,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 131,
      "endLine" : 139,
      "cleanedStartLine" : 93,
      "cleanedEndLine" : 101
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackageResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 66,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 64,
      "startLine" : 25,
      "endLine" : 35,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 27
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 24,
      "endLine" : 34,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 27
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 32,
      "endLine" : 40,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 40,
      "endLine" : 48,
      "cleanedStartLine" : 39,
      "cleanedEndLine" : 47
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 32,
      "endLine" : 40,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 46,
      "endLine" : 54,
      "cleanedStartLine" : 42,
      "cleanedEndLine" : 50
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 153,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 129,
      "startLine" : 79,
      "endLine" : 95,
      "cleanedStartLine" : 49,
      "cleanedEndLine" : 57
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 157,
      "endLine" : 173,
      "cleanedStartLine" : 116,
      "cleanedEndLine" : 124
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 32,
      "endLine" : 40,
      "cleanedStartLine" : 31,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 40,
      "endLine" : 48,
      "cleanedStartLine" : 39,
      "cleanedEndLine" : 47
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerController.kt",
        "extension" : "kt",
        "linesOfCode" : 57,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 43,
      "startLine" : 40,
      "endLine" : 48,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 33
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerService.kt",
        "extension" : "kt",
        "linesOfCode" : 45,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 37,
      "startLine" : 28,
      "endLine" : 36,
      "cleanedStartLine" : 18,
      "cleanedEndLine" : 26
    } ]
  }, {
    "blockSize" : 9,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectService.kt",
        "extension" : "kt",
        "linesOfCode" : 110,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 84,
      "startLine" : 41,
      "endLine" : 52,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 27
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectService.kt",
        "extension" : "kt",
        "linesOfCode" : 110,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 84,
      "startLine" : 58,
      "endLine" : 69,
      "cleanedStartLine" : 32,
      "cleanedEndLine" : 40
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 35,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 34
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 28,
      "endLine" : 35,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 34
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 18,
      "endLine" : 25,
      "cleanedStartLine" : 17,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 19,
      "endLine" : 26,
      "cleanedStartLine" : 18,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepository.kt",
        "extension" : "kt",
        "linesOfCode" : 19,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 16,
      "startLine" : 23,
      "endLine" : 30,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 14
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 83,
      "endLine" : 90,
      "cleanedStartLine" : 63,
      "cleanedEndLine" : 70
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 35,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 34
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 28,
      "endLine" : 35,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 34
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 18,
      "endLine" : 25,
      "cleanedStartLine" : 17,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 19,
      "endLine" : 26,
      "cleanedStartLine" : 18,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 41,
      "endLine" : 48,
      "cleanedStartLine" : 40,
      "cleanedEndLine" : 47
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-04_add_targets_vector_to_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 51,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 46,
      "endLine" : 53,
      "cleanedStartLine" : 44,
      "cleanedEndLine" : 51
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 18,
      "endLine" : 25,
      "cleanedStartLine" : 17,
      "cleanedEndLine" : 24
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 19,
      "endLine" : 26,
      "cleanedStartLine" : 18,
      "cleanedEndLine" : 25
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 254,
      "endLine" : 262,
      "cleanedStartLine" : 225,
      "cleanedEndLine" : 232
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/ScmRepositoryRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 328,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 308,
      "startLine" : 271,
      "endLine" : 279,
      "cleanedStartLine" : 239,
      "cleanedEndLine" : 246
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwner.kt",
        "extension" : "kt",
        "linesOfCode" : 28,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 27,
      "startLine" : 14,
      "endLine" : 23,
      "cleanedStartLine" : 9,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerEntity.kt",
        "extension" : "kt",
        "linesOfCode" : 22,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 19,
      "startLine" : 11,
      "endLine" : 20,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 14
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackagesRequest.kt",
        "extension" : "kt",
        "linesOfCode" : 33,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 30,
      "startLine" : 12,
      "endLine" : 20,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 14
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectsRequest.kt",
        "extension" : "kt",
        "linesOfCode" : 45,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 12,
      "endLine" : 20,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 14
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 41,
      "endLine" : 48,
      "cleanedStartLine" : 40,
      "cleanedEndLine" : 47
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_package_index_targets.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 44,
      "endLine" : 51,
      "cleanedStartLine" : 43,
      "cleanedEndLine" : 50
    } ]
  }, {
    "blockSize" : 8,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 41,
      "endLine" : 48,
      "cleanedStartLine" : 40,
      "cleanedEndLine" : 47
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_package_index_targets_underscore.sql",
        "extension" : "sql",
        "linesOfCode" : 50,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 50,
      "startLine" : 44,
      "endLine" : 51,
      "cleanedStartLine" : 43,
      "cleanedEndLine" : 50
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 16,
      "endLine" : 22,
      "cleanedStartLine" : 10,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 145,
      "endLine" : 151,
      "cleanedStartLine" : 125,
      "cleanedEndLine" : 131
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 153,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 129,
      "startLine" : 35,
      "endLine" : 43,
      "cleanedStartLine" : 19,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 102,
      "endLine" : 110,
      "cleanedStartLine" : 80,
      "cleanedEndLine" : 86
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 34,
      "endLine" : 40,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 37,
      "endLine" : 43,
      "cleanedStartLine" : 36,
      "cleanedEndLine" : 42
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchPackagesRequest.kt",
        "extension" : "kt",
        "linesOfCode" : 33,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 30,
      "startLine" : 29,
      "endLine" : 35,
      "cleanedStartLine" : 22,
      "cleanedEndLine" : 28
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectsRequest.kt",
        "extension" : "kt",
        "linesOfCode" : 45,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 29,
      "endLine" : 35,
      "cleanedStartLine" : 22,
      "cleanedEndLine" : 28
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 16,
      "endLine" : 22,
      "cleanedStartLine" : 10,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 119,
      "endLine" : 125,
      "cleanedStartLine" : 102,
      "cleanedEndLine" : 108
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/blacklist/BlacklistRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 127,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 107,
      "startLine" : 27,
      "endLine" : 35,
      "cleanedStartLine" : 17,
      "cleanedEndLine" : 23
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/blacklist/BlacklistRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 127,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 107,
      "startLine" : 43,
      "endLine" : 51,
      "cleanedStartLine" : 29,
      "cleanedEndLine" : 35
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/repository/ProjectRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 161,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 120,
      "endLine" : 127,
      "cleanedStartLine" : 85,
      "cleanedEndLine" : 91
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/repository/ProjectRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 161,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 143,
      "endLine" : 150,
      "cleanedStartLine" : 105,
      "cleanedEndLine" : 111
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 16,
      "endLine" : 22,
      "cleanedStartLine" : 10,
      "cleanedEndLine" : 16
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 173,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 160,
      "startLine" : 93,
      "endLine" : 99,
      "cleanedStartLine" : 79,
      "cleanedEndLine" : 85
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-23_package_index_concurrent.sql",
        "extension" : "sql",
        "linesOfCode" : 33,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 33,
      "startLine" : 14,
      "endLine" : 20,
      "cleanedStartLine" : 13,
      "cleanedEndLine" : 19
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-25_package_index_latest.sql",
        "extension" : "sql",
        "linesOfCode" : 47,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 24,
      "endLine" : 30,
      "cleanedStartLine" : 23,
      "cleanedEndLine" : 29
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 1,
      "endLine" : 8,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 7
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q3/2025-09-30_recreate_project_index_with_project_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 63,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 63,
      "startLine" : 1,
      "endLine" : 8,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 7
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 25,
      "endLine" : 31,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 31
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 34,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 33
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 25,
      "endLine" : 31,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 31
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 28,
      "endLine" : 34,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 33
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 25,
      "endLine" : 31,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 31
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 34,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 33
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/repository/ProjectRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 161,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 74,
      "endLine" : 80,
      "cleanedStartLine" : 45,
      "cleanedEndLine" : 51
    }, {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/repository/ProjectRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 161,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 137,
      "startLine" : 92,
      "endLine" : 98,
      "cleanedStartLine" : 60,
      "cleanedEndLine" : 66
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/repository/PackageRepository.kt",
        "extension" : "kt",
        "linesOfCode" : 82,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 76,
      "startLine" : 73,
      "endLine" : 79,
      "cleanedStartLine" : 57,
      "cleanedEndLine" : 63
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/repository/PackageRepository.kt",
        "extension" : "kt",
        "linesOfCode" : 82,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 76,
      "startLine" : 86,
      "endLine" : 92,
      "cleanedStartLine" : 69,
      "cleanedEndLine" : 75
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 1,
      "endLine" : 8,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 7
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 1,
      "endLine" : 8,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 7
    } ]
  }, {
    "blockSize" : 7,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 34,
      "endLine" : 40,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 39
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 35,
      "endLine" : 41,
      "cleanedStartLine" : 34,
      "cleanedEndLine" : 40
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/readme/impl/LinksMarkdownReadmeProcessor.kt",
        "extension" : "kt",
        "linesOfCode" : 58,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 11,
      "endLine" : 16,
      "cleanedStartLine" : 5,
      "cleanedEndLine" : 10
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/readme/impl/ReadmeMinimizationProcessor.kt",
        "extension" : "kt",
        "linesOfCode" : 54,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 31,
      "startLine" : 23,
      "endLine" : 28,
      "cleanedStartLine" : 5,
      "cleanedEndLine" : 10
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 127,
      "endLine" : 134,
      "cleanedStartLine" : 103,
      "cleanedEndLine" : 108
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 77,
      "endLine" : 83,
      "cleanedStartLine" : 63,
      "cleanedEndLine" : 68
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 34,
      "endLine" : 39,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 38
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-13_change_platform_collecting_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 43,
      "endLine" : 48,
      "cleanedStartLine" : 42,
      "cleanedEndLine" : 47
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/readme/impl/LinksBaseReadmeProcessor.kt",
        "extension" : "kt",
        "linesOfCode" : 65,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 15,
      "endLine" : 20,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 13
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/readme/impl/LinksMarkdownReadmeProcessor.kt",
        "extension" : "kt",
        "linesOfCode" : 58,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 47,
      "startLine" : 11,
      "endLine" : 16,
      "cleanedStartLine" : 5,
      "cleanedEndLine" : 10
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 164,
      "endLine" : 169,
      "cleanedStartLine" : 120,
      "cleanedEndLine" : 125
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 266,
      "endLine" : 271,
      "cleanedStartLine" : 209,
      "cleanedEndLine" : 214
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-15_010_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 36,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 36,
      "startLine" : 25,
      "endLine" : 30,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 30
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 33,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 32
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 43,
      "endLine" : 49,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 38
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 71,
      "endLine" : 77,
      "cleanedStartLine" : 58,
      "cleanedEndLine" : 63
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "scripts/kubernetes/apply-prod-dump-on-klibs-features-environment-job.yaml",
        "extension" : "yaml",
        "linesOfCode" : 49,
        "components" : [ "primary::scripts" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 21,
      "endLine" : 26,
      "cleanedStartLine" : 20,
      "cleanedEndLine" : 25
    }, {
      "file" : {
        "relativePath" : "scripts/kubernetes/create-prod-dump-cronjob.yaml",
        "extension" : "yaml",
        "linesOfCode" : 42,
        "components" : [ "primary::scripts" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 22,
      "endLine" : 27,
      "cleanedStartLine" : 21,
      "cleanedEndLine" : 26
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerController.kt",
        "extension" : "kt",
        "linesOfCode" : 57,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 43,
      "startLine" : 54,
      "endLine" : 59,
      "cleanedStartLine" : 38,
      "cleanedEndLine" : 43
    }, {
      "file" : {
        "relativePath" : "core/scm-owner/src/main/java/io/klibs/core/owner/ScmOwnerService.kt",
        "extension" : "kt",
        "linesOfCode" : 45,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 37,
      "startLine" : 44,
      "endLine" : 49,
      "cleanedStartLine" : 32,
      "cleanedEndLine" : 37
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 91,
      "endLine" : 97,
      "cleanedStartLine" : 73,
      "cleanedEndLine" : 78
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 34,
      "endLine" : 40,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 32
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 106,
      "endLine" : 111,
      "cleanedStartLine" : 73,
      "cleanedEndLine" : 78
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 147,
      "endLine" : 152,
      "cleanedStartLine" : 108,
      "cleanedEndLine" : 113
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 153,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 129,
      "startLine" : 21,
      "endLine" : 26,
      "cleanedStartLine" : 6,
      "cleanedEndLine" : 11
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 201,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 176,
      "startLine" : 81,
      "endLine" : 86,
      "cleanedStartLine" : 61,
      "cleanedEndLine" : 66
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 34,
      "endLine" : 39,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 38
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 43,
      "endLine" : 48,
      "cleanedStartLine" : 42,
      "cleanedEndLine" : 47
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 34,
      "endLine" : 39,
      "cleanedStartLine" : 33,
      "cleanedEndLine" : 38
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-06-03_add_targets_vector_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 52,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 52,
      "startLine" : 49,
      "endLine" : 54,
      "cleanedStartLine" : 45,
      "cleanedEndLine" : 50
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 33,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 32
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 33,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 32
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepository.kt",
        "extension" : "kt",
        "linesOfCode" : 15,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 12,
      "startLine" : 18,
      "endLine" : 23,
      "cleanedStartLine" : 3,
      "cleanedEndLine" : 8
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/ProjectSearchRepository.kt",
        "extension" : "kt",
        "linesOfCode" : 19,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 16,
      "startLine" : 21,
      "endLine" : 26,
      "cleanedStartLine" : 5,
      "cleanedEndLine" : 10
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepository.kt",
        "extension" : "kt",
        "linesOfCode" : 15,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 12,
      "startLine" : 20,
      "endLine" : 25,
      "cleanedStartLine" : 5,
      "cleanedEndLine" : 10
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/PackageSearchRepositoryJdbc.kt",
        "extension" : "kt",
        "linesOfCode" : 153,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 129,
      "startLine" : 23,
      "endLine" : 28,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 13
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-04_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 38,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 38,
      "startLine" : 33,
      "endLine" : 38,
      "cleanedStartLine" : 32,
      "cleanedEndLine" : 37
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-23_package_index_concurrent.sql",
        "extension" : "sql",
        "linesOfCode" : 33,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 33,
      "startLine" : 23,
      "endLine" : 28,
      "cleanedStartLine" : 22,
      "cleanedEndLine" : 27
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 33,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 32
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 28,
      "endLine" : 33,
      "cleanedStartLine" : 27,
      "cleanedEndLine" : 32
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "scripts/get_tags_prompt.ipynb",
        "extension" : "ipynb",
        "linesOfCode" : 616,
        "components" : [ "primary::scripts" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 616,
      "startLine" : 176,
      "endLine" : 181,
      "cleanedStartLine" : 176,
      "cleanedEndLine" : 181
    }, {
      "file" : {
        "relativePath" : "scripts/get_tags_prompt.ipynb",
        "extension" : "ipynb",
        "linesOfCode" : 616,
        "components" : [ "primary::scripts" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 616,
      "startLine" : 543,
      "endLine" : 548,
      "cleanedStartLine" : 543,
      "cleanedEndLine" : 548
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 39,
      "endLine" : 44,
      "cleanedStartLine" : 14,
      "cleanedEndLine" : 19
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/SearchController.kt",
        "extension" : "kt",
        "linesOfCode" : 302,
        "components" : [ "primary::core" ],
        "concerns" : [ "::TODOs" ]
      },
      "sourceFileCleanedLinesOfCode" : 268,
      "startLine" : 266,
      "endLine" : 271,
      "cleanedStartLine" : 209,
      "cleanedEndLine" : 214
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-04_package_index.sql",
        "extension" : "sql",
        "linesOfCode" : 38,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 38,
      "startLine" : 26,
      "endLine" : 31,
      "cleanedStartLine" : 25,
      "cleanedEndLine" : 30
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-04-23_package_index_concurrent.sql",
        "extension" : "sql",
        "linesOfCode" : 33,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 33,
      "startLine" : 16,
      "endLine" : 21,
      "cleanedStartLine" : 15,
      "cleanedEndLine" : 20
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-16_project_index_tags.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/api/PackageDetailsResponse.kt",
        "extension" : "kt",
        "linesOfCode" : 79,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 78,
      "startLine" : 10,
      "endLine" : 16,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 12
    }, {
      "file" : {
        "relativePath" : "core/package/src/main/kotlin/io/klibs/core/pckg/api/PackageOverviewResponse.kt",
        "extension" : "kt",
        "linesOfCode" : 40,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 10,
      "endLine" : 16,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 12
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 12,
      "endLine" : 18,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 12
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 10,
      "endLine" : 16,
      "cleanedStartLine" : 7,
      "cleanedEndLine" : 12
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-02-03_add_minimized_readme_to_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q2/2025-05-05_added_markers_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 49,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 49,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-01-29_remove_project_tags_join_from_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 39,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 39,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2024-Q4/2024-12-17_project_index_replace_dashes_with_dots.sql",
        "extension" : "sql",
        "linesOfCode" : 40,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 40,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    }, {
      "file" : {
        "relativePath" : "app/src/main/resources/db/migration/2025-Q1/2025-03-04_remove_converting_dashed_to_points_in_project_index.sql",
        "extension" : "sql",
        "linesOfCode" : 42,
        "components" : [ "primary::app" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 42,
      "startLine" : 1,
      "endLine" : 7,
      "cleanedStartLine" : 1,
      "cleanedEndLine" : 6
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/project/src/main/kotlin/io/klibs/core/project/ProjectDetailsDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 115,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 113,
      "startLine" : 109,
      "endLine" : 115,
      "cleanedStartLine" : 88,
      "cleanedEndLine" : 93
    }, {
      "file" : {
        "relativePath" : "core/search/src/main/kotlin/io/klibs/core/search/dto/api/SearchProjectResultDTO.kt",
        "extension" : "kt",
        "linesOfCode" : 74,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 73,
      "startLine" : 53,
      "endLine" : 59,
      "cleanedStartLine" : 43,
      "cleanedEndLine" : 48
    } ]
  }, {
    "blockSize" : 6,
    "duplicatedFileBlocks" : [ {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/readme/impl/LinksBaseReadmeProcessor.kt",
        "extension" : "kt",
        "linesOfCode" : 65,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 51,
      "startLine" : 15,
      "endLine" : 20,
      "cleanedStartLine" : 8,
      "cleanedEndLine" : 13
    }, {
      "file" : {
        "relativePath" : "core/scm-repository/src/main/kotlin/io/klibs/core/scm/repository/readme/impl/ReadmeMinimizationProcessor.kt",
        "extension" : "kt",
        "linesOfCode" : 54,
        "components" : [ "primary::core" ],
        "concerns" : [ "::Unclassified" ]
      },
      "sourceFileCleanedLinesOfCode" : 31,
      "startLine" : 23,
      "endLine" : 28,
      "cleanedStartLine" : 5,
      "cleanedEndLine" : 10
    } ]
  } ],
  "overallDuplication" : null
}