MNDAPW6MTTHAQ2RQFXRD4ZGX64ZM45MEU2CYVSSLWENA73KXZBEAC RUF5K5CL542GK5UIIIBHPIMGGCXU72IWS5OFBVTI5DRX36OSPJDAC ULWBYMSXYZEE7BJQ2B4HTX2JAABBNJWZTUFIQ56NF5RWXODXRTHQC DBOROCRFD6A5SJBMFYFEJI5S5M77X4EFEK6KDQWA5QDMQJKIHRWQC SDBVLSDDRPQF62XXKJKM2RQLMXOKKHOYRVUF6DIUDFRYCGL2DW3QC EW7VBNMGWFBC73ZUDLB4LIK2HWFKA74ZUTUDG4J575ZQHEFHW4UQC 2IURSWW3ZXRBH3DPJO437YE2FGMG54MPFL6W6UCEF5HODPVWVVTQC U6JEEU5O477ZOJ5UMRMOJSGPEJEU6Q7KMPKUSDF56CYVUJWL7QBQC HHT7M27I3YKGGJOTVTMRVWXATDWUZKIVVLM7IVI7SJRB7FLT2DAQC SPHUX2CTF2S2TXEO3TRHNY7NIJ42G5KEWZRHQPZWXP77SJS5WJUAC for i, segs := range s.filteredSegs {if i < s.FileIdx {count += len(segs)} else if i == s.FileIdx {count += s.SegmentIdx + 1} else {break}
for i := 0; i < s.FileIdx; i++ {count += len(s.filteredSegs[i])
}}// nextSegmentRaw moves to next segment without wrapping, returns false if at end.func (s *ClassifyState) nextSegmentRaw() bool {if s.FileIdx >= len(s.filteredSegs) {return false}segs := s.filteredSegs[s.FileIdx]if s.SegmentIdx+1 < len(segs) {s.SegmentIdx++return true}// Move to next fileif s.FileIdx+1 < len(s.DataFiles) {s.FileIdx++s.SegmentIdx = 0return true}return false}// prevSegmentRaw moves to previous segment without wrapping, returns false if at start.func (s *ClassifyState) prevSegmentRaw() bool {if s.SegmentIdx > 0 {s.SegmentIdx--return true}// Move to previous fileif s.FileIdx > 0 {s.FileIdx--segs := s.filteredSegs[s.FileIdx]s.SegmentIdx = max(len(segs)-1, 0)return true