While doing this work, it looks like we have an equivalent unregisterInterest(K key) that accepts a List of keys or a single key. To keep things consistent with registeringInterest, I propose that we deprecate the behavior for passing in a list as the key and we introduce:
unregisterInterestForKeys(Iterable keys) On Fri, Dec 1, 2017 at 7:55 AM Anthony Baker <aba...@pivotal.io> wrote: > I think Dan’s suggestion clarifies the intent. > > Anthony > > > > On Nov 30, 2017, at 3:54 PM, Dan Smith <dsm...@pivotal.io> wrote: > > > > I think it should be registerInterestAll(Iterable<T>keys) to mirror > > Collection.addAll. > > > > I could easily see a user creating their own Tuple class or using one > that > > happens to also implement Iterable as their key. > > > > We're not doing a very good job of discouraging people to use iterable > > objects as their key if they work everywhere else and then break with > this > > one API. > > > > -Dan > > > > On Thu, Nov 30, 2017 at 2:45 PM, John Blum <jb...@pivotal.io> wrote: > > > >> No, no... good question. > >> > >> I just think it would be wiser if users created a single, CompositeKey > >> class type, with properly implements equals and hashCode methods, as I > >> pointed out. > >> > >> I don't see any advantage in using a java.util.Collection as a key over > >> implementing a CompositeKey type. > >> > >> As such, anything we can do to discourage users from using Collection > types > >> as a key, I think is a good thing. > >> > >> > >> On Thu, Nov 30, 2017 at 2:35 PM, Jason Huynh <jhu...@pivotal.io> wrote: > >> > >>> Yeah I am not sure if anyone does it,and I don't think it would be a > good > >>> idea to use a collection as a key but just thought I'd ask the > >> question... > >>> > >>> On Thu, Nov 30, 2017 at 2:33 PM John Blum <jb...@pivotal.io> wrote: > >>> > >>>> For instance, this came up recently... > >>>> > >>>> > >>>> https://stackoverflow.com/questions/46551278/gemfire- > >>> composite-key-pojo-as-gemfire-key > >>>> > >>>> I have seen other similar posts too! > >>>> > >>>> > >>>> > >>>> On Thu, Nov 30, 2017 at 2:30 PM, John Blum <jb...@pivotal.io> wrote: > >>>> > >>>>> Does anyone actually do this in practice? If so, yikes! > >>>>> > >>>>> Even if the List is immutable, the elements may not be, so using a > >> List > >>>> as > >>>>> a key starts to open 1 up to a lot of problems. > >>>>> > >>>>> As others have pointed out in SO and other channels, information > >> should > >>>>> not be kept in the key. > >>>>> > >>>>> It is perfect fine to have a "Composite" Key, but then define a > >>>>> CompositeKey class type with properly implemented equals(:Object) and > >>>>> hashCode():int methods. > >>>>> > >>>>> For the most part, Keys should really only ever be simple Scalar > >> values > >>>>> (e.g. Long, String, etc). > >>>>> > >>>>> -j > >>>>> > >>>>> > >>>>> > >>>>> > >>>>> On Thu, Nov 30, 2017 at 2:25 PM, Jason Huynh <jhu...@pivotal.io> > >>> wrote: > >>>>> > >>>>>> I started work on the following plan: > >>>>>> - deprecate current "ALL_KEYS" and List passing behavior in > >>>>>> registerInterest > >>>>>> () > >>>>>> - add registerInterestForAllKeys(); > >>>>>> - add registerInterest(T... keys) > >>>>>> - add registerInterest(Iterable<T>keys) > >>>>>> > >>>>>> I might be missing something here but: > >>>>>> With the addition of registerInterest(Iterable<T> keys), I think we > >>>> would > >>>>>> not be able to register interest a List as the key itself. A list > >>> would > >>>>>> be > >>>>>> iterated over due to the addition of registerInterest(Iterable<T> > >>> keys). > >>>>>> A > >>>>>> list in a list would be passed into registerInterest and again be > >>>> iterated > >>>>>> over. I could change the newly created registerInterest call and > >>>>>> explicitly name it something else or are we ok with Iterables not > >>> being > >>>>>> able to be registered as individual keys. > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> > >>>>>> On Mon, Nov 20, 2017 at 9:05 AM Kirk Lund <kl...@apache.org> wrote: > >>>>>> > >>>>>>> John's approach looks best for when you need to specify keys. > >>>>>>> > >>>>>>> For ALL_KEYS, what about an API that doesn't require a token or > >> all > >>>>>> keys: > >>>>>>> > >>>>>>> public void registerInterestForAllKeys(); > >>>>>>> > >>>>>>> On Fri, Nov 17, 2017 at 1:24 PM, Jason Huynh <jhu...@pivotal.io> > >>>> wrote: > >>>>>>> > >>>>>>>> Thanks John for the clarification! > >>>>>>>> > >>>>>>>> On Fri, Nov 17, 2017 at 1:12 PM John Blum <jb...@pivotal.io> > >>> wrote: > >>>>>>>> > >>>>>>>>> This... > >>>>>>>>> > >>>>>>>>>> The Iterable version would handle any collection type by > >>> having > >>>>>> the > >>>>>>>> user > >>>>>>>>> pass > >>>>>>>>> in the iterator for the collection. > >>>>>>>>> > >>>>>>>>> Is not correct. > >>>>>>>>> > >>>>>>>>> The Collection<E> interface itself "extends" the > >>>>>> java.lang.Iterable<E> > >>>>>>>>> interface (see here... > >>>>>>>>> > >>>> https://docs.oracle.com/javase/8/docs/api/java/util/Collection.html > >>>>>>>> under > >>>>>>>>> "*All > >>>>>>>>> Superinterfaces*"). > >>>>>>>>> > >>>>>>>>> Therefore a user can simply to this... > >>>>>>>>> > >>>>>>>>> *List*<KeyType> keys = ... > >>>>>>>>> > >>>>>>>>> region.registerInterest(keys); *// calls the > >>>>>>>>> Region.registerInterest(:Iterable<T>) method.* > >>>>>>>>> > >>>>>>>>> Alternatively, this would also be allowed... > >>>>>>>>> > >>>>>>>>> *Set*<KeyType> keys = ... > >>>>>>>>> > >>>>>>>>> region.registerInterest(keys); > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> On Fri, Nov 17, 2017 at 11:44 AM, Jason Huynh < > >>> jhu...@pivotal.io> > >>>>>>> wrote: > >>>>>>>>> > >>>>>>>>>> Current idea is to: > >>>>>>>>>> - deprecate current "ALL_KEYS" and List passing behavior in > >>>>>>>>>> registerInterest() > >>>>>>>>>> - add registerInterestAllKeys(); > >>>>>>>>>> - add registerInterest(T... keys) and > >>>> registerInterest(Iterable<T> > >>>>>>>> keys) > >>>>>>>>>> and > >>>>>>>>>> not have one specifically for List or specific collections. > >>>>>>>>>> > >>>>>>>>>> The Iterable version would handle any collection type by > >>> having > >>>>>> the > >>>>>>>> user > >>>>>>>>>> pass in the iterator for the collection. > >>>>>>>>>> > >>>>>>>>>> On Fri, Nov 17, 2017 at 11:32 AM Jacob Barrett < > >>>>>> jbarr...@pivotal.io> > >>>>>>>>>> wrote: > >>>>>>>>>> > >>>>>>>>>>> I am failing to see where registerInterest(List<T> keys) > >> is > >>> an > >>>>>>> issue > >>>>>>>>> for > >>>>>>>>>>> the key type in the region. If our region is > >> Region<String> > >>>>>> then I > >>>>>>>>> would > >>>>>>>>>>> expect registerInterest(List<String>). If the keys are > >>> unknown > >>>>>> or a > >>>>>>>> mix > >>>>>>>>>>> then you should have Region<Object> and thus > >>>>>>>>>> registerInterest(List<Object). > >>>>>>>>>>> > >>>>>>>>>>> I echo John's statements on VarArgs and type erasure as > >> well > >>>> as > >>>>>> his > >>>>>>>>>>> argument for Iterable<T>. > >>>>>>>>>>> > >>>>>>>>>>> Also, List<T> does not restrict you from List indexes. The > >>>>>> region > >>>>>>>> would > >>>>>>>>>> be > >>>>>>>>>>> Region<List<String>> with registerInterest<List<List<Str > >>>>>> ing>>(). > >>>>>>>>>>> > >>>>>>>>>>> -Jake > >>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>>> On Fri, Nov 17, 2017 at 10:04 AM John Blum < > >>> jb...@pivotal.io> > >>>>>>> wrote: > >>>>>>>>>>> > >>>>>>>>>>>> Personally, I prefer the var args method > >>>>>> (registerInterest(T... > >>>>>>>>> keys)) > >>>>>>>>>>>> myself. It is way more convenient if I only have a few > >>> keys > >>>>>> when > >>>>>>>>>> calling > >>>>>>>>>>>> this method then to have to add the keys to a List, > >>>> especially > >>>>>>> for > >>>>>>>>>>> testing > >>>>>>>>>>>> purposes. > >>>>>>>>>>>> > >>>>>>>>>>>> But, I typically like to pair that with a > >>>>>>>>> registerInterest(Iterable<T> > >>>>>>>>>>>> keys) method > >>>>>>>>>>>> as well. By having a overloaded Iterable variant, then > >> I > >>>> can > >>>>>>> pass > >>>>>>>> in > >>>>>>>>>> any > >>>>>>>>>>>> Collection type I want (which shouldn't be restricted to > >>>> just > >>>>>>>> List). > >>>>>>>>>> It > >>>>>>>>>>>> also is a simple matter to convert any *Collection* > >> (i.e. > >>>>>> *List*, > >>>>>>>>>> *Set*, > >>>>>>>>>>>> etc) to an array, which can be passed to the var args > >>>>>> method. By > >>>>>>>>> using > >>>>>>>>>>>> List, > >>>>>>>>>>>> you are implying that "order matters" since a List is a > >>>> order > >>>>>>>>>> collection > >>>>>>>>>>> of > >>>>>>>>>>>> elements. > >>>>>>>>>>>> > >>>>>>>>>>>> This ("*It might even cause problems of pushing in > >>>> **multiple > >>>>>>>>> different > >>>>>>>>>>>> types.*"), regarding var args, does not even make sense. > >>>>>>>> Technically, > >>>>>>>>>>>> List<T> is no different. Java's type erasure > >> essentially > >>>>>> equates > >>>>>>>> var > >>>>>>>>>>> args > >>>>>>>>>>>> too "Object..." (or Object[]) and the List<T> to List > >> (or > >>> a > >>>>>> List > >>>>>>> of > >>>>>>>>>>>> Objects, > >>>>>>>>>>>> essentially like if you just did this... List<Object>) > >> So, > >>>>>> while > >>>>>>>> the > >>>>>>>>>>>> compiler ensures compile-time type-safety of generics, > >>> there > >>>>>> is > >>>>>>> no > >>>>>>>>>>> generics > >>>>>>>>>>>> type-safety guarantees at runtime. > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> On Fri, Nov 17, 2017 at 9:22 AM, Jason Huynh < > >>>>>> jhu...@pivotal.io> > >>>>>>>>>> wrote: > >>>>>>>>>>>> > >>>>>>>>>>>>> Hi Mike, > >>>>>>>>>>>>> > >>>>>>>>>>>>> The current support for List leads to compilation > >> issues > >>>> if > >>>>>> the > >>>>>>>>>> region > >>>>>>>>>>> is > >>>>>>>>>>>>> type constrained. However I think you are suggesting > >>>>>> instead > >>>>>>> of > >>>>>>>> a > >>>>>>>>>> var > >>>>>>>>>>>> args > >>>>>>>>>>>>> method, instead provide a registerInterest(List keys) > >>>>>> method? > >>>>>>>>>>>>> > >>>>>>>>>>>>> So far what I am hearing requested is: > >>>>>>>>>>>>> deprecate current "ALL_KEYS" and List passing behavior > >>>>>>>>>>>>> registerInterestAllKeys(); > >>>>>>>>>>>>> registerInterest(List<T> keys) instead of a > >>>>>>> registerInterest(T... > >>>>>>>>>> keys) > >>>>>>>>>>>>> > >>>>>>>>>>>>> Will anyone ever actually have a List as the key > >> itself? > >>>> The > >>>>>>>>> current > >>>>>>>>>>> and > >>>>>>>>>>>>> suggested changes would not allow it registering for a > >>>>>> specific > >>>>>>>>> List > >>>>>>>>>>>>> object. > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>>> On Thu, Nov 16, 2017 at 6:50 PM Jacob Barrett < > >>>>>>>> jbarr...@pivotal.io > >>>>>>>>>> > >>>>>>>>>>>> wrote: > >>>>>>>>>>>>> > >>>>>>>>>>>>>> Geode Native C++ and .NET have: > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> virtual void registerKeys(const > >>>>>>>>>>>>>> std::vector<std::shared_ptr<CacheableKey>> & keys, > >>>>>>>>>>>>>> bool isDurable = false, > >>>>>>>>>>>>>> bool getInitialValues = > >>>> false, > >>>>>>>>>>>>>> bool receiveValues = > >>> true) = > >>>>>> 0; > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> virtual void unregisterKeys(const > >>>>>>>>>>>>>> std::vector<std::shared_ptr<CacheableKey>> & keys) > >> = > >>> 0; > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> virtual void *registerAllKeys*(bool isDurable = > >>> false, > >>>>>>>>>>>>>> bool > >> getInitialValues = > >>>>>> false, > >>>>>>>>>>>>>> bool receiveValues = > >>>> true) > >>>>>> = > >>>>>>> 0; > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> virtual void unregisterAllKeys() = 0; > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> virtual void registerRegex(const std::string& > >> regex, > >>>>>>>>>>>>>> bool isDurable = false, > >>>>>>>>>>>>>> bool getInitialValues = > >>>>>> false, > >>>>>>>>>>>>>> bool receiveValues = > >>> true) > >>>> = > >>>>>> 0; > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> virtual void unregisterRegex(const char* regex) = > >> 0; > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> I dislike special values like this so yes please > >> make > >>> it > >>>>>> go > >>>>>>>> away! > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> -Jake > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>>> On Thu, Nov 16, 2017 at 5:20 PM Dan Smith < > >>>>>> dsm...@pivotal.io > >>>>>>>> > >>>>>>>>>> wrote: > >>>>>>>>>>>>>> > >>>>>>>>>>>>>>> I don't really like the regex option - it implies > >>> that > >>>>>> your > >>>>>>>>> keys > >>>>>>>>>>> are > >>>>>>>>>>>>> all > >>>>>>>>>>>>>>> strings. Will any other regular expressions work > >> on > >>>> non > >>>>>>>> string > >>>>>>>>>>>> objects? > >>>>>>>>>>>>>>> registerInterestAllKeys() seems like a better > >>> option. > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> -Dan > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> On Thu, Nov 16, 2017 at 4:34 PM, Michael Stolz < > >>>>>>>>>> mst...@pivotal.io> > >>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> I don't like the vararg option. > >>>>>>>>>>>>>>>> If i'm maintaining a list of keys i'm interested > >>>> in, I > >>>>>>> want > >>>>>>>>> to > >>>>>>>>>> be > >>>>>>>>>>>>> able > >>>>>>>>>>>>>> to > >>>>>>>>>>>>>>>> pass that List in. > >>>>>>>>>>>>>>>> Varargs is a poor substitute. It might even > >> cause > >>>>>>> problems > >>>>>>>> of > >>>>>>>>>>>> pushing > >>>>>>>>>>>>>> in > >>>>>>>>>>>>>>>> multiple different types. Keys must all be of > >> one > >>>> type > >>>>>>> for > >>>>>>>> a > >>>>>>>>>>> given > >>>>>>>>>>>>>>> Region. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> I'm very much in favor of deprecating the > >> ALL_KEYS > >>>>>> string > >>>>>>>> in > >>>>>>>>>>> favor > >>>>>>>>>>>> of > >>>>>>>>>>>>>>>> something that is typed specially if you refer > >> to > >>>>>>> ALL_KEYS. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> If that works, then we don't necessarily need > >> the > >>>>>>>> additional > >>>>>>>>>> API > >>>>>>>>>>>>>>>> registerInterestAllKeys(). But if ALL_KEYS can't > >>> be > >>>> a > >>>>>>>> special > >>>>>>>>>>> type > >>>>>>>>>>>> to > >>>>>>>>>>>>>> get > >>>>>>>>>>>>>>>> over the compilation issues then we should go > >> with > >>>> the > >>>>>>> new > >>>>>>>>> API. > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> -- > >>>>>>>>>>>>>>>> Mike Stolz > >>>>>>>>>>>>>>>> Principal Engineer, GemFire Product Lead > >>>>>>>>>>>>>>>> Mobile: +1-631-835-4771 <(631)%20835-4771> > <(631)%20835-4771> > >>>> <(631)%20835-4771> > >>>>>>> <(631)%20835-4771> > >>>>>>>>> <(631)%20835-4771> <(631)%20835-4771> > >>>>>>>>>>> <(631)%20835-4771> > >>>>>>>>>>>> <(631)%20835-4771> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> On Thu, Nov 16, 2017 at 7:02 PM, Anilkumar > >>> Gingade < > >>>>>>>>>>>>>> aging...@pivotal.io> > >>>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> +1 Deprecating ALL_KEYS option; I believe this > >>> is > >>>>>> added > >>>>>>>>>> before > >>>>>>>>>>> we > >>>>>>>>>>>>>>>> supported > >>>>>>>>>>>>>>>>> regex support. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> Doesn't seems like a new API is needed. The > >>> regex > >>>>>> java > >>>>>>>> doc > >>>>>>>>>>>> clearly > >>>>>>>>>>>>>>>>> specifies the effect of ".*". > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> +1 for deprecating list argument; and > >> replacing > >>>> with > >>>>>>> new > >>>>>>>>> API. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> -Anil. > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> On Thu, Nov 16, 2017 at 3:36 PM, Jason Huynh < > >>>>>>>>>>> jhu...@pivotal.io> > >>>>>>>>>>>>>>> wrote: > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> For GEODE-3813 < > >>>>>>>>>>>> https://issues.apache.org/jira/browse/GEODE-3813 > >>>>>>>>>>>>>> : > >>>>>>>>>>>>>>>>> Region > >>>>>>>>>>>>>>>>>> registerInterest API usage of type > >> parameters > >>> is > >>>>>>> broken > >>>>>>>>>>>>>>>>>> < > >>>> https://issues.apache.org/jira/browse/GEODE-3813 > >>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> The current API to registerInterest allows a > >>>>>> special > >>>>>>>>> string > >>>>>>>>>>>> token > >>>>>>>>>>>>>>>>>> “ALL_KEYS” to be passed in as the parameter > >> to > >>>>>>>>>>>> registerInterest(T > >>>>>>>>>>>>>>> key). > >>>>>>>>>>>>>>>>>> This special token causes the > >> registerInterest > >>>> to > >>>>>>>> behave > >>>>>>>>>>>> similar > >>>>>>>>>>>>> to > >>>>>>>>>>>>>>>>>> registerInterestRegex(“.*”). As the ticket > >>>>>> states, > >>>>>>> if > >>>>>>>>> the > >>>>>>>>>>>> region > >>>>>>>>>>>>>> has > >>>>>>>>>>>>>>>>> been > >>>>>>>>>>>>>>>>>> typed to anything other than Object or > >> String, > >>>> the > >>>>>>>> usage > >>>>>>>>> of > >>>>>>>>>>>>>>> “ALL_KEYS” > >>>>>>>>>>>>>>>>> as a > >>>>>>>>>>>>>>>>>> parameter results in a compilation error. > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Proposals: > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> I would like to deprecate the special string > >>>>>>> “ALL_KEYS” > >>>>>>>>> and > >>>>>>>>>>>>>> document > >>>>>>>>>>>>>>> a > >>>>>>>>>>>>>>>>>> workaround of using > >>> registerInterestRegex(“.*”) > >>>>>> or we > >>>>>>>> can > >>>>>>>>>>> add a > >>>>>>>>>>>>> new > >>>>>>>>>>>>>>> API > >>>>>>>>>>>>>>>>>> called registerInterestAllKeys() > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> I think we should also deprecate passing a > >>> List > >>>>>>> Object > >>>>>>>> of > >>>>>>>>>>> keys > >>>>>>>>>>>>> into > >>>>>>>>>>>>>>>>>> registerInterest. It has the same > >> compilation > >>>>>>>>> restrictions > >>>>>>>>>>> as > >>>>>>>>>>>>>>>> “ALL_KEYS” > >>>>>>>>>>>>>>>>>> when the region is key constrained/typed. > >> The > >>>>>> reason > >>>>>>>> why > >>>>>>>>>>> List > >>>>>>>>>>>>>> would > >>>>>>>>>>>>>>> be > >>>>>>>>>>>>>>>>>> used is to allow registering multiple keys > >> at > >>>>>> once. > >>>>>>>>>> Instead, > >>>>>>>>>>>> we > >>>>>>>>>>>>>> can > >>>>>>>>>>>>>>>> add > >>>>>>>>>>>>>>>>> a > >>>>>>>>>>>>>>>>>> new var arg API like registerInterest(T… > >>> keys). > >>>>>> This > >>>>>>>>>> problem > >>>>>>>>>>>> and > >>>>>>>>>>>>>>>>> solution > >>>>>>>>>>>>>>>>>> was also documented in the ticket by the > >>> ticket > >>>>>>> creator > >>>>>>>>>> (Kirk > >>>>>>>>>>>>> Lund) > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> Thanks, > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>>> -Jason > >>>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>>> > >>>>>>>>>>>>>>> > >>>>>>>>>>>>>> > >>>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> > >>>>>>>>>>>> -- > >>>>>>>>>>>> -John > >>>>>>>>>>>> john.blum10101 (skype) > >>>>>>>>>>>> > >>>>>>>>>>> > >>>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> > >>>>>>>>> -- > >>>>>>>>> -John > >>>>>>>>> john.blum10101 (skype) > >>>>>>>>> > >>>>>>>> > >>>>>>> > >>>>>> > >>>>> > >>>>> > >>>>> > >>>>> -- > >>>>> -John > >>>>> john.blum10101 (skype) > >>>>> > >>>> > >>>> > >>>> > >>>> -- > >>>> -John > >>>> john.blum10101 (skype) > >>>> > >>> > >> > >> > >> > >> -- > >> -John > >> john.blum10101 (skype) > >> > >