{
 "about": {
  "method": "exact-fragment-search (src/lib/seq/fragment-search.ts)",
  "generatedBy": "pipeline/sequence-toolkit/exact_matches.py",
  "recordedOn": "2026-10-10",
  "oracle": "An independent Python derivation; reverse complements by Biopython 1.88 (Bio.Seq.reverse_complement), every site and hit found by testing each window directly",
  "conventions": [
   "Query: line breaks and spaces are removed and letters upper-cased; nothing else is removed. Refusals in this order: a raw query over 20,000 characters is long; an empty one is empty; any letter other than A, C, G, T is alphabet (no ambiguity codes, no U); under 4 bases is short; over 10,000 bases is long.",
   "The saved sequence is read on its saved, presented strand. Its letters must be A, C, G, T or the IUPAC DNA codes R Y S W K M B D H V N; any other letter refuses the search (residues). An IUPAC code in the saved sequence is a literal letter that no query base equals, never a wildcard.",
   "A hit is a window equal to the query ('+') or to its reverse complement ('-'); when the query is its own reverse complement a window is reported once, as 'both'. Overlapping hits are all kept.",
   "Coordinates are 1-based and inclusive on the saved strand; start is the window's first base and end its last, whatever the strand. On a circular molecule each of the n start positions is read once and a hit that crosses the origin has wraps true (end < start, or a full-length query); on a linear one no hit wraps. A query longer than the molecule has no hit.",
   "Hits are listed by start, then by strand ('+', '-', 'both')."
  ],
  "inputs": "A long input is stored as {\"parts\": [[unit, times], ...]}, the units concatenated in order.",
  "ruling": "CSO, 10 October 2026 (docs/board/memos/2026-10-10-cso-wave2-cloning.md §2.4): independent, published, hashed; never generated by the engine under test."
 },
 "cases": [
  {
   "id": "frag-forward",
   "note": "One forward hit on a linear sequence.",
   "input": {
    "residues": "TTAACCGTGGCATG",
    "query": "AACCGT",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": [
     {
      "start": 3,
      "end": 8,
      "wraps": false,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-reverse",
   "note": "One hit of the reverse complement, reported on the saved strand's coordinates.",
   "input": {
    "residues": "GGACGGTTAACATG",
    "query": "AACCGT",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": [
     {
      "start": 3,
      "end": 8,
      "wraps": false,
      "strand": "-"
     }
    ]
   }
  },
  {
   "id": "frag-palindrome-once",
   "note": "A palindromic query (GAATTC) is reported once per site as 'both', never twice.",
   "input": {
    "residues": "CCGAATTCAAGAATTCGG",
    "query": "GAATTC",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "GAATTC",
    "matches": [
     {
      "start": 3,
      "end": 8,
      "wraps": false,
      "strand": "both"
     },
     {
      "start": 11,
      "end": 16,
      "wraps": false,
      "strand": "both"
     }
    ]
   }
  },
  {
   "id": "frag-homopolymer-overlaps",
   "note": "Overlapping hits in a homopolymer are all kept.",
   "input": {
    "residues": "CAAAAAAAC",
    "query": "AAAA",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AAAA",
    "matches": [
     {
      "start": 2,
      "end": 5,
      "wraps": false,
      "strand": "+"
     },
     {
      "start": 3,
      "end": 6,
      "wraps": false,
      "strand": "+"
     },
     {
      "start": 4,
      "end": 7,
      "wraps": false,
      "strand": "+"
     },
     {
      "start": 5,
      "end": 8,
      "wraps": false,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-homopolymer-reverse",
   "note": "A homopolymer of T read with an A query: overlapping hits on the reverse strand only.",
   "input": {
    "residues": "GTTTTTTG",
    "query": "AAAA",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AAAA",
    "matches": [
     {
      "start": 2,
      "end": 5,
      "wraps": false,
      "strand": "-"
     },
     {
      "start": 3,
      "end": 6,
      "wraps": false,
      "strand": "-"
     },
     {
      "start": 4,
      "end": 7,
      "wraps": false,
      "strand": "-"
     }
    ]
   }
  },
  {
   "id": "frag-tandem-repeat",
   "note": "A tandem repeat: every repeat unit and every overlapping placement is a hit.",
   "input": {
    "residues": "ACGTTACGTTACGTTACG",
    "query": "ACGTTACG",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "ACGTTACG",
    "matches": [
     {
      "start": 1,
      "end": 8,
      "wraps": false,
      "strand": "+"
     },
     {
      "start": 6,
      "end": 13,
      "wraps": false,
      "strand": "+"
     },
     {
      "start": 11,
      "end": 18,
      "wraps": false,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-iupac-barrier",
   "note": "N in the saved sequence is a literal letter, never a wildcard: only the clean copy is found.",
   "input": {
    "residues": "AANNNAACCGTNNAACNGT",
    "query": "AACCGT",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": [
     {
      "start": 6,
      "end": 11,
      "wraps": false,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-iupac-codes",
   "note": "Every IUPAC code in the saved sequence blocks a match through it.",
   "input": {
    "residues": "AACRGTAACYGTAACSGTAACCGT",
    "query": "AACCGT",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": [
     {
      "start": 19,
      "end": 24,
      "wraps": false,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-linear-no-wrap",
   "note": "On a linear molecule a query across the end is not found.",
   "input": {
    "residues": "CCGTGGAA",
    "query": "AACCGT",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": []
   }
  },
  {
   "id": "frag-circular-origin",
   "note": "On a circular molecule the same query spans the origin.",
   "input": {
    "residues": "CCGTGGAA",
    "query": "AACCGT",
    "circular": true
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": [
     {
      "start": 7,
      "end": 4,
      "wraps": true,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-circular-origin-reverse",
   "note": "A reverse-strand hit across the origin of a circular molecule.",
   "input": {
    "residues": "GGTTCCAC",
    "query": "AACCGT",
    "circular": true
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": [
     {
      "start": 7,
      "end": 4,
      "wraps": true,
      "strand": "-"
     }
    ]
   }
  },
  {
   "id": "frag-circular-full-length",
   "note": "A query as long as the circular molecule is found at each start where it reads, wrapping.",
   "input": {
    "residues": "AACCTTGG",
    "query": "CCTTGGAA",
    "circular": true
   },
   "expected": {
    "ok": true,
    "query": "CCTTGGAA",
    "matches": [
     {
      "start": 3,
      "end": 2,
      "wraps": true,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-circular-homopolymer",
   "note": "A homopolymer circle: every start is a hit, read once.",
   "input": {
    "residues": "AAAA",
    "query": "AAAA",
    "circular": true
   },
   "expected": {
    "ok": true,
    "query": "AAAA",
    "matches": [
     {
      "start": 1,
      "end": 4,
      "wraps": false,
      "strand": "+"
     },
     {
      "start": 2,
      "end": 1,
      "wraps": true,
      "strand": "+"
     },
     {
      "start": 3,
      "end": 2,
      "wraps": true,
      "strand": "+"
     },
     {
      "start": 4,
      "end": 3,
      "wraps": true,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-query-longer",
   "note": "A query longer than the molecule has no hit, circular or not.",
   "input": {
    "residues": "AAAA",
    "query": "AAAAA",
    "circular": true
   },
   "expected": {
    "ok": true,
    "query": "AAAAA",
    "matches": []
   }
  },
  {
   "id": "frag-mixed-strands",
   "note": "Hits on both strands, listed by start.",
   "input": {
    "residues": "AAGGCTTTAGCCTTAAGGC",
    "query": "AAGGC",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AAGGC",
    "matches": [
     {
      "start": 1,
      "end": 5,
      "wraps": false,
      "strand": "+"
     },
     {
      "start": 10,
      "end": 14,
      "wraps": false,
      "strand": "-"
     },
     {
      "start": 15,
      "end": 19,
      "wraps": false,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-normalised-query",
   "note": "Lower case, spaces and line breaks in the query are read as the same bases.",
   "input": {
    "residues": "TTAACCGTGG",
    "query": "aac c\ngt",
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AACCGT",
    "matches": [
     {
      "start": 3,
      "end": 8,
      "wraps": false,
      "strand": "+"
     }
    ]
   }
  },
  {
   "id": "frag-refuse-empty",
   "note": "A query of spaces only refuses as empty.",
   "input": {
    "residues": "AACCGT",
    "query": "  \n ",
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "empty"
   }
  },
  {
   "id": "frag-refuse-short",
   "note": "Three bases refuse as short.",
   "input": {
    "residues": "AACCGT",
    "query": "AAC",
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "short"
   }
  },
  {
   "id": "frag-refuse-alphabet-n",
   "note": "An ambiguity code in the query refuses: the query is never a pattern.",
   "input": {
    "residues": "AACCGT",
    "query": "AACN",
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "alphabet"
   }
  },
  {
   "id": "frag-refuse-alphabet-u",
   "note": "U in the query refuses; RNA is not converted.",
   "input": {
    "residues": "AACCGT",
    "query": "AACU",
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "alphabet"
   }
  },
  {
   "id": "frag-refuse-alphabet-header",
   "note": "A FASTA header in the query refuses; nothing is stripped but whitespace.",
   "input": {
    "residues": "AACCGT",
    "query": ">q\nAACCGT",
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "alphabet"
   }
  },
  {
   "id": "frag-refuse-alphabet-before-short",
   "note": "A short query with a bad letter refuses as alphabet, the first check that fails.",
   "input": {
    "residues": "AACCGT",
    "query": "AAN",
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "alphabet"
   }
  },
  {
   "id": "frag-refuse-long",
   "note": "10,001 bases refuse as long.",
   "input": {
    "residues": "AACCGT",
    "query": {
     "parts": [
      [
       "A",
       10001
      ]
     ]
    },
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "long"
   }
  },
  {
   "id": "frag-accept-max",
   "note": "10,000 bases are read (longer than the molecule: no hit).",
   "input": {
    "residues": "AACCGT",
    "query": {
     "parts": [
      [
       "A",
       10000
      ]
     ]
    },
    "circular": false
   },
   "expected": {
    "ok": true,
    "query": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA",
    "matches": []
   }
  },
  {
   "id": "frag-refuse-raw-long",
   "note": "A raw query over 20,000 characters refuses as long before anything is removed.",
   "input": {
    "residues": "AACCGT",
    "query": {
     "parts": [
      [
       "A ",
       10001
      ]
     ]
    },
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "long"
   }
  },
  {
   "id": "frag-refuse-residues",
   "note": "A saved sequence with U refuses the search; it is not DNA on its saved strand.",
   "input": {
    "residues": "AACUGT",
    "query": "AACCGT",
    "circular": false
   },
   "expected": {
    "ok": false,
    "reason": "residues"
   }
  }
 ]
}
