Skip to content

Commit

Permalink
Spellchecker action
Browse files Browse the repository at this point in the history
  • Loading branch information
szmazurek committed Sep 16, 2024
1 parent e066e88 commit 92d2f97
Showing 1 changed file with 165 additions and 0 deletions.
165 changes: 165 additions & 0 deletions .github/workflows/spellchecker.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
name: Check Spelling

Check failure

Code scanning / check-spelling

Check File Path Error

workflows is not a recognized word. (check-file-path)

Check failure

Code scanning / check-spelling

Check File Path Error

spellchecker is not a recognized word. (check-file-path)

Check failure

Code scanning / check-spelling

Check File Path Error

yml is not a recognized word. (check-file-path)

# Comment management is handled through a secondary job, for details see:
# https://github.com/check-spelling/check-spelling/wiki/Feature%3A-Restricted-Permissions
#
# `jobs.comment-push` runs when a push is made to a repository and the `jobs.spelling` job needs to make a comment
# (in odd cases, it might actually run just to collapse a comment, but that's fairly rare)
# it needs `contents: write` in order to add a comment.
#
# `jobs.comment-pr` runs when a pull_request is made to a repository and the `jobs.spelling` job needs to make a comment
# or collapse a comment (in the case where it had previously made a comment and now no longer needs to show a comment)
# it needs `pull-requests: write` in order to manipulate those comments.

# Updating pull request branches is managed via comment handling.
# For details, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-expect-list
#
# These elements work together to make it happen:
#
# `on.issue_comment`
# This event listens to comments by users asking to update the metadata.
#
# `jobs.update`
# This job runs in response to an issue_comment and will push a new commit
# to update the spelling metadata.
#
# `with.experimental_apply_changes_via_bot`
# Tells the action to support and generate messages that enable it
# to make a commit to update the spelling metadata.
#
# `with.ssh_key`
# In order to trigger workflows when the commit is made, you can provide a
# secret (typically, a write-enabled github deploy key).
#
# For background, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Update-with-deploy-key

# Sarif reporting
#
# Access to Sarif reports is generally restricted (by GitHub) to members of the repository.
#
# Requires enabling `security-events: write`
# and configuring the action with `use_sarif: 1`
#
# For information on the feature, see: https://github.com/check-spelling/check-spelling/wiki/Feature:-Sarif-output

# Minimal workflow structure:
#
# on:
# push:
# ...
# pull_request_target:
# ...
# jobs:
# # you only want the spelling job, all others should be omitted
# spelling:
# # remove `security-events: write` and `use_sarif: 1`
# # remove `experimental_apply_changes_via_bot: 1`
# ... otherwise adjust the `with:` as you wish

on:
push:
branches:
- "**"
tags-ignore:
- "**"
pull_request_target:
branches:
- "**"
types:
- 'opened'
- 'reopened'
- 'synchronize'
issue_comment:
types:
- 'created'

jobs:
spelling:
name: Check Spelling
permissions:
contents: read
pull-requests: read
actions: read
security-events: write
outputs:
followup: ${{ steps.spelling.outputs.followup }}
runs-on: ubuntu-latest
if: ${{ contains(github.event_name, 'pull_request') || github.event_name == 'push' }}
concurrency:
group: spelling-${{ github.event.pull_request.number || github.ref }}
# note: If you use only_check_changed_files, you do not want cancel-in-progress
cancel-in-progress: true
steps:
- name: check-spelling
id: spelling
uses: check-spelling/check-spelling@main
with:
suppress_push_for_open_pull_request: ${{ github.actor != 'dependabot[bot]' && 1 }}
checkout: true
check_file_names: 1
spell_check_this: check-spelling/spell-check-this@prerelease
post_comment: 0
use_magic_file: 1
report-timing: 1
warnings: bad-regex,binary-file,deprecated-feature,large-file,limited-references,no-newline-at-eof,noisy-file,non-alpha-in-dictionary,token-is-substring,unexpected-line-ending,whitespace-in-dictionary,minified-file,unsupported-configuration,no-files-to-check
experimental_apply_changes_via_bot: 1
use_sarif: ${{ (!github.event.pull_request || (github.event.pull_request.head.repo.full_name == github.repository)) && 1 }}
extra_dictionary_limit: 20
extra_dictionaries:
cspell:software-terms/dict/softwareTerms.txt

comment-push:
name: Report (Push)
# If your workflow isn't running on push, you can remove this job
runs-on: ubuntu-latest
needs: spelling
permissions:
contents: write
if: (success() || failure()) && needs.spelling.outputs.followup && github.event_name == 'push'
steps:
- name: comment
uses: check-spelling/check-spelling@main
with:
checkout: true
spell_check_this: check-spelling/spell-check-this@prerelease
task: ${{ needs.spelling.outputs.followup }}

comment-pr:
name: Report (PR)
# If you workflow isn't running on pull_request*, you can remove this job
runs-on: ubuntu-latest
needs: spelling
permissions:
contents: read
pull-requests: write
if: (success() || failure()) && needs.spelling.outputs.followup && contains(github.event_name, 'pull_request')
steps:
- name: comment
uses: check-spelling/check-spelling@main
with:
checkout: true
spell_check_this: check-spelling/spell-check-this@prerelease
task: ${{ needs.spelling.outputs.followup }}
experimental_apply_changes_via_bot: 1

update:
name: Update PR
permissions:
contents: write
pull-requests: write
actions: read
runs-on: ubuntu-latest
if: ${{
github.event_name == 'issue_comment' &&
github.event.issue.pull_request &&
contains(github.event.comment.body, '@check-spelling-bot apply')}}
concurrency:
group: spelling-update-${{ github.event.issue.number }}
cancel-in-progress: false
steps:
- name: apply spelling updates
uses: check-spelling/check-spelling@main
with:
experimental_apply_changes_via_bot: 1
checkout: true
ssh_key: "${{ secrets.CHECK_SPELLING }}"

1 comment on commit 92d2f97

@github-actions
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@check-spelling-bot Report

🔴 Please review

See the 📜action log or 📝 job summary for details.

Unrecognized words (810)
Abhishek
Abousamra
abspath
acs
acsconv
adadelta
adagrad
adamax
adamw
addcdiv
addcmul
addgroup
addoption
adduser
ademamix
ADirectory
admins
agc
agni
Aimilia
aimiliag
albumentations
allclose
allcontributors
allsigned
amd
amsgrad
Anirban
anomymizer
anonymization
applyaugs
apps
apptainer
Aqubvel
arange
archs
arcname
argmax
argparse
argwhere
Arnout
arxiv
asarray
asctime
aspx
astype
atleast
augs
auroc
autobuild
autocast
autodetermined
auxilary
avgs
awaa
Babak
bacf
backprop
backpropagate
backpropagation
Baheti
Baid
Bakas
Bashyam
batchnorm
baz
bdfc
beggining
bfda
bgr
Bhalerao
biggeest
bincount
biomedicalimaging
Bjoern
blabla
bmp
brahim
brainage
Brox
btw
Buildx
BVpye
capsys
cbica
cbig
cca
CCE
cel
cencoder
centercrop
cff
cfg
Chitalia
christos
Chunrui
Chv
cla
classif
classitk
codacy
codecov
CODEOWNERS
codeql
codereview
codespace
Colab
colorconv
colorjitter
colorlog
COLORMAP
commandline
commonpath
concat
configfile
configgenerator
conftest
contextlib
contextmanager
convs
cooldown
copyfile
copytree
cosineannealing
cosineannealinglr
cosinesimilarity
cov
croporpad
cropzero
ctc
ctx
CUBLAS
cudnn
cvt
cwd
cycliclr
datacenter
dataclass
dataclasses
dataframe
dataprep
datefmt
datestampnow
datetime
Davatzikos
dcbca
dcce
dclog
dcm
dcmtk
ddce
deac
deadsnakes
DEBIAN
deconv
deepcopy
deepresunet
Deepthi
deepunet
defaultdict
denseblock
denselayer
densenet
depthconv
Despina
despinak
devcontainer
devnull
dfu
dicelog
dicom
dicomanonymizer
digestpath
discussioncomment
DLF
DNN
dockerfiles
dockerignore
dockerized
dockertag
doi
Dokania
dotnet
downsamp
downsample
downsampling
doxygen
dpi
dpn
dqbm
dropna
dtype
dynunet
edac
edt
edu
eep
efc
efficientnet
efficientnetb
effiency
eigen
elementwise
elif
embeddings
Emre
endswith
ener
ensurepip
entrypoints
eps
Ethem
excepthook
exctype
exponentiallr
extractall
fcn
Fdocker
fepegar
figsize
fileinput
filenaming
fileobj
filereader
fillna
findall
finetuned
finfo
flaim
fnull
forall
fpath
frgfm
fromarray
fromiter
Fsegmentation
Fulcio
functools
Fworkflows
gandlf
Gastounioti
gaussian
gbp
gcam
gcampp
GDCM
gdown
gelu
geometricanirban
geq
getattr
getcwd
getitem
Getka
getoption
getsizeof
gettempdir
ggcam
ghc
gle
glx
Gonz
google
Gotkowski
gpu
grayscale
Grenko
gridaggregator
gridsampler
groundtruth
Guley
gumbel
Haghighi
Hamamc
Hamamci
hasattr
hashlib
hausdorff
healper
heatmap
hexdigest
hexops
HHMMSS
histo
histopath
holocron
hookimpl
hookwrapper
HOUNSFIELD
hpc
hstack
hsv
HTR
hyperparameters
idx
ihc
iloc
imagenet
imbalanced
img
importlib
imread
imsave
imshow
imwrite
indeces
inlinehilite
inp
inplace
inputdata
instancenorm
interp
ints
ISBI
isdigit
isdir
isfile
isin
isinstance
islink
isnan
isnull
isnumeric
issn
issubclass
itcr
iterrows
itk
itkimage
itksnap
jaccard
javascript
JAX
JBHI
JDu
joinpath
JSTARS
Junwen
jupyter
Jupyterlab
kaiming
kakumarabhishek
Karargyris
Karkada
keepdim
keleshev
kenshohara
keyring
KFold
kickstart
kld
Kontos
ksel
kspace
Kullback
Kurc
kwargs
labelsample
labelsampler
lambd
layerchange
leakyrelu
leftarrow
Leibler
len
levelname
levelno
lfs
libgl
libjpeg
libpython
libsm
libvips
libxext
lightresunet
lightunet
linalg
linenums
lineplot
linspace
linting
listdir
lly
logfile
logit
logpt
logsoftmax
logvar
longreprtext
lps
lrelu
LROn
lstsq
lucidrains
macenko
mainrun
makedirs
makereport
mathcal
mathews
matmul
matplotlib
matthews
maxpool
mbergman
mcc
mcclog
MCD
mcr
MCT
mde
mdmc
medcam
medmnist
medperf
medpy
Megh
mencoder
menze
metavar
metr
miccai
microsoft
missingprediction
mkdocs
mlcommons
mlcube
mlcubedir
mle
mlp
modelbase
modeldir
modelio
modelname
monai
Mouchtaris
moveaxis
mpp
mps
mri
msa
mscadocs
msdnet
mse
msle
Mukhopadhyay
mul
multiclass
multidim
multilabel
mytagname
nadam
nans
naveenk
ncbi
ncc
ndarray
ndexbio
ndim
ndimage
NDLF
nesterov
neuroimage
nfnets
nibabel
nicl
NIf
nifti
nih
nii
nlabel
nlm
nnf
nonroot
noreply
normpath
normtype
nosec
notsigned
novograd
nsd
nuitka
numel
numlay
numpy
nvidia
oci
octicons
offis
ohif
onefile
onlatest
onnx
OOM
opencv
openfl
openslide
opensource
openvino
opm
opset
optim
Orhun
ossar
outconv
outfile
outputdir
outputfile
palletsprojects
Panchumarthy
pardir
pathlib
pathmnist
pati
pbar
pchs
pdf
Pdocker
pearson
Phenomics
pid
pkl
plt
pmwiki
pnas
posix
pprint
Prashant
prcomment
predics
predmask
preds
pretrained
probs
proj
protobuf
Prunner
psnr
psutil
pth
PTk
pubmed
purelib
pwadry
pydantic
pydicom
pygments
pyinstaller
pylint
pymdownx
pypa
pypi
pyplot
pyproject
pytest
PYTHONPATH
pytorch
pyversion
pyyaml
qsub
qubvel
radam
Radeon
radiomics
radxtools
ramework
randint
randomaffine
randomanisotropy
randombiasfield
randomblur
randomelasticdeformation
randomflip
randommotion
randomnoise
randomswap
rawinput
rcond
readline
readouterr
realpath
reco
recoverconfig
reducelronplateau
reduceonplateau
reencoded
refernce
Rekor
relativized
relu
rensen
Reparameterization
reparameterize
rescaler
residualunet
resnet
resunet
returncode
rgb
rgba
rgbatorgb
rgbtorgba
rigourous
rmsprop
rmtree
rocm
rocmdocs
Ronneberger
rowvar
rprop
rsplit
ruifrok
runnning
runtest
Saltz
samplewise
Sarthak
sarthakpati
savefig
sbakas
sbia
scikit
scipy
screenshots
scse
sdata
sdnet
seaborn
sebastianffx
securefederatedai
segmap
segmask
segmentor
Sens
sessionstart
setbiasranges
setcutoffrange
setdefault
setsigmaranges
setuptools
Sezgin
sge
Shahira
shlex
shubham
shutil
sid
siddhesh
sigstore
silu
simg
Simonyan
simplefilter
simpleitk
sitk
skimage
sklearn
slurm
smi
sns
socio
softmax
Soham
Sotirios
sparseadam
spellchecker
splitext
Sprop
Spyridon
sqs
ssim
ssl
stackexchange
stainextract
stainlib
startswith
staticmethod
steplr
stepsize
sterr
strftime
subjectid
subkey
subommands
sume
superfences
sustainability
svg
swapaxes
sys
sysconfig
Tahsin
Tarball
tarfile
tcia
tempconvs
tempfile
testdata
tgz
thresholded
thresholding
Thu
tiatoolbox
tif
tiffslide
timepoints
timm
tio
tioq
tiosd
tmi
tmp
toc
tolist
toml
TOOLSDIRECTORY
toplevel
torchaudio
torchinfo
torchio
torchmetrics
torchvision
towardsdatascience
TPAMI
tqdm
traininginference
transunet
triaged
tryfirst
tsaftaris
TUDA
tversky
uanced
ubyte
uid
uinc
uint
Ujjwal
Umeton
unet
unetr
uniformsample
uniformsampler
unittests
unitwise
unsqueeze
upenn
upsample
upsampled
upsampling
usr
utf
utm
uzh
vahadane
validing
valuetopredict
venv
versioning
vgg
Vinayak
vios
visualstudiomagazine
vmem
voxel
VRAM
vtk
vvv
WACV
warmupcosineschedule
wcs
website
weightedsample
weightedsampler
WEXITSTATUS
whl
wikipedia
workaround
WORKDIR
workflows
workspaces
writelines
writerow
wsi
wsl
xavier
xdim
XDl
XEI
xkq
xlabel
xlim
xnat
XResolution
XTools
yamlchecker
yamlvalidator
ydim
ylabel
yml
YResolution
Yrv
Yuemeng
zarr
Zeroplanes
zicat
zipfile
znorm
ZNormalization
Zou
Some files were automatically ignored 🙈

These sample patterns would exclude them:

^\Q__init__.py\E$
^\QGANDLF/data/patch_miner/__init__.py\E$
^\QGANDLF/data/patch_miner/opm/__init__.py\E$
^\QGANDLF/grad_clipping/__init__.py\E$
^\QGANDLF/models/seg_modules/__init__.py\E$
^\Qtesting/__init__.py\E$

You should consider adding them to:

.github/actions/spelling/excludes.txt

File matching is via Perl regular expressions.

To check these files, more of their words need to be in the dictionary than not. You can use patterns.txt to exclude portions, add items to the dictionary (e.g. by adding them to allow.txt), or fix typos.

To accept these unrecognized words as correct and update file exclusions, you could run the following commands

... in a clone of the [email protected]:mlcommons/GaNDLF.git repository
on the feature/spellchecker branch (ℹ️ how do I use this?):

curl -s -S -L 'https://raw.githubusercontent.com/check-spelling/check-spelling/main/apply.pl' |
perl - 'https://github.com/mlcommons/GaNDLF/actions/runs/10884515988/attempts/1'
Available 📚 dictionaries could cover words not in the 📘 dictionary
Dictionary Entries Covers Uniquely
cspell:python/src/python/python-lib.txt 2417 81 20
cspell:python/src/python/python.txt 392 60 13
cspell:python/src/common/extra.txt 741 12 9
cspell:php/dict/php.txt 1689 29 6
cspell:r/src/r.txt 543 21 5

Consider adding them (in .github/workflows/spellchecker.yml) for uses: check-spelling/check-spelling@main in its with:

      with:
        extra_dictionaries:
          cspell:python/src/python/python-lib.txt
          cspell:python/src/python/python.txt
          cspell:python/src/common/extra.txt
          cspell:php/dict/php.txt
          cspell:r/src/r.txt

To stop checking additional dictionaries, add (in .github/workflows/spellchecker.yml) for uses: check-spelling/check-spelling@main in its with:

check_extra_dictionaries: ''
Pattern suggestions ✂️ (31)

You could add these patterns to .github/actions/spelling/patterns.txt:

# Automatically suggested patterns
# hit-count: 708 file-count: 61
# machine learning (?)
\b(?i)ml(?=[a-z]{2,})

# hit-count: 566 file-count: 103
# https/http/file urls
(?:\b(?:https?|ftp|file)://)[-A-Za-z0-9+&@#/*%?=~_|!:,.;]+[-A-Za-z0-9+&@#/*%=~_|]

# hit-count: 203 file-count: 73
# python
\b(?i)py(?!gments|gmy|lon|ramid|ro|th)(?=[a-z]{2,})

# hit-count: 148 file-count: 88
# scala imports
^import (?:[\w.]|\{\w*?(?:,\s*(?:\w*|\*))+\})+

# hit-count: 144 file-count: 49
# GitHub SHAs (markdown)
(?:\[`?[0-9a-f]+`?\]\(https:/|)/(?:www\.|)github\.com(?:/[^/\s"]+){2,}(?:/[^/\s")]+)(?:[0-9a-f]+(?:[-0-9a-zA-Z/#.]*|)\b|)

# hit-count: 38 file-count: 15
# version suffix <word>v#
(?:(?<=[A-Z]{2})V|(?<=[a-z]{2}|[A-Z]{2})v)\d+(?:\b|(?=[a-zA-Z_]))

# hit-count: 29 file-count: 17
# Python string prefix / binary prefix
# Note that there's a high false positive rate, remove the `?=` and search for the regex to see if the matches seem like reasonable strings
(?<!['"])\b(?:B|BR|Br|F|FR|Fr|R|RB|RF|Rb|Rf|U|UR|Ur|b|bR|br|f|fR|fr|r|rB|rF|rb|rf|u|uR|ur)['"](?=[A-Z]{3,}|[A-Z][a-z]{2,}|[a-z]{3,})

# hit-count: 26 file-count: 8
# libraries
(?:\b|_)lib(?:re(?=office)|)(?!era[lt]|ero|erty|rar(?:i(?:an|es)|y))(?=[a-z])

# hit-count: 17 file-count: 3
# latex (check-spelling >= 0.0.22)
\\\w{2,}\{

# hit-count: 14 file-count: 9
# GitHub actions
\buses:\s+[-\w.]+/[-\w./]+@[-\w.]+

# hit-count: 13 file-count: 10
# Compiler flags (Unix, Java/Scala)
# Use if you have things like `-Pdocker` and want to treat them as `docker`
(?:^|[\t ,>"'`=(])-(?:(?:J-|)[DPWXY]|[Llf])(?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,})

# hit-count: 12 file-count: 1
# tar arguments
\b(?:\\n|)g?tar(?:\.exe|)(?:(?:\s+--[-a-zA-Z]+|\s+-[a-zA-Z]+|\s[ABGJMOPRSUWZacdfh-pr-xz]+\b)(?:=[^ ]*|))+

# hit-count: 9 file-count: 9
# Compiler flags (Windows / PowerShell)
# This is a subset of the more general compiler flags pattern.
# It avoids matching `-Path` to prevent it from being treated as `ath`
(?:^|[\t ,"'`=(])-(?:[DPL](?=[A-Z]{2,})|[WXYlf](?=[A-Z]{2,}|[A-Z][a-z]|[a-z]{2,}))

# hit-count: 8 file-count: 7
# hex runs
\b[0-9a-fA-F]{16,}\b

# hit-count: 6 file-count: 6
# mailto urls
mailto:[-a-zA-Z=;:/?%&0-9+@._]{3,}

# hit-count: 5 file-count: 3
# URL escaped characters
%[0-9A-F][A-F](?=[A-Za-z])

# hit-count: 5 file-count: 1
# shields.io
\bshields\.io/[-\w/%?=&.:+;,]*

# hit-count: 4 file-count: 4
# Docker images
^\s*FROM\s+\S+:\S+(?:\s+AS\s+\S+|)

# hit-count: 3 file-count: 3
# Wikipedia
\ben\.wikipedia\.org/wiki/[-\w%.#]+

# hit-count: 3 file-count: 2
# in [email protected]+, printf markers aren't automatically consumed
# printf markers
(?<!\\)\\[nrt](?=[a-z]{2,})

# hit-count: 2 file-count: 1
# latex (check-spelling <= 0.0.21)
\\(?:n(?:ew|ormal|osub)|r(?:enew)|t(?:able(?:of|)|he|itle))(?=[a-z]+)

# hit-count: 1 file-count: 1
# Google Forms
\bforms\.gle/\w+

# hit-count: 1 file-count: 1
# gist github
\bgist\.github\.com/[^/\s"]+/[0-9a-f]+

# hit-count: 1 file-count: 1
# git.io
\bgit\.io/[0-9a-zA-Z]+

# hit-count: 1 file-count: 1
# Contributor
\[[^\]]+\]\(https://github\.com/[^/\s"]+/?\)

# hit-count: 1 file-count: 1
# vs devops
\bvisualstudio.com(?::443|)/[-\w/?=%&.]*

# hit-count: 1 file-count: 1
# codacy
\bapi\.codacy\.com/project/badge/Grade/[0-9a-f]+

# hit-count: 1 file-count: 1
# stackexchange -- https://stackexchange.com/feeds/sites
\b(?:askubuntu|serverfault|stack(?:exchange|overflow)|superuser).com/(?:questions/\w+/[-\w]+|a/)

# hit-count: 1 file-count: 1
# uuid:
\b[0-9a-fA-F]{8}-(?:[0-9a-fA-F]{4}-){3}[0-9a-fA-F]{12}\b

# hit-count: 1 file-count: 1
# Non-English
[a-zA-Z]*[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3}[a-zA-ZÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]*|[a-zA-Z]{3,}[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź]|[ÀÁÂÃÄÅÆČÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæčçèéêëìíîïðñòóôõöøùúûüýÿĀāŁłŃńŅņŒœŚśŠšŜŝŸŽžź][a-zA-Z]{3,}

# hit-count: 1 file-count: 1
# alternate printf markers if you run into latex and friends
(?<!\\)\\[nrt](?=[a-z]{2,})(?=.*['"`])

Errors (4)

See the 📜action log or 📝 job summary for details.

❌ Errors Count
ℹ️ binary-file 6
ℹ️ candidate-pattern 66
❌ check-file-path 339
❌ forbidden-pattern 10

See ❌ Event descriptions for more information.

Please sign in to comment.