The first pass matched only `infura.io/.../v3/<lowercase hex>`, so it missed
`https://...infura.io/v3/<key>`, upper-case keys and hosts, and Nova's
OnFinality `?apikey=` URLs (Moonriver, and the Hades testnet in v20/v21
preConfigured). preConfigured was copied from Nova without the filter, and the
integrity check passed if grep itself failed.
- one predicate, is_keyed(), in sync_from_nova.py: Infura /v3/ ids and
apikey/api_key/key/token query values, case-insensitive; {PLACEHOLDER}
values are allowed
- preConfigured details are filtered after the copy; a chain left with no
node loses its details file and its index entry (Hades, v20/v21 only)
- rewritten files keep their own indent, so the diff is the data change only
- check 5 imports is_keyed() and checks every string in every JSON file
under chains/; an unreadable file or an empty tree is an error
- check 3 reports a grep error instead of passing on it