{"$schema":"https://json.schemastore.org/sarif-2.1.0.json","version":"2.1.0","runs":[{"tool":{"driver":{"name":"codehealth","informationUri":"https://codehealth.canine.dev","rules":[{"id":"D1","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D1"},{"id":"D2","name":"Cognitive Complexity","shortDescription":{"text":"Cognitive Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/D2"},{"id":"D3","name":"God Classes","shortDescription":{"text":"God Classes"},"helpUri":"https://codehealth.canine.dev/dimensions/D3"},{"id":"D4","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/D4"},{"id":"D5","name":"Coupling","shortDescription":{"text":"Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D5"},{"id":"D6","name":"Cohesion (LCOM4)","shortDescription":{"text":"Cohesion (LCOM4)"},"helpUri":"https://codehealth.canine.dev/dimensions/D6"},{"id":"D9","name":"Test Distribution","shortDescription":{"text":"Test Distribution"},"helpUri":"https://codehealth.canine.dev/dimensions/D9"},{"id":"D12","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/D12"},{"id":"D13","name":"Secret Scanning","shortDescription":{"text":"Secret Scanning"},"helpUri":"https://codehealth.canine.dev/dimensions/D13","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D14","name":"License Compliance","shortDescription":{"text":"License Compliance"},"helpUri":"https://codehealth.canine.dev/dimensions/D14"},{"id":"D15","name":"Churn \u00D7 Complexity Hotspots","shortDescription":{"text":"Churn \u00D7 Complexity Hotspots"},"helpUri":"https://codehealth.canine.dev/dimensions/D15"},{"id":"D17","name":"Explicit Debt","shortDescription":{"text":"Explicit Debt"},"helpUri":"https://codehealth.canine.dev/dimensions/D17"},{"id":"D20","name":"ADR Quality","shortDescription":{"text":"ADR Quality"},"helpUri":"https://codehealth.canine.dev/dimensions/D20"},{"id":"D21","name":"Naming Consistency","shortDescription":{"text":"Naming Consistency"},"helpUri":"https://codehealth.canine.dev/dimensions/D21"},{"id":"D26","name":"Project Cohesion","shortDescription":{"text":"Project Cohesion"},"helpUri":"https://codehealth.canine.dev/dimensions/D26"},{"id":"D28","name":"Secrets (history)","shortDescription":{"text":"Secrets (history)"},"helpUri":"https://codehealth.canine.dev/dimensions/D28","relationships":[{"target":{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-798","CWE-259"],"owasp":"A07:2025"}},{"id":"D29","name":"Static Analysis (SAST)","shortDescription":{"text":"Static Analysis (SAST)"},"helpUri":"https://codehealth.canine.dev/dimensions/D29","relationships":[{"target":{"id":"CWE-79","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-78","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-94","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-77","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-79","CWE-89","CWE-78","CWE-94","CWE-77"],"owasp":"A05:2025"}},{"id":"D30","name":"Dependency Vulnerabilities","shortDescription":{"text":"Dependency Vulnerabilities"},"helpUri":"https://codehealth.canine.dev/dimensions/D30","relationships":[{"target":{"id":"CWE-1395","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"CWE-937","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A03:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-1395","CWE-937"],"owasp":"A03:2025"}},{"id":"D34","name":"Knowledge Freshness","shortDescription":{"text":"Knowledge Freshness"},"helpUri":"https://codehealth.canine.dev/dimensions/D34"},{"id":"D35","name":"Change Coupling","shortDescription":{"text":"Change Coupling"},"helpUri":"https://codehealth.canine.dev/dimensions/D35"},{"id":"D43","name":"Malicious Dependencies","shortDescription":{"text":"Malicious Dependencies"},"helpUri":"https://codehealth.canine.dev/dimensions/D43","relationships":[{"target":{"id":"CWE-506","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},"kinds":["relevant"]},{"target":{"id":"A08:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}},"kinds":["relevant"]}],"properties":{"cwe":["CWE-506"],"owasp":"A08:2025"}},{"id":"AC1","name":"Text alternatives","shortDescription":{"text":"Text alternatives"},"helpUri":"https://codehealth.canine.dev/dimensions/AC1"},{"id":"AC2","name":"Forms \u0026 labels","shortDescription":{"text":"Forms \u0026 labels"},"helpUri":"https://codehealth.canine.dev/dimensions/AC2"},{"id":"AC3","name":"Page structure","shortDescription":{"text":"Page structure"},"helpUri":"https://codehealth.canine.dev/dimensions/AC3"},{"id":"AC4","name":"Keyboard semantics","shortDescription":{"text":"Keyboard semantics"},"helpUri":"https://codehealth.canine.dev/dimensions/AC4"},{"id":"AC5","name":"ARIA correctness","shortDescription":{"text":"ARIA correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/AC5"},{"id":"AC7","name":"A11y enforcement","shortDescription":{"text":"A11y enforcement"},"helpUri":"https://codehealth.canine.dev/dimensions/AC7"},{"id":"AX10","name":"Code composition","shortDescription":{"text":"Code composition"},"helpUri":"https://codehealth.canine.dev/dimensions/AX10"},{"id":"AX2","name":"Stateful singletons","shortDescription":{"text":"Stateful singletons"},"helpUri":"https://codehealth.canine.dev/dimensions/AX2"},{"id":"AX3","name":"Project dependency cycles","shortDescription":{"text":"Project dependency cycles"},"helpUri":"https://codehealth.canine.dev/dimensions/AX3"},{"id":"AX4","name":"Dependency direction","shortDescription":{"text":"Dependency direction"},"helpUri":"https://codehealth.canine.dev/dimensions/AX4"},{"id":"AX6","name":"Interface segregation","shortDescription":{"text":"Interface segregation"},"helpUri":"https://codehealth.canine.dev/dimensions/AX6"},{"id":"ED5","name":"Idempotency","shortDescription":{"text":"Idempotency"},"helpUri":"https://codehealth.canine.dev/dimensions/ED5"},{"id":"GD1","name":"Unfinished \u0026 placeholder code","shortDescription":{"text":"Unfinished \u0026 placeholder code"},"helpUri":"https://codehealth.canine.dev/dimensions/GD1"},{"id":"IC1","name":"Incompleteness \u0026 stubs","shortDescription":{"text":"Incompleteness \u0026 stubs"},"helpUri":"https://codehealth.canine.dev/dimensions/IC1"},{"id":"M1","name":"Documentation (README)","shortDescription":{"text":"Documentation (README)"},"helpUri":"https://codehealth.canine.dev/dimensions/M1"},{"id":"M2","name":"Architecture documentation","shortDescription":{"text":"Architecture documentation"},"helpUri":"https://codehealth.canine.dev/dimensions/M2"},{"id":"M3","name":"Folder \u0026 project structure","shortDescription":{"text":"Folder \u0026 project structure"},"helpUri":"https://codehealth.canine.dev/dimensions/M3"},{"id":"M4","name":"Documentation accuracy","shortDescription":{"text":"Documentation accuracy"},"helpUri":"https://codehealth.canine.dev/dimensions/M4"},{"id":"P1","name":"CI/CD gates","shortDescription":{"text":"CI/CD gates"},"helpUri":"https://codehealth.canine.dev/dimensions/P1"},{"id":"P2","name":"Observability","shortDescription":{"text":"Observability"},"helpUri":"https://codehealth.canine.dev/dimensions/P2"},{"id":"P3","name":"Security \u0026 performance tooling","shortDescription":{"text":"Security \u0026 performance tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/P3"},{"id":"P6","name":"Release Hygiene","shortDescription":{"text":"Release Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/P6"},{"id":"PF3","name":"Async \u0026 latency hygiene","shortDescription":{"text":"Async \u0026 latency hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/PF3"},{"id":"R1","name":"Type Safety","shortDescription":{"text":"Type Safety"},"helpUri":"https://codehealth.canine.dev/dimensions/R1"},{"id":"R10","name":"Code Duplication","shortDescription":{"text":"Code Duplication"},"helpUri":"https://codehealth.canine.dev/dimensions/R10"},{"id":"R2","name":"Cyclomatic Complexity","shortDescription":{"text":"Cyclomatic Complexity"},"helpUri":"https://codehealth.canine.dev/dimensions/R2"},{"id":"R3","name":"Large Files","shortDescription":{"text":"Large Files"},"helpUri":"https://codehealth.canine.dev/dimensions/R3"},{"id":"R4","name":"Test Coverage","shortDescription":{"text":"Test Coverage"},"helpUri":"https://codehealth.canine.dev/dimensions/R4"},{"id":"R6","name":"Tooling","shortDescription":{"text":"Tooling"},"helpUri":"https://codehealth.canine.dev/dimensions/R6"},{"id":"R7","name":"Dead Code","shortDescription":{"text":"Dead Code"},"helpUri":"https://codehealth.canine.dev/dimensions/R7"},{"id":"R8","name":"Dependency Hygiene","shortDescription":{"text":"Dependency Hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/R8"},{"id":"R9","name":"Circular Imports","shortDescription":{"text":"Circular Imports"},"helpUri":"https://codehealth.canine.dev/dimensions/R9"},{"id":"S1","name":"Web-Security Posture","shortDescription":{"text":"Web-Security Posture"},"helpUri":"https://codehealth.canine.dev/dimensions/S1"},{"id":"SC1","name":"Supply-chain hygiene","shortDescription":{"text":"Supply-chain hygiene"},"helpUri":"https://codehealth.canine.dev/dimensions/SC1"},{"id":"X1","name":"Async correctness","shortDescription":{"text":"Async correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X1"},{"id":"X10","name":"Duplicated predicate","shortDescription":{"text":"Duplicated predicate"},"helpUri":"https://codehealth.canine.dev/dimensions/X10"},{"id":"X12","name":"Unreachable branch","shortDescription":{"text":"Unreachable branch"},"helpUri":"https://codehealth.canine.dev/dimensions/X12"},{"id":"X13","name":"Undrained process stream","shortDescription":{"text":"Undrained process stream"},"helpUri":"https://codehealth.canine.dev/dimensions/X13"},{"id":"X14","name":"Bypassable address classification","shortDescription":{"text":"Bypassable address classification"},"helpUri":"https://codehealth.canine.dev/dimensions/X14"},{"id":"X15","name":"Unvalidated length from an untrusted reader","shortDescription":{"text":"Unvalidated length from an untrusted reader"},"helpUri":"https://codehealth.canine.dev/dimensions/X15"},{"id":"X16","name":"Unfloored truncation loop","shortDescription":{"text":"Unfloored truncation loop"},"helpUri":"https://codehealth.canine.dev/dimensions/X16"},{"id":"X17","name":"Uncapped recursion over a caller-supplied document","shortDescription":{"text":"Uncapped recursion over a caller-supplied document"},"helpUri":"https://codehealth.canine.dev/dimensions/X17"},{"id":"X18","name":"Disposal-pattern correctness","shortDescription":{"text":"Disposal-pattern correctness"},"helpUri":"https://codehealth.canine.dev/dimensions/X18"},{"id":"X19","name":"Unrestored process-global state","shortDescription":{"text":"Unrestored process-global state"},"helpUri":"https://codehealth.canine.dev/dimensions/X19"},{"id":"X20","name":"Mistyped argument guard","shortDescription":{"text":"Mistyped argument guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X20"},{"id":"X21","name":"Side-effecting pattern guard","shortDescription":{"text":"Side-effecting pattern guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X21"},{"id":"X22","name":"Contradicted release guard","shortDescription":{"text":"Contradicted release guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X22"},{"id":"X23","name":"Unguarded diagnostic materialisation","shortDescription":{"text":"Unguarded diagnostic materialisation"},"helpUri":"https://codehealth.canine.dev/dimensions/X23"},{"id":"X24","name":"Document value interpolated into markup unescaped","shortDescription":{"text":"Document value interpolated into markup unescaped"},"helpUri":"https://codehealth.canine.dev/dimensions/X24"},{"id":"X25","name":"Inert configuration knob","shortDescription":{"text":"Inert configuration knob"},"helpUri":"https://codehealth.canine.dev/dimensions/X25"},{"id":"X26","name":"Unsynchronised callback handoff","shortDescription":{"text":"Unsynchronised callback handoff"},"helpUri":"https://codehealth.canine.dev/dimensions/X26"},{"id":"X27","name":"Collection changed while being enumerated","shortDescription":{"text":"Collection changed while being enumerated"},"helpUri":"https://codehealth.canine.dev/dimensions/X27"},{"id":"X28","name":"Index access outside its own emptiness guard","shortDescription":{"text":"Index access outside its own emptiness guard"},"helpUri":"https://codehealth.canine.dev/dimensions/X28"},{"id":"X29","name":"Per-element action decided by a fixed element","shortDescription":{"text":"Per-element action decided by a fixed element"},"helpUri":"https://codehealth.canine.dev/dimensions/X29"},{"id":"X3","name":"Exception handling","shortDescription":{"text":"Exception handling"},"helpUri":"https://codehealth.canine.dev/dimensions/X3"},{"id":"X30","name":"Support guard that admits what it rejects","shortDescription":{"text":"Support guard that admits what it rejects"},"helpUri":"https://codehealth.canine.dev/dimensions/X30"},{"id":"X32","name":"Type resolved by simple name across every loaded assembly","shortDescription":{"text":"Type resolved by simple name across every loaded assembly"},"helpUri":"https://codehealth.canine.dev/dimensions/X32"},{"id":"X4","name":"Structured logging","shortDescription":{"text":"Structured logging"},"helpUri":"https://codehealth.canine.dev/dimensions/X4"},{"id":"X5","name":"Nullable reference types","shortDescription":{"text":"Nullable reference types"},"helpUri":"https://codehealth.canine.dev/dimensions/X5"},{"id":"X6","name":"Hand-rolled structured-format parsing","shortDescription":{"text":"Hand-rolled structured-format parsing"},"helpUri":"https://codehealth.canine.dev/dimensions/X6"},{"id":"X7","name":"Silent fallback defaults","shortDescription":{"text":"Silent fallback defaults"},"helpUri":"https://codehealth.canine.dev/dimensions/X7"},{"id":"X9","name":"Subsumed condition operand","shortDescription":{"text":"Subsumed condition operand"},"helpUri":"https://codehealth.canine.dev/dimensions/X9"}]}},"results":[{"ruleId":"D1","level":"warning","message":{"text":"AirlineSimulation.airlineSimulation (cyclomatic 51): AirlineSimulation.airlineSimulation has cyclomatic complexity 51 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirlineSimulation.scala"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b7022dc769dbaa391a71fbf82441992f9698d1a856807cba230333ec62d2983b"}},{"ruleId":"D1","level":"warning","message":{"text":"DemandGenerator.computeDemandBetweenAirports (cyclomatic 40): DemandGenerator.computeDemandBetweenAirports has cyclomatic complexity 40 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/DemandGenerator.scala"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"abbea1dff288d0132d5b0fc4b677e65bb189c597db4f7d608cb94d54bea2b06f"}},{"ruleId":"D1","level":"warning","message":{"text":"AssetBlueprintGenerator.generationOdds (cyclomatic 40): AssetBlueprintGenerator.generationOdds has cyclomatic complexity 40 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AssetBlueprintGenerator.scala"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"c25b658b2d0b766b351ec2a17cca37c5e83683c7d5298435a5449d5501ec159c"}},{"ruleId":"D1","level":"warning","message":{"text":"airline.updatePlanLinkInfo (cyclomatic 36): airline.updatePlanLinkInfo has cyclomatic complexity 36 (threshold 15). Of this number, 23 points are the body\u0027s own statements and 13 belong to 8 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd5ae29f40330e55c1ac437211d8e6b324541de9d1a9138bd45714c5154f9917"}},{"ruleId":"D1","level":"warning","message":{"text":"LinkApplication.addLinkBlock (cyclomatic 33): LinkApplication.addLinkBlock has cyclomatic complexity 33 (threshold 15). To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"c14aa3b819201112c632944d7f1fa3c376c794e47957699610db0b731710b60a"}},{"ruleId":"D1","level":"warning","message":{"text":"Shell.burst (cyclomatic 33): Shell.burst has cyclomatic complexity 33 (threshold 15). Of this number, 21 points are the body\u0027s own statements and 12 belong to 4 function items inside it that branch. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1746}}}],"partialFingerprints":{"codehealthFindingId/v1":"50c0e3c8cad22472b402538403df68e186a689de3fff2bae65c2f1b3da063ab2"}},{"ruleId":"D1","level":"warning","message":{"text":"AirportAssetSimulation.simulateHotelAssetPerformance (cyclomatic 28): AirportAssetSimulation.simulateHotelAssetPerformance has cyclomatic complexity 28 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd2acf2198c5aec16544223e67ec9a595af0809c961e8c5131a42e2e164afc1e"}},{"ruleId":"D1","level":"warning","message":{"text":"link-history.showLinkHistory (cyclomatic 26): link-history.showLinkHistory has cyclomatic complexity 26 (threshold 15). Most of this is not in the body itself: 7 of the 26 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 399, 412, 443). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/link-history.js"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"a87570fa0f79a0f7d1539bc92b42d6c58c3e44da29b960cd91145c4e93f680a2"}},{"ruleId":"D1","level":"warning","message":{"text":"PassengerSimulation.passengerConsume (cyclomatic 25): PassengerSimulation.passengerConsume has cyclomatic complexity 25 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/PassengerSimulation.scala"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"f83cc9c11b955edd4429ee573f98c7cbecf3906e4248fef2e83860a80ee23f6c"}},{"ruleId":"D1","level":"warning","message":{"text":"search.searchRoute (cyclomatic 25): search.searchRoute has cyclomatic complexity 25 (threshold 15). Most of this is not in the body itself: 3 of the 25 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 165, 131, 255, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a8771d5e4b6fa764c0ca12c04e34fb38714f51d538ca877825909d71d01da5e"}},{"ruleId":"D1","level":"warning","message":{"text":"AirportAssetSimulation.simulateAdmissionAssetPerformance (cyclomatic 24): AirportAssetSimulation.simulateAdmissionAssetPerformance has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"e060b17f65e3e534f45cf5e1b27ac24d9bed41823d3374cd2dff735b8c8d44dc"}},{"ruleId":"D1","level":"warning","message":{"text":"PassengerSimulation.findShortestRoute (cyclomatic 24): PassengerSimulation.findShortestRoute has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/PassengerSimulation.scala"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"2573122abe48a4918b8e00f70f28335976d9c722de25a3d7ef6a5a9f4b75ded9"}},{"ruleId":"D1","level":"warning","message":{"text":"AdminApplication.doAdminAction (cyclomatic 24): AdminApplication.doAdminAction has cyclomatic complexity 24 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AdminApplication.scala"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6262f9b1b0227e32994b990300a4ed880661b8a052f805fa9200704a56c42a4"}},{"ruleId":"D1","level":"warning","message":{"text":"chat.angular.module(\u0022ChatApp\u0022).controller(\u0022ChatController\u0022) (cyclomatic 24): chat.angular.module(\u0022ChatApp\u0022).controller(\u0022ChatController\u0022) has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 6 of the 24 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 197, 144, 264, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"c22df452d5011343a6fa6e8f862319ed32d1b4af1f8898078ec92f6253b8ef07"}},{"ruleId":"D1","level":"warning","message":{"text":"ranking.updateRankingTable (cyclomatic 24): ranking.updateRankingTable has cyclomatic complexity 24 (threshold 15). Of this number, 20 points are the body\u0027s own statements and 4 belong to one function literal inside it that branches. To reduce it, split the body: these branches sit side by side rather than nested inside one another, so extracting each one on its own would leave a function per branch. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/ranking.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4b7f0f7031daaaa263617bbd2cb700fdb0535e294f48db15d9b854aa5180d30"}},{"ruleId":"D1","level":"warning","message":{"text":"(anonymous) (cyclomatic 24): (anonymous) has cyclomatic complexity 24 (threshold 15). Most of this is not in the body itself: 4 of the 24 points are its own statements and the rest belongs to 16 function items inside it that branch (onmessage, sendMessage, a function literal at line 264, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":114}}}],"partialFingerprints":{"codehealthFindingId/v1":"72f25868eee98dfe10ca1a701257460a22eed9217c8dd1836278a737e2277752"}},{"ruleId":"D1","level":"warning","message":{"text":"GeoDataGenerator.generateAirportData (cyclomatic 23): GeoDataGenerator.generateAirportData has cyclomatic complexity 23 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa1a41ec0df1a014e4fa54339ff603d435b3b5a25ce7072c8b457ae1293c007"}},{"ruleId":"D1","level":"warning","message":{"text":"NegotiationUtil.getToAirportRequirements (cyclomatic 23): NegotiationUtil.getToAirportRequirements has cyclomatic complexity 23 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/NegotiationUtil.scala"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"48794d30d0fd7c6616af7acb518b0edc6cc8669dd00e5441f25d4e3bb5d8a9a0"}},{"ruleId":"D1","level":"warning","message":{"text":"airport.updateAirportDetails (cyclomatic 23): airport.updateAirportDetails has cyclomatic complexity 23 (threshold 15). Most of this is not in the body itself: 8 of the 23 points are its own statements and the rest belongs to one function literal inside it that branches (line 112). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"f546a7a4e12e2027326e75e5f7c0593d8ea4193d6f926e9ce524555deb53034f"}},{"ruleId":"D1","level":"warning","message":{"text":"airline.getLinkNegotiation (cyclomatic 22): airline.getLinkNegotiation has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 1 of the 22 points is its own statement and the rest belongs to 5 function literals inside it that branch (lines 2857, 2906, 2920, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2832}}}],"partialFingerprints":{"codehealthFindingId/v1":"273c19231428edf6d1996b106b5055fc4c407dfdf6a72c7fba80a96df9cdd092"}},{"ruleId":"D1","level":"warning","message":{"text":"alliance.updateAllianceBasicsDetails (cyclomatic 22): alliance.updateAllianceBasicsDetails has cyclomatic complexity 22 (threshold 15). Most of this is not in the body itself: 3 of the 22 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 385, 369, 330, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"165c240848b883b454fc78bee6a8713197e1f074c5a79acfdc05ee88125ec620"}},{"ruleId":"D1","level":"warning","message":{"text":"Application.getWeatherError (cyclomatic 21): Application.getWeatherError has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/Application.scala"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"144915391b428eb3c3997eadc27c2c80e2d334fe6df1d9e0c1659ff348be0227"}},{"ruleId":"D1","level":"warning","message":{"text":"LinkApplication.planLink (cyclomatic 21): LinkApplication.planLink has cyclomatic complexity 21 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"accb60e4d25c524e04ed5571a43f3a9ccadae0771ac2e5c0f548bb3deac882b3"}},{"ruleId":"D1","level":"warning","message":{"text":"airport-asset.showAssetModal (cyclomatic 21): airport-asset.showAssetModal has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 9 of the 21 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 258, 284). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport-asset.js"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"c391bd4c16532a6fae7cdfa78174db2fc3171d6022e575ccaaac2ad5e92f1c1d"}},{"ruleId":"D1","level":"warning","message":{"text":"(anonymous).run (cyclomatic 21): (anonymous).run has cyclomatic complexity 21 (threshold 15). Most of this is not in the body itself: 6 of the 21 points are its own statements and the rest belongs to 4 function items inside it that branch (a function literal at line 338, a function literal at line 316, treeTraverse, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/emojify/emojify.js"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ef9a4597d170d7134891e28abc8f32755f6fe5ac3b814e44660d7df9575727a"}},{"ruleId":"D1","level":"warning","message":{"text":"ChatClientActor.receive (cyclomatic 19): ChatClientActor.receive has cyclomatic complexity 19 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/websocket/chat/ChatClientActor.scala"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"15bf413760e52ee02682d2a3a2685a9c59a3ac15546b49f9ed46d58d9923b1bf"}},{"ruleId":"D1","level":"warning","message":{"text":"airline.negotiationAnimation (cyclomatic 19): airline.negotiationAnimation has cyclomatic complexity 19 (threshold 15). Most of this is not in the body itself: 4 of the 19 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 3076, 3109, 3144). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":3045}}}],"partialFingerprints":{"codehealthFindingId/v1":"78ef2a4e32608d5322b91e03a5432437b38e563f4859ab20334dfeb60398cc2f"}},{"ruleId":"D1","level":"warning","message":{"text":"AirportAssetSimulation.simulateRentalAssetPerformance (cyclomatic 18): AirportAssetSimulation.simulateRentalAssetPerformance has cyclomatic complexity 18 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c877a7510910113a1428b5974d5ff4245407f068529471cefcc200f71a98e8a"}},{"ruleId":"D1","level":"warning","message":{"text":"AirportSimulation.computeLoyalists (cyclomatic 17): AirportSimulation.computeLoyalists has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportSimulation.scala"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"00a4780c3b81cbc2044d065b00d0ed8d33b63bbf32fbd9091bac60956141fa03"}},{"ruleId":"D1","level":"warning","message":{"text":"LinkStatisticsSource.loadLinkStatisticsByCriteria (cyclomatic 17): LinkStatisticsSource.loadLinkStatisticsByCriteria has cyclomatic complexity 17 (threshold 15). To reduce it, separate the branches: extract each independent case into its own named function so the top-level body reads as a short sequence of named decisions."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkStatisticsSource.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b9f70af9e8b954721cd1b0fecb9a313e5c2e71f201610cfc5e06842190caef6d"}},{"ruleId":"D1","level":"warning","message":{"text":"AllianceApplication.evaluateAlliance (cyclomatic 17): AllianceApplication.evaluateAlliance has cyclomatic complexity 17 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"a764613935048799402f47e555e84dee8462ad3a6755ae9bb9e592a75da2b2e5"}},{"ruleId":"D1","level":"warning","message":{"text":"SearchApplication.getLinkFeatures (cyclomatic 17): SearchApplication.getLinkFeatures has cyclomatic complexity 17 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchApplication.scala"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a262638a279e853ed3d413a502ed84f588e5981e4401e2ffef0d3841ad4b420"}},{"ruleId":"D1","level":"warning","message":{"text":"airplane.promptBuyAirplane (cyclomatic 17): airplane.promptBuyAirplane has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 4 of the 17 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 318, 351, 387, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"d88291c8f1e89f24596dfb0b98bd44fce32864fcc56807d13101dc983a53994e"}},{"ruleId":"D1","level":"warning","message":{"text":"loadOwnedAirplaneDetails (cyclomatic 17): loadOwnedAirplaneDetails has cyclomatic complexity 17 (threshold 15). Most of this is not in the body itself: 1 of the 17 points is its own statement and the rest belongs to 9 function items inside it that branch (success, success::success, a function literal at line 1216, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1111}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9e45814d8ef3176bffbfd05f1de6971207cb1d13e56ac72ff80b3f110c21353"}},{"ruleId":"D1","level":"warning","message":{"text":"LinkSource.loadLinksByQueryString (cyclomatic 16): LinkSource.loadLinksByQueryString has cyclomatic complexity 16 (threshold 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Where every arm is uniform \u2014 the same kind of value, with no behaviour of its own \u2014 a table keyed by the case is the shorter form; wherever the arms carry different data or different behaviour, keep them as cases, because collapsing those trades an explicit, reviewable set of cases for nothing."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"ab885dcbd55fe68d2111387c0609c0def57700126ac4cf57b006b9a7d632a8f1"}},{"ruleId":"D1","level":"warning","message":{"text":"AirlineApplication.getLoungeConsideration (cyclomatic 16): AirlineApplication.getLoungeConsideration has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"bfb128e50fb829c5669998483c12657cd45124da93445288d0157703bcfae4ed"}},{"ruleId":"D1","level":"warning","message":{"text":"CampaignApplication.saveCampaign (cyclomatic 16): CampaignApplication.saveCampaign has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/CampaignApplication.scala"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"104844c9544d081d3a893d573d4a5b09b4aa1eb9f6f6451ccdf08b6990793c4c"}},{"ruleId":"D1","level":"warning","message":{"text":"firework.update (cyclomatic 16): firework.update has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 2 of the 16 points are its own statements and the rest belongs to one function literal inside it that branches (line 1260). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1246}}}],"partialFingerprints":{"codehealthFindingId/v1":"a8fb40cd3cb7768521f9cf988f559f4bfc758eafd2acadfc0c591feb40bffabb"}},{"ruleId":"D1","level":"warning","message":{"text":"airline.showLinkEventHistory (cyclomatic 16): airline.showLinkEventHistory has cyclomatic complexity 16 (threshold 15). Most of this is not in the body itself: 1 of the 16 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 2090, 2027, 2049, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2004}}}],"partialFingerprints":{"codehealthFindingId/v1":"acce4b1a3a52f0bf025db386ef9b8da3658dc99b5352a69169496803a66aced8"}},{"ruleId":"D1","level":"warning","message":{"text":"alliance.showAllianceMissionModal (cyclomatic 16): alliance.showAllianceMissionModal has cyclomatic complexity 16 (threshold 15). Of this number, 9 points are the body\u0027s own statements and 7 belong to 2 function literals inside it that branch. To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5b373928efb22f98b8250fe5c2ad4f4b9c10c64d89bce40082e2ca10a87ace2"}},{"ruleId":"D1","level":"warning","message":{"text":"updateAirportDetails::success (cyclomatic 16): updateAirportDetails::success has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce3b083c2a32750fcd10cc8b3fdce6a765f25e1f9a217a06570dd63fb1e5f390"}},{"ruleId":"D1","level":"warning","message":{"text":"getLinkNegotiation::success (cyclomatic 16): getLinkNegotiation::success has cyclomatic complexity 16 (threshold 15). To reduce it, separate the cases: extract each independent branch into its own named function, and where the body has guards that only reject input, fold those into early returns at the top."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2857}}}],"partialFingerprints":{"codehealthFindingId/v1":"109c0d0f473fc13e3393ff51b3de8c01f7da17703822042516c41771820af9ac"}},{"ruleId":"D2","level":"warning","message":{"text":"airport.updateAirportDetails (cognitive 65): airport.updateAirportDetails has cognitive complexity 65 (threshold 15). Drivers by points: if/else 35 (58 pts), loops 1 (4 pts), ternaries 1 (3 pts) (nesting depth added 28). Most of this is not in the body itself: 11 of the 65 points are its own statements and the rest belongs to one function literal inside it that branches (line 112). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"24f6c062f1fe9b02dac52c1dbe244617304ba9f8a729672b03e931b339c6e2c5"}},{"ruleId":"D2","level":"warning","message":{"text":"PassengerSimulation.findShortestRoute (cognitive 64): PassengerSimulation.findShortestRoute has cognitive complexity 64 (threshold 15). Drivers by points: if/else 19 (55 pts), boolean chains 5, loops 3 (4 pts) (nesting depth added 37). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/PassengerSimulation.scala"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf3931e0748cb3319b535acdb7cafee1883dec6162a11d087ad805577dfdd83d"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineSimulation.airlineSimulation (cognitive 61): AirlineSimulation.airlineSimulation has cognitive complexity 61 (threshold 15). Drivers by points: if/else 32 (45 pts), match/switch 13 (14 pts), boolean chains 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirlineSimulation.scala"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"bd9eeaa693b1f22018d0657f8a216e83f9ce98f9c30fe2a2a189155052029dfb"}},{"ruleId":"D2","level":"warning","message":{"text":"searchRoute (cognitive 61): searchRoute has cognitive complexity 61 (threshold 15). Drivers by points: if/else 21 (53 pts), loops 2 (4 pts), ternaries 1 (3 pts), boolean chains 1 (nesting depth added 36). Most of this is not in the body itself: 2 of the 61 points are its own statements and the rest belongs to 7 function items inside it that branch (a function literal at line 165, a function literal at line 131, a function literal at line 255, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f8370fb724d282bd0a5108edebde754cdc5b8e46bf0226e4d4d4aece208d406"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.updatePlanLinkInfo (cognitive 60): airline.updatePlanLinkInfo has cognitive complexity 60 (threshold 15). Drivers by points: if/else 43 (58 pts), boolean chains 2 (nesting depth added 15). Of this number, 33 points are the body\u0027s own statements and 27 belong to 8 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2a587fc6fab89ffa06485027f9f14419b095cb38c22e11a610f91720cee7def"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.getLinkNegotiation (cognitive 60): airline.getLinkNegotiation has cognitive complexity 60 (threshold 15). Drivers by points: if/else 21 (44 pts), ternaries 5 (15 pts), boolean chains 1 (nesting depth added 33). None of this is in the body itself: all 60 points belong to 5 function literals inside it that branch (lines 2857, 2906, 2920, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2832}}}],"partialFingerprints":{"codehealthFindingId/v1":"d647f13d42184b3e7dff7108499ab34f726342fb8fb32d6165e5c0063223ce13"}},{"ruleId":"D2","level":"warning","message":{"text":"DemandGenerator.computeDemandBetweenAirports (cognitive 58): DemandGenerator.computeDemandBetweenAirports has cognitive complexity 58 (threshold 15). Drivers by points: if/else 31 (48 pts), boolean chains 6, match/switch 2 (4 pts) (nesting depth added 19). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/DemandGenerator.scala"},"region":{"startLine":170}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b94019cfa71345974d2880c4a75726b3f080ab5c3585b4b09ffb3326ef05216"}},{"ruleId":"D2","level":"warning","message":{"text":"AirportSimulation.computeLoyalists (cognitive 51): AirportSimulation.computeLoyalists has cognitive complexity 51 (threshold 15). Drivers by points: if/else 17 (38 pts), match/switch 3 (11 pts), loops 1 (2 pts) (nesting depth added 30). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportSimulation.scala"},"region":{"startLine":192}}}],"partialFingerprints":{"codehealthFindingId/v1":"7b868ab6d44d92abc850bdfadebb9a869ecaa19f7cad5112d7eab956d5343351"}},{"ruleId":"D2","level":"warning","message":{"text":"AdminApplication.doAdminAction (cognitive 48): AdminApplication.doAdminAction has cognitive complexity 48 (threshold 15). Drivers by points: match/switch 5 (24 pts), if/else 9 (23 pts), boolean chains 1 (nesting depth added 33). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AdminApplication.scala"},"region":{"startLine":57}}}],"partialFingerprints":{"codehealthFindingId/v1":"5123ece0fdc1233647add9ca811410760560e4a8f6bb09d7613cb0d821360cf1"}},{"ruleId":"D2","level":"warning","message":{"text":"GeoDataGenerator.generateAirportData (cognitive 47): GeoDataGenerator.generateAirportData has cognitive complexity 47 (threshold 15). Drivers by points: if/else 17 (33 pts), match/switch 5 (9 pts), loops 2 (3 pts), boolean chains 2 (nesting depth added 21). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb9ace50656aad6736ba08a8bdca355799333500f16ef68548b44e6af1170155"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineApplication.putBase (cognitive 46): AirlineApplication.putBase has cognitive complexity 46 (threshold 15). Drivers by points: if/else 14 (36 pts), match/switch 2 (10 pts) (nesting depth added 30). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":527}}}],"partialFingerprints":{"codehealthFindingId/v1":"2a2b57b7b712592e63b5e1169c3cbeecdc0ef0335f9bb86f7f0ddd6483b2c562"}},{"ruleId":"D2","level":"warning","message":{"text":"burst (cognitive 46): burst has cognitive complexity 46 (threshold 15). Drivers by points: if/else 29 (37 pts), ternaries 4 (6 pts), boolean chains 3 (nesting depth added 10). Of this number, 29 points are the body\u0027s own statements and 17 belong to 4 function items inside it that branch. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1746}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac145bffbe75f82c0f1d851268bec71b2aaf3513b3e52e94650373c420d4eebc"}},{"ruleId":"D2","level":"warning","message":{"text":"PassengerSimulation.passengerConsume (cognitive 45): PassengerSimulation.passengerConsume has cognitive complexity 45 (threshold 15). Drivers by points: if/else 13 (29 pts), match/switch 3 (9 pts), boolean chains 6, loops 1 (nesting depth added 22). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/PassengerSimulation.scala"},"region":{"startLine":30}}}],"partialFingerprints":{"codehealthFindingId/v1":"9595f13451332ee4e3aaba8df34780c1a4275d46ecac09d2d0e19a4cd3c63af9"}},{"ruleId":"D2","level":"warning","message":{"text":"getLinkNegotiation::success (cognitive 45): getLinkNegotiation::success has cognitive complexity 45 (threshold 15). Drivers by points: if/else 19 (38 pts), ternaries 2 (6 pts), boolean chains 1 (nesting depth added 23). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2857}}}],"partialFingerprints":{"codehealthFindingId/v1":"51d980b0caf890d058552a9fd805df4a36a9e1d579310a74e7be004bb9f2cdb3"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkApplication.addLinkBlock (cognitive 43): LinkApplication.addLinkBlock has cognitive complexity 43 (threshold 15). Drivers by points: if/else 32 (34 pts), match/switch 2 (6 pts), boolean chains 3 (nesting depth added 6). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":251}}}],"partialFingerprints":{"codehealthFindingId/v1":"d51a68ce555cd4b0f5bf96df8ac21d509b80cda3124f1fa8aa119a394f22a817"}},{"ruleId":"D2","level":"warning","message":{"text":"firework.update (cognitive 42): firework.update has cognitive complexity 42 (threshold 15). Drivers by points: if/else 14 (35 pts), loops 3 (6 pts), boolean chains 1 (nesting depth added 24). Most of this is not in the body itself: 1 of the 42 points is its own statement and the rest belongs to one function literal inside it that branches (line 1260). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1246}}}],"partialFingerprints":{"codehealthFindingId/v1":"a43fcd7f3736c42c09044cd70aa2a41934a767daa94f9d0f21671645490fc94c"}},{"ruleId":"D2","level":"warning","message":{"text":"AirplaneApplication.addAirplane (cognitive 40): AirplaneApplication.addAirplane has cognitive complexity 40 (threshold 15). Drivers by points: if/else 9 (26 pts), match/switch 3 (8 pts), loops 1 (4 pts), boolean chains 2 (nesting depth added 25). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":547}}}],"partialFingerprints":{"codehealthFindingId/v1":"471e658d8bd338b25d799faf11ab5d254715ae37ebf27507bc586788feb42c4f"}},{"ruleId":"D2","level":"warning","message":{"text":"AirplaneConfigurationApplication.putConfiguration (cognitive 40): AirplaneConfigurationApplication.putConfiguration has cognitive complexity 40 (threshold 15). Drivers by points: if/else 11 (31 pts), match/switch 2 (7 pts), boolean chains 2 (nesting depth added 25). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneConfigurationApplication.scala"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"afaa788b7527c138a0c4fdb7a2b266490d6e1887d4c4979d7460829d94c5af77"}},{"ruleId":"D2","level":"warning","message":{"text":"link-history.showLinkHistory (cognitive 40): link-history.showLinkHistory has cognitive complexity 40 (threshold 15). Drivers by points: if/else 23 (32 pts), boolean chains 8 (nesting depth added 9). Most of this is not in the body itself: 9 of the 40 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 399, 412, 443). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/link-history.js"},"region":{"startLine":347}}}],"partialFingerprints":{"codehealthFindingId/v1":"446dcee9aaaf3817fddba11a982314a406c8e1492414f17a040ca3ffd65ec674"}},{"ruleId":"D2","level":"warning","message":{"text":"updateAirportDetails::success (cognitive 39): updateAirportDetails::success has cognitive complexity 39 (threshold 15). Drivers by points: if/else 24 (34 pts), loops 1 (3 pts), ternaries 1 (2 pts) (nesting depth added 13). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"bc391dd39757a07b4ea29547f71a105f3bb0707c7b6c5dc700e980d38cd69263"}},{"ruleId":"D2","level":"warning","message":{"text":"Application.getWeatherError (cognitive 38): Application.getWeatherError has cognitive complexity 38 (threshold 15). Drivers by points: if/else 26 (36 pts), boolean chains 2 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/Application.scala"},"region":{"startLine":428}}}],"partialFingerprints":{"codehealthFindingId/v1":"63cb7f804274414d3a74753fb3a706c24350507c64b0a4179474febe2f35d651"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatClientActor.receive (cognitive 38): ChatClientActor.receive has cognitive complexity 38 (threshold 15). Drivers by points: if/else 11 (31 pts), match/switch 3 (6 pts), boolean chains 1 (nesting depth added 23). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/websocket/chat/ChatClientActor.scala"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b8d9c5eb69889d202b1653a8405d354992cb0770fe36fd4d76a01f697f48a6"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.drawFlightMarker (cognitive 38): airline.drawFlightMarker has cognitive complexity 38 (threshold 15). Drivers by points: if/else 13 (35 pts), loops 1 (2 pts), boolean chains 1 (nesting depth added 23). Most of this is not in the body itself: 5 of the 38 points are its own statements and the rest belongs to one function literal inside it that branches (line 560). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"89f5db6f4b9f397e9c004b63a02018a5b45197af06b4f77f02712a8fd8528750"}},{"ruleId":"D2","level":"warning","message":{"text":"alliance.updateAllianceBasicsDetails (cognitive 38): alliance.updateAllianceBasicsDetails has cognitive complexity 38 (threshold 15). Drivers by points: if/else 20 (32 pts), boolean chains 6 (nesting depth added 12). Most of this is not in the body itself: 4 of the 38 points are its own statements and the rest belongs to 5 function literals inside it that branch (lines 385, 369, 343, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"92779f357b335e6d7f73e3452591e6a29e8d4685dccbd68135da56d5e5b6b4cb"}},{"ruleId":"D2","level":"warning","message":{"text":"event.loadOlympicsDetails (cognitive 38): event.loadOlympicsDetails has cognitive complexity 38 (threshold 15). Drivers by points: if/else 18 (32 pts), loops 2 (5 pts), boolean chains 1 (nesting depth added 17). None of this is in the body itself: all 38 points belong to 4 function literals inside it that branch (lines 90, 159, 112, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/event.js"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"d349b9b036db671797961bfdba1e20fc48ccb54f360d768d109412d5b4b064d9"}},{"ruleId":"D2","level":"warning","message":{"text":"airplane.promptBuyAirplane (cognitive 37): airplane.promptBuyAirplane has cognitive complexity 37 (threshold 15). Drivers by points: if/else 25 (35 pts), loops 1 (2 pts) (nesting depth added 11). Most of this is not in the body itself: 6 of the 37 points are its own statements and the rest belongs to 4 function literals inside it that branch (lines 318, 351, 387, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"c880964382d39e8df2dad89bf1c9db62fe52bcdaf1c896a6a47d480eea4357b0"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineApplication.putFacility (cognitive 35): AirlineApplication.putFacility has cognitive complexity 35 (threshold 15). Drivers by points: if/else 11 (28 pts), match/switch 2 (7 pts) (nesting depth added 22). To reduce it, flatten the nesting: this score is depth rather than breadth \u2014 most of its points come from checks stacked inside one another, so the work sits several levels in. Invert each enclosing check into an early exit (a return, or the language\u0027s equivalent) so the happy path stays at one level, and where a level cannot be exited early, lift the block it encloses into its own named function."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":703}}}],"partialFingerprints":{"codehealthFindingId/v1":"598baefc1d43e90e103f4dd3e42882e401704bc67eb8824e0325a706ed8ed75a"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkApplication.planLink (cognitive 34): LinkApplication.planLink has cognitive complexity 34 (threshold 15). Drivers by points: if/else 15 (27 pts), boolean chains 4, match/switch 2 (3 pts) (nesting depth added 13). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":665}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aa0b7614bf60d127026c909bee583229868e61077da5c7dc8eac9a7c6c0d010"}},{"ruleId":"D2","level":"warning","message":{"text":"ConsumptionHistorySource.loadRelatedConsumptionByLinkId (cognitive 33): ConsumptionHistorySource.loadRelatedConsumptionByLinkId has cognitive complexity 33 (threshold 15). Drivers by points: loops 5 (19 pts), if/else 6 (9 pts), match/switch 2 (5 pts) (nesting depth added 20). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/ConsumptionHistorySource.scala"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"fda593566ef37884bbf77954ccbc8991c3293605c1f56d37ea3b8464ced23f50"}},{"ruleId":"D2","level":"warning","message":{"text":"AirplaneApplication.buyUsedAirplane (cognitive 32): AirplaneApplication.buyUsedAirplane has cognitive complexity 32 (threshold 15). Drivers by points: if/else 8 (23 pts), match/switch 3 (7 pts), boolean chains 2 (nesting depth added 19). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":385}}}],"partialFingerprints":{"codehealthFindingId/v1":"3aee499f54b721a9023dbdc8bbdf99f729b2c58e4b14e5c60763b39c052621d6"}},{"ruleId":"D2","level":"warning","message":{"text":"airport-asset.showAssetModal (cognitive 32): airport-asset.showAssetModal has cognitive complexity 32 (threshold 15). Drivers by points: if/else 27 (30 pts), boolean chains 2 (nesting depth added 3). Most of this is not in the body itself: 13 of the 32 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 258, 284). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport-asset.js"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d6f191392cb8284cc828bb73ea061cbf8bf3ef9b2547fa7631519a7ddfe01e8"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous).run (cognitive 31): (anonymous).run has cognitive complexity 31 (threshold 15). Drivers by points: if/else 12 (20 pts), loops 4 (6 pts), boolean chains 5 (nesting depth added 10). Most of this is not in the body itself: 9 of the 31 points are its own statements and the rest belongs to 4 function items inside it that branch (treeTraverse, a function literal at line 338, matchAndInsertEmoji, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/emojify/emojify.js"},"region":{"startLine":249}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f419f263122b50fed07a288f96ad13ae6fb72a937f539dee1ec15b7832901c8"}},{"ruleId":"D2","level":"warning","message":{"text":"AirportAssetSimulation.simulateAdmissionAssetPerformance (cognitive 29): AirportAssetSimulation.simulateAdmissionAssetPerformance has cognitive complexity 29 (threshold 15). Drivers by points: if/else 20 (27 pts), match/switch 2 (nesting depth added 7). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala"},"region":{"startLine":446}}}],"partialFingerprints":{"codehealthFindingId/v1":"59a899263e5c4b4d3c81ab481aeb0f8ff14b7f77b38bd9fc810977457361303b"}},{"ruleId":"D2","level":"warning","message":{"text":"alliance.showAllianceMissionModal (cognitive 29): alliance.showAllianceMissionModal has cognitive complexity 29 (threshold 15). Drivers by points: if/else 20 (26 pts), ternaries 1 (2 pts), boolean chains 1 (nesting depth added 7). Of this number, 15 points are the body\u0027s own statements and 14 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":910}}}],"partialFingerprints":{"codehealthFindingId/v1":"89eb14a8e5a9a0f33b522c6d96be78b4aaafb7b919b0b8d73c46831d5696c60b"}},{"ruleId":"D2","level":"warning","message":{"text":"CampaignApplication.saveCampaign (cognitive 28): CampaignApplication.saveCampaign has cognitive complexity 28 (threshold 15). Drivers by points: if/else 8 (16 pts), match/switch 4 (10 pts), boolean chains 2 (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/CampaignApplication.scala"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc9bceb265c0a9ac7a83596f447bcfcd4b875e8c1b8efcfe4f3a33c01b6f6229"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineGenerator.generateLinks (cognitive 27): AirlineGenerator.generateLinks has cognitive complexity 27 (threshold 15). Drivers by points: if/else 8 (20 pts), loops 1 (4 pts), match/switch 1 (2 pts), boolean chains 1 (nesting depth added 16). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirlineGenerator.scala"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"898f347f1e72bc3f872dc378970d6640830cdfe0cbd4db1bcffb2d9aaa6c3684"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkApplication.addLinkBlock (cognitive 26): LinkApplication.addLinkBlock has cognitive complexity 26 (threshold 15). Drivers by points: if/else 12 (19 pts), match/switch 2 (6 pts), boolean chains 1 (nesting depth added 11). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":188}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6f2239c029906418f6e09005d4f5d350874fcff69f5516c21efd4da531ff534"}},{"ruleId":"D2","level":"warning","message":{"text":"AirportAssetApplication.getUpgradeRejection (cognitive 26): AirportAssetApplication.getUpgradeRejection has cognitive complexity 26 (threshold 15). Drivers by points: if/else 10 (18 pts), match/switch 3 (8 pts) (nesting depth added 13). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirportAssetApplication.scala"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e42db4c893154d607f3a1ff8925caf495ac1fd30f29529cc4e24f3646b80649"}},{"ruleId":"D2","level":"warning","message":{"text":"AllianceMissionApplication.selectAllianceMissionReward (cognitive 26): AllianceMissionApplication.selectAllianceMissionReward has cognitive complexity 26 (threshold 15). Drivers by points: if/else 7 (16 pts), match/switch 3 (9 pts), boolean chains 1 (nesting depth added 15). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceMissionApplication.scala"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2649997f7f791de4b4c39460afda98a7eb363aaa435080f0def1c01f86c46ae"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchApplication.getLinkFeatures (cognitive 26): SearchApplication.getLinkFeatures has cognitive complexity 26 (threshold 15). Drivers by points: if/else 15 (24 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchApplication.scala"},"region":{"startLine":361}}}],"partialFingerprints":{"codehealthFindingId/v1":"a334950efd166cbc449bd5449588d39fdd2213931ac928da0705d176d0691cdb"}},{"ruleId":"D2","level":"warning","message":{"text":"facility.showLoungeModal (cognitive 26): facility.showLoungeModal has cognitive complexity 26 (threshold 15). Drivers by points: if/else 25 (26 pts) (nesting depth added 1). None of this is in the body itself: all 26 points belong to one function literal inside it that branches (line 98). The decisions are inside the literal, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literal\u0027s work into a named function or method at the enclosing scope and have the literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/facility.js"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"c6c97cb68547d7cd5d56a500870ec19fbeb17992d662ce2809c365374510d724"}},{"ruleId":"D2","level":"warning","message":{"text":"ranking.updateRankingTable (cognitive 26): ranking.updateRankingTable has cognitive complexity 26 (threshold 15). Drivers by points: if/else 22 (25 pts), boolean chains 1 (nesting depth added 3). Of this number, 21 points are the body\u0027s own statements and 5 belong to one function literal inside it that branches. To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/ranking.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"52ae46b9be00e98ae8b6f1385cf5de9f96f04feeaf0d890c5d79c162f2810dea"}},{"ruleId":"D2","level":"warning","message":{"text":"showLoungeModal::success (cognitive 26): showLoungeModal::success has cognitive complexity 26 (threshold 15). Drivers by points: if/else 25 (26 pts) (nesting depth added 1). To reduce it, split the body: this score is breadth rather than depth \u2014 many checks laid out side by side rather than nested inside one another, so inverting conditions into early returns has nothing left to flatten. Group the statements between the checks into named steps and move each step into its own function, so the body reads as a short sequence of named stages."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/facility.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"23fc3c4e2ede7c9d47d744b32cf741a45cbc41f1e94f5f689f61b312ea3f0d1e"}},{"ruleId":"D2","level":"warning","message":{"text":"negotiationAnimation (cognitive 26): negotiationAnimation has cognitive complexity 26 (threshold 15). Drivers by points: if/else 22 (26 pts) (nesting depth added 4). Most of this is not in the body itself: 5 of the 26 points are its own statements and the rest belongs to 5 function items inside it that branch (a function literal at line 3076, (anonymous)::callback, a function literal at line 3144, \u2026). The named helpers are already separate functions; the literals\u0027 work cannot be called, reviewed or tested from outside this body. To reduce it, move the named helpers out of the body to the enclosing scope and lift each literal\u0027s work into a named function there, so each is measured, reviewed and tested on its own, and reduce whichever one then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":3045}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8bbbe83f03d25ff3ff84d053b2c87c6d667b6495040e8423ad507d84f210f54"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.getLinkColor (cognitive 25): airline.getLinkColor has cognitive complexity 25 (threshold 15). Drivers by points: if/else 16 (25 pts) (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c6eb15b256817a162f3128261fdb9f109d6ea36ed5589fb8d06813553ff927d"}},{"ruleId":"D2","level":"warning","message":{"text":"AirportSource.loadAirportsByQueryString (cognitive 24): AirportSource.loadAirportsByQueryString has cognitive complexity 24 (threshold 15). Drivers by points: loops 6 (14 pts), if/else 5 (9 pts), boolean chains 1 (nesting depth added 12). To reduce it, break up the iteration: give each loop body a named function, and split a multi-phase loop into one function per phase so no single body carries the whole pipeline."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":234}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e044bddf3be6c04c501949acf3c21f95ed6349cc9699013fca26eb8fbc3a604"}},{"ruleId":"D2","level":"warning","message":{"text":"AssetBlueprintGenerator.generationOdds (cognitive 24): AssetBlueprintGenerator.generationOdds has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16 (23 pts), match/switch 1 (nesting depth added 7). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AssetBlueprintGenerator.scala"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"c46cf59cc5467677628172310b43957a0c5f1665a935fdcdf1907f076f85c6b4"}},{"ruleId":"D2","level":"warning","message":{"text":"Transport.availableSeatsAtOrBelowClass (cognitive 24): Transport.availableSeatsAtOrBelowClass has cognitive complexity 24 (threshold 15). Drivers by points: if/else 8 (16 pts), loops 1 (4 pts), match/switch 1 (4 pts) (nesting depth added 14). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/Transport.scala"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"28c839e5946969fa2a179467822f6ad95afed0b404194810011161abb555b847"}},{"ruleId":"D2","level":"warning","message":{"text":"AllianceApplication.addToAlliance (cognitive 24): AllianceApplication.addToAlliance has cognitive complexity 24 (threshold 15). Drivers by points: match/switch 4 (14 pts), if/else 5 (10 pts) (nesting depth added 15). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":516}}}],"partialFingerprints":{"codehealthFindingId/v1":"483ee126ad13a5c0cfe10a56011349a0e3cab1d7613e6f423cf0f48a757e1718"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.refreshLinkDetails (cognitive 24): airline.refreshLinkDetails has cognitive complexity 24 (threshold 15). Drivers by points: if/else 16 (21 pts), boolean chains 2, ternaries 1 (nesting depth added 5). Most of this is not in the body itself: 1 of the 24 points is its own statement and the rest belongs to 4 function literals inside it that branch (lines 748, 668, 701, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9bdc4e662098218507692ed1df5328e62174ea6d2f5792ad2aff4837deb2304"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkStatisticsSource.loadLinkStatisticsByCriteria (cognitive 23): LinkStatisticsSource.loadLinkStatisticsByCriteria has cognitive complexity 23 (threshold 15). Drivers by points: match/switch 3 (9 pts), if/else 4 (7 pts), loops 3 (4 pts), boolean chains 3 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkStatisticsSource.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"763da2d2561a2153d78aa28be1dda62e84538c9ec4758bd1f4c2670f92293ffc"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkApplication.planLink (cognitive 23): LinkApplication.planLink has cognitive complexity 23 (threshold 15). Drivers by points: match/switch 5 (12 pts), if/else 4 (8 pts), boolean chains 3 (nesting depth added 11). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"d0aa8745c32973815eb13250f1e8aec62f91ded1281059d6a6d9e66d7cc21f22"}},{"ruleId":"D2","level":"warning","message":{"text":"AllianceApplication.evaluateAlliance (cognitive 23): AllianceApplication.evaluateAlliance has cognitive complexity 23 (threshold 15). Drivers by points: match/switch 7 (19 pts), if/else 1 (3 pts), boolean chains 1 (nesting depth added 14). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":423}}}],"partialFingerprints":{"codehealthFindingId/v1":"2976a7cc143f666e81f349e09a0c1585747a8e6d8edb6bef93a3ce3825703522"}},{"ruleId":"D2","level":"warning","message":{"text":"ChatControllerActor.process (cognitive 23): ChatControllerActor.process has cognitive complexity 23 (threshold 15). Drivers by points: if/else 7 (11 pts), loops 3 (9 pts), match/switch 2 (3 pts) (nesting depth added 11). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/websocket/chat/ChatControllerActor.scala"},"region":{"startLine":121}}}],"partialFingerprints":{"codehealthFindingId/v1":"af1dd3f702c9526ec853d6d930bc7e747916ab536900439ea8f683651dc4a305"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.linkConfirmation (cognitive 23): airline.linkConfirmation has cognitive complexity 23 (threshold 15). Drivers by points: if/else 10 (15 pts), ternaries 3 (5 pts), loops 2 (3 pts) (nesting depth added 8). Of this number, 21 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2628}}}],"partialFingerprints":{"codehealthFindingId/v1":"fcb2c2943c33d196806fa2be42aec99050cdb3b7b9354b8acfc7e6260104a9b2"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkSource.loadLinksByQueryString (cognitive 21): LinkSource.loadLinksByQueryString has cognitive complexity 21 (threshold 15). Drivers by points: if/else 4 (10 pts), match/switch 4 (7 pts), loops 3, boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f73d4a4998297620585c5d55e536780fd5b89cacb7f22bd51b4e1ce7dff78b7"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineApplication.getBaseRejection (cognitive 21): AirlineApplication.getBaseRejection has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (16 pts), match/switch 1 (3 pts), boolean chains 2 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":296}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b30461820a6be36d87b22f011c7a5d261550aea30f7ea30ad5becafff467e62"}},{"ruleId":"D2","level":"warning","message":{"text":"ImgCommand.execute (cognitive 21): ImgCommand.execute has cognitive complexity 21 (threshold 15). Drivers by points: if/else 8 (14 pts), match/switch 2 (6 pts), error handling 1 (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/websocket/chat/ChatControllerActor.scala"},"region":{"startLine":246}}}],"partialFingerprints":{"codehealthFindingId/v1":"19e9886c3b81335bc6486b95d28a5fd542e9257f7f6d3d166498edc74518011e"}},{"ruleId":"D2","level":"warning","message":{"text":"(anonymous)::onmessage (cognitive 21): (anonymous)::onmessage has cognitive complexity 21 (threshold 15). Drivers by points: if/else 10 (16 pts), loops 2 (4 pts), boolean chains 1 (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd8d7e25563058ddf43595d99e835b8712a90d903a5af36e12667d02af2d751d"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkSimulation.simulateLinkError (cognitive 20): LinkSimulation.simulateLinkError has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (19 pts), loops 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/LinkSimulation.scala"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1aad120212ae3e65029baf2b3eff7e526f13fa67f2ce0356d2bedfa373b278a"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkSimulation.computeLinkAndLoungeConsumptionDetail (cognitive 20): LinkSimulation.computeLinkAndLoungeConsumptionDetail has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (15 pts), match/switch 4, boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/LinkSimulation.scala"},"region":{"startLine":267}}}],"partialFingerprints":{"codehealthFindingId/v1":"d64398786a60fd5026951464df7b3f856a675eb4dd7803542f68540965edd09d"}},{"ruleId":"D2","level":"warning","message":{"text":"GeoDataGenerator.adjustAirportByRunway (cognitive 20): GeoDataGenerator.adjustAirportByRunway has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (17 pts), match/switch 2 (3 pts) (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"2b38e2b971db2ba8b21a3a51d7dc808ab4017e0c93f53df1d8366daa1788b139"}},{"ruleId":"D2","level":"warning","message":{"text":"Olympics.hasUnclaimedPassengerAward (cognitive 20): Olympics.hasUnclaimedPassengerAward has cognitive complexity 20 (threshold 15). Drivers by points: if/else 7 (12 pts), match/switch 3 (8 pts) (nesting depth added 10). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/event/Event.scala"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"28f44f696cb1b4477460c7c0d3624d35152b968c99e36e6400e487223a174f22"}},{"ruleId":"D2","level":"warning","message":{"text":"AirplaneApplication.sellAirplane (cognitive 20): AirplaneApplication.sellAirplane has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 1, match/switch 1 (nesting depth added 9). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":456}}}],"partialFingerprints":{"codehealthFindingId/v1":"f43518ab158a491c68266ea3a2eac17466cb1f5b5236edfdcc881f3582414f6f"}},{"ruleId":"D2","level":"warning","message":{"text":"AirplaneApplication.replaceAirplane (cognitive 20): AirplaneApplication.replaceAirplane has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (19 pts), match/switch 1 (nesting depth added 10). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":496}}}],"partialFingerprints":{"codehealthFindingId/v1":"af7775d1370a9081001dc1b3ca4be918c55fbf98653f4d928bca60d6d452ce6c"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.showLinkEventHistory (cognitive 20): airline.showLinkEventHistory has cognitive complexity 20 (threshold 15). Drivers by points: if/else 18, boolean chains 2. None of this is in the body itself: all 20 points belong to 4 function literals inside it that branch (lines 2090, 2027, 2049, \u2026). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2004}}}],"partialFingerprints":{"codehealthFindingId/v1":"1e699e51366e73b5bb6aceee59069c76f6f24331adf819e435f730ebc3a8724c"}},{"ruleId":"D2","level":"warning","message":{"text":"airport.addMarkers (cognitive 20): airport.addMarkers has cognitive complexity 20 (threshold 15). Drivers by points: if/else 10 (18 pts), boolean chains 1, loops 1 (nesting depth added 8). Most of this is not in the body itself: 5 of the 20 points are its own statements and the rest belongs to 3 function literals inside it that branch (lines 733, 682, 786). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":675}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbbdcbfdbb5aafb3fa99796e00e38cbc72bdc9ecf0c4b4fdebfd85514c9551f4"}},{"ruleId":"D2","level":"warning","message":{"text":"prompt.showPrompt (cognitive 20): prompt.showPrompt has cognitive complexity 20 (threshold 15). Drivers by points: if/else 9 (18 pts), boolean chains 2 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/prompt.js"},"region":{"startLine":116}}}],"partialFingerprints":{"codehealthFindingId/v1":"5326b9b1512cd95d11683bc0ddef551cb2f05bbf5b4bdbaa68503d8d73d25bd6"}},{"ruleId":"D2","level":"warning","message":{"text":"GatewayAirportFeature.demandAdjustment (cognitive 19): GatewayAirportFeature.demandAdjustment has cognitive complexity 19 (threshold 15). Drivers by points: if/else 11 (17 pts), boolean chains 2 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/AirportFeature.scala"},"region":{"startLine":132}}}],"partialFingerprints":{"codehealthFindingId/v1":"902c81f35042bfdeb9efc16064afd2bd54c86d76e52207ce5a49d054f0c6a8a8"}},{"ruleId":"D2","level":"warning","message":{"text":"FlightPreference.loungeAdjustRatio (cognitive 19): FlightPreference.loungeAdjustRatio has cognitive complexity 19 (threshold 15). Drivers by points: if/else 12 (18 pts), boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/FlightPreference.scala"},"region":{"startLine":184}}}],"partialFingerprints":{"codehealthFindingId/v1":"94c21f97281042bff2a984201ad66ffa3b54c5356fe6f18e0560aa31ed4af479"}},{"ruleId":"D2","level":"warning","message":{"text":"HistoryUtil.groupLinksByStep (cognitive 19): HistoryUtil.groupLinksByStep has cognitive complexity 19 (threshold 15). Drivers by points: if/else 7 (11 pts), match/switch 3 (5 pts), loops 2, boolean chains 1 (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/HistoryUtil.scala"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"da28fa286768cc1ae50accf3f00f1aa438846144b4affa5a0d4843572361c9fa"}},{"ruleId":"D2","level":"warning","message":{"text":"SearchApplication.searchRoute (cognitive 19): SearchApplication.searchRoute has cognitive complexity 19 (threshold 15). Drivers by points: if/else 13 (16 pts), match/switch 2, boolean chains 1 (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchApplication.scala"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a98a831fe015f1909bc4c3a881b0c9cf06677584e1f6be98bda2f668f3bbc72"}},{"ruleId":"D2","level":"warning","message":{"text":"alliance.loadCurrentAirlineMemberDetails (cognitive 19): alliance.loadCurrentAirlineMemberDetails has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14 (19 pts) (nesting depth added 5). None of this is in the body itself: all 19 points belong to 3 function literals inside it that branch (lines 55, 97, 110). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"94f420e94c986f94c3e80149e0bdea9a6475e0fe8063d350e6e2343bb8136666"}},{"ruleId":"D2","level":"warning","message":{"text":"christmas.updateSantaClausModal (cognitive 19): christmas.updateSantaClausModal has cognitive complexity 19 (threshold 15). Drivers by points: if/else 14 (18 pts), boolean chains 1 (nesting depth added 4). None of this is in the body itself: all 19 points belong to 2 function literals inside it that branch (lines 29, 46). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/christmas.js"},"region":{"startLine":19}}}],"partialFingerprints":{"codehealthFindingId/v1":"acee17a2245020474118a3991441ac3991f916ad46e735ebd8590b896d272b07"}},{"ruleId":"D2","level":"warning","message":{"text":"refreshAirportExtendedDetails (cognitive 19): refreshAirportExtendedDetails has cognitive complexity 19 (threshold 15). Drivers by points: if/else 8 (15 pts), boolean chains 2, ternaries 1 (2 pts) (nesting depth added 8). Most of this is not in the body itself: 4 of the 19 points are its own statements and the rest belongs to 2 function literals inside it that branch (lines 973, 1018). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":968}}}],"partialFingerprints":{"codehealthFindingId/v1":"0058db27d8004b5e1ad12e735aef1dd2d7f9914aff48f5b07619383040e43d94"}},{"ruleId":"D2","level":"warning","message":{"text":"AirplaneApplication.validateMakeFavorite (cognitive 18): AirplaneApplication.validateMakeFavorite has cognitive complexity 18 (threshold 15). Drivers by points: if/else 6 (14 pts), match/switch 2 (4 pts) (nesting depth added 10). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":288}}}],"partialFingerprints":{"codehealthFindingId/v1":"a232507b4593763d1197cc3724ce5fa87209ef0456f143098070efd67e5f3ee1"}},{"ruleId":"D2","level":"warning","message":{"text":"NegotiationUtil.getToAirportRequirements (cognitive 18): NegotiationUtil.getToAirportRequirements has cognitive complexity 18 (threshold 15). Drivers by points: if/else 9 (13 pts), match/switch 3 (5 pts) (nesting depth added 6). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/NegotiationUtil.scala"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"cbc6d1684dd94bab9bdadde20f0d52558841a125a21a8c619c40c1851e38072d"}},{"ruleId":"D2","level":"warning","message":{"text":"airline.updatePlanLinkInfoWithModelSelected (cognitive 18): airline.updatePlanLinkInfoWithModelSelected has cognitive complexity 18 (threshold 15). Drivers by points: if/else 10 (17 pts), boolean chains 1 (nesting depth added 7). Of this number, 10 points are the body\u0027s own statements and 8 belong to 2 function literals inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1295}}}],"partialFingerprints":{"codehealthFindingId/v1":"40298c342ac2064590654837bb83c188feeca623dd7d3f70ace928b299e34d50"}},{"ruleId":"D2","level":"warning","message":{"text":"plot-fusioncharts.plotRivalHistoryChart (cognitive 18): plot-fusioncharts.plotRivalHistoryChart has cognitive complexity 18 (threshold 15). Drivers by points: if/else 7 (13 pts), loops 1 (3 pts), ternaries 1 (2 pts) (nesting depth added 9). Most of this is not in the body itself: 1 of the 18 points is its own statement and the rest belongs to 3 function literals inside it that branch (lines 1310, 1344, 1324). The decisions are inside those literals, which nothing outside this body can call, review or test on its own, so splitting the enclosing body is not the move available here. To reduce it, lift the literals\u0027 work into a named function or method at the enclosing scope and have each literal call it, then reduce whichever part then reads as the largest."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":1294}}}],"partialFingerprints":{"codehealthFindingId/v1":"32f32abe826055480b82c56223a0a3dd89a3eec3d9853a50e98de583c06501b8"}},{"ruleId":"D2","level":"warning","message":{"text":"prompt.checkTutorial (cognitive 18): prompt.checkTutorial has cognitive complexity 18 (threshold 15). Drivers by points: if/else 11 (16 pts), boolean chains 2 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/prompt.js"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"a5345d51a41564bc9553a31b6b726eb226b4bedc31dcc07f7e5fb0e056ef5fdd"}},{"ruleId":"D2","level":"warning","message":{"text":"updateSantaClausModal::success (cognitive 18): updateSantaClausModal::success has cognitive complexity 18 (threshold 15). Drivers by points: if/else 13 (17 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/christmas.js"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ce6ecb9c0a9dc2a1d8f12b73b26b23d852076f4abf30fa165ad4052e925ec01"}},{"ruleId":"D2","level":"warning","message":{"text":"AirportProfilePicturePatcher.getCityProfilePictureUrl (cognitive 17): AirportProfilePicturePatcher.getCityProfilePictureUrl has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (17 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportProfilePicturePatcher.scala"},"region":{"startLine":48}}}],"partialFingerprints":{"codehealthFindingId/v1":"626930ae4a34a0068bb200d9a84659d1915f3e9eadbacdaf25540c3ecfc0ada6"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineApplication.getAllAirlines (cognitive 17): AirlineApplication.getAllAirlines has cognitive complexity 17 (threshold 15). Drivers by points: if/else 14 (17 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"158266ba432b76cad77dd903a02dbf585c39e5061aadab6b9da69d8e81033de2"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineApplication.getLoungeConsideration (cognitive 17): AirlineApplication.getLoungeConsideration has cognitive complexity 17 (threshold 15). Drivers by points: if/else 9 (12 pts), match/switch 3 (4 pts), boolean chains 1 (nesting depth added 4). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":362}}}],"partialFingerprints":{"codehealthFindingId/v1":"a35ba9e4994358d0665efdc15dcd2d1d8c058a81dff18332354f3ef2d891fc7d"}},{"ruleId":"D2","level":"warning","message":{"text":"AllianceApplication.promoteMember (cognitive 17): AllianceApplication.promoteMember has cognitive complexity 17 (threshold 15). Drivers by points: match/switch 4 (10 pts), if/else 2 (6 pts), boolean chains 1 (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff2434424fd6de1c2b9b77986080cc9e938e24228883b88dc9eb8b50b577ba7b"}},{"ruleId":"D2","level":"warning","message":{"text":"gadgets.generateImageBarWithRowSize (cognitive 17): gadgets.generateImageBarWithRowSize has cognitive complexity 17 (threshold 15). Drivers by points: if/else 10 (14 pts), loops 2, boolean chains 1 (nesting depth added 4). Of this number, 10 points are the body\u0027s own statements and 7 belong to 3 function items inside it that branch. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"df884f411100a4ecf178f95d70b0e5eec1c1eb13d148c5c2309978ac35d2f933"}},{"ruleId":"D2","level":"warning","message":{"text":"CountryMutualRelationshipGenerator.affiliationAdjustment (cognitive 16): CountryMutualRelationshipGenerator.affiliationAdjustment has cognitive complexity 16 (threshold 15). Drivers by points: if/else 5 (11 pts), match/switch 2 (5 pts) (nesting depth added 9). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/CountryMutualRelationshipGenerator.scala"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"a113b0857cc298557a6b5aeb20221235bb7f71ed52d273b46698d4071620f898"}},{"ruleId":"D2","level":"warning","message":{"text":"GenericTransitGenerator.generateGenericTransit (cognitive 16): GenericTransitGenerator.generateGenericTransit has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (12 pts), loops 2 (3 pts), boolean chains 1 (nesting depth added 9). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GenericTransitGenerator.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"daf3ac8d07b41e91ecdb62564007150d93f4c9926d6bfd8eaf8ec261cc752b22"}},{"ruleId":"D2","level":"warning","message":{"text":"GeoDataGenerator.getRunway (cognitive 16): GeoDataGenerator.getRunway has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (6 pts), match/switch 3 (5 pts), boolean chains 2, error handling 1 (2 pts), loops 1 (nesting depth added 5). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9b2140e6fef60d759c6f5dca36e6d80fb0189bac9bf925ca1c7424e56b2f543"}},{"ruleId":"D2","level":"warning","message":{"text":"Computation.getFlightType (cognitive 16): Computation.getFlightType has cognitive complexity 16 (threshold 15). Drivers by points: if/else 13 (16 pts) (nesting depth added 3). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/Computation.scala"},"region":{"startLine":103}}}],"partialFingerprints":{"codehealthFindingId/v1":"d21fac32f8305b29b9ec7be03a50ddc196b49f53fe0152e47b6de00d0151a80c"}},{"ruleId":"D2","level":"warning","message":{"text":"AirlineApplication.putBase (cognitive 16): AirlineApplication.putBase has cognitive complexity 16 (threshold 15). Drivers by points: if/else 6 (10 pts), match/switch 2 (6 pts) (nesting depth added 8). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/AirlineApplication.scala"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"f07a8d50f2cc868681dc02b4e657ec41d369294d15dbfad4e7ad5968924bb312"}},{"ruleId":"D2","level":"warning","message":{"text":"AirportAssetApplication.downgradeAirportAsset (cognitive 16): AirportAssetApplication.downgradeAirportAsset has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 4 (12 pts), if/else 2 (4 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirportAssetApplication.scala"},"region":{"startLine":287}}}],"partialFingerprints":{"codehealthFindingId/v1":"44c84b1286012f7ba10e78eedff1c5d6b12999eb0ebe2b4fa85fe51e289816bd"}},{"ruleId":"D2","level":"warning","message":{"text":"AllianceApplication.removeFromAlliance (cognitive 16): AllianceApplication.removeFromAlliance has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 4 (13 pts), if/else 2 (3 pts) (nesting depth added 10). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":487}}}],"partialFingerprints":{"codehealthFindingId/v1":"a73a8d6ef00a0ceffbe14c88b28db5a3036e929ca04494bde38ba5887fcb27d4"}},{"ruleId":"D2","level":"warning","message":{"text":"ChristmasApplication.makeGuess (cognitive 16): ChristmasApplication.makeGuess has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (15 pts), match/switch 1 (nesting depth added 8). The drivers above price the dispatch low by construction \u2014 a dispatch is charged once however many cases it lists, while each branch inside an arm is charged in full \u2014 so most of this count is what the case bodies hold, and the arms are where it can be reduced. To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/ChristmasApplication.scala"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"750540c43036f3cc148866d92d40ed612fafd5f91d0e12f23bbba8b5ce05a4e0"}},{"ruleId":"D2","level":"warning","message":{"text":"LinkApplication.getEventHistoryJsArray (cognitive 16): LinkApplication.getEventHistoryJsArray has cognitive complexity 16 (threshold 15). Drivers by points: if/else 4 (11 pts), loops 1 (3 pts), match/switch 1 (2 pts) (nesting depth added 10). To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":1486}}}],"partialFingerprints":{"codehealthFindingId/v1":"8d8c240879316b2cd158dfec8550f3fdaccd4781a60c579e35a69c2d1df86f63"}},{"ruleId":"D2","level":"warning","message":{"text":"LocalActor.receive (cognitive 16): LocalActor.receive has cognitive complexity 16 (threshold 15). Drivers by points: match/switch 6 (14 pts), if/else 2 (nesting depth added 8). To reduce it, keep the dispatch but shrink the arms: move each non-trivial case body into its own named function (or onto the value being matched) so the dispatch reads one line per case, and group related cases into a sub-dispatch. Keep every case explicit, and make the behaviour for cases you do not list a deliberate choice rather than an accident."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/websocket/ActorCenter.scala"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"6458a8e5b5fe1bdc6f4ce9e5197f5eaa414cc383304e8ebad57a3f2d70240632"}},{"ruleId":"D2","level":"warning","message":{"text":"chat.prependMessage (cognitive 16): chat.prependMessage has cognitive complexity 16 (threshold 15). Drivers by points: if/else 7 (13 pts), boolean chains 3 (nesting depth added 6). Of this number, 14 points are the body\u0027s own statements and 2 belong to one function literal inside it that branches. To reduce it, split the body into named stages: move each independent step or branch into its own named function so the body reads as a short sequence of named calls rather than one long body."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":339}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef711f2ccb3dcd655f7a4cfb8354e6ab89a55078d1ce44a68aad22ee914e4380"}},{"ruleId":"D2","level":"warning","message":{"text":"loadOwnedAirplaneDetails::success (cognitive 16): loadOwnedAirplaneDetails::success has cognitive complexity 16 (threshold 15). Drivers by points: if/else 14 (16 pts) (nesting depth added 2). To reduce it, split the body: most of this score is breadth rather than depth \u2014 checks laid out side by side rather than stacked \u2014 so group the statements between the checks into named steps and move each step into its own function. Some of it IS depth: where a check sits inside another whose only job is to reach it, merge the two into one condition, and where an else follows a branch that already returns, drop the trailing else and let the rest of the body continue at one level."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"6808abcef73ca3bf0ed36a337bc5c595563939cc8f2ac7b6747e0db166331e3c"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Meta.createSchema: MethodTooLong \u2014 createSchema runs 502 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 402 over it, 5.02\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"865dae007741c770458bb6e95be6eae8a9a8163c86969a2562c5d77a6f6642a3"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/airline.js: FileTooLong \u2014 2119 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 1619 over it, 4.24\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3540d835e55ee8e25a5c865a399e2b381d684e8c6cc16dcb9f851959de69325"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: data/Meta.scala: FileTooLong \u2014 1876 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 1376 over it, 3.75\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba5e7e012fcb85ac702140c2f88ef50a587a842022aa2fdd3a717db274c20cb2"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SqliteMeta.createSchema: MethodTooLong \u2014 createSchema runs 299 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 199 over it, 2.99\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/SqliteMeta.scala"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"248ee0952c52e6a80abd3e7b2761e106bc5b49a86878c4fa6573736500f79415"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: firework/firework.js: FileTooLong \u2014 1215 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 715 over it, 2.43\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb0aae773ed15157147cc57ea37a9965a76f59cce360e56fa2f87db95eeff7c4"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/airplane.js: FileTooLong \u2014 1182 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 682 over it, 2.36\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d39bd8db8d0fa855a61e4aa4b3fb9ca42b1f487bcdd490e9dd7287216ebe812"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AirlineSource: TooManyMethods \u2014 68 methods. The bar is 30 methods; this is 38 over it, 2.27\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirlineSource.scala"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"913f99001cb7094a1f10641d2bf01841f7ca4a896d4cda8bde28d5b8b0dee2c6"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/plot-fusioncharts.js: FileTooLong \u2014 1067 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 567 over it, 2.13\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"01defe274a1585f3538f6c96fefc13db2d699e7d45426927d1d989235a1c28e2"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/airport.js: FileTooLong \u2014 1034 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 534 over it, 2.07\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e003f7bef3255154036ee06ae47ef1b491ada229273b95db3768d510e459d2ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: controllers/LinkApplication.scala: FileTooLong \u2014 1022 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 522 over it, 2.04\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5bc8ed941d99ede884a7b53ac6cfdebb84c5ee38f3a9958027fa257f24fe6543"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airline.updatePlanLinkInfo: FunctionTooLong \u2014 updatePlanLinkInfo runs 198 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 98 over it, 1.98\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2315a819566bb305104e3e339cc7a6566970869c318016bf616ea8e715e7f5f"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: Meta: TooManyMethods \u2014 59 methods. The bar is 30 methods; this is 29 over it, 1.97\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4b74cce48a589bd9c11b563dc5578a6b1ed6ab97fbe469935bec30047b5deae"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AirlineApplication: ClassTooLong \u2014 731 significant lines (blank, comment-only and punctuation-only lines excluded), 43 methods. The bar is 400 significant lines; this is 331 over it, 1.83\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"9510d0aadfa0ec637917fab51f0fd6274052ff1b5490916150377fb68114cde5"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: data/AirlineSource.scala: FileTooLong \u2014 858 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 358 over it, 1.72\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirlineSource.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"672cca3d7563bcec45b69dd7cc65f3040bcb9b0f22821a8a018cd85a18cf4dcc"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/office.js: FileTooLong \u2014 811 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 311 over it, 1.62\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5388793980d41cd1081dc894f873718fc1d7517ead40f795b2de2ed0404023ed"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/alliance.js: FileTooLong \u2014 791 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 291 over it, 1.58\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a6ef75a7f920c3db10121e3c4e57045ce661b56dc648aeedcec59ed873c411b"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: data/AirportSource.scala: FileTooLong \u2014 758 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 258 over it, 1.52\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e45ed323db340c14d1b9ac6b66ed82dcbc6783170559e8cf117daa544562633"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: controllers/AirlineApplication.scala: FileTooLong \u2014 750 significant lines (blank, comment-only and punctuation-only lines excluded), about 97% of them inside a single declaration: AirlineApplication (24-1161). The bar is 500 significant lines; this is 250 over it, 1.50\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff313b73d71bd2477c96f8d7dc2ae88a963a5f694ea5a0ff3aa11b3df2c90428"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airport.updateAirportDetails: FunctionTooLong \u2014 updateAirportDetails runs 145 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 45 over it, 1.45\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9cfeb0573e7615d94d39b45f6c802e096408b40d48744b783fc49ad317012e9"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Shell.burst: MethodTooLong \u2014 burst runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1746}}}],"partialFingerprints":{"codehealthFindingId/v1":"4e48676801e5d455f14e546c67e2e817722d7f15536d58cbca84a8e2f00da06d"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airport-asset.showAssetModal: FunctionTooLong \u2014 showAssetModal runs 144 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 44 over it, 1.44\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport-asset.js"},"region":{"startLine":160}}}],"partialFingerprints":{"codehealthFindingId/v1":"08e83a4c8b139592adc8f89f6dd84db7b5147c74c22c485a0988720219f4a46b"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AirlineApplication: TooManyMethods \u2014 43 methods. The bar is 30 methods; this is 13 over it, 1.43\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"c70a7a09cdd3f183e37092db767708230a305e5aaa7935fbfc411326f9de12d9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: data/LinkSource.scala: FileTooLong \u2014 709 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 209 over it, 1.42\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb9e037405fd88a4f17c6aaa2216529b1499b1fddfd31d01e3405e2160f53e9a"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: LinkSource: TooManyMethods \u2014 41 methods. The bar is 30 methods; this is 11 over it, 1.37\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1bc5a1f2565879908ab2060d5a5e69bff5c09c1c10c50bb52088f6cdd3709cc"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airline.refreshLinkDetails: FunctionTooLong \u2014 refreshLinkDetails runs 133 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 33 over it, 1.33\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":656}}}],"partialFingerprints":{"codehealthFindingId/v1":"26bc1f1d3895a9433b7005b91a9e889d18cd266dc00fab2002bde5cddfb633ea"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/search.js: FileTooLong \u2014 654 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 154 over it, 1.31\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d501a8b529d1e602ae89351bde3451a271f11704ff1279d8c1d55d28a7036e9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: controllers/package.scala: FileTooLong \u2014 632 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 132 over it, 1.26\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/package.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c1e874c01a8afc53d5172b37cba71f2009664ec77a340b5494610623e7615bb0"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airplane.loadOwnedAirplaneDetails: FunctionTooLong \u2014 loadOwnedAirplaneDetails runs 125 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 25 over it, 1.25\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1111}}}],"partialFingerprints":{"codehealthFindingId/v1":"e82c5cf7a02992aea39dda3144e3bc5d0c60a6a9a008d64cd5bb201f0fc8f4a0"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: model/AirportAsset.scala: FileTooLong \u2014 622 significant lines (blank, comment-only and punctuation-only lines excluded). The bar is 500 significant lines; this is 122 over it, 1.24\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/AirportAsset.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"56e23b8cb32a4d4f690a3c19a09e5f11318d9ec6b44130cd7854c5b9a756fe99"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: Meta.createEvent: MethodTooLong \u2014 createEvent runs 124 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 24 over it, 1.24\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":1179}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cf4d351b99610f70021714cf9c40a2dfd72675292f9b8580634efd4caa98dde"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AirplaneApplication: ClassTooLong \u2014 484 significant lines (blank, comment-only and punctuation-only lines excluded), 25 methods. The bar is 400 significant lines; this is 84 over it, 1.21\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"453948762fe8fd97aa8025c1ee93a0087b7850ef5b03585f4f152a74a73b22ca"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airline.getLinkNegotiation: FunctionTooLong \u2014 getLinkNegotiation runs 121 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 21 over it, 1.21\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2832}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b2ca9d4d334a9805ae6da0811762c7cabb0463a5115a2f357c109550b1aa30c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: AirportSource: TooManyMethods \u2014 36 methods. The bar is 30 methods; this is 6 over it, 1.20\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"c52abedc85bd39f2cbad35f031648559cda50e133e57c4c0511ec9846ef11d14"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airline.showLinkEventHistory: FunctionTooLong \u2014 showLinkEventHistory runs 116 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 16 over it, 1.16\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2004}}}],"partialFingerprints":{"codehealthFindingId/v1":"41b4180d050f21865ddfdc13df58cdf639d667684485518f501f9ae1afc73193"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: search.searchRoute: FunctionTooLong \u2014 searchRoute runs 114 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 14 over it, 1.14\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":118}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ec40c6db79a4eab8c7cf824a8b62a6cbfe4904270feaa0e16da65087ade455c"}},{"ruleId":"D3","level":"warning","message":{"text":"TooManyMethods: LinkApplication: TooManyMethods \u2014 34 methods. The bar is 30 methods; this is 4 over it, 1.13\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"99a7a11a906a51b49c9e004de9e6524ec0293ec6e2eb17e6f175bf73dab47c0e"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/gadgets.js: FileTooLong \u2014 543 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 43 over it, 1.09\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f73c17e25ce5d8ec90690614c2562f46f1e4a3cbee70df6444dd8b9b3ed23efd"}},{"ruleId":"D3","level":"warning","message":{"text":"FunctionTooLong: airplane.promptBuyAirplane: FunctionTooLong \u2014 promptBuyAirplane runs 106 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 6 over it, 1.06\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":273}}}],"partialFingerprints":{"codehealthFindingId/v1":"c93748475fa7070462af23c078f8c129138a83a419f2493466cc25ca3c8574eb"}},{"ruleId":"D3","level":"warning","message":{"text":"MethodTooLong: SearchApplication.searchRoute: MethodTooLong \u2014 searchRoute runs 105 significant lines (blank, comment-only and punctuation-only lines excluded) in one body. The bar is 100 significant lines; this is 5 over it, 1.05\u00D7 the bar. This is length, not branching: a long straight-line body scores low on complexity and is still read whole to change any part of it, so the complexity numbers beside this row neither confirm nor excuse it. To reduce it, extract each cohesive step of the body \u2014 the runs of statements that work on the same values and would earn the same name \u2014 into its own named unit, and have this one call them in order."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchApplication.scala"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d706670912c070986d759d7e3c380af5c20cc0b5d3f835f42f427e4ee30c46"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: javascripts/main.js: FileTooLong \u2014 516 significant lines (blank, comment-only and punctuation-only lines excluded; the length bar is tripled for a single-responsibility module of 4 or fewer top-level units). The bar is 500 significant lines; this is 16 over it, 1.03\u00D7 the bar. To reduce it, split the file along the responsibilities already in it: move each cohesive group of declarations into its own sibling file in the same module or package, so no one file has to be read whole to change one of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/main.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"39b7af2c77d3b776d644c45aa781623630c2b59c7ac5b681e320892ef64495e5"}},{"ruleId":"D3","level":"warning","message":{"text":"ClassTooLong: AllianceApplication: ClassTooLong \u2014 412 significant lines (blank, comment-only and punctuation-only lines excluded), 18 methods. The bar is 400 significant lines; this is 12 over it, 1.03\u00D7 the bar. To reduce it, group the members that share the same data into a smaller type of their own and delegate to it, so no single type carries every responsibility."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd19aadfd083a0f4eeb3c2c420a848f947754e6df6389f5eab292b8b950634f9"}},{"ruleId":"D3","level":"warning","message":{"text":"FileTooLong: controllers/AirplaneApplication.scala: FileTooLong \u2014 503 significant lines (blank, comment-only and punctuation-only lines excluded), about 96% of them inside a single declaration: AirplaneApplication (25-754). The bar is 500 significant lines; this is 3 over it, 1.01\u00D7 the bar. Moving the declarations that sit BESIDE it into sibling files will not shorten this file. Extract from INSIDE that declaration instead: lift each cohesive group of its body \u2014 the parts that share the same inputs and are named together \u2014 into its own unit in a sibling file, and have the original call them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"fbd9b7cc53caaa50f7a22ec40e0c5feeded70f9552b0bcb7e12c4d9d7a415d47"}},{"ruleId":"D4","level":"warning","message":{"text":"Near-duplicate member pair (235 shared lines): airline-data/src/main/scala/com/patson/data/Meta.scala:49-662 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:34-403 \u2014 These two members are variants of one another: 235 of their lines are already reported as duplicated blocks below, spread through both bodies rather than gathered into one. Read them as a single construct written twice. The repair is at the members\u0027 grain \u2014 factor the shared pipeline into one implementation the two call with their differences as parameters or as an injected step, or, where the difference is systematic (sync against async, one transport against another), generate one from the other. Extracting the individual blocks below is not the same fix: it leaves the two bodies in place and the next edit still has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"a37fd8dfade1cff90930bfd0553818a9b0fffe7465999d2d3db5bcea8c9d83b3"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (23 corresponding lines): airline-data/src/main/scala/com/patson/data/LinkSource.scala:477-523 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:525-577 \u2014 These two members are one piece of code written twice and then edited apart: 23 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":477}}}],"partialFingerprints":{"codehealthFindingId/v1":"e303f31e39ea1c035c92f2418f9d6f2e759132f9584e16616deeb89dc35f8e13"}},{"ruleId":"D4","level":"warning","message":{"text":"Edited copy of a member (13 corresponding lines): airline-data/src/main/scala/com/patson/model/alliance/AllianceMission.scala:310-326 | airline-data/src/main/scala/com/patson/model/alliance/AllianceMission.scala:328-343 \u2014 These two members are one piece of code written twice and then edited apart: 13 consecutive lines correspond almost exactly, broken only by small local edits. Most of that correspondence is NOT reported as duplicated blocks below \u2014 the edits cut it into fragments and only the largest of them clear the block floor, so the rows below understate it. The repair is at the members\u0027 grain \u2014 factor the shared implementation into one the two call with their differences as parameters or as an injected step, or, where the difference is systematic (an extra return value, one transport against another), generate one from the other. Left alone, the next edit has to be made twice and the two will drift further apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/alliance/AllianceMission.scala"},"region":{"startLine":310}}}],"partialFingerprints":{"codehealthFindingId/v1":"36b782ec14c19eed6045e32045d1fab39487ca6da16ce7d442e4312fdc1c6e08"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (20 members, 50\u002B identical tokens): airline-data/src/main/scala/com/patson/data/AirlineSource.scala:302-332 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:469-507 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:541-595 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:626-656 | airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:106-156 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:150-197 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:1089-1147 | airline-data/src/main/scala/com/patson/data/AllianceSource.scala:445-473 | airline-data/src/main/scala/com/patson/data/CitySource.scala:13-57 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:20-62 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:249-289 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:345-387 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:427-468 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:668-716 | airline-data/src/main/scala/com/patson/data/LinkStatisticsSource.scala:24-92 | airline-data/src/main/scala/com/patson/data/OilSource.scala:41-82 | airline-data/src/main/scala/com/patson/data/OilSource.scala:107-136 | airline-data/src/main/scala/com/patson/data/OilSource.scala:222-263 | airline-data/src/main/scala/com/patson/data/OilSource.scala:287-331 | airline-data/src/main/scala/com/patson/data/airplane/AirplaneSource.scala:152-194 \u2014 These 20 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 20 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 20 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirlineSource.scala"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"749eecf63a4ab3c376cf76d2fc89e8a4f943bc7793f30d4b696e7b64c6efba73"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (5 members, 50\u002B identical tokens): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:61-100 | airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:103-156 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:95-180 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:184-210 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:555-584 \u2014 These 5 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 5 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 5 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"8e5def1ae90334568d2aa900ca559b258969f65b3c6f81488bec744c911c51af"}},{"ruleId":"D4","level":"warning","message":{"text":"Members sharing a duplicated core (4 members, 50\u002B identical tokens): airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala:26-37 | airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala:168-196 | airline-data/src/main/scala/com/patson/data/DelegateSource.scala:28-39 | airline-data/src/main/scala/com/patson/data/DelegateSource.scala:407-435 \u2014 These 4 members share a duplicated core: a run of at least 50 identical tokens appears in every one of them. That run is NOT broken out as duplicated-block rows below \u2014 it is what admitted this row, and the blocks below cover only the part of it that clears the block floor, so they understate the correspondence. Read the members as one construct written 4 times. The repair is at the members\u0027 grain \u2014 factor the shared implementation out once and have all of them call it with their differences as parameters or as an injected step, or, where the difference is systematic, generate them from one template. Extracting the individual blocks below is not the same fix: it leaves every body in place and the next edit still has to be made 4 times."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"dce2dfdc17f8aca3208ccd1a7936dd2d3034dcc1d0ac32e7b5197063b9224786"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (86\u201387 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:78-163 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:42-128 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":78}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d1add1ecf787cd6a88414d44ff255e1b5c85345f1d9dc0c4564206e4619f900"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (40\u201353 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:399-451 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:240-279 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"158e728f6e61f12aab3f4428658515e67da7ec01c44165cf5d815bd5bff3fb0a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (34 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:490-523 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:291-324 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:490\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:324\u0060 calls \u0060prepareStatement\u0060 and \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:523\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":490}}}],"partialFingerprints":{"codehealthFindingId/v1":"795c86969105e1c01c4ae599c28662cf335f4b884be73e212f03c737a38a956d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (31\u201332 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirportSource.scala:738-769 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:824-854 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirportSource.scala:738\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":738}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a5cfb0d94aaad091ba3782b0fa42af30784a4431812458edb3001e58f11171d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (27 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:117-143 | airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:147-173 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"c28748ff066ce4c6e2311cb8f1ec0924f114a767541bdcdb700f8869ddd3d75a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala:175-196 | airline-data/src/main/scala/com/patson/data/DelegateSource.scala:414-435 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala:175\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala"},"region":{"startLine":175}}}],"partialFingerprints":{"codehealthFindingId/v1":"43dec597960f2db1dfd1822b0f79255da9ef886ea390c8feafa6904a4215a43c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (22 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:538-559 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:334-355 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:538\u0060 it runs out through the closing brace of the declaration holding it and carries on into the declaration that follows \u2014 the window is the tail of one member plus the head of the next, so no call can be substituted for those exact lines, and the smallest declaration that contains all of them is the type they sit in. The repeated unit is the member each site sits in: where those members\u0027 bodies are the same, move one whole member to the shared location and have the others delegate to it; where the copies are a run of near-identical overloads or wrappers that differ only in their signatures, the repetition IS the run \u2014 a one-line delegation has no helper inside it to lift \u2014 so generate the run from the set it enumerates, or accept it and keep each member\u0027s own documentation with it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":538}}}],"partialFingerprints":{"codehealthFindingId/v1":"e335e457ac8384512b5002699716e58047c83c6d1e6f844f8bb6cbd49b479569"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14\u201322 lines \u00D7 2): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:87-100 | airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:135-156 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:87\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"045f572fd07abd85a746a5fd5638e9b6c13030b29486cbd601ba784a9a521ef8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirportSource.scala:514-532 | airline-data/src/main/scala/com/patson/data/EventSource.scala:528-546 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirportSource.scala:514\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":514}}}],"partialFingerprints":{"codehealthFindingId/v1":"03f1a55fda85868f6aa6e50c02f30e77bda9e6d7c8f1743ebd615727360e3596"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17\u201318 lines \u00D7 4): airline-data/src/main/scala/com/patson/data/AirportAnimationSource.scala:46-63 | airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:417-434 | airline-data/src/main/scala/com/patson/data/EventSource.scala:312-328 | airline-data/src/main/scala/com/patson/data/LoyalistSource.scala:197-214 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from all 4 call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirportAnimationSource.scala:46\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportAnimationSource.scala"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"068e977e998168cd068830be997beb57bcc06cea08d938e2bc7720d981b42cb8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:159-176 | airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:195-212 | airline-data/src/main/scala/com/patson/data/AllianceMissionSource.scala:109-126 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:159\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ebcf31abe4aa6b51f4cdea8466cd1d123f2f76e3078e46e9c90a39138cf0fc6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 3): airline-data/src/main/scala/com/patson/data/AirportSource.scala:655-672 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:727-744 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:813-830 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":655}}}],"partialFingerprints":{"codehealthFindingId/v1":"71868c6fb1efb3676d80d3fc33189ab1b9f428667d48c976f735c7d62f0144e7"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201318 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/LoyalistSource.scala:171-186 | airline-data/src/main/scala/com/patson/data/LoyalistSource.scala:214-231 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LoyalistSource.scala"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"b0542a35a56ed6c4af23d74d6ea261f14ef75c3bbb384070847a6e1cd346db4b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15\u201317 lines \u00D7 3): airline-data/src/main/scala/com/patson/data/AirlineSource.scala:316-332 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:640-656 | airline-data/src/main/scala/com/patson/data/AllianceSource.scala:459-473 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirlineSource.scala:316\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirlineSource.scala"},"region":{"startLine":316}}}],"partialFingerprints":{"codehealthFindingId/v1":"b8f8dbc07bcb272981f1f33c431fc2b54931fb4667a35cdb78e32875e612e846"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16\u201317 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AllianceSource.scala:325-341 | airline-data/src/main/scala/com/patson/data/AllianceSource.scala:401-416 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AllianceSource.scala:325\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AllianceSource.scala"},"region":{"startLine":325}}}],"partialFingerprints":{"codehealthFindingId/v1":"e70941f4b9eaf41bbaf427e3e793eb1334152a7ea25805e7a91a8da4ae095f58"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:378-394 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:225-241 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:378\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":378}}}],"partialFingerprints":{"codehealthFindingId/v1":"b855d01a709b70958228f8c014a88ea0ed2ff17c80b3f6e36a1c3b8c77711da3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/BankSource.scala:99-114 | airline-data/src/main/scala/com/patson/data/CashFlowSource.scala:135-150 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/BankSource.scala:99\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/BankSource.scala"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb59906a0a8a339c6fb0571f942b14b2c59282d949fdfc86b36a893d158eb09e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:109-124 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:102-117 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:109\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"d83c21b46fc3c42a2fbf7e16ae8c86b6cfbbf0babe0ea46e7863389c5b965d10"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirportSource.scala:710-724 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:794-808 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0d4dfd62ba4c5276153bd1ad2a0b3f693b55a1febf961e1fa94ca3e9e4d917"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2): airline-web/app/controllers/AllianceMissionUtil.scala:22-36 | airline-web/app/controllers/AllianceMissionUtil.scala:57-71 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AllianceMissionUtil.scala:22\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceMissionUtil.scala"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"945a6db7d1c46dda0c7220642389f49f8d11c6ccfceac5d3940b4d2c4a6c6b56"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:331-344 | airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:425-438 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:331\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala"},"region":{"startLine":331}}}],"partialFingerprints":{"codehealthFindingId/v1":"70fd432db5c2bc1208e5f07d8e87b784ebd6221bafa8f0dc587e07536d41e7b1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13\u201314 lines \u00D7 2): airline-data/src/main/scala/com/patson/init/AirportGeoPatcher.scala:41-53 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:43-56 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportGeoPatcher.scala"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a5fd9806ac381364e3ced98a44050eac8668e8eb6594019c7cb14ddbed2746b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2): airline-web/app/controllers/AdminApplication.scala:189-202 | airline-web/app/controllers/AdminApplication.scala:235-248 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AdminApplication.scala:189\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AdminApplication.scala"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"9db5874387f6619413a61816211c11186c478690e3891040e816a071ca926950"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 20): airline-data/src/main/scala/com/patson/data/AirlineSource.scala:308-320 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:477-489 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:547-559 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:632-644 | airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:111-123 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:155-167 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:1094-1106 | airline-data/src/main/scala/com/patson/data/AllianceSource.scala:451-463 | airline-data/src/main/scala/com/patson/data/CitySource.scala:19-31 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:25-37 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:254-266 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:350-362 | airline-data/src/main/scala/com/patson/data/CountrySource.scala:432-444 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:676-688 | airline-data/src/main/scala/com/patson/data/LinkStatisticsSource.scala:29-41 | airline-data/src/main/scala/com/patson/data/OilSource.scala:47-59 | airline-data/src/main/scala/com/patson/data/OilSource.scala:113-125 | airline-data/src/main/scala/com/patson/data/OilSource.scala:228-240 | airline-data/src/main/scala/com/patson/data/OilSource.scala:293-305 | airline-data/src/main/scala/com/patson/data/airplane/AirplaneSource.scala:162-174 \u2014 there are 20 copies across 10 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 20 sites; resolving a subset leaves the remainder to drift apart. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060airline-data/src/main/scala/com/patson/data/AirlineSource.scala:473\u0060 calls \u0060loadAirlineBasesByCriteria\u0060 and \u0060airline-data/src/main/scala/com/patson/data/AirlineSource.scala:305\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirlineSource.scala"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d06b839b80a340ceb028cc0b014f975032daba87388dff11dbdaa3d69b2f74c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirlineSource.scala:862-874 | airline-data/src/main/scala/com/patson/data/SettingsSource.scala:58-70 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirlineSource.scala:862\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirlineSource.scala"},"region":{"startLine":862}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f1648a07df6b3d6c5e957761ea82351deeec014d4386e4ca2315ecc4f095cfb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12\u201313 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/IpSource.scala:142-153 | airline-data/src/main/scala/com/patson/data/IpSource.scala:156-168 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/IpSource.scala"},"region":{"startLine":142}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec92de222a0f1ae3a3b569460dc5f226ef671f9d75f823f8c0df9b61722ec82c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:230-242 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:152-164 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:230\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:164\u0060 calls \u0060prepareStatement\u0060 and \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:242\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":230}}}],"partialFingerprints":{"codehealthFindingId/v1":"3670d33afbd1002eada9453488fc2fa7904af5c5fd6748e3cc3d7d5b6eb13673"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:329-341 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:186-198 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:329\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:198\u0060 calls \u0060prepareStatement\u0060 and \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:341\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":329}}}],"partialFingerprints":{"codehealthFindingId/v1":"47067da0b51bcaa196ea65c21ffd7a63c888d2b28a087c4c76d4f4a8e9618beb"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:67-79 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:561-573 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:67\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0fd765b58563cf6fdf7fc93c9be2684dcf298e64abaa0370122faf76c2273ef"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3): airline-data/src/main/scala/com/patson/data/LinkSource.scala:427-438 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:489-500 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:539-550 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/LinkSource.scala:427\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060airline-data/src/main/scala/com/patson/data/LinkSource.scala:425\u0060 calls \u0060setDouble\u0060 and \u0060airline-data/src/main/scala/com/patson/data/LinkSource.scala:487\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"eb65caf2e0674a0f068cf46cdfbc81be2c8d181b8fcd82bb6b21aeb64807b974"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:217-228 | airline-data/src/main/scala/com/patson/data/AllianceMissionSource.scala:131-143 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:217\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"d68ae25aa0cd894456b5aefc300da36325fd72a8f8c8d0e9293d1c5d5e6d9996"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/IpSource.scala:27-38 | airline-data/src/main/scala/com/patson/data/UserUuidSource.scala:25-36 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/IpSource.scala:27\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/IpSource.scala"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"98761822d6e8f8f027fa4eddd657def2235b6a5cbb50abb04ebb1be54c818a56"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): airline-web/app/controllers/AllianceApplication.scala:554-565 | airline-web/app/controllers/AllianceApplication.scala:588-599 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AllianceApplication.scala:554\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"823a2fb3fc2f9fa374d94c67cf0f30a216557755d153abbc72df2f8426527c74"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AllianceSource.scala:99-109 | airline-data/src/main/scala/com/patson/data/AllianceSource.scala:220-231 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AllianceSource.scala:99\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AllianceSource.scala"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea0bfc5781cc5e170ad63dd5313b936a3febf9cf7f719d279527a98750c0f0cf"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AllianceSource.scala:290-300 | airline-data/src/main/scala/com/patson/data/AllianceSource.scala:370-380 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AllianceSource.scala:290\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AllianceSource.scala"},"region":{"startLine":290}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5fe9390a5601c532bf131c03e9190ca41a4c8335b2c736a827af75773703fd0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/DelegateSource.scala:125-135 | airline-data/src/main/scala/com/patson/data/DelegateSource.scala:252-262 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/DelegateSource.scala:125\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/DelegateSource.scala"},"region":{"startLine":125}}}],"partialFingerprints":{"codehealthFindingId/v1":"de9f7092e8db74a0603d09cb710b9d499e7a3b66aa3298d3342638042a0b1ab2"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10\u201311 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/Meta.scala:252-261 | airline-data/src/main/scala/com/patson/data/SqliteMeta.scala:169-179 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/data/Meta.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/data/SqliteMeta.scala\u0060 as WHOLE FILES: this scan already matched 8 separate duplicated blocks between them, totalling at least 250 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/Meta.scala:252\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/Meta.scala"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"06046d44850fe21226d716884e1e1305edd0a490247dfbee424f0dc5988e070c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/airplane/AirplaneSource.scala:442-452 | airline-data/src/main/scala/com/patson/data/airplane/AirplaneSource.scala:461-471 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/airplane/AirplaneSource.scala:442\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/airplane/AirplaneSource.scala"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"37ce59492e90f9c4059ba026c3fed8fd1663b1e2095526d85ab7d5e936d068d9"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9\u201311 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:235-245 | airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:360-368 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:370\u0060 calls \u0060updateModelDiscounts\u0060 and \u0060airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala:247\u0060 does not \u2014 after which the two agree again for 3 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/airplane/ModelSource.scala"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"dad4e82ab3d8721929f9542e69b586a1c7dabbafeacad9ba9b0e72ceb4c8f857"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): airline-data/src/main/scala/com/patson/model/alliance/AllianceMission.scala:313-323 | airline-data/src/main/scala/com/patson/model/alliance/AllianceMission.scala:331-341 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/alliance/AllianceMission.scala"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"12d9599ebd82fabad3cdc0a6ca4d04a81614816f1fe3b21c8e94c50866392a0b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3): airline-data/src/main/scala/com/patson/data/AirportSource.scala:674-683 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:756-765 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:842-851 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060airline-data/src/main/scala/com/patson/data/AirportSource.scala:853\u0060 calls \u0060invalidateAirport\u0060 and \u0060airline-data/src/main/scala/com/patson/data/AirportSource.scala:684\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":674}}}],"partialFingerprints":{"codehealthFindingId/v1":"25562752ec2fd12aab99d5f2873162739e96dd384c7d3fa140d034b55e03ad97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/IpSource.scala:108-117 | airline-data/src/main/scala/com/patson/data/UserUuidSource.scala:82-91 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/IpSource.scala:108\u0060 it runs out through the closing brace of the declaration holding it \u2014 the window is that declaration\u0027s tail, not a fragment that begins part-way through something, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/IpSource.scala"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"661c8540f2783e97356e5ac32f9e890c87852aac1a8307526212c60ec9f9c116"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3): airline-rest/app/controllers/LinkApplication.scala:92-100 | airline-web/app/controllers/package.scala:143-151 | airline-web/app/controllers/package.scala:227-235 \u2014 there are 3 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 3 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":92}}}],"partialFingerprints":{"codehealthFindingId/v1":"3dd4e78b2f66d4f1d29d6aeb1e77f18c38b951974fcfb7c6c80d5c54a1711ac3"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20139 lines \u00D7 2): airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala:293-301 | airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala:504-510 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala"},"region":{"startLine":293}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b0b2c95d58630ed3de64e1883543e9b4b9497a6b575abff54e116c828c26d6c"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirlineSource.scala:209-217 | airline-data/src/main/scala/com/patson/data/AirlineSource.scala:269-277 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirlineSource.scala"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc969fbd6641aec4dd6ba6486f7e7186b46f9392a90ec6f8b3b37375fa4dfb31"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:126-134 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:119-127 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:126\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":126}}}],"partialFingerprints":{"codehealthFindingId/v1":"3c27bb5e39984e8b060a2d5ce158917e21763c1755ca2b6806f002c9dd3edcb6"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): airline-web/app/controllers/AirportAssetApplication.scala:265-273 | airline-web/app/controllers/AirportAssetApplication.scala:287-295 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AirportAssetApplication.scala:265\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirportAssetApplication.scala"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"e58a997dd6e9b2078c6206bb555196b7e043e5ede731907141a1b602887c1bca"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): airline-web/app/controllers/ColorApplication.scala:61-69 | airline-web/app/controllers/ColorApplication.scala:100-108 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/ColorApplication.scala:61\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/ColorApplication.scala"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"b77729e207ec12bbdde97846e837344c338dce185767174f16d1cbc50f15fc22"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): airline-web/app/controllers/LinkApplication.scala:752-760 | airline-web/app/controllers/SearchApplication.scala:436-444 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":752}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e5e89f75149ff3385c6c185e6d2f861ecf828414102648e99cbcc0c8ce0ecfa"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8\u20139 lines \u00D7 2): airline-web/app/controllers/NegotiationUtil.scala:158-166 | airline-web/app/controllers/NegotiationUtil.scala:379-386 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/NegotiationUtil.scala"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"23ef310c879d46265b92373ee0936ffa4652b94ca834ac8caac7607effc5330f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): airline-web/app/controllers/package.scala:280-288 | airline-web/app/controllers/package.scala:305-313 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/package.scala:280\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060airline-web/app/controllers/package.scala:314\u0060 calls \u0060JsNumber\u0060 and \u0060airline-web/app/controllers/package.scala:289\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/package.scala"},"region":{"startLine":280}}}],"partialFingerprints":{"codehealthFindingId/v1":"be54e44ae85775bb2119550c9dfa17a22aed30b26ac124281a8304dfc632a514"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala:319-326 | airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala:336-343 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala:319\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/AirportAssetSimulation.scala"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"118f3b7d3cf2065dd53ad4cecc60d090f0cf1780706c6ecd9d48cbfa1d20ce34"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirportSource.scala:279-286 | airline-data/src/main/scala/com/patson/data/AirportSource.scala:934-941 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportSource.scala"},"region":{"startLine":279}}}],"partialFingerprints":{"codehealthFindingId/v1":"4c9a67b0683da9746d9e348944c9e67cee473142407b315d7230366b3522ac97"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala:22-29 | airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala:61-68 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"89ba4cd6467695fde53de875c300b448b65d657fd5781873b1a2c846f7de7e42"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7\u20138 lines \u00D7 2): airline-rest/app/controllers/LinkApplication.scala:173-179 | airline-web/app/controllers/LinkApplication.scala:236-243 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-rest/app/controllers/LinkApplication.scala:173\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. Note that the copies do not run to the end of the range shown: their LAST lines are different code, not the same code under different names \u2014 the matched region ends inside that line. Extract the lines above it, and read the last line of each site separately. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060airline-web/app/controllers/LinkApplication.scala:234\u0060 calls \u0060loadAllCountries\u0060 and \u0060airline-rest/app/controllers/LinkApplication.scala:171\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"4960ab28953ea8eb542f607b4071a16ce890e69916040256fa858612ac3d6b8a"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): airline-web/app/controllers/AdminApplication.scala:176-183 | airline-web/app/controllers/AdminApplication.scala:222-229 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AdminApplication.scala:176\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AdminApplication.scala"},"region":{"startLine":176}}}],"partialFingerprints":{"codehealthFindingId/v1":"609742a9fc7bf1d0aec829747559a220b21870a43b18948145782c92d4a0df25"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): airline-web/app/controllers/AirportAssetApplication.scala:253-260 | airline-web/app/models/AirportFacility.scala:10-17 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. Each matched range is the entire body of the declaration above it, so the region is already a complete unit: move that whole declaration to the shared location and have each site call it, rather than lifting the lines out of their bodies. Any \u0060return\u0060 inside it is the body\u0027s own exit and keeps its meaning in the moved unit."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirportAssetApplication.scala"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"b65395700e37c674233cb966b9b5dc773d3d081b3991a8bdb756856fc1f646ba"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2): airline-web/app/controllers/Application.scala:187-194 | airline-web/app/controllers/Application.scala:206-213 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/Application.scala"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b9864c14646680882f5270624bc786c0f0602005cffccc1cb4b45686abc7f76"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 5): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:67-73 | airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:109-115 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:102-108 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:188-194 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:561-567 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"588338dd40b6cb0f9d96fcfca8b46e00cdc483d9c8835e66fcd7a3a99ae3189d"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 4): airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala:29-35 | airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala:174-180 | airline-data/src/main/scala/com/patson/data/DelegateSource.scala:31-37 | airline-data/src/main/scala/com/patson/data/DelegateSource.scala:413-419 \u2014 there are 4 copies across 2 file(s) \u2014 more copies than files, so at least one file holds the block twice. Extract it once into a single shared function every call site can reach and call it from all 4 sites; resolving a subset leaves the remainder to drift apart."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/ChangeHistorySource.scala"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa6a02b61cfe366d69a5e081c08aed4db92436967842287c426257bc69ca64df"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:498-504 | airline-data/src/main/scala/com/patson/data/AllianceMissionSource.scala:270-276 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala:498\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AirportAssetSource.scala"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"e08b8132a0f96b03536024c9ab9b69088c27ae6af11f36f43ebabb46cea38abc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/AllianceSource.scala:536-542 | airline-data/src/main/scala/com/patson/data/ChatSource.scala:95-101 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/AllianceSource.scala"},"region":{"startLine":536}}}],"partialFingerprints":{"codehealthFindingId/v1":"9cddd198cc2cb7a138466c11e62c8a8037b66dc1b16f96978e8913cd3a2afe78"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/GoogleResourceSource.scala:62-68 | airline-data/src/main/scala/com/patson/data/LogSource.scala:69-75 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/GoogleResourceSource.scala"},"region":{"startLine":62}}}],"partialFingerprints":{"codehealthFindingId/v1":"1eee63f5856420ebc723f94a8a4b09b8e91ce1a87f25e590064ea58055b8c985"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/LinkSource.scala:501-507 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:551-557 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/LinkSource.scala:501\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"1363857ea10a921b3e642c61318ce8b404c8a1154b53486ce8373dd25b96e694"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-rest/app/controllers/package.scala:31-37 | airline-web/app/controllers/package.scala:90-96 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just before the matched lines, \u0060airline-web/app/controllers/package.scala:89\u0060 calls \u0060JsString\u0060 and \u0060airline-rest/app/controllers/package.scala:30\u0060 does not \u2014 after which the two agree again for 4 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/package.scala"},"region":{"startLine":31}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e75b60410426a6cda058c26846613555238b8f090e4a905e76c229b05a69d67"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-web/app/controllers/AdminApplication.scala:164-170 | airline-web/app/controllers/AdminApplication.scala:210-216 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AdminApplication.scala:164\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AdminApplication.scala"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"52b2a11725676156e8d813199a0d94f66c95560950d73bb8393c5238623d540e"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-web/app/controllers/AirlineApplication.scala:550-556 | airline-web/app/controllers/AirlineApplication.scala:588-594 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AirlineApplication.scala:550\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"6eddda8411163330c0aef82a3cda05297d885fbf291f3431891f976501c3bcd8"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6\u20137 lines \u00D7 2): airline-web/app/controllers/AirlineApplication.scala:558-564 | airline-web/app/controllers/AirlineApplication.scala:595-600 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/AirlineApplication.scala:558\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that. \u2605 These copies have DRIFTED, and that is worth reading before extracting anything: just after the matched lines, \u0060airline-web/app/controllers/AirlineApplication.scala:566\u0060 calls \u0060setCountryCode\u0060, \u0060saveAirlineInfo\u0060 and \u0060airline-web/app/controllers/AirlineApplication.scala:601\u0060 does not \u2014 after which the two agree again for 2 more lines. One of those two behaviours is the intended one and the other is what a copy-paste left behind, so decide which BEFORE unifying them: extracting the shared part will silently settle it, and if the copy that skips the call is the wrong one, that bug is already live."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":558}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c20b1f49f96d2e92b5da8a7b565ab4d48394f856396f7378d078494fad4010"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2): airline-web/app/controllers/OilApplication.scala:218-224 | airline-web/app/controllers/OilApplication.scala:247-253 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/OilApplication.scala"},"region":{"startLine":218}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b51400bb090ff0257bf87d66717565393f04790c1c9b2748baf047910b042a5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3): airline-data/src/main/scala/com/patson/data/LoyalistSource.scala:67-72 | airline-data/src/main/scala/com/patson/data/LoyalistSource.scala:175-180 | airline-data/src/main/scala/com/patson/data/LoyalistSource.scala:218-223 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/LoyalistSource.scala:67\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LoyalistSource.scala"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"893862aabd1354cb6772d06f3e8687c5b70e31fcc239383f405aafb65b8c9ae1"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): airline-data/src/main/scala/com/patson/LinkSimulation.scala:486-491 | airline-data/src/main/scala/com/patson/LinkSimulation.scala:519-524 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/LinkSimulation.scala:486\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/LinkSimulation.scala"},"region":{"startLine":486}}}],"partialFingerprints":{"codehealthFindingId/v1":"abad556120a354d404bf7e86ef0ae4ec857b83dfba5e2ee8e9eacdccc4de1958"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/ChristmasSource.scala:26-31 | airline-data/src/main/scala/com/patson/data/ChristmasSource.scala:53-58 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/ChristmasSource.scala"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"b378490244001ca4accb36e8cfcf2fe5f28d2bed8e8b66ae9a4a41b649b06518"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): airline-web/app/controllers/CampaignApplication.scala:141-146 | airline-web/app/controllers/DelegateApplication.scala:33-38 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/CampaignApplication.scala:141\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/CampaignApplication.scala"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"7e6700896c8dacacc2908391230cce289b0a1b82fd561a3c3373446a439d7ce5"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2): airline-web/app/controllers/OilApplication.scala:152-157 | airline-web/app/controllers/OilApplication.scala:168-173 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/OilApplication.scala:152\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/OilApplication.scala"},"region":{"startLine":152}}}],"partialFingerprints":{"codehealthFindingId/v1":"b5110bf51976d03fa69c192b6d362b5085bbde11e71325475ad55d7756a3203f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): airline-data/src/main/scala/com/patson/data/LinkSource.scala:439-443 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:501-505 | airline-data/src/main/scala/com/patson/data/LinkSource.scala:551-555 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/LinkSource.scala:439\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/LinkSource.scala"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"5817d7319761c2daed3ab5f1e81b3f96520dc2d91e084e9ee909b3730397802b"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:82-86 | airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:130-134 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:123-127 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:82\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"d5dc3155daf2901b025698dda9cc31c132b5a1ce7dd331818c6c3b51bbcd5efc"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 3): airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:87-91 | airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:135-139 | airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala:128-132 \u2014 before extracting anything, compare \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala\u0060 and \u0060airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala\u0060 as WHOLE FILES: this scan already matched 6 separate duplicated blocks between them, totalling at least 55 lines, which is the signature of one file having been copied from the other rather than of a helper waiting to be extracted. If that is what happened, the fix is to keep one copy and have the other call it (or delete it), which resolves this row and its siblings together \u2014 extracting one helper per block leaves the fork in place. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala:87\u0060 it begins part-way through the construct above it, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":87}}}],"partialFingerprints":{"codehealthFindingId/v1":"6522502084c39e8d6be106c939323d64e3c87c860a2bf3e9a6bc9087c76e0522"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/IpSource.scala:102-106 | airline-data/src/main/scala/com/patson/data/UserUuidSource.scala:76-80 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-data/src/main/scala/com/patson/data/IpSource.scala:102\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/IpSource.scala"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"43ea66742318b87d80792f9b9b2f12fc0dce78847064bbbced988ca00fffcbe0"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): airline-web/app/controllers/LinkApplication.scala:1206-1210 | airline-web/app/controllers/LinkApplication.scala:1226-1230 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. Read the line range as the matched WINDOW rather than a finished unit: at \u0060airline-web/app/controllers/LinkApplication.scala:1206\u0060 it does not close everything it opens, so those exact lines cannot be lifted as they stand \u2014 widen the region to the smallest complete statement or declaration that contains it, and extract that."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":1206}}}],"partialFingerprints":{"codehealthFindingId/v1":"8000a44d5c40794b8ff40dc6660b02b6a2dc2e5ff0cb3f199c0b0a657b644b49"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2): airline-data/src/main/scala/com/patson/data/SettingsSource.scala:39-51 | airline-data/src/main/scala/com/patson/data/UserSource.scala:306-317 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/SettingsSource.scala"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b2af2f4002ed110f69b1f36e5f23a219d75f08eb4cbc54b92ce75bb737e4a3f"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2): airline-data/src/main/scala/com/patson/util/AllianceRankingUtil.scala:26-36 | airline-web/app/controllers/RankingUtil.scala:19-29 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/util/AllianceRankingUtil.scala"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f20494b56c8c7744a34798d279cb3f997ad5ecc70b27704b57f87b3c6f97d140"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2): airline-web/app/controllers/ChangeHistoryApplication.scala:18-27 | airline-web/app/controllers/SearchApplication.scala:22-31 \u2014 the copies sit in sibling files of one directory, so a shared home is within easy reach: extract the block into a single shared function the call sites can all reach \u2014 a file they already depend on, or a new one alongside them \u2014 and call it from both call sites, so a change lands once."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/ChangeHistoryApplication.scala"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"8ebdc57185c4759c9aa9cce1615ac5853dfc68fc92edb046354a5e13ed610075"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2): airline-rest/app/controllers/LinkApplication.scala:33-37 | airline-web/app/controllers/LinkApplication.scala:38-42 \u2014 the copies span different directories, so extracting a shared function means choosing where it lives: put it somewhere both call sites can already reach \u2014 a location they all depend on today, or a new shared one if there is none \u2014 and call it from each site; until then, every change has to be made twice."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"099ca3e492c530504d4ca63d5a80012a40d7bb8baaae662097a491c2b8ee6142"}},{"ruleId":"D4","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2): airline-data/src/main/scala/com/patson/init/WeatherImporter.java:93-101 | airline-data/src/main/scala/com/patson/init/WeatherImporter.java:112-120 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited. The matched lines also transfer control out of the body holding them, which cannot survive a move into a called unit unchanged: have the extracted unit return that decision and let each site act on it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/WeatherImporter.java"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"609867f15f3dac9175f0b052381bfb35772d52e78367e146c7333951c3020d57"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AirlineApplication (LCOM4 23): AirlineApplication\u0027s methods fall into 23 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 23 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b67cff075046ebb74fc2f9e3f06091687480818ece9d9e81af2875e45097bb7c"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: LinkApplication (LCOM4 16): LinkApplication\u0027s methods fall into 16 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 16 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LinkApplication.scala"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"6d9aef166ab1cd0093a167aba9cc36982a01ab1f9af29a73de7cd9435f6c046f"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AirplaneApplication (LCOM4 12): AirplaneApplication\u0027s methods fall into 12 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 12 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"4dad17f84d191582820f0c54222e0b76c292b1eb4b34ad84e54d6b8e638f9fe6"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AllianceApplication (LCOM4 8): AllianceApplication\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7f024bef1a1cb01c71b48e5a1309c888034d22b8e0b75f68745f22432f4b26b"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: OlympicsApplication (LCOM4 8): OlympicsApplication\u0027s methods fall into 8 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 8 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/OlympicsApplication.scala"},"region":{"startLine":16}}}],"partialFingerprints":{"codehealthFindingId/v1":"ccec04bde380dd362a76048fb0915718b4b71887bdba2ff3a1a0c484082b239d"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: Application (LCOM4 6): Application\u0027s methods fall into 6 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 6 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/Application.scala"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"6435ea9310dfd46899fa826229c209a043fc30ae4de8eae941f879bfb9041d08"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: AirportAssetApplication (LCOM4 5): AirportAssetApplication\u0027s methods fall into 5 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 5 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirportAssetApplication.scala"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ac5bd019d53cd2f7c487aee3cd633b1906cc3127b5b73ec9d26c8fe038c479e"}},{"ruleId":"D6","level":"warning","message":{"text":"Low cohesion: ColorApplication (LCOM4 4): ColorApplication\u0027s methods fall into 4 groups that share no field and call none of each other, against a bar of more than 3 for this run (LCOM4, configurable \u2014 your repository\u0027s bar is the one quoted here). Each group is a set of methods reachable from one another through shared fields or direct calls, so 4 groups means the type has that many internally-connected clusters with nothing tying them together. Types whose shape makes a high count expected \u2014 and which would otherwise dominate this list \u2014 are excluded before this row is raised, so this is a genuine split candidate rather than a metric reading. It is still a shape, not a defect: confirm the groups match responsibilities you can name before splitting."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/ColorApplication.scala"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7d990f9e5be2b47f3867e0c1d9ec4876503aa23eac89a7d02f7597a31196dbf"}},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"695c618b12b233a8268903803b0ac58eb0fbf8643c6c94c05b570c898c1b2553"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D13","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"58d3890017c66d84419c498e438cd941a556005e7471a21e236ca8aafb5ff1b1"},"taxa":[{"id":"CWE-259","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"CWE-798","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A07:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D14","level":"error","message":{"text":"Banned license: mysql:mysql-connector-java: \u0060mysql:mysql-connector-java\u0060 5.1.49 is published on Maven Central under \u0060GPL-2.0\u0060, which this policy bans, and this repository declares it in its sbt build. The licence was read from the artifact\u0027s POM \u0060\u003Clicenses\u003E\u0060 block \u2014 following \u0060\u003Cparent\u003E\u0060 where the POM inherits them \u2014 and normalised to SPDX before it was judged, because Maven publishes the name as free text (\u0060GNU Affero General Public License v3\u0060 is AGPL-3.0). Where a POM lists several licences they are read as a CHOICE, per Maven\u0027s own documentation, so this is charged only because EVERY listed licence is banned. Replace the dependency, or record an accepted exception."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"5091f3fb1bb28232db4ad3d300655e71e1bed6259701b833ad00d09ae5154706"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO log error! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"3b8957a6de53c8aad1920a2df1db70460049bf2db99b4b2e5b40112f535a2d70"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO validate slot on airport ....probably rethink how to simplify all these calculation! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":208}}}],"partialFingerprints":{"codehealthFindingId/v1":"d2d956f011920ef768b3159e7d18753ae019530642ba3ae4adac499426852725"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO make sure you really own the airline! \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/AirlineApplication.scala"},"region":{"startLine":71}}}],"partialFingerprints":{"codehealthFindingId/v1":"60bf42f6b71180707ea65552361bfe2bef7d30c7a29a4f4c9600d2d514c553a9"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO validations \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/AirlineApplication.scala"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"e271a23ea139912d76d7cc5a3980b39353c8b62dcf2d8d816accb984e43d6d52"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO validations \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/AirlineApplication.scala"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2376bc517c683889dccdd2f81c9e22dba4f3430e68df0969e81ed5bdec3f095"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //      JsSuccess(AirportProject(airport, projectType, ProjectStatus.INITIATED, progress = 0, duration = 0, level = 0)) //TODO not implemented \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/Application.scala"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"187474e0815322e5cef8462b953d62db062b9e6522bf4dc0e616d951cd656432"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //     //TODO validate airline can do it \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/Application.scala"},"region":{"startLine":636}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed5c277971a3b17b6f0b990930994c5ac2fe4622ec799dd94b3e3b832752fbf3"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO the front end should do the splitting... \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirplaneApplication.scala"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e9506b8b205a2476b314d7113af8b4d1a2fa5187d933f150d787486ad83351b"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //todo validate the user is the same \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":530}}}],"partialFingerprints":{"codehealthFindingId/v1":"e1a98cfdf2b572ddf3273c019412713d7259e7d29ddf646128ba3672c38f7060"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //todo validate the user is the same \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":706}}}],"partialFingerprints":{"codehealthFindingId/v1":"c62141d31b5682edfe1557e9a51bc215861f03447f6b58797fcfddbd1296a353"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO for now. Maybe update to Ad event later on \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":562}}}],"partialFingerprints":{"codehealthFindingId/v1":"4826d7396f3c7d29260e4f49a1ddb0059b11148e6db921a4b2ca8944c3546fed"}},{"ruleId":"D17","level":"warning","message":{"text":"TodoComment: //TODO \u2014 source code is not a task system: move the work to your tracker and leave a reference instead (e.g. \u0060// REF: #123\u0060), so the task is planned where tasks live and the ticket links back to the code."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineApplication.scala"},"region":{"startLine":1141}}}],"partialFingerprints":{"codehealthFindingId/v1":"0f6fcdd422a5e1f30cadd3181000c8d8daf6853514365f8c0ee49669fa135814"}},{"ruleId":"D20","level":"note","message":{"text":"No ADRs found: No ADRs found. No recognised ADR directory (\u0060docs/adr/\u0060, \u0060docs/decisions/\u0060, \u0060adr/\u0060, \u0060docs/rfcs/\u0060, an \u0060ADR0001/\u0060 folder, or their siblings) exists anywhere in this tree. What was searched, so you can tell an empty log from a search that missed one: every directory under the tree (build output, dependencies and VCS metadata excepted), for a document that is either any non-index page inside a recognised ADR directory, whatever its name and however deeply nested (\u0060docs/adr/use-postgres.md\u0060, \u0060docs/adr/2024/0001-x.md\u0060); or a file anywhere whose name is ADR-shaped (\u00600001-use-postgres.md\u0060, \u0060adr-012-caching.md\u0060); or, when neither turned anything up, a document carrying the decision-record signature (an \u0022Architecture Decision Record\u0022 heading, or Status / Context / Decision / Consequences as section headings). A decision log that clears none of these \u2014 unnumbered files outside any recognised directory, without those headings \u2014 is not seen by this check and this row is then wrong. If that is your case, say so rather than renaming anything; otherwise, consider recording architectural decisions in \u0060docs/adr/\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d2bea044ff79d7d275f5a91a6e2f548586178eaf480274c33960ad020c854631"}},{"ruleId":"D26","level":"note","message":{"text":"Split airline-data: A huge data project whose namespaces are all subcomponents of one domain (model/airplane, model/event, data) and a single unrelated init namespace. Suggested: "},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"bf1dd36bfc0f37adb8509de1c6ed7184dbe5762304bcf99daf721543a7abfed7"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"da730f5496c8575f09f0bb1ccedae63072322b08e397b7e0a1e2d118b8bf0aa0"},"properties":{"commitSha":"8c3e5e2ac416f266a27c921e4e1bc428624176ee"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"32f031b5456b686687db5ccb7f396fb1c6412662e0d8a827f227136e1a88d3b2"},"properties":{"commitSha":"1527eeba4fa2f10cb8c73c1f52ef0254b205b084"}},{"ruleId":"D28","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"04ec198297eef6500445545e00fee7f72314cecc8c1e5ae8c97c44cef39dcfa5"},"properties":{"commitSha":"1527eeba4fa2f10cb8c73c1f52ef0254b205b084"}},{"ruleId":"D28","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"3cdfd7beb31b791ae18dcb425e21eb157c842e7bbcd522cc330573c1a6538db1"}},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"b8885c7d0c3cbc86b15c31fd07c095e35696ddce0e7f60a29f8fe9eb26831436"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"e665c0b302d10f9305ca7758e9ddfafc0c3de14a9cfd11d00aa97d4b4cd7d210"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1f637d207603fc4d8c8126971ee9ca307dd4ba80343703aacfd751998872126d"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"4671617575fbe98d39e1d63a4a571c3bd9254a5359dfd39efc83a355c8e899f0"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"a709d5383187bcf63b1cacec8f157dd33f2c94eeb3ef16b74170d32a59f69dec"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1a93d29fa3d53d30f9eb6e20e7db61e1de6ce2ec717b018e311ada64cb26b9bd"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"1b097fa6808a5e448409e2e9196f50a78ca987ca6bbdadcba629f99bb99e199d"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"35278fdd1f6f1bda0c17f77cfc16b5056d86faab3f4075534c2ec56ad90c7563"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"43b2e78efff947c8fb39a6542656a54060ee423f81dff754ac8b65f534a7d967"},"taxa":[{"id":"CWE-89","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A05:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"81c73eb964af63bbabf9490f02a7f875f5d582a32972a6554d1dc007016365ca"},"taxa":[{"id":"CWE-457","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"92d329b6667f866c7387a8b6bd0d318f69933e6a76c8ac412faca7867a43b08c"},"taxa":[{"id":"CWE-457","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}}]},{"ruleId":"D29","level":"note","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d5f5fca98996f63d353152feb85e993e58b8b0f5e446295bad5a93a7db260005"},"taxa":[{"id":"CWE-319","toolComponent":{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d"}},{"id":"A04:2025","toolComponent":{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61"}}]},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"d752047419dec705700cc2b33a159645b27458f827f86c83e43075a6cb37f5cd"},"properties":{"dependency":{"package":"mysql-connector-java","version":"5.1.49","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"error","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"6f6626d85ec65e4da31725dcb6fa8698b4af6acb052a758455dbcdf724a5a715"},"properties":{"dependency":{"package":"c3p0","version":"0.9.5.5","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[GHSA redacted]"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D30","level":"warning","message":{"text":"A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."},"partialFingerprints":{"codehealthFindingId/v1":"ef86836ad30f494bd2e8bf94fe3c66d58127e24d84c0d17e3c06e3af04c0f5d2"},"properties":{"dependency":{"package":"guava","version":"22.0","advisory":"[GHSA redacted]","aliases":["[CVE redacted]","[CVE redacted]","[CVE redacted]","[GHSA redacted]","[GHSA redacted]","SNYK-JAVA-COMGOOGLEGUAVA-1015415"],"reachability":{"kind":"unknown"}}}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: AdminApplication.scala \u2194 admin.js: \u0060airline-web/app/controllers/AdminApplication.scala\u0060 and \u0060airline-web/public/javascripts/admin.js\u0060 change together 87% of the time (20 of the 23 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 20 shared commits counted here, the most recent 3 are \u0060246a47ab\u0060 Admin display badge; \u006034c0604b\u0060 Admin display badge; \u00607adabf48\u0060 Admin show HQ \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AdminApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad7f50dea4be415374c3cfc61e89b402f6227ff93b91d2ac878f4477b100246d"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: AllianceApplication.scala \u2194 alliance.js: \u0060airline-web/app/controllers/AllianceApplication.scala\u0060 and \u0060airline-web/public/javascripts/alliance.js\u0060 change together 70% of the time (30 of the 43 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 30 shared commits counted here, the most recent 3 are \u006066cdc30d\u0060 Added airline login status to alliance member view; \u0060c270675a\u0060 UI fixes; \u0060a7a27a49\u0060 Alliance Mission \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AllianceApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a15ec4442fa61cd3329c41788995a92ca13c9f692792a31de1f45a76a7a428b"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: EventSource.scala \u2194 event.js: \u0060airline-data/src/main/scala/com/patson/data/EventSource.scala\u0060 and \u0060airline-web/public/javascripts/event.js\u0060 change together 67% of the time (8 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u006039728987\u0060 Notification (pending action) for unclaimed Olympics rewards; \u00603e1d02df\u0060 Completed Olympics implementation; \u0060a7f8c051\u0060 Olympics stats and goal \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/data/EventSource.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f36d3f5cd2118ca30e96a9106c4c497e8525d41baefde40f86fe03773bcabb5"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: LogApplication.scala \u2194 log.js: \u0060airline-web/app/controllers/LogApplication.scala\u0060 and \u0060airline-web/public/javascripts/log.js\u0060 change together 67% of the time (8 of the 12 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 8 shared commits counted here, the most recent 3 are \u006022ceceb8\u0060 Push log highlight logic all to js; \u00603848c973\u0060 Highlight log with color; \u0060471726bb\u0060 Highlight log with color \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/LogApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c4418aa2b547705f28110d5b796f58b02984faad5fc0405d2c5f97392e22459"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: SearchApplication.scala \u2194 search.js: \u0060airline-web/app/controllers/SearchApplication.scala\u0060 and \u0060airline-web/public/javascripts/search.js\u0060 change together 65% of the time (15 of the 23 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 15 shared commits counted here, the most recent 3 are \u006006802596\u0060 Requires authentication for route search; \u0060ece92e79\u0060 Minor search improvement on previous names; \u0060484bc9d4\u0060 Airline rename implementation \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"db472ba0db947243e5379b5c575a3f4f496cfe7879fae6d3f71469e2d5f52a52"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: OlympicsApplication.scala \u2194 event.js: \u0060airline-web/app/controllers/OlympicsApplication.scala\u0060 and \u0060airline-web/public/javascripts/event.js\u0060 change together 56% of the time (10 of the 18 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 10 shared commits counted here, the most recent 3 are \u006039728987\u0060 Notification (pending action) for unclaimed Olympics rewards; \u0060b556338c\u0060 #656; \u006004cb80a2\u0060 More flexible airline modifier/reward system \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/OlympicsApplication.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"501ff25466baff745feadec4d3f6a0c6fac7abe153de274a129711a0314f1aa1"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: ChatControllerActor.scala \u2194 chat.js: \u0060airline-web/app/websocket/chat/ChatControllerActor.scala\u0060 and \u0060airline-web/public/javascripts/chat.js\u0060 change together 52% of the time (13 of the 25 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 13 shared commits counted here, the most recent 3 are \u0060b3ec2b21\u0060 disable embedded image in chat for now to avoid tracking exploit; \u0060b92b3d48\u0060 Added debug for still missing clock; \u0060c35d4b4b\u0060 Alliance changes https://github.com/patsonluk/airline/issues/413 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/websocket/chat/ChatControllerActor.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e686b9755b923f5e04f74e6cf23a5b084a7de3b850e22fe2871061bbb2705950"}},{"ruleId":"D35","level":"warning","message":{"text":"Change coupling: RankingUtil.scala \u2194 ranking.js: \u0060airline-web/app/controllers/RankingUtil.scala\u0060 and \u0060airline-web/public/javascripts/ranking.js\u0060 change together 50% of the time (7 of the 14 commits that touched whichever of the two files changed less often, counting a file under its earlier names as well \u2014 a repo-wide or module-wide sweep is evidence about the sweep rather than about any pair inside it and is left out of BOTH sides of this ratio, while a dependency bump, a formatter/rename sweep, or a commit whose edit to one of the two files was a tool directive such as //go:generate or whitespace only is left out of the shared count ONLY, so the two sides are not taken over identical commit sets) and are written in DIFFERENT LANGUAGES, so no import can join them and they cannot be co-located into one unit \u2014 they compile and ship as separate artifacts. What binds them is a CONTRACT across that boundary \u2014 an event or message name, a route, a serialised shape \u2014 that each side currently spells out on its own, which is exactly why a change to one drags the other. Declare that contract once where both sides read it (a shared schema, a generated constants file, an interface-definition file) so a change on one side fails the other\u0027s build instead of drifting silently; where the surface is too small to be worth that, name the counterpart in a comment on both sides so the next reader finds it. There is nothing here to merge. You can check this without leaving the row: of the 7 shared commits counted here, the most recent 3 are \u0060b3a868e4\u0060 More ranking; \u00605eabcdec\u0060 Extra ranking categories : international and domestic pax; \u0060f6aa8def\u0060 Ranking to show more about current airline if it\u0027s outside of 20 \u2014 run \u0060git show\u0060 on any of them."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/RankingUtil.scala"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3be71c66fa8bf6c19c02b86a8d1877d0190b41b39e4e933f13aa2d6dfa5b2bc"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"29f4958a06822fe62164dff6f092f57461e94a0f29f32079f114a5246d7fd372"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":45}}}],"partialFingerprints":{"codehealthFindingId/v1":"396eb5b5f95da9dbbdfbf5200a53b038e8fad2b1ed425739b0efc8f4ce638c83"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":46}}}],"partialFingerprints":{"codehealthFindingId/v1":"9003699720292de27461c0ff267ebb7fa426e7adf60afa38c6d4e17fed6beaa2"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":55}}}],"partialFingerprints":{"codehealthFindingId/v1":"490440d9d6b76019d083ca1095ea4080956865bb0f51a4aece451d9616d9866c"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c86d27bbfcbb2ea1f987be95ef7df8dbe03a78d2e87ef5435813722e137e4a8"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":64}}}],"partialFingerprints":{"codehealthFindingId/v1":"bccc912db14fcbe96210463e3fccc58a1fd089ac93c057370b9783cda7fbcd19"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"3a4a8a88253f3dae6b8a9fa9b3d7ac99b304a5674391f8cbff2c85cf972e6e50"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"bde00961d9047245ef6e2bee2713e08667844a441297ffd13f6dc7753c5bb9e2"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":73}}}],"partialFingerprints":{"codehealthFindingId/v1":"b92d54c844908dbf5c40dcefdb2de1688502d728dabcf1bb1b387b832cc264f6"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":81}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e9fd5a1faf0ffd08d65d78673db953e16c7364e3e3dd008c8414d7a56f18679"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":82}}}],"partialFingerprints":{"codehealthFindingId/v1":"3685ad7cd4b103e67f6af99e8b1669de9e48c3bc0fb621de8c7b8345539ea812"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":93}}}],"partialFingerprints":{"codehealthFindingId/v1":"12afe60090d46b5620fcf1716870da2cca984e557bdb318c47b7971ccd13c729"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"38db319aa35556c19c86eb78ee04ed9d1178506db14f11608827a37ad1e10eb7"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"14c652af5f8e49211011c9cd7972252ee496ed02c784f3feabcc06868b6c8aac"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d1d4ed38fb78d39bd24da018f567e42a3df0836263f49e450d2fd91a86eacc0"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"42866b96e708294ec23ba3db9d07061e973a6c5277e30bc3defa1fc3350a2662"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":260}}}],"partialFingerprints":{"codehealthFindingId/v1":"797d11c623c9a62dad6768ed8489d12cdd603de86ddcfc453d4cbe42990f0b3a"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":284}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd55a320f08bc8404d97079ce187f09f62782b72c79bb2fdd39e7b9021033419"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4867}}}],"partialFingerprints":{"codehealthFindingId/v1":"a2e7e90fb481f6bb1ef3a694b18e093c8b7f9d4f40eb44d7707034d3c148058c"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4869}}}],"partialFingerprints":{"codehealthFindingId/v1":"801f0c7147addd6fadcec0909ae7c30ba0c9e8cfdfbc400697134aa017b4c212"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"a3f4a8d7d40a939f319d4131470dea7192f6e9cf988573e8e60e194b4467c985"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":86}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e894f56fb5489fcdcaee2217cfd6022ca5db9e2d41dc3bd5a0f94683a182d94"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":105}}}],"partialFingerprints":{"codehealthFindingId/v1":"25144d3da9873f98427fca906ce76552d9520f75fafb03ad1d66ccfdd5206448"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":124}}}],"partialFingerprints":{"codehealthFindingId/v1":"01a7ed10abebd714687c434ea0b62cf42c97ff97b990b6c2d77958a663715260"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a9da270e6b2d74d7d1358cc9fae69a5acad71822f32d686afb9c8c44469c573"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"e97dc674698210835e200af89d0a43efee0e3a70608e397d3bac511162930085"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":181}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7d32134d2acfe2d4ec151710e549dffaf67e9d3621a26de2ee7888055122b59"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":214}}}],"partialFingerprints":{"codehealthFindingId/v1":"53ad84598d8519a88f6929666d9e7792f00750851c5054a883eb9a6cdf28fc5e"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":235}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea5ad70b4367374039e8d05fc97c0bbe83fbfcdb2b165a11903c36e1583cbef7"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":256}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6d0abd354958c01f91af387689fe7852ffceb36b185027f543af3ca90a5979f"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":277}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3fa8bba7ae4ea921bb322f6ff4b3dab9b2f4ec4163ca0342ce680ecfddd3c23"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":298}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4d2f2bfd89c2f70ff23ed123d54ccbc3a89fc5ec03d12b1bba206a26f557112"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"f9b78e86cfcc0f3808ebbd88271d92092cb62e39095f50d3a6fbb1faf0a9f434"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c68ca419ab0813bca5859000f07a5280112617edba57fe5e13388c9e4a13682"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":452}}}],"partialFingerprints":{"codehealthFindingId/v1":"715fcbce718d2a3eaff145b38a05c08d81aa4c0b6bca76bc905d8fbd5c918c95"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":482}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ae3d3d8cda95edac373ee79ac2969dd01b46a5d0695a3dc35b590ae65470a29"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":537}}}],"partialFingerprints":{"codehealthFindingId/v1":"25a3b370bb871c14c5fd5cc523bad9054428cb131cba4f826b8bda93e4a9a276"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":550}}}],"partialFingerprints":{"codehealthFindingId/v1":"41382f0281e54d14d94c39759c35488de5be096d14ddcfbbb805a01f3ad58672"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":563}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3df36b099e9a2b5601b58c2b37d4ff1a182d53ea0a4ea156fa6e6ef116f3c83"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":576}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc3f09e4f163808fa25586002caad02c0aa926c16eabc3e64587b6c8c60996d9"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":589}}}],"partialFingerprints":{"codehealthFindingId/v1":"abe8805ba86f4c465a55a73290483ea9502c3e6759e68536effad40d2221ec01"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":602}}}],"partialFingerprints":{"codehealthFindingId/v1":"a80a047caafee2cde8197afc70456b3b51c948f353e421c362c8c2ebee851223"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":615}}}],"partialFingerprints":{"codehealthFindingId/v1":"15d86ac1d95dfa0bf847d53378a52d35d8817ddac5b487d2633977befbfa75d6"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":628}}}],"partialFingerprints":{"codehealthFindingId/v1":"16d3b448ba75d585162cb4cf6b53ef15040473852783c001ebc331d3e0660323"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":939}}}],"partialFingerprints":{"codehealthFindingId/v1":"f7bfda9b3dc01d3c070d72b395edec41f791498016b7d999ac3c18f2e8944bf4"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":940}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd22d7a79792668cf4793f646391f92d227531f7b2010d0543381e4b1ce8cd2f"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":941}}}],"partialFingerprints":{"codehealthFindingId/v1":"1d7d50f0ba3e27233b8fab0f38f5b0ac869ba72365c1a447d2ccc7a0f409676a"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":942}}}],"partialFingerprints":{"codehealthFindingId/v1":"a47805c7e8e690f2c51914488b7dc769814210472dfa36113fd29bbf54726332"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":943}}}],"partialFingerprints":{"codehealthFindingId/v1":"796edfb8694e67c4b4ccb5708874e447275c71defe4eb98a264f3bf44be204f6"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/html/announcement.html"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"17d81d9e838eb06265c54865bce3f3eb74d03a3871bbf0445537863e38c2fa85"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/html/tooltip/capital-gain-loss.html"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"26791f1936939b843294dcb7b866cf09855eaf3c1da774a31f62a6bf9705bb58"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"7049f14f61e2068a501c83b215a136cf48a7a312ab6fbd01a7ec84221a38adda"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":85}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef60b206a92a68c113acfefb8db3ceac39f8368b82d8056680410baf2fe5381f"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"8b4a0b6678a8f382c05328242c4f762c41ba21661bcd65c21104d533082467cf"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"41c38d9798a2e5dca3292c1ec99b27d32496b5f82ed5f0aacbc7a6464af8c999"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1148}}}],"partialFingerprints":{"codehealthFindingId/v1":"82a1e17fb7661683c568371cab8bb38839df5f2cc7eb1ec7fd37fa17853b1152"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1436}}}],"partialFingerprints":{"codehealthFindingId/v1":"165ad97bab0f759a96000af78460b884df33794c5c4e0825a4e1d21d6f099bb1"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1440}}}],"partialFingerprints":{"codehealthFindingId/v1":"0daad722da5c52d3422be389bb4b5417d85a0bd194b22b0f8ba535ae003059ab"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1452}}}],"partialFingerprints":{"codehealthFindingId/v1":"009bfcb4d2cfd4d8e9346ecad60f4e255d11abeab30aa561c2c9acb739b5dd98"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1456}}}],"partialFingerprints":{"codehealthFindingId/v1":"c2be51ed7edd0d43a0ec6e9a96f799061083d393bae269e9d9b1908689b49683"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2016}}}],"partialFingerprints":{"codehealthFindingId/v1":"55c59bbb7a08ea1ad30e3d5dee420f704a2c31e16290aa15e7ed45971c6977a6"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2245}}}],"partialFingerprints":{"codehealthFindingId/v1":"a6c0e29dafb73124bd1780449c7cc9524f61b99416fb1931b0ec97cc0efe9619"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2329}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a37bd945169d82164d83e0142e157f7d029a65ae865406ddcbba83ad22d4cb7"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2333}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbcea17ab39895cd1046a01733d3e7a0a4aebf3d85d7890fc45eb1201c94b31b"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2337}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee076090c7afe73902650ba09961fa643d76d65ebb578be440d670a33082821d"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2383}}}],"partialFingerprints":{"codehealthFindingId/v1":"27660a1de868e0b2d22338d8b7251d905c793de132218e41d6a62e7f18b36972"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2455}}}],"partialFingerprints":{"codehealthFindingId/v1":"52db96e1121c01af3cfcc51e9135e9cee1a9bc74646cd480190fd8810845c9dd"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2595}}}],"partialFingerprints":{"codehealthFindingId/v1":"62e9a105f63ceb9cb3b3d7598723c6a79743fcabdafbe89f91957dffd77a5406"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2598}}}],"partialFingerprints":{"codehealthFindingId/v1":"cd9d8968015827bcec23a8c6a778d81b081af166c75d92754b8540223fdbca59"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2651}}}],"partialFingerprints":{"codehealthFindingId/v1":"663828bfa838396b1a1a8290b7a8c3c94372b5a6a2785ad664402c9359cb6da0"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2691}}}],"partialFingerprints":{"codehealthFindingId/v1":"83385fcfea2b3bcc999f6f6f76d6459ac11f36a4d937750ec06b5f1b880a7ce8"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2722}}}],"partialFingerprints":{"codehealthFindingId/v1":"4df41590f55501d947ef749a3a9e4716e74f3f91abd4879899b9da331a385f1f"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2815}}}],"partialFingerprints":{"codehealthFindingId/v1":"36451fc96d01cf8e1c6409bd21f9b65da63409a9e3dfa09a7d268b9329861844"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":3074}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb0d24f1186cf620162b68b0b6b9296eca6555c3a036926c08192a18eecca237"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"4777a21f4f420aedaf54df027094521c1c93b920dc6b29c052a6e1d077b11db2"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"761b7ea891a3c0b028a371060c69912326e80e83b914514a161877cd13b0208a"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":209}}}],"partialFingerprints":{"codehealthFindingId/v1":"743675e073c1b0ca539357e4dc8ae2e247a807935e0e5ff302266cea8a49a4f1"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":229}}}],"partialFingerprints":{"codehealthFindingId/v1":"08ac91a3f312beb3106053bc8705cb57f352ccd674e8c747d3bb7e403976ef49"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"3efeaa8c0cf68bbccbcefb2f9887bddaf7c2c5a826352fa041dc995bf72689b7"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":289}}}],"partialFingerprints":{"codehealthFindingId/v1":"3633b4d7c74f3de46b96b5c346b4eaafd733c455c25776a9ecadcd25ba2c19ef"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":309}}}],"partialFingerprints":{"codehealthFindingId/v1":"5df32462fc9791b0262c359e185bfbcdb4fe6479a304f2a6896ad7f9b6631535"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":311}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a0293a485f47f63b49b009c7e34fcd955575058d31236d11682f56a2852b349"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":313}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c9fa29854c8ac58270248b0312b8de2ea7d26be0932d8861fa9045ea6a87069"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":333}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e6c69ab03b883c7182689a38e19cc1f91eaac65c38a3e818d30c40f5aae7093"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":352}}}],"partialFingerprints":{"codehealthFindingId/v1":"054cdcbad8619ecb386c54b02a2157c41115723944346cf216a1a2f35f7c5808"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":354}}}],"partialFingerprints":{"codehealthFindingId/v1":"542eb0f36e1e106e951578a032ffb4df11d7ee9f53904957bc9a4702944795af"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":383}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ae86c1990948941a65d1abd0ce457137e1c2abeeb7fc36c37944f184803e0de"}},{"ruleId":"AC1","level":"error","message":{"text":"\u003Cimg\u003E without a text alternative: An image with no alt (and no aria-label/aria-labelledby) is unreadable to assistive tech. Add alt \u2014 alt=\u0022\u0022 if it\u0027s purely decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3933bf7663c16069fb15294707814d3d02c6201eebe3311d6c5522b95be5bb5"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotId.scala.html"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"9094561fb26245f8103aad442d802117a47973a98dc599dd537127e6a2c1fe93"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotPassword.scala.html"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"cf34e0c06e8d84f0435234aa32541c716f3ea9ac8fb0df41dc701a84d13525ec"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"c0f6364971381afe95831ab6c81691bbb696e8e8cb458a5837e50c1629c77b33"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":158}}}],"partialFingerprints":{"codehealthFindingId/v1":"861fa776ccca59d6fee431a057c87c4f65bd4a0641620367e463f2cfb6f09903"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":159}}}],"partialFingerprints":{"codehealthFindingId/v1":"f08b7cc9c01b93ab2f8796484c06f2e495566894f2cf4f9b97afc6935c97249d"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":162}}}],"partialFingerprints":{"codehealthFindingId/v1":"1181f7002589d544cdd0c0cc5e8ce2eb2af1044376b7702e96aaf51fbbf5fa16"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":163}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3c950527e7a43422cd12ff62aa2a178c7b31d94934ce737ac3a910652a20135"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"892e6aab19b55dd36a7557de8de84be21713413a246ee71e981bec69b9825132"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control named only by title on \u003Cimg\u003E: This \u003Cimg\u003E carries a click handler, which makes it a control, and its only name is a title attribute. A plain element maps to role=\u0022generic\u0022, which does not support a name from the author, so the title is announced as nothing at all \u2014 it is a mouse-only tooltip, unreachable on touch. Give it role=\u0022button\u0022 (which it needs anyway to be operable) so the title becomes a real name, or add an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"d184c30529c41a83b82a1d0ccd1461facad1495bbae191aba438fdf261fb71d1"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel for\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":254}}}],"partialFingerprints":{"codehealthFindingId/v1":"61089969729c8c6a4b0b1a50535356d7f4ed9e459856948e94b675f9d334b126"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has only a placeholder \u2014 a placeholder is not a label (it vanishes on input and many AT ignore it). Add a \u003Clabel for\u003E, a wrapping \u003Clabel\u003E, or aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f1ccb155e5bdab6da15b3cda492ac32f5c05a586272cb762cdd4414ddd3ab49"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cdiv\u003E: This \u003Cdiv\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4540}}}],"partialFingerprints":{"codehealthFindingId/v1":"b60d26d9fe30be36221c13a17302125812920a0729a38d194445407a6aeaedc3"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/passwordReset.scala.html"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"b92412c64d23309bcdd41de07f534a855d3ac7db173890b3af18cac86926e968"}},{"ruleId":"AC2","level":"warning","message":{"text":"\u003Cfieldset\u003E without a \u003Clegend\u003E: A fieldset groups related controls but has no \u003Clegend\u003E to name the group. Add a \u003Clegend\u003E as its first child \u2014 or, if the group already has a visible caption beside it (or the fieldset is there only to disable its subtree and carries no group box), point aria-labelledby at that caption\u0027s id instead, which names the group without rendering a second one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/signup.scala.html"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"f31e16a34b6a14a1c6a5fbd8b3bc3735dbc7033af3b49cb54e892800d8233f7b"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":20}}}],"partialFingerprints":{"codehealthFindingId/v1":"3d24ad1e357fad6b416085a6254abccfc4556986f22413ca8053b1d7d2022142"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":22}}}],"partialFingerprints":{"codehealthFindingId/v1":"e69ce56e9e87073f80c409f36e8a84772c04208e5a692949688f54bf6f8077ae"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec70b64e35e13b47115c43f6c99cec6522bc9b26e6d2f78f9b56e811308fb0fe"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"b72cdd2600475e360f5d6aac67880e4cb16e0e8c2993de2a0bddf087a782b705"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":25}}}],"partialFingerprints":{"codehealthFindingId/v1":"799fef481b2b1265da4e55fbf8989f34986f12408ab559ae8cde1c59660ea6f2"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":26}}}],"partialFingerprints":{"codehealthFindingId/v1":"f081004e426ccac2a3a4021ba4882f095c22762ceec16890ec2a2d55e87a73c3"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":32}}}],"partialFingerprints":{"codehealthFindingId/v1":"448fe825777287df6422ffaedc064cbfc4ff56e9ca6dba98754dab20cd88a615"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":33}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3c7801f90964a0914ac26de9bdfa167713fe0106c3012b8793031498679e075"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc64867425cad7dd6dccf2e9dcfd335401442eb3654079185620c95f6ed1c246"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":438}}}],"partialFingerprints":{"codehealthFindingId/v1":"711adc661589c6e377f1f862daf74f3c0c7128303fca993a811f6c6e48614a87"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":439}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d78ba8907b9824a7933bf96e180e725bb32ae1142047bf9d7deb90e664ebd22"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":440}}}],"partialFingerprints":{"codehealthFindingId/v1":"85107a843b6fa2368c2ef606a67d24c432e24cc0152cc2452cad035451c1e3af"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":441}}}],"partialFingerprints":{"codehealthFindingId/v1":"9234c35847e660edc38561fa5f2e3716f0b755d0044115ddabcbc0a79a20a9bf"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":442}}}],"partialFingerprints":{"codehealthFindingId/v1":"2534226555fece62421308be0a641faa9335e29c0f75729af8d67eb41d348f6c"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":468}}}],"partialFingerprints":{"codehealthFindingId/v1":"db11ba7d8573799c755fb4989308f995c35d105bb6b68babeb5958b8be2e4ffe"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":469}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b8a39962784aacfad6e466d02a520df2abdafd6d28beb72128e87766c43674e"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":470}}}],"partialFingerprints":{"codehealthFindingId/v1":"00f4aca1ca015c06dfaddc1cac05c2620a9e7a85dc1f4c40fa1904048479d9ca"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":471}}}],"partialFingerprints":{"codehealthFindingId/v1":"6a4df1190d67ce65e2a6057d7b912e195b7a44e2dd0c039de147df2a364cb9bb"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"68f1855194cefe4c9646db8f235b1b7b355dd8b94c2bba8010a6a19741d038ec"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":498}}}],"partialFingerprints":{"codehealthFindingId/v1":"4965ef683e0d397082ba35080dd2359b6b066755d5140ca74618f2251668485e"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":499}}}],"partialFingerprints":{"codehealthFindingId/v1":"43b4b7943f7a673bc17250ec4c1967890f1b289ac01b303243caa1da2c12075c"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"277f3ea57db2921a462478eb00bb65145019cacb357c0502e5f63009d850f78f"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":501}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3139d5958d3bb0b7d881ae4ca66f36231fba96034025a22a3f05f800097e562"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":502}}}],"partialFingerprints":{"codehealthFindingId/v1":"aab69a95ca68bfe24ca94d70eb720751835555dc33efa1ef68fe1ad62c840385"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label for=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":965}}}],"partialFingerprints":{"codehealthFindingId/v1":"77ba4d9466d542214aca8a4732da94130c62900e5fbaf4b1dfb7df8b7f4e8146"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":966}}}],"partialFingerprints":{"codehealthFindingId/v1":"ad7040a1ed680f4f9831d46ca6d79012ea8487e69fdd1f123338f3fc98c527f9"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label for=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":968}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea401aa3fc2c2a573983866fa456b32c61e501b18126cea7a86fec33137e27c2"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":969}}}],"partialFingerprints":{"codehealthFindingId/v1":"ac146be11127e4fb869cfe7401876b64cf7909361d9a859ddd523d46e6586db5"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Clabel\u003E that labels no control: This \u003Clabel\u003E has no for and wraps no form control, so it names nothing: assistive tech never announces it, and clicking the caption focuses no field. Note that an id on the label is not an association \u2014 it is the TARGET of one, so a control still has to point at it. Give the label for=\u0022\u003Cthe control\u0027s id\u003E\u0022, move the control inside the label, or point the control\u0027s aria-labelledby at this label\u0027s id."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":971}}}],"partialFingerprints":{"codehealthFindingId/v1":"b99f9b125dace2dd3e4cb385e3bbb150728806c90690de6d7887e821644fca7a"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":972}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff32d6a1c9e8044f3c273c4c4ed0c7cabaea7b512d62c7810d791da39cb8d4f9"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cdiv\u003E: This \u003Cdiv\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1333}}}],"partialFingerprints":{"codehealthFindingId/v1":"ea418f78ea6e071187850646655962aaa3a1634cbf2397009d4f898f49103363"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cdiv\u003E: This \u003Cdiv\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1434}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e720d86403ecdab9af3e26a4dd35c45186e7cc1feb3ceb228a0d381ceddf54f"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cdiv\u003E: This \u003Cdiv\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1439}}}],"partialFingerprints":{"codehealthFindingId/v1":"1abcbb92128e14e2ceb494d072ae4b0e27784c15bd7bea6aad2649b21ec0880a"}},{"ruleId":"AC2","level":"error","message":{"text":"Custom control with no accessible name on \u003Cdiv\u003E: This \u003Cdiv\u003E carries a click handler, which makes it a control, but it has no text, aria-label or labelled child (the icon-only case), so assistive tech has no name to announce for it. Note that switching it to \u003Cbutton type=\u0022button\u0022\u003E \u2014 the right fix for its keyboard operability \u2014 does not give it a name either: an icon-only button still needs one. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1849}}}],"partialFingerprints":{"codehealthFindingId/v1":"7785229fcef86fb86046c574f58c184ad1d9af0275f9fddba043eaa6dafe68c6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":1181}}}],"partialFingerprints":{"codehealthFindingId/v1":"93afff3f3d63771feb7c8ea61c1e96185fa1452ca5f9e001cd8171311b85a7df"}},{"ruleId":"AC2","level":"error","message":{"text":"Link with no accessible name: A link with no text, aria-label or labelled child (e.g. an icon-only link) has no accessible name, so assistive tech can\u0027t say where it goes. Add visible text or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":2569}}}],"partialFingerprints":{"codehealthFindingId/v1":"219992af67ab659a9a585f6ff523e2d5c18ad273e0dbcf0bf35a5722edd1cf2b"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cinput\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":2582}}}],"partialFingerprints":{"codehealthFindingId/v1":"3313fcaf5f50e5bbecb818202bd0edbc7fd69b87637ab16adc4b4d47da037150"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Ctextarea\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":4050}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1886a6f4f606c6d04dfb74381fe5aa2f6f956f8a3334183a652e8f2f1c639a6"}},{"ruleId":"AC2","level":"error","message":{"text":"\u003Cselect\u003E without a programmatic label: This control has no associated label. Add a \u003Clabel for\u003E / wrapping \u003Clabel\u003E / aria-label / aria-labelledby so assistive tech can name it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":4928}}}],"partialFingerprints":{"codehealthFindingId/v1":"304210e65ee8c537e24cb7551c7bfb2430b114997bae9e99d629c31e7a7a952c"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4f36ca78e0dc70dbcf5e88d8bdf5feebd7f5c1101dcecef5b7f1965cedece7d"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/about.scala.html"},"region":{"startLine":3}}}],"partialFingerprints":{"codehealthFindingId/v1":"6c681184e0adbd8415d6b8791a1134741340d0157642d7c9a223815e6497de8c"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotId.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"e785ecadd87997f8801fccf47e52f0c11220313222ec4f539d4252cf7e88e1ed"}},{"ruleId":"AC3","level":"error","message":{"text":"Document without a \u003Ctitle\u003E: A page with no \u003Ctitle\u003E gives no name in the tab, history or screen-reader page list. Add a descriptive \u003Ctitle\u003E in \u003Chead\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotId.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4848ceb3749227630bf9f67d3db303e499b54c05c83314ae1dade106dda8724"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotId.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ca64a70ce559728a09aff771f4824c037f2b8e01f1470ef7f7c1cefe29210e2"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotPassword.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"c58b01263660d5a6d353687f534501dce4b23893dd2efda83b57279e465006cd"}},{"ruleId":"AC3","level":"error","message":{"text":"Document without a \u003Ctitle\u003E: A page with no \u003Ctitle\u003E gives no name in the tab, history or screen-reader page list. Add a descriptive \u003Ctitle\u003E in \u003Chead\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotPassword.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"72e417071538c354653f17d8a8d93c245fb6a1ba5cc1fb7d47c719e52dc42a5a"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotPassword.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"102ceea3b81e6b6e253df47d86605a15367ff734e8ed85363f82f1bb3be4bc8a"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"3cc97ba761f70c634ceeadceaac79b3521d927288ac9cd9560f60a31f7ba6897"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fbabec384cc5525409d70882746dec88551b3e0a717186314e796bed2f02d2f"}},{"ruleId":"AC3","level":"error","message":{"text":"Viewport restricts zoom: user-scalable=no/0 or a maximum-scale below 2 stops low-vision users zooming to 200%. Remove the zoom restriction from the viewport meta."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":139}}}],"partialFingerprints":{"codehealthFindingId/v1":"9f0e990d8b6a74480baf4bec39b890e30ba0218ce881952547467908daf13910"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Ciframe\u003E without a title: An iframe with no title (or an empty one) is announced only as \u0022frame\u0022. Add a non-empty title describing its content, or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":338}}}],"partialFingerprints":{"codehealthFindingId/v1":"8de0a8ba985de8869d5177ef585e552328b24cef05b8679ab761e604332a3d3c"}},{"ruleId":"AC3","level":"warning","message":{"text":"Empty \u003Ch4\u003E heading: An empty heading appears in the document outline announced with no text. Give the heading text, or remove it if it\u0027s decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4868}}}],"partialFingerprints":{"codehealthFindingId/v1":"b98c5fa7da7d45e87f09c5f8ba937f62de96f3a98d2e7e3857082776cee2da5a"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/passwordReset.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"72df540e40209d31aea064175d5543a9f7b71c6286e576d786bd2a5b0307cc51"}},{"ruleId":"AC3","level":"error","message":{"text":"Document without a \u003Ctitle\u003E: A page with no \u003Ctitle\u003E gives no name in the tab, history or screen-reader page list. Add a descriptive \u003Ctitle\u003E in \u003Chead\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/passwordReset.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"190d2437085591327250faee8cbda139327e6adbb2bfe2a878164f55f5b37569"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/passwordReset.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4d1d88c2af618585db44e65aa7273aa7795b135a95c6ad8169a06b248550bd6"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/signup.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ae19a3246a55001cd2fe8d14a2bc55b68029d650b263b8ca624efff5d4ad899"}},{"ruleId":"AC3","level":"error","message":{"text":"Document without a \u003Ctitle\u003E: A page with no \u003Ctitle\u003E gives no name in the tab, history or screen-reader page list. Add a descriptive \u003Ctitle\u003E in \u003Chead\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/signup.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"72eced4fe230db4eb1974d94367272e8c11041dfc287f40624e8738786789edf"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/signup.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a558917afad11a431998c9d1b8f03e8dfd6acd22e5d5b7dee0ab6650669f81c"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h6: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/summary.scala.html"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"56d2b2e5c32ff4c3af1a389e6a8406804645d35ac7163d4e5c9c6570e7034fca"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfa514c611eae5277d9e3a462672178b7d9290404a6abc0291133036ca497e59"}},{"ruleId":"AC3","level":"error","message":{"text":"Document without a \u003Ctitle\u003E: A page with no \u003Ctitle\u003E gives no name in the tab, history or screen-reader page list. Add a descriptive \u003Ctitle\u003E in \u003Chead\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"69984a8ef033bac0ba4c48a83b8673a9711825f0c83540b806cc842ef0a4b221"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"86ad8e15a7853a3588357434c2c064734ea618518ba290982838a452e6f9a1fe"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Chtml\u003E without a lang: The page declares no language, so assistive tech can\u0027t pick the right pronunciation. Add lang (e.g. lang=\u0022en\u0022)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"2debb8bec4c461d8cdda316c52155ac7997ea388632a7e77b735258cfef81dc0"}},{"ruleId":"AC3","level":"warning","message":{"text":"Page without a main landmark: No \u003Cmain\u003E (or role=\u0022main\u0022) means no \u0022skip to content\u0022 target and a weaker landmark map. Wrap the primary content in \u003Cmain\u003E."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":2}}}],"partialFingerprints":{"codehealthFindingId/v1":"d69f48e33d3874ab83ab0ea41bef507df64fffee6dcf244e59473c860b8b6a9e"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h3: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"9e3afdb420b9eefcb7c68e919ed0b0f6d93d4030fc7e1b3465fe83e0d9ae7d29"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"5de697bfd30290b3baad33180cd27402381893d287032f5e4e68fc186a433c4f"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"c12b2e1dc5b78294deb42bd72eeb9c3c69912573e1224b75a4a5d8f815ec905e"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":424}}}],"partialFingerprints":{"codehealthFindingId/v1":"c341d40775f5e4a387e3f18609a2568e53c192c670a5a6a6365c17f2b2096fbb"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":431}}}],"partialFingerprints":{"codehealthFindingId/v1":"35b3cfaddf5c93e60d3c110d6cc3b4cd8314c4d9e564e3292060c03c4b6879ca"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":461}}}],"partialFingerprints":{"codehealthFindingId/v1":"6580153a59e1b3c306ecc2691009323081cec2f02532b2acbf884154c3805ccc"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h4: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":491}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9447510798a86c599f2f1c4af3e858514f01f8e5caeeb5327ea25fda87d4603"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":541}}}],"partialFingerprints":{"codehealthFindingId/v1":"feb9abac6c58154e3b6f0b89f28d70468b118b05d1eebdaceaf15998f05d083b"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":554}}}],"partialFingerprints":{"codehealthFindingId/v1":"4555a2adcbbeb7696ca88cc1947c11dcfc7e155c28eac6e63be5198390c37e1b"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":567}}}],"partialFingerprints":{"codehealthFindingId/v1":"ae5ac540d294493d70c032abd25e447caceee6e05006ba3770c68d79169c7696"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":580}}}],"partialFingerprints":{"codehealthFindingId/v1":"7777b4d5705047d18b5d7e64606eebc1ed88127432ac07c2bb7c4de1d6296cf4"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":593}}}],"partialFingerprints":{"codehealthFindingId/v1":"5fd7e2f430dbf755b143a0e04f9a2e1f7f674ba7f57b1eeada1d0f7e5b31c536"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":606}}}],"partialFingerprints":{"codehealthFindingId/v1":"4b881bc83505c4f60552d92dcf7034c6187284155978d5bafbb107a051a97fcc"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":619}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a3da4f966fc0da41a929c6eaccefdd3573a4c586d8116dc043e5685deb87055"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h1 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"0c238fd56d09e848713aac7e2cdfd6242bda5220257edae8970a5425c41229ec"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h3 to h5: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":885}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fe08ac2b77c0fd664ebd46c00242e73faa1d4b665f86cde6cd7d85c2912eddd"}},{"ruleId":"AC3","level":"warning","message":{"text":"Heading level jumps from h2 to h6: Skipping heading levels breaks the document outline assistive tech relies on. Don\u0027t jump levels \u2014 increase by at most one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":982}}}],"partialFingerprints":{"codehealthFindingId/v1":"1fa6fcc3cdd05847cb85226ee54dd3cde16643cc0063c73716bfe166740a8a81"}},{"ruleId":"AC3","level":"warning","message":{"text":"Empty \u003Ch5\u003E heading: An empty heading appears in the document outline announced with no text. Give the heading text, or remove it if it\u0027s decorative."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":3169}}}],"partialFingerprints":{"codehealthFindingId/v1":"645df4eef7f94c578304385234434a0b94e4a7cb8b01295767afe00d455b1ca4"}},{"ruleId":"AC3","level":"error","message":{"text":"\u003Ciframe\u003E without a title: An iframe with no title (or an empty one) is announced only as \u0022frame\u0022. Add a non-empty title describing its content, or an aria-label."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":5517}}}],"partialFingerprints":{"codehealthFindingId/v1":"666a10c29cc3cbdcaac01069724518fff26c07cd706ae47e63260494295a22f0"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotId.scala.html"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"8870efd84e9c73738438e2d84e91c051fb74125da378adb7b0961f1ef5ff3f68"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/forgotPassword.scala.html"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"5e6c3d975735a32100c90cd022b7915d569bf30246cb8c7c77fb6ff1aca50afd"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .clickable with \u0060cursor: pointer\u0060, so this \u003Cimg\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":169}}}],"partialFingerprints":{"codehealthFindingId/v1":"921823f84976c0a43f326c9fece6fa546757cb16876207795d2a72174fc803bd"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .clickable with \u0060cursor: pointer\u0060, so this \u003Cimg\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":171}}}],"partialFingerprints":{"codehealthFindingId/v1":"94d5ea78ff4a6dedfb2403f7757d993de9ce95ce247937cb7f6f86bbbc896c4a"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":173}}}],"partialFingerprints":{"codehealthFindingId/v1":"f3aa5b2ad0e6ca8251c122367051108b96021bcab66f16927141e7191e4e81f4"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f0e6bf356c7301bb0c3b13c838cef6dd0f68c04569026e3e24ef07d434841b"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cimg\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":252}}}],"partialFingerprints":{"codehealthFindingId/v1":"b404b934bc47528632c7cc3a49e518b52a87f7353a7fdcbb5182e9c4e1ae2ba1"}},{"ruleId":"AC4","level":"warning","message":{"text":"Positive tabindex (2): A positive tabindex forces a manual tab order that fights the DOM and is fragile. Use tabindex=\u00220\u0022 (or restructure the DOM)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"6916bf393cd7d7eaaf9b5edfd6338674b0b1107dca9e2645f5d9f58ad68fc98b"}},{"ruleId":"AC4","level":"warning","message":{"text":"Positive tabindex (3): A positive tabindex forces a manual tab order that fights the DOM and is fragile. Use tabindex=\u00220\u0022 (or restructure the DOM)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":262}}}],"partialFingerprints":{"codehealthFindingId/v1":"fe0e058a775e928c97956e67121c69454748452743653e16b124a395081aea65"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":263}}}],"partialFingerprints":{"codehealthFindingId/v1":"409870754a844aa8a2daef91faa89a66b65a1f07b590787b42f4f281bacf09db"}},{"ruleId":"AC4","level":"warning","message":{"text":"Positive tabindex (4): A positive tabindex forces a manual tab order that fights the DOM and is fragile. Use tabindex=\u00220\u0022 (or restructure the DOM)."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":265}}}],"partialFingerprints":{"codehealthFindingId/v1":"9faa1f2ce602e4fe9ae7016c66fff130535511b9776e74cf95f6682b0139e632"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"b408fa7f57aaf0b7687bb95626fb628cec07c50eed3079311f8260bf9cf9de3f"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":270}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c730caff347c04b8667511b6b80547b6de106b55cf1d6ae41b90babf99b25fb"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":299}}}],"partialFingerprints":{"codehealthFindingId/v1":"8bdc9bac66b900ecb58b2ad504dce3253129f610bd5263b0c9d9b7b297449fb2"}},{"ruleId":"AC4","level":"warning","message":{"text":"Link used as a button (placeholder href): An \u003Ca href=\u0022#\u0022\u003E (or javascript:) with a click handler is a button dressed as a link \u2014 it announces the wrong role and stops working without JS. Use a \u003Cbutton\u003E for an action."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":344}}}],"partialFingerprints":{"codehealthFindingId/v1":"a361c6752f39ee99b861f99b6943a62e240248e170702e35f038d219a45ae060"}},{"ruleId":"AC4","level":"warning","message":{"text":"Link used as a button (placeholder href): An \u003Ca href=\u0022#\u0022\u003E (or javascript:) with a click handler is a button dressed as a link \u2014 it announces the wrong role and stops working without JS. Use a \u003Cbutton\u003E for an action."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":345}}}],"partialFingerprints":{"codehealthFindingId/v1":"9c2910bf5f024bedd1fb2ceb6cd314a71c5f80cc1262ca919f051bbe4b42628d"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4540}}}],"partialFingerprints":{"codehealthFindingId/v1":"3fc94adf2c043e2cbd5485aae040db7e741b47f66ec0dd85e32c71359c25a1bb"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cspan\u003E: A click handler on a plain element with no role and no tabindex: even where another element\u0027s key handler can reach it, assistive tech can neither focus it nor announce what it is. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":4865}}}],"partialFingerprints":{"codehealthFindingId/v1":"47fc6e299a46c6066787a61973f55e495a1ce26b0581599004f2838a064498f2"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/passwordReset.scala.html"},"region":{"startLine":44}}}],"partialFingerprints":{"codehealthFindingId/v1":"853f1fb5d5b2f888bd697f3facb8219561a1e152043657afbc0ef4c104dabbd3"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/signup.scala.html"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"3474b37843df9a5d2e124378e48301e46e7c9f1bdca759e00b7ead7466b02c2b"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"c06a79eeb60390fc63a0275f75553a77deb86f921d292707a60c677d02866767"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":29}}}],"partialFingerprints":{"codehealthFindingId/v1":"d3f769b6c5a9b93ec129b53d4a06cb20a5b315d3d6172f978475490bd561a1cb"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":35}}}],"partialFingerprints":{"codehealthFindingId/v1":"d68571487e8f6349951db4d4820294be74024bb215b67a0958de0ccd1db3da6d"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/test.scala.html"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"82c30ead02fe7d70ced4af35d89e5bfaad0c399937a5adf0754eeb95a13375d3"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .servicesitem with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":360}}}],"partialFingerprints":{"codehealthFindingId/v1":"e659013fbf9b4706e8dfb33fe77c08b765b7e2dac7ff51b348a5fa732f3b1d5f"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .servicesitem with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":370}}}],"partialFingerprints":{"codehealthFindingId/v1":"999be6ad5afbd51a1acc1eb78df21edf398142148a1a74c46eeaafb7f04e13d7"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .servicesitem with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":380}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d10cb08a15deb528a3a19fe78de5e9f749a6569ec21ad5834e05e590e47fb7e"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .servicesitem with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/index.html"},"region":{"startLine":390}}}],"partialFingerprints":{"codehealthFindingId/v1":"146e0f7d51cee8965660d4d404bbed4b1f6762461496f463cb8010da0904e7dd"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":702}}}],"partialFingerprints":{"codehealthFindingId/v1":"38cd83d950e6ad3ff59a13bcfab97d6f0bfb3ee0fe3c10b0cb02c523d3a28a91"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1333}}}],"partialFingerprints":{"codehealthFindingId/v1":"4a04857bcdf3b8a92f555c7fbc5c5365a53d27df4872450fd8d484a54f8f38f3"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1434}}}],"partialFingerprints":{"codehealthFindingId/v1":"0e095145e005986a3a745e54f9d55cc6d62ec5b3193c7fe42ba3bd34f5fd519c"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1439}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4e18776220cac2ba3b424afe45150fcc1798d5dbe41c929bb43fa38062687e8"}},{"ruleId":"AC4","level":"error","message":{"text":"Click handler on a non-interactive \u003Cdiv\u003E: A click handler on a plain element isn\u0027t keyboard-operable. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1849}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4bae932cf24f0a34da9094dc212647a0e99ca482c1d441a901b74f4f7aaa4ee"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .clickable with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2091}}}],"partialFingerprints":{"codehealthFindingId/v1":"43886540f46778d118e4c31dd757072a581aeae2e5db4b9bd1be509e48af530b"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .button with \u0060cursor: pointer\u0060, so this \u003Cimg\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":43}}}],"partialFingerprints":{"codehealthFindingId/v1":"5333a9cff5438afc4546e5b7f04b4c657902636c346b8ff108527e7af5796cd3"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .jemoji-close with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"af6c457febcb35ca8a8a5b17b342820de044251d72a21c956abb738fbde71a01"}},{"ruleId":"AC4","level":"error","message":{"text":"Clickable element isn\u0027t keyboard-operable: The repo\u0027s own CSS styles .jemoji-close with \u0060cursor: pointer\u0060, so this \u003Cdiv\u003E is a control \u2014 but it has no role, no tabindex=\u00220\u0022 and no key handler, so it can only be reached with a mouse. Use a \u003Cbutton\u003E, or add role \u002B tabindex=\u00220\u0022 \u002B a key handler."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"37daf7c8930d1e473a649ab1536023a4d564a8439884e776cca319bd5efb1646"}},{"ruleId":"AC7","level":"warning","message":{"text":"Accessibility enforcement below the top rung: No accessibility enforcement found \u2014 no a11y linter (an accessibility check that can read your UI \u2014 no component framework was detected and your pages are rendered by server-side templates, which neither the JSX/Vue ESLint plugins nor the HTML-template linters can parse; run axe/pa11y over the rendered pages, or assert the accessibility invariants over that rendered HTML in the test suite you already have) and no axe/pa11y/Lighthouse in tests or CI. Start by running that check over your rendered pages in CI. What was searched, so you can tell an absence from a miss: the 19 markup file(s) this pass actually assessed, the linter configuration checked in beside them, and this repository\u0027s test and CI files \u2014 matched by name against the accessibility checkers this dimension carries. An audit run outside the repository, a hosted scanner, or a check whose name is not one of those, is not seen here."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d46019b86eff5ddad9db289e6802ac158899e980df54c34f67722442787ead62"}},{"ruleId":"AX2","level":"warning","message":{"text":"Stateful singleton: ChangeHistoryApplication: \u0060ChangeHistoryApplication\u0060 is one shared instance (Play controller: every request runs on it, concurrently, on the server\u0027s thread pool) but writes its own state outside any lock (currentCycle; e.g. \u0060currentCycle\u0060 in \u0060searchLinkHistory\u0060 at line 81). Two requests that interleave lose an update, and a mutable collection written concurrently can corrupt."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/ChangeHistoryApplication.scala"},"region":{"startLine":15}}}],"partialFingerprints":{"codehealthFindingId/v1":"0ba850ad733f25380626232eb61012e7ad807dc3fb9f5b890e9303c3770ea67f"}},{"ruleId":"GD1","level":"warning","message":{"text":"Unfinished stub \u2014 body is \u0060???\u0060: \u0060getAssignmentsToAirplanes\u0060 is a shipped member whose whole body is still \u0060???\u0060, and nothing in the repository overrides it \u2014 generated scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"6ad05c3e58434b72c6536458cb46a36b2ee95b2dd27a8f0a773ea8b8973c4ba6"}},{"ruleId":"GD1","level":"warning","message":{"text":"Unfinished stub \u2014 body is \u0060???\u0060: \u0060getAssignmentsToLinks\u0060 is a shipped member whose whole body is still \u0060???\u0060, and nothing in the repository overrides it \u2014 generated scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"608a35aa05f55316a8e320b7df2bc98dc7d505d34829415abc65a13ebdc8428f"}},{"ruleId":"GD1","level":"warning","message":{"text":"Unfinished stub \u2014 body is \u0060???\u0060: \u0060getAssignmentsToAirplane\u0060 is a shipped member whose whole body is still \u0060???\u0060, and nothing in the repository overrides it \u2014 generated scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"71bc9e519f5261aa8e60e1d2b3ace8df19a7cbb5c7deced624e790c0de59870f"}},{"ruleId":"GD1","level":"warning","message":{"text":"Unfinished stub \u2014 body is \u0060???\u0060: \u0060getAssignmentsToLink\u0060 is a shipped member whose whole body is still \u0060???\u0060, and nothing in the repository overrides it \u2014 generated scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"07d800defdd5e09e81844a2f4a35567712d2eb3ec0a8a106ad91a02ca9b0b0aa"}},{"ruleId":"IC1","level":"warning","message":{"text":"Skeleton type \u2014 most members are unfinished: \u0060AirplaneAssignmentUtil\u0060 has 4 unfinished members out of 4 declared methods (whether or not each carries a body) \u2014 a scaffolded class that was never implemented."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":5}}}],"partialFingerprints":{"codehealthFindingId/v1":"4cd56a357dadc90db2cea4a93a680e8420d99da778658cad284bcdfc509ff4b8"}},{"ruleId":"IC1","level":"warning","message":{"text":"Unfinished stub \u2014 body is ??? / NotImplementedError: \u0060getAssignmentsToAirplanes\u0060 is a shipped method whose whole body is \u0060???\u0060 (or throws NotImplementedError), and nothing in the repository overrides it \u2014 scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":6}}}],"partialFingerprints":{"codehealthFindingId/v1":"796c7769173bd72234be1715caae5afa4efa5ba7d2185b80edfe8f72e7f3957e"}},{"ruleId":"IC1","level":"warning","message":{"text":"Unfinished stub \u2014 body is ??? / NotImplementedError: \u0060getAssignmentsToLinks\u0060 is a shipped method whose whole body is \u0060???\u0060 (or throws NotImplementedError), and nothing in the repository overrides it \u2014 scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"ebda5bcd780c5233c9263f7de10e4961d763b4729ca41d0ddd0ca0d738f01183"}},{"ruleId":"IC1","level":"warning","message":{"text":"Unfinished stub \u2014 body is ??? / NotImplementedError: \u0060getAssignmentsToAirplane\u0060 is a shipped method whose whole body is \u0060???\u0060 (or throws NotImplementedError), and nothing in the repository overrides it \u2014 scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"0b419d161639c3f08bf7d4e23bb0ff2404056750cc61a2ede41fa9f145fccb85"}},{"ruleId":"IC1","level":"warning","message":{"text":"Unfinished stub \u2014 body is ??? / NotImplementedError: \u0060getAssignmentsToLink\u0060 is a shipped method whose whole body is \u0060???\u0060 (or throws NotImplementedError), and nothing in the repository overrides it \u2014 scaffolding that was never completed. Implement it or remove the dead surface."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/model/airplane/AirplaneAssignmentUtil.scala"},"region":{"startLine":10}}}],"partialFingerprints":{"codehealthFindingId/v1":"3845152a6142db04b965e1de262919312fb3beae237032bc9158232a25d86d3e"}},{"ruleId":"M1","level":"warning","message":{"text":"README may be stale: 24 code files changed in the last 6 months but the README was not touched \u2014 it may no longer reflect the system."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e973e7a8d5d866995cbf78b120250fe7f132bf928812d48ca62e69aba11b9910"}},{"ruleId":"M2","level":"note","message":{"text":"No ADRs: No Architecture Decision Records found \u2014 no conventional ADR directory, no numbered \u0060NNNN-title\u0060 documents in any markup this check reads, and nothing ADR-shaped by content. Design rationale recorded elsewhere (a design-notes tree, a mailing list, pull-request discussion) is not visible to this check and is not re-findable per decision, so a future maintainer cannot ask why one choice was made and get an answer."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"670b3d6e36a756d63097d0dfbf90afd5fc761308800b9354894a07c3f4e4aa14"}},{"ruleId":"M2","level":"note","message":{"text":"No architecture diagram/doc: No C4/Structurizr/PlantUML/Mermaid/Graphviz/D2 diagram, no drawn diagram named for the architecture, no file named \u0060architecture\u0060 or \u0060design\u0060 in any markup this check reads, and nothing in the README, docs or contributor guides that announces the shape \u2014 no \u0060## Architecture\u0060 heading, no \u0022architecture overview\u0022/\u0022high-level design\u0022 phrasing, no \u0022the architecture is \u2026\u0022 introduction, no guided code tour. A shape laid out in prose that never names itself as the architecture is not visible to this check, and neither is one kept outside the repository, so this row reports the absence of a re-findable shape document \u2014 not evidence that nobody wrote the shape down."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"0c190e7c159d1850ee706c3ac4486e151e8a4fe169de4bf61436b9f399654f06"}},{"ruleId":"P1","level":"warning","message":{"text":"No CI pipeline: No CI workflow found (.github/workflows, azure-pipelines.yml, .gitlab-ci.yml, \u2026) \u2014 changes aren\u0027t gated by an automated build/test."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"44f01af96e50474fba2df84d95ddf4f7e1d34c29c307830b9efc9057daa6b670"}},{"ruleId":"P2","level":"note","message":{"text":"Logging is not universal: Only 1/2 runnable modules use logging (modules with no entry point or server are excluded \u2014 they are libraries a runnable module hosts). Silent: \u0060airline-data\u0060."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"91a94e21d6d4d0e6a2003f94505b0b02b157176f0b24c4820f3f82b4447a97fe"}},{"ruleId":"P3","level":"note","message":{"text":"No SAST: No static application security testing detected. For this repository\u0027s stack, add scalafix or scapegoat (or \u0060semgrep --config=auto\u0060, which runs on any language) \u2014 this repository has no CI pipeline yet, so run it locally to clear the existing findings, then make it a step of the first workflow you add so a regression fails the build. What was searched, so you can tell an absence from a miss: the 0 CI workflow file(s) in this repository, and the scanner and linter configuration checked in beside them. A scan that runs outside CI, one configured in your forge\u0027s web UI rather than in a committed file, or a tool whose name is none of those this check carries, is not seen \u2014 if that is your case the row is wrong, and saying so is more useful than adding a second scanner."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"6e54424179c892f03ef2fd003130ac4bd43f39bbf3b1ca0a0143e25acb80ec87"}},{"ruleId":"P6","level":"note","message":{"text":"No changelog: No CHANGELOG/HISTORY/RELEASES file \u2014 what shipped when isn\u0027t easy to reconstruct for support or audit. (Versioning/tagging makes releases traceable, but a changelog records the what.)"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"dda5aa5aed8cbb292c3ef2b733bc138f614293ae6426c85e98bf31ef330d9415"}},{"ruleId":"PF3","level":"warning","message":{"text":"Sync-over-async blocking: \u0060getRunway\u0060 is async and calls Await.result \u2014 a blocking call inside async code stalls the execution-context thread, and every future or fiber scheduled on it for as long as it runs."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"878441b482c127cbac656bc6e68686371b791a4f2548fec0bc3a7780b13fd7b6"}},{"ruleId":"R1","level":"warning","message":{"text":"Type Safety: 0 typed \u00B7 56 plain JS \u2014 the untyped files are airline-web/public/css-templates/treviso/js/custom.js, airline-web/public/css-templates/treviso/js/responsiveslides.js, airline-web/public/firework/firework.js, airline-web/public/firework/fscreen.js, airline-web/public/firework/my-math.js, airline-web/public/firework/stage.js (\u002B50 more)."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"d00ee7953f55325a823d27e5db9657c80ca9b9861c0c0abf8fe487cd3fa586d3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (126 matched lines \u00D7 2 locations): airline-web/public/javascripts/bank.js:8 \u00B7 airline-web/public/javascripts/oil.js:9 \u2014 the two spans are one implementation copied and then locally edited \u2014 841 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/bank.js"},"region":{"startLine":8}}}],"partialFingerprints":{"codehealthFindingId/v1":"5b1ba72dad62ae9b3d5b13cdd6f3ae9154946ae4df528cc606c7394a79ad0189"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (39 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:731 \u00B7 airline-web/public/javascripts/office.js:778 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":731}}}],"partialFingerprints":{"codehealthFindingId/v1":"aaea7c7c8135746388d0c0ad025398fa5bff72be90290c800f6a5a6b18ae93f3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (35 lines \u00D7 2 locations): airline-web/public/javascripts/admin.js:151 \u00B7 airline-web/public/javascripts/admin.js:187 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/admin.js"},"region":{"startLine":151}}}],"partialFingerprints":{"codehealthFindingId/v1":"25d0acb580eb0e0ecde73804df18e8e9e14849b25cc30eda71699a9b941cdf58"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (26 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:1557 \u00B7 airline-web/public/javascripts/airplane.js:1584 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1557}}}],"partialFingerprints":{"codehealthFindingId/v1":"f01fe18298eb4683ce2a57adc456a1be1a105ef76b648fa8a96a1b6cfad37275"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): airline-web/public/javascripts/campaign.js:153 \u00B7 airline-web/public/javascripts/campaign.js:178 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/campaign.js"},"region":{"startLine":153}}}],"partialFingerprints":{"codehealthFindingId/v1":"14e7cef1e523d0da3826705b4588a9556fc81af45118f16087008831a12250cc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (24 lines \u00D7 2 locations): airline-web/public/javascripts/plot-fusioncharts.js:1059 \u00B7 airline-web/public/javascripts/plot-fusioncharts.js:1114 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":1059}}}],"partialFingerprints":{"codehealthFindingId/v1":"c18e96ea821d65a35f4f8641d95e0b7ec890db38975ac17f670950e18b70448a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (21 matched lines \u00D7 2 locations): airline-web/public/javascripts/campaign.js:272 \u00B7 airline-web/public/javascripts/event.js:355 \u2014 the two spans are one implementation copied and then locally edited \u2014 135 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/campaign.js"},"region":{"startLine":272}}}],"partialFingerprints":{"codehealthFindingId/v1":"51390184e4a1cab5dec714b137a40455a8836a2e63349d463c20203d98a1cda2"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:1635 \u00B7 airline-web/public/javascripts/airline.js:1707 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1635}}}],"partialFingerprints":{"codehealthFindingId/v1":"68a97c1c9c874f058050e6e0170e0adad3bfbb00da04ceecd93f106c5e8bf83c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (20 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:1056 \u00B7 airline-web/public/javascripts/model-configuration.js:302 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1056}}}],"partialFingerprints":{"codehealthFindingId/v1":"c383d5a4889783220b575e619a8e47c433f2b15ebacd15b841c1c0a864cc19e0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (20 matched lines \u00D7 2 locations): airline-web/public/javascripts/plot-fusioncharts.js:427 \u00B7 airline-web/public/javascripts/plot-fusioncharts.js:760 \u2014 the two spans are one implementation copied and then locally edited \u2014 209 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"bafb5de7a69b6a47e387b5ea7034187aae8718cb23ad4bb999e0e9d9f2d8746b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (19 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:372 \u00B7 airline-web/public/javascripts/office.js:436 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":372}}}],"partialFingerprints":{"codehealthFindingId/v1":"ba7447386b6cc25ae84e7632243610a6c5c7f55e2ef2af276895b9b571ec938c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:539 \u00B7 airline-web/public/javascripts/office.js:998 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":539}}}],"partialFingerprints":{"codehealthFindingId/v1":"4f55dfe8897bbd0c6ca95e8e12ad9a3945cafcf6cef2f06872b320cf707837b6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (18 lines \u00D7 2 locations): airline-web/public/javascripts/plot-fusioncharts.js:739 \u00B7 airline-web/public/javascripts/plot-fusioncharts.js:868 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":739}}}],"partialFingerprints":{"codehealthFindingId/v1":"aa31666204e55fde8e4597e31127448cbe6a1b7146d15131729cfb2d5a0689f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:168 \u00B7 airline-web/public/javascripts/airline.js:193 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"f4e8c0795dd3e5c41391a5bdb989e335c61d12b313de42432886daed392cc8e8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): airline-web/public/javascripts/airport-asset.js:60 \u00B7 airline-web/public/javascripts/airport-asset.js:283 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport-asset.js"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"c4cb0d20a1ee9172f0025226f0b8d7446ba3a8cdca5be670879b5c493c3ef369"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): airline-web/public/javascripts/event.js:448 \u00B7 airline-web/public/javascripts/log.js:125 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/event.js"},"region":{"startLine":448}}}],"partialFingerprints":{"codehealthFindingId/v1":"910b97cc1c8f81eff37583678751b5582440aec24fe7bd42cc828b52653a8056"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (17 lines \u00D7 2 locations): airline-web/public/javascripts/test-airport.js:47 \u00B7 airline-web/public/javascripts/test-airport.js:66 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/test-airport.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc1267f6557986ba71a06f08d0c5ef90e65d2e4907342aa878c497bd6cc3df26"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): airline-web/public/javascripts/admin.js:9 \u00B7 airline-web/public/javascripts/admin.js:35 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/admin.js"},"region":{"startLine":9}}}],"partialFingerprints":{"codehealthFindingId/v1":"b006809ae2af2462d58152ea8367d46dd92cf92d0a2921ecd3af6ed1c06e8e6b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): airline-web/public/javascripts/admin.js:110 \u00B7 airline-web/public/javascripts/admin.js:129 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/admin.js"},"region":{"startLine":110}}}],"partialFingerprints":{"codehealthFindingId/v1":"4acc788498f102d048c4a0afa1a888982643c02490d9ad7529e220261a4f3719"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (16 matched lines \u00D7 2 locations): airline-web/public/javascripts/jemoji/jemoji.js:351 \u00B7 airline-web/public/javascripts/jemoji/jemoji.js:371 \u2014 the two spans are one implementation copied and then locally edited \u2014 85 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":351}}}],"partialFingerprints":{"codehealthFindingId/v1":"385f03029b808fbb30e305c86ae90502c734a5fa3e085ce1c805e87bbe597bd7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): airline-web/public/javascripts/oil.js:117 \u00B7 airline-web/public/javascripts/oil.js:138 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/oil.js"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"1151295c6972dd1f533a3df2d4c68c094671c8a50fcc2e1e9e8201793300dee9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (16 lines \u00D7 2 locations): airline-web/public/javascripts/plot-fusioncharts.js:1164 \u00B7 airline-web/public/javascripts/plot-fusioncharts.js:1240 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":1164}}}],"partialFingerprints":{"codehealthFindingId/v1":"9935d92ebd5e9f7180a4886f3e2f1ffff11558f63a91483fce76f827f2268bdf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): airline-web/public/javascripts/admin.js:302 \u00B7 airline-web/public/javascripts/admin.js:326 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/admin.js"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"b53d30bc5d107b3950646dcfcdef9953240c7c5cbd6a9fcae925b7639cee8900"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:1896 \u00B7 airline-web/public/javascripts/test-airport.js:108 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1896}}}],"partialFingerprints":{"codehealthFindingId/v1":"0020c4d2731669341e5b42111bbe7a6db65f23955800eb077af1ff150e0ced4a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 7 locations): airline-web/public/javascripts/airline.js:1961 \u00B7 airline-web/public/javascripts/alliance.js:637 \u00B7 airline-web/public/javascripts/alliance.js:659 \u00B7 airline-web/public/javascripts/alliance.js:676 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1961}}}],"partialFingerprints":{"codehealthFindingId/v1":"46fd7dfb4895c05cd1ec9b7b12b8de46b37d73c2dab00a9c615a1ceb89affefb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2152 \u00B7 airline-web/public/javascripts/rivals.js:434 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2152}}}],"partialFingerprints":{"codehealthFindingId/v1":"ee2fe4ff727cf13ba749d1753ac6451a5aeb0dad5bb0d559f1d188426a6a3b79"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2649 \u00B7 airline-web/public/javascripts/airline.js:2687 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2649}}}],"partialFingerprints":{"codehealthFindingId/v1":"0668ff5df7050d1e7ea2343694da6d253473120d308fa2ed8bf39a94eb602d0a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 3 locations): airline-web/public/javascripts/airplane.js:488 \u00B7 airline-web/public/javascripts/link-history.js:132 \u00B7 airline-web/public/javascripts/rivals.js:40 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"81f88023128855d32a7c60096c0f8f7c68287c4f1e9490a6f12242862d38c493"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (15 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:934 \u00B7 airline-web/public/javascripts/office.js:968 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":934}}}],"partialFingerprints":{"codehealthFindingId/v1":"df4fb326b331ed0679925d0962f2ea28fa37f5a3e5c8efd6b6070f4cb946d457"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:720 \u00B7 airline-web/public/javascripts/office.js:481 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":720}}}],"partialFingerprints":{"codehealthFindingId/v1":"ef560e3a7de637e7a85fd8056d217a92ab0ca679d8cdb77fdeefd94fb28843cd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:833 \u00B7 airline-web/public/javascripts/oil.js:22 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":833}}}],"partialFingerprints":{"codehealthFindingId/v1":"22e21384c43729e9ddefac544ab85d61b9b02fc523c451e6952381ea580eeefe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (14 lines \u00D7 2 locations): airline-web/public/javascripts/plot-fusioncharts.js:1145 \u00B7 airline-web/public/javascripts/plot-fusioncharts.js:1219 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":1145}}}],"partialFingerprints":{"codehealthFindingId/v1":"a85d22f337a8b41b20736a644289a0f219a497b415294e84eca2fcf8538732f9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (14 matched lines \u00D7 2 locations): airline-web/public/javascripts/profile.js:83 \u00B7 airline-web/public/javascripts/prompt.js:127 \u2014 the two spans are one implementation copied and then locally edited \u2014 81 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/profile.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"0586f9fa2f968e978a93cd37bd995b298b9556581740a26fcfab816c8bfbe013"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 3 locations): airline-web/public/javascripts/airline.js:204 \u00B7 airline-web/public/javascripts/bank.js:205 \u00B7 airline-web/public/javascripts/oil.js:254 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"1af2ea276444781f148480bb903e784255f87115e84840c28865a550ca9c01e8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:1674 \u00B7 airline-web/public/javascripts/search.js:282 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1674}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8bfa8c863eeda817b85d717e792ce69caee249bf47a54c35fcf9b7e6de60b4d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2402 \u00B7 airline-web/public/javascripts/airline.js:2417 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2402}}}],"partialFingerprints":{"codehealthFindingId/v1":"648a4bd7848464fb77670d49dfe1baab48822f7c6c38ab5ed0cb33d2e44e293d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (13 matched lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:1409 \u00B7 airline-web/public/javascripts/signup.js:4 \u2014 the two spans are one implementation copied and then locally edited \u2014 70 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1409}}}],"partialFingerprints":{"codehealthFindingId/v1":"7ffc9d5a5cfe4db416bae527327adaccadcb1809b9ac6138b0250448d9a6b684"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): airline-web/public/javascripts/chat.js:119 \u00B7 airline-web/public/javascripts/websocket.js:3 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":119}}}],"partialFingerprints":{"codehealthFindingId/v1":"6f190bd03175de40ccb54da8075ea3b7dee16214bbf9b270b41ad124021a9368"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (13 lines \u00D7 2 locations): airline-web/public/javascripts/gadgets.js:778 \u00B7 airline-web/public/javascripts/gadgets.js:792 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":778}}}],"partialFingerprints":{"codehealthFindingId/v1":"d4ed58f5590b95f7da3dea4a711cded56a28683b87f83e0743fd2777d2a31cb5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:845 \u00B7 airline-web/public/javascripts/office.js:1116 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":845}}}],"partialFingerprints":{"codehealthFindingId/v1":"2f95fdbb0de890bc4926c6ba7a3094c0bcd9e480469e6c7f90c399a830535f99"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:1827 \u00B7 airline-web/public/javascripts/alliance.js:274 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1827}}}],"partialFingerprints":{"codehealthFindingId/v1":"981e71cc142f8e3f78f764aafe5d18d596653107d60ae15cf428bd218811cfc1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5 locations): airline-web/public/javascripts/airline.js:1992 \u00B7 airline-web/public/javascripts/airline.js:2190 \u00B7 airline-web/public/javascripts/airplane.js:519 \u00B7 airline-web/public/javascripts/airport-asset.js:148 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1992}}}],"partialFingerprints":{"codehealthFindingId/v1":"dc11cecd7fb18dfbcf9b2f66529497122a0a065db8f4fa4d8a21dce8c2e2a0a9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 5 locations): airline-web/public/javascripts/airline.js:2221 \u00B7 airline-web/public/javascripts/airport.js:1274 \u00B7 airline-web/public/javascripts/alliance.js:228 \u00B7 airline-web/public/javascripts/ranking.js:26 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 5 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2221}}}],"partialFingerprints":{"codehealthFindingId/v1":"74e87d19fe793fa96005ae0e13707a44de69e99d9638687a6ba5f7d2f0e3a32c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:191 \u00B7 airline-web/public/javascripts/country.js:99 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":191}}}],"partialFingerprints":{"codehealthFindingId/v1":"cabe63ac88afa72645f9c74a56a687cf0b6c88f4999a37e4a2a2ceab6c84797c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:204 \u00B7 airline-web/public/javascripts/rivals.js:219 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":204}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d30965c2251c8992fc76450f82c6a490514f35fbe09e8225af1d3b9395d7a22"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:366 \u00B7 airline-web/public/javascripts/airplane.js:1240 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":366}}}],"partialFingerprints":{"codehealthFindingId/v1":"5900c3f0659e3bf9e6fb82367e0d344e598e25abdbca06fce4fe7853ff3da386"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:465 \u00B7 airline-web/public/javascripts/airport-asset.js:120 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":465}}}],"partialFingerprints":{"codehealthFindingId/v1":"6cf8bbdca6f6e5f1e5084d26668bb73652940e07636cad0832f320a472767611"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:1122 \u00B7 airline-web/public/javascripts/main.js:656 \u2014 the 2 copies are spread across 2 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1122}}}],"partialFingerprints":{"codehealthFindingId/v1":"cc4d838815e263b2c909fc1333e7525edf79ab313fb5fdd769a6c6722a70d798"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/airport.js:1057 \u00B7 airline-web/public/javascripts/country.js:148 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":1057}}}],"partialFingerprints":{"codehealthFindingId/v1":"730c2d9b90ed88510f78366a83103e85830da2c980f752f8aa302efc0ccde3fe"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:274 \u00B7 airline-web/public/javascripts/rivals.js:219 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":274}}}],"partialFingerprints":{"codehealthFindingId/v1":"74a8aea29d850724416b7880203326acdb5a225f2740dd12be83e16d7e30a70c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:472 \u00B7 airline-web/public/javascripts/rivals.js:320 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"196e2820232a26c64135639a273b38c1ce60f7667fa4221d94e0b4cc1b784005"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 4 locations): airline-web/public/javascripts/alliance.js:666 \u00B7 airline-web/public/javascripts/alliance.js:683 \u00B7 airline-web/public/javascripts/alliance.js:700 \u00B7 airline-web/public/javascripts/oil.js:195 \u2014 the 4 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":666}}}],"partialFingerprints":{"codehealthFindingId/v1":"88078cb7e3269629804bd8e887732a21eff6ccb5b219c7d535a1f5ea9e792ca6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/bank.js:123 \u00B7 airline-web/public/javascripts/office.js:570 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/bank.js"},"region":{"startLine":123}}}],"partialFingerprints":{"codehealthFindingId/v1":"c902cbdc512dfce0545ad20a0565c0a4f41c413770113e5c1f4d0e4775629384"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): airline-web/public/javascripts/country.js:99 \u00B7 airline-web/public/javascripts/event.js:455 \u00B7 airline-web/public/javascripts/log.js:129 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/country.js"},"region":{"startLine":99}}}],"partialFingerprints":{"codehealthFindingId/v1":"c9b6d8ab77742e22df471cc3fbff839f57afffae9b2cb22d72cab164ecab4d39"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (12 matched lines \u00D7 2 locations): airline-web/public/javascripts/delegate.js:109 \u00B7 airline-web/public/javascripts/settings.js:86 \u2014 the two spans are one implementation copied and then locally edited \u2014 57 tokens are still identical, in the same order in both files, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/delegate.js"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"864940691174953fc984da75e1a59d7ea2920320538d1128a2911f6d4f4db0d7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): airline-web/public/javascripts/event.js:14 \u00B7 airline-web/public/javascripts/log.js:19 \u00B7 airline-web/public/javascripts/log.js:41 \u2014 the 3 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/event.js"},"region":{"startLine":14}}}],"partialFingerprints":{"codehealthFindingId/v1":"df64503342cb4550a26355b0dca4db2f02791f2ea9a43933b12d90e11a3ebec0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 3 locations): airline-web/public/javascripts/event.js:27 \u00B7 airline-web/public/javascripts/log.js:54 \u00B7 airline-web/public/javascripts/rivals.js:193 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/event.js"},"region":{"startLine":27}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d4e98b3b37e10e6a4e8dc93480c40913edac94e655d13a2f683ea683864f642"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/heatmap.js:292 \u00B7 airline-web/public/javascripts/heatmap.js:304 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/heatmap.js"},"region":{"startLine":292}}}],"partialFingerprints":{"codehealthFindingId/v1":"a182dd40def36ef2bb24060ffabbea388200d16f160a621aa456663cb6ce39f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (12 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:69 \u00B7 airline-web/public/javascripts/office.js:97 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"e06e0cfa51e25bcb51570c1e1eec07c6d14ffff3512eca52790e83625b8a2eb0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block with local edits (11 matched lines \u00D7 2 locations): airline-web/public/fusioncharts/fusioncharts-jquery-plugin.js:68 \u00B7 airline-web/public/fusioncharts/fusioncharts-jquery-plugin.js:80 \u2014 the two spans are one implementation copied and then locally edited \u2014 67 tokens are still identical, in the same order in both spans, with only local edits between them. The copies have already begun to drift, which is this row\u0027s finding: an edit made to one and not the other changes behaviour silently. Diff the two spans first to learn what genuinely differs, then extract the shared core into one module both sites use, passing the differences in as parameters \u2014 or, if one copy exists only because the other could not be imported from its context, make one of them the single source the other is generated or re-exported from. If one copy is no longer reachable, delete it rather than letting it shadow the live one."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/fusioncharts/fusioncharts-jquery-plugin.js"},"region":{"startLine":68}}}],"partialFingerprints":{"codehealthFindingId/v1":"1371d481d671a8ef26dc4dcce889b2a5f9707d78b7c36aadb83d76e0d77c700d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 6 locations): airline-web/public/javascripts/admin.js:56 \u00B7 airline-web/public/javascripts/admin.js:271 \u00B7 airline-web/public/javascripts/alliance.js:1090 \u00B7 airline-web/public/javascripts/bank.js:68 \u00B7 \u002B2 more site(s) not listed \u2014 the 6 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/admin.js"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"5092ea8878c9675dba678168ca6542ab2c7865e3079a9dd4694f1bd973d3a3ed"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:109 \u00B7 airline-web/public/javascripts/rivals.js:377 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":109}}}],"partialFingerprints":{"codehealthFindingId/v1":"31a2010317c3ac32ffaeb272d0b88bf68b816a3b62a18036f9636b591e2e0452"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:1012 \u00B7 airline-web/public/javascripts/airline.js:1026 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1012}}}],"partialFingerprints":{"codehealthFindingId/v1":"47d0be3d6aca5e3434342f3199f44a3d100584bec0a532705ca967614d722d94"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2203 \u00B7 airline-web/public/javascripts/oil.js:192 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2203}}}],"partialFingerprints":{"codehealthFindingId/v1":"d87c062c58103ebe94097eb294ee0a05c6870d5f96af600d72c2d94ebbb4eb21"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2528 \u00B7 airline-web/public/javascripts/airport-asset.js:366 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2528}}}],"partialFingerprints":{"codehealthFindingId/v1":"fb29d15e1912831b9ba6f3fd4588b990bc595785dbb26b033c6fbb2233f73332"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2555 \u00B7 airline-web/public/javascripts/airline.js:2567 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2555}}}],"partialFingerprints":{"codehealthFindingId/v1":"31c51067e822266735a772eb553f0cd19a3163bfa036ddd727191d3a78299564"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2876 \u00B7 airline-web/public/javascripts/airline.js:2889 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2876}}}],"partialFingerprints":{"codehealthFindingId/v1":"d6003d2bd550936ec719cb360ed88d35bac4ef46be526df0dfae44a5ef3e2472"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): airline-web/public/javascripts/airplane.js:23 \u00B7 airline-web/public/javascripts/event.js:207 \u00B7 airline-web/public/javascripts/model-configuration.js:202 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":23}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff24d3639e75f8dd1d650f794095246ff08d16d94b7f3d0d707fd4d5243138e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 4 locations): airline-web/public/javascripts/airplane.js:728 \u00B7 airline-web/public/javascripts/event.js:18 \u00B7 airline-web/public/javascripts/log.js:23 \u00B7 airline-web/public/javascripts/log.js:45 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":728}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c282a44800285cb3b8feaf6dee948acd8ffabffa2fdfe1179711fdb88f0f487"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/airport-asset.js:100 \u00B7 airline-web/public/javascripts/facility.js:10 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport-asset.js"},"region":{"startLine":100}}}],"partialFingerprints":{"codehealthFindingId/v1":"464b26137570bc44be6724ba6442e04c289451ef3df414ab30f40f6c59ed55b7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 5 locations): airline-web/public/javascripts/airport.js:319 \u00B7 airline-web/public/javascripts/alliance.js:548 \u00B7 airline-web/public/javascripts/facility.js:71 \u00B7 airline-web/public/javascripts/office.js:964 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8f2bee3f1fc6be4243a8c915941815343dc31d243aee6e23fde2a90428e4f38"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:632 \u00B7 airline-web/public/javascripts/alliance.js:655 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":632}}}],"partialFingerprints":{"codehealthFindingId/v1":"5d0df5d26a6d66f3824546d9ca5a1a8149397d6f6a132145e2bf07f2d61ba0ec"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 3 locations): airline-web/public/javascripts/christmas.js:172 \u00B7 airline-web/public/javascripts/office.js:700 \u00B7 airline-web/public/javascripts/office.js:717 \u2014 the 3 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/christmas.js"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"0a5ef4f10f88aa587c088a8c4df0ccc5bc133c238a629b547cb29ee0cbffe9ce"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/country.js:165 \u00B7 airline-web/public/javascripts/office.js:602 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/country.js"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"45092ae0615a4e4152ac32061dac84e34273d6311161bf4bfb7d1c02575eeeb6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/country.js:213 \u00B7 airline-web/public/javascripts/country.js:226 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/country.js"},"region":{"startLine":213}}}],"partialFingerprints":{"codehealthFindingId/v1":"65a587884c58dd209048c11f1ba0528bd7447d9ddd188fc2e970267848bcdf75"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/heatmap.js:120 \u00B7 airline-web/public/javascripts/heatmap.js:133 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/heatmap.js"},"region":{"startLine":120}}}],"partialFingerprints":{"codehealthFindingId/v1":"a36a4969d19428a473447c49cd63663c0f1ce19df5292e913450bf9f34cf4b1a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (11 lines \u00D7 2 locations): airline-web/public/javascripts/link-history.js:72 \u00B7 airline-web/public/javascripts/link-history.js:85 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/link-history.js"},"region":{"startLine":72}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcdf0c55cffe35970cb97c9ec63ce5e12b5a3e351e429ace2432b2477898232d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): airline-web/public/firework/firework.js:1848 \u00B7 airline-web/public/firework/firework.js:1889 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1848}}}],"partialFingerprints":{"codehealthFindingId/v1":"1527fd201a76ed3a85a21d97fc7881d3003b390df9e47bc2fcfc7792e2a4d7c3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): airline-web/public/javascripts/airline.js:1753 \u00B7 airline-web/public/javascripts/alliance.js:1096 \u00B7 airline-web/public/javascripts/office.js:724 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1753}}}],"partialFingerprints":{"codehealthFindingId/v1":"e96c248377e395afce05430e9dffa1047f5e4b90c2e71b66b6b9d39e87bce3f6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): airline-web/public/javascripts/airline.js:2997 \u00B7 airline-web/public/javascripts/bank.js:55 \u00B7 airline-web/public/javascripts/oil.js:96 \u00B7 airline-web/public/javascripts/rivals.js:280 \u2014 the 4 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2997}}}],"partialFingerprints":{"codehealthFindingId/v1":"2ce33a0a0dbad2fae8f9297d2df596e874aeb978270fc83150c8f16ba14694f6"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 4 locations): airline-web/public/javascripts/airplane.js:94 \u00B7 airline-web/public/javascripts/airport-asset.js:80 \u00B7 airline-web/public/javascripts/country.js:368 \u00B7 airline-web/public/javascripts/office.js:1172 \u2014 the 4 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":94}}}],"partialFingerprints":{"codehealthFindingId/v1":"e8f11f23c8235a1b2954bbdcc38c6d6c4bf0692e23298ef3ad1243360b5436d0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 10 locations): airline-web/public/javascripts/airplane.js:1089 \u00B7 airline-web/public/javascripts/alliance.js:673 \u00B7 airline-web/public/javascripts/alliance.js:690 \u00B7 airline-web/public/javascripts/alliance.js:707 \u00B7 \u002B6 more site(s) not listed \u2014 the 10 copies are spread across 5 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1089}}}],"partialFingerprints":{"codehealthFindingId/v1":"c283500ed47c758a302e6b6c167d32e59ba5d13a0e0d97473ecd3dc2fd5a7bfc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 15 locations): airline-web/public/javascripts/airplane.js:1661 \u00B7 airline-web/public/javascripts/airport.js:1480 \u00B7 airline-web/public/javascripts/campaign.js:169 \u00B7 airline-web/public/javascripts/campaign.js:194 \u00B7 \u002B11 more site(s) not listed \u2014 the 15 copies are spread across 8 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1661}}}],"partialFingerprints":{"codehealthFindingId/v1":"16a7fdbc72d5f97ec4df89bd40cbd0954fd5b547621a5583837cd64bb9828c2d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): airline-web/public/javascripts/airport.js:1345 \u00B7 airline-web/public/javascripts/rivals.js:419 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":1345}}}],"partialFingerprints":{"codehealthFindingId/v1":"1a090f4ed4a97f7e005c2ee9de0a938cb3820d100ba116d62ed4949059cb98e1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): airline-web/public/javascripts/alliance.js:710 \u00B7 airline-web/public/javascripts/office.js:92 \u00B7 airline-web/public/javascripts/office.js:1133 \u2014 the 3 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":710}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8b5d4bd4237458b77c35827922cba976f4d334f6f2519732f95c5234d097d19"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 3 locations): airline-web/public/javascripts/christmas.js:143 \u00B7 airline-web/public/javascripts/country.js:47 \u00B7 airline-web/public/javascripts/test-airport.js:140 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/christmas.js"},"region":{"startLine":143}}}],"partialFingerprints":{"codehealthFindingId/v1":"0325d1d8b242865c54bacefb5af174e6f3e69fcdb11a992497badce732cceb5b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): airline-web/public/javascripts/event.js:258 \u00B7 airline-web/public/javascripts/office.js:602 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/event.js"},"region":{"startLine":258}}}],"partialFingerprints":{"codehealthFindingId/v1":"970bb88c6897c170d5bbde42e5241aa184e5578ac1ee55628cae6f2cd94a3a36"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 5 locations): airline-web/public/javascripts/office.js:533 \u00B7 airline-web/public/javascripts/office.js:870 \u00B7 airline-web/public/javascripts/office.js:904 \u00B7 airline-web/public/javascripts/office.js:1055 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":533}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa7d76250c3c738836344e9d3480aba1eaebc7cf716762415d217fe3c51c394c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:552 \u00B7 airline-web/public/javascripts/office.js:613 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":552}}}],"partialFingerprints":{"codehealthFindingId/v1":"07a4db77f284b091ecfb4fa5d689f9aa66c92ffcdbb1806306d85585efc67304"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): airline-web/public/javascripts/oil.js:77 \u00B7 airline-web/public/javascripts/oil.js:104 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/oil.js"},"region":{"startLine":77}}}],"partialFingerprints":{"codehealthFindingId/v1":"cfb12d6c97bb0c7951d5fdd75cd138133436d913136e2bf17e57f28d8f461cee"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): airline-web/public/javascripts/rivals.js:356 \u00B7 airline-web/public/javascripts/rivals.js:368 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/rivals.js"},"region":{"startLine":356}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cbe11463cd2fd7f8f99da5c07fcf0e5f0e7dd0965569ef31d82fc2b32b05902"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (10 lines \u00D7 2 locations): airline-web/public/javascripts/search.js:771 \u00B7 airline-web/public/javascripts/search.js:851 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":771}}}],"partialFingerprints":{"codehealthFindingId/v1":"9d24595a222a876f57a33428f425580d9f3fce16cfa324ba04532ff4516068a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): airline-web/public/javascripts/airline.js:130 \u00B7 airline-web/public/javascripts/airport.js:1040 \u00B7 airline-web/public/javascripts/delegate.js:129 \u2014 the 3 copies are spread across 3 files, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":130}}}],"partialFingerprints":{"codehealthFindingId/v1":"b42a3e8d455f6af10e4d9f642ebaa0e0b49279cbd611c821087b3accc9989146"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:307 \u00B7 airline-web/public/javascripts/country.js:48 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":307}}}],"partialFingerprints":{"codehealthFindingId/v1":"5f19afcb859ca53e806aa81611c6d5db2b656034a8b5f5960fbe42af20a2a67e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2907 \u00B7 airline-web/public/javascripts/airline.js:2921 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2907}}}],"partialFingerprints":{"codehealthFindingId/v1":"38c0c2ce69cfad267b9042ab3d1a541dae79131a090051d5d899bcc12e60ae07"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 7 locations): airline-web/public/javascripts/airline.js:858 \u00B7 airline-web/public/javascripts/airport.js:468 \u00B7 airline-web/public/javascripts/alliance.js:515 \u00B7 airline-web/public/javascripts/departures.js:23 \u00B7 \u002B3 more site(s) not listed \u2014 the 7 copies are spread across 7 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":858}}}],"partialFingerprints":{"codehealthFindingId/v1":"a7a705a5c383add3a32d52e33de1a3a364781be160e08ee2ff560f1fdc02163e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:60 \u00B7 airline-web/public/javascripts/office.js:263 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"64e5e39979c7ba95127c7b8ecbca5991156420dee32b922ee11ee25ac337d3cd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): airline-web/public/javascripts/airplane.js:141 \u00B7 airline-web/public/javascripts/event.js:30 \u00B7 airline-web/public/javascripts/log.js:57 \u00B7 airline-web/public/javascripts/rivals.js:196 \u2014 the 4 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"09c847f56e7cd189557fa583e402b0d8755df8fa5c5f802ffd7f5bdc49232d20"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 4 locations): airline-web/public/javascripts/airplane.js:275 \u00B7 airline-web/public/javascripts/airplane.js:581 \u00B7 airline-web/public/javascripts/airplane.js:1143 \u00B7 airline-web/public/javascripts/airplane.js:1618 \u2014 all 4 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":275}}}],"partialFingerprints":{"codehealthFindingId/v1":"d01b45c4ed3e84a75b0324b9fd571f053cd8ca43960ad525557b08f9be9d2cb7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:410 \u00B7 airline-web/public/javascripts/event.js:634 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":410}}}],"partialFingerprints":{"codehealthFindingId/v1":"03270d6ee32c5efdc4b8f17d4c6490c1e9f2e13cf2530c8f527f047426342ddf"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:422 \u00B7 airline-web/public/javascripts/airplane.js:505 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"617bc40d9bf0fdcf7ed73473d73879e739003d0961f691ff646b52935465d072"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): airline-web/public/javascripts/airplane.js:1268 \u00B7 airline-web/public/javascripts/airplane.js:1659 \u00B7 airline-web/public/javascripts/event.js:202 \u2014 the 3 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1268}}}],"partialFingerprints":{"codehealthFindingId/v1":"5332e480c90183e3b01ff8bf661000c877ee5b0a40d21b5f384942d0392468d5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/airport-asset.js:308 \u00B7 airline-web/public/javascripts/airport-asset.js:389 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport-asset.js"},"region":{"startLine":308}}}],"partialFingerprints":{"codehealthFindingId/v1":"795c4c8165d736360335434c7e1b65d3c3aabfc7d2667aa9cb80cf8783801c55"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): airline-web/public/javascripts/airport-asset.js:346 \u00B7 airline-web/public/javascripts/rivals.js:278 \u00B7 airline-web/public/javascripts/search.js:48 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport-asset.js"},"region":{"startLine":346}}}],"partialFingerprints":{"codehealthFindingId/v1":"b66d2aa71d7d2780dcc38b28faacaf64cb879a425a59a52bfb911d51fc09408a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:594 \u00B7 airline-web/public/javascripts/oil.js:178 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":594}}}],"partialFingerprints":{"codehealthFindingId/v1":"890b8254e3d5e6b6ff9aeebbc35d85c6b5687661776e523cad53431881508cb9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 3 locations): airline-web/public/javascripts/bank.js:54 \u00B7 airline-web/public/javascripts/office.js:601 \u00B7 airline-web/public/javascripts/oil.js:95 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/bank.js"},"region":{"startLine":54}}}],"partialFingerprints":{"codehealthFindingId/v1":"e7eba5d6205d76b5eda59a6a73477ab8533ae2671a45f105db3abf0bf168483d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 5 locations): airline-web/public/javascripts/campaign.js:69 \u00B7 airline-web/public/javascripts/event.js:26 \u00B7 airline-web/public/javascripts/event.js:636 \u00B7 airline-web/public/javascripts/log.js:53 \u00B7 \u002B1 more site(s) not listed \u2014 the 5 copies are spread across 4 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/campaign.js"},"region":{"startLine":69}}}],"partialFingerprints":{"codehealthFindingId/v1":"a75246c81083cf6aff4fb73efc652ff1ef233680be9bf40e879dac9cac2c439a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/chat.js:172 \u00B7 airline-web/public/javascripts/chat.js:183 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":172}}}],"partialFingerprints":{"codehealthFindingId/v1":"00bd3e4f58df2bcdfc5ac070ad72a4a2d8934ed5788e9aed20f155fbebecaa79"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/main.js:663 \u00B7 airline-web/public/javascripts/office.js:665 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/main.js"},"region":{"startLine":663}}}],"partialFingerprints":{"codehealthFindingId/v1":"608e1c96fa745c148b0f9dcc74377548908c8ac440e7d5e24d108ce91e25f1ca"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:901 \u00B7 airline-web/public/javascripts/office.js:1112 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":901}}}],"partialFingerprints":{"codehealthFindingId/v1":"3ba4058e3d9fbc036b332e03c14b0ff53b74908a8d77f278877ddafda2022729"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/prompt.js:255 \u00B7 airline-web/public/javascripts/prompt.js:290 \u2014 all 2 copies are in the same file, and the SHAPE of this repetition could not be determined. It is not a run of declarations, a listing, a declaration header, a type body or a slice through a construct \u2014 and it was not measured as a run of executable statements either, so this row cannot tell you whether a function can stand where these lines are. Read the two spans before acting, because the move is opposite in the two cases. Where they are statements, the ordinary answer holds: give the shared part one home and call it from each site. Where they turn out to be declarations, a literal\u0027s entries, or the cases of an enumeration, there is no call site to call anything from, and collapsing them would delete what each copy pins \u2014 a shared base type, a generated set, or one exported constant each site refers to is the move instead, and sometimes the honest answer is that there is nothing to extract at all. Reported because the copies drift apart the first time only one of them is edited, which is true whichever of those they are."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/prompt.js"},"region":{"startLine":255}}}],"partialFingerprints":{"codehealthFindingId/v1":"e44a61b5c104e269296675e7ef916fed2fa6dffce25b6ba849f1a100b269c4a0"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (9 lines \u00D7 2 locations): airline-web/public/javascripts/rivals.js:266 \u00B7 airline-web/public/javascripts/rivals.js:294 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/rivals.js"},"region":{"startLine":266}}}],"partialFingerprints":{"codehealthFindingId/v1":"538614000aec92a8c853889f98a0e2613b53da9d9f67dc78fc8235bc2b78670c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): airline-web/public/javascripts/airline.js:722 \u00B7 airline-web/public/javascripts/airport.js:1044 \u00B7 airline-web/public/javascripts/prompt.js:52 \u2014 the 3 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":722}}}],"partialFingerprints":{"codehealthFindingId/v1":"d163b9e12cd7c3faf914ae412fd4725d32d317f2d0624bbe52f17b1e9fe152dc"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 4 locations): airline-web/public/javascripts/airline.js:814 \u00B7 airline-web/public/javascripts/airline.js:841 \u00B7 airline-web/public/javascripts/alliance.js:1008 \u00B7 airline-web/public/javascripts/office.js:931 \u2014 the 4 copies are spread across 3 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":814}}}],"partialFingerprints":{"codehealthFindingId/v1":"964d8f43096ba896a47d8397f8d79b0987c5fcb18879096bb161afa5655bb668"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 8 locations): airline-web/public/javascripts/airline.js:918 \u00B7 airline-web/public/javascripts/airline.js:1670 \u00B7 airline-web/public/javascripts/airport-asset.js:116 \u00B7 airline-web/public/javascripts/airport-asset.js:144 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 5 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":918}}}],"partialFingerprints":{"codehealthFindingId/v1":"6e6b18196589563afe20a67321e7be643b4b755613465f4222a68a61da138b5f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2436 \u00B7 airline-web/public/javascripts/airline.js:2444 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2436}}}],"partialFingerprints":{"codehealthFindingId/v1":"e646714232d7c6e9de9e012059ecef65806289095359f85a9655b2fce90bcea1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2489 \u00B7 airline-web/public/javascripts/airline.js:2498 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2489}}}],"partialFingerprints":{"codehealthFindingId/v1":"e3c48d885f3b93b29e0f8055834fe7666c1ef05855c65683cfe1b13643ac143f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2933 \u00B7 airline-web/public/javascripts/airline.js:2941 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2933}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce19c9fce3cba8ffa7b5d22ab452f06ceb4c0a61b65970e597d98dcccfe7a687"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:319 \u00B7 airline-web/public/javascripts/airplane.js:1302 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":319}}}],"partialFingerprints":{"codehealthFindingId/v1":"e16c1f4f0b7fc9d781a206b83bf53144acf3a115a9eca21fb98eb805aa1960fd"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): airline-web/public/javascripts/airplane.js:436 \u00B7 airline-web/public/javascripts/airplane.js:461 \u00B7 airline-web/public/javascripts/airplane.js:515 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":436}}}],"partialFingerprints":{"codehealthFindingId/v1":"05e71492698c9901bdd9db43202732c7e1b8486069ad37a196673fc539c8b633"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 8 locations): airline-web/public/javascripts/alliance.js:41 \u00B7 airline-web/public/javascripts/alliance.js:517 \u00B7 airline-web/public/javascripts/country.js:445 \u00B7 airline-web/public/javascripts/delegate.js:135 \u00B7 \u002B4 more site(s) not listed \u2014 the 8 copies are spread across 5 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":41}}}],"partialFingerprints":{"codehealthFindingId/v1":"2770035ef26316f57008681f52a30d67e29a8bfc4bdc25a2e9f63bd56c32b6b9"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/link-history.js:111 \u00B7 airline-web/public/javascripts/link-history.js:120 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/link-history.js"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"c611a6c4d038ff7f6ff8730977d97d9c7768435d96b6b8738bc384a2b2047861"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/main.js:744 \u00B7 airline-web/public/javascripts/office.js:1013 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/main.js"},"region":{"startLine":744}}}],"partialFingerprints":{"codehealthFindingId/v1":"ce78b71e83da9f812f05c48cb7bb61e49482889f4a661643349292eadff191f7"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 3 locations): airline-web/public/javascripts/office.js:136 \u00B7 airline-web/public/javascripts/office.js:934 \u00B7 airline-web/public/javascripts/office.js:968 \u2014 all 3 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":136}}}],"partialFingerprints":{"codehealthFindingId/v1":"3e2d381f2ef2fa26f291541ddcdc803b1df4fd5f9e9f0a15f1717b2de00f53c3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:565 \u00B7 airline-web/public/javascripts/search.js:849 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":565}}}],"partialFingerprints":{"codehealthFindingId/v1":"16c21959cdccbe63c3d426f720e4579bb7273412d77a04fbe6204a88a1d993d1"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (8 lines \u00D7 2 locations): airline-web/public/javascripts/oil.js:269 \u00B7 airline-web/public/javascripts/oil.js:279 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/oil.js"},"region":{"startLine":269}}}],"partialFingerprints":{"codehealthFindingId/v1":"8c2cd95c1f4361b78c06a5922047202b19347e1791bb0977d8c9e591a4db4a5d"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/css-templates/treviso/js/custom.js:108 \u00B7 airline-web/public/css-templates/treviso/js/custom.js:121 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/js/custom.js"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"47f630d0ee222d8801ae480d03d7f5e59f73d50504466f42f97e8f0f3fbab227"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): airline-web/public/javascripts/airline.js:750 \u00B7 airline-web/public/javascripts/airline.js:757 \u00B7 airline-web/public/javascripts/airport.js:115 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":750}}}],"partialFingerprints":{"codehealthFindingId/v1":"f500f481dc081af4e642f4c7372680fe7455c1c874bb9663f2a24022fc2dafa8"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 3 locations): airline-web/public/javascripts/airline.js:979 \u00B7 airline-web/public/javascripts/airport.js:1061 \u00B7 airline-web/public/javascripts/country.js:152 \u2014 the 3 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it. There is one copy in each of 3 separate files rather than several in one place, so check first whether these are sibling modules that each declare their own version of one shape \u2014 one per entity, per provider, per language. Where they are, no single extracted module collapses them: each module still has to be written, and what recurs is the TEMPLATE. The moves that do collapse a template are to generate these modules from the set they enumerate, or to replace the repeated construction with one factory each site calls with its own values \u2014 and where the set is the point, each module pinning one distinct thing, the repetition IS the enumeration and there is nothing to delete."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":979}}}],"partialFingerprints":{"codehealthFindingId/v1":"fedf532a6ae9be21e81865352ea6cc824e3190cc6d48ae03ef6c6b5f31327757"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2026 \u00B7 airline-web/public/javascripts/airline.js:2048 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2026}}}],"partialFingerprints":{"codehealthFindingId/v1":"e0cc061107e010e95e2efc45af16a3809bf64099c7b287c7e7765e96c3f54b64"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2054 \u00B7 airline-web/public/javascripts/gadgets.js:445 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2054}}}],"partialFingerprints":{"codehealthFindingId/v1":"d09e1581507bec07e31f37a462c681b4c1854064b69e258d52f9b913c5653e3a"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:2272 \u00B7 airline-web/public/javascripts/airline.js:2281 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2272}}}],"partialFingerprints":{"codehealthFindingId/v1":"46f1c872f9bc6917ed6f80323135559b5c02c44c020c03079cc1c0b7b8e29b24"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:819 \u00B7 airline-web/public/javascripts/model-configuration.js:127 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":819}}}],"partialFingerprints":{"codehealthFindingId/v1":"8f3b6281e45066e04a5f269b5aaf9112313ca336a6bbdb8f8e07cb0d4b7b4c18"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/airplane.js:1419 \u00B7 airline-web/public/javascripts/airplane.js:1427 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1419}}}],"partialFingerprints":{"codehealthFindingId/v1":"bf6f053b996c24394c36225a64da0d5cea0ca587c555a512fb1be306160b0460"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/airport.js:406 \u00B7 airline-web/public/javascripts/event.js:383 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":406}}}],"partialFingerprints":{"codehealthFindingId/v1":"54f5e36d6443b920b7d2b7a1086c5bc80c4bb21e43c14660474bf49241170447"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:876 \u00B7 airline-web/public/javascripts/rivals.js:421 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":876}}}],"partialFingerprints":{"codehealthFindingId/v1":"5ebc5904e427a28dd90a3f48a959b944eee17a8a346edaf8a0b13fa2602f9658"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/chat.js:355 \u00B7 airline-web/public/javascripts/chat.js:385 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d32884fd6f83f590cb124135b772eae4da3b89f33eb2e61b1345d3598ed5f9f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/office.js:422 \u00B7 airline-web/public/javascripts/office.js:463 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":422}}}],"partialFingerprints":{"codehealthFindingId/v1":"72fa09c8c78e465dccb7ef0987fe110255a6dc808041ce254ad20b1295d37a83"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (7 lines \u00D7 2 locations): airline-web/public/javascripts/plot-fusioncharts.js:286 \u00B7 airline-web/public/javascripts/plot-fusioncharts.js:968 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":286}}}],"partialFingerprints":{"codehealthFindingId/v1":"45a40b7414b36ca5fe2968682c24b058b6f1ba116e7ab8201ba808b3c97bfd4e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): airline-web/public/firework/fscreen.js:49 \u00B7 airline-web/public/firework/fscreen.js:55 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/fscreen.js"},"region":{"startLine":49}}}],"partialFingerprints":{"codehealthFindingId/v1":"dfc8a4f3bd9b8e06d3d803e6f62c669795023710f92cad5708cc9d75e823e67e"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:768 \u00B7 airline-web/public/javascripts/alliance.js:873 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":768}}}],"partialFingerprints":{"codehealthFindingId/v1":"3f23c16414268dc7632a47df8a905f6a0b185c3894b1b63506bc264cffb2c7e3"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): airline-web/public/javascripts/alliance.js:808 \u00B7 airline-web/public/javascripts/rivals.js:465 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":808}}}],"partialFingerprints":{"codehealthFindingId/v1":"235e9931c601329af239709297715e5f574215b1bba2be3c74f6c2cacd1b5024"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 3 locations): airline-web/public/javascripts/departure-board/departure-board.js:79 \u00B7 airline-web/public/javascripts/departure-board/departure-board.js:87 \u00B7 airline-web/public/javascripts/departure-board/departure-board.js:96 \u2014 all 3 copies are in the same file, so extract the block into one function there and call it from every one of those sites \u2014 resolving only two of them leaves the rest to drift apart the first time one is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/departure-board/departure-board.js"},"region":{"startLine":79}}}],"partialFingerprints":{"codehealthFindingId/v1":"55418c2441e447bbdbaa1d9edea4f3a6e8c4c4818d0db4b930f47718618614a5"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): airline-web/public/javascripts/gadgets.js:164 \u00B7 airline-web/public/javascripts/gadgets.js:170 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":164}}}],"partialFingerprints":{"codehealthFindingId/v1":"244f527d034218428964e3ecc7178a4b789273fd7f5384ae79edc5b564c4ec3b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): airline-web/public/javascripts/gadgets.js:515 \u00B7 airline-web/public/javascripts/gadgets.js:547 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":515}}}],"partialFingerprints":{"codehealthFindingId/v1":"fa9b1fdd66edb48d3edc2dedd941b648da8eaed43330f16a3f2d27dc6339e764"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (6 lines \u00D7 2 locations): airline-web/public/javascripts/prompt.js:301 \u00B7 airline-web/public/javascripts/prompt.js:308 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/prompt.js"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"30fe5dfef81c458150fce69e8bf501edd360149cedf90a735cb46fc515dccfcb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 11 locations): airline-web/public/javascripts/airline.js:783 \u00B7 airline-web/public/javascripts/airline.js:788 \u00B7 airline-web/public/javascripts/office.js:390 \u00B7 airline-web/public/javascripts/office.js:395 \u00B7 \u002B7 more site(s) not listed \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":783}}}],"partialFingerprints":{"codehealthFindingId/v1":"15f26a257cf3baca4fcce4837a290029306a82d9820714bd9a42182ade6fc817"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): airline-web/public/javascripts/airline.js:997 \u00B7 airline-web/public/javascripts/search.js:819 \u2014 the 2 copies sit in sibling files in one directory, so check first whether one of them (or an existing module there) already owns this behaviour and the others should call it; otherwise extract it into one module in that directory and have each site call it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":997}}}],"partialFingerprints":{"codehealthFindingId/v1":"c035778b543f3a8fac27dc0457a61eedaae5e410467dbea8e3970af52cebba2c"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): airline-web/public/javascripts/airport.js:83 \u00B7 airline-web/public/javascripts/airport.js:1010 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"d617cd78f8104b47e7dc965d244206c23131bd1944d61780ea47b5dddacbbd3b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): airline-web/public/javascripts/airport.js:1412 \u00B7 airline-web/public/javascripts/profile.js:54 \u2014 the 2 copies are spread across 2 files, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":1412}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd4c4a1c85152ed600dde65f62120e69637439b3b4a6afac0eb3155cfb9be31f"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): airline-web/public/javascripts/jemoji/jemoji.js:232 \u00B7 airline-web/public/javascripts/jemoji/jemoji.js:245 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":232}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a316a85c30274ed99216f51058614e83dbd7670d9c23abcb98edad8237b261b"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): airline-web/public/javascripts/link-history.js:367 \u00B7 airline-web/public/javascripts/link-history.js:381 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/link-history.js"},"region":{"startLine":367}}}],"partialFingerprints":{"codehealthFindingId/v1":"e2f47ab9bc1392574b0229ad4ce3d6fcbed67669922c96d0509f1faa913617ae"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): airline-web/public/javascripts/main.js:364 \u00B7 airline-web/public/javascripts/main.js:375 \u2014 both copies are in the same file, so extract the block into one function there and call it from each site \u2014 the copies drift apart the first time only one of them is edited."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/main.js"},"region":{"startLine":364}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d7c2bab39ad451975c8a266dea62c8d7367ad4500b29609077da76054974bbb"}},{"ruleId":"R10","level":"warning","message":{"text":"Duplicated block (5 lines \u00D7 2 locations): airline-web/public/javascripts/oil.js:61 \u00B7 airline-web/public/javascripts/oil.js:223 \u2014 all 2 copies are in the same file, and the CITED SPAN is not a self-contained block \u2014 it runs from inside one construct into the next (the tail of a branch plus the head of the following one, a run of switch arms, the end of a declaration plus the list that follows it) rather than covering a whole unit. So do not lift these lines literally: no call can be substituted for a half-open construct. Extract the enclosing repeated UNIT instead \u2014 the whole function, component or branch these lines sit in \u2014 and where the repetition IS the construct (a run of switch arms, a stack of near-identical declarations) replace it with one table or registry looked up by key rather than a helper each arm calls. The copies still drift apart the first time only one of them is edited, which is why this is reported."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/oil.js"},"region":{"startLine":61}}}],"partialFingerprints":{"codehealthFindingId/v1":"dda860494a4d8b0f04f9f38b06ecb33bd90b890bdbba0fe8ba683f681dc83800"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 25, cognitive 43): (anonymous) has cyclomatic complexity 25 and cognitive complexity 43; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/css-templates/treviso/js/responsiveslides.js"},"region":{"startLine":34}}}],"partialFingerprints":{"codehealthFindingId/v1":"85b5116d09713999d372de2b7bc14e0b100888c98d445baa35da78cd1fe64979"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function updatePlanLinkInfo (cyclomatic 23, cognitive 33): updatePlanLinkInfo has cyclomatic complexity 23 and cognitive complexity 33; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":951}}}],"partialFingerprints":{"codehealthFindingId/v1":"e14dbabc0312a2573a90b4a6d4cd2fed637f4f2513f30adc771a52d274ca5bf4"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function burst (cyclomatic 21, cognitive 29): burst has cyclomatic complexity 21 and cognitive complexity 29; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1746}}}],"partialFingerprints":{"codehealthFindingId/v1":"59884a51bd921ea3ca3f2ba62f3934aa8418b9b794967ac207aa603c1a111704"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function updateRankingTable (cyclomatic 20, cognitive 21): updateRankingTable has cyclomatic complexity 20 and cognitive complexity 21; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/ranking.js"},"region":{"startLine":37}}}],"partialFingerprints":{"codehealthFindingId/v1":"ec89a2cd12c3dc45df0e851943c792339700a6d96158c6037ed56ac91bcc6bc2"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 17, cognitive 23): (anonymous) has cyclomatic complexity 17 and cognitive complexity 23; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/link-history.js"},"region":{"startLine":399}}}],"partialFingerprints":{"codehealthFindingId/v1":"dafa795a941f9bdc8485f03eb8ed9a55c33f0f912ea389c3e20ddeedfd1068ca"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function success (cyclomatic 16, cognitive 45): success has cyclomatic complexity 16 and cognitive complexity 45; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2857}}}],"partialFingerprints":{"codehealthFindingId/v1":"82d25fe7c521d015081731ef03cd624b5a7ecc0cad9fef3d621a957dbf6e2acd"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function success (cyclomatic 16, cognitive 39): success has cyclomatic complexity 16 and cognitive complexity 39; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":112}}}],"partialFingerprints":{"codehealthFindingId/v1":"75a2ca18780a7bf6864a6e82fcab0088b364a217293ed82ba04dcc9eae165b26"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 16, cognitive 30): (anonymous) has cyclomatic complexity 16 and cognitive complexity 30; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":335}}}],"partialFingerprints":{"codehealthFindingId/v1":"7a8089487cfc9ac192129d88f1772a7dff74e8809cde082adaac1fe5d21264c0"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 15, cognitive 41): (anonymous) has cyclomatic complexity 15 and cognitive complexity 41; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1260}}}],"partialFingerprints":{"codehealthFindingId/v1":"7f9a83bd1edc43616e478ec61274547f26d255fdc025f646735976c7298f127c"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 14, cognitive 27): (anonymous) has cyclomatic complexity 14 and cognitive complexity 27; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"2cf920a3fceabcbc23c0bf0edff329e95fb0ddf9199a50f8076d029f3dc6ec26"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function success (cyclomatic 14, cognitive 26): success has cyclomatic complexity 14 and cognitive complexity 26; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/facility.js"},"region":{"startLine":98}}}],"partialFingerprints":{"codehealthFindingId/v1":"2229cf1d6878199f74777df83dea9dc99177c59630785cc59096aa9026957ee6"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function checkTutorial (cyclomatic 14, cognitive 18): checkTutorial has cyclomatic complexity 14 and cognitive complexity 18; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/prompt.js"},"region":{"startLine":207}}}],"partialFingerprints":{"codehealthFindingId/v1":"92bb03827ca686508092cffb5eb19270f39a2f0c43b835493bfbd8da0a2601f4"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getCapacityImageBar (cyclomatic 14, cognitive 14): getCapacityImageBar has cyclomatic complexity 14 and cognitive complexity 14; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2348}}}],"partialFingerprints":{"codehealthFindingId/v1":"1ebfc412729862fd023dde13eb6375ea464892f75359b1d9c2cd698e3fa76782"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function crysanthemumShell (cyclomatic 14, cognitive 12): crysanthemumShell has cyclomatic complexity 14 and cognitive complexity 12; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":572}}}],"partialFingerprints":{"codehealthFindingId/v1":"9a1d09548561616460835f7bff51e92587bf052aa78145535c0dadd3d2dcdf18"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function getLinkColor (cyclomatic 13, cognitive 25): getLinkColor has cyclomatic complexity 13 and cognitive complexity 25; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":377}}}],"partialFingerprints":{"codehealthFindingId/v1":"00c8c1402169a1ffefe88be2001f2187607abf0d44c9e84cd363f75a6fac6d1d"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function linkConfirmation (cyclomatic 13, cognitive 21): linkConfirmation has cyclomatic complexity 13 and cognitive complexity 21; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2628}}}],"partialFingerprints":{"codehealthFindingId/v1":"858b8155643d894060353f3f1ab88e48a0f3ace69628173ddb7964099b172253"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function onmessage (cyclomatic 13, cognitive 21): onmessage has cyclomatic complexity 13 and cognitive complexity 21; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/chat.js"},"region":{"startLine":197}}}],"partialFingerprints":{"codehealthFindingId/v1":"72597ce45abf99fac3e3e6e020cfbb4f8f6cf8412e80cbd0eb806ea5a7d23e41"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function jemoji (cyclomatic 13, cognitive 18): jemoji has cyclomatic complexity 13 and cognitive complexity 18; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":7}}}],"partialFingerprints":{"codehealthFindingId/v1":"a9d9b32878a345866810a8b129be0def7a5dfd0864271f08199cad763b4bb8c2"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function (anonymous) (cyclomatic 13, cognitive 17): (anonymous) has cyclomatic complexity 13 and cognitive complexity 17; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive is at or above cyclomatic here, so the branching is nested or entangled rather than laid out side by side \u2014 extracting each decision into its own named function is the change that pays. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":2090}}}],"partialFingerprints":{"codehealthFindingId/v1":"6375a1a9fc6f93d6575f9dc13491ba5667955e42d2ab849c1e6ff15d28dd0163"}},{"ruleId":"R2","level":"warning","message":{"text":"Complex function searchLinkHistory (cyclomatic 13, cognitive 12): searchLinkHistory has cyclomatic complexity 13 and cognitive complexity 12; this row is raised above a cyclomatic bar of 10. The two numbers answer different questions and the gap between them is what decides whether to act: cyclomatic counts the independent arms through the body, cognitive counts what it costs to hold them in your head, so nesting and mixed boolean chains raise it while a flat run of independent arms does not. Cognitive sits below cyclomatic here, so much of the count is breadth \u2014 arms side by side rather than stacked \u2014 and splitting per arm would leave a function per arm; group the work between the checks into named steps instead. Measured by this repository\u0027s own parse of the file, so a body assembled at runtime, or generated, is counted as written rather than as it executes."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":295}}}],"partialFingerprints":{"codehealthFindingId/v1":"2120c4dd9fa04319c30c7ca674774b0bc99813a35334f09f25b2c06a9c0996ff"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/airline.js: 2743 lines of code: airline-web/public/javascripts/airline.js has 2743 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airline.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"0030c204e229307391075ed8fda82037af52e418180c7b09c60a43b54fef7c43"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/firework/firework.js: 2023 lines of code: airline-web/public/firework/firework.js has 2023 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/firework/firework.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"cdf65298253fe17b56a217ed6cc97bdcba3a6c41e6f2b3317ba1c9efbea0638b"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/airplane.js: 1506 lines of code: airline-web/public/javascripts/airplane.js has 1506 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airplane.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c3630fa374154dba7c99ba34e02fec7dd2a15b95a36546e4cd3bcd64356cab02"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/plot-fusioncharts.js: 1393 lines of code: airline-web/public/javascripts/plot-fusioncharts.js has 1393 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/plot-fusioncharts.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"c270d997ec248054c17b4737733f8d6d7bd290d44b3938395b31a252b2adbb42"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/airport.js: 1338 lines of code: airline-web/public/javascripts/airport.js has 1338 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/airport.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14fe2ef063f5d129166554f21d8cf74ee933e877b7801e3dc606440a09d9f476"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/office.js: 1033 lines of code: airline-web/public/javascripts/office.js has 1033 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/office.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"62a45aadf24431c706bcd9b267535bc5353563d9fb7c550fd1800028ede9c6fb"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/alliance.js: 1015 lines of code: airline-web/public/javascripts/alliance.js has 1015 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/alliance.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"dd98e3329a99dbe3f6f885061e2a32f3b48f9576c65565807a3dee4a8338ae03"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/search.js: 834 lines of code: airline-web/public/javascripts/search.js has 834 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/search.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"14e3744ef0529e1188d4d55c31ae6149986139fe52e613793cbc588c43bd26c7"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/main.js: 774 lines of code: airline-web/public/javascripts/main.js has 774 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/main.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e98155e7c7678e869099b3dffd15c3e2fbef76292e5aeb175ee056de029b932"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/gadgets.js: 751 lines of code: airline-web/public/javascripts/gadgets.js has 751 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/gadgets.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"68aff220f8c95860af90699b73bf55ab964d4a3e68f820831431be2ee116b7b6"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/fusioncharts/fusioncharts-jquery-plugin.js: 589 lines of code: airline-web/public/fusioncharts/fusioncharts-jquery-plugin.js has 589 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/fusioncharts/fusioncharts-jquery-plugin.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"a4d9e6c473b20e347576ab0f8e9e8a4888bcded4b5016b192f2c07cca292db55"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/event.js: 560 lines of code: airline-web/public/javascripts/event.js has 560 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/event.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"323ef1893d66a75d8b3b1ab7e57d4b00c2678622cb4032714d9ceef360ade27c"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/jemoji/jemoji.js: 468 lines of code: airline-web/public/javascripts/jemoji/jemoji.js has 468 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"23b76d84bc238b5d995e0687342dce3b1dae917689bb3949313c8cd459c22ee4"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/country.js: 424 lines of code: airline-web/public/javascripts/country.js has 424 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/country.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5abfe0b680aa33cfcd6ac2a22385799f5194e197f0e785f79405cb761c48237"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/rivals.js: 421 lines of code: airline-web/public/javascripts/rivals.js has 421 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/rivals.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"7d10c45dabac4fdbd2caf6896af107a1468eb3630ebe00a0f2df1c3fb2c2ea3e"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/map-style.js: 420 lines of code: airline-web/public/javascripts/map-style.js has 420 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/map-style.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"979d91a1413d5e68bb20a5cdaf10379bd3d67dcb673f67e850fed43aacef3def"}},{"ruleId":"R3","level":"warning","message":{"text":"airline-web/public/javascripts/link-history.js: 419 lines of code: airline-web/public/javascripts/link-history.js has 419 significant lines (blank lines excluded), over the 400-line bar, and contains logic \u2014 a file this long is usually several responsibilities in one module."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/link-history.js"},"region":{"startLine":1}}}],"partialFingerprints":{"codehealthFindingId/v1":"e9f0b8089f737bad6004add62280fd8863d7c0b6751f0b5f621677ee19861f43"}},{"ruleId":"R4","level":"warning","message":{"text":"Test Coverage: 0% of 55 production file(s) reachable from 0 test file(s) via the import graph \u2014 \u0027production\u0027 here is the RESIDUE: every source file left once tests, tooling, generated output, config, declarations and declaration-only modules, fixture corpora, type fixtures, behaviour-free data modules, re-export barrels, registration/constant data modules and service workers are set aside, so the percentage is taken over a smaller denominator than the workspace\u0027s file count"},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"64e0e3511eb969fb4720b196e7d3799e1714077217351c3c56a27b50e3e21220"}},{"ruleId":"R6","level":"warning","message":{"text":"No test, lint or typecheck script: test \u2717 \u00B7 lint \u2717 \u00B7 typecheck \u2717 \u2014 read from this repository\u0027s package.json scripts and corroborated against its CI workflows. A script counts when its name or command matches the step: \u0060test\u0060 for the suite, \u0060lint\u0060 or \u0060prettier\u0060 for linting, \u0060typecheck\u0060/\u0060type-check\u0060/\u0060tsc\u0060 for type checking. \u2717 therefore means no script or CI step under those names was found, NOT that the step is absent from your pipeline \u2014 a task invoked by a runner this check does not read, or named something else entirely, is not seen and is worth confirming before acting on a cross. A \u2713 means the wiring is DECLARED \u2014 a script or CI step under those names exists. It is not a statement that the step passes, or that it runs at all: nothing here installs a dependency or executes a suite."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"a9372ffc30204d52cc3368af49ceaa995574db973935e30b3946f83785dea15b"}},{"ruleId":"R8","level":"warning","message":{"text":"Unused dependency \u0027jquery\u0027: Declared in airline-web/public/javascripts/jemoji/package.json but never imported anywhere in that package or its workspace members \u2014 no static import reaches it. Usually that is dead weight and attack surface, but two shapes are indistinguishable from source and are NOT dead: an optional or native peer that another dependency loads dynamically at runtime, and a package a build, docs or test step installs and invokes separately. Confirm which of the three this is before removing it."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"3558d7366af476e7eb024a934b72268cae9477fa223da29863f386f4fe01ecc1"}},{"ruleId":"S1","level":"warning","message":{"text":"Weak hash algorithm: MD5/SHA1 is computed here, and both are collision-broken. If this digest protects anything \u2014 a signature, an integrity or tamper check, a credential, or any value an attacker can influence \u2014 that is a real weakness: use SHA-256\u002B (\u0060MessageDigest.getInstance(\u0022SHA-256\u0022)\u0060) for content integrity, or a KDF (bcrypt/Argon2/scrypt) for password storage. If it only derives a non-security identifier (a cache key, an avatar URL, an ETag), collision resistance carries no security consequence here; make that intent explicit instead \u2014 a non-cryptographic hash such as xxhash or murmurhash says it in code \u2014 since the algorithm alone cannot distinguish the two uses. Where a protocol this code does not own fixes the digest (a k-anonymity range query, a legacy signature format), the protocol decides; say so beside the call."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/Authentication.scala"},"region":{"startLine":91}}}],"partialFingerprints":{"codehealthFindingId/v1":"7c7ab1e1b262d5525f10c344ba7960a472af3f24eccb0c447277d1fe090739c2"}},{"ruleId":"S1","level":"warning","message":{"text":"Third-party script without Subresource Integrity: \u0060https://ajax.googleapis.com/ajax/libs/angularjs/1.4.4/angular.min.js\u0060 is executed by this page with no Subresource Integrity. Whoever can answer that request \u2014 the CDN, anyone who compromises it, anyone on the network path \u2014 runs arbitrary script in this page\u0027s origin, with its session. 6 such include(s) across the repository\u0027s markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/views/index.scala.html"},"region":{"startLine":39}}}],"partialFingerprints":{"codehealthFindingId/v1":"23094faddb26fe7e6469af7bcb775baa2e7217ae9fcf764a5b83a4db3ecb3315"}},{"ruleId":"S1","level":"note","message":{"text":"No app-layer HTTPS enforcement detected: This repository runs an HTTP server and nothing in its Scala source or committed configuration secures the transport: no HTTPS served (akka/pekko-http \u0060ConnectionContext.httpsServer\u0060/\u0060enableHttps\u0060, an http4s builder\u0027s \u0060withTLS\u0060, Jetty\u0027s \u0060SslContextFactory\u0060, zio-http\u0027s \u0060SSLConfig\u0060, Play\u0027s \u0060https.port\u0060), no \u0060Strict-Transport-Security\u0060 header, HSTS middleware or Play \u0060RedirectHttpsFilter\u0060, no \u0060X-Forwarded-Proto\u0060 read or Play \u0060play.http.forwarded.trustedProxies\u0060 for a TLS-terminating proxy \u2014 so its traffic may cross the network in clear text. (\u22122.0 on this card.) The server: airline-rest/build.sbt:7 \u2014 the \u0060PlayScala\u0060 plugin."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"8697c7a8b4c37084f15e81b8ec84d4cf62954730be74a0816d39b2127a21fd9b"}},{"ruleId":"S1","level":"note","message":{"text":"Security headers incomplete: Set: Referrer-Policy, X-Content-Type-Options, X-Frame-Options, X-Permitted-Cross-Domain-Policies. Missing: Content-Security-Policy, Strict-Transport-Security \u2014 the four headers that carry the points of this card\u0027s security-headers term (Content-Security-Policy, Strict-Transport-Security, X-Content-Type-Options, X-Frame-Options), 0.5 each.(\u22121.0 on this card.) The server: airline-rest/build.sbt:7 \u2014 the \u0060PlayScala\u0060 plugin."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"e9931804dbad8b1657857c9b88c05b8faeff182b6e2bb88641bd59bac687876e"}},{"ruleId":"SC1","level":"warning","message":{"text":"JavaScript dependencies are not locked: No package-lock.json / yarn.lock / pnpm-lock.yaml / bun.lock \u2014 JS installs aren\u0027t reproducible (SSDF PW.4.4). Commit your package manager\u0027s lockfile and install from it (\u0060npm ci\u0060, \u0060yarn --immutable\u0060, \u0060pnpm i --frozen-lockfile\u0060 or \u0060bun i --frozen-lockfile\u0060). Advisory \u2014 never scored."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"40a08798dc9f9c819eaa9f7c084938e1cf2517a9281aed2c31563d6f7d5ba90d"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060(char.isLetter \u0026\u0026 char \u003C= \u0027z\u0027) || char == \u0027 \u0027\u0060 appears character-identically in 2 files \u2014 airline-web/app/controllers/AirlineUtil.scala, airline-web/app/controllers/SignUp.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirlineUtil.scala"},"region":{"startLine":13}}}],"partialFingerprints":{"codehealthFindingId/v1":"68c47bef7d78b288b123ab30b09416a3814e540bb4c7ff735a3a4094103ae5f8"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060assignedModel.isDefined \u0026\u0026 assignedModel.get.id == model.id\u0060 appears character-identically in 2 files \u2014 airline-rest/app/controllers/LinkApplication.scala, airline-web/app/controllers/LinkApplication.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-rest/app/controllers/LinkApplication.scala"},"region":{"startLine":355}}}],"partialFingerprints":{"codehealthFindingId/v1":"284657133091cde37bd5cdf3adc7f424dd71836636120c921f0fcbe60fdbe831"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060delegateCount \u003E= 0 \u0026\u0026 delta \u003C= airline.getDelegateInfo().permanentAvailableCount\u0060 appears character-identically in 2 files \u2014 airline-web/app/controllers/CampaignApplication.scala, airline-web/app/controllers/DelegateApplication.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/CampaignApplication.scala"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"09402b26af35921e603b7d2a2ecbead3c29d63ce1c4ef28f4f89e33cbcb6f996"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060fromAirport.size \u003E= Lounge.LOUNGE_PASSENGER_AIRPORT_SIZE_REQUIREMENT \u0026\u0026 toAirport.size \u003E= Lounge.LOUNGE_PASSENGER_AIRPORT_SIZE_REQUIREMENT\u0060 appears character-identically in 2 files \u2014 airline-data/src/main/scala/com/patson/DemandGenerator.scala, airline-data/src/main/scala/com/patson/model/FlightPreference.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/DemandGenerator.scala"},"region":{"startLine":301}}}],"partialFingerprints":{"codehealthFindingId/v1":"b3c8c652c7aba9aa774231e19e8e36ed5fb3418aa4186fd15667312a4c2aa071"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060name.length() \u003C 1 || name.length() \u003E MAX_NAME_LENGTH\u0060 appears character-identically in 2 files \u2014 airline-web/app/controllers/AirportAssetApplication.scala, airline-web/app/models/AirportFacility.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/AirportAssetApplication.scala"},"region":{"startLine":253}}}],"partialFingerprints":{"codehealthFindingId/v1":"78c580b13eb2db33b701b18a744f42c8205190b41b475776b0d498eb6579f070"}},{"ruleId":"X10","level":"note","message":{"text":"Duplicated predicate: \u0060token.startsWith(\u0022\\\u0022\u0022) \u0026\u0026 token.endsWith(\u0022\\\u0022\u0022)\u0060 appears character-identically in 3 files \u2014 airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala, airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala, airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala. It is one line, so the duplication detector\u0027s token window never sees it; the copies drift when only one is corrected. Give the condition a name and one home."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala"},"region":{"startLine":24}}}],"partialFingerprints":{"codehealthFindingId/v1":"fd64f6006db9cfaf8b410e0167b71246cad1c7f617d226816443cecd90f275d8"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":76}}}],"partialFingerprints":{"codehealthFindingId/v1":"c8446790e65f81fb428a756b43545b5cb4d1e70640de2252e1101d2ae92b621c"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":101}}}],"partialFingerprints":{"codehealthFindingId/v1":"e5d77e630ed675d0b3e512d3fd4efda1902fce4caa6bb1c50904412e54cd2897"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":187}}}],"partialFingerprints":{"codehealthFindingId/v1":"c895c663c2f0b43f9eea8c3ea0ffce903b517f08dc8d583ddf0667778de79207"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":216}}}],"partialFingerprints":{"codehealthFindingId/v1":"c551b239e88ef15fb1e012f9cbd03e54b1d2dccb135cb6a40ecb143dd0e7d297"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":221}}}],"partialFingerprints":{"codehealthFindingId/v1":"eaa3e2930d0646adb76eca84c5dfc4737211e432ac719022397e72d3b4171d94"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":481}}}],"partialFingerprints":{"codehealthFindingId/v1":"30aace9b83d86244fb690530ad2c65fdb06e6572c47c68c9c42034ca81f6af19"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":488}}}],"partialFingerprints":{"codehealthFindingId/v1":"10d6d4be542ef8b47bdfce0a72a0cb22dfe16f1d853fff54d8069b4abf5d0e8a"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":492}}}],"partialFingerprints":{"codehealthFindingId/v1":"2804dc339cb298a9c21c9265f309657e9def4526b1677be7d9ae9c779b085044"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/GeoDataGenerator.scala"},"region":{"startLine":560}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff78927c5da1bba6bad291a1219f7c5f52fccefc5cd2e86dcb23ad3c30693ca4"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/CountryMutualRelationshipGenerator.scala"},"region":{"startLine":67}}}],"partialFingerprints":{"codehealthFindingId/v1":"4d1b0019814a00cb336fc7aadca77b16e2392a29fd8f4eb0dc94ba654f170cb8"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/CountryMutualRelationshipGenerator.scala"},"region":{"startLine":102}}}],"partialFingerprints":{"codehealthFindingId/v1":"e4d2e92f72653d5b5ff6a8f6ef375ded274438a9ae5eb4786f815b79a56127fe"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportWeatherData.scala"},"region":{"startLine":17}}}],"partialFingerprints":{"codehealthFindingId/v1":"487db2a258257ba0560150fa4274f6633811bd3cbdce1d15e1632b0c3ad96f6c"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":66}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1b8f258b6905262d68a78c2f3712c2d8e27671caa7d9ed9bb644036491adb8f"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AirportRunwayAnalyzer.scala"},"region":{"startLine":108}}}],"partialFingerprints":{"codehealthFindingId/v1":"b80fc6572bf52117e88adcb07d9f7eb30b6eb265b9686b4c4772e50c0e911f39"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala"},"region":{"startLine":11}}}],"partialFingerprints":{"codehealthFindingId/v1":"dbc8242222514fb7c3ba8ee49fe866478d0f2f229259a668681b835108992189"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala"},"region":{"startLine":18}}}],"partialFingerprints":{"codehealthFindingId/v1":"a501114a43059d1e459d8c4af81ab915fc0de632730dad4184a97646b74f8150"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala"},"region":{"startLine":42}}}],"partialFingerprints":{"codehealthFindingId/v1":"d28d40da4b73dd9d6d3a461c7d4c02a4ac45732f5e42317215cc1bed749914dc"}},{"ruleId":"X18","level":"warning","message":{"text":"Disposable created and abandoned in the function that made it: \u0060scala.io.Source.fromFile(\u2026)\u0060 opens something that has to be given back \u2014 a file descriptor, a socket, a directory handle \u2014 and its only use reads \u0060.getLines\u0060 through it and drops it, so this expression both creates the value and is the last place that can release it, and does not. Every call leaks one more open handle until the collector happens to reach it: \u0060Too many open files\u0060 under load, and on Windows a file that cannot be replaced or deleted while it is held. Open it with \u0060scala.util.Using.resource(scala.io.Source.fromFile(\u2026)) { r =\u003E \u2026 }\u0060, which releases it on every path including a throw, or hold it and call \u0060.close()\u0060 in a \u0060finally\u0060."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-data/src/main/scala/com/patson/init/AdditionalLoader.scala"},"region":{"startLine":56}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1c6789405b4e8b39ef8944665ec1b47b4d3cb3c646b790ba255439b255dcc1a"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060oldValue\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/departure-board/departure-board.js"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"882677be1377d4bd429b6e8bd93b9b7d7b7a5f8da5028973d5695aed78a8f6b8"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060newValue\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/departure-board/departure-board.js"},"region":{"startLine":168}}}],"partialFingerprints":{"codehealthFindingId/v1":"6634a317a6f6e78d7f20e324d7a4d5b2637bd4826b53e66ac625be8fd2e84147"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060newValue\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/departure-board/departure-board.js"},"region":{"startLine":177}}}],"partialFingerprints":{"codehealthFindingId/v1":"c7803c847fc9d8da5239e110084e176d4ce69adc09503709dea8a6ab0e3abb29"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060newValue\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/departure-board/departure-board.js"},"region":{"startLine":189}}}],"partialFingerprints":{"codehealthFindingId/v1":"76135a305dc878ddb931d6c1a7b6b34a012d0cef68b735da2ab8910cfd1e967b"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060arr[i]\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":210}}}],"partialFingerprints":{"codehealthFindingId/v1":"1753e3f964eb3bcca83808b93efc355d323f3dd8aedd5ae87ae578416c87e009"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060arr[arr.length-1]\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":212}}}],"partialFingerprints":{"codehealthFindingId/v1":"ff42e61ce6cc7a06124e52b6c9462cec2e3861cffda80661e53aad4eaeb24234"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060arr.close\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":215}}}],"partialFingerprints":{"codehealthFindingId/v1":"8423ff1526127ddd6dfa7a543a8a9c53a87c65aeb626cbcda749483e87277ea6"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060dir\u0060 is text this program did not author, and it is written into the start of a URL attribute, where it chooses the scheme through markup built here with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. HTML encoding does not help here \u2014 a \u0060javascript:\u0060 URL contains nothing it changes; allow only http(s) or a relative path."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":302}}}],"partialFingerprints":{"codehealthFindingId/v1":"a50bdaab8dc140444e48c0276b6b33731983bafb108a4ba5b5184c7f61a3c9c5"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060currentEmoji\u0060 is text this program did not author, and it is written into the text of an element through markup built here with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":303}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c06e8d15adc8b2944190d850424f463fbc3fc7ab8c1db6c0b3333083b971852"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060expando\u0060 is text this program did not author, and it is written into a quoted attribute value through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":1180}}}],"partialFingerprints":{"codehealthFindingId/v1":"8be7daf35991c9c1969fdb8155ba49d402cf90a89e5c51aa46f23c4f43715a54"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060expando\u0060 is text this program did not author, and it is written into a quoted attribute value through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":1181}}}],"partialFingerprints":{"codehealthFindingId/v1":"84fc840d66dd36595f434bb728a5c09c6bc38e019e920d3a3338e52b517ace42"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060wrap[1]\u002Belem.replace(rxhtmlTag,\u0022\u003C$1\u003E\u003C/$2\u003E\u0022)\u002Bwrap[2]\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":5114}}}],"partialFingerprints":{"codehealthFindingId/v1":"831661defb3a55439c1345fa43f3f596f642fb24e9ef9f44b45bbfac723545ed"}},{"ruleId":"X24","level":"warning","message":{"text":"Untrusted text written into markup unescaped: \u0060value\u0060 is text this program did not author, and it is written into the text of an element through \u0060innerHTML\u0060 with nothing encoding it for that place. Whoever controls the value controls the markup: it can close the element or attribute it sits in and open a script of its own. Encode it for HTML at this site, render it through the framework\u0027s escaping output, or sanitise it if it must stay markup."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":5322}}}],"partialFingerprints":{"codehealthFindingId/v1":"afd5b0a1218e596f39a35dea77dacf78f3d3964606652a2cc190e8563acd97e0"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/jemoji/jemoji.js"},"region":{"startLine":117}}}],"partialFingerprints":{"codehealthFindingId/v1":"f8a9bbd9605aa6e7f2b34c8a8c61f24483a2c2b491dc728c9c995b80d63725d3"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery.cookie.js"},"region":{"startLine":47}}}],"partialFingerprints":{"codehealthFindingId/v1":"332c1ef56dab5f3cb81c9aed00642d1d7c621f9d089f13d5a3327568813920b9"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":844}}}],"partialFingerprints":{"codehealthFindingId/v1":"62e553863f7efeba3617d5527bd7f5d544f613507dc1b6481e0d53c4a4e51f7d"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":1422}}}],"partialFingerprints":{"codehealthFindingId/v1":"25badf0237375eda5aa88ea946d5ffb6666d2c50c3dbb9c6c6d582e71ee72fee"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":3744}}}],"partialFingerprints":{"codehealthFindingId/v1":"0555102ec79a0a229bce5193e9a2bb41cd886d5385ea134b5205b18112ec215e"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":4077}}}],"partialFingerprints":{"codehealthFindingId/v1":"89bad344b69ec91e46e8a6f0b36bc492de93230bb75b503234ce7fd97b0833e5"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":5329}}}],"partialFingerprints":{"codehealthFindingId/v1":"1c4c5503a565d884108b0110ec3c67a295998b9448005ee1771efe833c100383"}},{"ruleId":"X3","level":"warning","message":{"text":"Swallowed exception (empty catch): An empty catch block silently discards the error \u2014 failures vanish with no log and no rethrow. Log it, handle it, or don\u0027t catch it."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/javascripts/libs/jquery-2.1.4.js"},"region":{"startLine":8522}}}],"partialFingerprints":{"codehealthFindingId/v1":"a240a8ee6d1dd9a27fd18a331b7faff8b0db3b5c7ffe282a99a3c9ab073ea9f3"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 200 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchUtil.java"},"region":{"startLine":200}}}],"partialFingerprints":{"codehealthFindingId/v1":"308c51fb881e9de2cd4d7b5bd0a7be231a9124a522243734640442247ef7ee0d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 217 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchUtil.java"},"region":{"startLine":217}}}],"partialFingerprints":{"codehealthFindingId/v1":"463b69717d918c49de43d541fdd39b71d9f4923695f2e5c9d72cd4998952515e"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 226 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchUtil.java"},"region":{"startLine":226}}}],"partialFingerprints":{"codehealthFindingId/v1":"67020b49d162f4b6e7bba2fa320c3dac31c4abfb9beb8faddb89099a623a08b2"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 228 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/SearchUtil.java"},"region":{"startLine":228}}}],"partialFingerprints":{"codehealthFindingId/v1":"466367ae511b7f813787128328c6db9854537951bac12291d7b3a5b3fad83f76"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 60 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":60}}}],"partialFingerprints":{"codehealthFindingId/v1":"47a64a8d8d9b812fbe264690f0fa31525dc732aaaca776b038d13bfb9046cc33"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 65 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":65}}}],"partialFingerprints":{"codehealthFindingId/v1":"2e82ef2290e24bd19fffa234e17430082e35fe688bee7dd0f2dca7b71dc71c44"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 74 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":74}}}],"partialFingerprints":{"codehealthFindingId/v1":"43238928242e49902970645e5e7e1d85a6d8b474c65da2c982c30e7ef23ada95"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 83 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":83}}}],"partialFingerprints":{"codehealthFindingId/v1":"ed8b77114c8b18d33bcfd77b6071a4ab2cc57b115eab866916e2e060a0559b0f"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 88 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":88}}}],"partialFingerprints":{"codehealthFindingId/v1":"4245ec28f186f532ddcfef3ca549b1321c63acdf4fac5b9bdb03f0f1e9165206"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 95 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":95}}}],"partialFingerprints":{"codehealthFindingId/v1":"fc43a3ad0543eb8794c18b9ce52be1b883109ad1ad7cec2d0e5cd87e50eaadc6"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 107 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":107}}}],"partialFingerprints":{"codehealthFindingId/v1":"c450aa82a43b442e9898d0fdbe1d0f93cd270da7f53165bfd7a29202c0590725"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 111 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":111}}}],"partialFingerprints":{"codehealthFindingId/v1":"f29784d7d4ac2fad218a8e2037c3fa34d4c2eb5bf58f380e7c7b3dfcfadee9bb"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 115 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":115}}}],"partialFingerprints":{"codehealthFindingId/v1":"d1f1bf24094c174367492dea26e110440a87a47e805250a871f212874a65251b"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 141 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":141}}}],"partialFingerprints":{"codehealthFindingId/v1":"135406cda47c188b4ce93b6628a147fa6b8444aed0c4f2b04c4bb7228f7186e9"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 154 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.debug(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":154}}}],"partialFingerprints":{"codehealthFindingId/v1":"de499030e2ddad4b03c20e8dc8e886e5af75c2bdd91fd20f6998720547f92308"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060debug\u0060 at line 157 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.debug(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":157}}}],"partialFingerprints":{"codehealthFindingId/v1":"13fdb7a803a8fd44eb50e7ab4c876f581b55bf54ee9270013932c98360a2e4ff"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 161 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":161}}}],"partialFingerprints":{"codehealthFindingId/v1":"af2624a13c8254ffbc4fb95932b21437c962a53449022f9c9c3aeefd20bff4f2"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 165 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":165}}}],"partialFingerprints":{"codehealthFindingId/v1":"f940acca4d308356c8b10e7c78e36e6a78736dc538f0494cebfd44cbbdb2e328"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 185 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":185}}}],"partialFingerprints":{"codehealthFindingId/v1":"a1ba17e5ce97d4af0d309e97e70ba2485bf82822eb2069e0dec983d6735947f0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 413 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":413}}}],"partialFingerprints":{"codehealthFindingId/v1":"f2a1f70f94461953e55ee22a09f539a64f83f738d32a32aaf08ec1c05bc7f765"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 427 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":427}}}],"partialFingerprints":{"codehealthFindingId/v1":"e51fbed59f674196288c21373a8628a8b0668cb6abd4d282fbad63e03d298dce"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 435 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":435}}}],"partialFingerprints":{"codehealthFindingId/v1":"7598a91dbb1b6ab09196cc55a1a2c73928d019102561338cb2282be4f318b67d"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 457 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":457}}}],"partialFingerprints":{"codehealthFindingId/v1":"cb9fb99f57430cfa778579023f45383ef0639689cf87c90491d31fcf76858b7c"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060info\u0060 at line 472 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.info(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":472}}}],"partialFingerprints":{"codehealthFindingId/v1":"dcbe7fd34b7da342d2602103c41b846d942eec8fb2ac0fa993a6e7c5d8e2a192"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 479 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":479}}}],"partialFingerprints":{"codehealthFindingId/v1":"10bbeea00a03d3045ca1eaad394b90a6c0dce4c68a412ff9804348d502d77bf5"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 500 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":500}}}],"partialFingerprints":{"codehealthFindingId/v1":"7566fbe0e2de3747ae9b4faccfe03027946a471c815a32c8da5d1ed055c5b3b0"}},{"ruleId":"X4","level":"note","message":{"text":"Interpolated log message defeats structured logging: \u0060warn\u0060 at line 510 is handed a message assembled at the call \u2014 a string concatenated with a value, or \u0060String.format\u0060 \u2014 through SLF4J or log4j 2, so the logger receives one finished string: the values in it cannot be queried, filtered or aggregated as fields, every occurrence reads as a different message, and the string is built even when the level is filtered out. Pass a constant pattern and the values beside it instead: \u0060log.warn(\u0022Order {} moved to {}\u0022, orderId, status)\u0060, which keeps the pattern and its arguments apart on the event for a structured encoder (logstash-logback-encoder, log4j 2\u0027s JsonTemplateLayout, OpenTelemetry), or \u0060log.atInfo().addKeyValue(\u0022order_id\u0022, orderId).log(\u0022order moved\u0022)\u0060 with SLF4J 2\u0027s fluent API. An exception goes last, as the throwable argument, not into the text."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/app/controllers/GoogleImageUtil.java"},"region":{"startLine":510}}}],"partialFingerprints":{"codehealthFindingId/v1":"51aedfe3a7388bc0b13bfe82d280358a6bf70281250bc5472abdfc03c1bb7c0a"}},{"ruleId":"X5","level":"note","message":{"text":"Scala\u0027s null is not held to the type system everywhere: No build over this repository\u0027s 268 Scala product file(s) passes \u0060-Yexplicit-nulls\u0060, enables WartRemover\u0027s \u0060Null\u0060 wart or runs Scalafix\u0027s \u0060DisableSyntax.noNulls\u0060, so every reference type admits null and nothing reports a \u0060null\u0060 written into the code or returned from a Java API \u2014 the first one to reach a method call is a \u0060NullPointerException\u0060. \u0060Option\u0060 by convention is a habit no tool here holds the code to."},"locations":[],"partialFingerprints":{"codehealthFindingId/v1":"23e7c3c6da50151f07723c64ca4f881fd5903e713d143161a7c0594ad7ba29cc"}},{"ruleId":"X6","level":"note","message":{"text":"Hand-rolled JSON/XML parsing via regex: A regex whose pattern encodes JSON/XML syntax is parsing a structured format by hand \u2014 malformed or differently-typed content (e.g. \u0060\u0022amount\u0022: \u00225\u0022\u0060 as a string) silently mis-parses instead of failing validation. This JavaScript/TypeScript code already uses a real parser in the same package; use it here too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/fusioncharts/fusioncharts.js"},"region":{"startLine":593}}}],"partialFingerprints":{"codehealthFindingId/v1":"b2d0c36c84d9a537cf325e1845ac209ab0acc605ce2db678abb4e6d5e52b0d09"}},{"ruleId":"X6","level":"note","message":{"text":"Hand-rolled JSON/XML parsing via regex: A regex whose pattern encodes JSON/XML syntax is parsing a structured format by hand \u2014 malformed or differently-typed content (e.g. \u0060\u0022amount\u0022: \u00225\u0022\u0060 as a string) silently mis-parses instead of failing validation. This JavaScript/TypeScript code already uses a real parser in the same package; use it here too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/fusioncharts/fusioncharts.js"},"region":{"startLine":667}}}],"partialFingerprints":{"codehealthFindingId/v1":"17ddd7c7423add4bf9912a07310387b360e5ef8c92d329820baf8e37bf216ff8"}},{"ruleId":"X6","level":"note","message":{"text":"Hand-rolled JSON/XML parsing via regex: A regex whose pattern encodes JSON/XML syntax is parsing a structured format by hand \u2014 malformed or differently-typed content (e.g. \u0060\u0022amount\u0022: \u00225\u0022\u0060 as a string) silently mis-parses instead of failing validation. This JavaScript/TypeScript code already uses a real parser in the same package; use it here too."},"locations":[{"physicalLocation":{"artifactLocation":{"uri":"airline-web/public/fusioncharts/fusioncharts.js"},"region":{"startLine":704}}}],"partialFingerprints":{"codehealthFindingId/v1":"106673019b0de7e58bca6c5f78c9ee1ff8916148fccf0a7550c350ea3d5a5bdf"}}],"taxonomies":[{"name":"CWE","guid":"c3a2b1d0-7f3e-4b2a-9c1d-5e6f7a8b9c0d","organization":"MITRE","informationUri":"https://cwe.mitre.org/","isComprehensive":false,"shortDescription":{"text":"The MITRE Common Weakness Enumeration (CWE)."},"taxa":[{"id":"CWE-1395","guid":"800e09e7-c11a-8654-9fa6-86f398995fed","name":"Dependency on Vulnerable Third-Party Component","shortDescription":{"text":"Dependency on Vulnerable Third-Party Component"},"helpUri":"https://cwe.mitre.org/data/definitions/1395.html"},{"id":"CWE-259","guid":"ae9ad959-fbb6-9d5e-892d-3dca66da0b69","name":"Use of Hard-coded Password","shortDescription":{"text":"Use of Hard-coded Password"},"helpUri":"https://cwe.mitre.org/data/definitions/259.html"},{"id":"CWE-319","guid":"7af97476-9f0d-4458-9163-3d2043918a1a","name":"Cleartext Transmission of Sensitive Information","shortDescription":{"text":"Cleartext Transmission of Sensitive Information"},"helpUri":"https://cwe.mitre.org/data/definitions/319.html"},{"id":"CWE-457","guid":"b62874fe-6222-8b5b-8ade-9527ad1cbb4a","name":"CWE-457","shortDescription":{"text":"CWE-457"},"helpUri":"https://cwe.mitre.org/data/definitions/457.html"},{"id":"CWE-506","guid":"401d6455-56e3-0552-9a39-f77461673e3f","name":"Embedded Malicious Code","shortDescription":{"text":"Embedded Malicious Code"},"helpUri":"https://cwe.mitre.org/data/definitions/506.html"},{"id":"CWE-77","guid":"332c8ade-6612-9f56-a06b-d8d90b1a8750","name":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in a Command (\u0027Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/77.html"},{"id":"CWE-78","guid":"2e31ceaf-c7ae-2e5e-9661-cfb1362789cf","name":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an OS Command (\u0027OS Command Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/78.html"},{"id":"CWE-79","guid":"fd45580b-e8c4-fc5e-8c2f-aa8fab0b4dbf","name":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)","shortDescription":{"text":"Improper Neutralization of Input During Web Page Generation (\u0027Cross-site Scripting\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/79.html"},{"id":"CWE-798","guid":"5e8f057d-fee3-995a-a0cb-9fc5b0d174d1","name":"Use of Hard-coded Credentials","shortDescription":{"text":"Use of Hard-coded Credentials"},"helpUri":"https://cwe.mitre.org/data/definitions/798.html"},{"id":"CWE-89","guid":"6d08fdad-37eb-c150-bbf0-d7d946863407","name":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)","shortDescription":{"text":"Improper Neutralization of Special Elements used in an SQL Command (\u0027SQL Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/89.html"},{"id":"CWE-937","guid":"16f316ae-415c-b354-a59b-1f7905f756e9","name":"Using Components with Known Vulnerabilities","shortDescription":{"text":"Using Components with Known Vulnerabilities"},"helpUri":"https://cwe.mitre.org/data/definitions/937.html"},{"id":"CWE-94","guid":"75e7f50c-6c2f-dd52-bf40-bf6c52b861fd","name":"Improper Control of Generation of Code (\u0027Code Injection\u0027)","shortDescription":{"text":"Improper Control of Generation of Code (\u0027Code Injection\u0027)"},"helpUri":"https://cwe.mitre.org/data/definitions/94.html"}]},{"name":"OWASP Top 10","guid":"7d1f0c2e-4b6a-4e39-9a51-0b2e8c3d5f61","version":"2025","organization":"OWASP Foundation","informationUri":"https://top10.owasp.org/2025/","isComprehensive":false,"shortDescription":{"text":"The OWASP Top 10:2025 web application security risks."},"taxa":[{"id":"A03:2025","guid":"168e227c-7735-2e57-bc6e-997affe644c5","name":"Software Supply Chain Failures","shortDescription":{"text":"Software Supply Chain Failures"},"helpUri":"https://top10.owasp.org/2025/A03_2025-Software_Supply_Chain_Failures/"},{"id":"A04:2025","guid":"6a9f5bfd-1a56-6453-beec-a7eff0ba3007","name":"Cryptographic Failures","shortDescription":{"text":"Cryptographic Failures"},"helpUri":"https://top10.owasp.org/2025/A04_2025-Cryptographic_Failures/"},{"id":"A05:2025","guid":"87e86033-3231-8458-8e4a-5cb82743553a","name":"Injection","shortDescription":{"text":"Injection"},"helpUri":"https://top10.owasp.org/2025/A05_2025-Injection/"},{"id":"A07:2025","guid":"334ddd78-539d-d35c-83dd-253647eb7eaf","name":"Authentication Failures","shortDescription":{"text":"Authentication Failures"},"helpUri":"https://top10.owasp.org/2025/A07_2025-Authentication_Failures/"},{"id":"A08:2025","guid":"84b0c297-710e-9a5f-9335-936ecb260c36","name":"Software or Data Integrity Failures","shortDescription":{"text":"Software or Data Integrity Failures"},"helpUri":"https://top10.owasp.org/2025/A08_2025-Software_or_Data_Integrity_Failures/"}]}],"properties":{"codehealthPublication":{"public":true,"notice":"This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings \u2014 which rule fired, in which file, on which line, and how to fix it \u2014 are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.","securityFindingsRedacted":21,"secretScannerRunsExcluded":0}},"redactionTokens":["A security finding was recorded here. Its details are withheld on the public artifact \u2014 ask the repository owner for the full report."]}]}