CHANGES IN VERSION 1.31.9
-------------------------

  o Documentation fixes from a review of the vignettes. The inference
    vignette shows its library(sesame) and caching setup, gives raw
    download URLs for the two clock files, states the mouse age the code
    returns (1.18 months) and re-identifies from ~/Downloads in both calls.
    The Basic Usage and QC vignettes define idat_dir as the built-in HM27
    IDATs. The non-human vignette drops an undefined tmp and uses prep code
    SHCDPB, as the Basic Usage table recommends for Mammal40. Ethnicity is
    no longer listed as an inference in DESCRIPTION or the vignette.

  o sesameQCtoDF() works on HM27: the median beta statistics are unnamed,
    so an array without ch or rs probes no longer gives "row names contain
    missing values".

  o matchDesign() (prep code M) stops with an install line when the
    suggested package RPMM is missing.

  o inferSpecies() warns when fewer than 30% of the probes are detected,
    since the species call is then unreliable.

CHANGES IN VERSION 1.31.8
-------------------------

  o inst/CITATION writes the one non-ASCII author name (Szab\u00f3) as an
    escape, so utils::readCitationFile() reads the file without a declared
    encoding. BiocCheck warned "Unable to read CITATION file".

CHANGES IN VERSION 1.31.7
-------------------------

  o visualizeRegion() (and visualizeGene/visualizeProbes through it) can
    draw annotation tracks under the heatmap: show.cgi adds CpG context
    (island, shore, shelf, open sea, from UCSC cpgIslandExt) and
    show.regulatory adds Ensembl Regulatory Build features (needs biomaRt,
    in Suggests). Each track is built on first use and cached in
    BiocFileCache. show.beta.legend and show.annotation.legend add legends;
    show.loci with show.probeNames = FALSE labels probes by coordinate. All
    default to off, so existing calls draw as before. New
    sesameAnno_buildHeatmapAnnotations() builds the tracks. Contributed by
    Pancreas-Pratik (zwdzwd/sesame#220).

CHANGES IN VERSION 1.31.6
-------------------------

  o qualityMask()'s recommended set for HM450 and EPIC is now the five M_*
    tracks EPICv2 and MSA already use (M_1baseSwitchSNPcommon_5pt,
    M_2extBase_SNPcommon_5pt, M_mapping, M_nonuniq, M_SNPcommon_5pt), read
    from KYCG.HM450.Mask.20261008 / KYCG.EPIC.Mask.20261008 in sesameData,
    which are built from the InfiniumAnnotation v8.2 masks. The older KYCG
    tracks (mapping, channel_switch, snp5_GMAF1p, extension, sub30_copy)
    masked about twice as many probes and are still available through
    mask_names. This brings R and SeSAMe2 to the same quality mask on all
    four human arrays (zhou-lab/sesame#1). KYCG.EPICv2.Mask.20261008 and
    KYCG.MSA.Mask.20261008 are rebuilt from the same v8.2 masks.

  o getMask(), listAvailableMasks() and backgroundMask() read the newest
    KYCG.<platform>.Mask.<date> sesameData lists. They used to search every
    listed version, whose tracks share names, so which build a track came
    from depended on listing order. A track name only an older build has
    is still found there. backgroundMask() for HM450/EPIC therefore now
    uses M_nonuniq and the M_1baseSwitchSNPcommon tracks, as SeSAMe2 does.

CHANGES IN VERSION 1.31.5
-------------------------

  o Fixed readControls() building the control data.frame by positional
    assumption. It named the columns with colnames(ctl) <- c('G','R','col',
    'type') over a frame whose signal matrix has four columns, so
    Color_Channel and Type were cbind-ed past the end of that name vector and
    arrived unnamed, while `type` silently took a signal column. Downstream,
    controls(sdf)$Type was a vector of integers, so negControls()'s
    grep("negative", ...) matched nothing and detectionPnegEcdf() failed in
    ecdf() with "'x' must have 1 or more non-missing values" on EPIC and
    HM450 -- the platforms whose controls arrive through readControls() rather
    than as SigDF rows. The columns are now named explicitly.

  o qualityMask() gained `platform` and `mask` arguments, so a custom or
    combined-array mask can be supplied directly instead of being applied as a
    separate addMask() step after the fact.

CHANGES IN VERSION 1.31.4
-------------------------

  o Removed the Google Analytics tag from the vignette header. Vignette
    rendering no longer contacts an external host at build time, and installed
    vignettes no longer load a remote tracking script.

  o Documented sesame-cli, a standalone C implementation of the SeSAMe
    preprocessing workflow (IDAT to betas, QC, differential methylation, copy
    number) for large cohorts and pipeline deployment. Its betas agree with
    this package to within ~1e-3 worst case; the intentional divergences are
    documented in the sesame-cli NUMERICS.md. This package remains the
    reference implementation. See the README and
    https://zwdzwd.github.io/sesame-cli.

CHANGES IN VERSION 1.0.0
-------------------------

  o First submission of SeSAMe package.