Skip to content
Snippets Groups Projects
Unverified Commit b7fe370d authored by Cats's avatar Cats Committed by GitHub
Browse files

Merge pull request #116 from biowdl/add_sv_tasks

Add sv tasks
parents b9ad171e 06d37a72
No related branches found
No related tags found
No related merge requests found
......@@ -11,6 +11,13 @@ that users understand how the changes affect the new version.
version 2.2.0-dev
---------------------------
+ Update WDL task Picard (Add task RenameSample)
+ Update WDL task Samtools (Add task FilterShortReadsBam)
+ Add WDL task for BCFtools (bcf to vcf)
+ Add WDL task for SURVIVOR (merge)
+ Update WDL task Manta (Add germline SV calling)
+ Add WDL task for Delly
+ Add WDL task for Clever (and Mate-Clever)
+ Add proper copyright headers to all WDL files. So the free software license
is clear to end users who wish to adapt and modify.
+ Add pedigree input for HaplotypeCaller and GenotypeGVCFs.
......
......@@ -73,4 +73,4 @@ task CPAT {
}
# There is also make_hexamer_tab.py and make_logitModel.py
# that can be added as tasks here.
\ No newline at end of file
# that can be added as tasks here.
version 1.0
# MIT License
#
# Copyright (c) 2018 Leiden University Medical Center
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
task Bcf2Vcf {
input {
File bcf
String outputPath = "./bcftools/SV.vcf"
String dockerImage = "quay.io/biocontainers/bcftools:1.9--ha228f0b_3"
}
command {
set -e
mkdir -p "$(dirname ~{outputPath})"
bcftools view ~{bcf} -O v -o ~{outputPath}
}
output {
File outputVcf = outputPath
}
runtime {
docker: dockerImage
}
parameter_meta {
bcf: {description: "The generated BCF from an SV caller", category: "required"}
outputPath: {description: "The location the output VCF file should be written.", category: "common"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
version 1.0
# MIT License
#
# Copyright (c) 2018 Leiden University Medical Center
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import "bwa.wdl"
task Mateclever {
input {
File fiteredBam
File indexedFiteredBam
BwaIndex bwaIndex
File predictions
String outputPath = "./clever"
Int cleverMaxDelLength = 100000
Int maxLengthDiff= 30
Int maxOffset = 150
Int threads = 10
String memory = "15G"
String dockerImage = "quay.io/biocontainers/clever-toolkit:2.4--py36hcfe0e84_6"
}
command {
set -e
mkdir -p "$(dirname ~{outputPath})"
echo ~{outputPath} ~{fiteredBam} ~{predictions} none > predictions.list
mateclever \
-T ~{threads} \
-k \
-f \
-M ~{cleverMaxDelLength} \
-z ~{maxLengthDiff} \
-o ~{maxOffset} \
~{bwaIndex.fastaFile} \
predictions.list \
~{outputPath}
}
output {
File matecleverVcf = outputPath + "/deletions.vcf"
}
runtime {
cpu: threads
memory: memory
docker: dockerImage
}
parameter_meta {
# inputs
fiteredBam: {description: "The bam file where sequences less than 30bp were removed.", category: "required"}
indexedFiteredBam: {description: "The index of the filtered bam file.", category: "required"}
bwaIndex: {description: "The BWA index files.", category: "required"}
predictions: {description: "The predicted deletions (VCF) from clever.", category: "required"}
outputPath: {description: "The location the output VCF file should be written.", category: "common"}
threads: {description: "The the number of threads required to run a program", category: "advanced"}
memory: {description: "The memory required to run the programs", category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
task Prediction {
input {
File bamFile
File bamIndex
BwaIndex bwaIndex
String outputPath = "./clever"
Int threads = 10
String memory = "15G"
String dockerImage = "quay.io/biocontainers/clever-toolkit:2.4--py36hcfe0e84_6"
}
command {
set -e
mkdir -p "$(dirname ~{outputPath})"
clever \
-T ~{threads} \
--use_mapq \
--sorted \
-f \
~{bamFile} \
~{bwaIndex.fastaFile} \
~{outputPath}
}
output {
File predictions = outputPath + "/predictions.vcf"
}
runtime {
cpu: threads
memory: memory
docker: dockerImage
}
parameter_meta {
# inputs
bamFile: {description: "The bam file to process.", category: "required"}
bamIndex: {description: "The index bam file.", category: "required"}
bwaIndex: {description: "The BWA index files.", category: "required"}
outputPath: {description: "The location the output VCF file should be written.", category: "common"}
threads: {description: "The the number of threads required to run a program", category: "advanced"}
memory: {description: "The memory required to run the programs", category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
# outputs
predictions: {description: "The predicted deletions (VCF) from clever.", category: "advanced"}
}
}
version 1.0
# MIT License
#
# Copyright (c) 2018 Leiden University Medical Center
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
task CallSV {
input {
File bamFile
File bamIndex
File referenceFasta
File referenceFastaFai
String outputPath = "./delly/delly.vcf"
String memory = "15G"
String dockerImage = "quay.io/biocontainers/delly:0.8.1--h4037b6b_1"
}
command {
set -e
mkdir -p "$(dirname ~{outputPath})"
delly call \
-o ~{outputPath} \
-g ~{referenceFasta} \
~{bamFile}
}
output {
File dellyBcf = outputPath
}
runtime {
memory: memory
docker: dockerImage
}
parameter_meta {
# inputs
bamFile: {description: "The bam file to process.", category: "required"}
bamIndex: {description: "The index bam file.", category: "required"}
referenceFasta: {description: "The reference fasta file also used for mapping.", category: "required"}
referenceFastaFai: {description: "Fasta index (.fai) file of the reference", category: "required" }
outputPath: {description: "The location the output VCF file should be written.", category: "common"}
memory: {description: "The memory required to run the programs", category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
......@@ -20,7 +20,63 @@ version 1.0
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import "common.wdl"
task Germline {
input {
File bamFile
File bamIndex
File referenceFasta
File referenceFastaFai
String runDir = "./manta_run"
File? callRegions
File? callRegionsIndex
Boolean exome = false
Int cores = 1
Int memoryGb = 4
String dockerImage = "quay.io/biocontainers/manta:1.4.0--py27_1"
}
command {
set -e
configManta.py \
~{"--normalBam " + bamFile} \
--referenceFasta ~{referenceFasta} \
~{"--callRegions " + callRegions} \
--runDir ~{runDir} \
~{true="--exome" false="" exome}
~{runDir}/runWorkflow.py \
-m local \
-j ~{cores} \
-g ~{memoryGb}
}
output {
File mantaVCF = runDir + "/results/variants/diploidSV.vcf.gz"
File mantaVCFindex = runDir + "/results/variants/diploidSV.vcf.gz.tbi"
}
runtime {
cpu: cores
memory: "~{memoryGb}G"
docker: dockerImage
}
parameter_meta {
# inputs
bamFile: {description: "The bam file to process.", category: "required"}
bamIndex: {description: "The index bam file.", category: "required"}
referenceFasta: {description: "The reference fasta file also used for mapping.", category: "required"}
referenceFastaFai: {description: "Fasta index (.fai) file of the reference", category: "required" }
runDir: {description: "The directory to use as run/output directory.", category: "common"}
callRegions: {description: "The bed file which indicates the regions to operate on.", category: "common"}
callRegionsIndex: {description: "The index of the bed file which indicates the regions to operate on.", category: "common"}
exome: {description: "Whether or not the data is from exome sequencing.", category: "common"}
cores: {description: "The the number of cores required to run a program", category: "required"}
memoryGb: {description: "The memory required to run the manta", category: "required"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
task Somatic {
input {
......@@ -87,10 +143,8 @@ task Somatic {
callRegions: {description: "The bed file which indicates the regions to operate on.", category: "common"}
callRegionsIndex: {description: "The index of the bed file which indicates the regions to operate on.", category: "common"}
exome: {description: "Whether or not the data is from exome sequencing.", category: "common"}
cores: {description: "The number of cores to use.", category: "advanced"}
memoryGb: {description: "The amount of memory this job will use in Gigabytes.", category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.",
category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
......@@ -51,6 +51,7 @@ task BedToIntervalList {
}
parameter_meta {
# inputs
bedFile: {description: "A bed file.", category: "required"}
dict: {description: "A sequence dict file.", category: "required"}
outputPath: {description: "The location the output interval list should be written to.",
......@@ -156,6 +157,7 @@ task CollectMultipleMetrics {
}
parameter_meta {
# inputs
inputBam: {description: "The input BAM file for which metrics will be collected.",
category: "required"}
inputBamIndex: {description: "The index of the input BAM file.", category: "required"}
......@@ -227,6 +229,7 @@ task CollectRnaSeqMetrics {
}
parameter_meta {
# inputs
inputBam: {description: "The input BAM file for which metrics will be collected.",
category: "required"}
inputBamIndex: {description: "The index of the input BAM file.", category: "required"}
......@@ -286,6 +289,7 @@ task CollectTargetedPcrMetrics {
}
parameter_meta {
# inputs
inputBam: {description: "The input BAM file for which metrics will be collected.",
category: "required"}
inputBamIndex: {description: "The index of the input BAM file.", category: "required"}
......@@ -344,6 +348,7 @@ task GatherBamFiles {
}
parameter_meta {
# inputs
inputBams: {description: "The BAM files to be merged together.", category: "required"}
inputBamsIndex: {description: "The indexes of the input BAM files.", category: "required"}
outputBamPath: {description: "The path where the merged BAM file will be written.", caregory: "required"}
......@@ -386,6 +391,7 @@ task GatherVcfs {
}
parameter_meta {
# inputs
inputVcfs: {description: "The VCF files to be merged together.", category: "required"}
inputVcfIndexes: {description: "The indexes of the input VCF files.", category: "required"}
outputVcfPath: {description: "The path where the merged VCF file will be written.", caregory: "required"}
......@@ -452,6 +458,7 @@ task MarkDuplicates {
}
parameter_meta {
# inputs
inputBams: {description: "The BAM files for which the duplicate reads should be marked.", category: "required"}
inputBamIndexes: {description: "Th eindexes for the input BAM files.", category: "required"}
outputBamPath: {description: "The location where the ouptut BAM file should be written.", category: "required"}
......@@ -501,6 +508,7 @@ task MergeVCFs {
}
parameter_meta {
# inputs
inputVCFs: {description: "The VCF files to be merged.", category: "required"}
inputVCFsIndexes: {description: "The indexes of the VCF files.", category: "required"}
outputVcfPath: {description: "The location the output VCF file should be written to.", category: "required"}
......@@ -618,6 +626,7 @@ task SortVcf {
}
parameter_meta {
# inputs
vcfFiles: {description: "The VCF files to merge and sort.", category: "required"}
outputVcfPath: {description: "The location the sorted VCF files should be written to.", category: "required"}
dict: {description: "A sequence dictionary matching the VCF files.", category: "advanced"}
......@@ -628,4 +637,44 @@ task SortVcf {
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.",
category: "advanced"}
}
}
\ No newline at end of file
}
task RenameSample {
input {
File inputVcf
String outputPath = "./picard/renamed.vcf"
String newSampleName
String memory = "24G"
String javaXmx = "8G"
String dockerImage = "quay.io/biocontainers/picard:2.19.0--0"
}
command {
set -e
mkdir -p "$(dirname ~{outputPath})"
picard -Xmx~{javaXmx} \
RenameSampleInVcf \
I=~{inputVcf} \
O=~{outputPath} \
NEW_SAMPLE_NAME=~{newSampleName}
}
output {
File renamedVcf = outputPath
}
runtime {
docker: dockerImage
memory: memory
}
parameter_meta {
# inputs
inputVcf: {description: "The VCF file to process.", category: "required"}
outputPath: {description: "The location the output VCF file should be written.", category: "common"}
newSampleName: {description: "A string to replace the old sample name.", category: "required"}
memory: {description: "The memory required to run the programs", category: "advanced"}
javaXmx: {description: "The max. memory allocated for JAVA", category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
......@@ -48,6 +48,7 @@ task BgzipAndIndex {
}
parameter_meta {
# inputs
inputFile: {description: "The file to be compressed and indexed.", category: "required"}
outputDir: {description: "The directory in which the output will be placed.", category: "required"}
type: {description: "The type of file (eg. vcf or bed) to be compressed and indexed.", category: "common"}
......@@ -90,6 +91,7 @@ task Index {
}
parameter_meta {
# inputs
bamFile: {description: "The BAM file for which an index should be made.", category: "required"}
outputBamPath: {description: "The location where the BAM file should be written to. The index will appear alongside this link to the BAM file.",
category: "common"}
......@@ -125,6 +127,7 @@ task Merge {
}
parameter_meta {
# inputs
bamFiles: {description: "The BAM files to merge.", category: "required"}
outputBamPath: {description: "The location the merged BAM file should be written to.", category: "common"}
force: {description: "Equivalent to samtools merge's `-f` flag.", category: "advanced"}
......@@ -156,6 +159,7 @@ task SortByName {
}
parameter_meta {
# inputs
bamFile: {description: "The BAM file to get sorted.", category: "required"}
outputBamPath: {description: "The location the sorted BAM file should be written to.", category: "common"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.",
......@@ -186,6 +190,7 @@ task Markdup {
}
parameter_meta {
# inputs
inputBam: {description: "The BAM file to be processed.", category: "required"}
outputBamPath: {description: "The location of the output BAM file.", category: "required"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.",
......@@ -216,6 +221,7 @@ task Flagstat {
}
parameter_meta {
# inputs
inputBam: {description: "The BAM file for which statistics should be retrieved.", category: "required"}
outputPath: {description: "The location the ouput should be written to.", category: "required"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.",
......@@ -232,8 +238,8 @@ task Fastq {
Int? includeFilter
Int? excludeFilter
Int? excludeSpecificFilter
Boolean? appendReadNumber
Boolean? outputQuality
Boolean appendReadNumber = false
Boolean outputQuality = false
Int? compressionLevel
Int threads = 1
......@@ -269,6 +275,7 @@ task Fastq {
}
parameter_meta {
# inputs
inputBam: {description: "The bam file to process.", category: "required"}
outputRead1: {description: "The location the reads (first reads for pairs, in case of paired-end sequencing) should be written to.", category: "required"}
outputRead2: {description: "The location the second reads from pairs should be written to.", category: "common"}
......@@ -313,6 +320,7 @@ task Tabix {
}
parameter_meta {
# inputs
inputFile: {description: "The file to be indexed.", category: "required"}
outputFilePath: {description: "The location where the file should be written to. The index will appear alongside this link to the file.",
category: "common"}
......@@ -327,7 +335,9 @@ task View {
File inFile
File? referenceFasta
String outputFileName = "view.bam"
Boolean? uncompressedBamOutput
Boolean includeHeader = false
Boolean outputBam = false
Boolean uncompressedBamOutput = false
Int? includeFilter
Int? excludeFilter
Int? excludeSpecificFilter
......@@ -346,6 +356,7 @@ task View {
samtools view -b \
~{"-T " + referenceFasta} \
~{"-o " + outputFileName} \
~{true="-b " false="" outputBam} \
~{true="-u " false="" uncompressedBamOutput} \
~{"-f " + includeFilter} \
~{"-F " + excludeFilter} \
......@@ -357,7 +368,7 @@ task View {
}
output {
File outputBam = outputFileName
File outputBAM = outputFileName
File outputBamIndex = outputIndexPath
}
......@@ -368,6 +379,7 @@ task View {
}
parameter_meta {
# inputs
inFile: {description: "A BAM, SAM or CRAM file.", category: "required"}
referenceFasta: {description: "The reference fasta file also used for mapping.", category: "advanced"}
outputFileName: {description: "The location the output BAM file should be written.", category: "common"}
......@@ -383,3 +395,37 @@ task View {
category: "advanced"}
}
}
task FilterShortReadsBam {
input {
File bamFile
String outputPathBam
String dockerImage = "quay.io/biocontainers/samtools:1.8--h46bd0b3_5"
}
String outputPathBamIndex = sub(outputPathBam, "\.bam$", ".bai")
command {
set -e
mkdir -p "$(dirname ~{outputPathBam})"
samtools view -h ~{bamFile} | \
awk 'length($10) > 30 || $1 ~/^@/' | \
samtools view -bS -> ~{outputPathBam}
samtools index ~{outputPathBam} ~{outputPathBamIndex}
}
output {
File filteredBam = outputPathBam
File filteredBamIndex = outputPathBamIndex
}
runtime {
docker: dockerImage
}
parameter_meta {
bamFile: {description: "The bam file to process.", category: "required"}
outputPathBam: {description: "The filtered bam file.", category: "common"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
version 1.0
# MIT License
#
# Copyright (c) 2018 Leiden University Medical Center
#
# Permission is hereby granted, free of charge, to any person obtaining a copy
# of this software and associated documentation files (the "Software"), to deal
# in the Software without restriction, including without limitation the rights
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the Software is
# furnished to do so, subject to the following conditions:
#
# The above copyright notice and this permission notice shall be included in
# all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
task Merge {
input{
Array[File] filePaths
Int breakpointDistance = 1000
Int suppVecs = 2
Int svType = 1
Int strandType = 1
Int distanceBySvSize = 0
Int minSize = 30
String outputPath = "./survivor/merged.vcf"
String memory = "24G"
String dockerImage = "quay.io/biocontainers/survivor:1.0.6--h6bb024c_0"
}
command {
set -e
mkdir -p "$(dirname ~{outputPath})"
echo '~{sep="\n" filePaths}' > fileList
SURVIVOR merge \
fileList \
~{breakpointDistance} \
~{suppVecs} \
~{svType} \
~{strandType} \
~{distanceBySvSize} \
~{minSize} \
~{outputPath}
}
output {
File mergedVcf = outputPath
}
runtime {
memory: memory
docker: dockerImage
}
parameter_meta {
# inputs
filePaths: {description: "An array of VCF files (predictions) to be merged by SURVIVOR", category: "required"}
breakpointDistance: {description: "The distance between pairwise breakpoints between SVs", category: "advanced"}
suppVecs: {description: "The minimum number of SV callers to support the merging", category: "advanced"}
svType: {description: "A boolean to include the type SV to be merged", category: "advanced"}
strandType: {description: "A boolean to include strand type of an SV to be merged", category: "advanced"}
distanceBySvSize: {description: "A boolean to predict the pairwise distance between the SVs based on their size", category: "advanced"}
minSize: {description: "The mimimum size of SV to be merged", category: "advanced"}
outputPath: {description: "The location the output VCF file should be written.", category: "common"}
memory: {description: "The memory required to run the programs", category: "advanced"}
dockerImage: {description: "The docker image used for this task. Changing this may result in errors which the developers may choose not to address.", category: "advanced"}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment