Subscripting GenomicRanges objects with [[ or $
1
0
Entering edit mode
Tim Yates ▴ 250
@tim-yates-4040
Last seen 9.6 years ago
Hi all, I'm trying to move to using GRanges objects for storing my genomic features rather than IRanges objects that I use currently. However, I cannot seem to subscript the Genomic Ranges object to extract a single column from the meta-data of the object. Hopefully this code explains what I am trying to do, and someone can point me in the right direction? Cheers, Tim > library(GenomicRanges) Loading required package: IRanges Attaching package: 'IRanges' The following object(s) are masked from package:base : cbind, Map, mapply, order, paste, pmax, pmax.int, pmin, pmin.int, rbind, rep.int, table > library(GenomicRanges) > my.starts = c( 10, 100, 1000 ) > my.ends = c( 20, 200, 2000 ) > my.spaces = c( '1', '2', '3' ) > my.strands = c( '+', '+', '-' ) > my.names = c( 'seq1', 'seq2', 'seq3' ) > my.delta = c( 1.23, 2.34, 3.45 ) > > my.df = data.frame( start=my.starts, end=my.ends, space=my.spaces, strand=my.strands, name=my.names, delta=my.delta ) > my.rd = as( my.df, 'RangedData' ) > my.gr = as( my.rd, 'GRanges' ) > # Extract the name field from each of these objects using [[ > print( my.df[[ 'name' ]] ) [1] seq1 seq2 seq3 Levels: seq1 seq2 seq3 > print( my.rd[[ 'name' ]] ) [1] seq1 seq2 seq3 Levels: seq1 seq2 seq3 > print( my.gr[[ 'name' ]] ) Error in my.gr[["name"]] : missing '[[' method for Sequence class GRanges > # Extract the name field from each of these objects using $ > print( my.df$'name' ) [1] seq1 seq2 seq3 Levels: seq1 seq2 seq3 > print( my.rd$'name' ) [1] seq1 seq2 seq3 Levels: seq1 seq2 seq3 > print( my.gr$'name' ) Error in x[[name, exact = FALSE]] : missing '[[' method for Sequence class GRanges > > sessionInfo() R version 2.10.1 (2009-12-14) x86_64-apple-darwin9.8.0 locale: [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 attached base packages: [1] stats graphics grDevices utils datasets methods base other attached packages: [1] GenomicRanges_1.0.8 IRanges_1.6.15 -------------------------------------------------------- This email is confidential and intended solely for the u...{{dropped:15}}
IRanges IRanges • 1.2k views
ADD COMMENT
0
Entering edit mode
@richard-pearson-3213
Last seen 9.6 years ago
Hi Tim I think you need the values accessor method here: print( valuesmy.gr)[[ 'name' ]] ) Cheers Richard Tim Yates wrote: > Hi all, > > I'm trying to move to using GRanges objects for storing my genomic features > rather than IRanges objects that I use currently. > > However, I cannot seem to subscript the Genomic Ranges object to extract a > single column from the meta-data of the object. > > Hopefully this code explains what I am trying to do, and someone can point > me in the right direction? > > Cheers, > > Tim > >> library(GenomicRanges) > Loading required package: IRanges > > Attaching package: 'IRanges' > > > The following object(s) are masked from package:base : > > cbind, > Map, > mapply, > order, > paste, > pmax, > pmax.int, > pmin, > pmin.int, > rbind, > rep.int, > table > >> library(GenomicRanges) >> my.starts = c( 10, 100, 1000 ) >> my.ends = c( 20, 200, 2000 ) >> my.spaces = c( '1', '2', '3' ) >> my.strands = c( '+', '+', '-' ) >> my.names = c( 'seq1', 'seq2', 'seq3' ) >> my.delta = c( 1.23, 2.34, 3.45 ) >> >> my.df = data.frame( start=my.starts, end=my.ends, space=my.spaces, > strand=my.strands, name=my.names, delta=my.delta ) >> my.rd = as( my.df, 'RangedData' ) >> my.gr = as( my.rd, 'GRanges' ) >> > > # Extract the name field from each of these objects using [[ > >> print( my.df[[ 'name' ]] ) > [1] seq1 seq2 seq3 > Levels: seq1 seq2 seq3 >> print( my.rd[[ 'name' ]] ) > [1] seq1 seq2 seq3 > Levels: seq1 seq2 seq3 >> print( my.gr[[ 'name' ]] ) > Error in my.gr[["name"]] : missing '[[' method for Sequence class GRanges > > # Extract the name field from each of these objects using $ > >> print( my.df$'name' ) > [1] seq1 seq2 seq3 > Levels: seq1 seq2 seq3 >> print( my.rd$'name' ) > [1] seq1 seq2 seq3 > Levels: seq1 seq2 seq3 >> print( my.gr$'name' ) > Error in x[[name, exact = FALSE]] : > missing '[[' method for Sequence class GRanges >> sessionInfo() > R version 2.10.1 (2009-12-14) > x86_64-apple-darwin9.8.0 > > locale: > [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 > > attached base packages: > [1] stats graphics grDevices utils datasets methods base > > other attached packages: > [1] GenomicRanges_1.0.8 IRanges_1.6.15 > -------------------------------------------------------- > This email is confidential and intended solely for the u...{{dropped:15}} > > _______________________________________________ > Bioconductor mailing list > Bioconductor at stat.math.ethz.ch > https://stat.ethz.ch/mailman/listinfo/bioconductor > Search the archives: http://news.gmane.org/gmane.science.biology.informatics.conductor > -- Dr Richard D Pearson richard.pearson at well.ox.ac.uk Wellcome Trust Centre for Human Genetics http://www.well.ox.ac.uk/~rpearson University of Oxford Tel: +44 (0)1865 617890 Roosevelt Drive Mob: +44 (0)7971 221181 Oxford OX3 7BN, UK Fax: +44 (0)1865 287664
ADD COMMENT
0
Entering edit mode
Hi Richard, Ahhh..cool, yeah that works. Shame it's not a unified interface across all three datatypes though. Thanks for pointing me in the right direction though :-) Tim On 27/08/2010 10:31, "Richard Pearson" <richard.pearson at="" well.ox.ac.uk=""> wrote: > Hi Tim > > I think you need the values accessor method here: > > print( valuesmy.gr)[[ 'name' ]] ) > > Cheers > > Richard > > > Tim Yates wrote: >> Hi all, >> >> I'm trying to move to using GRanges objects for storing my genomic features >> rather than IRanges objects that I use currently. >> >> However, I cannot seem to subscript the Genomic Ranges object to extract a >> single column from the meta-data of the object. >> >> Hopefully this code explains what I am trying to do, and someone can point >> me in the right direction? >> >> Cheers, >> >> Tim >> >>> library(GenomicRanges) >> Loading required package: IRanges >> >> Attaching package: 'IRanges' >> >> >> The following object(s) are masked from package:base : >> >> cbind, >> Map, >> mapply, >> order, >> paste, >> pmax, >> pmax.int, >> pmin, >> pmin.int, >> rbind, >> rep.int, >> table >> >>> library(GenomicRanges) >>> my.starts = c( 10, 100, 1000 ) >>> my.ends = c( 20, 200, 2000 ) >>> my.spaces = c( '1', '2', '3' ) >>> my.strands = c( '+', '+', '-' ) >>> my.names = c( 'seq1', 'seq2', 'seq3' ) >>> my.delta = c( 1.23, 2.34, 3.45 ) >>> >>> my.df = data.frame( start=my.starts, end=my.ends, space=my.spaces, >> strand=my.strands, name=my.names, delta=my.delta ) >>> my.rd = as( my.df, 'RangedData' ) >>> my.gr = as( my.rd, 'GRanges' ) >>> >> >> # Extract the name field from each of these objects using [[ >> >>> print( my.df[[ 'name' ]] ) >> [1] seq1 seq2 seq3 >> Levels: seq1 seq2 seq3 >>> print( my.rd[[ 'name' ]] ) >> [1] seq1 seq2 seq3 >> Levels: seq1 seq2 seq3 >>> print( my.gr[[ 'name' ]] ) >> Error in my.gr[["name"]] : missing '[[' method for Sequence class GRanges >> >> # Extract the name field from each of these objects using $ >> >>> print( my.df$'name' ) >> [1] seq1 seq2 seq3 >> Levels: seq1 seq2 seq3 >>> print( my.rd$'name' ) >> [1] seq1 seq2 seq3 >> Levels: seq1 seq2 seq3 >>> print( my.gr$'name' ) >> Error in x[[name, exact = FALSE]] : >> missing '[[' method for Sequence class GRanges >>> sessionInfo() >> R version 2.10.1 (2009-12-14) >> x86_64-apple-darwin9.8.0 >> >> locale: >> [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 >> >> attached base packages: >> [1] stats graphics grDevices utils datasets methods base >> >> other attached packages: >> [1] GenomicRanges_1.0.8 IRanges_1.6.15 >> -------------------------------------------------------- >> This email is confidential and intended solely for the u...{{dropped:15}} >> >> _______________________________________________ >> Bioconductor mailing list >> Bioconductor at stat.math.ethz.ch >> https://stat.ethz.ch/mailman/listinfo/bioconductor >> Search the archives: >> http://news.gmane.org/gmane.science.biology.informatics.conductor >> -------------------------------------------------------- This email is confidential and intended solely for the u...{{dropped:12}}
ADD REPLY
0
Entering edit mode
On 08/27/2010 03:03 AM, Tim Yates wrote: > Hi Richard, > > Ahhh..cool, yeah that works. Shame it's not a unified interface across all > three datatypes though. These were intentional design decisions to reduce ambiguities in which of the components of these complex arguments subscript operations were meant to apply, in the long run making it easier to write unambiguous and easy to read code. Martin > > Thanks for pointing me in the right direction though :-) > > Tim > > On 27/08/2010 10:31, "Richard Pearson" <richard.pearson at="" well.ox.ac.uk=""> > wrote: > >> Hi Tim >> >> I think you need the values accessor method here: >> >> print( valuesmy.gr)[[ 'name' ]] ) >> >> Cheers >> >> Richard >> >> >> Tim Yates wrote: >>> Hi all, >>> >>> I'm trying to move to using GRanges objects for storing my genomic features >>> rather than IRanges objects that I use currently. >>> >>> However, I cannot seem to subscript the Genomic Ranges object to extract a >>> single column from the meta-data of the object. >>> >>> Hopefully this code explains what I am trying to do, and someone can point >>> me in the right direction? >>> >>> Cheers, >>> >>> Tim >>> >>>> library(GenomicRanges) >>> Loading required package: IRanges >>> >>> Attaching package: 'IRanges' >>> >>> >>> The following object(s) are masked from package:base : >>> >>> cbind, >>> Map, >>> mapply, >>> order, >>> paste, >>> pmax, >>> pmax.int, >>> pmin, >>> pmin.int, >>> rbind, >>> rep.int, >>> table >>> >>>> library(GenomicRanges) >>>> my.starts = c( 10, 100, 1000 ) >>>> my.ends = c( 20, 200, 2000 ) >>>> my.spaces = c( '1', '2', '3' ) >>>> my.strands = c( '+', '+', '-' ) >>>> my.names = c( 'seq1', 'seq2', 'seq3' ) >>>> my.delta = c( 1.23, 2.34, 3.45 ) >>>> >>>> my.df = data.frame( start=my.starts, end=my.ends, space=my.spaces, >>> strand=my.strands, name=my.names, delta=my.delta ) >>>> my.rd = as( my.df, 'RangedData' ) >>>> my.gr = as( my.rd, 'GRanges' ) >>>> >>> >>> # Extract the name field from each of these objects using [[ >>> >>>> print( my.df[[ 'name' ]] ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.rd[[ 'name' ]] ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.gr[[ 'name' ]] ) >>> Error in my.gr[["name"]] : missing '[[' method for Sequence class GRanges >>> >>> # Extract the name field from each of these objects using $ >>> >>>> print( my.df$'name' ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.rd$'name' ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.gr$'name' ) >>> Error in x[[name, exact = FALSE]] : >>> missing '[[' method for Sequence class GRanges >>>> sessionInfo() >>> R version 2.10.1 (2009-12-14) >>> x86_64-apple-darwin9.8.0 >>> >>> locale: >>> [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 >>> >>> attached base packages: >>> [1] stats graphics grDevices utils datasets methods base >>> >>> other attached packages: >>> [1] GenomicRanges_1.0.8 IRanges_1.6.15 >>> -------------------------------------------------------- >>> This email is confidential and intended solely for the u...{{dropped:15}} >>> >>> _______________________________________________ >>> Bioconductor mailing list >>> Bioconductor at stat.math.ethz.ch >>> https://stat.ethz.ch/mailman/listinfo/bioconductor >>> Search the archives: >>> http://news.gmane.org/gmane.science.biology.informatics.conductor >>> > -------------------------------------------------------- > This email is confidential and intended solely for the...{{dropped:18}}
ADD REPLY
0
Entering edit mode
On Fri, Aug 27, 2010 at 7:02 AM, Martin Morgan <mtmorgan@fhcrc.org> wrote: > On 08/27/2010 03:03 AM, Tim Yates wrote: > > Hi Richard, > > > > Ahhh..cool, yeah that works. Shame it's not a unified interface across > all > > three datatypes though. > > These were intentional design decisions to reduce ambiguities in which > of the components of these complex arguments subscript operations were > meant to apply, in the long run making it easier to write unambiguous > and easy to read code. Martin > > I would argue that in the long run, after the user reads the documentation and understood the API, it would result in terser code that is easier to read and write. I think that using $ and [[ to access metadata columns is very intuitive. eSet does this with '$' and the phenoData right? > > > > Thanks for pointing me in the right direction though :-) > > > > Tim > > > > On 27/08/2010 10:31, "Richard Pearson" <richard.pearson@well.ox.ac.uk> > > wrote: > > > >> Hi Tim > >> > >> I think you need the values accessor method here: > >> > >> print( valuesmy.gr)[[ 'name' ]] ) > >> > >> Cheers > >> > >> Richard > >> > >> > >> Tim Yates wrote: > >>> Hi all, > >>> > >>> I'm trying to move to using GRanges objects for storing my genomic > features > >>> rather than IRanges objects that I use currently. > >>> > >>> However, I cannot seem to subscript the Genomic Ranges object to > extract a > >>> single column from the meta-data of the object. > >>> > >>> Hopefully this code explains what I am trying to do, and someone can > point > >>> me in the right direction? > >>> > >>> Cheers, > >>> > >>> Tim > >>> > >>>> library(GenomicRanges) > >>> Loading required package: IRanges > >>> > >>> Attaching package: 'IRanges' > >>> > >>> > >>> The following object(s) are masked from package:base : > >>> > >>> cbind, > >>> Map, > >>> mapply, > >>> order, > >>> paste, > >>> pmax, > >>> pmax.int, > >>> pmin, > >>> pmin.int, > >>> rbind, > >>> rep.int, > >>> table > >>> > >>>> library(GenomicRanges) > >>>> my.starts = c( 10, 100, 1000 ) > >>>> my.ends = c( 20, 200, 2000 ) > >>>> my.spaces = c( '1', '2', '3' ) > >>>> my.strands = c( '+', '+', '-' ) > >>>> my.names = c( 'seq1', 'seq2', 'seq3' ) > >>>> my.delta = c( 1.23, 2.34, 3.45 ) > >>>> > >>>> my.df = data.frame( start=my.starts, end=my.ends, space=my.spaces, > >>> strand=my.strands, name=my.names, delta=my.delta ) > >>>> my.rd = as( my.df, 'RangedData' ) > >>>> my.gr = as( my.rd, 'GRanges' ) > >>>> > >>> > >>> # Extract the name field from each of these objects using [[ > >>> > >>>> print( my.df[[ 'name' ]] ) > >>> [1] seq1 seq2 seq3 > >>> Levels: seq1 seq2 seq3 > >>>> print( my.rd[[ 'name' ]] ) > >>> [1] seq1 seq2 seq3 > >>> Levels: seq1 seq2 seq3 > >>>> print( my.gr[[ 'name' ]] ) > >>> Error in my.gr[["name"]] : missing '[[' method for Sequence class > GRanges > >>> > >>> # Extract the name field from each of these objects using $ > >>> > >>>> print( my.df$'name' ) > >>> [1] seq1 seq2 seq3 > >>> Levels: seq1 seq2 seq3 > >>>> print( my.rd$'name' ) > >>> [1] seq1 seq2 seq3 > >>> Levels: seq1 seq2 seq3 > >>>> print( my.gr$'name' ) > >>> Error in x[[name, exact = FALSE]] : > >>> missing '[[' method for Sequence class GRanges > >>>> sessionInfo() > >>> R version 2.10.1 (2009-12-14) > >>> x86_64-apple-darwin9.8.0 > >>> > >>> locale: > >>> [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 > >>> > >>> attached base packages: > >>> [1] stats graphics grDevices utils datasets methods base > >>> > >>> other attached packages: > >>> [1] GenomicRanges_1.0.8 IRanges_1.6.15 > >>> -------------------------------------------------------- > >>> This email is confidential and intended solely for the > u...{{dropped:15}} > >>> > >>> _______________________________________________ > >>> Bioconductor mailing list > >>> Bioconductor@stat.math.ethz.ch > >>> https://stat.ethz.ch/mailman/listinfo/bioconductor > >>> Search the archives: > >>> http://news.gmane.org/gmane.science.biology.informatics.conductor > >>> > > -------------------------------------------------------- > > This email is confidential and intended solely for the...{{dropped:18}} > > _______________________________________________ > Bioconductor mailing list > Bioconductor@stat.math.ethz.ch > https://stat.ethz.ch/mailman/listinfo/bioconductor > Search the archives: > http://news.gmane.org/gmane.science.biology.informatics.conductor > [[alternative HTML version deleted]]
ADD REPLY
0
Entering edit mode
On Fri, Aug 27, 2010 at 12:37 PM, Michael Lawrence <lawrence.michael at="" gene.com=""> wrote: > On Fri, Aug 27, 2010 at 7:02 AM, Martin Morgan <mtmorgan at="" fhcrc.org=""> wrote: <snip> >> These were intentional design decisions to reduce ambiguities in which >> of the components of these complex arguments subscript operations were >> meant to apply, in the long run making it easier to write unambiguous >> and easy to read code. Martin >> >> > I would argue that in the long run, after the user reads the documentation > and understood the API, it would result in terser code that is easier to > read and write. I think that using $ and [[ to access metadata columns is > very intuitive. I would tend to agree with Michael on this one, too. In my mind (maybe not anyone else's :-), it somehow relates to a thread I started on the bioc-seq-sig list a while ago about adding more mojo to the subset(...) method when working with IRanges (or any Ranged/Sequence-like) objects it to "close over" the columns of their elementMetadata objects: http://thread.gmane.org/gmane.comp.lang.r.sequencing/1239 -- Steve Lianoglou Graduate Student: Computational Systems Biology ?| Memorial Sloan-Kettering Cancer Center ?| Weill Medical College of Cornell University Contact Info: http://cbio.mskcc.org/~lianos/contact
ADD REPLY
0
Entering edit mode
Had a quick look at how IRanges does it, and found I can add this method to GRanges objects: setMethod("[[", "GRanges", function(x, i, j, ...) { dotArgs <- list(...) if (length(dotArgs) > 0) dotArgs <- dotArgs[names(dotArgs) != "exact"] if (!missing(j) || length(dotArgs) > 0) stop("invalid subsetting") if (missing(i)) stop("subscript is missing") if (!is.character(i) && !is.numeric(i)) stop("invalid subscript type") if (length(i) < 1L) stop("attempt to select less than one element") if (length(i) > 1L) stop("attempt to select more than one element") if (is.numeric(i) && !is.na(i) && (i < 1L || i > ncol(x))) stop("subscript out of bounds") if is.na(i) || (is.character(i) && !(i %in% c("seqnames", "ranges", "strand", colnames(values(x)))))) NULL else if (i == "seqnames") seqnames(x) else if (i == "strand") strand(x) else if (i == "ranges") ranges(x) else values(x)[[i]] }) And then the [[ accessing works Tim On 27/08/2010 11:03, "tim" <tyates at="" picr.man.ac.uk=""> wrote: > Hi Richard, > > Ahhh..cool, yeah that works. Shame it's not a unified interface across all > three datatypes though. > > Thanks for pointing me in the right direction though :-) > > Tim > > On 27/08/2010 10:31, "Richard Pearson" <richard.pearson at="" well.ox.ac.uk=""> > wrote: > >> Hi Tim >> >> I think you need the values accessor method here: >> >> print( valuesmy.gr)[[ 'name' ]] ) >> >> Cheers >> >> Richard >> >> >> Tim Yates wrote: >>> Hi all, >>> >>> I'm trying to move to using GRanges objects for storing my genomic features >>> rather than IRanges objects that I use currently. >>> >>> However, I cannot seem to subscript the Genomic Ranges object to extract a >>> single column from the meta-data of the object. >>> >>> Hopefully this code explains what I am trying to do, and someone can point >>> me in the right direction? >>> >>> Cheers, >>> >>> Tim >>> >>>> library(GenomicRanges) >>> Loading required package: IRanges >>> >>> Attaching package: 'IRanges' >>> >>> >>> The following object(s) are masked from package:base : >>> >>> cbind, >>> Map, >>> mapply, >>> order, >>> paste, >>> pmax, >>> pmax.int, >>> pmin, >>> pmin.int, >>> rbind, >>> rep.int, >>> table >>> >>>> library(GenomicRanges) >>>> my.starts = c( 10, 100, 1000 ) >>>> my.ends = c( 20, 200, 2000 ) >>>> my.spaces = c( '1', '2', '3' ) >>>> my.strands = c( '+', '+', '-' ) >>>> my.names = c( 'seq1', 'seq2', 'seq3' ) >>>> my.delta = c( 1.23, 2.34, 3.45 ) >>>> >>>> my.df = data.frame( start=my.starts, end=my.ends, space=my.spaces, >>> strand=my.strands, name=my.names, delta=my.delta ) >>>> my.rd = as( my.df, 'RangedData' ) >>>> my.gr = as( my.rd, 'GRanges' ) >>>> >>> >>> # Extract the name field from each of these objects using [[ >>> >>>> print( my.df[[ 'name' ]] ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.rd[[ 'name' ]] ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.gr[[ 'name' ]] ) >>> Error in my.gr[["name"]] : missing '[[' method for Sequence class GRanges >>> >>> # Extract the name field from each of these objects using $ >>> >>>> print( my.df$'name' ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.rd$'name' ) >>> [1] seq1 seq2 seq3 >>> Levels: seq1 seq2 seq3 >>>> print( my.gr$'name' ) >>> Error in x[[name, exact = FALSE]] : >>> missing '[[' method for Sequence class GRanges >>>> sessionInfo() >>> R version 2.10.1 (2009-12-14) >>> x86_64-apple-darwin9.8.0 >>> >>> locale: >>> [1] en_GB.UTF-8/en_GB.UTF-8/C/C/en_GB.UTF-8/en_GB.UTF-8 >>> >>> attached base packages: >>> [1] stats graphics grDevices utils datasets methods base >>> >>> other attached packages: >>> [1] GenomicRanges_1.0.8 IRanges_1.6.15 >>> -------------------------------------------------------- >>> This email is confidential and intended solely for the u...{{dropped:15}} >>> >>> _______________________________________________ >>> Bioconductor mailing list >>> Bioconductor at stat.math.ethz.ch >>> https://stat.ethz.ch/mailman/listinfo/bioconductor >>> Search the archives: >>> http://news.gmane.org/gmane.science.biology.informatics.conductor >>> > -------------------------------------------------------- > This email is confidential and intended solely for the...{{dropped:22}}
ADD REPLY

Login before adding your answer.

Traffic: 684 users visited in the last hour
Help About
FAQ
Access RSS
API
Stats

Use of this site constitutes acceptance of our User Agreement and Privacy Policy.

Powered by the version 2.3.6